diff --git a/build.gradle.kts b/build.gradle.kts
index 9b1ff4992..561df0df9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,6 @@
 import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
 import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
+import org.gradle.internal.os.OperatingSystem
 import java.text.SimpleDateFormat
 import java.util.*
 
@@ -88,15 +89,58 @@ repositories {
         }
         metadataSources { artifact() }
     }
+    jcenter()
 }
 
+val lwjglVersion = "3.3.4"
+
+val lwjglNatives = Pair(
+    System.getProperty("os.name")!!,
+    System.getProperty("os.arch")!!
+).let { (name, arch) ->
+    when {
+        arrayOf("Linux", "SunOS", "Unit").any { name.startsWith(it) } ->
+            if (arrayOf("arm", "aarch64").any { arch.startsWith(it) })
+                "natives-linux${if (arch.contains("64") || arch.startsWith("armv8")) "-arm64" else "-arm32"}"
+            else if (arch.startsWith("ppc"))
+                "natives-linux-ppc64le"
+            else if (arch.startsWith("riscv"))
+                "natives-linux-riscv64"
+            else
+                "natives-linux"
+        arrayOf("Mac OS X", "Darwin").any { name.startsWith(it) }     ->
+            "natives-macos${if (arch.startsWith("aarch64")) "-arm64" else ""}"
+        arrayOf("Windows").any { name.startsWith(it) }                ->
+            if (arch.contains("64"))
+                "natives-windows${if (arch.startsWith("aarch64")) "-arm64" else ""}"
+            else
+                "natives-windows-x86"
+        else                                                                            ->
+            throw Error("Unrecognized or unsupported platform. Please set \"lwjglNatives\" manually")
+    }
+}
 dependencies {
     implementation("org.jetbrains:annotations:24.0.0")?.let { clientInclude(it); serverInclude(it) }
-    val lwjglVersion = "2.9.3"
-    implementation("org.lwjgl.lwjgl:lwjgl_util:${lwjglVersion}")
-    implementation("org.lwjgl.lwjgl:lwjgl:${lwjglVersion}")
-    runtimeOnly("org.lwjgl.lwjgl:lwjgl-platform:${lwjglVersion}")
-
+    implementation("com.github.Zarzelcow:legacy-lwjgl3:78643b2a96") {
+        exclude(group = "net.fabricmc")
+        exclude(group = "org.lwjgl")
+        exclude(group = "org.jetbrains.kotlin")
+        exclude(group = "org.javassist")
+    }.let { clientInclude(it) }
+    implementation(platform("org.lwjgl:lwjgl-bom:$lwjglVersion"))
+
+    implementation("org.lwjgl", "lwjgl")
+    implementation("org.lwjgl", "lwjgl-assimp")
+    implementation("org.lwjgl", "lwjgl-glfw")
+    implementation("org.lwjgl", "lwjgl-openal")
+    implementation("org.lwjgl", "lwjgl-opengl")
+    implementation("org.lwjgl", "lwjgl-stb")
+    runtimeOnly("org.lwjgl", "lwjgl", classifier = lwjglNatives)
+    runtimeOnly("org.lwjgl", "lwjgl-assimp", classifier = lwjglNatives)
+    runtimeOnly("org.lwjgl", "lwjgl-glfw", classifier = lwjglNatives)
+    runtimeOnly("org.lwjgl", "lwjgl-openal", classifier = lwjglNatives)
+    runtimeOnly("org.lwjgl", "lwjgl-opengl", classifier = lwjglNatives)
+    runtimeOnly("org.lwjgl", "lwjgl-stb", classifier = lwjglNatives)
     implementation("com.google.code.gson:gson:2.10.1")?.let { clientInclude(it); serverInclude(it) }
 
     implementation("com.github.JnCrMx:discord-game-sdk4j:v0.5.5")?.let { clientInclude(it) }
diff --git a/devResources/credits.txt b/devResources/credits.txt
new file mode 100644
index 000000000..9c502ef73
--- /dev/null
+++ b/devResources/credits.txt
@@ -0,0 +1,10 @@
+random.achievement1 | H2_AIL
+random.achievement2 | H2_AIL
+random.page | H2_AIL
+random.whoosh_in | H2_AIL
+random.whoosh_out | H2_AIL
+step.permafrost1 | H2_AIL
+step.permafrost2 | H2_AIL
+step.permafrost3 | H2_AIL
+step.permafrost4 | H2_AIL
+random.equip | Bones edited some freesounds sounds lol
\ No newline at end of file
diff --git a/devResources/sound/random/achievement1.ogg b/devResources/sound/random/achievement1.ogg
new file mode 100644
index 000000000..a69eb5122
Binary files /dev/null and b/devResources/sound/random/achievement1.ogg differ
diff --git a/devResources/sound/random/achievement2.ogg b/devResources/sound/random/achievement2.ogg
new file mode 100644
index 000000000..b96e64694
Binary files /dev/null and b/devResources/sound/random/achievement2.ogg differ
diff --git a/devResources/sound/random/equip.ogg b/devResources/sound/random/equip.ogg
new file mode 100644
index 000000000..714b7d31b
Binary files /dev/null and b/devResources/sound/random/equip.ogg differ
diff --git a/devResources/sound/random/page.ogg b/devResources/sound/random/page.ogg
new file mode 100644
index 000000000..482fe51c4
Binary files /dev/null and b/devResources/sound/random/page.ogg differ
diff --git a/devResources/sound/random/whoosh_in.ogg b/devResources/sound/random/whoosh_in.ogg
new file mode 100644
index 000000000..3df3f3ee9
Binary files /dev/null and b/devResources/sound/random/whoosh_in.ogg differ
diff --git a/devResources/sound/random/whoosh_out.ogg b/devResources/sound/random/whoosh_out.ogg
new file mode 100644
index 000000000..fb9ac1c6b
Binary files /dev/null and b/devResources/sound/random/whoosh_out.ogg differ
diff --git a/devResources/sound/step/permafrost1.ogg b/devResources/sound/step/permafrost1.ogg
new file mode 100644
index 000000000..fdf340bc1
Binary files /dev/null and b/devResources/sound/step/permafrost1.ogg differ
diff --git a/devResources/sound/step/permafrost2.ogg b/devResources/sound/step/permafrost2.ogg
new file mode 100644
index 000000000..e867b6099
Binary files /dev/null and b/devResources/sound/step/permafrost2.ogg differ
diff --git a/devResources/sound/step/permafrost3.ogg b/devResources/sound/step/permafrost3.ogg
new file mode 100644
index 000000000..7d4b9b376
Binary files /dev/null and b/devResources/sound/step/permafrost3.ogg differ
diff --git a/devResources/sound/step/permafrost4.ogg b/devResources/sound/step/permafrost4.ogg
new file mode 100644
index 000000000..0b35d05f7
Binary files /dev/null and b/devResources/sound/step/permafrost4.ogg differ
diff --git a/src/common/resources/lang/en_US/gui.lang b/src/common/resources/lang/en_US/gui.lang
index 786e3e45b..a04074ff7 100644
--- a/src/common/resources/lang/en_US/gui.lang
+++ b/src/common/resources/lang/en_US/gui.lang
@@ -7,6 +7,14 @@ gui.achievements.button.done=Done
 gui.achievements.label.title=Achievements
 gui.achievements.label.taken=Taken!
 gui.achievements.label.requires=Requires '%1$s'
+gui.achievements.label.completion=%1$s Complete!
+
+gui.achievements.page.vanilla.name=Vanilla
+gui.achievements.page.vanilla.desc=Achievements from Better than Adventure!
+gui.achievements.page.overworld.name=Overworld
+gui.achievements.page.overworld.desc=Achievements of the starting dimension!
+gui.achievements.page.nether.name=Nether
+gui.achievements.page.nether.desc=Achievements from Hell!
 
 gui.add_server.label.title=Add server
 gui.add_server.button.save=Save
@@ -55,8 +63,6 @@ gui.connecting.label.connecting=Connecting to the server...
 gui.connecting.label.logging_in=Logging in...
 
 gui.controller_setup.button.back=Back
-gui.controller_setup.label.help.1=If no controllers are detected, make sure to
-gui.controller_setup.label.help.2=launch the game with the controller plugged in.
 gui.controller_setup.label.no_controller_selected=No controller selected!
 
 gui.crafting.label.crafting=Crafting
@@ -157,6 +163,7 @@ gui.main_menu.button.quit_game=Quit Game
 gui.main_menu.button.discord=Discord
 gui.main_menu.button.youtube=YouTube
 gui.main_menu.button.website=Website
+gui.main_menu.button.credits=Credits
 
 gui.out_of_memory.label.title=Out of memory!
 gui.out_of_memory.label.body.1=Minecraft has run out of memory.
@@ -224,11 +231,33 @@ gui.options.page.debug.category.test=Tests
 gui.options.page.debug.button.open.model_viewer=Open Model Viewer
 gui.options.page.debug.button.open.biome_finder=Open Biome Finder
 gui.options.page.debug.button.open.datadumper=Run Data Dumper
+gui.options.page.debug.button.open.sound_test=Open Sound Test
+gui.options.page.debug.button.open.texture_viewer=Open Texture Viewer
+gui.options.page.debug.button.open.achievements=Open Achievements
+gui.options.page.debug.button.wipestats=Delete Stats
+gui.options.page.debug.button.unlockedall=Unlock all stats
+gui.options.page.debug.button.cheat=Enable Cheats
 gui.options.page.debug.button.crash.soft=Crash Soft
 gui.options.page.debug.button.crash.hard=Crash Hard
+gui.options.page.debug.button.music.skip=Force Ambient Music
 
 gui.options.page.search.title=Search
 
+gui.sound_test.label.title=Sound Test
+gui.sound_test.label.repo=Sound Repository: %s
+gui.sound_test.label.id=ID: %s
+gui.sound_test.label.name=Name: %s
+gui.sound_test.label.url=URL: %s
+gui.sound_test.label.select_repo=Select Repo:
+gui.sound_test.label.select_entry=Select Entry:
+gui.sound_test.button.done=Done
+gui.sound_test.button.play=Play
+gui.sound_test.button.play_stream=Play Stream
+gui.sound_test.button.reload=Reload
+gui.sound_test.button.stop=Stop
+
+gui.texture_viewer.label.title=Texture Viewer
+
 gui.photo_mode.label.mouse_hint=Click and drag to move and rotate.
 gui.photo_mode.button.take_screenshot=Take Screenshot
 gui.photo_mode.button.center_camera=Center Camera
@@ -310,7 +339,6 @@ gui.model_viewer.slider.meta=Meta: %d
 gui.model_viewer.button.tickprogress=Run Tick: %s
 gui.model_viewer.button.rotate=Rotate Labels: %s
 gui.model_viewer.button.reload_textures=Reload Textures
-
 gui.model_viewer.button.category=Category
 
 model.category.entity.info=Entity: %s
@@ -344,4 +372,7 @@ model.category.particle.name=Particle
 model.category.particle.info=Particle: %s
 model.category.particle.radius.slider=Radius: %s
 model.category.particle.note.slider=Note: %s
-model.category.particle.block.side=Side: %s
\ No newline at end of file
+model.category.particle.block.side=Side: %s
+
+gui.credits.button.done=Done
+gui.credits.label.title=Credits
\ No newline at end of file
diff --git a/src/common/resources/lang/en_US/item.lang b/src/common/resources/lang/en_US/item.lang
index 3f8f8fc72..077012dc7 100644
--- a/src/common/resources/lang/en_US/item.lang
+++ b/src/common/resources/lang/en_US/item.lang
@@ -293,6 +293,7 @@ item.bed.desc=Take a nap overnight.
 item.repeater.name=Redstone Repeater
 item.repeater.desc=Delays a redstone signal.
 item.map.name=Map
+item.map.blank.name=Blank Map
 item.map.desc=Chart your land!
 item.leaves.name=Leaves
 item.leaves.desc=Crunchy and green.
diff --git a/src/common/resources/lang/en_US/options.lang b/src/common/resources/lang/en_US/options.lang
index 9afc8e436..0f60ee1ae 100644
--- a/src/common/resources/lang/en_US/options.lang
+++ b/src/common/resources/lang/en_US/options.lang
@@ -69,6 +69,7 @@ options.animations.custom=Custom
 options.animations.procedural=Procedural
 options.animations.off=Off
 options.autoHit=Auto Hit
+options.easyBridge=Easy Bridge
 options.controller=Controller...
 options.controllerSensitivity=Sensitivity
 options.controllerMenuSensitivity=Menu Sensitivity
diff --git a/src/common/resources/lang/en_US/stats.lang b/src/common/resources/lang/en_US/stats.lang
index 070528eb8..f302a8bfa 100644
--- a/src/common/resources/lang/en_US/stats.lang
+++ b/src/common/resources/lang/en_US/stats.lang
@@ -30,6 +30,11 @@ stat.craftItem=%1$s Crafted
 stat.useItem=%1$s Used
 stat.breakItem=%1$s Depleted
 
+stat.crafted=Times Crafted
+stat.used=Times Used
+stat.mined=Times Mined
+stat.depleted=Times Depleted
+
 achievement.get=Achievement get!
 
 achievement.taken=Taken!
diff --git a/src/common/resources/lang/en_US/strings.lang b/src/common/resources/lang/en_US/strings.lang
index d7c6de7fa..269e2d9bd 100644
--- a/src/common/resources/lang/en_US/strings.lang
+++ b/src/common/resources/lang/en_US/strings.lang
@@ -61,6 +61,8 @@ worldType.overworld.classic.name=Classic
 worldType.overworld.classic.desc=Terrain generation similar to\nClassic, but infinite.
 worldType.overworld.indev.name=Indev
 worldType.overworld.indev.desc=Terrain generation similar to\nIndev, but infinite.
+worldType.overworld.skyblock.name=Skyblock
+worldType.overworld.skyblock.desc=Hardcore survival on a tiny\nisland in the sky.
 
 disconnect.genericReason=%s
 disconnect.disconnected=Disconnected by Server
diff --git a/src/common/resources/lang/en_US/tile.lang b/src/common/resources/lang/en_US/tile.lang
index e8260893e..bcffaf207 100644
--- a/src/common/resources/lang/en_US/tile.lang
+++ b/src/common/resources/lang/en_US/tile.lang
@@ -1 +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.permafrost.carved.name=Carved Permafrost
tile.permafrost.carved.desc=Polished Permafrost 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.permafrost.carved.name=Polished Permafrost Slab
tile.slab.permafrost.carved.desc=A slab of polished permafrost.

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.slab.cobble.permafrost.name=Cobbled Permafrost Slab
tile.slab.cobble.permafrost.desc=A slab of cobbled permafrost.
tile.slab.brick.sandstone.name=Sandstone Brick Slab
tile.slab.brick.sandstone.desc=A slab of sandstone bricks.
tile.slab.brick.permafrost.name=Permafrost Brick Slab
tile.slab.brick.permafrost.desc=A slab of permafrost bricks.

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.sandstone.name=Sandstone Stairs
tile.stairs.sandstone.desc=Sandstone block used for rapid vertical movement.
tile.stairs.cobble.permafrost.name=Cobbled Permafrost Stairs
tile.stairs.cobble.permafrost.desc=Cobbled permafrost block used for rapid vertical movement.
tile.stairs.brick.sandstone.name=Sandstone Brick Stairs
tile.stairs.brick.sandstone.desc=Sandstone brick block used for rapid vertical movement.
tile.stairs.brick.permafrost.name=Permafrost Brick Stairs
tile.stairs.brick.permafrost.desc=Permafrost 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.log.thorn.name=Thorn Log
tile.log.thorn.desc=A log from a thorn tree.
tile.log.palm.name=Palm Log
tile.log.palm.desc=A log from a palm 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.thorn.name=Thorn Leaves
tile.leaves.thorn.desc=Leaves from a thorn tree.
tile.leaves.palm.name=Palm Leaves
tile.leaves.palm.desc=Leaves from a palm 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.sapling.thorn.name=Thorn Sapling
tile.sapling.thorn.desc=Plant to grow a thorn tree.
tile.sapling.palm.name=Palm Sapling
tile.sapling.palm.desc=Plant to grow a palm 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.flower.purple.name=Heather
tile.flower.purple.desc=Sprigs of purple petals. Brings good luck.
tile.flower.lightblue.name=Bluebell
tile.flower.lightblue.desc=A sad-looking blue flower.
tile.flower.pink.name=Orchid
tile.flower.pink.desc=A beautiful pink flower.
tile.flower.orange.name=Marigold
tile.flower.orange.desc=A beautiful orange 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.pumpkin_pie.name=Pumpkin Pie
tile.pumpkin_pie.desc=I don't wanna pie!

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.permafrost.polished.name=Polished Permafrost
tile.permafrost.polished.desc=A polished block of permafrost.

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
+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.permafrost.carved.name=Carved Permafrost
tile.permafrost.carved.desc=Polished Permafrost 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.permafrost.carved.name=Polished Permafrost Slab
tile.slab.permafrost.carved.desc=A slab of polished permafrost.

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.slab.cobble.permafrost.name=Cobbled Permafrost Slab
tile.slab.cobble.permafrost.desc=A slab of cobbled permafrost.
tile.slab.brick.sandstone.name=Sandstone Brick Slab
tile.slab.brick.sandstone.desc=A slab of sandstone bricks.
tile.slab.brick.permafrost.name=Permafrost Brick Slab
tile.slab.brick.permafrost.desc=A slab of permafrost bricks.

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.sandstone.name=Sandstone Stairs
tile.stairs.sandstone.desc=Sandstone block used for rapid vertical movement.
tile.stairs.cobble.permafrost.name=Cobbled Permafrost Stairs
tile.stairs.cobble.permafrost.desc=Cobbled permafrost block used for rapid vertical movement.
tile.stairs.brick.sandstone.name=Sandstone Brick Stairs
tile.stairs.brick.sandstone.desc=Sandstone brick block used for rapid vertical movement.
tile.stairs.brick.permafrost.name=Permafrost Brick Stairs
tile.stairs.brick.permafrost.desc=Permafrost 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.log.thorn.name=Thorn Log
tile.log.thorn.desc=A log from a thorn tree.
tile.log.palm.name=Palm Log
tile.log.palm.desc=A log from a palm 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.thorn.name=Thorn Leaves
tile.leaves.thorn.desc=Leaves from a thorn tree.
tile.leaves.palm.name=Palm Leaves
tile.leaves.palm.desc=Leaves from a palm 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.sapling.thorn.name=Thorn Sapling
tile.sapling.thorn.desc=Plant to grow a thorn tree.
tile.sapling.palm.name=Palm Sapling
tile.sapling.palm.desc=Plant to grow a palm 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.flower.purple.name=Heather
tile.flower.purple.desc=Sprigs of purple petals. Brings good luck.
tile.flower.lightblue.name=Bluebell
tile.flower.lightblue.desc=A sad-looking blue flower.
tile.flower.pink.name=Orchid
tile.flower.pink.desc=A beautiful pink flower.
tile.flower.orange.name=Marigold
tile.flower.orange.desc=A beautiful orange 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.coal.permafrost.name=Permafrost Coal Ore
tile.ore.coal.permafrost.desc=A chunk of coal embedded in permafrost.

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.iron.permafrost.name=Permafrost Iron Ore
tile.ore.iron.permafrost.desc=Iron nuggets embedded in permafrost.

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.gold.permafrost.name=Permafrost Gold Ore
tile.ore.gold.permafrost.desc=Gold nuggets embedded in permafrost.

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.lapis.permafrost.name=Permafrost Lapis Lazuli Ore
tile.ore.lapis.permafrost.desc=Chunks of lapis lazuli embedded in permafrost.

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.permafrost.name=Permafrost Redstone Ore
tile.ore.redstone.permafrost.desc=Red dust embedded in permafrost.
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.redstone.glowing.permafrost.name=Glowing Permafrost Redstone Ore
tile.ore.redstone.glowing.permafrost.desc=Red dust embedded in permafrost. 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.diamond.permafrost.name=Permafrost Diamond Ore
tile.ore.diamond.permafrost.desc=A chunk of diamond embedded in permafrost.

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.pumpkin.redstone.name=Redstone Jack 'o' Lantern
tile.pumpkin.redstone.desc=An orange squash with a spooky face, lit by a redstone 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.pumpkin_pie.name=Pumpkin Pie
tile.pumpkin_pie.desc=I don't wanna pie!

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.permafrost.polished.name=Polished Permafrost
tile.permafrost.polished.desc=A polished block of permafrost.

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 ecad9029b..e676334d3 100644
--- a/src/common/resources/recipes/workbench.json
+++ b/src/common/resources/recipes/workbench.json
@@ -7233,6 +7233,38 @@
     },
     "consumeContainers": true
   },
+  {
+    "name": "minecraft:workbench/carved_pumpkin_to_redstone_jack_o_lantern",
+    "type": "minecraft:crafting/shaped",
+    "pattern": [
+      "A",
+      "B"
+    ],
+    "symbols": [
+      {
+        "symbol": "A",
+        "stack": {
+          "id": 791,
+          "amount": 1,
+          "meta": 0
+        }
+      },
+      {
+        "symbol": "B",
+        "stack": {
+          "id": 461,
+          "amount": 1,
+          "meta": 0
+        }
+      }
+    ],
+    "result": {
+      "id": 793,
+      "amount": 1,
+      "meta": 0
+    },
+    "consumeContainers": true
+  },
   {
     "name": "minecraft:workbench/glowstone",
     "type": "minecraft:crafting/shaped",
diff --git a/src/main/java/net/betterthanadventure/sound/ChannelLWJGL3OpenAL.java b/src/main/java/net/betterthanadventure/sound/ChannelLWJGL3OpenAL.java
new file mode 100644
index 000000000..3e2816412
--- /dev/null
+++ b/src/main/java/net/betterthanadventure/sound/ChannelLWJGL3OpenAL.java
@@ -0,0 +1,335 @@
+package net.betterthanadventure.sound;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.openal.AL10;
+import paulscode.sound.Channel;
+
+import javax.sound.sampled.AudioFormat;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.util.LinkedList;
+
+public class ChannelLWJGL3OpenAL extends Channel {
+    public IntBuffer ALSource;
+    public int ALformat;
+    public int sampleRate;
+    ByteBuffer bufferBuffer = BufferUtils.createByteBuffer(5242880);
+
+    public ChannelLWJGL3OpenAL(int var1, IntBuffer var2) {
+        super(var1);
+        this.libraryType = LibraryLWJGL3OpenAL.class;
+        this.ALSource = var2;
+    }
+
+    public void cleanup() {
+        if (this.ALSource != null) {
+            try {
+                AL10.alSourceStopv(this.ALSource);
+                AL10.alGetError();
+            } catch (Exception var3) {
+            }
+
+            try {
+                AL10.alDeleteSources(this.ALSource);
+                AL10.alGetError();
+            } catch (Exception var2) {
+            }
+
+            this.ALSource.clear();
+        }
+
+        this.ALSource = null;
+        super.cleanup();
+    }
+
+    public boolean attachBuffer(IntBuffer var1) {
+        if (this.errorCheck(this.channelType != 0, "Sound buffers may only be attached to normal sources.")) {
+            return false;
+        } else {
+            AL10.alSourcei(this.ALSource.get(0), 4105, var1.get(0));
+            return this.checkALError();
+        }
+    }
+
+    public void setAudioFormat(AudioFormat var1) {
+        boolean var2 = false;
+        short var3;
+        if (var1.getChannels() == 1) {
+            if (var1.getSampleSizeInBits() == 8) {
+                var3 = 4352;
+            } else {
+                if (var1.getSampleSizeInBits() != 16) {
+                    this.errorMessage("Illegal sample size in method 'setAudioFormat'");
+                    return;
+                }
+
+                var3 = 4353;
+            }
+        } else {
+            if (var1.getChannels() != 2) {
+                this.errorMessage("Audio data neither mono nor stereo in method 'setAudioFormat'");
+                return;
+            }
+
+            if (var1.getSampleSizeInBits() == 8) {
+                var3 = 4354;
+            } else {
+                if (var1.getSampleSizeInBits() != 16) {
+                    this.errorMessage("Illegal sample size in method 'setAudioFormat'");
+                    return;
+                }
+
+                var3 = 4355;
+            }
+        }
+
+        this.ALformat = var3;
+        this.sampleRate = (int)var1.getSampleRate();
+    }
+
+    public void setFormat(int var1, int var2) {
+        this.ALformat = var1;
+        this.sampleRate = var2;
+    }
+
+    public boolean preLoadBuffers(LinkedList var1) {
+        if (this.errorCheck(this.channelType != 1, "Buffers may only be queued for streaming sources.")) {
+            return false;
+        } else if (this.errorCheck(var1 == null, "Buffer List null in method 'preLoadBuffers'")) {
+            return false;
+        } else {
+            boolean var3 = this.playing();
+            if (var3) {
+                AL10.alSourceStop(this.ALSource.get(0));
+                this.checkALError();
+            }
+
+            int var4 = AL10.alGetSourcei(this.ALSource.get(0), 4118);
+            IntBuffer var2;
+            if (var4 > 0) {
+                var2 = BufferUtils.createIntBuffer(var4);
+                AL10.alGenBuffers(var2);
+                if (this.errorCheck(this.checkALError(), "Error clearing stream buffers in method 'preLoadBuffers'")) {
+                    return false;
+                }
+
+                AL10.alSourceUnqueueBuffers(this.ALSource.get(0), var2);
+                if (this.errorCheck(this.checkALError(), "Error unqueuing stream buffers in method 'preLoadBuffers'")) {
+                    return false;
+                }
+            }
+
+            if (var3) {
+                AL10.alSourcePlay(this.ALSource.get(0));
+                this.checkALError();
+            }
+
+            var2 = BufferUtils.createIntBuffer(var1.size());
+            AL10.alGenBuffers(var2);
+            if (this.errorCheck(this.checkALError(), "Error generating stream buffers in method 'preLoadBuffers'")) {
+                return false;
+            } else {
+                for(int var5 = 0; var5 < var1.size(); ++var5) {
+                    this.bufferBuffer.clear();
+                    this.bufferBuffer.put((byte[])var1.get(var5), 0, ((byte[])var1.get(var5)).length);
+                    this.bufferBuffer.flip();
+
+                    try {
+                        AL10.alBufferData(var2.get(var5), this.ALformat, this.bufferBuffer, this.sampleRate);
+                    } catch (Exception var8) {
+                        this.errorMessage("Error creating buffers in method 'preLoadBuffers'");
+                        this.printStackTrace(var8);
+                        return false;
+                    }
+
+                    if (this.errorCheck(this.checkALError(), "Error creating buffers in method 'preLoadBuffers'")) {
+                        return false;
+                    }
+                }
+
+                try {
+                    AL10.alSourceQueueBuffers(this.ALSource.get(0), var2);
+                } catch (Exception var7) {
+                    this.errorMessage("Error queuing buffers in method 'preLoadBuffers'");
+                    this.printStackTrace(var7);
+                    return false;
+                }
+
+                if (this.errorCheck(this.checkALError(), "Error queuing buffers in method 'preLoadBuffers'")) {
+                    return false;
+                } else {
+                    AL10.alSourcePlay(this.ALSource.get(0));
+                    return !this.errorCheck(this.checkALError(), "Error playing source in method 'preLoadBuffers'");
+                }
+            }
+        }
+    }
+
+    public boolean queueBuffer(byte[] var1) {
+        if (this.errorCheck(this.channelType != 1, "Buffers may only be queued for streaming sources.")) {
+            return false;
+        } else {
+            this.bufferBuffer.clear();
+            this.bufferBuffer.put(var1, 0, var1.length);
+            this.bufferBuffer.flip();
+            IntBuffer var2 = BufferUtils.createIntBuffer(1);
+            AL10.alSourceUnqueueBuffers(this.ALSource.get(0), var2);
+            if (this.checkALError()) {
+                return false;
+            } else {
+                AL10.alBufferData(var2.get(0), this.ALformat, this.bufferBuffer, this.sampleRate);
+                if (this.checkALError()) {
+                    return false;
+                } else {
+                    AL10.alSourceQueueBuffers(this.ALSource.get(0), var2);
+                    return !this.checkALError();
+                }
+            }
+        }
+    }
+
+    public int feedRawAudioData(byte[] var1) {
+        if (this.errorCheck(this.channelType != 1, "Raw audio data can only be fed to streaming sources.")) {
+            return -1;
+        } else {
+            ByteBuffer var2 = ByteBuffer.wrap(var1, 0, var1.length);
+            int var4 = AL10.alGetSourcei(this.ALSource.get(0), 4118);
+            IntBuffer var3;
+            if (var4 > 0) {
+                var3 = BufferUtils.createIntBuffer(var4);
+                AL10.alGenBuffers(var3);
+                if (this.errorCheck(this.checkALError(), "Error clearing stream buffers in method 'feedRawAudioData'")) {
+                    return -1;
+                }
+
+                AL10.alSourceUnqueueBuffers(this.ALSource.get(0), var3);
+                if (this.errorCheck(this.checkALError(), "Error unqueuing stream buffers in method 'feedRawAudioData'")) {
+                    return -1;
+                }
+            } else {
+                var3 = BufferUtils.createIntBuffer(1);
+                AL10.alGenBuffers(var3);
+                if (this.errorCheck(this.checkALError(), "Error generating stream buffers in method 'preLoadBuffers'")) {
+                    return -1;
+                }
+            }
+
+            AL10.alBufferData(var3.get(0), this.ALformat, var2, this.sampleRate);
+            if (this.checkALError()) {
+                return -1;
+            } else {
+                AL10.alSourceQueueBuffers(this.ALSource.get(0), var3);
+                if (this.checkALError()) {
+                    return -1;
+                } else {
+                    if (this.attachedSource != null && this.attachedSource.channel == this && this.attachedSource.active() && !this.playing()) {
+                        AL10.alSourcePlay(this.ALSource.get(0));
+                        this.checkALError();
+                    }
+
+                    return var4;
+                }
+            }
+        }
+    }
+
+    public int buffersProcessed() {
+        if (this.channelType != 1) {
+            return 0;
+        } else {
+            int var1 = AL10.alGetSourcei(this.ALSource.get(0), 4118);
+            return this.checkALError() ? 0 : var1;
+        }
+    }
+
+    public void flush() {
+        if (this.channelType == 1) {
+            int var1 = AL10.alGetSourcei(this.ALSource.get(0), 4117);
+            if (!this.checkALError()) {
+                for(IntBuffer var2 = BufferUtils.createIntBuffer(1); var1 > 0; --var1) {
+                    try {
+                        AL10.alSourceUnqueueBuffers(this.ALSource.get(0), var2);
+                    } catch (Exception var4) {
+                        return;
+                    }
+
+                    if (this.checkALError()) {
+                        return;
+                    }
+                }
+
+            }
+        }
+    }
+
+    public void close() {
+        try {
+            AL10.alSourceStop(this.ALSource.get(0));
+            AL10.alGetError();
+        } catch (Exception var2) {
+        }
+
+        if (this.channelType == 1) {
+            this.flush();
+        }
+
+    }
+
+    public void play() {
+        AL10.alSourcePlay(this.ALSource.get(0));
+        this.checkALError();
+    }
+
+    public void pause() {
+        AL10.alSourcePause(this.ALSource.get(0));
+        this.checkALError();
+    }
+
+    public void stop() {
+        AL10.alSourceStop(this.ALSource.get(0));
+        this.checkALError();
+    }
+
+    public void rewind() {
+        if (this.channelType != 1) {
+            AL10.alSourceRewind(this.ALSource.get(0));
+            this.checkALError();
+        }
+    }
+
+    public boolean playing() {
+        int var1 = AL10.alGetSourcei(this.ALSource.get(0), 4112);
+        if (this.checkALError()) {
+            return false;
+        } else {
+            return var1 == 4114;
+        }
+    }
+
+    private boolean checkALError() {
+        switch( AL10.alGetError() )
+        {
+            case AL10.AL_NO_ERROR:
+                return false;
+            case AL10.AL_INVALID_NAME:
+                errorMessage( "Invalid name parameter." );
+                return true;
+            case AL10.AL_INVALID_ENUM:
+                errorMessage( "Invalid parameter." );
+                return true;
+            case AL10.AL_INVALID_VALUE:
+                errorMessage( "Invalid enumerated parameter value." );
+                return true;
+            case AL10.AL_INVALID_OPERATION:
+                errorMessage( "Illegal call." );
+                return true;
+            case AL10.AL_OUT_OF_MEMORY:
+                errorMessage( "Unable to allocate memory." );
+                return true;
+            default:
+                errorMessage( "An unrecognized error occurred." );
+                return true;
+        }
+    }
+
+}
diff --git a/src/main/java/net/betterthanadventure/sound/LibraryLWJGL3OpenAL.java b/src/main/java/net/betterthanadventure/sound/LibraryLWJGL3OpenAL.java
new file mode 100644
index 000000000..25930af32
--- /dev/null
+++ b/src/main/java/net/betterthanadventure/sound/LibraryLWJGL3OpenAL.java
@@ -0,0 +1,457 @@
+package net.betterthanadventure.sound;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.LWJGLException;
+import org.lwjgl.openal.*;
+import paulscode.sound.*;
+
+import javax.sound.sampled.AudioFormat;
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+public class LibraryLWJGL3OpenAL extends Library {
+    private static final boolean GET = false;
+    private static final boolean SET = true;
+    private static final boolean XXX = false;
+    private long device = -1;
+    private long context = -1;
+    private FloatBuffer listenerPositionAL = null;
+    private FloatBuffer listenerOrientation = null;
+    private FloatBuffer listenerVelocity = null;
+    private HashMap ALBufferMap = null;
+    private static boolean alPitchSupported = true;
+
+    public LibraryLWJGL3OpenAL() {
+        this.ALBufferMap = new HashMap();
+    }
+
+    private void create() {
+        device = ALC10.alcOpenDevice((ByteBuffer) null);
+        if (device == 0L) {
+            this.errorMessage("OpenAL device could not be created.");
+            return;
+        }
+        ALCCapabilities deviceCaps = ALC.createCapabilities(device);
+        this.context = ALC10.alcCreateContext(device, (IntBuffer) null);
+        if (context == 0L) {
+            this.errorMessage("OpenAL context could not be created.");
+        }
+        ALC10.alcMakeContextCurrent(context);
+        AL.createCapabilities(deviceCaps);
+    }
+
+    private void destroy() {
+        if (context != 0L) {
+            ALC10.alcDestroyContext(context);
+            context = 0L;
+        }
+        if (device != 0L) {
+            ALC10.alcCloseDevice(device);
+            device = 0L;
+        }
+    }
+
+    @Override
+    public void init() {
+        boolean var1 = false;
+
+        create();
+        var1 = this.checkALError();
+
+        if (var1) {
+            this.importantMessage("OpenAL did not initialize properly!");
+        } else {
+            this.message("OpenAL initialized.");
+        }
+
+        this.listenerPositionAL = BufferUtils.createFloatBuffer(3).put(new float[]{this.listener.position.x, this.listener.position.y, this.listener.position.z});
+        this.listenerOrientation = BufferUtils.createFloatBuffer(6).put(new float[]{this.listener.lookAt.x, this.listener.lookAt.y, this.listener.lookAt.z, this.listener.up.x, this.listener.up.y, this.listener.up.z});
+        this.listenerVelocity = BufferUtils.createFloatBuffer(3).put(new float[]{0.0F, 0.0F, 0.0F});
+        this.listenerPositionAL.flip();
+        this.listenerOrientation.flip();
+        this.listenerVelocity.flip();
+        AL10.alListenerfv(4100, this.listenerPositionAL);
+        var1 = this.checkALError() || var1;
+        AL10.alListenerfv(4111, this.listenerOrientation);
+        var1 = this.checkALError() || var1;
+        AL10.alListenerfv(4102, this.listenerVelocity);
+        var1 = this.checkALError() || var1;
+        if (var1) {
+            this.importantMessage("OpenAL did not initialize properly!");
+//            throw new SoundSystemException("Problem encountered while loading OpenAL or creating the listener.  Probably cause:  OpenAL not supported", 6);
+        } else {
+            super.init();
+            ChannelLWJGL3OpenAL var2 = (ChannelLWJGL3OpenAL) this.normalChannels.get(1);
+
+            try {
+                AL10.alSourcef(var2.ALSource.get(0), 4099, 1.0F);
+                if (this.checkALError()) {
+                    alPitchSupported(true, false);
+                    throw new SoundSystemException("OpenAL: AL_PITCH not supported.", 13);
+                } else {
+                    alPitchSupported(true, true);
+                }
+            } catch (Exception var4) {
+                alPitchSupported(true, false);
+//                throw new SoundSystemException("OpenAL: AL_PITCH not supported.", 13);
+            }
+        }
+    }
+
+    public static boolean libraryCompatible() {
+        return true;
+    }
+
+    protected Channel createChannel(int var1) {
+        IntBuffer var3 = BufferUtils.createIntBuffer(1);
+
+        try {
+            AL10.alGenSources(var3);
+        } catch (Exception var5) {
+            AL10.alGetError();
+            return null;
+        }
+
+        if (AL10.alGetError() != 0) {
+            return null;
+        } else {
+            ChannelLWJGL3OpenAL var2 = new ChannelLWJGL3OpenAL(var1, var3);
+            return var2;
+        }
+    }
+
+    public void cleanup() {
+        super.cleanup();
+        Set var1 = this.bufferMap.keySet();
+        Iterator var2 = var1.iterator();
+
+        while (var2.hasNext()) {
+            String var3 = (String) var2.next();
+            IntBuffer var4 = (IntBuffer) this.ALBufferMap.get(var3);
+            if (var4 != null) {
+                AL10.alDeleteBuffers(var4);
+                this.checkALError();
+                var4.clear();
+            }
+        }
+
+        this.bufferMap.clear();
+        destroy();
+        this.bufferMap = null;
+        this.listenerPositionAL = null;
+        this.listenerOrientation = null;
+        this.listenerVelocity = null;
+    }
+
+    public boolean loadSound(FilenameURL var1) {
+        if (this.bufferMap == null) {
+            this.bufferMap = new HashMap();
+            this.importantMessage("Buffer Map was null in method 'loadSound'");
+        }
+
+        if (this.ALBufferMap == null) {
+            this.ALBufferMap = new HashMap();
+            this.importantMessage("Open AL Buffer Map was null in method'loadSound'");
+        }
+
+        if (this.errorCheck(var1 == null, "Filename/URL not specified in method 'loadSound'")) {
+            return false;
+        } else if (this.bufferMap.get(var1.getFilename()) != null) {
+            return true;
+        } else {
+            ICodec var2 = SoundSystemConfig.getCodec(var1.getFilename());
+            if (this.errorCheck(var2 == null, "No codec found for file '" + var1.getFilename() + "' in method 'loadSound'")) {
+                return false;
+            } else {
+                var2.initialize(var1.getURL());
+                SoundBuffer var3 = var2.readAll();
+                var2.cleanup();
+                var2 = null;
+                if (this.errorCheck(var3 == null, "Sound buffer null in method 'loadSound'")) {
+                    return false;
+                } else {
+                    this.bufferMap.put(var1.getFilename(), var3);
+                    AudioFormat var4 = var3.audioFormat;
+                    boolean var5 = false;
+                    short var8;
+                    if (var4.getChannels() == 1) {
+                        if (var4.getSampleSizeInBits() == 8) {
+                            var8 = 4352;
+                        } else {
+                            if (var4.getSampleSizeInBits() != 16) {
+                                this.errorMessage("Illegal sample size in method 'loadSound'");
+                                return false;
+                            }
+
+                            var8 = 4353;
+                        }
+                    } else {
+                        if (var4.getChannels() != 2) {
+                            this.errorMessage("File neither mono nor stereo in method 'loadSound'");
+                            return false;
+                        }
+
+                        if (var4.getSampleSizeInBits() == 8) {
+                            var8 = 4354;
+                        } else {
+                            if (var4.getSampleSizeInBits() != 16) {
+                                this.errorMessage("Illegal sample size in method 'loadSound'");
+                                return false;
+                            }
+
+                            var8 = 4355;
+                        }
+                    }
+
+                    IntBuffer var6 = BufferUtils.createIntBuffer(1);
+                    AL10.alGenBuffers(var6);
+                    if (this.errorCheck(AL10.alGetError() != 0, "alGenBuffers error when loading " + var1.getFilename())) {
+                        return false;
+                    } else {
+                        ByteBuffer var7 = BufferUtils.createByteBuffer(var3.audioData.length);
+                        var7.clear();
+                        var7.put(var3.audioData);
+                        var7.flip();
+                        AL10.alBufferData(var6.get(0), var8, var7, (int) var4.getSampleRate());
+                        if (this.errorCheck(AL10.alGetError() != 0, "alBufferData error when loading " + var1.getFilename()) && this.errorCheck(var6 == null, "Sound buffer was not created for " + var1.getFilename())) {
+                            return false;
+                        } else {
+                            this.ALBufferMap.put(var1.getFilename(), var6);
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void unloadSound(String var1) {
+        this.ALBufferMap.remove(var1);
+        super.unloadSound(var1);
+    }
+
+    public void setMasterVolume(float var1) {
+        super.setMasterVolume(var1);
+        AL10.alListenerf(4106, var1);
+        this.checkALError();
+    }
+
+    public void newSource(boolean var1, boolean var2, boolean var3, String var4, FilenameURL var5, float var6, float var7, float var8, int var9, float var10) {
+        IntBuffer var11 = null;
+        if (!var2) {
+            var11 = (IntBuffer) this.ALBufferMap.get(var5.getFilename());
+            if (var11 == null && !this.loadSound(var5)) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because an error occurred while loading " + var5.getFilename());
+                return;
+            }
+
+            var11 = (IntBuffer) this.ALBufferMap.get(var5.getFilename());
+            if (var11 == null) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because a sound buffer was not found for " + var5.getFilename());
+                return;
+            }
+        }
+
+        SoundBuffer var12 = null;
+        if (!var2) {
+            var12 = (SoundBuffer) this.bufferMap.get(var5.getFilename());
+            if (var12 == null && !this.loadSound(var5)) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because an error occurred while loading " + var5.getFilename());
+                return;
+            }
+
+            var12 = (SoundBuffer) this.bufferMap.get(var5.getFilename());
+            if (var12 == null) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because audio data was not found for " + var5.getFilename());
+                return;
+            }
+        }
+
+        this.sourceMap.put(var4, new SourceLWJGL3OpenAL(this.listenerPositionAL, var11, var1, var2, var3, var4, var5, var12, var6, var7, var8, var9, var10, false));
+    }
+
+    public void rawDataStream(AudioFormat var1, boolean var2, String var3, float var4, float var5, float var6, int var7, float var8) {
+        this.sourceMap.put(var3, new SourceLWJGL3OpenAL(this.listenerPositionAL, var1, var2, var3, var4, var5, var6, var7, var8));
+    }
+
+    public void quickPlay(boolean var1, boolean var2, boolean var3, String var4, FilenameURL var5, float var6, float var7, float var8, int var9, float var10, boolean var11) {
+        IntBuffer var12 = null;
+        if (!var2) {
+            var12 = (IntBuffer) this.ALBufferMap.get(var5.getFilename());
+            if (var12 == null) {
+                this.loadSound(var5);
+            }
+
+            var12 = (IntBuffer) this.ALBufferMap.get(var5.getFilename());
+            if (var12 == null) {
+                this.errorMessage("Sound buffer was not created for " + var5.getFilename());
+                return;
+            }
+        }
+
+        SoundBuffer var13 = null;
+        if (!var2) {
+            var13 = (SoundBuffer) this.bufferMap.get(var5.getFilename());
+            if (var13 == null && !this.loadSound(var5)) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because an error occurred while loading " + var5.getFilename());
+                return;
+            }
+
+            var13 = (SoundBuffer) this.bufferMap.get(var5.getFilename());
+            if (var13 == null) {
+                this.errorMessage("Source '" + var4 + "' was not created " + "because audio data was not found for " + var5.getFilename());
+                return;
+            }
+        }
+
+        SourceLWJGL3OpenAL var14 = new SourceLWJGL3OpenAL(this.listenerPositionAL, var12, var1, var2, var3, var4, var5, var13, var6, var7, var8, var9, var10, false);
+        this.sourceMap.put(var4, var14);
+        this.play(var14);
+        if (var11) {
+            var14.setTemporary(true);
+        }
+
+    }
+
+    public void copySources(HashMap var1) {
+        if (var1 != null) {
+            Set var2 = var1.keySet();
+            Iterator var3 = var2.iterator();
+            if (this.bufferMap == null) {
+                this.bufferMap = new HashMap();
+                this.importantMessage("Buffer Map was null in method 'copySources'");
+            }
+
+            if (this.ALBufferMap == null) {
+                this.ALBufferMap = new HashMap();
+                this.importantMessage("Open AL Buffer Map was null in method'copySources'");
+            }
+
+            this.sourceMap.clear();
+
+            while (true) {
+                String var4;
+                Source var5;
+                SoundBuffer var6;
+                do {
+                    do {
+                        if (!var3.hasNext()) {
+                            return;
+                        }
+
+                        var4 = (String) var3.next();
+                        var5 = (Source) var1.get(var4);
+                    } while (var5 == null);
+
+                    var6 = null;
+                    if (!var5.toStream) {
+                        this.loadSound(var5.filenameURL);
+                        var6 = (SoundBuffer) this.bufferMap.get(var5.filenameURL.getFilename());
+                    }
+                } while (!var5.toStream && var6 == null);
+
+                this.sourceMap.put(var4, new SourceLWJGL3OpenAL(this.listenerPositionAL, (IntBuffer) this.ALBufferMap.get(var5.filenameURL.getFilename()), var5, var6));
+            }
+        }
+    }
+
+    public void setListenerPosition(float var1, float var2, float var3) {
+        super.setListenerPosition(var1, var2, var3);
+        this.listenerPositionAL.put(0, var1);
+        this.listenerPositionAL.put(1, var2);
+        this.listenerPositionAL.put(2, var3);
+        AL10.alListenerfv(4100, this.listenerPositionAL);
+        this.checkALError();
+    }
+
+    public void setListenerAngle(float var1) {
+        super.setListenerAngle(var1);
+        this.listenerOrientation.put(0, this.listener.lookAt.x);
+        this.listenerOrientation.put(2, this.listener.lookAt.z);
+        AL10.alListenerfv(4111, this.listenerOrientation);
+        this.checkALError();
+    }
+
+    public void setListenerOrientation(float var1, float var2, float var3, float var4, float var5, float var6) {
+        super.setListenerOrientation(var1, var2, var3, var4, var5, var6);
+        this.listenerOrientation.put(0, var1);
+        this.listenerOrientation.put(1, var2);
+        this.listenerOrientation.put(2, var3);
+        this.listenerOrientation.put(3, var4);
+        this.listenerOrientation.put(4, var5);
+        this.listenerOrientation.put(5, var6);
+        AL10.alListenerfv(4111, this.listenerOrientation);
+        this.checkALError();
+    }
+
+    public void setListenerData(ListenerData var1) {
+        super.setListenerData(var1);
+        this.listenerPositionAL.put(0, var1.position.x);
+        this.listenerPositionAL.put(1, var1.position.y);
+        this.listenerPositionAL.put(2, var1.position.z);
+        AL10.alListenerfv(4100, this.listenerPositionAL);
+        this.listenerOrientation.put(0, var1.lookAt.x);
+        this.listenerOrientation.put(1, var1.lookAt.y);
+        this.listenerOrientation.put(2, var1.lookAt.z);
+        this.listenerOrientation.put(3, var1.up.x);
+        this.listenerOrientation.put(4, var1.up.y);
+        this.listenerOrientation.put(5, var1.up.z);
+        AL10.alListenerfv(4111, this.listenerOrientation);
+        this.checkALError();
+    }
+
+    private boolean checkALError() {
+        switch( AL10.alGetError() )
+        {
+            case AL10.AL_NO_ERROR:
+                return false;
+            case AL10.AL_INVALID_NAME:
+                errorMessage( "Invalid name parameter." );
+                return true;
+            case AL10.AL_INVALID_ENUM:
+                errorMessage( "Invalid parameter." );
+                return true;
+            case AL10.AL_INVALID_VALUE:
+                errorMessage( "Invalid enumerated parameter value." );
+                return true;
+            case AL10.AL_INVALID_OPERATION:
+                errorMessage( "Illegal call." );
+                return true;
+            case AL10.AL_OUT_OF_MEMORY:
+                errorMessage( "Unable to allocate memory." );
+                return true;
+            default:
+                errorMessage( "An unrecognized error occurred." );
+                return true;
+        }
+    }
+
+    public static boolean alPitchSupported() {
+        return alPitchSupported(false, false);
+    }
+
+    private static synchronized boolean alPitchSupported(boolean var0, boolean var1) {
+        if (var0) {
+            alPitchSupported = var1;
+        }
+
+        return alPitchSupported;
+    }
+
+    public static String getTitle() {
+        return "LWJGL OpenAL";
+    }
+
+    public static String getDescription() {
+        return "The LWJGL3 binding of OpenAL.  For more information, see http://www.lwjgl.org";
+    }
+
+    public String getClassName() {
+        return "LibraryLWJGL3OpenAL";
+    }
+
+}
diff --git a/src/main/java/net/betterthanadventure/sound/SourceLWJGL3OpenAL.java b/src/main/java/net/betterthanadventure/sound/SourceLWJGL3OpenAL.java
new file mode 100644
index 000000000..ae034d971
--- /dev/null
+++ b/src/main/java/net/betterthanadventure/sound/SourceLWJGL3OpenAL.java
@@ -0,0 +1,435 @@
+package net.betterthanadventure.sound;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.openal.AL10;
+import paulscode.sound.*;
+
+import javax.sound.sampled.AudioFormat;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.util.LinkedList;
+
+public class SourceLWJGL3OpenAL extends Source {
+    private ChannelLWJGL3OpenAL channelOpenAL;
+    private IntBuffer myBuffer;
+    private FloatBuffer listenerPosition;
+    private FloatBuffer sourcePosition;
+    private FloatBuffer sourceVelocity;
+
+    public SourceLWJGL3OpenAL(FloatBuffer var1, IntBuffer var2, boolean var3, boolean var4, boolean var5, String var6, FilenameURL var7, SoundBuffer var8, float var9, float var10, float var11, int var12, float var13, boolean var14) {
+        super(var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14);
+        this.channelOpenAL = (ChannelLWJGL3OpenAL)this.channel;
+        this.reverseByteOrder = true;
+        if (this.codec != null) {
+            this.codec.reverseByteOrder(true);
+        }
+
+        this.listenerPosition = var1;
+        this.myBuffer = var2;
+        this.libraryType = LibraryLWJGL3OpenAL.class;
+        this.pitch = 1.0F;
+        this.resetALInformation();
+    }
+
+    public SourceLWJGL3OpenAL(FloatBuffer var1, IntBuffer var2, Source var3, SoundBuffer var4) {
+        super(var3, var4);
+        this.channelOpenAL = (ChannelLWJGL3OpenAL)this.channel;
+        this.reverseByteOrder = true;
+        if (this.codec != null) {
+            this.codec.reverseByteOrder(true);
+        }
+
+        this.listenerPosition = var1;
+        this.myBuffer = var2;
+        this.libraryType = LibraryLWJGL3OpenAL.class;
+        this.pitch = 1.0F;
+        this.resetALInformation();
+    }
+
+    public SourceLWJGL3OpenAL(FloatBuffer var1, AudioFormat var2, boolean var3, String var4, float var5, float var6, float var7, int var8, float var9) {
+        super(var2, var3, var4, var5, var6, var7, var8, var9);
+        this.channelOpenAL = (ChannelLWJGL3OpenAL)this.channel;
+        this.reverseByteOrder = true;
+        this.listenerPosition = var1;
+        this.libraryType = LibraryLWJGL3OpenAL.class;
+        this.pitch = 1.0F;
+        this.resetALInformation();
+    }
+
+    public void cleanup() {
+        super.cleanup();
+    }
+
+    public void changeSource(FloatBuffer var1, IntBuffer var2, boolean var3, boolean var4, boolean var5, String var6, FilenameURL var7, SoundBuffer var8, float var9, float var10, float var11, int var12, float var13, boolean var14) {
+        super.changeSource(var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14);
+        this.reverseByteOrder = true;
+        this.listenerPosition = var1;
+        this.myBuffer = var2;
+        this.pitch = 1.0F;
+        this.resetALInformation();
+    }
+
+    public boolean incrementSoundSequence() {
+        if (!this.toStream) {
+            this.errorMessage("Method 'incrementSoundSequence' may only be used for streaming sources.");
+            return false;
+        } else {
+            synchronized(this.soundSequenceLock) {
+                if (this.soundSequenceQueue != null && this.soundSequenceQueue.size() > 0) {
+                    this.filenameURL = (FilenameURL)this.soundSequenceQueue.remove(0);
+                    if (this.codec != null) {
+                        this.codec.cleanup();
+                    }
+
+                    this.codec = SoundSystemConfig.getCodec(this.filenameURL.getFilename());
+                    if (this.codec != null) {
+                        this.codec.reverseByteOrder(true);
+                        if (this.codec.getAudioFormat() == null) {
+                            this.codec.initialize(this.filenameURL.getURL());
+                        }
+
+                        AudioFormat var2 = this.codec.getAudioFormat();
+                        if (var2 == null) {
+                            this.errorMessage("Audio Format null in method 'incrementSoundSequence'");
+                            return false;
+                        }
+
+                        boolean var3 = false;
+                        short var6;
+                        if (var2.getChannels() == 1) {
+                            if (var2.getSampleSizeInBits() == 8) {
+                                var6 = 4352;
+                            } else {
+                                if (var2.getSampleSizeInBits() != 16) {
+                                    this.errorMessage("Illegal sample size in method 'incrementSoundSequence'");
+                                    return false;
+                                }
+
+                                var6 = 4353;
+                            }
+                        } else {
+                            if (var2.getChannels() != 2) {
+                                this.errorMessage("Audio data neither mono nor stereo in method 'incrementSoundSequence'");
+                                return false;
+                            }
+
+                            if (var2.getSampleSizeInBits() == 8) {
+                                var6 = 4354;
+                            } else {
+                                if (var2.getSampleSizeInBits() != 16) {
+                                    this.errorMessage("Illegal sample size in method 'incrementSoundSequence'");
+                                    return false;
+                                }
+
+                                var6 = 4355;
+                            }
+                        }
+
+                        this.channelOpenAL.setFormat(var6, (int)var2.getSampleRate());
+                        this.preLoad = true;
+                    }
+
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+    }
+
+    public void listenerMoved() {
+        this.positionChanged();
+    }
+
+    public void setPosition(float var1, float var2, float var3) {
+        super.setPosition(var1, var2, var3);
+        if (this.sourcePosition == null) {
+            this.resetALInformation();
+        } else {
+            this.positionChanged();
+        }
+
+        this.sourcePosition.put(0, var1);
+        this.sourcePosition.put(1, var2);
+        this.sourcePosition.put(2, var3);
+        if (this.channel != null && this.channel.attachedSource == this && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            AL10.alSourcefv(this.channelOpenAL.ALSource.get(0), 4100, this.sourcePosition);
+            this.checkALError();
+        }
+
+    }
+
+    public void positionChanged() {
+        this.calculateDistance();
+        this.calculateGain();
+        if (this.channel != null && this.channel.attachedSource == this && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4106, this.gain * this.sourceVolume * Math.abs(this.fadeOutGain) * this.fadeInGain);
+            this.checkALError();
+        }
+
+        this.checkPitch();
+    }
+
+    private void checkPitch() {
+        if (this.channel != null && this.channel.attachedSource == this && LibraryLWJGL3OpenAL.alPitchSupported() && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4099, this.pitch);
+            this.checkALError();
+        }
+
+    }
+
+    public void setLooping(boolean var1) {
+        super.setLooping(var1);
+        if (this.channel != null && this.channel.attachedSource == this && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            if (var1) {
+                AL10.alSourcei(this.channelOpenAL.ALSource.get(0), 4103, 1);
+            } else {
+                AL10.alSourcei(this.channelOpenAL.ALSource.get(0), 4103, 0);
+            }
+
+            this.checkALError();
+        }
+
+    }
+
+    public void setAttenuation(int var1) {
+        super.setAttenuation(var1);
+        if (this.channel != null && this.channel.attachedSource == this && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            if (var1 == 1) {
+                AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, this.distOrRoll);
+            } else {
+                AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, 0.0F);
+            }
+
+            this.checkALError();
+        }
+
+    }
+
+    public void setDistOrRoll(float var1) {
+        super.setDistOrRoll(var1);
+        if (this.channel != null && this.channel.attachedSource == this && this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+            if (this.attModel == 1) {
+                AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, var1);
+            } else {
+                AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, 0.0F);
+            }
+
+            this.checkALError();
+        }
+
+    }
+
+    public void setPitch(float var1) {
+        super.setPitch(var1);
+        this.checkPitch();
+    }
+
+    public void play(Channel var1) {
+        if (!this.active()) {
+            if (this.toLoop) {
+                this.toPlay = true;
+            }
+
+        } else if (var1 == null) {
+            this.errorMessage("Unable to play source, because channel was null");
+        } else {
+            boolean var2 = this.channel != var1;
+            if (this.channel != null && this.channel.attachedSource != this) {
+                var2 = true;
+            }
+
+            boolean var3 = this.paused();
+            super.play(var1);
+            this.channelOpenAL = (ChannelLWJGL3OpenAL)this.channel;
+            if (var2) {
+                this.setPosition(this.position.x, this.position.y, this.position.z);
+                this.checkPitch();
+                if (this.channelOpenAL != null && this.channelOpenAL.ALSource != null) {
+                    if (LibraryLWJGL3OpenAL.alPitchSupported()) {
+                        AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4099, this.pitch);
+                        this.checkALError();
+                    }
+
+                    AL10.alSourcefv(this.channelOpenAL.ALSource.get(0), 4100, this.sourcePosition);
+                    this.checkALError();
+                    AL10.alSourcefv(this.channelOpenAL.ALSource.get(0), 4102, this.sourceVelocity);
+                    this.checkALError();
+                    if (this.attModel == 1) {
+                        AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, this.distOrRoll);
+                    } else {
+                        AL10.alSourcef(this.channelOpenAL.ALSource.get(0), 4129, 0.0F);
+                    }
+
+                    this.checkALError();
+                    if (this.toLoop && !this.toStream) {
+                        AL10.alSourcei(this.channelOpenAL.ALSource.get(0), 4103, 1);
+                    } else {
+                        AL10.alSourcei(this.channelOpenAL.ALSource.get(0), 4103, 0);
+                    }
+
+                    this.checkALError();
+                }
+
+                if (!this.toStream) {
+                    if (this.myBuffer == null) {
+                        this.errorMessage("No sound buffer to play");
+                        return;
+                    }
+
+                    this.channelOpenAL.attachBuffer(this.myBuffer);
+                }
+            }
+
+            if (!this.playing()) {
+                if (this.toStream && !var3) {
+                    if (this.codec == null) {
+                        this.errorMessage("Decoder null in method 'play'");
+                        return;
+                    }
+
+                    if (this.codec.getAudioFormat() == null) {
+                        this.codec.initialize(this.filenameURL.getURL());
+                    }
+
+                    AudioFormat var4 = this.codec.getAudioFormat();
+                    if (var4 == null) {
+                        this.errorMessage("Audio Format null in method 'play'");
+                        return;
+                    }
+
+                    boolean var5 = false;
+                    short var6;
+                    if (var4.getChannels() == 1) {
+                        if (var4.getSampleSizeInBits() == 8) {
+                            var6 = 4352;
+                        } else {
+                            if (var4.getSampleSizeInBits() != 16) {
+                                this.errorMessage("Illegal sample size in method 'play'");
+                                return;
+                            }
+
+                            var6 = 4353;
+                        }
+                    } else {
+                        if (var4.getChannels() != 2) {
+                            this.errorMessage("Audio data neither mono nor stereo in method 'play'");
+                            return;
+                        }
+
+                        if (var4.getSampleSizeInBits() == 8) {
+                            var6 = 4354;
+                        } else {
+                            if (var4.getSampleSizeInBits() != 16) {
+                                this.errorMessage("Illegal sample size in method 'play'");
+                                return;
+                            }
+
+                            var6 = 4355;
+                        }
+                    }
+
+                    this.channelOpenAL.setFormat(var6, (int)var4.getSampleRate());
+                    this.preLoad = true;
+                }
+
+                this.channel.play();
+                if (this.pitch != 1.0F) {
+                    this.checkPitch();
+                }
+            }
+
+        }
+    }
+
+    public boolean preLoad() {
+        if (this.codec == null) {
+            return false;
+        } else {
+            this.codec.initialize(this.filenameURL.getURL());
+            LinkedList var1 = new LinkedList();
+
+            for(int var2 = 0; var2 < SoundSystemConfig.getNumberStreamingBuffers(); ++var2) {
+                this.soundBuffer = this.codec.read();
+                if (this.soundBuffer == null || this.soundBuffer.audioData == null) {
+                    break;
+                }
+
+                var1.add(this.soundBuffer.audioData);
+            }
+
+            this.positionChanged();
+            this.channel.preLoadBuffers(var1);
+            this.preLoad = false;
+            return true;
+        }
+    }
+
+    private void resetALInformation() {
+        this.sourcePosition = BufferUtils.createFloatBuffer(3).put(new float[]{this.position.x, this.position.y, this.position.z});
+        this.sourceVelocity = BufferUtils.createFloatBuffer(3).put(new float[]{0.0F, 0.0F, 0.0F});
+        this.sourcePosition.flip();
+        this.sourceVelocity.flip();
+        this.positionChanged();
+    }
+
+    private void calculateDistance() {
+        if (this.listenerPosition != null) {
+            double var1 = (double)(this.position.x - this.listenerPosition.get(0));
+            double var3 = (double)(this.position.y - this.listenerPosition.get(1));
+            double var5 = (double)(this.position.z - this.listenerPosition.get(2));
+            this.distanceFromListener = (float)Math.sqrt(var1 * var1 + var3 * var3 + var5 * var5);
+        }
+
+    }
+
+    private void calculateGain() {
+        if (this.attModel == 2) {
+            if (this.distanceFromListener <= 0.0F) {
+                this.gain = 1.0F;
+            } else if (this.distanceFromListener >= this.distOrRoll) {
+                this.gain = 0.0F;
+            } else {
+                this.gain = 1.0F - this.distanceFromListener / this.distOrRoll;
+            }
+
+            if (this.gain > 1.0F) {
+                this.gain = 1.0F;
+            }
+
+            if (this.gain < 0.0F) {
+                this.gain = 0.0F;
+            }
+        } else {
+            this.gain = 1.0F;
+        }
+
+    }
+
+    private boolean checkALError() {
+        switch( AL10.alGetError() )
+        {
+            case AL10.AL_NO_ERROR:
+                return false;
+            case AL10.AL_INVALID_NAME:
+                errorMessage( "Invalid name parameter." );
+                return true;
+            case AL10.AL_INVALID_ENUM:
+                errorMessage( "Invalid parameter." );
+                return true;
+            case AL10.AL_INVALID_VALUE:
+                errorMessage( "Invalid enumerated parameter value." );
+                return true;
+            case AL10.AL_INVALID_OPERATION:
+                errorMessage( "Illegal call." );
+                return true;
+            case AL10.AL_OUT_OF_MEMORY:
+                errorMessage( "Unable to allocate memory." );
+                return true;
+            default:
+                errorMessage( "An unrecognized error occurred." );
+                return true;
+        }
+    }
+
+}
diff --git a/src/main/java/net/betterthanadventure/utils/ColorizerGenerator.java b/src/main/java/net/betterthanadventure/utils/ColorizerGenerator.java
index d2c6d8583..6eda87c4a 100644
--- a/src/main/java/net/betterthanadventure/utils/ColorizerGenerator.java
+++ b/src/main/java/net/betterthanadventure/utils/ColorizerGenerator.java
@@ -2,6 +2,8 @@ package net.betterthanadventure.utils;
 import net.minecraft.core.util.helper.Color;
 import org.lwjgl.opengl.Display;
 import org.lwjgl.opengl.DisplayMode;
+import org.lwjgl.opengl.PixelFormat;
+
 import static org.lwjgl.opengl.GL11.*;
 
 public class ColorizerGenerator {
@@ -47,7 +49,7 @@ public class ColorizerGenerator {
     public static void main(String[] args) throws Exception {
         Display.setDisplayMode(new DisplayMode(257, 257));
         Display.setTitle("Gradient");
-        Display.create();
+        Display.create(new PixelFormat());
         Display.setVSyncEnabled(true);
 
 
diff --git a/src/main/java/net/betterthanadventure/utils/DataDumper.java b/src/main/java/net/betterthanadventure/utils/DataDumper.java
index 28b51e18d..0092b83f9 100644
--- a/src/main/java/net/betterthanadventure/utils/DataDumper.java
+++ b/src/main/java/net/betterthanadventure/utils/DataDumper.java
@@ -4,17 +4,19 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.core.Global;
 import net.minecraft.core.MinecraftAccessor;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.tag.ITaggable;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.SkinVariantList;
 import net.minecraft.core.entity.SpawnListEntry;
-import net.minecraft.core.enums.EnumCreatureType;
+import net.minecraft.core.enums.MobCategory;
+import net.minecraft.core.item.FoodItem;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemFood;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.tag.ItemTags;
-import net.minecraft.core.item.tool.ItemToolPickaxe;
+import net.minecraft.core.item.tool.PickaxeToolItem;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
@@ -61,8 +63,8 @@ public class DataDumper implements MinecraftAccessor {
         I18n.initialize("en_US");
         translator = I18n.getInstance();
 
-        System.out.println(Block.dirt.id);
-        System.out.println(Item.stick.id);
+        System.out.println(Blocks.DIRT.id);
+        System.out.println(Items.STICK.id);
 
         File wikiDumpFile = new File(getMinecraftDir(), "infodump");
         wikiDumpFile.mkdirs();
@@ -111,7 +113,7 @@ public class DataDumper implements MinecraftAccessor {
                 .append(item.id).append(",")
                 .append(item.getKey()).append(",")
                 .append(item.getMaxDamage()).append(",")
-                .append(item instanceof ItemFood ? ((ItemFood) item).getHealAmount() : "").append(",")
+                .append(item instanceof FoodItem ? ((FoodItem) item).getHealAmount() : "").append(",")
                 .append(item.getItemStackLimit()).append(",")
                 .append("\"").append(translator.translateNameKey(item.getKey())).append("\"").append(",")
                 .append("\"").append(translator.translateDescKey(item.getKey())).append("\"").append(",");
@@ -127,7 +129,7 @@ public class DataDumper implements MinecraftAccessor {
                 .append(block.getKey()).append(",")
                 .append(block.getHardness()).append(",")
                 .append(block.getBlastResistance(null)).append(",")
-                .append(ItemToolPickaxe.miningLevels.getOrDefault(block, 0)).append(",")
+                .append(PickaxeToolItem.miningLevels.getOrDefault(block, 0)).append(",")
                 .append(block.asItem().getItemStackLimit()).append(",")
                 .append("\"").append(translator.translateNameKey(block.getKey())).append("\"").append(",")
                 .append("\"").append(translator.translateDescKey(block.getKey())).append("\"").append(",");
@@ -159,10 +161,10 @@ public class DataDumper implements MinecraftAccessor {
 
         builder.append(s).append("\",");
 
-        builder.append("\"").append(spawnableListString(biome.getSpawnableList(EnumCreatureType.monster))).append("\",");
-        builder.append("\"").append(spawnableListString(biome.getSpawnableList(EnumCreatureType.creature))).append("\",");
-        builder.append("\"").append(spawnableListString(biome.getSpawnableList(EnumCreatureType.waterCreature))).append("\",");
-        builder.append("\"").append(spawnableListString(biome.getSpawnableList(EnumCreatureType.ambientCreature))).append("\"");
+        builder.append("\"").append(spawnableListString(biome.getSpawnableList(MobCategory.monster))).append("\",");
+        builder.append("\"").append(spawnableListString(biome.getSpawnableList(MobCategory.creature))).append("\",");
+        builder.append("\"").append(spawnableListString(biome.getSpawnableList(MobCategory.waterCreature))).append("\",");
+        builder.append("\"").append(spawnableListString(biome.getSpawnableList(MobCategory.ambientCreature))).append("\"");
         builder.append("\n");
 
         return builder.toString();
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index e486c2786..d5b359d1c 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -1,33 +1,30 @@
 package net.minecraft.client;
 
-import static net.minecraft.core.Global.*;
-import static org.lwjgl.opengl.GL11.*;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Comparator;
 import java.util.Random;
 
-import net.minecraft.client.gui.guidebook.GuiGuidebook;
+import com.mojang.nbt.CompoundTag;
+import net.minecraft.client.entity.ClientSkinVariantList;
+import net.minecraft.client.gui.toasts.GuiHudToasts;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.world.save.*;
+import net.minecraft.core.world.type.WorldType;
+import net.minecraft.core.world.type.WorldTypeGroups;
 import org.lwjgl.LWJGLException;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.Display;
-
-import com.mojang.nbt.CompoundTag;
-
-import net.minecraft.client.achievement.stat.StatStringFormatKeyInv;
 import net.minecraft.client.discord.RichPresenceHandlerThread;
-import net.minecraft.client.entity.ClientSkinVariantList;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
-import net.minecraft.client.entity.player.EntityPlayerSP;
-import net.minecraft.client.gui.GuiAchievement;
+import net.minecraft.client.entity.player.LocalPlayer;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
 import net.minecraft.client.gui.GuiBadJavaArch;
 import net.minecraft.client.gui.GuiChat;
 import net.minecraft.client.gui.GuiConflictWarning;
 import net.minecraft.client.gui.GuiConnecting;
-import net.minecraft.client.gui.GuiContainer;
 import net.minecraft.client.gui.GuiCreateWorld;
 import net.minecraft.client.gui.GuiException;
 import net.minecraft.client.gui.GuiGameOver;
@@ -53,10 +50,8 @@ import net.minecraft.client.input.MouseInput;
 import net.minecraft.client.input.PlayerInput;
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.client.input.controller.Joystick;
-import net.minecraft.client.net.handler.NetClientHandler;
-import net.minecraft.client.net.thread.ThreadCheckHasPaid;
+import net.minecraft.client.net.handler.ClientPacketHandler;
 import net.minecraft.client.net.thread.ThreadDownloadResources;
-import net.minecraft.client.net.thread.ThreadSleepForeverClient;
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.option.KeyBinding;
 import net.minecraft.client.option.enums.LightmapStyle;
@@ -81,41 +76,37 @@ import net.minecraft.client.render.camera.EntityCameraFirstPerson;
 import net.minecraft.client.render.camera.ICamera;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.model.ModelBiped;
 import net.minecraft.client.render.shader.Shaders;
 import net.minecraft.client.render.shader.ShadersRenderer;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.client.render.window.GameWindow;
 import net.minecraft.client.render.window.GameWindowLWJGL2;
-import net.minecraft.client.sound.SoundManager;
+import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.client.util.debug.Debug;
 import net.minecraft.client.util.debug.DebugRender;
 import net.minecraft.client.util.helper.ScreenshotHelper;
 import net.minecraft.client.util.helper.Textures;
 import net.minecraft.client.world.chunk.provider.ChunkProviderStatic;
 import net.minecraft.core.Global;
-import net.minecraft.core.HitResult;
 import net.minecraft.core.MinecraftAccessor;
 import net.minecraft.core.MinecraftError;
 import net.minecraft.core.MinecraftException;
 import net.minecraft.core.Timer;
 import net.minecraft.core.UnexpectedThrowable;
-import net.minecraft.core.achievement.AchievementList;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.achievement.stat.StatsCounter;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
-import net.minecraft.core.crafting.legacy.CraftingManager;
+import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.DataLoader;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.entity.SkinVariantList;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumOS;
-import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.PlayerProfile;
 import net.minecraft.core.net.command.ClientCommandHandler;
@@ -130,7 +121,8 @@ import net.minecraft.core.util.helper.ScreenShot;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Time;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.PortalHandler;
 import net.minecraft.core.world.World;
@@ -139,13 +131,30 @@ import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
-import net.minecraft.core.world.save.ISaveConverter;
-import net.minecraft.core.world.save.ISaveFormat;
-import net.minecraft.core.world.save.LevelData;
-import net.minecraft.core.world.save.LevelStorage;
-import net.minecraft.core.world.save.SaveConverters;
-import net.minecraft.core.world.save.SaveFormats;
 import net.minecraft.core.world.save.mcregion.SaveFormat19134;
+import org.lwjgl.opengl.GL11;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import static net.minecraft.core.Global.CURRENT_SAVE_VERSION;
+import static org.lwjgl.opengl.GL11.GL_ALPHA_TEST;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
+import static org.lwjgl.opengl.GL11.glAlphaFunc;
+import static org.lwjgl.opengl.GL11.glClear;
+import static org.lwjgl.opengl.GL11.glClearColor;
+import static org.lwjgl.opengl.GL11.glClearDepth;
+import static org.lwjgl.opengl.GL11.glColor4f;
+import static org.lwjgl.opengl.GL11.glCullFace;
+import static org.lwjgl.opengl.GL11.glDepthFunc;
+import static org.lwjgl.opengl.GL11.glDisable;
+import static org.lwjgl.opengl.GL11.glEnable;
+import static org.lwjgl.opengl.GL11.glLoadIdentity;
+import static org.lwjgl.opengl.GL11.glMatrixMode;
+import static org.lwjgl.opengl.GL11.glOrtho;
+import static org.lwjgl.opengl.GL11.glShadeModel;
+import static org.lwjgl.opengl.GL11.glTranslatef;
+import static org.lwjgl.opengl.GL11.glViewport;
 
 // Referenced classes of package net.minecraft.client:
 //            MinecraftApplet
@@ -163,7 +172,7 @@ public class Minecraft
     private final Timer timer;
     public World theWorld;
     public RenderGlobal renderGlobal;
-    public EntityPlayerSP thePlayer;
+    public LocalPlayer thePlayer;
     public ICamera activeCamera;
     public EffectRenderer effectRenderer;
     public Session session;
@@ -183,13 +192,12 @@ public class Minecraft
     public WorldRenderer worldRenderer;
     public ThreadDownloadResources downloadResourcesThread;
     private int ticksRan;
-    public GuiAchievement guiAchievement;
+    public GuiHudToasts guiAchievementToast;
     public GuiIngame ingameGUI;
     public boolean skipRenderWorld;
-    public ModelBiped field_9242_w;
     public HitResult objectMouseOver;
     public GameSettings gameSettings;
-    public SoundManager sndManager;
+    public SoundEngine sndManager;
     public TexturePackList texturePackList;
     private File mcDataDir;
     private ISaveFormat saveFormat;
@@ -239,18 +247,17 @@ public class Minecraft
         Global.accessor = this;
         LogPrintStream.setup();
         hasCrashed = false;
-        timer = new Timer(20F);
+        timer = new Timer(Global.TICKS_PER_SECOND);
         session = null;
         hideQuitButton = false;
         isGamePaused = false;
         currentScreen = null;
         loadingScreen = new LoadingScreenRenderer(this);
         ticksRan = 0;
-        guiAchievement = new GuiAchievement(this);
+        guiAchievementToast = new GuiHudToasts(this);
         skipRenderWorld = false;
-        field_9242_w = new ModelBiped(0.0F);
         objectMouseOver = null;
-        sndManager = new SoundManager();
+        sndManager = new SoundEngine();
         running = true;
         debug = "";
         isTakingScreenshot = false;
@@ -259,7 +266,22 @@ public class Minecraft
         isRaining = false;
         systemTime = System.currentTimeMillis();
         joinPlayerCounter = 0;
-        new ThreadSleepForeverClient(this, "Timer hack thread");
+        new Thread("Timer hack thread") {
+            {
+                this.setDaemon(true);
+                this.start();
+            }
+
+            @Override
+            public void run() {
+                while (Minecraft.this.running) {
+                    try {
+                        Thread.sleep(2147483647L);
+                    }
+                    catch (final InterruptedException ex) {}
+                }
+            }
+        };
         INSTANCE = this;
     }
 
@@ -338,8 +360,10 @@ public class Minecraft
 		mcDataDir = getMinecraftDir();
 
         // Manually initialize blocks and items
-        Block.initializeBlocks();
-        Item.initializeItems();
+        Blocks.init();
+        Items.init();
+
+        Dimension.init();
 
 		gameSettings = new GameSettings(this, mcDataDir);
 
@@ -396,20 +420,9 @@ public class Minecraft
         ItemModelDispatcher.getInstance();
 
         EntityRenderDispatcher.instance.itemRenderer = new ItemRenderer(this);
-        statsCounter = new StatsCounter(session, mcDataDir);
-        AchievementList.OPEN_INVENTORY.setStatStringFormatter(new StatStringFormatKeyInv(this));
-        AchievementList.OPEN_GUIDEBOOK.setStatStringFormatter(s -> {
-            if(!gameSettings.keyGuidebook.isBound()) {
-                return "Set your guidebook keybind in the controls menu!";
-            }
-            return String.format(s, gameSettings.keyGuidebook.getKeyName());
-        });
-
         loadScreen();	// Update loading screen so it doesn't say no response
-        
-        StatList.init();
 
-        System.out.println("Initizalizing input");
+        System.out.println("Initializing input");
         try {
             InputHandler.init(this);
 
@@ -423,19 +436,19 @@ public class Minecraft
         System.out.println("Setting up OpenGL values...");
         
         OpenGLHelper.checkError("pre startup");
-        glEnable(3553 /*GL_TEXTURE_2D*/);
-        glShadeModel(7425 /*GL_SMOOTH*/);
+        glEnable(GL11.GL_TEXTURE_2D);
+        glShadeModel(GL11.GL_SMOOTH);
         glClearDepth(1.0D);
-        glEnable(2929 /*GL_DEPTH_TEST*/);
+        glEnable(GL11.GL_DEPTH_TEST);
         glDepthFunc(515);
-        glEnable(3008 /*GL_ALPHA_TEST*/);
+        glEnable(GL11.GL_ALPHA_TEST);
         glAlphaFunc(516, 0.1F);
-        glCullFace(1029 /*GL_BACK*/);
-        glMatrixMode(5889 /*GL_PROJECTION*/);
+        glCullFace(GL11.GL_BACK);
+        glMatrixMode(GL11.GL_PROJECTION);
         glLoadIdentity();
-        glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
+        glMatrixMode(GL11.GL_MODELVIEW);
         OpenGLHelper.checkError("startup");
-        sndManager.loadSoundSettings(gameSettings);
+        sndManager.init(gameSettings);
         
         loadScreen();	// Update loading screen so it doesn't say no response
         
@@ -447,7 +460,7 @@ public class Minecraft
         
         System.out.println("Initializing Renderer...");
         
-        TextureRegistry.blockAtlas.bindTexture();
+        TextureRegistry.blockAtlas.bind();
         renderGlobal = new RenderGlobal(this, renderEngine);
         glViewport(0, 0, resolution.width, resolution.height);
         effectRenderer = new EffectRenderer(theWorld, renderEngine);
@@ -469,7 +482,6 @@ public class Minecraft
         DataLoader.loadRecipesFromFile("/recipes/furnace.json");
         DataLoader.loadRecipesFromFile("/recipes/trommel.json");
         DataLoader.loadRecipesFromFile("/recipes/workbench.json");
-        CraftingManager.getInstance().init();
 
         DataLoader.loadDataPacks(this);
 
@@ -482,6 +494,21 @@ public class Minecraft
         System.out.printf("%d item groups.%n",itemGroups);
         System.out.printf("%d recipes in %d groups in %d namespaces.%n",recipes,groups,namespaces);
 
+        StatList.init();
+        statsCounter = new StatsCounter(session, mcDataDir);
+        Achievements.OPEN_INVENTORY.setDescriptionFormatter(s -> {
+            if(!gameSettings.keyInventory.isBound()) {
+                return "Set your inventory keybind in the controls menu!";
+            }
+            return String.format(s, gameSettings.keyInventory.getKeyName());
+        });
+        Achievements.OPEN_GUIDEBOOK.setDescriptionFormatter(s -> {
+            if(!gameSettings.keyGuidebook.isBound()) {
+                return "Set your guidebook keybind in the controls menu!";
+            }
+            return String.format(s, gameSettings.keyGuidebook.getKeyName());
+        });
+
         loadScreen();	// Update loading screen so it doesn't say no response
         
         // Enable Discord Rich Presence
@@ -551,23 +578,23 @@ public class Minecraft
     {
         System.out.println("Drawing Loading Screen...");
         glClear(16640);
-        glMatrixMode(5889 /*GL_PROJECTION*/);
+        glMatrixMode(GL11.GL_PROJECTION);
         glLoadIdentity();
         glOrtho(0.0D, resolution.scaledWidthExact, resolution.scaledHeightExact, 0.0D, 1000D, 3000D);
-        glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
+        glMatrixMode(GL11.GL_MODELVIEW);
         glLoadIdentity();
         glTranslatef(0.0F, 0.0F, -2000F);
         glViewport(0, 0, resolution.width, resolution.height);
         glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
         Tessellator tessellator = Tessellator.instance;
-        glDisable(2896 /*GL_LIGHTING*/);
-        glEnable(3553 /*GL_TEXTURE_2D*/);
-        glDisable(2912 /*GL_FOG*/);
+        glDisable(GL11.GL_LIGHTING);
+        glEnable(GL11.GL_TEXTURE_2D);
+        glDisable(GL11.GL_FOG);
         
         if(mojrand == 0)
-            glBindTexture(3553 /*GL_TEXTURE_2D*/, renderEngine.getTexture("/title/majonk.png"));
+            renderEngine.loadTexture("/assets/minecraft/textures/gui/title/majonk.png").bind();
         else
-            glBindTexture(3553 /*GL_TEXTURE_2D*/, renderEngine.getTexture("/title/mojang.png"));
+            renderEngine.loadTexture("/title/mojang.png").bind();
         
         tessellator.startDrawingQuads();
         tessellator.setColorOpaque_I(0xffffff);
@@ -584,9 +611,9 @@ public class Minecraft
         
         drawMojangLogoVertices((resolution.scaledWidth - width) / 2, (resolution.scaledHeight - height) / 2, 0, 0, width, height);
         
-        glDisable(2896 /*GL_LIGHTING*/);
-        glDisable(2912 /*GL_FOG*/);
-        glEnable(3008 /*GL_ALPHA_TEST*/);
+        glDisable(GL11.GL_LIGHTING);
+        glDisable(GL11.GL_FOG);
+        glEnable(GL11.GL_ALPHA_TEST);
         glAlphaFunc(516, 0.1F);
         Display.swapBuffers();
     }
@@ -711,10 +738,10 @@ public class Minecraft
         }
         if(guiscreen instanceof GuiMainMenu)
         {
-            statsCounter.func_27175_b();
+            statsCounter.fetchStats();
         }
         if(statsCounter != null){
-            statsCounter.syncStats();
+            statsCounter.saveStats();
         }
         if(guiscreen == null && theWorld == null)
         {
@@ -751,8 +778,8 @@ public class Minecraft
 				e.printStackTrace();
 			}
 			if(statsCounter != null) {
-				statsCounter.func_27175_b();
-				statsCounter.syncStats();
+                statsCounter.fetchStats();
+				statsCounter.saveStats();
 			}
 			System.out.println("Stopping!");
 			try {
@@ -764,7 +791,7 @@ public class Minecraft
 			}catch (Throwable ignored) {
 			}
 			if(sndManager != null) {
-				sndManager.closeMinecraft();	
+				sndManager.destroy();
 			}
 			Mouse.destroy();
 			Keyboard.destroy();
@@ -809,7 +836,7 @@ public class Minecraft
 					long tickStartTime = System.currentTimeMillis();
                     Time.tick();
                     AABB.initializePool();
-                    Vec3d.initializePool();
+                    Vec3.initializePool();
                     
                     if(Display.isCloseRequested()) shutdown();
                     if(isGamePaused && theWorld != null && !(currentScreen instanceof GuiModelViewer))
@@ -854,9 +881,9 @@ public class Minecraft
 
                     OpenGLHelper.checkError("pre render");
                     RenderBlocks.fancyGrass = gameSettings.fancyGraphics.value == 1;
-                    EntityItem.enableItemClumping = gameSettings.enableItemClumping.value;
-                    BlockLeavesBase.enableTreeShadowing = gameSettings.treeShadows.value;
-                    sndManager.updateListenerPosition(thePlayer, timer.partialTicks);
+                    ItemEntity.enableItemClumping = gameSettings.enableItemClumping.value;
+                    BaseLeavesBlock.enableTreeShadowing = gameSettings.treeShadows.value;
+                    sndManager.updateListener(thePlayer, timer.partialTicks);
                     glEnable(GL_TEXTURE_2D);
                     if(theWorld != null)
                     {
@@ -902,7 +929,7 @@ public class Minecraft
                         }
                     }
                     sndManager.setMuted(gameSettings.muteOnLostFocus.value && !Display.isActive());
-                    guiAchievement.updateAchievementWindow();
+                    guiAchievementToast.render(timer.partialTicks);
 
                     Debug.change("post");  // 3
                     renderer.endRenderGame(timer.partialTicks);
@@ -920,9 +947,9 @@ public class Minecraft
                     isGamePaused = !isMultiplayerWorld() && currentScreen != null && currentScreen.pausesGame();
                     while(System.currentTimeMillis() >= currentTime + 1000L)
                     {
-                        debug = fpsCounter + " fps, " + ChunkRenderer.chunksUpdated + " chunk updates";
+                        debug = fpsCounter + " fps, " + ChunkRenderer.updates + " chunk updates";
                         debugFPS = fpsCounter + " fps";
-                        ChunkRenderer.chunksUpdated = 0;
+                        ChunkRenderer.updates = 0;
                         currentTime += 1000L;
                         fpsCounter = 0;
                     }
@@ -979,7 +1006,7 @@ public class Minecraft
         {
             System.gc();
             AABB.deinitializePool();
-            Vec3d.deinitializePool();
+            Vec3.deinitializePool();
         }
         catch(Throwable ignored) { }
         try
@@ -1073,13 +1100,13 @@ public class Minecraft
             int blockZ = objectMouseOver.z;
             Side side = objectMouseOver.side;
             double xPlaced;
-			double yPlaced = objectMouseOver.location.yCoord - objectMouseOver.y;
+			double yPlaced = objectMouseOver.location.y - objectMouseOver.y;
 			if(side.getAxis() == Axis.X) {
-				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+				xPlaced = objectMouseOver.location.x - objectMouseOver.x;
 			}else if(side.getAxis() == Axis.Z) {
-				xPlaced = objectMouseOver.location.zCoord - objectMouseOver.z;
+				xPlaced = objectMouseOver.location.z - objectMouseOver.z;
 			}else {
-				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+				xPlaced = objectMouseOver.location.x - objectMouseOver.x;
 			}
             playerController.continueDestroyBlock(blockX, blockY, blockZ, objectMouseOver.side, xPlaced, yPlaced);
         }
@@ -1096,7 +1123,52 @@ public class Minecraft
         boolean flag = true;
         if(objectMouseOver == null)
         {
-            
+            bridge: if (gameSettings.easyBridge.value){
+                if (clickType == 1) {
+                    if (thePlayer.xRot < 45) {break bridge;}
+                    List<AABB> cubes = thePlayer.world.getCubes(thePlayer, thePlayer.bb.cloneMove(0, -1.0, 0.0));
+                    if (cubes.size() < 1){break bridge;}
+                    AABB cube = cubes.get(0);
+                    if (cube == null){break bridge;}
+                    int blockX = MathHelper.floor(thePlayer.x);
+                    int blockY = MathHelper.floor(thePlayer.y - thePlayer.heightOffset - 0.25);
+                    int blockZ = MathHelper.floor(thePlayer.z);
+                    Direction playerDirection = Direction.getHorizontalDirection(thePlayer);
+                    Side side;
+                    switch (playerDirection){
+                        case NORTH:
+                            side = Side.NORTH;
+                            break;
+                        case SOUTH:
+                            side = Side.SOUTH;
+                            break;
+                        case WEST:
+                            side = Side.WEST;
+                            break;
+                        case EAST:
+                            side = Side.EAST;
+                            break;
+                        default:
+                            break bridge;
+                    }
+
+                    double yPlaced = 0.5d;
+                    double xPlaced = 0.5d;
+                    ItemStack stack = this.thePlayer.inventory.getCurrentItem();
+                    int numItemsInStack = stack == null ? 0 : stack.stackSize;
+                    if (this.playerController.useItemOn(thePlayer, theWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced)) {
+                        this.playerController.swingItem(true);
+                    }
+                    if (stack == null) {
+                        break bridge;
+                    }
+                    if (stack.stackSize <= 0) {
+                        this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null;
+                    } else if (stack.stackSize != numItemsInStack) {
+                        worldRenderer.itemRenderer.updateEquippedItem();
+                    }
+                }
+            }
             if(clickType == 0 && attack)
             {
                 playerController.swingItem(true);
@@ -1123,13 +1195,13 @@ public class Minecraft
             int blockZ = objectMouseOver.z;
             Side side = objectMouseOver.side;
             double xPlaced;
-			double yPlaced = objectMouseOver.location.yCoord - objectMouseOver.y;
+			double yPlaced = objectMouseOver.location.y - objectMouseOver.y;
 			if(side.getAxis() == Axis.X) {
-				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+				xPlaced = objectMouseOver.location.x - objectMouseOver.x;
 			}else if(side.getAxis() == Axis.Z) {
-				xPlaced = objectMouseOver.location.zCoord - objectMouseOver.z;
+				xPlaced = objectMouseOver.location.z - objectMouseOver.z;
 			}else {
-				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+				xPlaced = objectMouseOver.location.x - objectMouseOver.x;
 			}
 
             if(clickType == 0)
@@ -1191,7 +1263,22 @@ public class Minecraft
 
     private void startCheckPaidThread()
     {
-        (new ThreadCheckHasPaid(this)).start();
+        new Thread(() -> {
+            try
+            {
+                HttpURLConnection httpurlconnection = (HttpURLConnection)(new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + session.username + "&session=" + session.sessionId)).openConnection();
+                httpurlconnection.connect();
+                if(httpurlconnection.getResponseCode() == 400)
+                {
+                    Minecraft.hasPaidCheckTime = System.currentTimeMillis();
+                }
+                httpurlconnection.disconnect();
+            }
+            catch(Exception exception)
+            {
+                exception.printStackTrace();
+            }
+        }).start();
     }
 
     public void runTick()
@@ -1201,7 +1288,7 @@ public class Minecraft
             startCheckPaidThread();
         }
         Debug.push("gui");
-        statsCounter.func_27178_d();
+        statsCounter.tick();
         ingameGUI.updateTick();
         Debug.change("misc");
         worldRenderer.getMouseOver(1.0F);
@@ -1221,11 +1308,8 @@ public class Minecraft
             playerController.tick();
         }
         Debug.change("textureTick");
-        TextureRegistry.blockAtlas.bindTexture();
-        if(!isGamePaused)
-        {
-            renderEngine.updateDynamicTextures();
-        }
+        TextureRegistry.blockAtlas.bind();
+        renderEngine.updateDynamicTextures(isGamePaused);
         Debug.change("misc");
         if(currentScreen == null && thePlayer != null)
         {
@@ -1399,7 +1483,7 @@ public class Minecraft
                             }
                             else if (gameSettings.keyFullbright.isPressEvent())
                             {
-                                NetClientHandler queue = getSendQueue();
+                                ClientPacketHandler queue = getSendQueue();
 
                                 if (queue != null)
                                 {
@@ -1494,8 +1578,8 @@ public class Minecraft
                 }
             }
 
-            boolean breakBlockPressed = gameSettings.keyAttack.isPressed() || (controllerInput != null && controllerInput.buttonZR.isPressed());
-            boolean placeBlockPressed = gameSettings.keyInteract.isPressed() || (controllerInput != null && controllerInput.buttonZL.isPressed());
+            boolean breakBlockPressed = gameSettings.keyAttack.isPressed() || (controllerInput != null && controllerInput.buttonRightTrigger.isPressed());
+            boolean placeBlockPressed = gameSettings.keyInteract.isPressed() || (controllerInput != null && controllerInput.buttonLeftTrigger.isPressed());
 
             if(currentScreen == null)
             {
@@ -1504,6 +1588,7 @@ public class Minecraft
             }
             mineBlocks(0, currentScreen == null && breakBlockPressed && inGameHasFocus);
         }
+        InputHandler.poll();
         if (this.controllerInput != null)
         {
             handleControllerInput();
@@ -1556,7 +1641,7 @@ public class Minecraft
             if(!isGamePaused && theWorld != null)
             {
                 Debug.change("randomDisplayTick");
-                theWorld.randomDisplayUpdates(MathHelper.floor_double(thePlayer.x), MathHelper.floor_double(thePlayer.y), MathHelper.floor_double(thePlayer.z));
+                theWorld.randomDisplayUpdates(MathHelper.floor(thePlayer.x), MathHelper.floor(thePlayer.y), MathHelper.floor(thePlayer.z));
                 Debug.change("misc");
             }
             if(!isGamePaused)
@@ -1640,7 +1725,7 @@ public class Minecraft
 
         // Display Guidebook
         if (gameSettings.keyGuidebook.isPressEvent(currentInputDevice)) {
-            thePlayer.triggerAchievement(AchievementList.OPEN_GUIDEBOOK);
+            thePlayer.triggerAchievement(Achievements.OPEN_GUIDEBOOK);
             thePlayer.displayGUIGuidebook();
             return true;
         }
@@ -1808,7 +1893,6 @@ public class Minecraft
             controllerInput.update();
         }catch (Exception e) {
             e.printStackTrace();
-            InputHandler.controllers.remove(controllerInput);
             controllerInput = null;
             setInputType(InputType.KEYBOARD);
             return;
@@ -1824,11 +1908,11 @@ public class Minecraft
         ControllerInput controller = this.controllerInput;
 
         if(currentScreen == null) {
-            if(controller.buttonZR.pressedThisFrame()) {
+            if(controller.buttonRightTrigger.pressedThisFrame()) {
                 clickMouse(0, true, false);
                 mouseTicksRan = ticksRan;
             }
-            if(controller.buttonZL.pressedThisFrame()) {
+            if(controller.buttonLeftTrigger.pressedThisFrame()) {
                 clickMouse(1, true, false);
                 mouseTicksRan = ticksRan;
             }
@@ -1838,10 +1922,10 @@ public class Minecraft
             if(controller.buttonY.pressedThisFrame() || controller.buttonX.pressedThisFrame()) {
                 displayGuiScreen(getGuiInventory());
             }
-            if(controller.buttonMinus.pressedThisFrame()) {
+            if(controller.buttonBack.pressedThisFrame()) {
                 gameSettings.showPlayerList.value = !gameSettings.showPlayerList.value;
             }
-            if(controller.buttonPlus.pressedThisFrame()) {
+            if(controller.buttonStart.pressedThisFrame()) {
                 displayGuiScreen(new GuiIngameMenu());
             }
             if(controller.digitalPad.up.pressedThisFrame()) {
@@ -1857,10 +1941,10 @@ public class Minecraft
             if(controller.digitalPad.left.pressedThisFrame() && thePlayer.getGamemode().canPlayerFly()) {
                 thePlayer.setNoclip(!thePlayer.noPhysics);
             }
-            if(controller.buttonL.pressedThisFrame()) {
+            if(controller.buttonLeftShoulder.pressedThisFrame()) {
                 thePlayer.inventory.changeCurrentItem(1);
             }
-            if(controller.buttonR.pressedThisFrame()) {
+            if(controller.buttonRightShoulder.pressedThisFrame()) {
                 thePlayer.inventory.changeCurrentItem(-1);
             }
             if(controller.joyLeft.getButton().pressedThisFrame()) {
@@ -1875,7 +1959,7 @@ public class Minecraft
             if(controller.buttonB.pressedThisFrame()) {
                 currentScreen.keyTyped((char)0, Keyboard.KEY_BACK, -1, -1);
             }
-            if(controller.buttonPlus.pressedThisFrame()) {
+            if(controller.buttonStart.pressedThisFrame()) {
                 currentScreen.keyTyped((char)0, Keyboard.KEY_ESCAPE, -1, -1);
             }
             if(controller.buttonA.pressedThisFrame()) {
@@ -1905,15 +1989,17 @@ public class Minecraft
 
     private void forceReload()
     {
+        long start = System.nanoTime();
         System.out.println("FORCING RELOAD!");
-        sndManager = new SoundManager();
-        sndManager.loadSoundSettings(gameSettings);
+        sndManager = new SoundEngine();
+        sndManager.init(gameSettings);
         downloadResourcesThread.reloadResources();
         renderEngine.refreshTexturesAndDisplayErrors();
         renderer.reload();
         if (renderGlobal != null){
             renderGlobal.loadRenderers();
         }
+        System.out.println("RELOAD TOOK '" + (System.nanoTime() - start)/ 1_000_000_000d + "' SECONDS!");
     }
 
     public boolean isMultiplayerWorld()
@@ -1922,6 +2008,11 @@ public class Minecraft
     }
 
     public void startWorld(String worldDirName, String worldName, long seed)
+    {
+        startWorld(worldDirName, worldName, seed, null);
+    }
+
+    public void startWorld(String worldDirName, String worldName, long seed, WorldTypeGroups.Group worldTypeGroup)
     {
         changeWorld(null);
         System.gc();
@@ -1946,16 +2037,30 @@ public class Minecraft
         {
             I18n i18n = I18n.getInstance();
             LevelStorage saveHandler = saveFormat.getSaveHandler(worldDirName, false);
+            if (worldTypeGroup != null) {
+                for (Dimension dimension : Dimension.getDimensionList().values()) {
+                    WorldType worldType = worldTypeGroup.get(dimension);
+                    if (worldType != null) {
+                        DimensionData data = saveHandler.getDimensionData(dimension.id);
+                        if (data == null) {
+                            data = new DimensionData(worldType);
+                        } else {
+                            data.setWorldType(worldType);
+                        }
+                        saveHandler.saveDimensionData(dimension.id, data);
+                    }
+                }
+            }
             World world = new World(saveHandler, worldName, seed, null, null);
             if(world.isNewWorld)
             {
-                statsCounter.addValueToStat(StatList.createWorldStat, 1);
-                statsCounter.addValueToStat(StatList.startGameStat, 1);
+                statsCounter.add(StatList.createWorldStat, 1);
+                statsCounter.add(StatList.startGameStat, 1);
                 changeWorld(world, i18n.translateKey("gui.loading.label.generating"));
             } else
             {
-                statsCounter.addValueToStat(StatList.loadWorldStat, 1);
-                statsCounter.addValueToStat(StatList.startGameStat, 1);
+                statsCounter.add(StatList.loadWorldStat, 1);
+                statsCounter.add(StatList.startGameStat, 1);
                 changeWorld(world, i18n.translateKey("gui.loading.label.loading"));
             }
         }
@@ -2011,14 +2116,14 @@ public class Minecraft
         changeWorld(world, loadingTitle, null);
     }
 
-    public void changeWorld(World world, String loadingTitle, EntityPlayer player)
+    public void changeWorld(World world, String loadingTitle, Player player)
     {
     	mainMenuBackground.deleteTextures();
     	gameSettings.showCollisionBoxes.value = false;
     	
         fullbright = false;
-        statsCounter.func_27175_b();
-        statsCounter.syncStats();
+        statsCounter.fetchStats();
+        statsCounter.saveStats();
 
         if (world != null)
         {
@@ -2037,12 +2142,12 @@ public class Minecraft
         theWorld = world;
         if(world != null)
         {
-            playerController.initLevel(world);
+            playerController.initWorld(world);
             if(!isMultiplayerWorld())
             {
                 if(player == null)
                 {
-                    thePlayer = (EntityPlayerSP)world.func_4085_a(EntityPlayerSP.class);
+                    thePlayer = (LocalPlayer)world.findSubclassOf(LocalPlayer.class);
                 }
             }
             else if(thePlayer != null)
@@ -2055,11 +2160,11 @@ public class Minecraft
             }
             if(!world.isClientSide)
             {
-                func_6255_d(loadingTitle);
+                prepareLevel(loadingTitle);
             }
             if(thePlayer == null)
             {
-                thePlayer = (EntityPlayerSP)playerController.createPlayer(world);
+                thePlayer = (LocalPlayer)playerController.createPlayer(world);
                 thePlayer.resetPos();
                 playerController.initPlayer(thePlayer);
             }
@@ -2149,7 +2254,7 @@ public class Minecraft
         }
     }
 
-    private void func_6255_d(String loadingTitle)
+    private void prepareLevel(String loadingTitle)
     {
         loadingScreen.updateLoadingBackground(theWorld.dimension);
         loadingScreen.progressStartNoAbort(loadingTitle);
@@ -2236,7 +2341,7 @@ public class Minecraft
 
     public void respawn(boolean flag, int i)
     {
-    	EntityPlayer previousPlayer = thePlayer;
+    	Player previousPlayer = thePlayer;
         if(!theWorld.isClientSide && !theWorld.dimension.defaultWorldType.mayRespawn())
         {
             usePortal(i);
@@ -2252,7 +2357,7 @@ public class Minecraft
             lastDeathCoordinates = thePlayer.getLastDeathCoordinate();
             if(spawnCoordinates != null)
             {
-                bedSpawnCoordinates = EntityPlayer.getValidBedSpawnCoordinates(theWorld, spawnCoordinates);
+                bedSpawnCoordinates = Player.getValidBedSpawnCoordinates(theWorld, spawnCoordinates);
                 if(bedSpawnCoordinates == null)
                 {
                     thePlayer.sendTranslatedChatMessage("bed.notValid");
@@ -2280,7 +2385,7 @@ public class Minecraft
             theWorld.setEntityDead(thePlayer);
             playerGamemode = thePlayer.getGamemode();
         }
-        thePlayer = (EntityPlayerSP)playerController.createPlayer(theWorld);
+        thePlayer = (LocalPlayer)playerController.createPlayer(theWorld);
         thePlayer.dimension = i;
         thePlayer.setGamemode(playerGamemode);
         thePlayer.messageHistory = previousPlayer.messageHistory;
@@ -2305,18 +2410,18 @@ public class Minecraft
         thePlayer.id = j;
         thePlayer.func_6420_o();
         playerController.adjustPlayer(thePlayer);
-        func_6255_d("Respawning");
+        prepareLevel("Respawning");
         if(currentScreen instanceof GuiGameOver)
         {
             displayGuiScreen(null);
         }
     }
 
-    public NetClientHandler getSendQueue()
+    public ClientPacketHandler getSendQueue()
     {
-        if(thePlayer instanceof EntityClientPlayerMP)
+        if(thePlayer instanceof MultiplayerLocalPlayer)
         {
-            return ((EntityClientPlayerMP)thePlayer).sendQueue;
+            return ((MultiplayerLocalPlayer)thePlayer).sendQueue;
         } else
         {
             return null;
diff --git a/src/main/java/net/minecraft/client/achievement/stat/StatStringFormatKeyInv.java b/src/main/java/net/minecraft/client/achievement/stat/StatStringFormatKeyInv.java
deleted file mode 100644
index 2ca070502..000000000
--- a/src/main/java/net/minecraft/client/achievement/stat/StatStringFormatKeyInv.java
+++ /dev/null
@@ -1,32 +0,0 @@
-
-package net.minecraft.client.achievement.stat;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.core.achievement.stat.IStatStringFormat;
-
-// Referenced classes of package net.minecraft.src:
-//            IStatStringFormat, GameSettings, KeyBinding
-
-public class StatStringFormatKeyInv
-    implements IStatStringFormat
-{
-
-    public StatStringFormatKeyInv(Minecraft minecraft)
-    {
-//        super();
-        mc = minecraft;
-    }
-
-    @Override
-	public String formatString(String s)
-    {
-    	if(!mc.gameSettings.keyInventory.isBound()) {
-    		return "Set your inventory keybind in the controls menu!";
-    	}
-        return String.format(s, new Object[] {
-        		mc.gameSettings.keyInventory.getKeyName()
-        });
-    }
-
-    final Minecraft mc; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
index 16e748cea..89fc87b6b 100644
--- a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
+++ b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
@@ -11,12 +11,13 @@ import de.jcm.discordgamesdk.CreateParams;
 import de.jcm.discordgamesdk.GameSDKException;
 import de.jcm.discordgamesdk.activity.Activity;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
 import net.minecraft.client.gui.GuiIngameMenu;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 public class RichPresenceHandlerThread extends Thread
 {
@@ -63,13 +64,13 @@ public class RichPresenceHandlerThread extends Thread
     static
     {
         // overworldClear
-        weatherNamesMap.put(Weather.overworldRain, "in the rain");
-        weatherNamesMap.put(Weather.overworldSnow, "in the snow");
-        weatherNamesMap.put(Weather.overworldStorm, "in a storm");
-        weatherNamesMap.put(Weather.overworldFog, "in thick fog");
+        weatherNamesMap.put(Weathers.OVERWORLD_RAIN, "in the rain");
+        weatherNamesMap.put(Weathers.OVERWORLD_SNOW, "in the snow");
+        weatherNamesMap.put(Weathers.OVERWORLD_STORM, "in a storm");
+        weatherNamesMap.put(Weathers.OVERWORLD_FOG, "in thick fog");
         // overworldHellClear
         // overworldWoodsClear
-        weatherNamesMap.put(Weather.overworldWinterSnow, "in an endless snowstorm");
+        weatherNamesMap.put(Weathers.OVERWORLD_WINTER_SNOW, "in an endless snowstorm");
         // overworldRainBlood
     }
 
@@ -158,10 +159,10 @@ public class RichPresenceHandlerThread extends Thread
         }
         else if (minecraft.theWorld != null && minecraft.thePlayer != null)
         {
-            if (minecraft.thePlayer instanceof EntityClientPlayerMP)
+            if (minecraft.thePlayer instanceof MultiplayerLocalPlayer)
             {
                 activity.setDetails("Multiplayer");
-                int playerCount = ((EntityClientPlayerMP) minecraft.thePlayer).sendQueue.players.size();
+                int playerCount = ((MultiplayerLocalPlayer) minecraft.thePlayer).sendQueue.players.size();
                 activity.party().size().setCurrentSize(playerCount);
                 activity.party().size().setMaxSize(100);
             }
diff --git a/src/main/java/net/minecraft/client/entity/ClientSkinVariantList.java b/src/main/java/net/minecraft/client/entity/ClientSkinVariantList.java
index 272696398..3c51810b2 100644
--- a/src/main/java/net/minecraft/client/entity/ClientSkinVariantList.java
+++ b/src/main/java/net/minecraft/client/entity/ClientSkinVariantList.java
@@ -1,77 +1,171 @@
 package net.minecraft.client.entity;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.b100.json.element.JsonEntry;
-import com.b100.json.element.JsonObject;
-
+import com.b100.utils.StringUtils;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.texturepack.TexturePack;
-import net.minecraft.client.render.texturepack.TexturePackException;
-import net.minecraft.client.util.helper.TexturePackJsonHelper;
-import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.SkinVariantList;
+import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ClientSkinVariantList extends SkinVariantList {
+	public static final int MAX_VARIANT_ID = 0xFF;
 
 	private final Minecraft mc;
 
-	private final Map<String, Integer> entitySkinCounts = new HashMap<>();
+	private final Map<String, @Nullable EntityVariants> variantProcessorMap = new HashMap<>();
 
 	public ClientSkinVariantList(Minecraft minecraft) {
 		this.mc = minecraft;
 	}
 
-	@Override
-	public int getNumSkinsForEntity(Class<? extends Entity> entityClass) {
-		Integer count = entitySkinCounts.get(entityClass.getName());
-		
-		return count != null ? count : 1;
-	}
 
 	public void refresh(List<Throwable> errors) {
-		entitySkinCounts.clear();
-		
-		// Load default skin variants first
-		load(mc.texturePackList.getDefaultTexturePack(), errors);
-		
-		// Load custom skin variants
-		if(mc.texturePackList.getHighestPriorityPack() != mc.texturePackList.getDefaultTexturePack() && mc.texturePackList.getHighestPriorityPack().hasFile("/entity/variants.json")) {
-			load(mc.texturePackList.getHighestPriorityPack(), errors);
-		}
+		variantProcessorMap.clear();
 	}
-	
-	public void load(TexturePack texturePack, List<Throwable> errors) {
+
+
+	@Override
+	public @NotNull String getSkinReference(@Nullable String variantJsonPath, @NotNull String defaultKey, int skinIndex) {
 		try {
-			JsonObject rootObject = TexturePackJsonHelper.readJsonObject(texturePack, "/entity/variants.json");
+			if (!Minecraft.getMinecraft(this).gameSettings.mobVariants.value) return defaultKey;
+			if (variantJsonPath == null) return defaultKey;
+			if (!variantProcessorMap.containsKey(variantJsonPath)) {
+				loadJson(variantJsonPath);
+			}
+			EntityVariants var = variantProcessorMap.get(variantJsonPath);
+			if (var != null) {
+				return var.getKeyFromIndex(skinIndex);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return defaultKey;
+	}
+	public void loadJson(String variantJsonPath) {
+		load: try (InputStream stream = mc.texturePackList.getResourceAsStream(variantJsonPath)){
+			if (stream == null) return;
+			String jsonString;
 			try {
-				if(rootObject.has("replace") && rootObject.getBoolean("replace")) {
-					entitySkinCounts.clear();
+				jsonString = StringUtils.readInputString(stream);
+			} catch (Exception e) {
+				e.printStackTrace();
+				break load;
+			}
+            try {
+                JsonObject variantObject = JsonParser.parseString(jsonString).getAsJsonObject();
+				if (variantObject.has("skins")) {
+					JsonElement skins = variantObject.get("skins");
+					if (skins.isJsonPrimitive()) {
+						variantProcessorMap.put(variantJsonPath, new EntityVariants(skins.getAsInt()));
+						return;
+					} else if (skins.isJsonArray()) {
+						List<EntityVariants.VariantEntry> variants = new ArrayList<>();
+						JsonArray arr = skins.getAsJsonArray();
+						for (JsonElement e: arr) {
+							JsonObject entryObj = e.getAsJsonObject();
+							String textureReference = entryObj.get("texture").getAsString();
+							double weight = 1;
+							if (entryObj.has("weight")) {
+								weight = entryObj.get("weight").getAsDouble();
+							}
+							variants.add(new EntityVariants.VariantEntry(textureReference, weight));
+						}
+						variantProcessorMap.put(variantJsonPath, new EntityVariants(variants));
+						return;
+					} else {
+						System.out.println("Error: value 'skins' must either be a integer or an array!");
+						break load;
+					}
+				}
+            } catch (JsonParseException e) { // TODO, replace with proper non-fatal error logging
+                e.printStackTrace();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+			break load;
+        }
+		variantProcessorMap.put(variantJsonPath, null);
+    }
+
+	protected static class EntityVariants {
+
+		private final VariantEntry[] variantEntries;
+		private final int skins;
+
+		public EntityVariants(int skins) {
+			this.skins = skins;
+			this.variantEntries = null;
+		}
+
+		public EntityVariants(List<VariantEntry> entries) {
+			variantEntries = new VariantEntry[MAX_VARIANT_ID + 1];
+			this.skins = -1;
+			double accWeight = 0;
+			entries.sort(Comparator.comparingDouble(o -> -o.weight));
+
+			for (VariantEntry e : entries) {
+//				System.out.println(e.weight);
+				accWeight += e.weight;
+			}
+
+
+			main:
+			{
+				int pointer = 0;
+				for (VariantEntry e : entries) {
+					int amount = MathHelper.floor((e.weight / accWeight) * MAX_VARIANT_ID);
+					if (amount < 1) amount = 1;
+
+					for (int i = 0; i < amount; i++) {
+						variantEntries[pointer] = e;
+						pointer++;
+						if (pointer > variantEntries.length - 1) break main;
+					}
 				}
 
-				JsonObject variants = TexturePackJsonHelper.getObject(rootObject, "variants");
-				
-				for(JsonEntry entry : variants) {
-		            String key = entry.name;
-		            JsonObject value = entry.value.getAsObject();
-		            int numSkins = Math.max(1, value.getInt("numSkins"));
-		            entitySkinCounts.put(key, numSkins);
+				VariantEntry last = entries.get(0);
+				while (pointer < variantEntries.length) {
+					variantEntries[pointer] = last;
+					pointer++;
 				}
-			}catch (Exception e) {
-				throw new TexturePackException("Error in variants.json", e);
 			}
-		}catch (Exception e) {
-			errors.add(e);
-			entitySkinCounts.clear();
+
+
+			Map<String, Integer> counts = new HashMap<>();
+			for (VariantEntry e : variantEntries) {
+				counts.putIfAbsent(e.textureKey, 0);
+				counts.put(e.textureKey, counts.get(e.textureKey) + 1);
+			}
+//			System.out.println(counts);
 		}
-	}
-	
-	public void print() {
-		System.out.println("Skin Variants: ");
-		for(String key : entitySkinCounts.keySet()) {
-			System.out.println("    " + key + " : " + entitySkinCounts.get(key));
+
+		public String getKeyFromIndex(int index) {
+			if (variantEntries != null) {
+				return variantEntries[index].textureKey;
+			}
+			return String.valueOf(index % skins);
+		}
+
+		protected static class VariantEntry {
+			public final String textureKey;
+			public final double weight;
+			public VariantEntry(String key, double weight) {
+				this.textureKey = key;
+				this.weight = weight;
+			}
 		}
 	}
 }
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityArrowGoldenFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityArrowGoldenFX.java
deleted file mode 100644
index 0201a2fc8..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityArrowGoldenFX.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-public class EntityArrowGoldenFX extends EntityFX
-{
-
-    public EntityArrowGoldenFX(World world, double d, double d1, double d2,
-                               double d3, double d4, double d5)
-    {
-        this(world, d, d1, d2, d3, d4, d5, 1.0F);
-    }
-
-    public EntityArrowGoldenFX(World world, double d, double d1, double d2, 
-            double d3, double d4, double d5, float f)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.1D;
-        yd *= 0.1D;
-        zd *= 0.1D;
-        xd += d3;
-        yd += d4;
-        zd += d5;
-        particleRed = particleGreen = 0.8f;
-        particleBlue = (float)(Math.random() * 0.3D);
-        particleScale *= 0.75F;
-        particleScale *= f;
-        field_671_a = particleScale;
-        particleMaxAge = (int)(8D / (Math.random() * 0.8D + 0.2D));
-        particleMaxAge *= f;
-        noPhysics = false;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = field_671_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        int val = (7 - ((particleAge * 8) / particleMaxAge));
-        if (val >= 0){
-            particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
-        } else {
-            particleTexture = null;
-        }
-        yd += 0.004D;
-        move(xd, yd, zd);
-        if(y == yo)
-        {
-            xd *= 1.1D;
-            zd *= 1.1D;
-        }
-        xd *= 0.96D;
-        yd *= 0.96D;
-        zd *= 0.96D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    float field_671_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityBubbleFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityBubbleFX.java
deleted file mode 100644
index acd4bc5c7..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityBubbleFX.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, MathHelper, World, Material
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityBubbleFX extends EntityFX
-{
-    private final boolean needsWater;
-
-    public EntityBubbleFX(World world, double d, double d1, double d2,
-                          double d3, double d4, double d5, boolean needsWater)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        this.needsWater = needsWater;
-        particleRed = 1.0F;
-        particleGreen = 1.0F;
-        particleBlue = 1.0F;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/bubble");
-        setSize(0.02F, 0.02F);
-        particleScale = particleScale * (random.nextFloat() * 0.6F + 0.2F);
-        xd = d3 * 0.2D + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.02F);
-        yd = d4 * 0.2D + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.02F);
-        zd = d5 * 0.2D + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.02F);
-        particleMaxAge = (int)(8D / (java.lang.Math.random() * 0.8D + 0.2D));
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        yd += 0.002D;
-        move(xd, yd, zd);
-        xd *= 0.85D;
-        yd *= 0.85D;
-        zd *= 0.85D;
-        if(needsWater && world.getBlockMaterial(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) != Material.water)
-        {
-            remove();
-        }
-        if(particleMaxAge-- <= 0)
-        {
-            remove();
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java
deleted file mode 100644
index 076052cfb..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, Block, Tessellator, World
-
-import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.block.model.BlockModel;
-import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-public class EntityDiggingFX extends EntityFX
-{    public EntityDiggingFX(World world, double x, double y, double z,
-                           double motionX, double motionY, double motionZ, Block block,
-                           int side, int meta)
-    {
-        super(world, x, y, z, motionX, motionY, motionZ);
-        this.side = Side.getSideById(side);
-        this.block = block;
-        particleTexture = BlockModelDispatcher.getInstance().getDispatch(block).getParticleTexture(this.side, meta);
-        this.particleGravity = block != null ? block.blockParticleGravity : 0;
-        this.particleRed = particleGreen = particleBlue = 0.6F;
-        this.particleScale /= 2.0F;
-
-    }
-
-    public EntityDiggingFX setParticleColor(int x, int y, int z)
-    {
-        int meta = world.getBlockMetadata(x, y, z);
-        BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(block);
-        if (model.shouldSideBeColored(world, x, y, z, side.getId(), meta)) {
-            int l = BlockColorDispatcher.getInstance().getDispatch(block).getWorldColor(world, x, y, z);
-            particleRed *= (float) (l >> 16 & 0xff) / 255F;
-            particleGreen *= (float) (l >> 8 & 0xff) / 255F;
-            particleBlue *= (float) (l & 0xff) / 255F;
-        }
-        return this;
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 1;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        if (particleTexture == null) return;
-        float f6 = (float) particleTexture.getSubIconU(particleTextureJitterX / 4F);
-        float f7 = (float) particleTexture.getSubIconU(0.25f + particleTextureJitterX / 4F);
-        float f8 = (float) particleTexture.getSubIconV(particleTextureJitterX / 4F);
-        float f9 = (float) particleTexture.getSubIconV(0.25f + particleTextureJitterX / 4F);
-        float f10 = 0.1F * particleScale;
-        float f11 = (float)((xo + (x - xo) * (double) partialTick) - lerpPosX);
-        float f12 = (float)((yo + (y - yo) * (double) partialTick) - lerpPosY);
-        float f13 = (float)((zo + (z - zo) * (double) partialTick) - lerpPosZ);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(brightness * particleRed, brightness * particleGreen, brightness * particleBlue);
-        t.addVertexWithUV(f11 - rotationX * f10 - rotationYZ * f10, f12 - rotationXZ * f10, f13 - rotationZ * f10 - rotationXY * f10, f6, f9);
-        t.addVertexWithUV((f11 - rotationX * f10) + rotationYZ * f10, f12 + rotationXZ * f10, (f13 - rotationZ * f10) + rotationXY * f10, f6, f8);
-        t.addVertexWithUV(f11 + rotationX * f10 + rotationYZ * f10, f12 + rotationXZ * f10, f13 + rotationZ * f10 + rotationXY * f10, f7, f8);
-        t.addVertexWithUV((f11 + rotationX * f10) - rotationYZ * f10, f12 - rotationXZ * f10, (f13 + rotationZ * f10) - rotationXY * f10, f7, f9);
-    }
-
-    private Block block;
-    private Side side;
-
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityExplodeFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityExplodeFX.java
deleted file mode 100644
index 05c1df4c3..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityExplodeFX.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, World, Tessellator
-
-public class EntityExplodeFX extends EntityFX
-{
-
-    public EntityExplodeFX(World world, double d, double d1, double d2,
-                           double d3, double d4, double d5)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        xd = d3 + (double)((float)(Math.random() * 2D - 1.0D) * 0.05F);
-        yd = d4 + (double)((float)(Math.random() * 2D - 1.0D) * 0.05F);
-        zd = d5 + (double)((float)(Math.random() * 2D - 1.0D) * 0.05F);
-        particleRed = particleGreen = particleBlue = random.nextFloat() * 0.3F + 0.7F;
-        particleScale = random.nextFloat() * random.nextFloat() * 6F + 1.0F;
-        particleMaxAge = (int)(16D / ((double) random.nextFloat() * 0.8D + 0.2D)) + 2;
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        int val = (7 - ((particleAge * 8) / particleMaxAge));
-        if (val >= 0){
-            particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
-        } else {
-            particleTexture = null;
-        }
-        yd += 0.004D;
-        move(xd, yd, zd);
-        xd *= 0.9D;
-        yd *= 0.9D;
-        zd *= 0.9D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFX.java
deleted file mode 100644
index 95d7d8557..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFX.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.util.helper.MathHelper;
-import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, MathHelper, Tessellator, World,
-//            NBTTagCompound
-
-public class EntityFX extends Entity
-{
-
-    public EntityFX(World world, double x, double y, double z,
-                    double motionX, double motionY, double motionZ)
-    {
-        super(world);
-        particleAge = 0;
-        particleMaxAge = 0;
-        setSize(0.2F, 0.2F);
-        heightOffset = bbHeight / 2.0F;
-        setPos(x, y, z);
-        xo = this.x;
-        yo = this.y;
-        zo = this.z;
-        particleRed = particleGreen = particleBlue = 1.0F;
-        this.xd = motionX + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.4F);
-        this.yd = motionY + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.4F);
-        this.zd = motionZ + (double)((float)(java.lang.Math.random() * 2D - 1.0D) * 0.4F);
-        float f = (float)(java.lang.Math.random() + java.lang.Math.random() + 1.0D) * 0.15F;
-        float f1 = MathHelper.sqrt_double(this.xd * this.xd + this.yd * this.yd + this.zd * this.zd);
-        this.xd = (this.xd / (double)f1) * (double)f * 0.4D;
-        this.yd = (this.yd / (double)f1) * (double)f * 0.4D + 0.1D;
-        this.zd = (this.zd / (double)f1) * (double)f * 0.4D;
-        particleTextureJitterX = random.nextFloat() * 3F;
-        particleTextureJitterY = random.nextFloat() * 3F;
-        particleScale = (random.nextFloat() * 0.5F + 0.5F) * 2.0F;
-        particleMaxAge = (int)(4F / (random.nextFloat() * 0.9F + 0.1F));
-        particleAge = 0;
-    }
-
-    @Override
-    public boolean isInWaterOrRain() {
-        return false;
-    }
-
-    public EntityFX func_407_b(float f)
-    {
-        xd *= f;
-        yd = (yd - 0.1D) * (double)f + 0.1D;
-        zd *= f;
-        return this;
-    }
-
-    public EntityFX func_405_d(float f)
-    {
-        setSize(0.2F * f, 0.2F * f);
-        particleScale *= f;
-        return this;
-    }
-
-    @Override
-	protected boolean makeStepSound()
-    {
-        return false;
-    }
-
-    @Override
-	protected void init()
-    {
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        yd -= 0.04D * (double)particleGravity;
-        move(xd, yd, zd);
-        xd *= 0.98D;
-        yd *= 0.98D;
-        zd *= 0.98D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        if (particleTexture == null) return;
-        float texMinU = (float) particleTexture.getIconUMin();
-        float texMaxU = (float) particleTexture.getSubIconU(1);
-        float texMinV = (float) particleTexture.getIconVMin();
-        float texMaxV = (float) particleTexture.getSubIconV(1);
-        float scale = 0.1F * particleScale;
-        float posX = (float)((xo + (this.x - xo) * (double)partialTick) - lerpPosX);
-        float posY = (float)((yo + (this.y - yo) * (double)partialTick) - lerpPosY);
-        float posZ = (float)((zo + (this.z - zo) * (double)partialTick) - lerpPosZ);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(particleRed * brightness, particleGreen * brightness, particleBlue * brightness);
-        t.addVertexWithUV(posX - rotationX * scale - rotationYZ * scale, posY - rotationXZ * scale, posZ - rotationZ * scale - rotationXY * scale, texMaxU, texMaxV);
-        t.addVertexWithUV((posX - rotationX * scale) + rotationYZ * scale, posY + rotationXZ * scale, (posZ - rotationZ * scale) + rotationXY * scale, texMaxU, texMinV);
-        t.addVertexWithUV(posX + rotationX * scale + rotationYZ * scale, posY + rotationXZ * scale, posZ + rotationZ * scale + rotationXY * scale, texMinU, texMinV);
-        t.addVertexWithUV((posX + rotationX * scale) - rotationYZ * scale, posY - rotationXZ * scale, (posZ + rotationZ * scale) - rotationXY * scale, texMinU, texMaxV);
-    }
-
-    public int getFXLayer()
-    {
-        return 0;
-    }
-
-    @Override
-	public void addAdditionalSaveData(CompoundTag tag)
-    {
-    }
-
-    @Override
-	public void readAdditionalSaveData(CompoundTag tag)
-    {
-    }
-
-    protected IconCoordinate particleTexture;
-    protected float particleTextureJitterX;
-    protected float particleTextureJitterY;
-    protected int particleAge;
-    protected int particleMaxAge;
-    protected float particleScale;
-    protected float particleGravity;
-    protected float particleRed;
-    protected float particleGreen;
-    protected float particleBlue;
-    public static double lerpPosX;
-    public static double lerpPosY;
-    public static double lerpPosZ;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java
deleted file mode 100644
index dfae0a923..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityFireflyFX extends EntityFX
-{
-
-    public EntityFireflyFX(World world, double x, double y, double z,
-                           double motionX, double motionY, double motionZ, int type)
-    {
-        this(world, x, y, z, motionX, motionY, motionZ, 1.0F, type);
-    }
-
-    public EntityFireflyFX(World world, double x, double y, double z,
-                                  double motionX, double motionY, double motionZ, float scale, int type)
-    {
-        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
-        this.xd = 0.01D;
-        this.yd = 0.01D;
-        this.zd = 0.01D;
-        this.xd += motionX;
-        this.yd += motionY;
-        this.zd += motionZ;
-        setColour(type);
-        particleScale = 2.0F;
-        //particleScale *= scale;
-        field_671_a = particleScale;
-        particleMaxAge = (int) (24D + random.nextInt(6));
-        particleMaxAge *= scale;
-        noPhysics = false;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/firefly");
-        if(random.nextInt(2)==0)
-            isReversed = true;
-        oR = random.nextFloat() * 0.06f - 0.03f;
-        oG = random.nextFloat() * 0.06f - 0.03f;
-        oB = random.nextFloat() * 0.06f - 0.03f;
-
-    }
-
-    private void setColour(int type){
-        float[] color = EntityFireflyCluster.FireflyColor.fireFlyColors.get(type).getMidColor();
-        midR = color[0];
-        midG = color[1];
-        midB = color[2];
-
-        particleRed = midR;
-        particleGreen = midG;
-        particleBlue = midB;
-        maxR = MathHelper.clamp(midR + 0.25f, 0.0f, 1.0f);
-        maxG = MathHelper.clamp(midG + 0.25f, 0.0f, 1.0f);
-        maxB = MathHelper.clamp(midB + 0.25f, 0.0f, 1.0f);
-    }
-
-    public void setParticleAge(int age) {
-        particleAge = age;
-    }
-
-    @Override
-    public float getBrightness(float partialTick)
-    {
-        float internalBrightness = getInternalBrightness(partialTick);
-        float worldBrightness = super.getBrightness(partialTick);
-        return Math.max(internalBrightness, worldBrightness);
-    }
-
-    public float getInternalBrightness(float partialTick)
-    {
-        float b = (float) (Math.sin(particleAge * 0.25f) + 1.0f) / 2f;
-        return MathHelper.clamp(b, 0f, 1f);
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float b = getInternalBrightness(partialTick);
-        if (b < 0.5f)
-        {
-            particleRed = MathHelper.lerp(minR, midR, b * 2);
-            particleGreen = MathHelper.lerp(minG, midG, b * 2);
-            particleBlue = MathHelper.lerp(minB, midB, b * 2);
-        }
-        else
-        {
-            particleRed = MathHelper.lerp(midR, maxR, (b - 0.5f) * 2);
-            particleGreen = MathHelper.lerp(midG, maxG, (b - 0.5f) * 2);
-            particleBlue = MathHelper.lerp(midB, maxB, (b - 0.5f) * 2);
-        }
-
-        particleRed += oR;
-        particleGreen += oG;
-        particleBlue += oB;
-
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    public void renderParticleInGUI(Tessellator t, float partialTick) {
-        float b = getInternalBrightness(partialTick);
-        if (b < 0.5f)
-        {
-            particleRed = MathHelper.lerp(minR, midR, b * 2);
-            particleGreen = MathHelper.lerp(minG, midG, b * 2);
-            particleBlue = MathHelper.lerp(minB, midB, b * 2);
-        }
-        else
-        {
-            particleRed = MathHelper.lerp(midR, maxR, (b - 0.5f) * 2);
-            particleGreen = MathHelper.lerp(midG, maxG, (b - 0.5f) * 2);
-            particleBlue = MathHelper.lerp(midB, maxB, (b - 0.5f) * 2);
-        }
-
-        particleRed += oR;
-        particleGreen += oG;
-        particleBlue += oB;
-
-        float texMinU = (float) particleTexture.getIconUMin();
-        float texMaxU = (float) particleTexture.getSubIconU(1/16f);
-        float texMinV = (float) particleTexture.getIconVMin();
-        float texMaxV = (float) particleTexture.getSubIconV(1/16f);
-        float scale = 0.1F * particleScale;
-        float posX = (float)(xo + (x - xo) * partialTick);
-        float posY = (float)(yo + (y - yo) * partialTick);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(particleRed * brightness, particleGreen * brightness, particleBlue * brightness);
-        t.addVertexWithUV(posX + scale, posY - scale, 0, texMaxU, texMaxV);
-        t.addVertexWithUV(posX + scale, posY + scale, 0, texMaxU, texMinV);
-        t.addVertexWithUV(posX - scale, posY + scale, 0, texMinU, texMinV);
-        t.addVertexWithUV(posX - scale, posY - scale, 0, texMinU, texMaxV);
-    }
-    
-    @Override
-    public int getLightmapCoord(float partialTicks) {
-    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTicks), 15);
-    }
-
-    public void tickGUI() {
-        sinTimer++;
-        if(sinTimer>100)
-            sinTimer=0;
-
-        if(particleAge++ >= particleMaxAge && getInternalBrightness(1.0F) < 0.01f)
-        {
-            remove();
-        }
-
-        xo = x;
-        yo = y;
-        xd = (MathHelper.sin((sinTimer)*0.15f)) / 60f;
-        yd = (MathHelper.cos((sinTimer)*0.15f)) / 60f;
-        if(isReversed){
-            xd = -xd;
-            yd = -yd;
-        }
-        move(xd, yd, 0);
-    }
-
-    @Override
-    public void tick()
-    {
-        sinTimer++;
-        if(sinTimer>100)
-            sinTimer=0;
-
-        if(particleAge++ >= particleMaxAge && getInternalBrightness(1.0f) < 0.01f)
-        {
-            remove();
-        }
-
-        xo = x;
-        yo = y;
-        zo = z;
-        xd = (MathHelper.sin(sinTimer*0.15f)) / 60f;
-        zd = (MathHelper.cos(sinTimer*0.15f)) / 60f;
-        if(isReversed){
-            xd = -xd;
-            yd = -yd;
-            zd = -zd;
-        }
-        move(xd, yd, zd);
-    }
-
-    float field_671_a;
-    float sinTimer = 0;
-    boolean isReversed = false;
-    float midR = 0.0f;
-    float midG = 0.0f;
-    float midB = 0.0f;
-    final float minR = 96 / 255f;
-    final float minG = 54 / 255f;
-    final float minB = 0 / 255f;
-    float maxR = 240 / 255f;
-    float maxG = 255 / 255f;
-    float maxB = 173 / 255f;
-    float oR;
-    float oG;
-    float oB;
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java
deleted file mode 100644
index 86eded1c6..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityFlameFX extends EntityFX
-{
-
-    public EntityFlameFX(World world, double d, double d1, double d2,
-                         double d3, double d4, double d5, Type type)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        xd = xd * 0.01D + d3;
-        yd = yd * 0.01D + d4;
-        zd = zd * 0.01D + d5;
-        d += (random.nextFloat() - random.nextFloat()) * 0.05F;
-        d1 += (random.nextFloat() - random.nextFloat()) * 0.05F;
-        d2 += (random.nextFloat() - random.nextFloat()) * 0.05F;
-        field_672_a = particleScale;
-        particleRed = particleGreen = particleBlue = 1.0F;
-        particleMaxAge = (int)(8D / (java.lang.Math.random() * 0.8D + 0.2D)) + 4;
-        noPhysics = true;
-        particleTexture = type.texture;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = ((float)particleAge + partialTick) / (float)particleMaxAge;
-        particleScale = field_672_a * (1.0F - f6 * f6 * 0.5F);
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public float getBrightness(float partialTick)
-    {
-        float decay = MathHelper.clamp(((float)particleAge + partialTick) / (float)particleMaxAge, 0.0f, 1.0f);
-        return super.getBrightness(partialTick) * decay + (1.0F - decay);
-    }
-    
-    @Override
-    public int getLightmapCoord(float partialTicks) {
-    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTicks), 15);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        move(xd, yd, zd);
-        xd *= 0.96D;
-        yd *= 0.96D;
-        zd *= 0.96D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    private float field_672_a;
-    
-    public enum Type{
-    	
-    	ORANGE(TextureRegistry.getTexture("minecraft:particle/fire")),
-    	SOUL(TextureRegistry.getTexture("minecraft:particle/fire_soul")),
-    	BLUE(TextureRegistry.getTexture("minecraft:particle/fire_blue"));
-    	
-    	private IconCoordinate texture;
-    	
-    	private Type(IconCoordinate tex) {
-    		this.texture = tex;
-    	}
-    	
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFootStepFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFootStepFX.java
deleted file mode 100644
index c963bb2b9..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFootStepFX.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-import org.lwjgl.opengl.GL11;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, MathHelper, World, RenderEngine, 
-//            Tessellator
-
-public class EntityFootStepFX extends EntityFX
-{
-
-    public EntityFootStepFX(RenderEngine renderengine, World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        field_27018_a = 0;
-        field_27019_p = renderengine;
-        xd = yd = zd = 0.0D;
-        field_27020_o = 200;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = ((float)field_27018_a + partialTick) / (float)field_27020_o;
-        f6 *= f6;
-        float f7 = 2.0F - f6 * 2.0F;
-        if(f7 > 1.0F)
-        {
-            f7 = 1.0F;
-        }
-        f7 *= 0.2F;
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        float f8 = 0.125F;
-        float f9 = (float)(x - lerpPosX);
-        float f10 = (float)(y - lerpPosY);
-        float f11 = (float)(z - lerpPosZ);
-        float f12 = world.getLightBrightness(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z));
-        field_27019_p.bindTexture(field_27019_p.getTexture("/misc/footprint.png"));
-        GL11.glEnable(3042 /*GL_BLEND*/);
-        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        t.startDrawingQuads();
-        t.setColorRGBA_F(f12, f12, f12, f7);
-        t.addVertexWithUV(f9 - f8, f10, f11 + f8, 0.0D, 1.0D);
-        t.addVertexWithUV(f9 + f8, f10, f11 + f8, 1.0D, 1.0D);
-        t.addVertexWithUV(f9 + f8, f10, f11 - f8, 1.0D, 0.0D);
-        t.addVertexWithUV(f9 - f8, f10, f11 - f8, 0.0D, 0.0D);
-        t.draw();
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
-    }
-
-    @Override
-	public void tick()
-    {
-        field_27018_a++;
-        if(field_27018_a == field_27020_o)
-        {
-            remove();
-        }
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 3;
-    }
-
-    private int field_27018_a;
-    private int field_27020_o;
-    private RenderEngine field_27019_p;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityHeartFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityHeartFX.java
deleted file mode 100644
index 9203ac7ff..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityHeartFX.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-public class EntityHeartFX extends EntityFX
-{
-
-    public EntityHeartFX(World world, double d, double d1, double d2,
-                         double d3, double d4, double d5)
-    {
-        this(world, d, d1, d2, d3, d4, d5, 2.0F);
-    }
-
-    public EntityHeartFX(World world, double d, double d1, double d2, 
-            double d3, double d4, double d5, float f)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.01D;
-        yd *= 0.01D;
-        zd *= 0.01D;
-        yd += 0.1D;
-        particleScale *= 0.75F;
-        particleScale *= f;
-        field_25022_a = particleScale;
-        particleMaxAge = 16;
-        noPhysics = false;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/heart");
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = field_25022_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        move(xd, yd, zd);
-        if(y == yo)
-        {
-            xd *= 1.1D;
-            zd *= 1.1D;
-        }
-        xd *= 0.86D;
-        yd *= 0.86D;
-        zd *= 0.86D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    float field_25022_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityItemFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityItemFX.java
deleted file mode 100644
index 81970aaa9..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityItemFX.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, Item, Block, Tessellator,
-//            World
-
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.world.World;
-
-public class EntityItemFX extends EntityFX
-{
-    public EntityItemFX(World world, double d, double d1, double d2,
-                         Item item)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        particleTexture = ItemModelDispatcher.getInstance().getDispatch(item).getIcon(null, item.getDefaultStack());
-        particleRed = particleGreen = particleBlue = 1.0F;
-        particleGravity = Block.blockSnow.blockParticleGravity;
-        particleScale /= 2.0F;
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 2;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (float) particleTexture.getSubIconU(particleTextureJitterX / 4F);
-        float f7 = (float) particleTexture.getSubIconU(0.25f + particleTextureJitterX / 4F);
-        float f8 = (float) particleTexture.getSubIconV(particleTextureJitterX / 4F);
-        float f9 = (float) particleTexture.getSubIconV(0.25f + particleTextureJitterX / 4F);
-        float f10 = 0.1F * particleScale;
-        float f11 = (float)((xo + (x - xo) * (double) partialTick) - lerpPosX);
-        float f12 = (float)((yo + (y - yo) * (double) partialTick) - lerpPosY);
-        float f13 = (float)((zo + (z - zo) * (double) partialTick) - lerpPosZ);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(brightness * particleRed, brightness * particleGreen, brightness * particleBlue);
-        t.addVertexWithUV(f11 - rotationX * f10 - rotationYZ * f10, f12 - rotationXZ * f10, f13 - rotationZ * f10 - rotationXY * f10, f6, f9);
-        t.addVertexWithUV((f11 - rotationX * f10) + rotationYZ * f10, f12 + rotationXZ * f10, (f13 - rotationZ * f10) + rotationXY * f10, f6, f8);
-        t.addVertexWithUV(f11 + rotationX * f10 + rotationYZ * f10, f12 + rotationXZ * f10, f13 + rotationZ * f10 + rotationXY * f10, f7, f8);
-        t.addVertexWithUV((f11 + rotationX * f10) - rotationYZ * f10, f12 - rotationXZ * f10, (f13 + rotationZ * f10) - rotationXY * f10, f7, f9);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityLavaFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityLavaFX.java
deleted file mode 100644
index 3e5fa659a..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityLavaFX.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, World, Tessellator
-
-public class EntityLavaFX extends EntityFX
-{
-
-    public EntityLavaFX(World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.8D;
-        yd *= 0.8D;
-        zd *= 0.8D;
-        yd = random.nextFloat() * 0.4F + 0.05F;
-        particleRed = particleGreen = particleBlue = 1.0F;
-        particleScale *= random.nextFloat() * 2.0F + 0.2F;
-        field_674_a = particleScale;
-        particleMaxAge = (int)(16D / (Math.random() * 0.8D + 0.2D));
-        noPhysics = false;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/bubble_lava");
-    }
-
-    @Override
-	public float getBrightness(float partialTick)
-    {
-        return 1.0F;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = ((float)particleAge + partialTick) / (float)particleMaxAge;
-        particleScale = field_674_a * (1.0F - f6 * f6);
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        float f = (float)particleAge / (float)particleMaxAge;
-        if(random.nextFloat() > f)
-        {
-            world.spawnParticle("smoke", x, y, z, xd, yd, zd, 0);
-        }
-        yd -= 0.03D;
-        move(xd, yd, zd);
-        xd *= 0.999D;
-        yd *= 0.999D;
-        zd *= 0.999D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    private float field_674_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityLeafFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityLeafFX.java
deleted file mode 100644
index ef8643347..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityLeafFX.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.LightmapHelper;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, Block, Tessellator, World
-
-import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
-import net.minecraft.core.world.World;
-
-public class EntityLeafFX extends EntityFX
-{
-
-    public EntityLeafFX(World world, double d, double d1, double d2,
-                        double d3, double d4, double d5)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        particleTexture = TextureRegistry.getTexture("minecraft:block/leaves_oak_fancy");
-        particleGravity = 0.125F;
-        particleScale /= 2.0F;
-        particleMaxAge *= 16.0F;
-        yd = 0.0f;
-        xd = 0.0f;
-        zd = 0.0f;
-    }
-
-    @Override
-    public boolean collidesWithBlock(Block block, int metadata) {
-        return !(block instanceof BlockLeavesBase);
-    }
-
-    public EntityLeafFX func_4041_a(int i, int j, int k)
-    {
-        Block block = Block.blocksList[world.getBlockId(i, j, k)];
-        if (!(block instanceof BlockLeavesBase)) this.remove();
-        int l = BlockColorDispatcher.getInstance().getDispatch(block).getWorldColor(world, i, j, k);
-        particleRed *= (float)(l >> 16 & 0xff) / 255F;
-        particleGreen *= (float)(l >> 8 & 0xff) / 255F;
-        particleBlue *= (float)(l & 0xff) / 255F;
-        return this;
-    }
-    
-    @Override
-	public void tick()
-    {
-        float windDirection = world.worldType.getWindManager().getWindDirection(world, (float) x, (float) y, (float) z);
-        float windIntensity = world.worldType.getWindManager().getWindIntensity(world, (float) x, (float) y, (float) z) * 0.01f;
-
-        float dx = (float) (Math.cos(windDirection * Math.PI * 2) * windIntensity);
-        float dz = (float) (Math.sin(windDirection * Math.PI * 2) * windIntensity);
-        
-        xd += dx;
-        zd += dz;
-        
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        yd -= 0.04D * (double)particleGravity;
-        if(onGround)
-        {
-            xd *= 0.0D;
-            zd *= 0.0D;
-        }
-        move(xd, yd, zd);
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 1;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (float) particleTexture.getSubIconU(particleTextureJitterX / 4F);
-        float f7 = (float) particleTexture.getSubIconU(0.25f);
-        float f8 = (float) particleTexture.getSubIconV(particleTextureJitterX / 4F);
-        float f9 = (float) particleTexture.getSubIconV(0.25f);
-        float f10 = 0.1F * particleScale;
-        float f11 = (float)((xo + (x - xo) * (double) partialTick) - lerpPosX);
-        float f12 = (float)((yo + (y - yo) * (double) partialTick) - lerpPosY);
-        float f13 = (float)((zo + (z - zo) * (double) partialTick) - lerpPosZ);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(brightness * particleRed, brightness * particleGreen, brightness * particleBlue);
-        t.addVertexWithUV(f11 - rotationX * f10 - rotationYZ * f10, f12 - rotationXZ * f10, f13 - rotationZ * f10 - rotationXY * f10, f6, f9);
-        t.addVertexWithUV((f11 - rotationX * f10) + rotationYZ * f10, f12 + rotationXZ * f10, (f13 - rotationZ * f10) + rotationXY * f10, f6, f8);
-        t.addVertexWithUV(f11 + rotationX * f10 + rotationYZ * f10, f12 + rotationXZ * f10, f13 + rotationZ * f10 + rotationXY * f10, f7, f8);
-        t.addVertexWithUV((f11 + rotationX * f10) - rotationYZ * f10, f12 - rotationXZ * f10, (f13 + rotationZ * f10) - rotationXY * f10, f7, f9);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityNoteFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityNoteFX.java
deleted file mode 100644
index 40c711c61..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityNoteFX.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityNoteFX extends EntityFX
-{
-
-    public EntityNoteFX(World world, double d, double d1, double d2,
-                        double d3, double d4, double d5)
-    {
-        this(world, d, d1, d2, d3, d4, d5, 2.0F);
-    }
-
-    public EntityNoteFX(World world, double d, double d1, double d2, 
-            double d3, double d4, double d5, float f)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.01D;
-        yd *= 0.01D;
-        zd *= 0.01D;
-        yd += 0.2D;
-        particleRed = MathHelper.sin(((float)d3 + 0.0F) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
-        particleGreen = MathHelper.sin(((float)d3 + 1f/3) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
-        particleBlue = MathHelper.sin(((float)d3 + 2f/3) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
-        particleScale *= 0.75F;
-        particleScale *= f;
-        field_21065_a = particleScale;
-        particleMaxAge = 6;
-        noPhysics = false;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/note");
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = field_21065_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        move(xd, yd, zd);
-        if(y == yo)
-        {
-            xd *= 1.1D;
-            zd *= 1.1D;
-        }
-        xd *= 0.66D;
-        yd *= 0.66D;
-        zd *= 0.66D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    float field_21065_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityPickupFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityPickupFX.java
deleted file mode 100644
index 306f097a2..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityPickupFX.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.client.render.EntityRenderDispatcher;
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-import org.lwjgl.opengl.GL11;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, Entity, MathHelper, World, 
-//            RenderManager, Tessellator
-
-public class EntityPickupFX extends EntityFX
-{
-
-    public EntityPickupFX(World world, Entity itemEntity, Entity targetEntity, float f)
-    {
-        super(world, itemEntity.x, itemEntity.y, itemEntity.z, itemEntity.xd, itemEntity.yd, itemEntity.zd);
-        field_678_p = 0;
-        this.itemEntity = itemEntity;
-        this.targetEntity = targetEntity;
-        field_677_q = 3;
-        field_676_r = f;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = ((float)field_678_p + partialTick) / (float)field_677_q;
-        f6 *= f6;
-        double d = itemEntity.x;
-        double d1 = itemEntity.y;
-        double d2 = itemEntity.z;
-        double d3 = targetEntity.xo + (targetEntity.x - targetEntity.xo) * (double) partialTick;
-        double d4 = targetEntity.yo + (targetEntity.y - targetEntity.yo) * (double) partialTick + (double)field_676_r;
-        double d5 = targetEntity.zo + (targetEntity.z - targetEntity.zo) * (double) partialTick;
-        double d6 = d + (d3 - d) * (double)f6;
-        double d7 = d1 + (d4 - d1) * (double)f6;
-        double d8 = d2 + (d5 - d2) * (double)f6;
-        int i = MathHelper.floor_double(d6);
-        int j = MathHelper.floor_double(d7 + (double)(this.heightOffset / 2.0F));
-        int k = MathHelper.floor_double(d8);
-        d6 -= lerpPosX;
-        d7 -= lerpPosY;
-        d8 -= lerpPosZ;
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	LightmapHelper.setLightmapCoord(itemEntity.world.getLightmapCoord(i, j, k, 0));
-        }else {
-        	brightness = world.getLightBrightness(i, j, k);
-        }
-        GL11.glColor4f(brightness, brightness, brightness, 1.0F);
-        EntityRenderDispatcher.instance.renderEntityWithPosYaw(t, itemEntity, (float)d6, (float)d7, (float)d8, itemEntity.yRot, partialTick);
-    }
-
-    @Override
-	public void tick()
-    {
-        field_678_p++;
-        if(field_678_p == field_677_q)
-        {
-            remove();
-        }
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 3;
-    }
-
-    private Entity itemEntity;
-    private Entity targetEntity;
-    private int field_678_p;
-    private int field_677_q;
-    private float field_676_r;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityPortalFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityPortalFX.java
deleted file mode 100644
index 2c61bf6be..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityPortalFX.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, World, Tessellator
-
-public class EntityPortalFX extends EntityFX
-{
-
-    public EntityPortalFX(World world, double d, double d1, double d2,
-                          double d3, double d4, double d5)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        xd = d3;
-        yd = d4;
-        zd = d5;
-        field_4086_p = x = d;
-        field_4085_q = y = d1;
-        field_4084_r = z = d2;
-        float f = random.nextFloat() * 0.6F + 0.4F;
-        field_4083_a = particleScale = random.nextFloat() * 0.2F + 0.5F;
-        particleRed = particleGreen = particleBlue = 1.0F * f;
-        particleGreen *= 0.3F;
-        particleRed *= 0.9F;
-        particleMaxAge = (int)(Math.random() * 10D) + 40;
-        noPhysics = true;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + (int)(Math.random() * 8D));
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = ((float)particleAge + partialTick) / (float)particleMaxAge;
-        f6 = 1.0F - f6;
-        f6 *= f6;
-        f6 = 1.0F - f6;
-        particleScale = field_4083_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public float getBrightness(float partialTick)
-    {
-        float f1 = super.getBrightness(partialTick);
-        float f2 = (float)particleAge / (float)particleMaxAge;
-        f2 *= f2;
-        f2 *= f2;
-        return f1 * (1.0F - f2) + f2;
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        float f = (float)particleAge / (float)particleMaxAge;
-        float f1 = f;
-        f = -f + f * f * 2.0F;
-        f = 1.0F - f;
-        x = field_4086_p + xd * (double)f;
-        y = field_4085_q + yd * (double)f + (double)(1.0F - f1);
-        z = field_4084_r + zd * (double)f;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-    }
-
-    private float field_4083_a;
-    private double field_4086_p;
-    private double field_4085_q;
-    private double field_4084_r;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityRainFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityRainFX.java
deleted file mode 100644
index 1ed2b5a14..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityRainFX.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, MathHelper, World, Material, 
-//            BlockFluid, Tessellator
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityRainFX extends EntityFX
-{
-
-    public EntityRainFX(World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.3D;
-        yd = (float) java.lang.Math.random() * 0.2F + 0.1F;
-        zd *= 0.3D;
-        particleRed = 1.0F;
-        particleGreen = 1.0F;
-        particleBlue = 1.0F;
-        particleTexture = TextureRegistry.getTexture("minecraft:particle/splash_rain_" + random.nextInt(4));
-        setSize(0.01F, 0.01F);
-        particleGravity = 0.06F;
-        particleMaxAge = (int)(8D / (java.lang.Math.random() * 0.8D + 0.2D));
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        yd -= particleGravity;
-        move(xd, yd, zd);
-        xd *= 0.98000001907348633D;
-        yd *= 0.98000001907348633D;
-        zd *= 0.98000001907348633D;
-        if(particleMaxAge-- <= 0)
-        {
-            remove();
-        }
-        if(onGround)
-        {
-            if(java.lang.Math.random() < 0.5D)
-            {
-                remove();
-            }
-            xd *= 0.69999998807907104D;
-            zd *= 0.69999998807907104D;
-        }
-        Material material = world.getBlockMaterial(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z));
-        if(material.isLiquid() || material.isSolid())
-        {
-            double d = (float)(MathHelper.floor_double(y) + 1) - BlockFluid.getWaterVolume(world.getBlockMetadata(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)));
-            if(y < d)
-            {
-                remove();
-            }
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityReddustFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityReddustFX.java
deleted file mode 100644
index f020e8094..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntityReddustFX.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.enums.LightLayer;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntityReddustFX extends EntityFX
-{
-    float originalScale;
-    private int brightness;
-
-    public EntityReddustFX(World world, double x, double y, double z, float red, float green, float blue, int brightness)
-    {
-        this(world, x, y, z, 1.0F, red, green, blue, brightness);
-    }
-
-    public EntityReddustFX(World world, double x, double y, double z, float scale, float red, float green, float blue, int brightness)
-    {
-        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
-        this.brightness = -1;
-        if (brightness >= 0){
-            this.brightness = brightness;
-        }
-        xd *= 0.1D;
-        yd *= 0.1D;
-        zd *= 0.1D;
-        float f4 = (float)Math.random() * 0.4F + 0.6F;
-        this.particleRed = ((float)(Math.random() * 0.2D) + 0.8F) * red * f4;
-        this.particleGreen = ((float)(Math.random() * 0.2D) + 0.8F) * green * f4;
-        this.particleBlue = ((float)(Math.random() * 0.2D) + 0.8F) * blue * f4;
-        particleScale *= 0.75F;
-        particleScale *= scale;
-        this.originalScale = particleScale;
-        particleMaxAge = (int)(8D / (Math.random() * 0.8D + 0.2D));
-        particleMaxAge *= scale;
-        noPhysics = false;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = originalScale * f6;
-        if (particleTexture == null) return;
-
-        float texMinU = (float) particleTexture.getIconUMin();
-        float texMaxU = (float) particleTexture.getSubIconU(1);
-        float texMinV = (float) particleTexture.getIconVMin();
-        float texMaxV = (float) particleTexture.getSubIconV(1);
-        float scale = 0.1F * particleScale;
-        float posX = (float)((xo + (this.x - xo) * (double)partialTick) - lerpPosX);
-        float posY = (float)((yo + (this.y - yo) * (double)partialTick) - lerpPosY);
-        float posZ = (float)((zo + (this.z - zo) * (double)partialTick) - lerpPosZ);
-        float brightness = 1f;
-        if(LightmapHelper.isLightmapEnabled()) {
-            int blockX = MathHelper.floor_double(x);
-            int blockY = MathHelper.floor_double(y);
-            int blockZ = MathHelper.floor_double(z);
-            int lmc;
-            if (this.brightness >= 0){
-                lmc =
-                    LightmapHelper.getLightmapCoord(
-                        world.getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ),
-                        Math.max(world.getSavedLightValue(LightLayer.Block, blockX, blockY, blockZ), this.brightness));
-            } else {
-                lmc = getLightmapCoord(partialTick);
-            }
-            t.setLightmapCoord(lmc);
-        }else {
-            brightness = Math.max(getBrightness(partialTick), this.brightness/15f);
-        }
-        t.setColorOpaque_F(particleRed * brightness, particleGreen * brightness, particleBlue * brightness);
-        t.addVertexWithUV(posX - rotationX * scale - rotationYZ * scale, posY - rotationXZ * scale, posZ - rotationZ * scale - rotationXY * scale, texMaxU, texMaxV);
-        t.addVertexWithUV((posX - rotationX * scale) + rotationYZ * scale, posY + rotationXZ * scale, (posZ - rotationZ * scale) + rotationXY * scale, texMaxU, texMinV);
-        t.addVertexWithUV(posX + rotationX * scale + rotationYZ * scale, posY + rotationXZ * scale, posZ + rotationZ * scale + rotationXY * scale, texMinU, texMinV);
-        t.addVertexWithUV((posX + rotationX * scale) - rotationYZ * scale, posY - rotationXZ * scale, (posZ + rotationZ * scale) - rotationXY * scale, texMinU, texMaxV);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        int val = (7 - ((particleAge * 8) / particleMaxAge));
-        if (val >= 0){
-            particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
-        } else {
-            particleTexture = null;
-        }
-        move(xd, yd, zd);
-        if(y == yo)
-        {
-            xd *= 1.1D;
-            zd *= 1.1D;
-        }
-        xd *= 0.96D;
-        yd *= 0.96D;
-        zd *= 0.96D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntitySlimeChunkFX.java b/src/main/java/net/minecraft/client/entity/fx/EntitySlimeChunkFX.java
deleted file mode 100644
index 8f129d094..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntitySlimeChunkFX.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.LightmapHelper;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityFX, Item, Block, Tessellator,
-//            World
-
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.world.World;
-
-public class EntitySlimeChunkFX extends EntityFX
-{
-    public EntitySlimeChunkFX(World world, double d, double d1, double d2,
-                              Item item)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        particleTexture = ItemModelDispatcher.getInstance().getDispatch(item).getIcon(null, item.getDefaultStack());
-        particleGravity =2;
-        particleRed = particleGreen = particleBlue = 1.0F;
-        particleScale /= 2.0F;
-        particleMaxAge = 50;
-    }
-
-    @Override
-	public int getFXLayer()
-    {
-        return 2;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (float) particleTexture.getSubIconU(particleTextureJitterX / 4F);
-        float f7 = (float) particleTexture.getSubIconU(0.25f + particleTextureJitterX / 4F);
-        float f8 = (float) particleTexture.getSubIconV(particleTextureJitterX / 4F);
-        float f9 = (float) particleTexture.getSubIconV(0.25f + particleTextureJitterX / 4F);
-        float f10 = 0.1F * particleScale;
-        float f11 = (float)((xo + (x - xo) * (double) partialTick) - lerpPosX);
-        float f12 = (float)((yo + (y - yo) * (double) partialTick) - lerpPosY);
-        float f13 = (float)((zo + (z - zo) * (double) partialTick) - lerpPosZ);
-        float brightness = 1.0f;
-        if(LightmapHelper.isLightmapEnabled()) {
-        	t.setLightmapCoord(getLightmapCoord(partialTick));
-        }else {
-        	brightness = getBrightness(partialTick);
-        }
-        t.setColorOpaque_F(brightness * particleRed, brightness * particleGreen, brightness * particleBlue);
-        t.addVertexWithUV(f11 - rotationX * f10 - rotationYZ * f10, f12 - rotationXZ * f10, f13 - rotationZ * f10 - rotationXY * f10, f6, f9);
-        t.addVertexWithUV((f11 - rotationX * f10) + rotationYZ * f10, f12 + rotationXZ * f10, (f13 - rotationZ * f10) + rotationXY * f10, f6, f8);
-        t.addVertexWithUV(f11 + rotationX * f10 + rotationYZ * f10, f12 + rotationXZ * f10, f13 + rotationZ * f10 + rotationXY * f10, f7, f8);
-        t.addVertexWithUV((f11 + rotationX * f10) - rotationYZ * f10, f12 - rotationXZ * f10, (f13 + rotationZ * f10) - rotationXY * f10, f7, f9);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntitySmokeFX.java b/src/main/java/net/minecraft/client/entity/fx/EntitySmokeFX.java
deleted file mode 100644
index 7be5cf5d0..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntitySmokeFX.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-public class EntitySmokeFX extends EntityFX
-{
-
-    public EntitySmokeFX(World world, double d, double d1, double d2,
-                         double d3, double d4, double d5)
-    {
-        this(world, d, d1, d2, d3, d4, d5, 1.0F);
-    }
-
-    public EntitySmokeFX(World world, double d, double d1, double d2, 
-            double d3, double d4, double d5, float f)
-    {
-        super(world, d, d1, d2, 0.0D, 0.0D, 0.0D);
-        xd *= 0.1D;
-        yd *= 0.1D;
-        zd *= 0.1D;
-        xd += d3;
-        yd += d4;
-        zd += d5;
-        particleRed = particleGreen = particleBlue = (float)(Math.random() * 0.3D);
-        particleScale *= 0.75F;
-        particleScale *= f;
-        field_671_a = particleScale;
-        particleMaxAge = (int)(8D / (Math.random() * 0.8D + 0.2D));
-        particleMaxAge *= f;
-        noPhysics = false;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = field_671_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        int val = (7 - ((particleAge * 8) / particleMaxAge));
-        if (val >= 0){
-            particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
-        } else {
-            particleTexture = null;
-        }
-        yd += 0.004D;
-        move(xd, yd, zd);
-        if(y == yo)
-        {
-            xd *= 1.1D;
-            zd *= 1.1D;
-        }
-        xd *= 0.96D;
-        yd *= 0.96D;
-        zd *= 0.96D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    float field_671_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntitySnowShovelFX.java b/src/main/java/net/minecraft/client/entity/fx/EntitySnowShovelFX.java
deleted file mode 100644
index 09a612715..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntitySnowShovelFX.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.world.World;
-
-public class EntitySnowShovelFX extends EntityFX
-{
-
-    public EntitySnowShovelFX(World world, double d, double d1, double d2,
-                              double d3, double d4, double d5)
-    {
-        this(world, d, d1, d2, d3, d4, d5, 1.0F);
-    }
-
-    public EntitySnowShovelFX(World world, double d, double d1, double d2, 
-            double d3, double d4, double d5, float f)
-    {
-        super(world, d, d1, d2, d3, d4, d5);
-        xd *= 0.1D;
-        yd *= 0.1D;
-        zd *= 0.1D;
-        xd += d3;
-        yd += d4;
-        zd += d5;
-        particleRed = particleGreen = particleBlue = 1.0F - (float)(Math.random() * 0.3D);
-        particleScale *= 0.75F;
-        particleScale *= f;
-        field_27017_a = particleScale;
-        particleMaxAge = (int)(8D / (Math.random() * 0.8D + 0.2D));
-        particleMaxAge *= f;
-        noPhysics = false;
-    }
-
-    @Override
-    public void renderParticle(Tessellator t, float partialTick, float rotationX, float rotationXZ, float rotationZ, float rotationYZ, float rotationXY)
-    {
-        float f6 = (((float)particleAge + partialTick) / (float)particleMaxAge) * 32F;
-        if(f6 < 0.0F)
-        {
-            f6 = 0.0F;
-        }
-        if(f6 > 1.0F)
-        {
-            f6 = 1.0F;
-        }
-        particleScale = field_27017_a * f6;
-        super.renderParticle(t, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
-    }
-
-    @Override
-	public void tick()
-    {
-        xo = x;
-        yo = y;
-        zo = z;
-        if(particleAge++ >= particleMaxAge)
-        {
-            remove();
-        }
-        int val = (7 - ((particleAge * 8) / particleMaxAge));
-        if (val >= 0){
-            particleTexture = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
-        } else {
-            particleTexture = null;
-        }
-        yd -= 0.03D;
-        move(xd, yd, zd);
-        xd *= 0.99D;
-        yd *= 0.99D;
-        zd *= 0.99D;
-        if(onGround)
-        {
-            xd *= 0.7D;
-            zd *= 0.7D;
-        }
-    }
-
-    float field_27017_a;
-}
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntitySplashFX.java b/src/main/java/net/minecraft/client/entity/fx/EntitySplashFX.java
deleted file mode 100644
index a3d78872f..000000000
--- a/src/main/java/net/minecraft/client/entity/fx/EntitySplashFX.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package net.minecraft.client.entity.fx;
-
-
-// Referenced classes of package net.minecraft.src:
-//            EntityRainFX, World
-
-import net.minecraft.core.world.World;
-
-public class EntitySplashFX extends EntityRainFX
-{
-
-    public EntitySplashFX(World world, double d, double d1, double d2,
-                          double d3, double d4, double d5)
-    {
-        super(world, d, d1, d2);
-        particleGravity = 0.04F;
-        if(d4 == 0.0D && (d3 != 0.0D || d5 != 0.0D))
-        {
-            xd = d3;
-            yd = d4 + 0.1D;
-            zd = d5;
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/entity/particle/BreakingItemParticle.java b/src/main/java/net/minecraft/client/entity/particle/BreakingItemParticle.java
new file mode 100644
index 000000000..138809446
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/BreakingItemParticle.java
@@ -0,0 +1,52 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+
+// Referenced classes of package net.minecraft.src:
+//            EntityFX, Item, Block, Tessellator,
+//            World
+
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.world.World;
+
+public class BreakingItemParticle extends Particle {
+    public BreakingItemParticle(World world, double x, double y, double z, Item item)
+    {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.tex = ItemModelDispatcher.getInstance().getDispatch(item).getIcon(null, item.getDefaultStack());
+        this.rCol = this.gCol = this.bCol = 1.0F;
+        this.gravity = Blocks.BLOCK_SNOW.blockParticleGravity;
+        this.size /= 2.0F;
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 2;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float u0 = (float) this.tex.getSubIconU(this.uo / 4F);
+        float u2 = (float) this.tex.getSubIconU(0.25f + this.uo / 4F);
+        float v0 = (float) this.tex.getSubIconV(this.uo / 4F);
+        float v2 = (float) this.tex.getSubIconV(0.25f + this.uo / 4F);
+        float r = 0.1F * this.size;
+        float x = (float)(xo + (this.x - this.xo) * partialTick - BreakingItemParticle.xOff);
+        float y = (float)(yo + (this.y - this.yo) * partialTick - BreakingItemParticle.yOff);
+        float z = (float)(zo + (this.z - this.zo) * partialTick - BreakingItemParticle.zOff);
+        float br = 1.0f;
+        if (LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(br * this.rCol, br * this.gCol, br * this.bCol);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u0, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u2, v2);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/BubbleParticle.java b/src/main/java/net/minecraft/client/entity/particle/BubbleParticle.java
new file mode 100644
index 000000000..450f0c4a8
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/BubbleParticle.java
@@ -0,0 +1,43 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class BubbleParticle extends Particle {
+    private final boolean needsWater;
+
+    public BubbleParticle(World world, double x, double y, double z, double xa, double ya, double za, boolean needsWater) {
+        super(world, x, y, z, xa, ya, za);
+        this.needsWater = needsWater;
+        this.rCol = 1.0F;
+        this.gCol = 1.0F;
+        this.bCol = 1.0F;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/bubble");
+        this.setSize(0.02F, 0.02F);
+        this.size = this.size * (this.random.nextFloat() * 0.6F + 0.2F);
+        this.xd = xa * 0.2D + (float)(Math.random() * 2D - 1.0D) * 0.02F;
+        this.yd = ya * 0.2D + (float)(Math.random() * 2D - 1.0D) * 0.02F;
+        this.zd = za * 0.2D + (float)(Math.random() * 2D - 1.0D) * 0.02F;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D));
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        this.yd += 0.002D;
+        this.move(this.xd, this.yd, this.zd);
+        this.xd *= 0.85D;
+        this.yd *= 0.85D;
+        this.zd *= 0.85D;
+        if (this.needsWater && this.world.getBlockMaterial(MathHelper.floor(this.x), MathHelper.floor(this.y), MathHelper.floor(this.z)) != Material.water) {
+            remove();
+        }
+        if(this.lifetime-- <= 0) {
+            remove();
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/ExplodeParticle.java b/src/main/java/net/minecraft/client/entity/particle/ExplodeParticle.java
new file mode 100644
index 000000000..3cad7ad5d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/ExplodeParticle.java
@@ -0,0 +1,41 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.world.World;
+
+public class ExplodeParticle extends Particle {
+    public ExplodeParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        super(world, x, y, z, xa, ya, za);
+        this.xd = xa + (float)(Math.random() * 2D - 1.0D) * 0.05F;
+        this.yd = ya + (float)(Math.random() * 2D - 1.0D) * 0.05F;
+        this.zd = za + (float)(Math.random() * 2D - 1.0D) * 0.05F;
+        this.rCol = this.gCol = this.bCol = this.random.nextFloat() * 0.3F + 0.7F;
+        this.size = this.random.nextFloat() * this.random.nextFloat() * 6F + 1.0F;
+        this.lifetime = (int)(16D / (this.random.nextFloat() * 0.8D + 0.2D)) + 2;
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if(this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0) {
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.yd += 0.004D;
+        move(this.xd, this.yd, this.zd);
+        this.xd *= 0.9D;
+        this.yd *= 0.9D;
+        this.zd *= 0.9D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/FireflyParticle.java b/src/main/java/net/minecraft/client/entity/particle/FireflyParticle.java
new file mode 100644
index 000000000..5336dc744
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/FireflyParticle.java
@@ -0,0 +1,192 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class FireflyParticle extends Particle {
+    float oSize;
+    float sinTimer = 0;
+    boolean isReversed = false;
+    float midR = 0.0f;
+    float midG = 0.0f;
+    float midB = 0.0f;
+    final float minR = 96 / 255f;
+    final float minG = 54 / 255f;
+    final float minB = 0 / 255f;
+    float maxR = 240 / 255f;
+    float maxG = 255 / 255f;
+    float maxB = 173 / 255f;
+    float oR;
+    float oG;
+    float oB;
+
+    public FireflyParticle(World world, double x, double y, double z, double xa, double ya, double za, int type) {
+        this(world, x, y, z, xa, ya, za, 1.0F, type);
+    }
+
+    public FireflyParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale, int type) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd = 0.01D;
+        this.yd = 0.01D;
+        this.zd = 0.01D;
+        this.xd += xa;
+        this.yd += ya;
+        this.zd += za;
+        this.setColor(type);
+        this.size = 2.0F;
+        this.oSize = size;
+        this.lifetime = (int) (24D + random.nextInt(6));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/firefly");
+        if (this.random.nextInt(2) == 0) {
+            this.isReversed = true;
+        }
+        this.oR = this.random.nextFloat() * 0.06f - 0.03f;
+        this.oG = this.random.nextFloat() * 0.06f - 0.03f;
+        this.oB = this.random.nextFloat() * 0.06f - 0.03f;
+    }
+
+    private void setColor(int type){
+        float[] color = FireflyClusterMob.FireflyColor.fireFlyColors.get(type).getMidColor();
+        this.midR = color[0];
+        this.midG = color[1];
+        this.midB = color[2];
+
+        this.rCol = this.midR;
+        this.gCol = this.midG;
+        this.bCol = this.midB;
+        this.maxR = MathHelper.clamp(this.midR + 0.25f, 0.0f, 1.0f);
+        this.maxG = MathHelper.clamp(this.midG + 0.25f, 0.0f, 1.0f);
+        this.maxB = MathHelper.clamp(this.midB + 0.25f, 0.0f, 1.0f);
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    @Override
+    public float getBrightness(float partialTick)
+    {
+        float internalBrightness = this.getInternalBrightness(partialTick);
+        float worldBrightness = super.getBrightness(partialTick);
+        return Math.max(internalBrightness, worldBrightness);
+    }
+
+    public float getInternalBrightness(float partialTick)
+    {
+        float b = (float) (Math.sin(this.age * 0.25f) + 1.0f) / 2f;
+        return MathHelper.clamp(b, 0f, 1f);
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2)
+    {
+        float ibr = getInternalBrightness(partialTick);
+        if (ibr < 0.5f) {
+            this.rCol = MathHelper.lerp(this.minR, this.midR, ibr * 2);
+            this.gCol = MathHelper.lerp(this.minG, this.midG, ibr * 2);
+            this.bCol = MathHelper.lerp(this.minB, this.midB, ibr * 2);
+        } else {
+            this.rCol = MathHelper.lerp(this.midR, this.maxR, (ibr - 0.5f) * 2);
+            this.gCol = MathHelper.lerp(this.midG, this.maxG, (ibr - 0.5f) * 2);
+            this.bCol = MathHelper.lerp(this.midB, this.maxB, (ibr - 0.5f) * 2);
+        }
+
+        this.rCol += this.oR;
+        this.gCol += this.oG;
+        this.bCol += this.oB;
+
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    public void renderParticleInGui(Tessellator t, float partialTick) {
+        float ibr = getInternalBrightness(partialTick);
+        if (ibr < 0.5f) {
+            this.rCol = MathHelper.lerp(this.minR, this.midR, ibr * 2);
+            this.gCol = MathHelper.lerp(this.minG, this.midG, ibr * 2);
+            this.bCol = MathHelper.lerp(this.minB, this.midB, ibr * 2);
+        } else {
+            this.rCol = MathHelper.lerp(this.midR, this.maxR, (ibr - 0.5f) * 2);
+            this.gCol = MathHelper.lerp(this.midG, this.maxG, (ibr - 0.5f) * 2);
+            this.bCol = MathHelper.lerp(this.midB, this.maxB, (ibr - 0.5f) * 2);
+        }
+
+        this.rCol += this.oR;
+        this.gCol += this.oG;
+        this.bCol += this.oB;
+
+        float u0 = (float) tex.getIconUMin();
+        float u2 = (float) tex.getSubIconU(1/16f);
+        float v0 = (float) tex.getIconVMin();
+        float v2 = (float) tex.getSubIconV(1/16f);
+        float r = 0.1F * size;
+        float x = (float)(xo + (this.x - xo) * partialTick);
+        float y = (float)(yo + (this.y - yo) * partialTick);
+        float br = 1.0f;
+        if (LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(rCol * br, gCol * br, bCol * br);
+        t.addVertexWithUV(x + r, y - r, 0, u2, v2);
+        t.addVertexWithUV(x + r, y + r, 0, u2, v0);
+        t.addVertexWithUV(x - r, y + r, 0, u0, v0);
+        t.addVertexWithUV(x - r, y - r, 0, u0, v2);
+    }
+    
+    @Override
+    public int getLightmapCoord(float partialTick) {
+    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTick), 15);
+    }
+
+    public void tickGui() {
+        this.sinTimer++;
+        if (this.sinTimer > 100) {
+            this.sinTimer = 0;
+        }
+
+        if (this.age++ >= this.lifetime && getInternalBrightness(1.0F) < 0.01f) {
+            this.remove();
+        }
+
+        this.xo = this.x;
+        this.yo = this.y;
+        this.xd = (MathHelper.sin((this.sinTimer) * 0.15f)) / 60f;
+        this.yd = (MathHelper.cos((this.sinTimer) * 0.15f)) / 60f;
+        if (this.isReversed){
+            this.xd = -this.xd;
+            this.yd = -this.yd;
+        }
+        this.move(this.xd, this.yd, 0);
+    }
+
+    @Override
+    public void tick() {
+        this.sinTimer++;
+        if (this.sinTimer > 100) {
+            sinTimer = 0;
+        }
+
+        if (this.age++ >= this.lifetime && getInternalBrightness(1.0f) < 0.01f) {
+            this.remove();
+        }
+
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        this.xd = (MathHelper.sin(this.sinTimer * 0.15f)) / 60f;
+        this.zd = (MathHelper.cos(this.sinTimer * 0.15f)) / 60f;
+        if (this.isReversed){
+            this.xd = -this.xd;
+            this.yd = -this.yd;
+            this.zd = -this.zd;
+        }
+        this.move(this.xd, this.yd, this.zd);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/entity/particle/FlameParticle.java b/src/main/java/net/minecraft/client/entity/particle/FlameParticle.java
new file mode 100644
index 000000000..1f7b57ff3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/FlameParticle.java
@@ -0,0 +1,75 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class FlameParticle extends Particle {
+    private float oSize;
+
+    public FlameParticle(World world, double x, double y, double z, double xd, double yd, double zd, Type type) {
+        super(world, x, y, z, xd, yd, zd);
+        this.xd = this.xd * 0.01D + xd;
+        this.yd = this.yd * 0.01D + yd;
+        this.zd = this.zd * 0.01D + zd;
+        x += (this.random.nextFloat() - this.random.nextFloat()) * 0.05F;
+        y += (this.random.nextFloat() - this.random.nextFloat()) * 0.05F;
+        z += (this.random.nextFloat() - this.random.nextFloat()) * 0.05F;
+        this.oSize = this.size;
+        this.rCol = this.gCol = this.bCol = 1.0F;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D)) + 4;
+        this.noPhysics = true;
+        this.tex = type.texture;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float s = ((float) age + partialTick) / (float) lifetime;
+        this.size = this.oSize * (1.0F - s * s * 0.5F);
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public float getBrightness(float partialTick) {
+        float decay = MathHelper.clamp(((float) this.age + partialTick) / (float) this.lifetime, 0.0f, 1.0f);
+        return super.getBrightness(partialTick) * decay + (1.0F - decay);
+    }
+    
+    @Override
+    public int getLightmapCoord(float partialTick) {
+    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTick), 15);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        this.move(this.xd, this.yd, this.zd);
+        this.xd *= 0.96D;
+        this.yd *= 0.96D;
+        this.zd *= 0.96D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+    public enum Type {
+    	ORANGE(TextureRegistry.getTexture("minecraft:particle/fire")),
+    	SOUL(TextureRegistry.getTexture("minecraft:particle/fire_soul")),
+    	BLUE(TextureRegistry.getTexture("minecraft:particle/fire_blue"));
+    	
+    	private final IconCoordinate texture;
+    	
+    	Type(IconCoordinate tex) {
+    		this.texture = tex;
+    	}
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/FootstepParticle.java b/src/main/java/net/minecraft/client/entity/particle/FootstepParticle.java
new file mode 100644
index 000000000..c512d7891
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/FootstepParticle.java
@@ -0,0 +1,63 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.client.render.RenderEngine;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+import org.lwjgl.opengl.GL11;
+
+public class FootstepParticle extends Particle {
+    private int life;
+    private int lifeTime;
+    private final RenderEngine renderEngine;
+
+    public FootstepParticle(RenderEngine renderEngine, World world, double x, double y, double z) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.life = 0;
+        this.renderEngine = renderEngine;
+        this.xd = this.yd = this.zd = 0.0D;
+        this.lifeTime = 200;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float time = (life + partialTick) / lifeTime;
+        time *= time;
+        float a = 2.0F - time * 2.0F;
+        if(a > 1.0F) {
+            a = 1.0F;
+        }
+        a *= 0.2F;
+        GL11.glDisable(GL11.GL_LIGHTING);
+        float s = 0.125F;
+        float x = (float)(this.x - xOff);
+        float y = (float)(this.y - yOff);
+        float z = (float)(this.z - zOff);
+        float br = this.world.getLightBrightness(MathHelper.floor(this.x), MathHelper.floor(this.y), MathHelper.floor(this.z));
+        this.renderEngine.bindTexture(this.renderEngine.loadTexture("/assets/minecraft/textures/misc/footprint.png"));
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        t.startDrawingQuads();
+        t.setColorRGBA_F(br, br, br, a);
+        t.addVertexWithUV(x - s, y, z + s, 0.0D, 1.0D);
+        t.addVertexWithUV(x + s, y, z + s, 1.0D, 1.0D);
+        t.addVertexWithUV(x + s, y, z - s, 1.0D, 0.0D);
+        t.addVertexWithUV(x - s, y, z - s, 0.0D, 0.0D);
+        t.draw();
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_LIGHTING);
+    }
+
+    @Override
+	public void tick() {
+        this.life++;
+        if (this.life == this.lifeTime) {
+            this.remove();
+        }
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 3;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/GoldenArrowParticle.java b/src/main/java/net/minecraft/client/entity/particle/GoldenArrowParticle.java
new file mode 100644
index 000000000..d343798e3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/GoldenArrowParticle.java
@@ -0,0 +1,74 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class GoldenArrowParticle extends Particle {
+    float oSize;
+
+    public GoldenArrowParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        this(world, x, y, z, xa, ya, za, 1.0F);
+    }
+
+    public GoldenArrowParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.1D;
+        this.yd *= 0.1D;
+        this.zd *= 0.1D;
+        this.xd += xa;
+        this.yd += ya;
+        this.zd += za;
+        this.rCol = gCol = 0.8f;
+        this.bCol = (float)(Math.random() * 0.3D);
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if (l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0) {
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.yd += 0.004D;
+        this.move(this.xd, this.yd, this.zd);
+        if (this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.96D;
+        this.yd *= 0.96D;
+        this.zd *= 0.96D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/HeartParticle.java b/src/main/java/net/minecraft/client/entity/particle/HeartParticle.java
new file mode 100644
index 000000000..161d5c441
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/HeartParticle.java
@@ -0,0 +1,64 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class HeartParticle extends Particle {
+    float oSize;
+
+    public HeartParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        this(world, x, y, z, xa, ya, za, 2.0F);
+    }
+
+    public HeartParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale)
+    {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.01D;
+        this.yd *= 0.01D;
+        this.zd *= 0.01D;
+        this.yd += 0.1D;
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = 16;
+        this.noPhysics = false;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/heart");
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2)
+    {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if (l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        this.move(this.xd, this.yd, this.zd);
+        if (this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.86D;
+        this.yd *= 0.86D;
+        this.zd *= 0.86D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/LavaParticle.java b/src/main/java/net/minecraft/client/entity/particle/LavaParticle.java
new file mode 100644
index 000000000..602656adf
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/LavaParticle.java
@@ -0,0 +1,59 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class LavaParticle extends Particle {
+    private float oSize;
+
+    public LavaParticle(World world, double x, double y, double z) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.8D;
+        this.yd *= 0.8D;
+        this.zd *= 0.8D;
+        this.yd = this.random.nextFloat() * 0.4F + 0.05F;
+        this.rCol = this.gCol = this.bCol = 1.0F;
+        this.size *= this.random.nextFloat() * 2.0F + 0.2F;
+        this.oSize = this.size;
+        this.lifetime = (int)(16D / (Math.random() * 0.8D + 0.2D));
+        this.noPhysics = false;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/bubble_lava");
+    }
+
+    @Override
+	public float getBrightness(float partialTick) {
+        return 1.0F;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = (this.age + partialTick) / this.lifetime;
+        this.size = this.oSize * (1.0F - l * l);
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            remove();
+        }
+        float odds = this.age / (float) this.lifetime;
+        if (this.random.nextFloat() > odds) {
+            this.world.spawnParticle("smoke", this.x, this.y, this.z, this.xd, this.yd, this.zd, 0);
+        }
+        this.yd -= 0.03D;
+        this.move(this.xd, this.yd, this.zd);
+        this.xd *= 0.999D;
+        this.yd *= 0.999D;
+        this.zd *= 0.999D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/LeafParticle.java b/src/main/java/net/minecraft/client/entity/particle/LeafParticle.java
new file mode 100644
index 000000000..509d371b5
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/LeafParticle.java
@@ -0,0 +1,95 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+
+// Referenced classes of package net.minecraft.src:
+//            EntityFX, Block, Tessellator, World
+
+import net.minecraft.client.render.block.color.BlockColorDispatcher;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.world.World;
+
+public class LeafParticle extends Particle {
+    public LeafParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        super(world, x, y, z, xa, ya, za);
+        this.tex = TextureRegistry.getTexture("minecraft:block/leaves_oak_fancy");
+        this.gravity = 0.125F;
+        this.size /= 2.0F;
+        this.lifetime *= 16;
+        this.yd = 0.0f;
+        this.xd = 0.0f;
+        this.zd = 0.0f;
+    }
+
+    @Override
+    public boolean collidesWithBlock(Block block, int metadata) {
+        return !(block instanceof BaseLeavesBlock);
+    }
+
+    public LeafParticle init(int x, int y, int z)
+    {
+        Block block = Block.blocksList[this.world.getBlockId(x, y, z)];
+        if (!(block instanceof BaseLeavesBlock)) this.remove();
+        int col = BlockColorDispatcher.getInstance().getDispatch(block).getWorldColor(world, x, y, z);
+        this.rCol *= (float)(col >> 16 & 0xff) / 255F;
+        this.gCol *= (float)(col >> 8 & 0xff) / 255F;
+        this.bCol *= (float)(col & 0xff) / 255F;
+        return this;
+    }
+    
+    @Override
+	public void tick() {
+        float windDirection = this.world.worldType.getWindManager().getWindDirection(this.world, (float) this.x, (float) this.y, (float) this.z);
+        float windIntensity = this.world.worldType.getWindManager().getWindIntensity(this.world, (float) this.x, (float) this.y, (float) this.z) * 0.01f;
+
+        float dx = (float) (Math.cos(windDirection * Math.PI * 2) * windIntensity);
+        float dz = (float) (Math.sin(windDirection * Math.PI * 2) * windIntensity);
+        
+        this.xd += dx;
+        this.zd += dz;
+        
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if(this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        this.yd -= 0.04D * this.gravity;
+        if (this.onGround) {
+            this.xd *= 0.0D;
+            this.zd *= 0.0D;
+        }
+        this.move(this.xd, this.yd, this.zd);
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 1;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float u0 = (float) this.tex.getSubIconU(this.uo / 4F);
+        float u2 = (float) this.tex.getSubIconU(0.25f);
+        float v0 = (float) this.tex.getSubIconV(this.uo / 4F);
+        float v2 = (float) this.tex.getSubIconV(0.25f);
+        float r = 0.1F * this.size;
+        float x = (float)(this.xo + (this.x - this.xo) * partialTick - LeafParticle.xOff);
+        float y = (float)(this.yo + (this.y - this.yo) * partialTick - LeafParticle.yOff);
+        float z = (float)(this.zo + (this.z - this.zo) * partialTick - LeafParticle.zOff);
+        float br = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(br * this.rCol, br * this.gCol, br * this.bCol);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u0, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u2, v2);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/NoteParticle.java b/src/main/java/net/minecraft/client/entity/particle/NoteParticle.java
new file mode 100644
index 000000000..682ec57ea
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/NoteParticle.java
@@ -0,0 +1,68 @@
+package net.minecraft.client.entity.particle;
+
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class NoteParticle extends Particle {
+    float oSize;
+
+    public NoteParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        this(world, x, y, z, xa, ya, za, 2.0F);
+    }
+
+    public NoteParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.01D;
+        this.yd *= 0.01D;
+        this.zd *= 0.01D;
+        this.yd += 0.2D;
+        this.rCol = MathHelper.sin(((float)xa + 0.0F) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
+        this.gCol = MathHelper.sin(((float)xa + 1f/3) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
+        this.bCol = MathHelper.sin(((float)xa + 2f/3) * MathHelper.PI * 2.0F) * 0.65F + 0.35F;
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = 6;
+        this.noPhysics = false;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/note");
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if (l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        this.move(this.xd, this.yd, this.zd);
+        if (this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.66D;
+        this.yd *= 0.66D;
+        this.zd *= 0.66D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/Particle.java b/src/main/java/net/minecraft/client/entity/particle/Particle.java
new file mode 100644
index 000000000..bd7c57556
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/Particle.java
@@ -0,0 +1,130 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.util.helper.MathHelper;
+import com.mojang.nbt.CompoundTag;
+import net.minecraft.core.world.World;
+
+public class Particle extends Entity {
+    protected IconCoordinate tex;
+    protected float uo;
+    protected float vo;
+    protected int age;
+    protected int lifetime;
+    protected float size;
+    protected float gravity;
+    protected float rCol;
+    protected float gCol;
+    protected float bCol;
+    public static double xOff;
+    public static double yOff;
+    public static double zOff;
+
+    public Particle(World world, double x, double y, double z, double xa, double ya, double za) {
+        super(world);
+        this.age = 0;
+        this.lifetime = 0;
+        setSize(0.2F, 0.2F);
+        this.heightOffset = this.bbHeight / 2.0F;
+        setPos(x, y, z);
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        this.rCol = this.gCol = this.bCol = 1.0F;
+        this.xd = xa + (float)(Math.random() * 2D - 1.0D) * 0.4F;
+        this.yd = ya + (float)(Math.random() * 2D - 1.0D) * 0.4F;
+        this.zd = za + (float)(Math.random() * 2D - 1.0D) * 0.4F;
+        float speed = (float)(Math.random() + Math.random() + 1.0D) * 0.15F;
+        float dd = MathHelper.sqrt(this.xd * this.xd + this.yd * this.yd + this.zd * this.zd);
+        this.xd = (this.xd / dd) * speed * 0.4D;
+        this.yd = (this.yd / dd) * speed * 0.4D + 0.1D;
+        this.zd = (this.zd / dd) * speed * 0.4D;
+        this.uo = this.random.nextFloat() * 3F;
+        this.vo = this.random.nextFloat() * 3F;
+        this.size = (this.random.nextFloat() * 0.5F + 0.5F) * 2.0F;
+        this.lifetime = (int)(4F / (this.random.nextFloat() * 0.9F + 0.1F));
+        this.age = 0;
+    }
+
+    @Override
+    public boolean isInWaterOrRain() {
+        return false;
+    }
+
+    public Particle setPower(float power) {
+        this.xd *= power;
+        this.yd = (this.yd - 0.1D) * (double)power + 0.1D;
+        this.zd *= power;
+        return this;
+    }
+
+    public Particle setScale(float scale) {
+        setSize(0.2F * scale, 0.2F * scale);
+        this.size *= scale;
+        return this;
+    }
+
+    @Override
+	protected boolean makeStepSound() {
+        return false;
+    }
+
+    @Override
+	protected void defineSynchedData() { }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            remove();
+        }
+        this.yd -= 0.04D * this.gravity;
+        move(this.xd, this.yd, this.zd);
+        this.xd *= 0.98D;
+        this.yd *= 0.98D;
+        this.zd *= 0.98D;
+        if (this.onGround)
+        {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        if (this.tex == null) return;
+        float u0 = (float) this.tex.getIconUMin();
+        float u2 = (float) this.tex.getSubIconU(1);
+        float v0 = (float) this.tex.getIconVMin();
+        float v2 = (float) this.tex.getSubIconV(1);
+        float r = 0.1F * this.size;
+        float x = (float)(this.xo + (this.x - this.xo) * partialTick - Particle.xOff);
+        float y = (float)(this.yo + (this.y - this.yo) * partialTick - Particle.yOff);
+        float z = (float)(this.zo + (this.z - this.zo) * partialTick - Particle.zOff);
+        float br = 1.0f;
+        if (LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2);
+    }
+
+    public int getParticleTexture() {
+        return 0;
+    }
+
+    @Override
+	public void addAdditionalSaveData(CompoundTag tag) { }
+
+    @Override
+	public void readAdditionalSaveData(CompoundTag tag) { }
+}
diff --git a/src/main/java/net/minecraft/client/entity/fx/ParticleDispatcher.java b/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
similarity index 57%
rename from src/main/java/net/minecraft/client/entity/fx/ParticleDispatcher.java
rename to src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
index 847ef2194..957e4322e 100644
--- a/src/main/java/net/minecraft/client/entity/fx/ParticleDispatcher.java
+++ b/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
@@ -1,10 +1,11 @@
-package net.minecraft.client.entity.fx;
+package net.minecraft.client.entity.particle;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.util.dispatch.Dispatcher;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.BlockParticleHelper;
 import net.minecraft.core.util.helper.MathHelper;
 
@@ -27,38 +28,38 @@ public class ParticleDispatcher extends Dispatcher<String, ParticleLambda> {
     }
     private ParticleDispatcher(){
         Minecraft mc = Minecraft.getMinecraft(this);
-        addDispatch("bubble", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityBubbleFX(world, x, y, z, motionX, motionY, motionZ, true));
-        addDispatch("smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntitySmokeFX(world, x, y, z, motionX, motionY, motionX));
-        addDispatch("note", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityNoteFX(world, x, y, z, motionX, motionY, motionX));
-        addDispatch("portal", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityPortalFX(world, x, y, z, motionX, motionY, motionX));
-        addDispatch("explode", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityExplodeFX(world, x, y, z, motionX, motionY, motionX));
-        addDispatch("flame", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFlameFX(world, x, y, z, motionX, motionY, motionX, EntityFlameFX.Type.ORANGE));
-        addDispatch("blueflame", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFlameFX(world, x, y, z, motionX, motionY, motionX, EntityFlameFX.Type.BLUE));
-        addDispatch("soulflame", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFlameFX(world, x, y, z, motionX, motionY, motionX, EntityFlameFX.Type.SOUL));
-        addDispatch("lava", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityLavaFX(world, x, y, z));
-        addDispatch("footstep", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFootStepFX(mc.renderEngine, world, x, y, z));
-        addDispatch("splash", (world1, d, d1, d2, d3, d4, d5, data) -> new EntitySplashFX(world1, d, d1, d2, d3, d4, d5));
-        addDispatch("largesmoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntitySmokeFX(world, x, y, z, motionX, motionY, motionX, 2.5f));
-        addDispatch("reddust", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityReddustFX(world, x, y, z, (float) motionX, (float) motionY, (float) motionZ, data));
-        addDispatch("item", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityItemFX(world, x, y, z, Item.itemsList[MathHelper.clamp(data, 0, Item.itemsList.length - 1)]));
-        addDispatch("block", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityDiggingFX(world, x, y, z,motionX,motionY,motionZ, Block.blocksList[BlockParticleHelper.decodeBlockID(data)], BlockParticleHelper.decodeBlockSide(data), BlockParticleHelper.decodeBlockMeta(data)).setParticleColor((int) x, (int) y, (int) z));
-        addDispatch("snowshovel", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntitySnowShovelFX(world, x, y, z, motionX, motionY, motionX));
-        addDispatch("heart", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityHeartFX(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("bubble", (world, x, y, z, motionX, motionY, motionZ, data) -> new BubbleParticle(world, x, y, z, motionX, motionY, motionZ, true));
+        addDispatch("smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new SmokeParticle(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("note", (world, x, y, z, motionX, motionY, motionZ, data) -> new NoteParticle(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("portal", (world, x, y, z, motionX, motionY, motionZ, data) -> new PortalParticle(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("explode", (world, x, y, z, motionX, motionY, motionZ, data) -> new ExplodeParticle(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("flame", (world, x, y, z, motionX, motionY, motionZ, data) -> new FlameParticle(world, x, y, z, motionX, motionY, motionX, FlameParticle.Type.ORANGE));
+        addDispatch("blueflame", (world, x, y, z, motionX, motionY, motionZ, data) -> new FlameParticle(world, x, y, z, motionX, motionY, motionX, FlameParticle.Type.BLUE));
+        addDispatch("soulflame", (world, x, y, z, motionX, motionY, motionZ, data) -> new FlameParticle(world, x, y, z, motionX, motionY, motionX, FlameParticle.Type.SOUL));
+        addDispatch("lava", (world, x, y, z, motionX, motionY, motionZ, data) -> new LavaParticle(world, x, y, z));
+        addDispatch("footstep", (world, x, y, z, motionX, motionY, motionZ, data) -> new FootstepParticle(mc.renderEngine, world, x, y, z));
+        addDispatch("splash", (world1, d, d1, d2, d3, d4, d5, data) -> new SplashParticle(world1, d, d1, d2, d3, d4, d5));
+        addDispatch("largesmoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new SmokeParticle(world, x, y, z, motionX, motionY, motionX, 2.5f));
+        addDispatch("reddust", (world, x, y, z, motionX, motionY, motionZ, data) -> new RedstoneDustParticle(world, x, y, z, (float) motionX, (float) motionY, (float) motionZ, data));
+        addDispatch("item", (world, x, y, z, motionX, motionY, motionZ, data) -> new BreakingItemParticle(world, x, y, z, Item.itemsList[MathHelper.clamp(data, 0, Item.itemsList.length - 1)]));
+        addDispatch("block", (world, x, y, z, motionX, motionY, motionZ, data) -> new TerrainParticle(world, x, y, z,motionX,motionY,motionZ, Block.blocksList[BlockParticleHelper.decodeBlockID(data)], BlockParticleHelper.decodeBlockSide(data), BlockParticleHelper.decodeBlockMeta(data)).init((int) x, (int) y, (int) z));
+        addDispatch("snowshovel", (world, x, y, z, motionX, motionY, motionZ, data) -> new SnowShovelParticle(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("heart", (world, x, y, z, motionX, motionY, motionZ, data) -> new HeartParticle(world, x, y, z, motionX, motionY, motionX));
         addDispatch("slimechunk", (world, x, y, z, motionX, motionY, motionZ, data) -> {
             if (mc.gameSettings.slimeParticles.value){
-                return new EntitySlimeChunkFX(world, x, y, z, Item.slimeball);
+                return new SlimeChunkParticle(world, x, y, z, Items.SLIMEBALL);
             }
             return null;
         });
-        addDispatch("fireflyGreen", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFireflyFX(world, x, y, z, motionX, motionY, motionX, EntityFireflyCluster.FireflyColor.GREEN.getId()));
-        addDispatch("fireflyBlue", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFireflyFX(world, x, y, z, motionX, motionY, motionX, EntityFireflyCluster.FireflyColor.BLUE.getId()));
-        addDispatch("fireflyOrange", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFireflyFX(world, x, y, z, motionX, motionY, motionX, EntityFireflyCluster.FireflyColor.ORANGE.getId()));
-        addDispatch("fireflyRed", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityFireflyFX(world, x, y, z, motionX, motionY, motionX, EntityFireflyCluster.FireflyColor.RED.getId()));
-        addDispatch("arrowtrail", (world, x, y, z, motionX, motionY, motionZ, data) -> new EntityArrowGoldenFX(world, x, y, z, motionX, motionY, motionX));
+        addDispatch("fireflyGreen", (world, x, y, z, motionX, motionY, motionZ, data) -> new FireflyParticle(world, x, y, z, motionX, motionY, motionX, FireflyClusterMob.FireflyColor.GREEN.getId()));
+        addDispatch("fireflyBlue", (world, x, y, z, motionX, motionY, motionZ, data) -> new FireflyParticle(world, x, y, z, motionX, motionY, motionX, FireflyClusterMob.FireflyColor.BLUE.getId()));
+        addDispatch("fireflyOrange", (world, x, y, z, motionX, motionY, motionZ, data) -> new FireflyParticle(world, x, y, z, motionX, motionY, motionX, FireflyClusterMob.FireflyColor.ORANGE.getId()));
+        addDispatch("fireflyRed", (world, x, y, z, motionX, motionY, motionZ, data) -> new FireflyParticle(world, x, y, z, motionX, motionY, motionX, FireflyClusterMob.FireflyColor.RED.getId()));
+        addDispatch("arrowtrail", (world, x, y, z, motionX, motionY, motionZ, data) -> new GoldenArrowParticle(world, x, y, z, motionX, motionY, motionX));
         addDispatch("fallingleaf", (world, x, y, z, motionX, motionY, motionZ, data) -> {
             int id = world.getBlockId((int)x, (int)y, (int)z);
             if (id != 0){
-                return new EntityLeafFX(world, x, y, z, motionX, motionY, motionX).func_4041_a((int)x, (int)y, (int)z);
+                return new LeafParticle(world, x, y, z, motionX, motionY, motionX).init((int)x, (int)y, (int)z);
             }
             return null;
         });
diff --git a/src/main/java/net/minecraft/client/entity/fx/ParticleLambda.java b/src/main/java/net/minecraft/client/entity/particle/ParticleLambda.java
similarity index 59%
rename from src/main/java/net/minecraft/client/entity/fx/ParticleLambda.java
rename to src/main/java/net/minecraft/client/entity/particle/ParticleLambda.java
index c7307f955..6a2b1afb5 100644
--- a/src/main/java/net/minecraft/client/entity/fx/ParticleLambda.java
+++ b/src/main/java/net/minecraft/client/entity/particle/ParticleLambda.java
@@ -1,8 +1,8 @@
-package net.minecraft.client.entity.fx;
+package net.minecraft.client.entity.particle;
 
 import net.minecraft.core.world.World;
 
 @FunctionalInterface
 public interface ParticleLambda {
-    EntityFX newParticle(World world, double x, double y, double z, double motionX, double motionY, double motionZ, int data);
+    Particle newParticle(World world, double x, double y, double z, double motionX, double motionY, double motionZ, int data);
 }
diff --git a/src/main/java/net/minecraft/client/entity/particle/PortalParticle.java b/src/main/java/net/minecraft/client/entity/particle/PortalParticle.java
new file mode 100644
index 000000000..c15436794
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/PortalParticle.java
@@ -0,0 +1,67 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class PortalParticle extends Particle {
+    private float oSize;
+    private double xStart;
+    private double yStart;
+    private double zStart;
+
+    public PortalParticle(World world, double x, double y, double z, double xd, double yd, double zd)
+    {
+        super(world, x, y, z, xd, yd, zd);
+        this.xd = xd;
+        this.yd = yd;
+        this.zd = zd;
+        this.xStart = this.x = x;
+        this.yStart = this.y = y;
+        this.zStart = this.z = z;
+        float br = this.random.nextFloat() * 0.6F + 0.4F;
+        this.oSize = this.size = random.nextFloat() * 0.2F + 0.5F;
+        this.rCol = this.gCol = this.bCol = 1.0F * br;
+        this.gCol *= 0.3F;
+        this.rCol *= 0.9F;
+        this.lifetime = (int)(Math.random() * 10D) + 40;
+        this.noPhysics = true;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + (int)(Math.random() * 8D));
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float s = (age + partialTick) / lifetime;
+        s = 1.0F - s;
+        s *= s;
+        s = 1.0F - s;
+        this.size = this.oSize * s;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public float getBrightness(float partialTick) {
+        float br = super.getBrightness(partialTick);
+        float pos = (float) this.age / (float) this.lifetime;
+        pos *= pos;
+        pos *= pos;
+        return br * (1.0F - pos) + pos;
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        float pos = this.age / (float) this.lifetime;
+        float a = pos;
+        pos = -pos + pos * pos * 2.0F;
+        pos = 1.0F - pos;
+        this.x = this.xStart + this.xd * pos;
+        this.y = this.yStart + this.yd * pos + (1.0F - a);
+        this.z = this.zStart + this.zd * pos;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/RedstoneDustParticle.java b/src/main/java/net/minecraft/client/entity/particle/RedstoneDustParticle.java
new file mode 100644
index 000000000..7126d32d3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/RedstoneDustParticle.java
@@ -0,0 +1,108 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.enums.LightLayer;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class RedstoneDustParticle extends Particle {
+    float oSize;
+    private int brightness;
+
+    public RedstoneDustParticle(World world, double x, double y, double z, float red, float green, float blue, int brightness) {
+        this(world, x, y, z, 1.0F, red, green, blue, brightness);
+    }
+
+    public RedstoneDustParticle(World world, double x, double y, double z, float scale, float red, float green, float blue, int brightness) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.brightness = -1;
+        if (brightness >= 0){
+            this.brightness = brightness;
+        }
+        this.xd *= 0.1D;
+        this.yd *= 0.1D;
+        this.zd *= 0.1D;
+        float n = (float)Math.random() * 0.4F + 0.6F;
+        this.rCol = ((float)(Math.random() * 0.2D) + 0.8F) * red * n;
+        this.gCol = ((float)(Math.random() * 0.2D) + 0.8F) * green * n;
+        this.bCol = ((float)(Math.random() * 0.2D) + 0.8F) * blue * n;
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if(l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        if (this.tex == null) return;
+
+        float u0 = (float) this.tex.getIconUMin();
+        float u2 = (float) this.tex.getSubIconU(1);
+        float v0 = (float) this.tex.getIconVMin();
+        float v2 = (float) this.tex.getSubIconV(1);
+        float r = 0.1F * this.size;
+        float x = (float)(this.xo + (this.x - this.xo) * partialTick - RedstoneDustParticle.xOff);
+        float y = (float)(this.yo + (this.y - this.yo) * partialTick - RedstoneDustParticle.yOff);
+        float z = (float)(this.zo + (this.z - this.zo) * partialTick - RedstoneDustParticle.zOff);
+        float br = 1f;
+        if(LightmapHelper.isLightmapEnabled()) {
+            int xTile = MathHelper.floor(this.x);
+            int yTile = MathHelper.floor(this.y);
+            int zTile = MathHelper.floor(this.z);
+            int lmc;
+            if (this.brightness >= 0) {
+                lmc = LightmapHelper.getLightmapCoord(this.world.getSavedLightValue(LightLayer.Sky, xTile, yTile, zTile), Math.max(this.world.getSavedLightValue(LightLayer.Block, xTile, yTile, zTile), this.brightness));
+            } else {
+                lmc = getLightmapCoord(partialTick);
+            }
+            t.setLightmapCoord(lmc);
+        } else {
+            br = Math.max(getBrightness(partialTick), this.brightness / 15f);
+        }
+        t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0){
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.move(this.xd, this.yd, this.zd);
+        if(this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.96D;
+        this.yd *= 0.96D;
+        this.zd *= 0.96D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/SlimeChunkParticle.java b/src/main/java/net/minecraft/client/entity/particle/SlimeChunkParticle.java
new file mode 100644
index 000000000..ecf458f3f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/SlimeChunkParticle.java
@@ -0,0 +1,51 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+
+// Referenced classes of package net.minecraft.src:
+//            EntityFX, Item, Block, Tessellator,
+//            World
+
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.world.World;
+
+public class SlimeChunkParticle extends Particle {
+    public SlimeChunkParticle(World world, double x, double y, double z, Item item) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.tex = ItemModelDispatcher.getInstance().getDispatch(item).getIcon(null, item.getDefaultStack());
+        this.gravity = 2;
+        this.rCol = this.gCol = this.bCol = 1.0F;
+        this.size /= 2.0F;
+        this.lifetime = 50;
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 2;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float u0 = (float) this.tex.getSubIconU(this.uo / 4F);
+        float u2 = (float) this.tex.getSubIconU(0.25f + this.uo / 4F);
+        float v0 = (float) this.tex.getSubIconV(this.uo / 4F);
+        float v2 = (float) this.tex.getSubIconV(0.25f + this.uo / 4F);
+        float r = 0.1F * this.size;
+        float x = (float)(this.xo + (this.x - this.xo) * partialTick - SlimeChunkParticle.xOff);
+        float y = (float)(this.yo + (this.y - this.yo) * partialTick - SlimeChunkParticle.yOff);
+        float z = (float)(this.zo + (this.z - this.zo) * partialTick - SlimeChunkParticle.zOff);
+        float br = 1.0f;
+        if (LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(br * this.rCol, br * this.gCol, br * this.bCol);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u0, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u2, v2);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/SmokeParticle.java b/src/main/java/net/minecraft/client/entity/particle/SmokeParticle.java
new file mode 100644
index 000000000..a3eeaac7e
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/SmokeParticle.java
@@ -0,0 +1,72 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class SmokeParticle extends Particle {
+    float oSize;
+
+    public SmokeParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        this(world, x, y, z, xa, ya, za, 1.0F);
+    }
+
+    public SmokeParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.1D;
+        this.yd *= 0.1D;
+        this.zd *= 0.1D;
+        this.xd += xa;
+        this.yd += ya;
+        this.zd += za;
+        this.rCol = this.gCol = this.bCol = (float) (Math.random() * 0.3D);
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = (int) (8D / (Math.random() * 0.8D + 0.2D));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if (l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+    public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0) {
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.yd += 0.004D;
+        this.move(this.xd, this.yd, this.zd);
+        if (this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.96D;
+        this.yd *= 0.96D;
+        this.zd *= 0.96D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/SnowShovelParticle.java b/src/main/java/net/minecraft/client/entity/particle/SnowShovelParticle.java
new file mode 100644
index 000000000..fd46b2775
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/SnowShovelParticle.java
@@ -0,0 +1,70 @@
+package net.minecraft.client.entity.particle;
+
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+
+public class SnowShovelParticle extends Particle {
+    float oSize;
+
+    public SnowShovelParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        this(world, x, y, z, xa, ya, za, 1.0F);
+    }
+
+    public SnowShovelParticle(World world, double x, double y, double z, double xa, double ya, double za, float scale) {
+        super(world, x, y, z, xa, ya, za);
+        this.xd *= 0.1D;
+        this.yd *= 0.1D;
+        this.zd *= 0.1D;
+        this.xd += xa;
+        this.yd += ya;
+        this.zd += za;
+        this.rCol = this.gCol = this.bCol = 1.0F - (float)(Math.random() * 0.3D);
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if(l < 0.0F) {
+            l = 0.0F;
+        }
+        if(l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        super.render(t, partialTick, xa, ya, za, xa2, za2);
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0) {
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.yd -= 0.03D;
+        this.move(this.xd, this.yd, this.zd);
+        this.xd *= 0.99D;
+        this.yd *= 0.99D;
+        this.zd *= 0.99D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/SplashParticle.java b/src/main/java/net/minecraft/client/entity/particle/SplashParticle.java
new file mode 100644
index 000000000..ca68ea9ef
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/SplashParticle.java
@@ -0,0 +1,15 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.core.world.World;
+
+public class SplashParticle extends WaterDropParticle {
+    public SplashParticle(World world, double x, double y, double z, double xa, double ya, double za) {
+        super(world, x, y, z);
+        this.gravity = 0.04F;
+        if (ya == 0.0D && (xa != 0.0D || za != 0.0D)) {
+            this.xd = xa;
+            this.yd = ya + 0.1D;
+            this.zd = za;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/TakeAnimationParticle.java b/src/main/java/net/minecraft/client/entity/particle/TakeAnimationParticle.java
new file mode 100644
index 000000000..dd9252e5f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/TakeAnimationParticle.java
@@ -0,0 +1,69 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.client.render.EntityRenderDispatcher;
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.world.World;
+import org.lwjgl.opengl.GL11;
+
+public class TakeAnimationParticle extends Particle {
+    private Entity item;
+    private Entity target;
+    private int life;
+    private int lifeTime;
+    private float yOffs;
+
+    public TakeAnimationParticle(World world, Entity item, Entity target, float scale) {
+        super(world, item.x, item.y, item.z, item.xd, item.yd, item.zd);
+        this.life = 0;
+        this.lifeTime = 0;
+        this.item = item;
+        this.target = target;
+        this.lifeTime = 3;
+        this.yOffs = scale;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        float time = (this.life + partialTick) / this.lifeTime;
+        time *= time;
+        double xo = item.x;
+        double yo = item.y;
+        double zo = item.z;
+        double xt = target.xo + (target.x - target.xo) * (double) partialTick;
+        double yt = target.yo + (target.y - target.yo) * (double) partialTick + (double) yOffs;
+        double zt = target.zo + (target.z - target.zo) * (double) partialTick;
+        double xx = xo + (xt - xo) * time;
+        double yy = yo + (yt - yo) * time;
+        double zz = zo + (zt - zo) * time;
+        int xTile = MathHelper.floor(xx);
+        int yTile = MathHelper.floor(yy + (double)(this.heightOffset / 2.0F));
+        int zTile = MathHelper.floor(zz);
+        xx -= TakeAnimationParticle.xOff;
+        yy -= TakeAnimationParticle.yOff;
+        zz -= TakeAnimationParticle.zOff;
+        float br = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	LightmapHelper.setLightmapCoord(this.item.world.getLightmapCoord(xTile, yTile, zTile, 0));
+        }else {
+        	br = this.world.getLightBrightness(xTile, yTile, zTile);
+        }
+        GL11.glColor4f(br, br, br, 1.0F);
+        EntityRenderDispatcher.instance.renderEntityWithPosYaw(t, this.item, (float)xx, (float)yy, (float)zz, this.item.yRot, partialTick);
+    }
+
+    @Override
+	public void tick() {
+        this.life++;
+        if (this.life == this.lifeTime) {
+            remove();
+        }
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 3;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/TerrainParticle.java b/src/main/java/net/minecraft/client/entity/particle/TerrainParticle.java
new file mode 100644
index 000000000..721c3bbb0
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/TerrainParticle.java
@@ -0,0 +1,72 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+
+// Referenced classes of package net.minecraft.src:
+//            EntityFX, Block, Tessellator, World
+
+import net.minecraft.client.render.block.color.BlockColorDispatcher;
+import net.minecraft.client.render.block.model.BlockModel;
+import net.minecraft.client.render.block.model.BlockModelDispatcher;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class TerrainParticle extends Particle {
+    private final Block block;
+    private final Side side;
+
+    public TerrainParticle(World world, double x, double y, double z, double xa, double ya, double za, Block block, int side, int meta)
+    {
+        super(world, x, y, z, xa, ya, za);
+        this.side = Side.getSideById(side);
+        this.block = block;
+        this.tex = BlockModelDispatcher.getInstance().getDispatch(block).getParticleTexture(this.side, meta);
+        this.gravity = block != null ? block.blockParticleGravity : 0;
+        this.rCol = this.gCol = this.bCol = 0.6F;
+        this.size /= 2.0F;
+
+    }
+
+    public TerrainParticle init(int x, int y, int z) {
+        int meta = this.world.getBlockMetadata(x, y, z);
+        BlockModel<?> model = BlockModelDispatcher.getInstance().getDispatch(this.block);
+        if (model.shouldSideBeColored(this.world, x, y, z, this.side.getId(), meta)) {
+            int col = BlockColorDispatcher.getInstance().getDispatch(this.block).getWorldColor(this.world, x, y, z);
+            this.rCol *= (col >> 16 & 0xff) / 255F;
+            this.gCol *= (col >> 8 & 0xff) / 255F;
+            this.bCol *= (col & 0xff) / 255F;
+        }
+        return this;
+    }
+
+    @Override
+	public int getParticleTexture() {
+        return 1;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, float xa, float ya, float za, float xa2, float za2) {
+        if (this.tex == null) return;
+        float u0 = (float) this.tex.getSubIconU(this.uo / 4F);
+        float u2 = (float) this.tex.getSubIconU(0.25f + this.uo / 4F);
+        float v0 = (float) this.tex.getSubIconV(this.uo / 4F);
+        float v2 = (float) this.tex.getSubIconV(0.25f + this.uo / 4F);
+        float r = 0.1F * this.size;
+        float x = (float)(this.xo + (this.x - this.xo) * partialTick - TerrainParticle.xOff);
+        float y = (float)(this.yo + (this.y - this.yo) * partialTick - TerrainParticle.yOff);
+        float z = (float)(this.zo + (this.z - this.zo) * partialTick - TerrainParticle.zOff);
+        float br = 1.0f;
+        if (LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        } else {
+        	br = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(br * this.rCol, br * this.gCol, br * this.bCol);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u0, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u2, v2);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/WaterDropParticle.java b/src/main/java/net/minecraft/client/entity/particle/WaterDropParticle.java
new file mode 100644
index 000000000..7f7c7640f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/WaterDropParticle.java
@@ -0,0 +1,54 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class WaterDropParticle extends Particle {
+    public WaterDropParticle(World world, double x, double y, double z) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.xd *= 0.3D;
+        this.yd = (float) Math.random() * 0.2F + 0.1F;
+        this.zd *= 0.3D;
+        this.rCol = 1.0F;
+        this.gCol = 1.0F;
+        this.bCol = 1.0F;
+        this.tex = TextureRegistry.getTexture("minecraft:particle/splash_rain_" + this.random.nextInt(4));
+        this.setSize(0.01F, 0.01F);
+        this.gravity = 0.06F;
+        this.lifetime = (int)(8D / (Math.random() * 0.8D + 0.2D));
+    }
+
+    @Override
+	public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        this.yd -= this.gravity;
+        this.move(this.xd, this.yd, this.zd);
+        this.xd *= 0.98D;
+        this.yd *= 0.98D;
+        this.zd *= 0.98D;
+        if (this.lifetime-- <= 0) {
+            this.remove();
+        }
+        if (this.onGround)
+        {
+            if (Math.random() < 0.5D) {
+                this.remove();
+            }
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+        Material m = this.world.getBlockMaterial(MathHelper.floor(this.x), MathHelper.floor(this.y), MathHelper.floor(this.z));
+        if(m.isLiquid() || m.isSolid()) {
+            double y0 = (MathHelper.floor(this.y) + 1) - FluidBlock.getWaterVolume(this.world.getBlockMetadata(MathHelper.floor(this.x), MathHelper.floor(this.y), MathHelper.floor(this.z)));
+            if(this.y < y0)
+            {
+                remove();
+            }
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java b/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
deleted file mode 100644
index e63d3cfb9..000000000
--- a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
+++ /dev/null
@@ -1,303 +0,0 @@
-package net.minecraft.client.entity.player;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.guidebook.GuiGuidebook;
-import net.minecraft.client.net.handler.NetClientHandler;
-import net.minecraft.core.achievement.stat.Stat;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.net.packet.Packet101CloseWindow;
-import net.minecraft.core.net.packet.Packet107UpdateCreativeInventory;
-import net.minecraft.core.net.packet.Packet108SetHotbarOffset;
-import net.minecraft.core.net.packet.Packet10Flying;
-import net.minecraft.core.net.packet.Packet11PlayerPosition;
-import net.minecraft.core.net.packet.Packet12PlayerLook;
-import net.minecraft.core.net.packet.Packet133OpenGuidebook;
-import net.minecraft.core.net.packet.Packet13PlayerLookMove;
-import net.minecraft.core.net.packet.Packet14BlockDig;
-import net.minecraft.core.net.packet.Packet18Animation;
-import net.minecraft.core.net.packet.Packet19EntityAction;
-import net.minecraft.core.net.packet.Packet250CustomPayload;
-import net.minecraft.core.net.packet.Packet3Chat;
-import net.minecraft.core.net.packet.Packet9Respawn;
-import net.minecraft.core.player.Session;
-import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.util.helper.AES;
-import net.minecraft.core.util.helper.DamageType;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityPlayerSP, MathHelper, World, Packet19EntityAction, 
-//            NetClientHandler, AxisAlignedBB, Packet11PlayerPosition, Packet13PlayerLookMove, 
-//            Packet12PlayerLook, Packet10Flying, Packet14BlockDig, Packet3Chat, 
-//            Packet18Animation, Packet9Respawn, Packet101CloseWindow, Container, 
-//            InventoryPlayer, StatBase, Session, Entity, 
-//            EntityItem
-
-public class EntityClientPlayerMP extends EntityPlayerSP
-{
-
-    public EntityClientPlayerMP(Minecraft minecraft, World world, Session session, NetClientHandler netclienthandler)
-    {
-        super(minecraft, world, session, 0);
-        field_9380_bx = 0;
-        field_21093_bH = false;
-        field_9382_bF = false;
-        wasSneaking = false;
-        field_12242_bI = 0;
-        sendQueue = netclienthandler;
-    }
-
-    @Override
-    public boolean hurt(Entity attacker, int i, DamageType type)
-    {
-        return false;
-    }
-
-    @Override
-	public void heal(int i)
-    {
-    }
-
-    @Override
-	public void tick()
-    {
-        if(!world.isBlockLoaded(MathHelper.floor_double(x), 64, MathHelper.floor_double(z)))
-        {
-            return;
-        } else
-        {
-            super.tick();
-            func_4056_N();
-            return;
-        }
-    }
-
-    public void func_4056_N()
-    {
-        if(field_9380_bx++ == 20)
-        {
-            sendInventoryChanged();
-            field_9380_bx = 0;
-        }
-        boolean flag = isSneaking();
-        if(flag != wasSneaking)
-        {
-            if(flag)
-            {
-                sendQueue.addToSendQueue(new Packet19EntityAction(this, 1));
-            } else
-            {
-                sendQueue.addToSendQueue(new Packet19EntityAction(this, 2));
-            }
-            wasSneaking = flag;
-        }
-        double d = x - oldPosX;
-        double d1 = bb.minY - field_9378_bz;
-        double d2 = y - oldPosY;
-        double d3 = z - oldPosZ;
-        double d4 = yRot - oldRotationYaw;
-        double d5 = xRot - oldRotationPitch;
-        boolean flag1 = d1 != 0.0D || d2 != 0.0D || d != 0.0D || d3 != 0.0D;
-        boolean flag2 = d4 != 0.0D || d5 != 0.0D;
-        if(vehicle != null)
-        {
-            if(flag2)
-            {
-                sendQueue.addToSendQueue(new Packet11PlayerPosition(xd, -999D, -999D, zd, onGround));
-            } else
-            {
-                sendQueue.addToSendQueue(new Packet13PlayerLookMove(xd, -999D, -999D, zd, yRot, xRot, onGround));
-            }
-            flag1 = false;
-        } else
-        if(flag1 && flag2)
-        {
-            sendQueue.addToSendQueue(new Packet13PlayerLookMove(x, bb.minY, y, z, yRot, xRot, onGround));
-            field_12242_bI = 0;
-        } else
-        if(flag1)
-        {
-            sendQueue.addToSendQueue(new Packet11PlayerPosition(x, bb.minY, y, z, onGround));
-            field_12242_bI = 0;
-        } else
-        if(flag2)
-        {
-            sendQueue.addToSendQueue(new Packet12PlayerLook(yRot, xRot, onGround));
-            field_12242_bI = 0;
-        } else
-        {
-            sendQueue.addToSendQueue(new Packet10Flying(onGround));
-            if(field_9382_bF != onGround || field_12242_bI > 200)
-            {
-                field_12242_bI = 0;
-            } else
-            {
-                field_12242_bI++;
-            }
-        }
-        field_9382_bF = onGround;
-        if(flag1)
-        {
-            oldPosX = x;
-            field_9378_bz = bb.minY;
-            oldPosY = y;
-            oldPosZ = z;
-        }
-        if(flag2)
-        {
-            oldRotationYaw = yRot;
-            oldRotationPitch = xRot;
-        }
-    }
-
-    @Override
-    public void dropCurrentItem(boolean dropFullStack) {
-        sendQueue.addToSendQueue(new Packet14BlockDig(dropFullStack ? 5 : 4, 0, 0, 0, Side.NONE, 0.0, 0.0));
-    }
-
-    private void sendInventoryChanged()
-    {
-    }
-
-    @Override
-	protected void joinEntityItemWithWorld(EntityItem entityitem)
-    {
-    }
-
-    @Override
-	public void sendChatMessage(String s)
-    {
-        sendQueue.addToSendQueue(new Packet3Chat(s, AES.clientKeyChain));
-    	addToSendHistory(s);
-    }
-    
-    @Override
-	public void updateCreativeInventory(int page, String searchText)
-    {
-    	sendQueue.addToSendQueue(new Packet107UpdateCreativeInventory(craftingInventory.windowId, page, searchText));
-    }
-
-    @Override
-    public void setHotbarOffset(int offset)
-    {
-        super.setHotbarOffset(offset);
-        sendQueue.addToSendQueue(new Packet108SetHotbarOffset(offset));
-    }
-
-    @Override
-	public void displayGUIGuidebook()
-    {
-        mc.displayGuiScreen(new GuiGuidebook());
-        sendQueue.addToSendQueue(new Packet133OpenGuidebook(mc.currentScreen instanceof GuiGuidebook));
-    }
-
-    @Override
-	public void swingItem()
-    {
-        super.swingItem();
-        sendQueue.addToSendQueue(new Packet18Animation(this, 1));
-    }
-
-    @Override
-	public void respawnPlayer()
-    {
-        sendInventoryChanged();
-        sendQueue.addToSendQueue(new Packet9Respawn((byte)dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(world.worldType)));
-    }
-
-    @Override
-	protected void damageEntity(int i, DamageType damageType)
-    {
-        setHealthRaw(getHealth() - i);
-    }
-
-    @Override
-	public void closeScreen()
-    {
-        sendQueue.addToSendQueue(new Packet101CloseWindow(craftingInventory.windowId));
-        inventory.setHeldItemStack(null);
-        super.closeScreen();
-    }
-
-    @Override
-	public void setHealth(int i)
-    {
-        if(field_21093_bH)
-        {
-            super.setHealth(i);
-        } else
-        {
-            setHealthRaw(i);
-            field_21093_bH = true;
-        }
-    }
-
-    @Override
-	public void addStat(Stat statbase, int i)
-    {
-        if(statbase == null)
-        {
-            return;
-        }
-        if(statbase.clientside)
-        {
-            super.addStat(statbase, i);
-        }
-    }
-    
-    @Override
-	public int getStat(Stat statbase)
-    {
-    	if (statbase.clientside)
-    	{
-    		return super.getStat(statbase);
-    	}
-    	return 0;
-    }
-
-    public void func_27027_b(Stat statbase, int i)
-    {
-        if(statbase == null)
-        {
-            return;
-        }
-        if(!statbase.clientside)
-        {
-            super.addStat(statbase, i);
-        }
-    }
-    
-    @Override
-	public void syncPlacementMode() {
-    	super.syncPlacementMode();
-    	
-    	byte[] data = new byte[4];
-    	data[0] = (byte) (rotationLock != null ? rotationLock.getId() : -1);
-    	data[1] = (byte) (rotationLockHorizontal != null ? rotationLockHorizontal.getId() : -1);
-    	data[2] = (byte) (rotationLockVertical != null ? rotationLockVertical.getId() : -1);
-    	data[3] = (byte) (placementModeOverride != null ? placementModeOverride.index() : -1);
-    	
-    	sendQueue.addToSendQueue(new Packet250CustomPayload("BTA|RotationLock", data));
-    }
-    
-    @Override
-    public void pickBlock(int x, int y, int z) {
-    	sendQueue.addToSendQueue(new Packet14BlockDig(6, x, y, z, Side.NONE, 0.0, 0.0));
-    }
-    public NetClientHandler sendQueue;
-    private int field_9380_bx;
-    private boolean field_21093_bH;
-    private double oldPosX;
-    private double field_9378_bz;
-    private double oldPosY;
-    private double oldPosZ;
-    private float oldRotationYaw;
-    private float oldRotationPitch;
-    private boolean field_9382_bF;
-    private boolean wasSneaking;
-    private int field_12242_bI;
-}
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java b/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
similarity index 79%
rename from src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
rename to src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
index 307acfc02..95b814880 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
+++ b/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
@@ -1,11 +1,9 @@
 package net.minecraft.client.entity.player;
 
-import java.util.List;
-
 import com.mojang.nbt.CompoundTag;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityPickupFX;
+import net.minecraft.client.entity.particle.TakeAnimationParticle;
 import net.minecraft.client.gui.GuiChest;
 import net.minecraft.client.gui.GuiCrafting;
 import net.minecraft.client.gui.GuiDispenser;
@@ -19,20 +17,21 @@ import net.minecraft.client.gui.GuiTrommel;
 import net.minecraft.client.gui.GuiWandPickerMonster;
 import net.minecraft.client.input.PlayerInput;
 import net.minecraft.core.achievement.Achievement;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.client.gui.toasts.AchievementToast;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockPortal;
-import net.minecraft.core.block.entity.TileEntityDispenser;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.block.entity.TileEntityFurnace;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
-import net.minecraft.core.block.entity.TileEntitySign;
-import net.minecraft.core.block.entity.TileEntityTrommel;
+import net.minecraft.core.block.PortalBlock;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
+import net.minecraft.core.block.entity.SignBlockEntity;
+import net.minecraft.core.block.entity.TrommelBlockEntity;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.command.ClientCommandHandler;
 import net.minecraft.core.net.command.ClientPlayerCommandSender;
@@ -42,8 +41,8 @@ import net.minecraft.core.net.command.Commands;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.player.Session;
 import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.GetSkinUrlThread;
 import net.minecraft.core.util.helper.MathHelper;
@@ -51,23 +50,27 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityPlayer, MouseFilter, Session, MovementInput, 
-//            AchievementList, StatFileWriter, GuiAchievement, World, 
-//            SoundManager, AxisAlignedBB, NBTTagCompound, GuiEditSign, 
+//            Player, MouseFilter, Session, MovementInput,
+//            Achievements, StatFileWriter, GuiHudToasts, World,
+//            SoundEngine, AxisAlignedBB, NBTTagCompound, GuiEditSign,
 //            GuiChest, GuiCrafting, GuiFurnace, GuiDispenser, 
 //            EntityPickupFX, EffectRenderer, InventoryPlayer, GuiIngame, 
-//            StatBase, Achievement, MathHelper, TileEntitySign, 
-//            IInventory, TileEntityFurnace, TileEntityDispenser, Entity
+//            StatBase, Achievement, MathHelper, SignBlockEntity,
+//            IInventory, FurnaceBlockEntity, DispenserBlockEntity, Entity
 
-public class EntityPlayerSP extends EntityPlayer
+public class LocalPlayer extends Player
 {
+    public PlayerInput input;
+    protected Minecraft mc;
+    public final ClientPlayerCommandSender sender;
+    protected int sprintTimer;
 
-    public EntityPlayerSP(Minecraft minecraft, World world, Session session, int i)
+    public LocalPlayer(Minecraft minecraft, World world, Session session, int dimension)
     {
         super(world);
         mc = minecraft;
         sender = new ClientPlayerCommandSender(minecraft, this);
-        dimension = i;
+        this.dimension = dimension;
         username = session.username;
         
         new GetSkinUrlThread(this);
@@ -96,9 +99,9 @@ public class EntityPlayerSP extends EntityPlayer
     }
 
     @Override
-    public void updatePlayerActionState()
+    public void updateAI()
     {
-        super.updatePlayerActionState();
+        super.updateAI();
         moveStrafing = input.moveStrafe;
         moveForward = input.moveForward;
         isJumping = input.jump;
@@ -109,7 +112,7 @@ public class EntityPlayerSP extends EntityPlayer
     {
         this.gamemode = gamemode;
 
-        ContainerPlayer newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
+        InventoryMenu newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
         if (craftingInventory == inventorySlots)
         {
             craftingInventory = newContainer;
@@ -131,19 +134,20 @@ public class EntityPlayerSP extends EntityPlayer
             sprintTimer--;
         }
 
-        if (!this.mc.statsCounter.isAchievementUnlocked(AchievementList.OPEN_INVENTORY) &&
-                !this.mc.guiAchievement.isDisplayingAchievement(AchievementList.OPEN_INVENTORY)
-        )
+        AchievementToast invToast = new AchievementToast(Achievements.OPEN_INVENTORY, true);
+        AchievementToast guideToast = new AchievementToast(Achievements.OPEN_GUIDEBOOK, true);
+
+        if (!this.mc.statsCounter.isUnlocked(Achievements.OPEN_INVENTORY) && !this.mc.guiAchievementToast.isDisplayingToast(invToast))
         {
-            this.mc.guiAchievement.queueAchievementInformation(AchievementList.OPEN_INVENTORY);
+            this.mc.guiAchievementToast.addToast(invToast);
         }
-        if (this.mc.statsCounter.isAchievementUnlocked(AchievementList.OPEN_INVENTORY) &&
-                !this.mc.statsCounter.isAchievementUnlocked(AchievementList.OPEN_GUIDEBOOK) &&
-                !this.mc.guiAchievement.isDisplayingAchievement(AchievementList.OPEN_INVENTORY) &&
-                !this.mc.guiAchievement.isDisplayingAchievement(AchievementList.OPEN_GUIDEBOOK)
+        if (/*this.mc.statsCounter.isUnlocked(Achievements.OPEN_INVENTORY) &&*/
+                !this.mc.statsCounter.isUnlocked(Achievements.OPEN_GUIDEBOOK) &&
+//                !this.mc.guiAchievementToast.isDisplayingToast(invToast) &&
+                !this.mc.guiAchievementToast.isDisplayingToast(guideToast)
         )
         {
-            this.mc.guiAchievement.queueAchievementInformation(AchievementList.OPEN_GUIDEBOOK);
+            this.mc.guiAchievementToast.addToast(guideToast);
         }
 
         prevTimeInPortal = timeInPortal;
@@ -169,7 +173,7 @@ public class EntityPlayerSP extends EntityPlayer
                 {
                     timeUntilPortal = 10;
                     mc.sndManager.playSound("portal.travel", SoundCategory.WORLD_SOUNDS, 1.0F, random.nextFloat() * 0.4F + 0.8F);
-                    int targetDim = ((BlockPortal) Block.blocksList[portalID]).targetDimension;
+                    int targetDim = ((PortalBlock) Block.blocksList[portalID]).targetDimension;
                     if (dimension == targetDim)
                     {
                         mc.usePortal(0);
@@ -264,19 +268,19 @@ public class EntityPlayerSP extends EntityPlayer
     }
 
     @Override
-    public void displayGUIEditSign(TileEntitySign tileentitysign)
+    public void displayGUIEditSign(SignBlockEntity tileentitysign)
     {
         mc.displayGuiScreen(new GuiEditSign(tileentitysign));
     }
 
     @Override
-    public void displayGUIEditFlag(TileEntityFlag tileEntityFlag)
+    public void displayGUIEditFlag(FlagBlockEntity tileEntityFlag)
     {
         mc.displayGuiScreen(new GuiEditFlag(this, tileEntityFlag));
     }
 
     @Override
-    public void displayGUIChest(IInventory iinventory)
+    public void displayGUIChest(Container iinventory)
     {
         mc.displayGuiScreen(new GuiChest(inventory, iinventory));
     }
@@ -301,7 +305,7 @@ public class EntityPlayerSP extends EntityPlayer
 
     @Override
     public void displayGUIMobSpawnerPicker(int x, int y, int z) {
-        String currentMobId = ((TileEntityMobSpawner) world.getBlockTileEntity(x, y, z)).getMobId();
+        String currentMobId = ((MobSpawnerBlockEntity) world.getBlockEntity(x, y, z)).getMobId();
         mc.displayGuiScreen(new GuiPickMonster(currentMobId, x, y, z));
     }
     @Override
@@ -311,19 +315,19 @@ public class EntityPlayerSP extends EntityPlayer
     }
 
     @Override
-    public void displayGUIFurnace(TileEntityFurnace tileentityfurnace)
+    public void displayGUIFurnace(FurnaceBlockEntity tileentityfurnace)
     {
         mc.displayGuiScreen(new GuiFurnace(inventory, tileentityfurnace));
     }
 
     @Override
-    public void displayGUITrommel(TileEntityTrommel tileEntityTrommel)
+    public void displayGUITrommel(TrommelBlockEntity tileEntityTrommel)
     {
         mc.displayGuiScreen(new GuiTrommel(inventory, tileEntityTrommel));
     }
 
     @Override
-    public void displayGUIDispenser(TileEntityDispenser tileentitydispenser)
+    public void displayGUIDispenser(DispenserBlockEntity tileentitydispenser)
     {
         mc.displayGuiScreen(new GuiDispenser(inventory, tileentitydispenser));
     }
@@ -335,10 +339,10 @@ public class EntityPlayerSP extends EntityPlayer
     }
 
     @Override
-    public void onItemPickup(Entity entity, int i)
+    public void onItemPickup(Entity entity, ItemStack item)
     {
-        addStat(StatList.pickUpItemStats[i], 1);
-        mc.effectRenderer.addEffect(new EntityPickupFX(mc.theWorld, entity, this, -0.5F));
+        addStat(item.getItem().getStat(StatList.STAT_PICKED_UP), 1);
+        mc.effectRenderer.addEffect(new TakeAnimationParticle(mc.theWorld, entity, this, -0.5F));
     }
 
     public int getPlayerProtectionAmount()
@@ -436,26 +440,24 @@ public class EntityPlayerSP extends EntityPlayer
     }
     
     @Override
-    public void addStat(Stat statbase, int i)
+    public void addStat(Stat stat, int i)
     {
-        if(statbase == null)
-        {
+        if(stat == null) {
             return;
         }
-        if(statbase.isAchievement())
-        {
-            Achievement achievement = (Achievement)statbase;
-            if(achievement.parent == null || mc.statsCounter.isAchievementUnlocked(achievement.parent))
+        if(stat.isAchievement()) {
+            Achievement achievement = (Achievement)stat;
+            if(achievement.parent == null || mc.statsCounter.isUnlocked(achievement.parent))
             {
-                if(!mc.statsCounter.isAchievementUnlocked(achievement))
+                if(!mc.statsCounter.isUnlocked(achievement))
                 {
-                    mc.guiAchievement.queueTakenAchievement(achievement);
+                    mc.guiAchievementToast.addToast(new AchievementToast(achievement, false));
                 }
-                mc.statsCounter.addValueToStat(statbase, i);
+                mc.statsCounter.add(stat, i);
             }
         } else
         {
-            mc.statsCounter.addValueToStat(statbase, i);
+            mc.statsCounter.add(stat, i);
         }
     }
     
@@ -474,9 +476,9 @@ public class EntityPlayerSP extends EntityPlayer
     protected boolean checkInTile(double d, double d1, double d2)
     {
         if (noPhysics) return false;
-        int i = MathHelper.floor_double(d);
-        int j = MathHelper.floor_double(d1);
-        int k = MathHelper.floor_double(d2);
+        int i = MathHelper.floor(d);
+        int j = MathHelper.floor(d1);
+        int k = MathHelper.floor(d2);
         double d3 = d - (double)i;
         double d4 = d2 - (double)k;
         if(isBlockTranslucent(i, j, k) || (isBlockTranslucent(i, j + 1, k) && !isDwarf))
@@ -542,9 +544,4 @@ public class EntityPlayerSP extends EntityPlayer
 		mc.ingameGUI.guiHeldItemTooltip.setString(message);
 	}
 
-    public PlayerInput input;
-    protected Minecraft mc;
-    protected List<Command> allowedCommands;
-    public final ClientPlayerCommandSender sender;
-    protected int sprintTimer;
 }
diff --git a/src/main/java/net/minecraft/client/entity/player/MultiplayerLocalPlayer.java b/src/main/java/net/minecraft/client/entity/player/MultiplayerLocalPlayer.java
new file mode 100644
index 000000000..66adcb25e
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/player/MultiplayerLocalPlayer.java
@@ -0,0 +1,277 @@
+package net.minecraft.client.entity.player;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.guidebook.GuiGuidebook;
+import net.minecraft.client.net.handler.ClientPacketHandler;
+import net.minecraft.core.achievement.stat.Stat;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.net.packet.ChatPacket;
+import net.minecraft.core.net.packet.PlayerCommandPacket;
+import net.minecraft.core.net.packet.MovePlayerPacket;
+import net.minecraft.core.net.packet.ContainerClosePacket;
+import net.minecraft.core.net.packet.UpdateCreativeInventoryPacket;
+import net.minecraft.core.net.packet.SetHotbarOffsetPacket;
+import net.minecraft.core.net.packet.GuidebookPacket;
+import net.minecraft.core.net.packet.PlayerActionPacket;
+import net.minecraft.core.net.packet.AnimatePacket;
+import net.minecraft.core.net.packet.CustomPayloadPacket;
+import net.minecraft.core.net.packet.RespawnPacket;
+import net.minecraft.core.player.Session;
+import net.minecraft.core.util.helper.AES;
+import net.minecraft.core.util.helper.DamageType;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+public class MultiplayerLocalPlayer extends LocalPlayer
+{
+    public ClientPacketHandler sendQueue;
+    private int lastInventorySendTime;
+    private boolean flashOnSetHealth;
+    private double oldPosX;
+    private double oldPosY1;
+    private double oldPosY2;
+    private double oldPosZ;
+    private float oldRotationYaw;
+    private float oldRotationPitch;
+    private boolean wasOnGround;
+    private boolean wasSneaking;
+    private int noSendTime;
+
+    public MultiplayerLocalPlayer(Minecraft minecraft, World world, Session session, ClientPacketHandler netclienthandler)
+    {
+        super(minecraft, world, session, 0);
+        lastInventorySendTime = 0;
+        flashOnSetHealth = false;
+        wasOnGround = false;
+        wasSneaking = false;
+        noSendTime = 0;
+        sendQueue = netclienthandler;
+    }
+
+    @Override
+    public boolean hurt(Entity attacker, int i, DamageType type)
+    {
+        return false;
+    }
+
+    @Override
+	public void heal(int i)
+    {
+    }
+
+    @Override
+	public void tick()
+    {
+        if(!world.isBlockLoaded(MathHelper.floor(x), 64, MathHelper.floor(z)))
+        {
+            return;
+        } else
+        {
+            super.tick();
+            sendPosition();
+            return;
+        }
+    }
+
+    public void sendPosition()
+    {
+        if(lastInventorySendTime++ == 20)
+        {
+            sendInventoryChanged();
+            lastInventorySendTime = 0;
+        }
+        boolean flag = isSneaking();
+        if(flag != wasSneaking)
+        {
+            if(flag)
+            {
+                sendQueue.addToSendQueue(new PlayerCommandPacket(this, 1));
+            } else
+            {
+                sendQueue.addToSendQueue(new PlayerCommandPacket(this, 2));
+            }
+            wasSneaking = flag;
+        }
+        double d = x - oldPosX;
+        double d1 = bb.minY - oldPosY1;
+        double d2 = y - oldPosY2;
+        double d3 = z - oldPosZ;
+        double d4 = yRot - oldRotationYaw;
+        double d5 = xRot - oldRotationPitch;
+        boolean flag1 = d1 != 0.0D || d2 != 0.0D || d != 0.0D || d3 != 0.0D;
+        boolean flag2 = d4 != 0.0D || d5 != 0.0D;
+        if(vehicle != null)
+        {
+            if(flag2)
+            {
+                sendQueue.addToSendQueue(new MovePlayerPacket.Pos(xd, -999D, -999D, zd, onGround));
+            } else
+            {
+                sendQueue.addToSendQueue(new MovePlayerPacket.PosRot(xd, -999D, -999D, zd, yRot, xRot, onGround));
+            }
+            flag1 = false;
+        } else
+        if(flag1 && flag2)
+        {
+            sendQueue.addToSendQueue(new MovePlayerPacket.PosRot(x, bb.minY, y, z, yRot, xRot, onGround));
+            noSendTime = 0;
+        } else
+        if(flag1)
+        {
+            sendQueue.addToSendQueue(new MovePlayerPacket.Pos(x, bb.minY, y, z, onGround));
+            noSendTime = 0;
+        } else
+        if(flag2)
+        {
+            sendQueue.addToSendQueue(new MovePlayerPacket.Rot(yRot, xRot, onGround));
+            noSendTime = 0;
+        } else
+        {
+            sendQueue.addToSendQueue(new MovePlayerPacket(onGround));
+            if(wasOnGround != onGround || noSendTime > 200)
+            {
+                noSendTime = 0;
+            } else
+            {
+                noSendTime++;
+            }
+        }
+        wasOnGround = onGround;
+        if(flag1)
+        {
+            oldPosX = x;
+            oldPosY1 = bb.minY;
+            oldPosY2 = y;
+            oldPosZ = z;
+        }
+        if(flag2)
+        {
+            oldRotationYaw = yRot;
+            oldRotationPitch = xRot;
+        }
+    }
+
+    @Override
+    public void dropCurrentItem(boolean dropFullStack) {
+        sendQueue.addToSendQueue(new PlayerActionPacket(dropFullStack ? 5 : 4, 0, 0, 0, Side.NONE, 0.0, 0.0));
+    }
+
+    private void sendInventoryChanged()
+    {
+    }
+
+    @Override
+	protected void joinEntityItemWithWorld(ItemEntity entityitem)
+    {
+    }
+
+    @Override
+	public void sendChatMessage(String s)
+    {
+        sendQueue.addToSendQueue(new ChatPacket(s, AES.clientKeyChain));
+    	addToSendHistory(s);
+    }
+    
+    @Override
+	public void updateCreativeInventory(int page, String searchText)
+    {
+    	sendQueue.addToSendQueue(new UpdateCreativeInventoryPacket(craftingInventory.containerId, page, searchText));
+    }
+
+    @Override
+    public void setHotbarOffset(int offset)
+    {
+        super.setHotbarOffset(offset);
+        sendQueue.addToSendQueue(new SetHotbarOffsetPacket(offset));
+    }
+
+    @Override
+	public void displayGUIGuidebook()
+    {
+        mc.displayGuiScreen(new GuiGuidebook());
+        sendQueue.addToSendQueue(new GuidebookPacket(mc.currentScreen instanceof GuiGuidebook));
+    }
+
+    @Override
+	public void swingItem()
+    {
+        super.swingItem();
+        sendQueue.addToSendQueue(new AnimatePacket(this, 1));
+    }
+
+    @Override
+	public void respawnPlayer()
+    {
+        sendInventoryChanged();
+        sendQueue.addToSendQueue(new RespawnPacket((byte)dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(world.worldType)));
+    }
+
+    @Override
+	protected void damageEntity(int i, DamageType damageType)
+    {
+        setHealthRaw(getHealth() - i);
+    }
+
+    @Override
+	public void closeScreen()
+    {
+        sendQueue.addToSendQueue(new ContainerClosePacket(craftingInventory.containerId));
+        inventory.setHeldItemStack(null);
+        super.closeScreen();
+    }
+
+    @Override
+	public void setHealth(int i)
+    {
+        if(flashOnSetHealth)
+        {
+            super.setHealth(i);
+        } else
+        {
+            setHealthRaw(i);
+            flashOnSetHealth = true;
+        }
+    }
+
+    @Override
+	public void addStat(Stat stat, int i)
+    {
+        if(stat == null) {
+            return;
+        }
+        if(stat.clientside)
+        {
+            super.addStat(stat, i);
+        }
+    }
+    
+    @Override
+	public int getStat(Stat statbase)
+    {
+    	if (statbase.clientside)
+    	{
+    		return super.getStat(statbase);
+    	}
+    	return 0;
+    }
+    
+    @Override
+	public void syncPlacementMode() {
+    	super.syncPlacementMode();
+    	
+    	byte[] data = new byte[4];
+    	data[0] = (byte) (rotationLock != null ? rotationLock.getId() : -1);
+    	data[1] = (byte) (rotationLockHorizontal != null ? rotationLockHorizontal.getId() : -1);
+    	data[2] = (byte) (rotationLockVertical != null ? rotationLockVertical.getId() : -1);
+    	data[3] = (byte) (placementModeOverride != null ? placementModeOverride.index() : -1);
+    	
+    	sendQueue.addToSendQueue(new CustomPayloadPacket("BTA|RotationLock", data));
+    }
+    
+    @Override
+    public void pickBlock(int x, int y, int z) {
+    	sendQueue.addToSendQueue(new PlayerActionPacket(6, x, y, z, Side.NONE, 0.0, 0.0));
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityOtherPlayerMP.java b/src/main/java/net/minecraft/client/entity/player/RemotePlayer.java
similarity index 73%
rename from src/main/java/net/minecraft/client/entity/player/EntityOtherPlayerMP.java
rename to src/main/java/net/minecraft/client/entity/player/RemotePlayer.java
index c46763e1e..8d599b232 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityOtherPlayerMP.java
+++ b/src/main/java/net/minecraft/client/entity/player/RemotePlayer.java
@@ -2,11 +2,11 @@ package net.minecraft.client.entity.player;
 
 
 // Referenced classes of package net.minecraft.src:
-//            EntityPlayer, MathHelper, ItemStack, InventoryPlayer, 
+//            Player, MathHelper, ItemStack, InventoryPlayer,
 //            World, Entity
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
@@ -14,18 +14,24 @@ import net.minecraft.core.world.World;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.GetSkinUrlThread;
 
-public class EntityOtherPlayerMP extends EntityPlayer
+public class RemotePlayer extends Player
 {
-
-    public EntityOtherPlayerMP(World world, String s)
+    private int lerpSteps;
+    private double lerpX;
+    private double lerpY;
+    private double lerpZ;
+    private double lerpYRot;
+    private double lerpXRot;
+//    float fallTime;
+    public RemotePlayer(World world, String username)
     {
         super(world);
-        field_20924_a = 0.0F;
-        username = s;
+//        fallTime = 0.0F;
+        this.username = username;
         heightOffset = 0.0F;
         footSize = 0.0F;
         noPhysics = true;
-        field_22062_y = 0.25F;
+        sleepOffY = 0.25F;
         viewScale = 10D;
         
         new GetSkinUrlThread(this);
@@ -52,25 +58,25 @@ public class EntityOtherPlayerMP extends EntityPlayer
         lerpZ = z;
         lerpYRot = yRot;
         lerpXRot = xRot;
-        lerpTicks = ticks;
+        lerpSteps = ticks;
     }
 
     @Override
 	public void tick()
     {
-        field_22062_y = 0.0F;
+        sleepOffY = 0.0F;
         super.tick();
-        prevLimbYaw = limbYaw;
+        walkAnimSpeedO = walkAnimSpeed;
         xd = x - xo;
         yd = y - yo;
         zd = z - zo;
-        float f = MathHelper.sqrt_double(xd * xd + zd * zd) * 4F;
+        float f = MathHelper.sqrt(xd * xd + zd * zd) * 4F;
         if(f > 1.0F)
         {
             f = 1.0F;
         }
-        limbYaw += (f - limbYaw) * 0.4F;
-        limbSwing += limbYaw;
+        walkAnimSpeed += (f - walkAnimSpeed) * 0.4F;
+        walkAnimPos += walkAnimSpeed;
     }
 
     @Override
@@ -87,21 +93,21 @@ public class EntityOtherPlayerMP extends EntityPlayer
     @Override
 	public void onLivingUpdate()
     {
-        super.updatePlayerActionState();
-        if(lerpTicks > 0)
+        super.updateAI();
+        if(lerpSteps > 0)
         {
-            double d = x + (lerpX - x) / (double) lerpTicks;
-            double d1 = y + (lerpY - y) / (double) lerpTicks;
-            double d2 = z + (lerpZ - z) / (double) lerpTicks;
+            double d = x + (lerpX - x) / (double) lerpSteps;
+            double d1 = y + (lerpY - y) / (double) lerpSteps;
+            double d2 = z + (lerpZ - z) / (double) lerpSteps;
             double d3 = MathHelper.normalizeRotation(lerpYRot - (double) yRot);
-            yRot += d3 / (double) lerpTicks;
-            xRot += (lerpXRot - (double) xRot) / (double) lerpTicks;
-            lerpTicks--;
+            yRot += d3 / (double) lerpSteps;
+            xRot += (lerpXRot - (double) xRot) / (double) lerpSteps;
+            lerpSteps--;
             setPos(d, d1, d2);
             setRot(yRot, xRot);
         }
         cameraVelocityOld = cameraVelocity;
-        float horizontalSpeed = MathHelper.sqrt_double(xd * xd + zd * zd);
+        float horizontalSpeed = MathHelper.sqrt(xd * xd + zd * zd);
         float f1 = (float) Math.atan(-yd * 0.2D) * 15F;
         if(horizontalSpeed > 0.1F)
         {
@@ -149,12 +155,4 @@ public class EntityOtherPlayerMP extends EntityPlayer
 	public void sendStatusMessage(String message) {
 		
 	}
-
-    private int lerpTicks;
-    private double lerpX;
-    private double lerpY;
-    private double lerpZ;
-    private double lerpYRot;
-    private double lerpXRot;
-    float field_20924_a;
 }
diff --git a/src/main/java/net/minecraft/client/gui/ControllerGlyphRenderer.java b/src/main/java/net/minecraft/client/gui/ControllerGlyphRenderer.java
new file mode 100644
index 000000000..a6f630e3d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/ControllerGlyphRenderer.java
@@ -0,0 +1,119 @@
+package net.minecraft.client.gui;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.input.controller.Button;
+import net.minecraft.client.input.controller.ControllerInput;
+
+public class ControllerGlyphRenderer extends Gui {
+    private final Minecraft minecraft;
+
+    public ControllerGlyphRenderer(Minecraft minecraft) {
+        this.minecraft = minecraft;
+    }
+
+    public void drawButton(ControllerInput controller, Button button, int x, int y, boolean pressed) {
+        int u = getButtonU(controller, button);
+        int v = getButtonV(controller, button);
+        int sizeU = getButtonSizeU(controller, button);
+        int sizeV = getButtonSizeV(controller, button);
+        int vOffset = 0;
+        if (pressed) {
+            vOffset = sizeV;
+        }
+
+
+        minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
+
+        drawTexturedModalRect(x, y, u, v + vOffset, sizeU, sizeV);
+    }
+
+    public void drawDPad(ControllerInput controllerInput, int x, int y, boolean up, boolean right, boolean down, boolean left) {
+        int u = 0;
+        int v = 72;
+        int sizeU = 46;
+        int sizeV = 46;
+
+        minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/controller/" + controllerInput.getType().getAssetName() + ".png").bind();
+
+        drawTexturedModalRect(x, y, u, v, sizeU, sizeV);
+
+        if (up) {
+            drawTexturedModalRect(x, y, 46, 72, 46, 15);
+        }
+        if (right) {
+            drawTexturedModalRect(x + 31, y, 77, 72, 15, 46);
+        }
+        if (down) {
+            drawTexturedModalRect(x, y + 31, 46, 103, 46, 15);
+        }
+        if (left) {
+            drawTexturedModalRect(x, y, 46, 72, 15, 46);
+        }
+    }
+
+    private int getButtonU(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.digitalPad.up) {
+            return 0;
+        } else if (button == controller.buttonB || button == controller.digitalPad.right) {
+            return 18;
+        } else if (button == controller.buttonX || button == controller.digitalPad.down) {
+            return 36;
+        } else if (button == controller.buttonY || button == controller.digitalPad.left) {
+            return 54;
+        } else if (button == controller.buttonLeftShoulder) {
+            return 97;
+        } else if (button == controller.buttonRightShoulder) {
+            return 72;
+        } else if (button == controller.buttonLeftTrigger) {
+            return 139;
+        } else if (button == controller.buttonRightTrigger) {
+            return 122;
+        } else if (button == controller.buttonStart) {
+            return 72;
+        } else if (button == controller.buttonBack) {
+            return 87;
+        } else {
+            return 0;
+        }
+    }
+
+    private int getButtonV(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder || button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 0;
+        } else if (button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 36;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 26;
+        } else {
+            return 0;
+        }
+    }
+
+    public int getButtonSizeU(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 18;
+        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
+            return 25;
+        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 17;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 15;
+        } else {
+            return 0;
+        }
+    }
+
+    public int getButtonSizeV(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 18;
+        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
+            return 13;
+        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 15;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 15;
+        } else {
+            return 0;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/Gui.java b/src/main/java/net/minecraft/client/gui/Gui.java
index 73c52c8db..f7256c09a 100644
--- a/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/src/main/java/net/minecraft/client/gui/Gui.java
@@ -5,11 +5,18 @@ import static org.lwjgl.opengl.GL11.*;
 import net.minecraft.client.lang.text.Text;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.Texture;
+import net.minecraft.client.render.texture.meta.gui.GuiTextureProperties;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
+import java.util.Objects;
+
 public class Gui
 {
 
@@ -29,6 +36,17 @@ public class Gui
         drawRect(minX, minY, maxX + 1, minY + 1, argb);
     }
 
+    protected void drawLineHorizontalDouble(double minX, double maxX, double minY, int argb)
+    {
+        if(maxX < minX)
+        {
+            double temp = minX;
+            minX = maxX;
+            maxX = temp;
+        }
+        drawRectDouble(minX, minY, maxX + 1, minY + 1, argb);
+    }
+
     protected void drawLineVertical(int minX, int minY, int maxY, int argb)
     {
         if(maxY < minY)
@@ -40,6 +58,17 @@ public class Gui
         drawRect(minX, minY + 1, minX + 1, maxY, argb);
     }
 
+    protected void drawLineVerticalDouble(double minX, double minY, double maxY, int argb)
+    {
+        if(maxY < minY)
+        {
+            double temp = minY;
+            minY = maxY;
+            maxY = temp;
+        }
+        drawRectDouble(minX, minY + 1, minX + 1, maxY, argb);
+    }
+
     protected void drawRect(int minX, int minY, int maxX, int maxY, int argb)
     {
         if(minX < maxX)
@@ -64,10 +93,42 @@ public class Gui
         GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         GL11.glColor4f(r, g, b, a);
         tessellator.startDrawingQuads();
-        tessellator.addVertex(minX, maxY, 0.0D);
-        tessellator.addVertex(maxX, maxY, 0.0D);
-        tessellator.addVertex(maxX, minY, 0.0D);
-        tessellator.addVertex(minX, minY, 0.0D);
+        tessellator.addVertex(minX, maxY, zLevel);
+        tessellator.addVertex(maxX, maxY, zLevel);
+        tessellator.addVertex(maxX, minY, zLevel);
+        tessellator.addVertex(minX, minY, zLevel);
+        tessellator.draw();
+        GL11.glEnable(GL_TEXTURE_2D);
+        GL11.glDisable(GL_BLEND);
+    }
+    protected void drawRectDouble(double minX, double minY, double maxX, double maxY, int argb)
+    {
+        if(minX < maxX)
+        {
+            double temp = minX;
+            minX = maxX;
+            maxX = temp;
+        }
+        if(minY < maxY)
+        {
+            double temp = minY;
+            minY = maxY;
+            maxY = temp;
+        }
+        float a = (float)(argb >> 24 & 0xff) / 255F;
+        float r = (float)(argb >> 16 & 0xff) / 255F;
+        float g = (float)(argb >> 8 & 0xff) / 255F;
+        float b = (float)(argb & 0xff) / 255F;
+        Tessellator tessellator = Tessellator.instance;
+        GL11.glEnable(GL_BLEND);
+        GL11.glDisable(GL_TEXTURE_2D);
+        GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        GL11.glColor4f(r, g, b, a);
+        tessellator.startDrawingQuads();
+        tessellator.addVertex(minX, maxY, zLevel);
+        tessellator.addVertex(maxX, maxY, zLevel);
+        tessellator.addVertex(maxX, minY, zLevel);
+        tessellator.addVertex(minX, minY, zLevel);
         tessellator.draw();
         GL11.glEnable(GL_TEXTURE_2D);
         GL11.glDisable(GL_BLEND);
@@ -203,20 +264,71 @@ public class Gui
         float vScale = 0.00390625F;
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (float)(u + 0) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width, y + height, zLevel, (float)(u + width) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (float)(u + width) * uScale, (float)(v + 0) * vScale);
-        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (float)(u + 0) * uScale, (float)(v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (u + 0) * uScale, (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width, y + height, zLevel, (u + width) * uScale, (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (u + width) * uScale, (v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (u + 0) * uScale, (v + 0) * vScale);
         tessellator.draw();
     }
     public void drawTexturedModalRect(int x, int y, int u, int v, int width, int height, double uScale, double vScale)
     {
+        final double off = 0.05d;
+        Tessellator tessellator = Tessellator.instance;
+        tessellator.startDrawingQuads();
+        tessellator.addVertexWithUV(x - off,        y + height + off,   zLevel, (u + 0) * uScale,        (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y + height + off,   zLevel, (u + width) * uScale,    (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y - off,            zLevel, (u + width) * uScale,    (v + 0) * vScale);
+        tessellator.addVertexWithUV(x - off,        y - off,            zLevel, (u + 0) * uScale,        (v + 0) * vScale);
+        tessellator.draw();
+    }
+    public void drawTexturedModalRectDouble(double x, double y, double u, double v, double width, double height, double uScale, double vScale)
+    {
+        final double off = 0.05d;
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (float)(u + 0) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width, y + height, zLevel, (float)(u + width) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (float)(u + width) * uScale, (float)(v + 0) * vScale);
-        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (float)(u + 0) * uScale, (float)(v + 0) * vScale);
+        tessellator.addVertexWithUV(x - off,        y + height + off,   zLevel, (u + 0) * uScale,        (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y + height + off,   zLevel, (u + width) * uScale,    (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y - off,            zLevel, (u + width) * uScale,    (v + 0) * vScale);
+        tessellator.addVertexWithUV(x - off,        y - off,            zLevel, (u + 0) * uScale,        (v + 0) * vScale);
+        tessellator.draw();
+    }
+
+    public void drawTexturedModalRect(int x, int y, int u, int v, int width, int height, double uScale, double vScale, double off)
+    {
+        Tessellator tessellator = Tessellator.instance;
+        tessellator.startDrawingQuads();
+        tessellator.addVertexWithUV(x - off,        y + height + off,   zLevel, (u + 0) * uScale,        (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y + height + off,   zLevel, (u + width) * uScale,    (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y - off,            zLevel, (u + width) * uScale,    (v + 0) * vScale);
+        tessellator.addVertexWithUV(x - off,        y - off,            zLevel, (u + 0) * uScale,        (v + 0) * vScale);
+        tessellator.draw();
+    }
+
+    public void drawTexturedModalRectDouble(double x, double y, double u, double v, double width, double height, double uScale, double vScale, double off)
+    {
+        final double foon = /*(0.25d * uScale)*/0;
+        final double goon = /*(0.25d * vScale)*/0;
+        Tessellator tessellator = Tessellator.instance;
+        tessellator.startDrawingQuads();
+        tessellator.addVertexWithUV(x - off,        y + height + off,   zLevel, (u + 0.5) * uScale,       (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y + height + off,   zLevel, (u + width - 0.5) * uScale,   (v + height) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y - off,            zLevel, (u + width - 0.5) * uScale,    v * vScale);
+        tessellator.addVertexWithUV(x - off,        y - off,            zLevel, (u + 0.5) * uScale,        v * vScale);
+        tessellator.draw();
+    }
+
+
+    public void drawTexturedModalRectDouble(double x, double y, double u, double v, double width, double height, double uWidth, double vHeight, double uScale, double vScale)
+    {
+        final double foon = (0.5f * uScale);
+        final double goon = 0.0625f * (16.0f / uWidth);
+        final double off = 0.05d;
+        Tessellator tessellator = Tessellator.instance;
+        tessellator.startDrawingQuads();
+        tessellator.addVertexWithUV(x - off,        y + height + off,   zLevel, (u + foon) * uScale,             (v + vHeight - foon) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y + height + off,   zLevel, (u + uWidth - foon) * uScale,    (v + vHeight - foon) * vScale);
+        tessellator.addVertexWithUV(x + width + off,y - off,            zLevel, (u + uWidth - foon) * uScale,    (v + foon) * vScale);
+        tessellator.addVertexWithUV(x - off,        y - off,            zLevel, (u + foon) * uScale,             (v + foon) * vScale);
         tessellator.draw();
     }
 
@@ -226,10 +338,10 @@ public class Gui
         float vScale = 0.00390625F;
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (float)(u + 0) * uScale, (float)(v + uvHeight) * vScale);
-        tessellator.addVertexWithUV(x + width, y + height, zLevel, (float)(u + uvWidth) * uScale, (float)(v + uvHeight) * vScale);
-        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (float)(u + uvWidth) * uScale, (float)(v + 0) * vScale);
-        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (float)(u + 0) * uScale, (float)(v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (u + 0) * uScale, (v + uvHeight) * vScale);
+        tessellator.addVertexWithUV(x + width, y + height, zLevel, (u + uvWidth) * uScale, (v + uvHeight) * vScale);
+        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (u + uvWidth) * uScale, (v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (u + 0) * uScale, (v + 0) * vScale);
         tessellator.draw();
     }
     
@@ -239,15 +351,15 @@ public class Gui
         float vScale = scale;
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (float)(u + 0) * uScale, (float)(v + uvWidth) * vScale);
-        tessellator.addVertexWithUV(x + width, y + height, zLevel, (float)(u + uvWidth) * uScale, (float)(v + uvWidth) * vScale);
-        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (float)(u + uvWidth) * uScale, (float)(v + 0) * vScale);
-        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (float)(u + 0) * uScale, (float)(v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + height, zLevel, (u + 0) * uScale, (v + uvWidth) * vScale);
+        tessellator.addVertexWithUV(x + width, y + height, zLevel, (u + uvWidth) * uScale, (v + uvWidth) * vScale);
+        tessellator.addVertexWithUV(x + width, y + 0, zLevel, (u + uvWidth) * uScale, (v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (u + 0) * uScale, (v + 0) * vScale);
         tessellator.draw();
     }
     public void drawTexturedIcon(int x, int y, int width, int height, IconCoordinate coordinate)
     {
-        coordinate.parentAtlas.bindTexture();
+        coordinate.parentAtlas.bind();
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
         tessellator.addVertexWithUV(x + 0,      y + height, zLevel, coordinate.getIconUMin(), coordinate.getIconVMax());
@@ -257,15 +369,434 @@ public class Gui
         tessellator.draw();
     }
 
-    public void drawSlot(RenderEngine re, int x, int y, int argb){
-        float a = (float)(argb >> 24 & 0xff) / 255F;
-        float r = (float)(argb >> 16 & 0xff) / 255F;
-        float g = (float)(argb >> 8 & 0xff) / 255F;
-        float b = (float)(argb & 0xff) / 255F;
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/slot.png"));
+    public void drawSlot(int x, int y, int argb){
+
+        float a = Color.alphaFromInt(argb) / 255F;
+        float r = Color.redFromInt(argb) / 255F;
+        float g = Color.greenFromInt(argb) / 255F;
+        float b = Color.blueFromInt(argb) / 255F;
         GL11.glColor4f(r,g,b,a);
-        drawTexturedModalRect(x,y,0,0,18,18,18,0.0078125F);
+        drawGuiIcon(x, y, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot"));
+    }
+
+    public void drawGuiTexture(RenderEngine re, int x, int y, int width, int height, String texture) {
+        Texture tex = re.loadTexture(texture);
+        tex.bind();
+
+        Tessellator t = Tessellator.instance;
+        if (tex.hasMeta("gui")) {
+            GuiTextureProperties properties = Objects.requireNonNull(tex.getMeta("gui", GuiTextureProperties.class));
+            switch (properties.type) {
+                case GuiTextureProperties.TYPE_STRETCH: {
+                    t.startDrawingQuads();
+                    t.addVertexWithUV(x, y + height, zLevel, 0, 1);
+                    t.addVertexWithUV(x + width, y + height, zLevel, 1, 1);
+                    t.addVertexWithUV(x + width, y, zLevel, 1, 0);
+                    t.addVertexWithUV(x, y, zLevel, 0, 0);
+                    t.draw();
+                    break;
+                }
+                case GuiTextureProperties.TYPE_TILE: {
+                    double uScale = 1d/ properties.width;
+                    double vScale = 1d/ properties.height;
+                    t.startDrawingQuads();
+                    t.addVertexWithUV(x        , y + height, zLevel, 0,              height * vScale);
+                    t.addVertexWithUV(x + width, y + height, zLevel, width * uScale, height * vScale);
+                    t.addVertexWithUV(x + width, y         , zLevel, width * uScale, 0);
+                    t.addVertexWithUV(x        , y         , zLevel, 0,              0);
+                    t.draw();
+                    break;
+                }
+                case GuiTextureProperties.TYPE_NINE_SLICE: {
+                    double uScale = 1d / properties.width;
+                    double vScale = 1d / properties.height;
+
+                    int innerWidth = properties.width - (properties.border.left + properties.border.right);
+                    int innerHeight = properties.height - (properties.border.top + properties.border.bottom);
+                    int innerLeft = properties.border.left;
+                    int innerTop = properties.border.top;
+                    int innerRight = properties.width - properties.border.right;
+                    int innerBottom = properties.height - properties.border.bottom;
+
+                    int leftHeight = height - (properties.border.top + properties.border.bottom);
+                    int repeatsY = leftHeight / innerHeight;
+                    int remainderY = leftHeight % innerHeight;
+
+                    int topWidth = width - (properties.border.left + properties.border.right);
+                    int repeatsX = topWidth / innerWidth;
+                    int remainderX = topWidth % innerWidth;
+
+                    { // Inner
+                        for (int j = 0; j < repeatsY; j++) {
+                            drawTexturedModalRectDouble(
+                                x + innerLeft + repeatsX * innerWidth, y + innerTop + j * innerHeight,
+                                innerLeft + 1, innerTop,
+                                remainderX, innerHeight,
+                                uScale, vScale, 0.0); // Inner
+                        }
+
+                        for (int i = 0; i < repeatsX; i++) {
+                            drawTexturedModalRectDouble(
+                                x + innerLeft + i * innerWidth, y + innerTop + repeatsY * innerHeight,
+                                innerLeft, innerTop,
+                                innerWidth, remainderY,
+                                uScale, vScale, 0.0); // Inner
+                        }
+                        drawTexturedModalRectDouble(
+                            x + innerLeft + repeatsX * innerWidth, y + innerTop + repeatsY * innerHeight,
+                            innerLeft, innerTop,
+                            remainderX, remainderY,
+                            uScale, vScale, 0.0); // Inner
+
+                        for (int i = 0; i < repeatsX; i++) {
+                            for (int j = 0; j < repeatsY; j++) {
+                                drawTexturedModalRectDouble(
+                                    x + innerLeft + i * innerWidth, y + innerTop + j * innerHeight,
+                                    innerLeft, innerTop,
+                                    innerWidth, innerHeight,
+                                    uScale, vScale, 0.0); // Inner
+                            }
+                        }
+                    }
+
+                    { // Left Right
+                        for (int i = 0; i < repeatsY; i++) {
+                            drawTexturedModalRectDouble(
+                                x, y + innerTop + i * innerHeight,
+                                0, innerTop,
+                                innerLeft, innerHeight,
+                                uScale, vScale, 0); // left
+
+                            drawTexturedModalRectDouble(
+                                x + width - properties.border.right, y + innerTop + i * innerHeight,
+                                innerRight, innerTop,
+                                innerLeft, innerHeight,
+                                uScale, vScale, 0); // right
+                        }
+
+                        drawTexturedModalRectDouble(
+                            x, y + innerTop + repeatsY * innerHeight,
+                            0, innerTop,
+                            innerLeft, remainderY,
+                            uScale, vScale, 0); // left
+
+                        drawTexturedModalRectDouble(
+                            x + width - properties.border.right, y + innerTop + repeatsY * innerHeight,
+                            innerRight, innerTop,
+                            innerLeft, remainderY,
+                            uScale, vScale, 0); // right
+                    }
+                    { // Top Bottom
+                        for (int i = 0; i < repeatsX; i++) {
+                            drawTexturedModalRectDouble(
+                                x + innerLeft + i * innerWidth, y,
+                                innerLeft, 0,
+                                innerWidth, properties.border.top,
+                                uScale, vScale, 0); // top
+
+                            drawTexturedModalRectDouble(
+                                x + innerLeft + i * innerWidth, y + height - properties.border.bottom,
+                                innerLeft, innerBottom,
+                                innerWidth, properties.border.bottom,
+                                uScale, vScale, 0); // bottom
+                        }
+
+                        drawTexturedModalRectDouble(
+                            x + innerLeft + repeatsX * innerWidth, y,
+                            innerLeft, 0,
+                            remainderX, properties.border.top,
+                            uScale, vScale, 0); // top
+
+                        drawTexturedModalRectDouble(
+                            x + innerLeft + repeatsX * innerWidth, y + height - properties.border.bottom,
+                            innerLeft, innerBottom,
+                            remainderX, properties.border.bottom,
+                            uScale, vScale, 0); // bottom
+                    }
+
+                    drawTexturedModalRectDouble(
+                        x, y,
+                        0, 0,
+                        properties.border.left, properties.border.top,
+                        uScale, vScale, 0); // top-left
+
+                    drawTexturedModalRectDouble(
+                        x + width - properties.border.right, y,
+                        innerRight, 0,
+                        properties.border.right, properties.border.top,
+                        uScale, vScale, 0); // top-right
+
+                    drawTexturedModalRectDouble(
+                        x, y + height - properties.border.bottom,
+                        0, innerBottom,
+                        properties.border.left, properties.border.bottom,
+                        uScale, vScale, 0); // bottom-left
+
+                    drawTexturedModalRectDouble(
+                        x + width - properties.border.right, y + height - properties.border.bottom,
+                        innerRight, innerBottom,
+                        properties.border.right, properties.border.bottom,
+                        uScale, vScale, 0); // bottom-right
+
+                    break;
+                }
+            }
+        } else {
+            t.startDrawingQuads();
+            t.addVertexWithUV(x        , y + height, zLevel, 0, 1);
+            t.addVertexWithUV(x + width, y + height, zLevel, 1, 1);
+            t.addVertexWithUV(x + width, y         , zLevel, 1, 0);
+            t.addVertexWithUV(x        , y         , zLevel, 0, 0);
+            t.draw();
+        }
+    }
+
+    public void drawGuiIcon(int x, int y, int width, int height, IconCoordinate coordinate) {
+        drawGuiIconDouble(x, y, width, height, coordinate);
+    }
+    public void drawGuiIconDouble(double x, double y, double width, double height, IconCoordinate coordinate) {
+        coordinate.parentAtlas.bind();
+        Tessellator t = Tessellator.instance;
+        if (coordinate.hasMeta("gui")) {
+            GuiTextureProperties properties = Objects.requireNonNull(coordinate.getMeta("gui", GuiTextureProperties.class));
+            switch (properties.type) {
+                case GuiTextureProperties.TYPE_STRETCH: {
+                    t.startDrawingQuads();
+                    t.addVertexWithUV(x,            y + height, zLevel, coordinate.getIconUMin(), coordinate.getIconVMax());
+                    t.addVertexWithUV(x + width,    y + height, zLevel, coordinate.getIconUMax(), coordinate.getIconVMax());
+                    t.addVertexWithUV(x + width,    y,          zLevel, coordinate.getIconUMax(), coordinate.getIconVMin());
+                    t.addVertexWithUV(x,            y,          zLevel, coordinate.getIconUMin(), coordinate.getIconVMin());
+                    t.draw();
+                    break;
+                }
+                case GuiTextureProperties.TYPE_TILE: {
+                    int repeatsY = MathHelper.floor(height / properties.height);
+                    double remainderY = height % properties.height;
+
+                    int repeatsX = MathHelper.floor(width / properties.width);
+                    double remainderX = width % properties.width;
+
+                    for (int i = 0; i < repeatsX; i++) {
+                        for (int j = 0; j < repeatsY; j++) {
+                            drawIconTextureDouble(
+                                x + properties.width * i, y + properties.height * j,
+                                x + properties.width * (i + 1), y + properties.height * (j + 1),
+                                0, 0,
+                                properties.width, properties.height,
+                                coordinate);
+                        }
+                    }
+
+                    for (int j = 0; j < repeatsY; j++) {
+                        drawIconTextureDouble(
+                            x + properties.width * repeatsX, y + properties.height * j,
+                            x + properties.width * repeatsX + remainderX, y + properties.height * (j + 1),
+                            0, 0,
+                            remainderX, properties.height,
+                            coordinate);
+                    }
+
+                    for (int i = 0; i < repeatsX; i++) {
+                        drawIconTextureDouble(
+                            x + properties.width * i, y + properties.height * repeatsY,
+                            x + properties.width * (i + 1), y + properties.height * repeatsY + remainderY,
+                            0, 0,
+                            properties.width, remainderY,
+                            coordinate);
+                    }
+
+                    drawIconTextureDouble(
+                        x + properties.width * repeatsX, y + properties.height * repeatsY,
+                        x + properties.width * repeatsX + remainderX, y + properties.height * repeatsY + remainderY,
+                        0, 0,
+                        remainderX, remainderY,
+                        coordinate);
+
+                    break;
+                }
+                case GuiTextureProperties.TYPE_NINE_SLICE: {
+                    int innerWidth = properties.width - (properties.border.left + properties.border.right);
+                    int innerHeight = properties.height - (properties.border.top + properties.border.bottom);
+                    int innerLeft = properties.border.left;
+                    int innerTop = properties.border.top;
+                    int innerRight = properties.width - properties.border.right;
+                    int innerBottom = properties.height - properties.border.bottom;
+
+                    double leftHeight = height - (properties.border.top + properties.border.bottom);
+                    int repeatsY = MathHelper.floor(leftHeight / innerHeight);
+                    double remainderY = leftHeight % innerHeight;
+
+                    double topWidth = width - (properties.border.left + properties.border.right);
+                    int repeatsX = MathHelper.floor(topWidth / innerWidth);
+                    double remainderX = topWidth % innerWidth;
+
+
+                    { // Inner
+                        for (int j = 0; j < repeatsY; j++) {
+                            drawIconTextureDouble(
+                                x + innerLeft + repeatsX * innerWidth, y + innerTop + j * innerHeight,
+                                x + innerLeft + repeatsX * innerWidth + remainderX, y + innerTop + j * innerHeight + innerHeight,
+                                innerLeft, innerTop,
+                                innerLeft + remainderX, innerTop + innerHeight,
+                                coordinate);
+                        }
+
+                        for (int i = 0; i < repeatsX; i++) {
+                            drawIconTextureDouble(
+                                x + innerLeft + i * innerWidth, y + innerTop + repeatsY * innerHeight,
+                                x + innerLeft + i * innerWidth + innerWidth, y + innerTop + repeatsY * innerHeight + remainderY,
+                                innerLeft, innerTop,
+                                innerLeft + innerWidth, innerTop + remainderY, coordinate);
+                        }
+                        drawIconTextureDouble(
+                            x + innerLeft + repeatsX * innerWidth, y + innerTop + repeatsY * innerHeight,
+                            x + innerLeft + repeatsX * innerWidth + remainderX, y + innerTop + repeatsY * innerHeight + remainderY,
+                            innerLeft, innerTop,
+                            innerLeft + remainderX, innerTop + remainderY, coordinate);
+
+                        for (int i = 0; i < repeatsX; i++) {
+                            for (int j = 0; j < repeatsY; j++) {
+                                final double xMin = (x + innerLeft) + i * innerWidth;
+                                final double yMin = (y + innerTop) + j * innerHeight;
+                                drawIconTextureDouble(
+                                    xMin, yMin,
+                                    xMin + innerWidth, yMin + innerHeight,
+                                    innerLeft, innerTop,
+                                    innerLeft + innerWidth, innerTop + innerHeight,
+                                    coordinate);
+                            }
+                        }
+                    }
+
+                    { // Left Right
+                        for (int i = 0; i < repeatsY; i++) {
+                            drawIconTextureDouble(
+                                x, y + innerTop + i * innerHeight,
+                                x + innerLeft, y + innerTop + i * innerHeight + innerHeight,
+                                0, innerTop,
+                                innerLeft, innerTop + innerHeight,
+                                coordinate);
+
+                            drawIconTextureDouble(
+                                x + width - properties.border.right, y + innerTop + i * innerHeight,
+                                x + width, y + innerTop + i * innerHeight + innerHeight,
+                                innerRight, innerTop,
+                                innerRight + properties.border.right, innerTop + innerHeight,
+                                coordinate);
+                        }
+
+                        drawIconTextureDouble(
+                            x, y + innerTop + repeatsY * innerHeight,
+                            x + innerLeft, y + innerTop + repeatsY * innerHeight + remainderY,
+                            0, innerTop,
+                            innerLeft, innerTop + remainderY,
+                            coordinate);
+
+                        drawIconTextureDouble(
+                            x + width - properties.border.right, y + innerTop + repeatsY * innerHeight,
+                            x + width, y + innerTop + repeatsY * innerHeight + remainderY,
+                            innerRight, innerTop,
+                            innerRight + properties.border.right, innerTop + remainderY,
+                            coordinate);
+                    }
+                    { // Top Bottom
+                        for (int i = 0; i < repeatsX; i++) {
+                            drawIconTextureDouble(x + innerLeft + i * innerWidth, y,
+                                x + innerLeft + i * innerWidth + innerWidth, y + properties.border.top,
+                                innerLeft, 0,
+                                innerLeft + innerWidth, properties.border.top,
+                                coordinate);
+
+                            drawIconTextureDouble(
+                                x + innerLeft + i * innerWidth, y + height - properties.border.bottom,
+                                x + innerLeft + i * innerWidth + innerWidth, y + height,
+                                innerLeft, innerBottom,
+                                innerLeft + innerWidth, innerBottom + properties.border.bottom,
+                                coordinate);
+                        }
+
+                        drawIconTextureDouble(
+                            x + innerLeft + repeatsX * innerWidth, y,
+                            x + innerLeft + repeatsX * innerWidth + remainderX, y + properties.border.top,
+                            innerLeft, 0,
+                            innerLeft + remainderX, properties.border.top,
+                            coordinate);
+
+                        drawIconTextureDouble(
+                            x + innerLeft + repeatsX * innerWidth, y + height - properties.border.bottom,
+                            x + innerLeft + repeatsX * innerWidth + remainderX, y + height,
+                            innerLeft, innerBottom,
+                            innerLeft + remainderX, innerBottom + properties.border.bottom,
+                            coordinate);
+                    }
+
+                    drawIconTextureDouble(
+                        x, y,
+                        x + properties.border.left, y + properties.border.top,
+                        0, 0,
+                        properties.border.left, properties.border.top, coordinate);
+                    drawIconTextureDouble(
+                        x, y + height - properties.border.bottom,
+                        x + properties.border.left, y + height,
+                        0, innerBottom,
+                        properties.border.left, innerBottom + properties.border.bottom, coordinate);
+
+                    drawIconTextureDouble(
+                        x + width - properties.border.right, y,
+                        x + width, y + properties.border.top,
+                        innerRight, 0,
+                        innerRight + properties.border.right, properties.border.top, coordinate);
+                    drawIconTextureDouble(
+                        x + width - properties.border.right, y + height - properties.border.bottom,
+                        x + width, y + height,
+                        innerRight, innerBottom,
+                        innerRight + properties.border.right, innerBottom + properties.border.bottom, coordinate);
+
+
+                    break;
+                }
+            }
+        } else {
+            drawIconTextureDouble(x, y, x + width, y + height, 0, 0, coordinate.width, coordinate.height, coordinate);
+        }
+    }
+
+    public void drawIconTexture(int x0, int y0, int x1, int y1, int u0, int v0, int u1, int v1, IconCoordinate coordinate) {
+        coordinate.parentAtlas.bind();
+
+        double realU0 = coordinate.getSubIconU(u0 /((double)coordinate.width));
+        double realU1 = coordinate.getSubIconU(u1 /((double)coordinate.width));
+        double realV0 = coordinate.getSubIconV(v0 /((double)coordinate.height));
+        double realV1 = coordinate.getSubIconV(v1 /((double)coordinate.height));
+
+//        System.out.printf("%s, %s, %s, %s\n", realU0, realU1, realV0, realV1);
+
+        Tessellator t = Tessellator.instance;
+        t.startDrawingQuads();
+        t.addVertexWithUV(x0, y1, zLevel, realU0, realV1);
+        t.addVertexWithUV(x1, y1, zLevel, realU1, realV1);
+        t.addVertexWithUV(x1, y0, zLevel, realU1, realV0);
+        t.addVertexWithUV(x0, y0, zLevel, realU0, realV0);
+        t.draw();
+    }
+
+    public void drawIconTextureDouble(double x0, double y0, double x1, double y1, double u0, double v0, double u1, double v1, IconCoordinate coordinate) {
+        coordinate.parentAtlas.bind();
+
+        double realU0 = coordinate.getSubIconU(u0 /((double)coordinate.width));
+        double realU1 = coordinate.getSubIconU(u1 /((double)coordinate.width));
+        double realV0 = coordinate.getSubIconV(v0 /((double)coordinate.height));
+        double realV1 = coordinate.getSubIconV(v1 /((double)coordinate.height));
+
+//        System.out.printf("%s, %s, %s, %s\n", realU0, realU1, realV0, realV1);
 
+        Tessellator t = Tessellator.instance;
+        t.startDrawingQuads();
+        t.addVertexWithUV(x0, y1, zLevel, realU0, realV1);
+        t.addVertexWithUV(x1, y1, zLevel, realU1, realV1);
+        t.addVertexWithUV(x1, y0, zLevel, realU1, realV0);
+        t.addVertexWithUV(x0, y0, zLevel, realU0, realV0);
+        t.draw();
     }
 
     public float zLevel;
diff --git a/src/main/java/net/minecraft/client/gui/GuiAchievement.java b/src/main/java/net/minecraft/client/gui/GuiAchievement.java
deleted file mode 100644
index b89c02760..000000000
--- a/src/main/java/net/minecraft/client/gui/GuiAchievement.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package net.minecraft.client.gui;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.Global;
-import net.minecraft.core.achievement.Achievement;
-import net.minecraft.core.item.Item;
-import net.minecraft.client.render.Lighting;
-import net.minecraft.client.render.entity.ItemEntityRenderer;
-import net.minecraft.core.lang.I18n;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
-
-// Referenced classes of package net.minecraft.src:
-//            Gui, RenderItem, StatCollector, Achievement, 
-//            ScaledResolution, RenderHelper, FontRenderer, RenderEngine
-
-public class GuiAchievement extends Gui
-{
-    private Minecraft theGame;
-    private int achievementWindowWidth;
-    private int achievementWindowHeight;
-    private String name;
-    private String desc;
-    private Achievement theAchievement;
-    private long startTime;
-    private ItemEntityRenderer itemRender;
-    private boolean isPermanent;
-
-    public GuiAchievement(Minecraft minecraft)
-    {
-        theGame = minecraft;
-        itemRender = new ItemEntityRenderer();
-    }
-
-    public boolean isDisplayingAchievement(Achievement achievement)
-    {
-        return (theAchievement == achievement) && (startTime != 0L);
-    }
-
-    public void queueTakenAchievement(Achievement achievement)
-    {
-        name = I18n.getInstance().translateKey("gui.achievement.label.get");
-        desc = achievement.getStatName();
-        startTime = System.currentTimeMillis();
-        theAchievement = achievement;
-        isPermanent = false;
-    }
-
-    public void queueAchievementInformation(Achievement achievement)
-    {
-        name = achievement.getStatName();
-        desc = achievement.getDescription();
-        if (theAchievement == null)
-        {
-            startTime = System.currentTimeMillis() - 2500L;
-        }
-        else
-        {
-            startTime = System.currentTimeMillis();
-        }
-        theAchievement = achievement;
-        isPermanent = true;
-    }
-
-    private void updateAchievementWindowScale()
-    {
-        GL11.glViewport(0, 0, theGame.resolution.width, theGame.resolution.height);
-        GL11.glMatrixMode(GL11.GL_PROJECTION);
-        GL11.glLoadIdentity();
-        GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
-        GL11.glLoadIdentity();
-        achievementWindowWidth = theGame.resolution.scaledWidth;
-        achievementWindowHeight = theGame.resolution.scaledHeight;
-        GL11.glClear(256);
-        GL11.glMatrixMode(GL11.GL_PROJECTION);
-        GL11.glLoadIdentity();
-        GL11.glOrtho(0.0D, achievementWindowWidth, achievementWindowHeight, 0.0D, 1000D, 3000D);
-        GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
-        GL11.glLoadIdentity();
-        GL11.glTranslatef(0.0F, 0.0F, -2000F);
-    }
-
-    public void updateAchievementWindow()
-    {
-        if(Minecraft.hasPaidCheckTime > 0L)
-        {
-            GL11.glDisable(GL11.GL_DEPTH_TEST);
-            GL11.glDepthMask(false);
-            Lighting.disable();
-            updateAchievementWindowScale();
-            String s = I18n.getInstance().translateKeyAndFormat("gui.achievement.label.unlicensed.1", Global.VERSION);
-            String s1 = I18n.getInstance().translateKey("gui.achievement.label.unlicensed.2");
-            String s2 = I18n.getInstance().translateKey("gui.achievement.label.unlicensed.3");
-            theGame.fontRenderer.drawStringWithShadow(s, 2, 2, 0xffffff);
-            theGame.fontRenderer.drawStringWithShadow(s1, 2, 11, 0xffffff);
-            theGame.fontRenderer.drawStringWithShadow(s2, 2, 20, 0xffffff);
-            GL11.glDepthMask(true);
-            GL11.glEnable(GL11.GL_DEPTH_TEST);
-        }
-        if(theAchievement == null || startTime == 0L || theGame.thePlayer == null)
-        {
-            return;
-        }
-        double animProgress = (double)(System.currentTimeMillis() - startTime) / 3000D;
-        if (isPermanent && animProgress > 0.5) animProgress = 0.5;
-        if(!isPermanent && (animProgress < 0.0D || animProgress > 1.0D))
-        {
-            startTime = 0L;
-            return;
-        }
-        updateAchievementWindowScale();
-        GL11.glDisable(GL11.GL_DEPTH_TEST);
-        GL11.glDepthMask(false);
-        double d1 = animProgress * 2D;
-        if(d1 > 1.0D)
-        {
-            d1 = 2D - d1;
-        }
-        d1 *= 4D;
-        d1 = 1.0D - d1;
-        if(d1 < 0.0D)
-        {
-            d1 = 0.0D;
-        }
-        d1 *= d1;
-        d1 *= d1;
-        int i = achievementWindowWidth - 160;
-        int j = (int) (-d1 * 36D);
-        int k = theGame.renderEngine.getTexture("/assets/minecraft/textures/gui/achievement/bg.png");
-        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glEnable(GL11.GL_TEXTURE_2D);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, k);
-        GL11.glDisable(GL11.GL_LIGHTING);
-        drawTexturedModalRect(i, j, 96, 202, 160, 32);
-        if(isPermanent)
-        {
-            theGame.fontRenderer.func_27278_a(desc, i + 30, j + 7, 120, -1);
-        } else
-        {
-            theGame.fontRenderer.drawString(name, i + 30, j + 7, -256);
-            theGame.fontRenderer.drawString(desc, i + 30, j + 18, -1);
-        }
-        GL11.glDepthMask(true);
-        Lighting.enableInventoryLight();
-        GL11.glColor4f(1, 1, 1, 1);
-        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-
-        GL11.glEnable(GL11.GL_DEPTH_TEST);
-        Item achievementItem = Item.itemsList[theAchievement.itemId];
-        ItemModelDispatcher.getInstance().getDispatch(achievementItem).renderItemIntoGui(Tessellator.instance, theGame.fontRenderer, theGame.renderEngine, achievementItem.getDefaultStack(), i + 8, j + 8, 1.0f);
-        GL11.glDisable(GL11.GL_DEPTH_TEST);
-
-        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
-        Lighting.disable();
-        GL11.glDisable(GL11.GL_LIGHTING);
-        GL11.glDisable(GL11.GL_DEPTH_TEST);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/gui/GuiAchievements.java b/src/main/java/net/minecraft/client/gui/GuiAchievements.java
deleted file mode 100644
index 158c0c779..000000000
--- a/src/main/java/net/minecraft/client/gui/GuiAchievements.java
+++ /dev/null
@@ -1,421 +0,0 @@
-package net.minecraft.client.gui;
-
-import net.minecraft.client.gui.options.GuiOptionsButton;
-import net.minecraft.client.render.Lighting;
-import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.entity.ItemEntityRenderer;
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.achievement.Achievement;
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.achievement.stat.StatsCounter;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.lang.I18n;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.Side;
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.GL11;
-
-import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            GuiScreen, AchievementList, Achievement, GuiSmallButton, 
-//            StatCollector, GuiButton, GameSettings, KeyBinding, 
-//            FontRenderer, MathHelper, RenderEngine, Block, 
-//            StatFileWriter, RenderItem, RenderHelper
-
-public class GuiAchievements extends GuiScreen
-{
-
-    public GuiAchievements(GuiScreen parent, StatsCounter statfilewriter)
-    {
-        field_27121_a = 256;
-        field_27119_i = 202;
-        field_27118_j = 0;
-        field_27117_l = 0;
-        field_27122_w = 0;
-        field_27120_x = statfilewriter;
-        char c = '\215';
-        char c1 = '\215';
-        field_27116_m = field_27114_o = field_27112_q = AchievementList.OPEN_INVENTORY.x * 24 - c / 2 - 12;
-        field_27115_n = field_27113_p = field_27111_r = AchievementList.OPEN_INVENTORY.y * 24 - c1 / 2;
-        this.parent = parent;
-    }
-
-    @Override
-	public void init()
-    {
-        controlList.clear();
-        controlList.add(new GuiOptionsButton(1, width / 2 + 24, height / 2 + 74, 80, 20, I18n.getInstance().translateKey("gui.achievements.button.done")));
-    }
-
-    @Override
-	protected void buttonPressed(GuiButton button)
-    {
-        if(button.id == 1)
-        {
-            mc.displayGuiScreen(parent);
-            //mc.setIngameFocus();
-        }
-        super.buttonPressed(button);
-    }
-
-    @Override
-	public void keyTyped(char c, int i, int mouseX, int mouseY)
-    {
-        if(mc.gameSettings.keyInventory.isKeyboardKey(i))
-        {
-            mc.displayGuiScreen(null);
-            mc.setIngameFocus();
-        } else
-        {
-            super.keyTyped(c, i, mouseX, mouseY);
-        }
-    }
-
-    @Override
-	public void drawScreen(int mouseX, int mouseY, float partialTick)
-    {
-        if(Mouse.isButtonDown(0))
-        {
-            int k = (width - field_27121_a) / 2;
-            int l = (height - field_27119_i) / 2;
-            int i1 = k + 8;
-            int j1 = l + 17;
-            if((field_27122_w == 0 || field_27122_w == 1) && mouseX >= i1 && mouseX < i1 + 224 && mouseY >= j1 && mouseY < j1 + 155)
-            {
-                if(field_27122_w == 0)
-                {
-                    field_27122_w = 1;
-                } else
-                {
-                    field_27114_o -= mouseX - field_27118_j;
-                    field_27113_p -= mouseY - field_27117_l;
-                    field_27112_q = field_27116_m = field_27114_o;
-                    field_27111_r = field_27115_n = field_27113_p;
-                }
-                field_27118_j = mouseX;
-                field_27117_l = mouseY;
-            }
-            if(field_27112_q < (double)field_27126_s)
-            {
-                field_27112_q = field_27126_s;
-            }
-            if(field_27111_r < (double)field_27125_t)
-            {
-                field_27111_r = field_27125_t;
-            }
-            if(field_27112_q >= (double)field_27124_u)
-            {
-                field_27112_q = field_27124_u - 1;
-            }
-            if(field_27111_r >= (double)field_27123_v)
-            {
-                field_27111_r = field_27123_v - 1;
-            }
-        } else
-        {
-            field_27122_w = 0;
-        }
-        drawDefaultBackground();
-        func_27109_b(mouseX, mouseY, partialTick);
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glDisable(2929 /*GL_DEPTH_TEST*/);
-        func_27110_k();
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
-        GL11.glEnable(2929 /*GL_DEPTH_TEST*/);
-    }
-
-    @Override
-	public void tick()
-    {
-        field_27116_m = field_27114_o;
-        field_27115_n = field_27113_p;
-        double d = field_27112_q - field_27114_o;
-        double d1 = field_27111_r - field_27113_p;
-        if(d * d + d1 * d1 < 4D)
-        {
-            field_27114_o += d;
-            field_27113_p += d1;
-        } else
-        {
-            field_27114_o += d * 0.84999999999999998D;
-            field_27113_p += d1 * 0.84999999999999998D;
-        }
-    }
-
-    protected void func_27110_k()
-    {
-        int i = (width - field_27121_a) / 2;
-        int j = (height - field_27119_i) / 2;
-        fontRenderer.drawString(I18n.getInstance().translateKey("gui.achievements.label.title"), i + 15, j + 5, 0x404040);
-    }
-
-    private final Block[] stoneOres = new Block[] { Block.oreCoalStone, Block.oreIronStone, Block.oreGoldStone, Block.oreDiamondStone, Block.oreRedstoneStone };
-    private final Block[] basaltOres = new Block[] { Block.oreCoalBasalt, Block.oreIronBasalt, Block.oreGoldBasalt, Block.oreDiamondBasalt, Block.oreRedstoneBasalt };
-    protected void func_27109_b(int i, int j, float f)
-    {
-        int k = MathHelper.floor_double(field_27116_m + (field_27114_o - field_27116_m) * (double)f);
-        int l = MathHelper.floor_double(field_27115_n + (field_27113_p - field_27115_n) * (double)f);
-        if(k < field_27126_s)
-        {
-            k = field_27126_s;
-        }
-        if(l < field_27125_t)
-        {
-            l = field_27125_t;
-        }
-        if(k >= field_27124_u)
-        {
-            k = field_27124_u - 1;
-        }
-        if(l >= field_27123_v)
-        {
-            l = field_27123_v - 1;
-        }
-        int i1 = TextureRegistry.blockAtlas.getTextureId();
-        int j1 = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/achievement/bg.png");
-        int k1 = (width - field_27121_a) / 2;
-        int l1 = (height - field_27119_i) / 2;
-        int i2 = k1 + 16;
-        int j2 = l1 + 17;
-        zLevel = 0.0F;
-        GL11.glDepthFunc(518);
-        GL11.glPushMatrix();
-        GL11.glTranslatef(0.0F, 0.0F, -200F);
-        GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glEnable(2903 /*GL_COLOR_MATERIAL*/);
-        mc.renderEngine.bindTexture(i1);
-        int k2 = k + 288 >> 4;
-        int i3 = l + 288 >> 4;
-        int j3 = (k + 288) % 16;
-        int i4 = (l + 288) % 16;
-        Random random = new Random();
-        for(int y = 0; y * 16 - i4 < 155; y++)
-        {
-            float f5 = 0.6F - ((float)(i3 + y) / 25F) * 0.3F;
-            GL11.glColor4f(f5, f5, f5, 1.0F);
-            for(int x = 0; x * 16 - j3 < 224; x++)
-            {
-                random.setSeed(1234 + k2 + x);
-                random.nextInt();
-                int randomY = random.nextInt(1 + i3 + y) + (i3 + y) / 2;
-                IconCoordinate texture = getTextureFromBlock(Block.sand);
-                Block[] oreArray = stoneOres;
-                if (randomY >= 28 || i3 + y > 24)
-                {
-                    oreArray = basaltOres;
-                }
-                if(randomY > 37 || i3 + y == 35)
-                {
-                    texture = getTextureFromBlock(Block.bedrock);
-                }
-                else if(randomY == 22)
-                {
-                    if(random.nextInt(2) == 0)
-                    {
-                        texture = getTextureFromBlock(oreArray[3]);
-                    }
-                    else
-                    {
-                        texture = getTextureFromBlock(oreArray[4]);
-                    }
-                }
-                else if(randomY == 10)
-                {
-                    texture = getTextureFromBlock(oreArray[1]);
-                }
-                else if(randomY == 8)
-                {
-                    texture = getTextureFromBlock(oreArray[0]);
-                }
-                else if(randomY > 4)
-                {
-                    texture = getTextureFromBlock(Block.stone);
-                    if (randomY >= 28 || i3 + y > 24)
-                    {
-                        texture = getTextureFromBlock(Block.basalt);
-                    }
-                }
-                else if(randomY > 0)
-                {
-                    texture = getTextureFromBlock(Block.dirt);
-                }
-                drawTexturedModalRect((i2 + x * 16) - j3, (j2 + y * 16) - i4, texture.iconX, texture.iconY, texture.width, texture.height, 1f / texture.parentAtlas.getAtlasWidth(), 1f / texture.parentAtlas.getAtlasHeight());
-            }
-
-        }
-
-        GL11.glEnable(2929 /*GL_DEPTH_TEST*/);
-        GL11.glDepthFunc(515);
-        GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
-        for(int l2 = 0; l2 < AchievementList.achievementList.size(); l2++)
-        {
-            Achievement achievement1 = AchievementList.achievementList.get(l2);
-            if(achievement1.parent == null)
-            {
-                continue;
-            }
-            int k3 = (achievement1.x * 24 - k) + 11 + i2;
-            int j4 = (achievement1.y * 24 - l) + 11 + j2;
-            int k4 = (achievement1.parent.x * 24 - k) + 11 + i2;
-            int i5 = (achievement1.parent.y * 24 - l) + 11 + j2;
-            int l5 = 0;
-            boolean flag = field_27120_x.isAchievementUnlocked(achievement1);
-            boolean flag1 = field_27120_x.isAchievementUnlockable(achievement1);
-            char c = java.lang.Math.sin(((double)(System.currentTimeMillis() % 600L) / 600D) * 3.1415926535897931D * 2D) <= 0.59999999999999998D ? '\202' : '\377';
-            if(flag)
-            {
-                l5 = 0xff707070;
-            } else
-            if(flag1)
-            {
-                l5 = 65280 + (c << 24);
-            } else
-            {
-                l5 = 0xff000000;
-            }
-            drawLineHorizontal(k3, k4, j4, l5);
-            drawLineVertical(k4, j4, i5, l5);
-        }
-
-        Achievement achievement = null;
-        ItemEntityRenderer renderitem = new ItemEntityRenderer();
-        Lighting.enableInventoryLight();
-        GL11.glDisable(GL11.GL_LIGHTING);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
-        for(int l3 = 0; l3 < AchievementList.achievementList.size(); l3++)
-        {
-            Achievement achievement3 = AchievementList.achievementList.get(l3);
-            int l4 = achievement3.x * 24 - k;
-            int j5 = achievement3.y * 24 - l;
-            if(l4 < -24 || j5 < -24 || l4 > 224 || j5 > 155)
-            {
-                continue;
-            }
-            if(field_27120_x.isAchievementUnlocked(achievement3))
-            {
-                float f1 = 1.0F;
-                GL11.glColor4f(f1, f1, f1, 1.0F);
-            } else
-            if(field_27120_x.isAchievementUnlockable(achievement3))
-            {
-                float f2 = java.lang.Math.sin(((double)(System.currentTimeMillis() % 600L) / 600D) * 3.1415926535897931D * 2D) >= 0.6D ? 0.8F : 0.6F;
-                GL11.glColor4f(f2, f2, f2, 1.0F);
-            } else
-            {
-                float f3 = 0.3F;
-                GL11.glColor4f(f3, f3, f3, 1.0F);
-            }
-            mc.renderEngine.bindTexture(j1);
-            int i6 = i2 + l4;
-            int k6 = j2 + j5;
-            if(achievement3.getSpecial())
-            {
-                drawTexturedModalRect(i6 - 2, k6 - 2, 26, 202, 26, 26);
-            } else
-            {
-                drawTexturedModalRect(i6 - 2, k6 - 2, 0, 202, 26, 26);
-            }
-            if(!field_27120_x.isAchievementUnlockable(achievement3))
-            {
-                float f4 = 0.1F;
-                GL11.glColor4f(f4, f4, f4, 1.0F);
-                renderitem.useColor = false;
-            }
-            GL11.glEnable(GL11.GL_LIGHTING);
-            GL11.glEnable(GL11.GL_CULL_FACE);
-            Item achievementItem = Item.itemsList[achievement3.itemId];
-            ItemModelDispatcher.getInstance().getDispatch(achievementItem).renderItemIntoGui(Tessellator.instance, mc.fontRenderer, mc.renderEngine, achievementItem.getDefaultStack(), i6 + 3, k6 + 3, 1.0f);
-            GL11.glDisable(GL11.GL_LIGHTING);
-            if(!field_27120_x.isAchievementUnlockable(achievement3))
-            {
-                renderitem.useColor = true;
-            }
-            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if(i >= i2 && j >= j2 && i < i2 + 224 && j < j2 + 155 && i >= i6 && i <= i6 + 22 && j >= k6 && j <= k6 + 22)
-            {
-                achievement = achievement3;
-            }
-        }
-
-        GL11.glDisable(GL11.GL_DEPTH_TEST);
-        GL11.glEnable(GL11.GL_BLEND);
-        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(j1);
-        drawTexturedModalRect(k1, l1, 0, 0, field_27121_a, field_27119_i);
-        GL11.glPopMatrix();
-        zLevel = 0.0F;
-        GL11.glDepthFunc(515);
-        GL11.glDisable(GL11.GL_DEPTH_TEST);
-        GL11.glEnable(GL11.GL_TEXTURE_2D);
-        super.drawScreen(i, j, f);
-        if(achievement != null)
-        {
-            String s = achievement.getStatName();
-            String s1 = achievement.getDescription();
-            int k5 = i + 12;
-            int j6 = j - 4;
-            if(field_27120_x.isAchievementUnlockable(achievement))
-            {
-                int l6 = java.lang.Math.max(fontRenderer.getStringWidth(s), 120);
-                int j7 = fontRenderer.func_27277_a(s1, l6);
-                if(field_27120_x.isAchievementUnlocked(achievement))
-                {
-                    j7 += 12;
-                }
-                drawGradientRect(k5 - 3, j6 - 3, k5 + l6 + 3, j6 + j7 + 3 + 12, 0xc0000000, 0xc0000000);
-                fontRenderer.func_27278_a(s1, k5, j6 + 12, l6, 0xffa0a0a0);
-                if(field_27120_x.isAchievementUnlocked(achievement))
-                {
-                    fontRenderer.drawStringWithShadow(I18n.getInstance().translateKey("gui.achievements.label.taken"), k5, j6 + j7 + 4, 0xff9090ff);
-                }
-            } else
-            {
-                int i7 = java.lang.Math.max(fontRenderer.getStringWidth(s), 120);
-                String s2 = I18n.getInstance().translateKeyAndFormat("gui.achievements.label.requires", achievement.parent.getStatName());
-                int k7 = fontRenderer.func_27277_a(s2, i7);
-                drawGradientRect(k5 - 3, j6 - 3, k5 + i7 + 3, j6 + k7 + 12 + 3, 0xc0000000, 0xc0000000);
-                fontRenderer.func_27278_a(s2, k5, j6 + 12, i7, 0xff705050);
-            }
-            fontRenderer.drawStringWithShadow(s, k5, j6, field_27120_x.isAchievementUnlockable(achievement) ? achievement.getSpecial() ? -128 : -1 : achievement.getSpecial() ? 0xff808040 : 0xff808080);
-        }
-        GL11.glEnable(GL11.GL_DEPTH_TEST);
-        GL11.glEnable(GL11.GL_LIGHTING);
-        Lighting.disable();
-    }
-    private IconCoordinate getTextureFromBlock(Block block){
-        return BlockModelDispatcher.getInstance().getDispatch(block).getBlockTextureFromSideAndMetadata(Side.BOTTOM, 0);
-    }
-    private static final int field_27126_s;
-    private static final int field_27125_t;
-    private static final int field_27124_u;
-    private static final int field_27123_v;
-    protected int field_27121_a;
-    protected int field_27119_i;
-    protected int field_27118_j;
-    protected int field_27117_l;
-    protected double field_27116_m;
-    protected double field_27115_n;
-    protected double field_27114_o;
-    protected double field_27113_p;
-    protected double field_27112_q;
-    protected double field_27111_r;
-    private int field_27122_w;
-    private final StatsCounter field_27120_x;
-    GuiScreen parent;
-
-    static 
-    {
-        field_27126_s = AchievementList.minX * 24 - 112;
-        field_27125_t = AchievementList.minY * 24 - 112;
-        field_27124_u = AchievementList.maxX * 24 - 77;
-        field_27123_v = AchievementList.maxY * 24 - 77;
-    }
-}
diff --git a/src/main/java/net/minecraft/client/gui/GuiButton.java b/src/main/java/net/minecraft/client/gui/GuiButton.java
index 6f06d42f6..971d65a90 100644
--- a/src/main/java/net/minecraft/client/gui/GuiButton.java
+++ b/src/main/java/net/minecraft/client/gui/GuiButton.java
@@ -1,6 +1,8 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.render.FontRenderer;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
@@ -11,12 +13,18 @@ import net.minecraft.core.util.helper.Listener;
 
 public class GuiButton extends Gui implements GuiElement
 {
+    public static final int STATE_DISABLED = 0;
+    public static final int STATE_DEFAULT = 1;
+    public static final int STATE_HOVERED = 2;
 
     public int width;
     public int height;
     public int xPosition;
     public int yPosition;
     public String displayString;
+    public IconCoordinate defaultTexture = TextureRegistry.getTexture("minecraft:gui/widgets/button");
+    public IconCoordinate hoveredTexture = TextureRegistry.getTexture("minecraft:gui/widgets/button_highlighted");
+    public IconCoordinate disabledTexture = TextureRegistry.getTexture("minecraft:gui/widgets/button_disabled");
     public int id;
     public boolean enabled;
     public boolean visible;
@@ -40,16 +48,23 @@ public class GuiButton extends Gui implements GuiElement
         displayString = text;
     }
 
+    public GuiButton setTextures(String defaultTexture, String hoveredTexture, String disabledTexture) {
+        this.defaultTexture = TextureRegistry.getTexture(defaultTexture);
+        this.hoveredTexture = TextureRegistry.getTexture(hoveredTexture);
+        this.disabledTexture = TextureRegistry.getTexture(disabledTexture);
+        return this;
+    }
+
     protected int getButtonState(boolean hovered)
     {
-        int state = 1;
+        int state = STATE_DEFAULT;
         if(!enabled)
         {
-            state = 0;
+            state = STATE_DISABLED;
         }
         else if(hovered)
         {
-            state = 2;
+            state = STATE_HOVERED;
         }
         return state;
     }
@@ -62,10 +77,20 @@ public class GuiButton extends Gui implements GuiElement
         boolean mouseOver = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
         int state = getButtonState(mouseOver);
 
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        drawTexturedModalRect(xPosition, yPosition, 0, 46 + state * 20, width / 2, height);
-        drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + state * 20, width / 2, height);
+        IconCoordinate tex;
+        switch (state) {
+            case STATE_DISABLED:
+                tex = disabledTexture;
+                break;
+            case STATE_HOVERED:
+                tex = hoveredTexture;
+                break;
+            case STATE_DEFAULT:
+            default:
+                tex = defaultTexture;
+        }
+        drawGuiIcon(xPosition, yPosition, width, height, tex);
 
         mouseDragged(mc, mouseX, mouseY);
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiChat.java b/src/main/java/net/minecraft/client/gui/GuiChat.java
index 7961affb1..5a17db6d0 100644
--- a/src/main/java/net/minecraft/client/gui/GuiChat.java
+++ b/src/main/java/net/minecraft/client/gui/GuiChat.java
@@ -51,9 +51,9 @@ public class GuiChat extends GuiScreen implements ITextField {
 		if (dWheel != 0)
 		{
 			if (showEmotePicker) {
-				emotePicker.scrollOffset(-dWheel / 10);
+				emotePicker.scrollOffset((int)(-dWheel / 0.1f));
 			} else {
-				mc.ingameGUI.chatScroll += dWheel / 100;
+				mc.ingameGUI.chatScroll += dWheel / 1;
 			}
 		}
 	}
diff --git a/src/main/java/net/minecraft/client/gui/GuiChest.java b/src/main/java/net/minecraft/client/gui/GuiChest.java
index 55075fdce..f77122fad 100644
--- a/src/main/java/net/minecraft/client/gui/GuiChest.java
+++ b/src/main/java/net/minecraft/client/gui/GuiChest.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.core.player.inventory.ContainerChest;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.menu.ContainerMenu;
+import net.minecraft.core.player.inventory.container.Container;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
@@ -11,32 +11,31 @@ import org.lwjgl.opengl.GL11;
 public class GuiChest extends GuiContainer
 {
 
-    public GuiChest(IInventory iinventory, IInventory iinventory1)
+    public GuiChest(Container iinventory, Container iinventory1)
     {
-        super(new ContainerChest(iinventory, iinventory1));
+        super(new ContainerMenu(iinventory, iinventory1));
         inventoryRows = 0;
         upperChestInventory = iinventory;
         lowerChestInventory = iinventory1;
         allowIngameInput = false;
         char c = '\336';
         int i = c - 108;
-        inventoryRows = iinventory1.getSizeInventory() / 9;
+        inventoryRows = iinventory1.getContainerSize() / 9;
         ySize = i + inventoryRows * 18;
     }
 
     @Override
 	protected void drawGuiContainerForegroundLayer()
     {
-        fontRenderer.drawString(lowerChestInventory.getInvName(), 8, 6, 0x404040);
-        fontRenderer.drawString(upperChestInventory.getInvName(), 8, (ySize - 96) + 2, 0x404040);
+        fontRenderer.drawString(lowerChestInventory.getName(), 8, 6, 0x404040);
+        fontRenderer.drawString(upperChestInventory.getName(), 8, (ySize - 96) + 2, 0x404040);
     }
 
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int i = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/container.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/container.png").bind();
         int x = (width - xSize) / 2;
         int y = (height - ySize) / 2;
         
@@ -53,7 +52,7 @@ public class GuiChest extends GuiContainer
         drawTexturedModalRect(x, y + inventoryRows * 18 + 17, 0, 126, xSize, 96);
     }
 
-    private IInventory upperChestInventory;
-    private IInventory lowerChestInventory;
+    private Container upperChestInventory;
+    private Container lowerChestInventory;
     private int inventoryRows;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiClickableLabel.java b/src/main/java/net/minecraft/client/gui/GuiClickableLabel.java
index 5f1144053..2a65551bf 100644
--- a/src/main/java/net/minecraft/client/gui/GuiClickableLabel.java
+++ b/src/main/java/net/minecraft/client/gui/GuiClickableLabel.java
@@ -33,7 +33,6 @@ public class GuiClickableLabel extends GuiButton
             return;
         }
         FontRenderer fontrenderer = mc.fontRenderer;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         boolean hovered = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
         width = fontrenderer.getStringWidth(displayString) + 4;
diff --git a/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java b/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
index 468a8d6f1..00f25b96a 100644
--- a/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
+++ b/src/main/java/net/minecraft/client/gui/GuiConnectToIP.java
@@ -19,7 +19,7 @@ public class GuiConnectToIP extends GuiScreen
     @Override
 	public void tick()
     {
-        field_22111_h.updateCursorCounter();
+        textField.updateCursorCounter();
     }
 
     @Override
@@ -32,9 +32,9 @@ public class GuiConnectToIP extends GuiScreen
         controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 120 + 12, stringtranslate.translateKey("gui.connect_to_ip.button.cancel")));
         String s = mc.gameSettings.lastServer.value.replaceAll("_", ":");
         controlList.get(0).enabled = s.length() > 0;
-        field_22111_h = new GuiTextField(this, fontRenderer, width / 2 - 100, (height / 4 - 10) + 50 + 18, 200, 20, s, "");
-        field_22111_h.isFocused = true;
-        field_22111_h.setMaxStringLength(128);
+        textField = new GuiTextField(this, fontRenderer, width / 2 - 100, (height / 4 - 10) + 50 + 18, 200, 20, s, "");
+        textField.isFocused = true;
+        textField.setMaxStringLength(128);
     }
 
     @Override
@@ -56,7 +56,7 @@ public class GuiConnectToIP extends GuiScreen
         } else
         if(button.id == 0)
         {
-            String serverUrl = field_22111_h.getText().trim();
+            String serverUrl = textField.getText().trim();
             mc.gameSettings.lastServer.value = serverUrl.replaceAll(":", "_");
             mc.gameSettings.saveOptions();
             ServerAddress address = ServerAddress.resolveServerIP(serverUrl);
@@ -68,19 +68,19 @@ public class GuiConnectToIP extends GuiScreen
 	public void keyTyped(char c, int i, int mouseX, int mouseY)
     {
         if(i != Keyboard.KEY_BACK) super.keyTyped(c, i, mouseX, mouseY);
-        field_22111_h.textboxKeyTyped(c, i);
+        textField.textboxKeyTyped(c, i);
         if(c == '\r')
         {
             buttonPressed((GuiButton)controlList.get(0));
         }
-        ((GuiButton)controlList.get(0)).enabled = field_22111_h.getText().length() > 0;
+        ((GuiButton)controlList.get(0)).enabled = textField.getText().length() > 0;
     }
 
     @Override
 	public void mouseClicked(int mouseX, int mouseY, int mouseButton)
     {
         super.mouseClicked(mouseX, mouseY, mouseButton);
-        field_22111_h.mouseClicked(mouseX, mouseY, mouseButton);
+        textField.mouseClicked(mouseX, mouseY, mouseButton);
     }
 
     @Override
@@ -90,9 +90,9 @@ public class GuiConnectToIP extends GuiScreen
         drawDefaultBackground();
         drawStringCentered(fontRenderer, i18n.translateKey("gui.connect_to_ip.label.title"), width / 2, (height / 4 - 60) + 20, 0xffffff);
         drawString(fontRenderer, i18n.translateKey("gui.connect_to_ip.label.enter_ip"), width / 2 - 140, (height / 4 - 60) + 60 + 36, 0xa0a0a0);
-        field_22111_h.drawTextBox();
+        textField.drawTextBox();
         super.drawScreen(mouseX, mouseY, partialTick);
     }
 
-    private GuiTextField field_22111_h;
+    private GuiTextField textField;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiConnecting.java b/src/main/java/net/minecraft/client/gui/GuiConnecting.java
index dc5458ebc..1a5263144 100644
--- a/src/main/java/net/minecraft/client/gui/GuiConnecting.java
+++ b/src/main/java/net/minecraft/client/gui/GuiConnecting.java
@@ -1,23 +1,68 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.net.handler.NetClientHandler;
+import net.minecraft.client.net.handler.ClientPacketHandler;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.client.net.thread.ThreadConnectToServer;
+import net.minecraft.core.net.packet.PreLoginPacket;
+
+import java.net.ConnectException;
+import java.net.UnknownHostException;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiScreen, ThreadConnectToServer, NetClientHandler, StringTranslate, 
+//            GuiScreen, ThreadConnectToServer, ClientPacketHandler, StringTranslate,
 //            GuiButton, GuiMainMenu
 
 public class GuiConnecting extends GuiScreen
 {
 
-    public GuiConnecting(Minecraft minecraft, String s, int i)
+    public GuiConnecting(Minecraft minecraft, String hostName, int port)
     {
         cancelled = false;
-        System.out.println("Connecting to " + s + ", " + i);
+        System.out.println("Connecting to " + hostName + ", " + port);
         minecraft.changeWorld(null);
-        (new ThreadConnectToServer(this, minecraft, s, i)).start();
+        new Thread(() -> {
+            try
+            {
+                clientHandler = new ClientPacketHandler(mc, hostName, port);
+                if(cancelled)
+                {
+                    return;
+                }
+                clientHandler.addToSendQueue(new PreLoginPacket(mc.session.username));
+            }
+            catch(UnknownHostException unknownhostexception)
+            {
+                if(cancelled)
+                {
+                    return;
+                }
+                mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
+                    "Unknown host '" + hostName + "'"
+                }));
+            }
+            catch(ConnectException connectexception)
+            {
+                if(cancelled)
+                {
+                    return;
+                }
+                mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
+                    connectexception.getMessage()
+                }));
+            }
+            catch(Exception exception)
+            {
+                if(cancelled)
+                {
+                    return;
+                }
+                exception.printStackTrace();
+                mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
+                    exception.toString()
+                }));
+            }
+
+        }).start();
     }
 
     @Override
@@ -25,7 +70,7 @@ public class GuiConnecting extends GuiScreen
     {
         if(clientHandler != null)
         {
-            clientHandler.processReadPackets();
+            clientHandler.tick();
         }
     }
 
@@ -68,26 +113,11 @@ public class GuiConnecting extends GuiScreen
         } else
         {
             drawStringCentered(fontRenderer, stringtranslate.translateKey("gui.connecting.label.logging_in"), width / 2, height / 2 - 50, 0xffffff);
-            drawStringCentered(fontRenderer, clientHandler.field_1209_a, width / 2, height / 2 - 10, 0xffffff);
+            drawStringCentered(fontRenderer, clientHandler.message, width / 2, height / 2 - 10, 0xffffff);
         }
         super.drawScreen(mouseX, mouseY, partialTick);
     }
 
-    public static NetClientHandler setNetClientHandler(GuiConnecting guiconnecting, NetClientHandler netclienthandler)
-    {
-        return guiconnecting.clientHandler = netclienthandler;
-    }
-
-    public static boolean isCancelled(GuiConnecting guiconnecting)
-    {
-        return guiconnecting.cancelled;
-    }
-
-    public static NetClientHandler getNetClientHandler(GuiConnecting guiconnecting)
-    {
-        return guiconnecting.clientHandler;
-    }
-
-    private NetClientHandler clientHandler;
+    private ClientPacketHandler clientHandler;
     private boolean cancelled;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiContainer.java b/src/main/java/net/minecraft/client/gui/GuiContainer.java
index 2178d5fdd..3efb12233 100644
--- a/src/main/java/net/minecraft/client/gui/GuiContainer.java
+++ b/src/main/java/net/minecraft/client/gui/GuiContainer.java
@@ -10,26 +10,26 @@ import net.minecraft.client.gui.guidebook.search.SearchPage;
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.client.util.helper.GuiItemDragHandler;
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.entity.TileEntityBlastFurnace;
+import net.minecraft.core.block.entity.BlastFurnaceBlockEntity;
 import net.minecraft.core.crafting.LookupFuelFurnace;
 import net.minecraft.core.crafting.LookupFuelFurnaceBlast;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryBlastFurnace;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryFurnace;
+import net.minecraft.core.item.IArmorItem;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemArmor;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.*;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.menu.*;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
-import net.minecraft.core.player.inventory.slot.SlotCreative;
-import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
+import net.minecraft.core.player.inventory.slot.CreativeSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiScreen, EntityPlayerSP, RenderHelper, Container,
+//            GuiScreen, LocalPlayer, RenderHelper, Container,
 //            Slot, InventoryPlayer, RenderItem, StringTranslate,
 //            ItemStack, FontRenderer, RenderEngine, PlayerController,
 //            GameSettings, KeyBinding
@@ -38,12 +38,12 @@ public abstract class GuiContainer extends GuiScreen
 {
 	public int xSize;
 	public int ySize;
-	public Container inventorySlots;
+	public AbstractContainerMenu inventorySlots;
 	GuiTooltip guiTooltip;
 	GuiRenderItem guiRenderItem;
 	public GuiItemDragHandler itemDragHandler;
 
-	public GuiContainer(final Container container)
+	public GuiContainer(final AbstractContainerMenu container)
 	{
 		Minecraft mc = Minecraft.getMinecraft(this);
 		xSize = 176;
@@ -77,12 +77,12 @@ public abstract class GuiContainer extends GuiScreen
 		GL11.glTranslatef(centerX, centerY, 0.0F);
 		drawGuiContainerForegroundLayer();
 		Slot slot = null;
-		for (int i = 0; i < inventorySlots.inventorySlots.size(); i++)
+		for (int i = 0; i < inventorySlots.slots.size(); i++)
 		{
-			final Slot slot1 = inventorySlots.inventorySlots.get(i);
+			final Slot slot1 = inventorySlots.slots.get(i);
 			boolean mouseOver = getIsMouseOverSlot(slot1, mouseX, mouseY);
 			if(!itemDragHandler.isSlotDragged(slot1)) {
-				guiRenderItem.render(slot1.getStack(), slot1.xDisplayPosition, slot1.yDisplayPosition, mouseOver, slot1);
+				guiRenderItem.render(slot1.getItem(), slot1.x, slot1.y, mouseOver, slot1);
 			}
 			if (mouseOver)
 			{
@@ -90,7 +90,7 @@ public abstract class GuiContainer extends GuiScreen
 			}
 		}
 
-		final InventoryPlayer inventoryplayer = mc.thePlayer.inventory;
+		final Inventory inventoryplayer = mc.thePlayer.inventory;
 		ItemStack grabbedItem = inventoryplayer.getHeldItemStack();
 		if(mc.gameSettings.enableItemDragging.value) {
 			itemDragHandler.drawScreen(mouseX, mouseY, partialTick);
@@ -100,26 +100,29 @@ public abstract class GuiContainer extends GuiScreen
 				grabbedItem = grabbedItemOverride;
 			}
 		}
+		GL11.glPopMatrix();
+
+		super.drawScreen(mouseX, mouseY, partialTick);
 
+		GL11.glPushMatrix();
 		if (grabbedItem != null)
 		{
-			GL11.glTranslatef(0.0F, 0.0F, 64F);
+			GL11.glTranslatef(centerX, centerY, 100.0F);
 			guiRenderItem.render(grabbedItem, mouseX - centerX - 8, mouseY - centerY - 8);
 		}
 		GL11.glPopMatrix();
 
-		super.drawScreen(mouseX, mouseY, partialTick);
 		GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-		if (inventoryplayer.getHeldItemStack() == null && slot != null && slot.hasStack())
+		if (inventoryplayer.getHeldItemStack() == null && slot != null && slot.hasItem())
 		{
 			boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-			String str = guiTooltip.getTooltipText(slot.getStack(), showDescription, slot);
+			String str = guiTooltip.getTooltipText(slot.getItem(), showDescription, slot);
 			if(str.length() > 0)
 			{
 				guiTooltip.render(str, mouseX, mouseY, 8, -8);
 			}
 		}
-		GL11.glEnable(2929 /*GL_DEPTH_TEST*/);
+		GL11.glEnable(GL11.GL_DEPTH_TEST);
 	}
 
 	public boolean getIsMouseOverSlot(final Slot slot, int i, int j)
@@ -128,14 +131,14 @@ public abstract class GuiContainer extends GuiScreen
 		final int l = (height - ySize) / 2;
 		i -= k;
 		j -= l;
-		return i >= slot.xDisplayPosition - 1 && i < slot.xDisplayPosition + 16 + 1 && j >= slot.yDisplayPosition - 1 && j < slot.yDisplayPosition + 16 + 1;
+		return i >= slot.x - 1 && i < slot.x + 16 + 1 && j >= slot.y - 1 && j < slot.y + 16 + 1;
 	}
 
 	public Slot getSlotAtPosition(final int i, final int j)
 	{
-		for (int k = 0; k < inventorySlots.inventorySlots.size(); k++)
+		for (int k = 0; k < inventorySlots.slots.size(); k++)
 		{
-			final Slot slot = (Slot) inventorySlots.inventorySlots.get(k);
+			final Slot slot = (Slot) inventorySlots.slots.get(k);
 			if (getIsMouseOverSlot(slot, i, j))
 			{
 				return slot;
@@ -162,9 +165,9 @@ public abstract class GuiContainer extends GuiScreen
 		int slotId = getSlotId(mouseX, mouseY);
 		if(slotId >= 0) {
 			if(mc.gameSettings.keyShowRecipe.isKeyboardKey(i)){
-				Slot slot = inventorySlots.inventorySlots.get(slotId);
-				if(slot.hasStack()){
-					String query = "r:"+slot.getStack().getDisplayName()+"!";
+				Slot slot = inventorySlots.slots.get(slotId);
+				if(slot.hasItem()){
+					String query = "r:"+slot.getItem().getDisplayName()+"!";
 					onClosed();
 					mc.thePlayer.closeScreen();
 					PageManager.searchQuery = SearchQuery.resolve(query);
@@ -183,9 +186,9 @@ public abstract class GuiContainer extends GuiScreen
 				}
 			}
 			if(mc.gameSettings.keyShowUsage.isKeyboardKey(i)){
-				Slot slot = inventorySlots.inventorySlots.get(slotId);
-				if(slot.hasStack()) {
-					String query = "u:" + slot.getStack().getDisplayName() + "!";
+				Slot slot = inventorySlots.slots.get(slotId);
+				if(slot.hasItem()) {
+					String query = "u:" + slot.getItem().getDisplayName() + "!";
 					onClosed();
 					mc.thePlayer.closeScreen();
 					PageManager.searchQuery = SearchQuery.resolve(query);
@@ -207,39 +210,39 @@ public abstract class GuiContainer extends GuiScreen
 				boolean ctrl = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
 				int amount = 1;
 				if(ctrl) amount = 64;
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.DROP, new int[] {slotId, amount}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.DROP, new int[] {slotId, amount}, mc.thePlayer);
 			}
 			// Horrifying
 			if (mc.gameSettings.keyHotBarSlot1.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 1}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 1}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot2.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 2}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 2}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot3.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 3}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 3}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot4.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 4}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 4}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot5.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 5}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 5}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot6.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 6}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 6}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot7.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 7}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 7}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot8.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 8}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 8}, mc.thePlayer);
 			}
 			if (mc.gameSettings.keyHotBarSlot9.isKeyboardKey(i)){
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 9}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.HOTBAR_ITEM_SWAP, new int[] {slotId, 9}, mc.thePlayer);
 			}
 
 			if(mc.gameSettings.keySortInventory.isKeyboardKey(i)) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.SORT, new int[] {slotId}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.SORT, new int[] {slotId}, mc.thePlayer);
 			}
 		}
 	}
@@ -281,14 +284,14 @@ public abstract class GuiContainer extends GuiScreen
 			// Drop held item
 			InventoryAction action = InventoryAction.DROP_HELD_STACK;
 			if(mouseButton == 1) action = InventoryAction.DROP_HELD_SINGLE;
-			mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, action, null, mc.thePlayer);
+			mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, action, null, mc.thePlayer);
 			return;
 		}
 		
 		if(!mc.thePlayer.getGamemode().consumeBlocks()) {
 			// Duplicate items with middle mouse button
 			if(mouseButton == 2) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_GRAB, new int[] {slotId, 64}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_GRAB, new int[] {slotId, 64}, mc.thePlayer);
 				return;
 			}
 		}
@@ -317,14 +320,14 @@ public abstract class GuiContainer extends GuiScreen
 		int target = 0; 
 
 		Slot slot = inventorySlots.getSlot(slotId);
-		ItemStack stackInSlot = slot != null ? slot.getStack() : null;
+		ItemStack stackInSlot = slot != null ? slot.getItem() : null;
 		Item itemInSlot = stackInSlot != null ? stackInSlot.getItem() : null;
 		int clickedItemId = stackInSlot != null ? stackInSlot.getItem().id : 0;
 		ItemStack grabbedItem = mc.thePlayer.inventory.getHeldItemStack();
 		
 		if(mouseButton == 1) action = InventoryAction.CLICK_RIGHT;
 		
-		if(slot instanceof SlotCrafting) {
+		if(slot instanceof ResultSlot) {
 			// Crafting behavior
 			if(mc.gameSettings.swapCraftingButtons.value) {
 				if(shiftPressed && ctrlPressed) {
@@ -358,44 +361,44 @@ public abstract class GuiContainer extends GuiScreen
 			}
 		}
 		
-		if(slot instanceof SlotCreative) {
+		if(slot instanceof CreativeSlot) {
 			// Creative slot behavior
 			ItemStack heldItem = mc.thePlayer.inventory.getHeldItemStack();
 			
 			if(heldItem != null) {
 				if(heldItem.canStackWith(stackInSlot)) {
 					if(shiftPressed || ctrlPressed) {
-						mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_GRAB, new int[] {slot.id, heldItem.getMaxStackSize()}, mc.thePlayer);
+						mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_GRAB, new int[] {slot.index, heldItem.getMaxStackSize()}, mc.thePlayer);
 					}else {
-						mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_GRAB, new int[] {slot.id, heldItem.stackSize + 1}, mc.thePlayer);
+						mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_GRAB, new int[] {slot.index, heldItem.stackSize + 1}, mc.thePlayer);
 					}
 				}else {
-					mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_GRAB, new int[] {slot.id, 0}, mc.thePlayer);
+					mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_GRAB, new int[] {slot.index, 0}, mc.thePlayer);
 				}
 			}else {
 				if(shiftPressed || ctrlPressed) {
 					int amount = 1;
 					if(shiftPressed && stackInSlot != null) amount = stackInSlot.getMaxStackSize();
-					mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_MOVE, new int[] {slot.id, amount}, mc.thePlayer);
+					mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_MOVE, new int[] {slot.index, amount}, mc.thePlayer);
 				}else {
-					mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_GRAB, new int[] {slot.id, 1}, mc.thePlayer);
+					mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_GRAB, new int[] {slot.index, 1}, mc.thePlayer);
 				}
 			}
 			return;
 		}
 
-		if(inventorySlots instanceof ContainerPlayer) {
-			if(itemInSlot instanceof ItemArmor || itemInSlot == Item.armorQuiver || itemInSlot == Item.armorQuiverGold || itemInSlot == Item.armorBootsIceskates) {
-				// Check for instanceof ItemArmor instead of canPutStackInSlot
+		if(inventorySlots instanceof InventoryMenu) {
+			if(itemInSlot instanceof IArmorItem) {
+				// Check for instanceof ArmorItem instead of canPutStackInSlot
 				// Pumpkins should not go into the armor slot when pressing shift
 				target = 2; // Into the armor slots
 			}
 		}
-		if(inventorySlots instanceof ContainerFurnace) {
+		if(inventorySlots instanceof FurnaceMenu) {
 			// Furnace behavior
-			ContainerFurnace furnace = (ContainerFurnace) inventorySlots;
+			FurnaceMenu furnace = (FurnaceMenu) inventorySlots;
 			
-			boolean isBlastFurnace = furnace.tileEntity instanceof TileEntityBlastFurnace;
+			boolean isBlastFurnace = furnace.furnace instanceof BlastFurnaceBlockEntity;
 			boolean isFuel, isIngredient = false;
 			
 			if(isBlastFurnace) {
@@ -422,31 +425,31 @@ public abstract class GuiContainer extends GuiScreen
 				target = 2; // Into the fuel slot
 			}
 		}
-		if(inventorySlots instanceof ContainerTrommel) {
+		if(inventorySlots instanceof TrommelMenu) {
 			if(LookupFuelFurnace.instance.getFuelYield(clickedItemId) > 0) {
 				target = 2; // Into the fuel slot
 			}else {
 				target = 1; // Into the item slots
 			}
 		}
-		if(inventorySlots instanceof ContainerWorkbench || inventorySlots instanceof ContainerPlayer) {
+		if(inventorySlots instanceof CraftingMenu || inventorySlots instanceof InventoryMenu) {
 			// Move items into crafting by holding alt
 			
 			if(altPressed) target = 1; // Into the crafting grid
 		}
-		if(inventorySlots instanceof ContainerPlayerCreative) {
+		if(inventorySlots instanceof CreativeInventoryMenu) {
 			// Delete items by holding alt in the creative inventory
 			
 			if(altPressed) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.CREATIVE_DELETE, new int[] {slot.id}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.CREATIVE_DELETE, new int[] {slot.index}, mc.thePlayer);
 				return;
 			}
 		}
 		
 		// Equip armor
-		if(slot != null && itemInSlot != null && itemInSlot instanceof ItemArmor) {
+		if(slot != null && itemInSlot instanceof IArmorItem) {
 			if(mouseButton == 1 && shiftPressed) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.EQUIP_ARMOR, new int[] {slot.id}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.EQUIP_ARMOR, new int[] {slot.index}, mc.thePlayer);
 				return;
 			}
 		}
@@ -454,7 +457,7 @@ public abstract class GuiContainer extends GuiScreen
 		// Inventory Interactions (Grabbed Item)
 		if(slot != null && slot.allowItemInteraction() && grabbedItem != null && grabbedItem.getItem().hasInventoryInteraction()) {
 			if(mouseButton == 1) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.INTERACT_GRABBED, new int[] {slot.id}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.INTERACT_GRABBED, new int[] {slot.index}, mc.thePlayer);
 				return;
 			}
 		}
@@ -462,13 +465,13 @@ public abstract class GuiContainer extends GuiScreen
 		// Inventory Interactions (Clicked Item)
 		if(slot != null && stackInSlot != null && slot.allowItemInteraction() && stackInSlot.getItem().hasInventoryInteraction()) {
 			if(mouseButton == 1) {
-				mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, InventoryAction.INTERACT_SLOT, new int[] {slot.id}, mc.thePlayer);
+				mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, InventoryAction.INTERACT_SLOT, new int[] {slot.index}, mc.thePlayer);
 				return;
 			}
 		}
 		
 		int[] args = new int[] { slotId, target };
-		mc.playerController.handleInventoryMouseClick(inventorySlots.windowId, action, args, mc.thePlayer);
+		mc.playerController.handleInventoryMouseClick(inventorySlots.containerId, action, args, mc.thePlayer);
 	}
 	public void controllerInput(ControllerInput controller){
 		Slot slot = controller.getSlotAtCursor(this);
@@ -482,18 +485,18 @@ public abstract class GuiContainer extends GuiScreen
 			if(controller.digitalPad.right.pressedThisFrame()) {
 				Slot slot3 = null;
 				//Get Next Slot to the right
-				for(Slot slot2 : inventorySlots.inventorySlots) {
-					if(slot2.xDisplayPosition > slot.xDisplayPosition && Math.abs(slot2.yDisplayPosition - slot.yDisplayPosition) < 12) {
-						if(slot3 == null || slot2.xDisplayPosition < slot3.xDisplayPosition) {
+				for(Slot slot2 : inventorySlots.slots) {
+					if(slot2.x > slot.x && Math.abs(slot2.y - slot.y) < 12) {
+						if(slot3 == null || slot2.x < slot3.x) {
 							slot3 = slot2;
 						}
 					}
 				}
 				if(slot3 == null) {
 					//Get First Slot on the left
-					for(Slot slot2 : inventorySlots.inventorySlots) {
-						if(Math.abs(slot2.yDisplayPosition - slot.yDisplayPosition) < 12) {
-							if(slot3 == null || slot2.xDisplayPosition < slot3.xDisplayPosition) {
+					for(Slot slot2 : inventorySlots.slots) {
+						if(Math.abs(slot2.y - slot.y) < 12) {
+							if(slot3 == null || slot2.x < slot3.x) {
 								slot3 = slot2;
 							}
 						}
@@ -504,18 +507,18 @@ public abstract class GuiContainer extends GuiScreen
 			if(controller.digitalPad.left.pressedThisFrame()) {
 				Slot slot3 = null;
 				//Get Next Slot to the left
-				for(Slot slot2 : this.inventorySlots.inventorySlots) {
-					if(slot2.xDisplayPosition < slot.xDisplayPosition && Math.abs(slot2.yDisplayPosition - slot.yDisplayPosition) < 12) {
-						if(slot3 == null || slot2.xDisplayPosition > slot3.xDisplayPosition) {
+				for(Slot slot2 : this.inventorySlots.slots) {
+					if(slot2.x < slot.x && Math.abs(slot2.y - slot.y) < 12) {
+						if(slot3 == null || slot2.x > slot3.x) {
 							slot3 = slot2;
 						}
 					}
 				}
 				if(slot3 == null) {
 					//Get First Slot on the right
-					for(Slot slot2 : this.inventorySlots.inventorySlots) {
-						if(Math.abs(slot2.yDisplayPosition - slot.yDisplayPosition) < 12) {
-							if(slot3 == null || slot2.xDisplayPosition > slot3.xDisplayPosition) {
+					for(Slot slot2 : this.inventorySlots.slots) {
+						if(Math.abs(slot2.y - slot.y) < 12) {
+							if(slot3 == null || slot2.x > slot3.x) {
 								slot3 = slot2;
 							}
 						}
@@ -526,18 +529,18 @@ public abstract class GuiContainer extends GuiScreen
 			if(controller.digitalPad.up.pressedThisFrame()) {
 				Slot slot3 = null;
 				//Get Next Slot up
-				for(Slot slot2 : this.inventorySlots.inventorySlots) {
-					if(slot2.yDisplayPosition < slot.yDisplayPosition && Math.abs(slot2.xDisplayPosition - slot.xDisplayPosition) < 12) {
-						if(slot3 == null || slot2.yDisplayPosition > slot3.yDisplayPosition) {
+				for(Slot slot2 : this.inventorySlots.slots) {
+					if(slot2.y < slot.y && Math.abs(slot2.x - slot.x) < 12) {
+						if(slot3 == null || slot2.y > slot3.y) {
 							slot3 = slot2;
 						}
 					}
 				}
 				if(slot3 == null) {
 					//Get First Slot on the bottom
-					for(Slot slot2 : this.inventorySlots.inventorySlots) {
-						if(Math.abs(slot2.xDisplayPosition - slot.xDisplayPosition) < 12) {
-							if(slot3 == null || slot2.yDisplayPosition > slot3.yDisplayPosition) {
+					for(Slot slot2 : this.inventorySlots.slots) {
+						if(Math.abs(slot2.x - slot.x) < 12) {
+							if(slot3 == null || slot2.y > slot3.y) {
 								slot3 = slot2;
 							}
 						}
@@ -548,18 +551,18 @@ public abstract class GuiContainer extends GuiScreen
 			if(controller.digitalPad.down.pressedThisFrame()) {
 				Slot slot3 = null;
 				//Get Next Slot down
-				for(Slot slot2 : this.inventorySlots.inventorySlots) {
-					if(slot2.yDisplayPosition > slot.yDisplayPosition && Math.abs(slot2.xDisplayPosition - slot.xDisplayPosition) < 12) {
-						if(slot3 == null || slot2.yDisplayPosition < slot3.yDisplayPosition) {
+				for(Slot slot2 : this.inventorySlots.slots) {
+					if(slot2.y > slot.y && Math.abs(slot2.x - slot.x) < 12) {
+						if(slot3 == null || slot2.y < slot3.y) {
 							slot3 = slot2;
 						}
 					}
 				}
 				if(slot3 == null) {
 					//Get First Slot on the top
-					for(Slot slot2 : this.inventorySlots.inventorySlots) {
-						if(Math.abs(slot2.xDisplayPosition - slot.xDisplayPosition) < 12) {
-							if(slot3 == null || slot2.yDisplayPosition < slot3.yDisplayPosition) {
+					for(Slot slot2 : this.inventorySlots.slots) {
+						if(Math.abs(slot2.x - slot.x) < 12) {
+							if(slot3 == null || slot2.y < slot3.y) {
 								slot3 = slot2;
 							}
 						}
@@ -586,7 +589,7 @@ public abstract class GuiContainer extends GuiScreen
 		boolean flag = x < x2 || y < y2 || x >= x2 + xSize || y >= y2 + ySize;
 		int slotId = -1;
 		if(slot != null) {
-			slotId = slot.id;
+			slotId = slot.index;
 		}
 		if(flag) {
 			slotId = -999;
@@ -603,7 +606,7 @@ public abstract class GuiContainer extends GuiScreen
 		}
 		else
 		{
-			mc.playerController.handleCloseInventory(inventorySlots.windowId, mc.thePlayer);
+			mc.playerController.handleCloseInventory(inventorySlots.containerId, mc.thePlayer);
 			return;
 		}
 	}
diff --git a/src/main/java/net/minecraft/client/gui/GuiControllerSetup.java b/src/main/java/net/minecraft/client/gui/GuiControllerSetup.java
index 72e2cbde3..76b30f83e 100644
--- a/src/main/java/net/minecraft/client/gui/GuiControllerSetup.java
+++ b/src/main/java/net/minecraft/client/gui/GuiControllerSetup.java
@@ -1,260 +1,226 @@
 package net.minecraft.client.gui;
 
-import static org.lwjgl.opengl.GL11.*;
-
-import net.java.games.input.Component;
 import net.minecraft.client.input.InputHandler;
 import net.minecraft.client.input.InputType;
 import net.minecraft.client.input.controller.ControllerInput;
+import net.minecraft.client.input.controller.ControllerType;
 import net.minecraft.client.input.controller.Joystick;
 import net.minecraft.core.lang.I18n;
+import org.lwjgl.opengl.GL11;
+
+import java.util.Arrays;
+
+import static org.lwjgl.opengl.GL11.*;
+
+public class GuiControllerSetup extends GuiScreen {
+    private ControllerInput lastController = null;
+    private GuiButton controllerButton;
+    private ControllerGlyphRenderer glyphRenderer;
+
+    public GuiControllerSetup(GuiScreen parentScreen) {
+        super(parentScreen);
+    }
+
+    @Override
+    public void init() {
+        controllerButton = new GuiButton(0, 0, 0, "");
+        controllerButton.xPosition = width / 2 - 100;
+        controllerButton.yPosition = 16;
+        controllerButton.width = 200;
+        controllerButton.height = 20;
+
+        controlList.add(controllerButton);
+
+        controlList.add(new GuiButton(-1, width / 2 - 100, height - 40, I18n.getInstance().translateKey("gui.controller_setup.button.back")).setListener((e) -> mc.displayGuiScreen(parentScreen)));
+
+        this.glyphRenderer = new ControllerGlyphRenderer(mc);
+
+        updateDisplay();
+    }
+
+    @Override
+    public void tick() {
+        super.tick();
+        if (mc.controllerInput != lastController) {
+            updateDisplay();
+            lastController = mc.controllerInput;
+        }
+    }
+
+    @Override
+    public void drawScreen(int mouseX, int mouseY, float partialTick) {
+        drawDefaultBackground();
+        super.drawScreen(mouseX, mouseY, partialTick);
+
+        ControllerInput controller = mc.controllerInput;
+
+
+        if (controller != null) {
+            boolean swapJoystickAndDPad = controller.getType().getCategory() == ControllerType.Category.XBOX || controller.getType().getCategory() == ControllerType.Category.NINTENDO;
+            int y = height / 2 - 64;
+
+            glDisable(GL_DEPTH_TEST);
+            glDisable(GL_CULL_FACE);
+            glDisable(GL_TEXTURE_2D);
+            if (swapJoystickAndDPad) {
+                drawJoystick(controller.joyLeft, width / 2 - 100 + 8, y + 32 + 4 + 8);
+            } else {
+                drawJoystick(controller.joyLeft, width / 2 - 48, y + 96);
+            }
+            drawJoystick(controller.joyRight, width / 2 - 48 + 64, y + 96);
+
+            int x1 = width / 2;
+
+            GL11.glEnable(GL_TEXTURE_2D);
+            fontRenderer.drawCenteredString("(" + controller.getType().getPrintableName() + ")", width / 2, 40, 0xFFFFFF);
+
+            int w = glyphRenderer.getButtonSizeU(controller, controller.buttonLeftTrigger);
+            glyphRenderer.drawButton(controller, controller.buttonLeftTrigger, x1 - 65 - w, y, controller.buttonLeftTrigger.isPressed());
+            glyphRenderer.drawButton(controller, controller.buttonRightTrigger, x1 + 65, y, controller.buttonRightTrigger.isPressed());
+            w = glyphRenderer.getButtonSizeU(controller, controller.buttonBack);
+            glyphRenderer.drawButton(controller, controller.buttonBack, x1 - 20 - w, y + 32, controller.buttonBack.isPressed());
+            glyphRenderer.drawButton(controller, controller.buttonStart, x1 + 20, y + 32, controller.buttonStart.isPressed());
+            w = glyphRenderer.getButtonSizeU(controller, controller.buttonLeftShoulder);
+            glyphRenderer.drawButton(controller, controller.buttonLeftShoulder, x1 - 65 - w, y + 15, controller.buttonLeftShoulder.isPressed());
+            glyphRenderer.drawButton(controller, controller.buttonRightShoulder, x1 + 65, y + 15, controller.buttonRightShoulder.isPressed());
+
+            //Buttons
+            drawButtons(controller, width / 2 + 50, y + 32);
+
+            //Digital Pad
+            if (swapJoystickAndDPad) {
+                glyphRenderer.drawDPad(controller, x1 - 48 - 8, y + 96 - 8, controller.digitalPad.up.isPressed(), controller.digitalPad.right.isPressed(), controller.digitalPad.down.isPressed(), controller.digitalPad.left.isPressed());
+            } else {
+                glyphRenderer.drawDPad(controller, x1 - 48 - 8, y + 96 - 8, controller.digitalPad.up.isPressed(), controller.digitalPad.right.isPressed(), controller.digitalPad.down.isPressed(), controller.digitalPad.left.isPressed());
+            }
+
+        }
+    }
+
+    private void drawButtons(ControllerInput controller, int x, int y) {
+        int w = 20;
+
+        glyphRenderer.drawButton(controller, controller.buttonA, x + w * 1, y + w * 2, controller.buttonA.isPressed());
+        glyphRenderer.drawButton(controller, controller.buttonB, x + w * 2, y + w * 1, controller.buttonB.isPressed());
+        glyphRenderer.drawButton(controller, controller.buttonX, x + w * 0, y + w * 1, controller.buttonX.isPressed());
+        glyphRenderer.drawButton(controller, controller.buttonY, x + w * 1, y + w * 0, controller.buttonY.isPressed());
+    }
+
+    private void drawDPad(ControllerInput controller, int x, int y) {
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
+        glColor3d(1.0, 1.0, 1.0);
+        glBegin(GL_QUADS);
+
+        rectangle(x, y, 48, 48, 0, 64, 48, 48);
+
+        if (controller.digitalPad.up.isPressed())
+            rectangle(x + 18, y + 0, 12, 18, 66, 64, 12, 18);
+        if (controller.digitalPad.down.isPressed())
+            rectangle(x + 18, y + 30, 12, 18, 66, 94, 12, 18);
+        if (controller.digitalPad.left.isPressed())
+            rectangle(x + 0, y + 18, 18, 12, 48, 82, 18, 12);
+        if (controller.digitalPad.right.isPressed())
+            rectangle(x + 30, y + 18, 18, 12, 78, 82, 18, 12);
+
+        glEnd();
+
+    }
+
+    @Override
+    public void keyTyped(char c, int i, int mouseX, int mouseY) {
+
+    }
+
+    private void drawJoystick(Joystick joystick, int x, int y) {
+        glDisable(GL_TEXTURE_2D);
+
+        glBegin(GL_QUADS);
+        glColor3d(0.5, 0.5, 0.5);
+        rectangle(x, y, 32, 32);
+        glColor3d(0.0, 1.0, 0.0);
+        if (joystick.getButton().isPressed()) glColor3d(1.0, 0.0, 0.0);
+        rectangle(x + (joystick.getX() * 0.5 + 0.5) * 32 - 1, y + (joystick.getY() * 0.5 + 0.5) * 32 - 1, 2, 2);
+        glEnd();
+
+        glEnable(GL_TEXTURE_2D);
+    }
+
+    private void rectangle(double x, double y, double w, double h) {
+        glVertex2d(x, y);
+        glVertex2d(x + w, y);
+        glVertex2d(x + w, y + h);
+        glVertex2d(x, y + h);
+    }
+
+    private void rectangle(double x, double y, double w, double h, int u0, int v0, int uw, int vh) {
+        double u1 = u0 + uw;
+        double v1 = v0 + vh;
+        glTexCoord2d(u0 / 256.0, v0 / 256.0);
+        glVertex2d(x, y);
+        glTexCoord2d(u1 / 256.0, v0 / 256.0);
+        glVertex2d(x + w, y);
+        glTexCoord2d(u1 / 256.0, v1 / 256.0);
+        glVertex2d(x + w, y + h);
+        glTexCoord2d(u0 / 256.0, v1 / 256.0);
+        glVertex2d(x, y + h);
+    }
+
+    @Override
+    protected void buttonPressed(GuiButton button) {
+        super.buttonPressed(button);
+
+        if (button.id == 0) {
+            int index;
+            if (mc.controllerInput == null) {
+                index = 0;
+            } else {
+                index = Arrays.asList(InputHandler.controllers).indexOf(mc.controllerInput);
+                do {
+                    index++;
+                    if (index >= InputHandler.controllers.length) {
+                        index = -1;
+                        break;
+                    }
+                } while (InputHandler.controllers[index] == null);
+            }
+            if (index == -1) {
+                mc.controllerInput = null;
+                mc.setInputType(InputType.KEYBOARD);
+            } else {
+                mc.controllerInput = InputHandler.controllers[index];
+                mc.setInputType(InputType.CONTROLLER);
+            }
+            updateDisplay();
+            save();
+        }
+    }
+
+    @Override
+    public void onClosed() {
+        if (mc.inputType == InputType.CONTROLLER) {
+            mc.mouseInput.grabCursor();
+        }
+    }
+
+    private void updateDisplay() {
+        if (mc.controllerInput != null) {
+            controllerButton.displayString = mc.controllerInput.getController().getName();
+            if (controllerButton.displayString.startsWith("SDL GameController ")) {
+                controllerButton.displayString = controllerButton.displayString.substring(19);
+            }
+        } else {
+            controllerButton.displayString = I18n.getInstance().translateKey("gui.controller_setup.label.no_controller_selected");
+        }
+    }
+
+    private void save() {
+        if (mc.controllerInput != null) {
+            mc.gameSettings.selectedController.value = mc.controllerInput.getGUID();
+        } else {
+            mc.gameSettings.selectedController.value = "";
+        }
+        mc.gameSettings.saveOptions();
+    }
 
-public class GuiControllerSetup extends GuiScreen{
-	
-	private int selectedController = 0;
-	
-	private GuiButton controllerButton;
-	
-	public GuiControllerSetup(GuiScreen parentScreen) {
-		super(parentScreen);
-	}
-	
-	@Override
-	public void init() {
-		addButtons();
-	}
-	
-	public void addButtons() {
-		controllerButton = new GuiButton(0, 0, 0, "");
-		controllerButton.xPosition = width / 2 - 100;
-		controllerButton.yPosition = 16;
-		controllerButton.width = 200;
-		controllerButton.height = 20;
-		
-		controlList.add(controllerButton);
-
-//		if(selectedController >= 0)
-//		controlList.add(new GuiButton(-1, width / 2 - 100, height - 61, "Reset Buttons").setListener((e) -> InputHandler.controllers.get(selectedController).setLayout1()));
-		controlList.add(new GuiButton(-1, width / 2 - 100, height - 40, I18n.getInstance().translateKey("gui.controller_setup.button.back")).setListener((e) -> mc.displayGuiScreen(parentScreen)));
-		updateController();
-	}
-	
-	@Override
-	public void drawScreen(int mouseX, int mouseY, float partialTick) {
-		drawDefaultBackground();
-		super.drawScreen(mouseX, mouseY, partialTick);
-
-		ControllerInput controller;
-		if(selectedController >= 0 && InputHandler.controllers.size() > 0) {
-			controller = InputHandler.controllers.get(selectedController);
-		}else {
-			controller = null;
-		}
-		
-		if (controller == null)
-		{
-			drawStringCentered(fontRenderer, I18n.getInstance().translateKey("gui.controller_setup.label.help.1"), width / 2, 46, 0xFFFFFFFF);
-			drawStringCentered(fontRenderer, I18n.getInstance().translateKey("gui.controller_setup.label.help.2"), width / 2, 58, 0xFFFFFFFF);
-		}
-		
-		if(controller != null) {
-			int i = 0;
-
-			glDisable(GL_DEPTH_TEST);
-			glDisable(GL_CULL_FACE);
-			glDisable(GL_TEXTURE_2D);
-			
-			for(Component comp : controller.getController().getComponents()) {
-				float data = comp.getPollData();
-				int dataD = (int)(data * 256f);
-				if(comp.isAnalog()) data = data * 0.5f + 0.5f;
-				
-				int x1 = 8;
-				int y1 = 16 + i * 10;
-				int w = 32;
-				
-				glDisable(GL_TEXTURE_2D);
-				
-				glBegin(GL_QUADS);
-				glColor3d(0.2, 0.2, 0.2);
-				rectangle(x1, y1, w, 10);
-				glEnd();
-				
-				glBegin(GL_QUADS);
-				glColor3d(1.0, 1.0, 1.0);
-				rectangle(x1 + data * w - 1, y1, 2, 10);
-				glEnd();
-
-				glEnable(GL_TEXTURE_2D);
-				if(comp.isAnalog()) {
-					fontRenderer.drawStringWithShadow(comp.getIdentifier() + ": " + data, 48, 16 + i++ * 10, 0xffffff);
-				}else {
-					fontRenderer.drawStringWithShadow(comp.getIdentifier() + ": " + dataD, 48, 16 + i++ * 10, 0xffffff);
-				}
-				
-				
-			}
-			
-			glDisable(GL_DEPTH_TEST);
-			glDisable(GL_CULL_FACE);
-			glDisable(GL_TEXTURE_2D);
-			
-//			glEnable(GL_TEXTURE_2D);
-//			glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/controller.png"));
-//			drawTexturedModalRect(width / 2 - 64, height / 2 - 46, 0, 0, 128, 92);
-			
-			glDisable(GL_TEXTURE_2D);
-			drawJoystick(controller.joyLeft, width / 2 - 48, 64);
-			drawJoystick(controller.joyRight, width / 2 - 48 + 64, 64);
-
-			glEnable(GL_TEXTURE_2D);
-			glEnable(GL_TEXTURE_2D);
-			glColor3d(1.0, 1.0, 1.0);
-			
-			int x1 = width / 2 - 200;
-			
-//			fontRenderer.drawStringWithShadow("A", x1+128, 132, controller.buttonA.isPressed() ? 0xFFFFFF : 0x505050);
-//			fontRenderer.drawStringWithShadow("B", x1+138, 132, controller.buttonB.isPressed() ? 0xFFFFFF : 0x505050);
-//			fontRenderer.drawStringWithShadow("X", x1+148, 132, controller.buttonX.isPressed() ? 0xFFFFFF : 0x505050);
-//			fontRenderer.drawStringWithShadow("Y", x1+158, 132, controller.buttonY.isPressed() ? 0xFFFFFF : 0x505050);
-
-			glEnable(GL_TEXTURE_2D);
-			
-			fontRenderer.drawStringWithShadow("ZL", x1+168, 132, controller.buttonZL.isPressed() ? 0xFFFFFF : 0x505050);
-			fontRenderer.drawStringWithShadow("ZR", x1+188, 132, controller.buttonZR.isPressed() ? 0xFFFFFF : 0x505050);
-			fontRenderer.drawStringWithShadow("-", x1+208, 132, controller.buttonMinus.isPressed() ? 0xFFFFFF : 0x505050);
-			fontRenderer.drawStringWithShadow("+", x1+218, 132, controller.buttonPlus.isPressed() ? 0xFFFFFF : 0x505050);
-			fontRenderer.drawStringWithShadow("L", x1+228, 132, controller.buttonL.isPressed() ? 0xFFFFFF : 0x505050);
-			fontRenderer.drawStringWithShadow("R", x1+238, 132, controller.buttonR.isPressed() ? 0xFFFFFF : 0x505050);
-			
-			glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/controller/xbox360.png"));
-
-			glColor3d(1.0, 1.0, 1.0);
-			glBegin(GL_QUADS);
-			
-			//Buttons
-			{
-				int x2 = width / 2 + 50;
-				int y2 = height / 2;
-				int w2 = 20;
-				
-				rectangle(x2+w2*1, y2+w2*2, w2, w2,  0, controller.buttonA.isPressed() ? 20 : 0, 20, 20);
-				rectangle(x2+w2*2, y2+w2*1, w2, w2, 20, controller.buttonB.isPressed() ? 20 : 0, 20, 20);
-				rectangle(x2+w2*0, y2+w2*1, w2, w2, 40, controller.buttonX.isPressed() ? 20 : 0, 20, 20);
-				rectangle(x2+w2*1, y2+w2*0, w2, w2, 60, controller.buttonY.isPressed() ? 20 : 0, 20, 20);
-			}
-			
-//			//Digital Pad (Small)
-//			{
-//				int x2 = width / 2 - 50;
-//				int y2 = height / 2;
-//				
-//				rectangle(x2, y2, 24, 24, 0, 40, 24, 24);
-//
-//				if(controller.digitalPad.up.isPressed())
-//					rectangle(x2 +  9, y2 +  0, 6, 9, 33, 40, 6, 9);
-//				if(controller.digitalPad.down.isPressed())
-//					rectangle(x2 +  9, y2 + 15, 6, 9, 33, 55, 6, 9);
-//				if(controller.digitalPad.left.isPressed())
-//					rectangle(x2 +  0, y2 +  9, 9, 6, 24, 49, 9, 6);
-//				if(controller.digitalPad.right.isPressed())
-//					rectangle(x2 + 15, y2 +  9, 9, 6, 39, 49, 9, 6);
-//			}
-			
-			//Digital Pad (Big)
-			{
-				int x2 = width / 2 - 100;
-				int y2 = height / 2 + 4;
-				
-				rectangle(x2, y2, 48, 48, 0, 64, 48, 48);
-
-				if(controller.digitalPad.up.isPressed())
-					rectangle(x2 + 18, y2 +  0, 12, 18, 66, 64, 12, 18);
-				if(controller.digitalPad.down.isPressed())
-					rectangle(x2 + 18, y2 + 30, 12, 18, 66, 94, 12, 18);
-				if(controller.digitalPad.left.isPressed())
-					rectangle(x2 +  0, y2 + 18, 18, 12, 48, 82, 18, 12);
-				if(controller.digitalPad.right.isPressed())
-					rectangle(x2 + 30, y2 + 18, 18, 12, 78, 82, 18, 12);
-			}
-			glEnd();
-
-		}
-	}
-	
-	@Override
-	public void keyTyped(char c, int i, int mouseX, int mouseY) {
-		
-	}
-
-	public void drawJoystick(Joystick joystick, int x, int y) {
-		glBegin(GL_QUADS);
-		glColor3d(0.5, 0.5, 0.5);
-		rectangle(x, y, 32, 32);
-		glColor3d(0.0, 1.0, 0.0);
-		if(joystick.getButton().isPressed()) glColor3d(1.0, 0.0, 0.0);
-		rectangle(x + (joystick.getX() * 0.5 + 0.5) * 32 - 1, y + (joystick.getY() * 0.5 + 0.5) * 32 - 1, 2, 2);
-		glEnd();
-	}
-	
-	public void rectangle(double x, double y, double w, double h) {
-		glVertex2d(x, y);
-		glVertex2d(x+w, y);
-		glVertex2d(x+w, y+h);
-		glVertex2d(x, y+h);
-	}
-	
-	public void rectangle(double x, double y, double w, double h, int u0, int v0, int uw, int vh) {
-		double u1 = u0 + uw;
-		double v1 = v0 + vh;
-		glTexCoord2d(u0 / 256.0, v0 / 256.0);
-		glVertex2d(x, y);
-		glTexCoord2d(u1 / 256.0, v0 / 256.0);
-		glVertex2d(x+w, y);
-		glTexCoord2d(u1 / 256.0, v1 / 256.0);
-		glVertex2d(x+w, y+h);
-		glTexCoord2d(u0 / 256.0, v1 / 256.0);
-		glVertex2d(x, y+h);
-	}
-	
-	@Override
-	protected void buttonPressed(GuiButton button) {
-		super.buttonPressed(button);
-		
-		if(button.id == 0) {
-			selectedController ++;
-			if(selectedController >= InputHandler.controllers.size()) selectedController = -1;
-			controlList.clear();
-			addButtons();
-		}
-	}
-	
-	@Override
-	public void onClosed() {
-		if(mc.inputType == InputType.CONTROLLER) {
-			mc.mouseInput.grabCursor();
-		}
-	}
-	
-	public void updateController() {
-		ControllerInput controllerInput;
-		if(selectedController >= 0 && InputHandler.controllers.size() > 0) {
-			mc.setInputType(InputType.CONTROLLER);
-			controllerInput = InputHandler.controllers.get(selectedController);
-			controllerButton.displayString = controllerInput.getController().toString();
-		}else {
-			mc.setInputType(InputType.KEYBOARD);
-			controllerInput = null;
-			controllerButton.displayString = I18n.getInstance().translateKey("gui.controller_setup.label.no_controller_selected");
-		}
-		mc.controllerInput = controllerInput;
-		if(mc.controllerInput != null) {
-			mc.gameSettings.selectedController.value = mc.controllerInput.getController().toString();
-		}else {
-			mc.gameSettings.selectedController.value = "";
-		}
-		mc.gameSettings.saveOptions();
-		
-	}
-	
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiCrafting.java b/src/main/java/net/minecraft/client/gui/GuiCrafting.java
index e3cf65bf0..eafc14814 100644
--- a/src/main/java/net/minecraft/client/gui/GuiCrafting.java
+++ b/src/main/java/net/minecraft/client/gui/GuiCrafting.java
@@ -2,8 +2,8 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.player.inventory.ContainerWorkbench;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.CraftingMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.world.World;
 import org.lwjgl.opengl.GL11;
 
@@ -14,9 +14,9 @@ import org.lwjgl.opengl.GL11;
 public class GuiCrafting extends GuiContainer
 {
 
-    public GuiCrafting(InventoryPlayer inventoryplayer, World world, int i, int j, int k)
+    public GuiCrafting(Inventory inventoryplayer, World world, int i, int j, int k)
     {
-        super(new ContainerWorkbench(inventoryplayer, world, i, j, k));
+        super(new CraftingMenu(inventoryplayer, world, i, j, k));
     }
 
     @Override
@@ -36,9 +36,8 @@ public class GuiCrafting extends GuiContainer
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int i = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/crafting.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/crafting.png").bind();
         int j = (width - xSize) / 2;
         int k = (height - ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
diff --git a/src/main/java/net/minecraft/client/gui/GuiCreateWorld.java b/src/main/java/net/minecraft/client/gui/GuiCreateWorld.java
index ebb29ce57..d247c645f 100644
--- a/src/main/java/net/minecraft/client/gui/GuiCreateWorld.java
+++ b/src/main/java/net/minecraft/client/gui/GuiCreateWorld.java
@@ -1,84 +1,55 @@
 package net.minecraft.client.gui;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-
 import net.minecraft.client.gui.popup.GuiPopup;
 import net.minecraft.client.gui.popup.PopupBuilder;
+import net.minecraft.client.player.controller.PlayerControllerSP;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.lang.I18n;
-import net.minecraft.client.player.controller.PlayerControllerSP;
-import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.type.WorldType;
-import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.save.ISaveFormat;
+import net.minecraft.core.world.type.WorldTypeGroups;
 import org.lwjgl.input.Keyboard;
 
-public class GuiCreateWorld extends GuiScreen
-{
+import java.util.List;
+import java.util.Random;
+
+public class GuiCreateWorld extends GuiScreen {
     private int overrideSpawnX;
     private int overrideSpawnY;
     private int overrideSpawnZ;
-    private GuiScreen field_22131_a;
+    private GuiScreen textField;
     private GuiTextField textboxWorldName;
     private GuiTextField textboxSeed;
     private GuiButton createWorldButton;
     private GuiButton gamemodeButton;
     private GuiButton cheatsButton;
     private GuiButton worldTypeButton;
-    private GuiTexturedButton buttonRandomWorldName;
-    private GuiTexturedButton buttonRandomSeed;
+    private GuiButton buttonRandomWorldName;
+    private GuiButton buttonRandomSeed;
     private String folderName;
     private boolean createClicked;
     private Gamemode selectedGamemode = Gamemode.survival;
     private boolean cheatsEnabled = false;
-    private int worldType = 0;
-    private final List<WorldType> worldTypes;
+    private WorldTypeGroups.Group worldTypeGroup = WorldTypeGroups.DEFAULT;
     private long seed = (new Random()).nextLong();
 
-    public GuiCreateWorld(GuiScreen guiscreen)
-    {
-        field_22131_a = guiscreen;
-
-        // Initialize world types
-        worldTypes = new ArrayList<>();
-        worldTypes.addAll(Arrays.asList(
-            WorldTypes.OVERWORLD_EXTENDED, WorldTypes.OVERWORLD_DEFAULT, WorldTypes.OVERWORLD_WINTER,
-            WorldTypes.OVERWORLD_FLOATING, WorldTypes.OVERWORLD_AMPLIFIED, WorldTypes.OVERWORLD_ISLANDS,
-            WorldTypes.OVERWORLD_INLAND, WorldTypes.FLAT, WorldTypes.OVERWORLD_HELL, WorldTypes.OVERWORLD_WOODS,
-            WorldTypes.OVERWORLD_PARADISE, WorldTypes.OVERWORLD_CLASSIC, WorldTypes.OVERWORLD_INDEV, WorldTypes.OVERWORLD_RETRO,
-            WorldTypes.EMPTY, WorldTypes.DEBUG
-        ));
-
-        for (WorldType worldType : Registries.WORLD_TYPES)
-        {
-            if (!worldTypes.contains(worldType))
-            {
-                worldTypes.add(worldType);
-            }
-        }
-
-        worldTypes.remove(WorldTypes.NETHER_DEFAULT);
-        worldTypes.remove(WorldTypes.PARADISE_DEFAULT);
+    public GuiCreateWorld(GuiScreen guiscreen) {
+        textField = guiscreen;
     }
 
     @Override
-	public void tick()
-    {
+    public void tick() {
         textboxWorldName.updateCursorCounter();
         textboxSeed.updateCursorCounter();
     }
 
     @Override
-	public void init()
-    {
+    public void init() {
         I18n i18n = I18n.getInstance();
         Keyboard.enableRepeatEvents(true);
         controlList.clear();
@@ -93,142 +64,116 @@ public class GuiCreateWorld extends GuiScreen
         controlList.add(gamemodeButton = new GuiButton(2, width / 2 - 100, 100 + 20 + 4, 98, 20, ""));
         controlList.add(cheatsButton = new GuiButton(3, width / 2 - 100 + 102, 100 + 20 + 4, 98, 20, ""));
         controlList.add(worldTypeButton = new GuiButton(4, width / 2 - 100, 100 + 20 + 20 + 4 + 4, ""));
-        controlList.add(buttonRandomWorldName = new GuiTexturedButton(5, "/assets/minecraft/textures/gui/gui.png", width / 2 + 100 - 20, 60, 60, 86, 20, 20));
-        controlList.add(buttonRandomSeed = new GuiTexturedButton(6, "/assets/minecraft/textures/gui/gui.png", width / 2 + 100 - 20, 100, 60, 86, 20, 20));
+        controlList.add(buttonRandomWorldName = new GuiButton(5, width / 2 + 100 - 20, 60, 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_random", "minecraft:gui/misc/button_random_highlighted", "minecraft:gui/misc/button_random"));
+        controlList.add(buttonRandomSeed = new GuiButton(6, width / 2 + 100 - 20, 100, 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_random", "minecraft:gui/misc/button_random_highlighted", "minecraft:gui/misc/button_random"));
         updateButtons();
         updateFolderName();
     }
 
-    private void updateFolderName()
-    {
+    private void updateFolderName() {
         folderName = textboxWorldName.getText().trim();
         char[] ac = ChatAllowedCharacters.ALLOWED_CHARACTERS_ARRAY;
         for (char c : ac) {
             folderName = folderName.replace(c, '_');
         }
 
-        if(MathHelper.stringNullOrLengthZero(folderName))
-        {
+        if (MathHelper.stringNullOrLengthZero(folderName)) {
             folderName = "New World";
         }
         folderName = generateUnusedFolderName(mc.getSaveFormat(), folderName);
     }
 
-    public static String generateUnusedFolderName(ISaveFormat isaveformat, String s)
-    {
+    public static String generateUnusedFolderName(ISaveFormat isaveformat, String s) {
         int count = 1;
         String newString = s;
-        for(; isaveformat.getLevelData(newString) != null; count++){
+        for (; isaveformat.getLevelData(newString) != null; count++) {
             newString = s + " (" + count + ")";
         }
         return newString;
     }
 
     @Override
-	public void onClosed()
-    {
+    public void onClosed() {
         Keyboard.enableRepeatEvents(false);
     }
 
     @Override
-	protected void buttonPressed(GuiButton button)
-    {
-        if(!button.enabled)
-        {
+    protected void buttonPressed(GuiButton button) {
+        if (!button.enabled) {
             return;
         }
-        if(button.id == 1)
-        {
-            mc.displayGuiScreen(field_22131_a);
-        } else
-        if(button.id == 0)
-        {
+        if (button.id == 1) {
+            mc.displayGuiScreen(textField);
+        } else if (button.id == 0) {
             mc.displayGuiScreen(null);
-            if(createClicked)
-            {
+            if (createClicked) {
                 return;
             }
             createClicked = true;
             long seed = this.seed;
             String seedText = textboxSeed.getText();
-            if(!MathHelper.stringNullOrLengthZero(seedText))
-            {
-                try
-                {
+            if (!MathHelper.stringNullOrLengthZero(seedText)) {
+                try {
                     long parsedSeed = Long.parseLong(seedText);
-                    if(parsedSeed != 0L)
-                    {
+                    if (parsedSeed != 0L) {
                         seed = parsedSeed;
                     }
-                }
-                catch(NumberFormatException e)
-                {
+                } catch (NumberFormatException e) {
                     seed = seedText.hashCode();
                 }
             }
-            Dimension.overworld.setDefaultWorldType(worldTypes.get(worldType));
             mc.playerController = new PlayerControllerSP(mc);
             String worldName = textboxWorldName.getText();
             if (worldName.isEmpty()) {
                 worldName = I18n.getInstance().translateKey("gui.create_world.label.new_world");
             }
-            mc.startWorld(folderName, worldName, seed);
+            mc.startWorld(folderName, worldName, seed, worldTypeGroup);
             mc.thePlayer.setGamemode(selectedGamemode);
-            if (selectedGamemode == Gamemode.adventure){
-                mc.thePlayer.inventory.insertItem(Item.toolAxeWood.getDefaultStack(), true);
+            if (selectedGamemode == Gamemode.adventure) {
+                mc.thePlayer.inventory.insertItem(Items.TOOL_AXE_WOOD.getDefaultStack(), true);
             }
             if (mc.worldPresetName != null) mc.thePlayer.setPos(overrideSpawnX, overrideSpawnY, overrideSpawnZ);
             mc.theWorld.getLevelData().setCheatsEnabled(cheatsEnabled);
             mc.displayGuiScreen(null);
-        }
-        else if (button == gamemodeButton)
-        {
+        } else if (button == gamemodeButton) {
             I18n i18n = I18n.getInstance();
             List<Gamemode> gamemodeList = Gamemode.getPublicGamemodes();
             selectedGamemode = gamemodeList.get((gamemodeList.indexOf(selectedGamemode) + 1) % gamemodeList.size());
-        	cheatsEnabled = selectedGamemode == Gamemode.creative;
+            cheatsEnabled = selectedGamemode == Gamemode.creative;
             updateButtons();
-        }
-        else if (button == cheatsButton)
-        {
-        	I18n i18n = I18n.getInstance();
-        	cheatsEnabled = !cheatsEnabled;
+        } else if (button == cheatsButton) {
+            I18n i18n = I18n.getInstance();
+            cheatsEnabled = !cheatsEnabled;
             updateButtons();
-        }
-        else if (button == worldTypeButton)
-        {
+        } else if (button == worldTypeButton) {
             I18n i18n = I18n.getInstance();
-            String[] keys = new String[worldTypes.size()];
-            String[] descs = new String[worldTypes.size()];
-            for (int i = 0; i < keys.length; i++)
-            {
-                keys[i] = i18n.translateKey(worldTypes.get(i).getLanguageKey() + ".name");
-                descs[i] = i18n.translateKey(worldTypes.get(i).getLanguageKey() + ".desc") + "\n" +
-                    TextFormatting.GRAY + Registries.WORLD_TYPES.getKey(worldTypes.get(i));
+            String[] keys = new String[WorldTypeGroups.GROUPS.size()];
+            String[] descs = new String[WorldTypeGroups.GROUPS.size()];
+            for (int i = 0; i < keys.length; i++) {
+                keys[i] = i18n.translateKey(WorldTypeGroups.GROUPS.get(i).get(Dimension.overworld).getLanguageKey() + ".name");
+                descs[i] = i18n.translateKey(WorldTypeGroups.GROUPS.get(i).get(Dimension.overworld).getLanguageKey() + ".desc") + "\n" +
+                    TextFormatting.GRAY + Registries.WORLD_TYPES.getKey(WorldTypeGroups.GROUPS.get(i).get(Dimension.overworld));
             }
 
             GuiPopup popup = new PopupBuilder(this, 150)
-                    .closeOnEsc(0)
-                    .closeOnClickOut(0)
-                    .withLabel("gui.create_world.label.select_world_type")
-                    .withList("worldTypeList", 140, keys, descs, worldType, true)
-                    .withOnCloseListener((statusCode, results) -> {
-                        if (statusCode == 1)
-                        {
-                            worldType = (Integer) results.get("worldTypeList");
-                            updateButtons();
-                        }
-                    })
-                    .build();
+                .closeOnEsc(0)
+                .closeOnClickOut(0)
+                .withLabel("gui.create_world.label.select_world_type")
+                .withList("worldTypeList", 140, keys, descs, WorldTypeGroups.GROUPS.indexOf(worldTypeGroup), true)
+                .withOnCloseListener((statusCode, results) -> {
+                    if (statusCode == 1) {
+                        worldTypeGroup = WorldTypeGroups.GROUPS.get((Integer) results.get("worldTypeList"));
+                        updateButtons();
+                    }
+                })
+                .build();
             mc.displayGuiScreen(popup);
-        }
-        else if (button == buttonRandomWorldName)
-        {
+        } else if (button == buttonRandomWorldName) {
             textboxWorldName.setText(I18n.getInstance().getCurrentLanguage().getRandomWorldName());
             updateFolderName();
-        }
-        else if (button == buttonRandomSeed)
-        {
+        } else if (button == buttonRandomSeed) {
             this.seed = (new Random()).nextLong();
             textboxSeed.setPlaceholder(Long.toString(seed));
             textboxSeed.setText("");
@@ -239,38 +184,32 @@ public class GuiCreateWorld extends GuiScreen
         I18n i18n = I18n.getInstance();
         gamemodeButton.displayString = i18n.translateKeyAndFormat("gui.create_world.button.gamemode", i18n.translateNameKey(selectedGamemode.getLanguageKey()));
         cheatsButton.displayString = i18n.translateKeyAndFormat("gui.create_world.button.cheats", i18n.translateKey(cheatsEnabled ? "gui.create_world.button.cheats.on" : "gui.create_world.button.cheats.off"));
-        worldTypeButton.displayString = i18n.translateKeyAndFormat("gui.create_world.button.world_type", i18n.translateNameKey(worldTypes.get(worldType).getLanguageKey()));
+        worldTypeButton.displayString = i18n.translateKeyAndFormat("gui.create_world.button.world_type", i18n.translateNameKey(worldTypeGroup.get(Dimension.overworld).getLanguageKey()));
     }
 
     @Override
-	public void keyTyped(char c, int i, int mouseX, int mouseY)
-    {
-    	if(i != Keyboard.KEY_BACK) super.keyTyped(c, i, mouseX, mouseY);
-        if(textboxWorldName.isFocused)
-        {
+    public void keyTyped(char c, int i, int mouseX, int mouseY) {
+        if (i != Keyboard.KEY_BACK) super.keyTyped(c, i, mouseX, mouseY);
+        if (textboxWorldName.isFocused) {
             textboxWorldName.textboxKeyTyped(c, i);
-        } else if (textboxSeed.isFocused)
-        {
+        } else if (textboxSeed.isFocused) {
             textboxSeed.textboxKeyTyped(c, i);
         }
-        if(c == '\r')
-        {
+        if (c == '\r') {
             buttonPressed(controlList.get(0));
         }
         updateFolderName();
     }
 
     @Override
-	public void mouseClicked(int mouseX, int mouseY, int mouseButton)
-    {
+    public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
         super.mouseClicked(mouseX, mouseY, mouseButton);
         textboxWorldName.mouseClicked(mouseX, mouseY, mouseButton);
         textboxSeed.mouseClicked(mouseX, mouseY, mouseButton);
     }
 
     @Override
-	public void drawScreen(int mouseX, int mouseY, float partialTick)
-    {
+    public void drawScreen(int mouseX, int mouseY, float partialTick) {
         I18n stringtranslate = I18n.getInstance();
         drawDefaultBackground();
         drawStringCentered(fontRenderer, stringtranslate.translateKey("gui.create_world.label.title"), width / 2, 20, 0xffffff);
@@ -282,21 +221,17 @@ public class GuiCreateWorld extends GuiScreen
     }
 
     @Override
-	public void selectNextField()
-    {
-        if(textboxWorldName.isFocused)
-        {
+    public void selectNextField() {
+        if (textboxWorldName.isFocused) {
             textboxWorldName.setFocused(false);
             textboxSeed.setFocused(true);
-        } else
-        {
+        } else {
             textboxWorldName.setFocused(true);
             textboxSeed.setFocused(false);
         }
     }
 
-    public void runPreset(String name, String seed, int spawnX, int spawnY, int spawnZ)
-    {
+    public void runPreset(String name, String seed, int spawnX, int spawnY, int spawnZ) {
         overrideSpawnX = spawnX;
         overrideSpawnY = spawnY;
         overrideSpawnZ = spawnZ;
diff --git a/src/main/java/net/minecraft/client/gui/GuiCredits.java b/src/main/java/net/minecraft/client/gui/GuiCredits.java
new file mode 100644
index 000000000..1dc580ded
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/GuiCredits.java
@@ -0,0 +1,269 @@
+package net.minecraft.client.gui;
+
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
+import net.minecraft.client.render.Scissor;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.util.helper.MathHelper;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+
+import java.awt.*;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.lwjgl.opengl.GL11.*;
+
+public class GuiCredits extends GuiScreen {
+    private static final int TOP_SPACING = 24;
+    private static final int BUTTON_SPACING = 4;
+
+    private static final String[] SONGS = {
+        "cat",
+        "blocks",
+        "chirp",
+        "far",
+        "mall",
+        "mellohi",
+        "stal",
+        "strad",
+        "ward",
+        "dog",
+    };
+
+    protected int top;
+    protected int bottom;
+
+    private float scrollAmount = 0.0f;
+    private Float oldScrollAmount;
+    private int scrollRegionHeight;
+    private Integer clickX, clickY;
+
+    private boolean playing = false;
+
+    private List<String> lines;
+
+    private float hue = 0;
+
+    public GuiCredits(GuiScreen parent) {
+        super(parent);
+
+        try (InputStream stream = GuiMainMenu.class.getResourceAsStream("/credits.txt")) {
+
+            List<String> lines = new ArrayList<>();
+            BufferedReader br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
+
+            while (true) {
+                String line = br.readLine();
+                if (line == null) {
+                    break;
+                }
+                line = line.trim();
+                lines.add(line);
+            }
+            this.lines = lines;
+        } catch (Exception e) {
+            e.printStackTrace();
+            this.lines = new ArrayList<>();
+            this.lines.add("An error occurred while loading the credits.");
+        }
+    }
+
+    @Override
+    public void init() {
+        top = TOP_SPACING;
+        bottom = height - (BUTTON_SPACING + 20 + BUTTON_SPACING);
+        scrollRegionHeight = bottom - top;
+        add(new GuiListenerButton(0, width / 2 - 100, height - (BUTTON_SPACING + 20), 200, 20, I18n.getInstance().translateKey("gui.credits.button.done")).setActionListener(() -> {
+            onClosed();
+            mc.displayGuiScreen(null);
+        }));
+
+        onScroll();
+    }
+
+    @Override
+    public void tick() {
+        if (!playing) {
+            mc.sndManager.playStreaming(SONGS[(int) (Math.random() * SONGS.length)], 0, 0, 0, 1.0f, 1.0f);
+            playing = true;
+        }
+    }
+
+    @Override
+    public void onClosed() {
+        mc.sndManager.playStreaming(null, 0, 0, 0, 0, 0);
+    }
+
+    @Override
+    public void drawScreen(int mouseX, int mouseY, float partialTick) {
+        // Handle scrolling
+        if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
+            scroll(Mouse.getDWheel() * -0.01f);
+        } else {
+            scroll(Mouse.getDWheel() / -0.05f);
+        }
+
+        drawDefaultBackground();
+        overlayBackground(0, width, 0, top);
+        overlayBackground(0, width, bottom, height);
+
+        drawScrollBar(mouseX, mouseY);
+
+        super.drawScreen(mouseX, mouseY, partialTick);
+
+        fontRenderer.drawCenteredString(I18n.getInstance().translateKey("gui.credits.label.title"), width / 2, 5, 0xFFFFFF);
+
+        Scissor.enable(0, top, width, bottom - top);
+        drawContent();
+        Scissor.disable();
+
+        hue = (hue + 1) % 360f;
+    }
+
+    private void drawContent() {
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/title/mclogo.png").bind();
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        drawTexturedModalRect(width / 2 - 274 / 2, 30 - (int)scrollAmount, 0, 0, 274, 50, 1d/274, 1d/50);
+
+        for (int i = 0; i < lines.size(); i++) {
+            String line = lines.get(i);
+            if (line.startsWith("*")) {
+                line = TextFormatting.BOLD + line.substring(1);
+                int lineWidth = fontRenderer.getStringWidth(line) + line.length();
+                fontRenderer.drawString(line, width / 2 - lineWidth / 2, 100 + i * 12 - (int)scrollAmount, 0xFFFFFF);
+            } else if (line.startsWith("!")) {
+                int rgb = Color.HSBtoRGB(hue / 360f, 1.0f, 1.0f);
+                line = TextFormatting.BOLD + line.substring(1);
+                int lineWidth = fontRenderer.getStringWidth(line) + line.length();
+                fontRenderer.drawString(line, width / 2 - lineWidth / 2, 100 + i * 12 - (int)scrollAmount, rgb);
+            } else {
+                fontRenderer.drawString(line, width / 2 - fontRenderer.getStringWidth(line) / 2, 100 + i * 12 - (int) scrollAmount, 0x7F7F7F);
+            }
+        }
+    }
+
+    protected void drawScrollBar(int mouseX, int mouseY) {
+        float totalPageHeight = getTotalPageHeight();
+        float scrollBarHeightPercent = scrollRegionHeight / totalPageHeight;
+
+        if (scrollBarHeightPercent > 1.0f) return;
+
+        glDisable(GL_TEXTURE_2D);
+
+        int scrollBarX = width - 6;
+
+        int scrollBarHeightPx = (int) (scrollBarHeightPercent * scrollRegionHeight);
+        if (scrollBarHeightPx < 32) {
+            scrollBarHeightPx = 32;
+        }
+
+        float scrollPercent = scrollAmount / (totalPageHeight - scrollRegionHeight);
+
+        int scrollBarY = (int) (top + (scrollRegionHeight - scrollBarHeightPx) * scrollPercent);
+
+        Tessellator t = Tessellator.instance;
+
+        t.startDrawingQuads();
+        t.setColorOpaque(0, 0, 0);
+        t.drawRectangle(scrollBarX, top, 6, scrollRegionHeight);
+        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 (oldScrollAmount == null) {
+                    oldScrollAmount = scrollAmount;
+                }
+                scrollAmount = oldScrollAmount + (clickY - mouseY) * (1.0f / scrollBarHeightPercent) * -1.0f;
+                onScroll();
+            }
+        } else {
+            oldScrollAmount = null;
+        }
+    }
+
+    @Override
+    public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+        super.mouseClicked(mouseX, mouseY, mouseButton);
+
+        clickX = mouseX;
+        clickY = mouseY;
+    }
+
+    @Override
+    public void drawDefaultBackground() {
+        super.drawDefaultBackground();
+
+        Tessellator tessellator = Tessellator.instance;
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+        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) scrollAmount) / scale);
+        tessellator.addVertexWithUV(width, bottom, 0.0D, (float) width / scale, (float) (bottom + (int) scrollAmount) / scale);
+        tessellator.addVertexWithUV(width, top, 0.0D, (float) width / scale, (float) (top + (int) scrollAmount) / scale);
+        tessellator.addVertexWithUV(0, top, 0.0D, 0, (float) (top + (int) scrollAmount) / scale);
+
+        tessellator.draw();
+    }
+
+    private void overlayBackground(int minX, int maxX, int minY, int maxY) {
+        if (mc.theWorld == null) {
+            Tessellator tessellator = Tessellator.instance;
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+            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();
+        }
+    }
+
+
+    private void scroll(float amount) {
+        if (amount == 0.0f) return;
+
+        scrollAmount += amount;
+        onScroll();
+    }
+
+    private void onScroll() {
+        int totalPageHeight = getTotalPageHeight();
+        if (scrollAmount < 0 || scrollRegionHeight > totalPageHeight) scrollAmount = 0;
+        else if (scrollAmount > totalPageHeight - scrollRegionHeight)
+            scrollAmount = totalPageHeight - scrollRegionHeight;
+    }
+
+    private int getTotalPageHeight() {
+        return 100 + lines.size() * 12;
+    }
+
+    @Override
+    public void mouseMovedOrButtonReleased(int mouseX, int mouseY, int mouseButton) {
+        super.mouseMovedOrButtonReleased(mouseX, mouseY, mouseButton);
+
+        if (mouseButton >= 0) {
+            clickX = null;
+            clickY = null;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/GuiDispenser.java b/src/main/java/net/minecraft/client/gui/GuiDispenser.java
index 568b8fdf6..2bf5a9913 100644
--- a/src/main/java/net/minecraft/client/gui/GuiDispenser.java
+++ b/src/main/java/net/minecraft/client/gui/GuiDispenser.java
@@ -1,21 +1,21 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.core.block.entity.DispenserBlockEntity;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.player.inventory.ContainerDispenser;
-import net.minecraft.core.player.inventory.InventoryPlayer;
-import net.minecraft.core.block.entity.TileEntityDispenser;
+import net.minecraft.core.player.inventory.menu.TrapMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            GuiContainer, ContainerDispenser, FontRenderer, RenderEngine, 
-//            InventoryPlayer, TileEntityDispenser
+//            InventoryPlayer, DispenserBlockEntity
 
 public class GuiDispenser extends GuiContainer
 {
 
-    public GuiDispenser(InventoryPlayer inventoryplayer, TileEntityDispenser tileentitydispenser)
+    public GuiDispenser(Inventory inventoryplayer, DispenserBlockEntity tileentitydispenser)
     {
-        super(new ContainerDispenser(inventoryplayer, tileentitydispenser));
+        super(new TrapMenu(inventoryplayer, tileentitydispenser));
     }
 
     @Override
@@ -28,9 +28,8 @@ public class GuiDispenser extends GuiContainer
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int i = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/trap.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/dispenser.png").bind();
         int j = (width - xSize) / 2;
         int k = (height - ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
diff --git a/src/main/java/net/minecraft/client/gui/GuiDownloadTerrain.java b/src/main/java/net/minecraft/client/gui/GuiDownloadTerrain.java
index b1b46a8ad..4ee1d3c2d 100644
--- a/src/main/java/net/minecraft/client/gui/GuiDownloadTerrain.java
+++ b/src/main/java/net/minecraft/client/gui/GuiDownloadTerrain.java
@@ -1,17 +1,17 @@
 package net.minecraft.client.gui;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiScreen, Packet0KeepAlive, NetClientHandler, StringTranslate, 
+//            GuiScreen, KeepAlivePacket, ClientPacketHandler, StringTranslate,
 //            GuiButton
 
-import net.minecraft.client.net.handler.NetClientHandler;
-import net.minecraft.core.net.packet.Packet0KeepAlive;
+import net.minecraft.client.net.handler.ClientPacketHandler;
+import net.minecraft.core.net.packet.KeepAlivePacket;
 import net.minecraft.core.lang.I18n;
 
 public class GuiDownloadTerrain extends GuiScreen
 {
 
-    public GuiDownloadTerrain(NetClientHandler netclienthandler)
+    public GuiDownloadTerrain(ClientPacketHandler netclienthandler)
     {
         updateCounter = 0;
         netHandler = netclienthandler;
@@ -34,11 +34,11 @@ public class GuiDownloadTerrain extends GuiScreen
         updateCounter++;
         if(updateCounter % 20 == 0)
         {
-            netHandler.addToSendQueue(new Packet0KeepAlive());
+            netHandler.addToSendQueue(new KeepAlivePacket());
         }
         if(netHandler != null)
         {
-            netHandler.processReadPackets();
+            netHandler.tick();
         }
     }
 
@@ -57,6 +57,6 @@ public class GuiDownloadTerrain extends GuiScreen
         super.drawScreen(mouseX, mouseY, partialTick);
     }
 
-    private NetClientHandler netHandler;
+    private ClientPacketHandler netHandler;
     private int updateCounter;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiEditFlag.java b/src/main/java/net/minecraft/client/gui/GuiEditFlag.java
index 2297177f7..1cd9941da 100644
--- a/src/main/java/net/minecraft/client/gui/GuiEditFlag.java
+++ b/src/main/java/net/minecraft/client/gui/GuiEditFlag.java
@@ -1,26 +1,26 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.gui.drawing.DrawableEditor;
 import net.minecraft.client.gui.drawing.IDrawableSurface;
 import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
-import net.minecraft.core.net.packet.Packet250CustomPayload;
-import net.minecraft.core.player.inventory.ContainerFlag;
+import net.minecraft.core.net.packet.CustomPayloadPacket;
+import net.minecraft.core.player.inventory.menu.FlagMenu;
 import net.minecraft.core.util.helper.MathHelper;
 
 public class GuiEditFlag
     extends GuiContainer
     implements IDrawableSurface<Byte>
 {
-    private final TileEntityFlag tileEntity;
+    private final FlagBlockEntity tileEntity;
     private final int CANVAS_SCALE = 4;
     private final int CANVAS_WIDTH = 24;
     private final int CANVAS_HEIGHT = 16;
@@ -44,9 +44,9 @@ public class GuiEditFlag
     GuiSurface flagSurface;
     GuiSurface drawOverlaySurface;
     
-    public GuiEditFlag(EntityPlayer player, TileEntityFlag flagTileEntity)
+    public GuiEditFlag(Player player, FlagBlockEntity flagTileEntity)
     {
-        super(new ContainerFlag(player.inventory, flagTileEntity));
+        super(new FlagMenu(player.inventory, flagTileEntity));
         this.tileEntity = flagTileEntity;
         xSize = 176;
         ySize = 195;
@@ -71,7 +71,7 @@ public class GuiEditFlag
 
         for (int i = 0; i < 7; i++)
         {
-            toolBtns[i] = new GuiTexturedButton(i, "/assets/minecraft/textures/gui/flag_editor.png", (width - xSize) / 2 + 12 + 22 * i, (height - ySize) / 2 + 76, 20 * i, 195, 20, 20);
+            toolBtns[i] = new GuiTexturedButton(i, "/assets/minecraft/textures/gui/container/flag_editor.png", (width - xSize) / 2 + 12 + 22 * i, (height - ySize) / 2 + 76, 20 * i, 195, 20, 20);
             if (i == activeTool) toolBtns[i].enabled = false;
             controlList.add(toolBtns[i]);
         }
@@ -97,8 +97,8 @@ public class GuiEditFlag
         int[] colors = new int[5];
         for (int i = 1; i < 4; i++)
         {
-            ItemStack stack = tileEntity.getStackInSlot(35 + i);
-            if (stack != null && stack.getItem() == Item.dye)
+            ItemStack stack = tileEntity.getItem(35 + i);
+            if (stack != null && stack.getItem() == Items.DYE)
             {
                 colors[i] = Colors.allFlagColors[TextFormatting.get(15 - stack.getMetadata()).id].getARGB();
             }
@@ -120,7 +120,7 @@ public class GuiEditFlag
         super.mouseClicked(mouseX, mouseY, mouseButton);
         
         // Do not draw with no color selected
-        if(tileEntity.getStackInSlot(36 + selectedColor) == null) {
+        if(tileEntity.getItem(36 + selectedColor) == null) {
         	return;
         }
         
@@ -317,9 +317,8 @@ public class GuiEditFlag
     @Override
     protected void drawGuiContainerBackgroundLayer(float f) 
     {
-        int i = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/flag_editor.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/flag_editor.png").bind();
         int j = (width - xSize) / 2;
         int k = (height - ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
@@ -394,7 +393,7 @@ public class GuiEditFlag
         {
     		// Flag packet needs to be sent before the close screen packet is sent!
     		if(mc.theWorld.isClientSide) {
-    			mc.getSendQueue().addToSendQueue(new Packet250CustomPayload("BTA|Flag", tileEntity.flagColors));
+    			mc.getSendQueue().addToSendQueue(new CustomPayloadPacket("BTA|Flag", tileEntity.flagColors));
     		}
             mc.thePlayer.closeScreen();
         }
diff --git a/src/main/java/net/minecraft/client/gui/GuiEditLabel.java b/src/main/java/net/minecraft/client/gui/GuiEditLabel.java
index 684d93e2d..b839adbf9 100644
--- a/src/main/java/net/minecraft/client/gui/GuiEditLabel.java
+++ b/src/main/java/net/minecraft/client/gui/GuiEditLabel.java
@@ -3,14 +3,14 @@ package net.minecraft.client.gui;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
-import net.minecraft.core.net.packet.Packet137SetItemName;
+import net.minecraft.core.net.packet.SetItemNamePacket;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiScreen, GuiButton, World, Packet130UpdateSign,
-//            TileEntitySign, NetClientHandler, Block, TileEntityRenderer,
+//            GuiScreen, GuiButton, World, SignUpdatePacket,
+//            SignBlockEntity, ClientPacketHandler, Block, BlockEntityRenderer,
 //            ChatAllowedCharacters
 
 public class GuiEditLabel extends GuiScreen
@@ -58,7 +58,7 @@ public class GuiEditLabel extends GuiScreen
 
             if (mc.theWorld.isClientSide)
             {
-                mc.getSendQueue().addToSendQueue(new Packet137SetItemName(slot, text));
+                mc.getSendQueue().addToSendQueue(new SetItemNamePacket(slot, text));
             }
         }
     }
@@ -67,9 +67,8 @@ public class GuiEditLabel extends GuiScreen
     public void drawScreen(final int mouseX, final int mouseY, final float f)
     {
         drawDefaultBackground();
-        final int bgTex = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/scroll.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(bgTex);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/scroll.png").bind();
         final int widthBG = width / 2 - 56;
         final int heightBG = 89;
         drawTexturedModalRect(widthBG, heightBG, 0, 0, 113, 34);
diff --git a/src/main/java/net/minecraft/client/gui/GuiEditSign.java b/src/main/java/net/minecraft/client/gui/GuiEditSign.java
index 206a4003e..881c2f6f4 100644
--- a/src/main/java/net/minecraft/client/gui/GuiEditSign.java
+++ b/src/main/java/net/minecraft/client/gui/GuiEditSign.java
@@ -1,19 +1,20 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
-import net.minecraft.core.net.packet.Packet130UpdateSign;
-import net.minecraft.client.render.TileEntityRenderDispatcher;
+import net.minecraft.core.net.packet.SignUpdatePacket;
+import net.minecraft.client.render.BlockEntityRenderDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.entity.TileEntitySign;
 import net.minecraft.core.lang.I18n;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
 public class GuiEditSign extends GuiScreen
 {
-    public GuiEditSign(TileEntitySign tileentitysign)
+    public GuiEditSign(SignBlockEntity tileentitysign)
     {
         screenTitle = I18n.getInstance().translateKey("gui.edit_sign.label.title");
         editLine = 0;
@@ -27,7 +28,7 @@ public class GuiEditSign extends GuiScreen
         Keyboard.enableRepeatEvents(true);
 
         Block block = entitySign.getBlockType();
-        if(block == Block.signPostPlanksOak) 
+        if(block == Blocks.SIGN_POST_PLANKS_OAK)
         {
             yOffset = 36;
         }
@@ -46,7 +47,7 @@ public class GuiEditSign extends GuiScreen
         // but thaboar was getting a crash from the world being null
         if(mc.theWorld != null && mc.theWorld.isClientSide)
         {
-            mc.getSendQueue().addToSendQueue(new Packet130UpdateSign(entitySign.x, entitySign.y, entitySign.z, entitySign.signText, entitySign.getPicture().getId(), entitySign.getColor().id));
+            mc.getSendQueue().addToSendQueue(new SignUpdatePacket(entitySign.x, entitySign.y, entitySign.z, entitySign.signText, entitySign.getPicture().getId(), entitySign.getColor().id));
         }
     }
 
@@ -65,7 +66,7 @@ public class GuiEditSign extends GuiScreen
         }
         if(button.id == 0)
         {
-            entitySign.onInventoryChanged();
+            entitySign.setChanged();
             mc.displayGuiScreen(null);
         }
         if (button.id == 1)
@@ -74,7 +75,7 @@ public class GuiEditSign extends GuiScreen
             int lastId = id - 1;
             if (lastId < 0) lastId = EnumSignPicture.values().length - 1;
             entitySign.setPicture(EnumSignPicture.values()[lastId]);
-            entitySign.onInventoryChanged();
+            entitySign.setChanged();
         }
         if (button.id == 2)
         {
@@ -82,7 +83,7 @@ public class GuiEditSign extends GuiScreen
             int nextId = id + 1;
             if (nextId >= EnumSignPicture.values().length) nextId = 0;
             entitySign.setPicture(EnumSignPicture.values()[nextId]);
-            entitySign.onInventoryChanged();
+            entitySign.setChanged();
         }
     }
 
@@ -91,7 +92,7 @@ public class GuiEditSign extends GuiScreen
     {
     	if(i == Keyboard.KEY_ESCAPE)
     	{
-            entitySign.onInventoryChanged();
+            entitySign.setChanged();
     		mc.displayGuiScreen(null);
     	}
         if(i == 200)
@@ -123,7 +124,7 @@ public class GuiEditSign extends GuiScreen
         GL11.glScalef(-scale, -scale, -scale);
         GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F);
         Block block = entitySign.getBlockType();
-        if(block == Block.signPostPlanksOak)
+        if(block == Blocks.SIGN_POST_PLANKS_OAK)
         {
             float signAngle = (float)(entitySign.getMovedData() * 360) / 16F;
             GL11.glRotatef(signAngle, 0.0F, 1.0F, 0.0F);
@@ -151,7 +152,7 @@ public class GuiEditSign extends GuiScreen
         {
             entitySign.lineBeingEdited = editLine;
         }
-        TileEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
+        BlockEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
         entitySign.lineBeingEdited = -1;
         GL11.glPopMatrix();
         
@@ -161,7 +162,7 @@ public class GuiEditSign extends GuiScreen
     }
 
     protected String screenTitle;
-    private TileEntitySign entitySign;
+    private SignBlockEntity entitySign;
     private int updateCounter;
     private int editLine;
     private int yOffset = 0;
diff --git a/src/main/java/net/minecraft/client/gui/GuiFurnace.java b/src/main/java/net/minecraft/client/gui/GuiFurnace.java
index 9af439b44..325ea10d7 100644
--- a/src/main/java/net/minecraft/client/gui/GuiFurnace.java
+++ b/src/main/java/net/minecraft/client/gui/GuiFurnace.java
@@ -1,19 +1,19 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.input.controller.ControllerInput;
+import net.minecraft.core.block.entity.BlastFurnaceBlockEntity;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.player.inventory.ContainerFurnace;
-import net.minecraft.core.player.inventory.InventoryPlayer;
-import net.minecraft.core.block.entity.TileEntityBlastFurnace;
-import net.minecraft.core.block.entity.TileEntityFurnace;
+import net.minecraft.core.player.inventory.menu.FurnaceMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 import org.lwjgl.opengl.GL11;
 
 public class GuiFurnace extends GuiContainer
 {
 
-    public GuiFurnace(InventoryPlayer inventoryplayer, TileEntityFurnace tileentityfurnace)
+    public GuiFurnace(Inventory inventoryplayer, FurnaceBlockEntity tileentityfurnace)
     {
-        super(new ContainerFurnace(inventoryplayer, tileentityfurnace));
+        super(new FurnaceMenu(inventoryplayer, tileentityfurnace));
         furnaceInventory = tileentityfurnace;
     }
 
@@ -21,7 +21,7 @@ public class GuiFurnace extends GuiContainer
 	protected void drawGuiContainerForegroundLayer()
     {
         I18n i18n = I18n.getInstance();
-        if(furnaceInventory instanceof TileEntityBlastFurnace) {
+        if(furnaceInventory instanceof BlastFurnaceBlockEntity) {
             fontRenderer.drawString(i18n.translateKey("gui.furnace.blast.label.blast_furnace"), 60, 6, 0x404040);
         } else {
             fontRenderer.drawString(i18n.translateKey("gui.furnace.label.furnace"), 60, 6, 0x404040);
@@ -32,20 +32,18 @@ public class GuiFurnace extends GuiContainer
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int guiTexture;
-        if(furnaceInventory instanceof TileEntityBlastFurnace) {
-            guiTexture = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/blastfurnace.png");
+        if(furnaceInventory instanceof BlastFurnaceBlockEntity) {
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/blastfurnace.png").bind();
         } else {
-            guiTexture = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/furnace.png");
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/furnace.png").bind();
         }
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(guiTexture);
         int x = (width - xSize) / 2;
         int y = (height - ySize) / 2;
         drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
         if(furnaceInventory.isBurning())
         {
-            if (furnaceInventory instanceof TileEntityBlastFurnace) {
+            if (furnaceInventory instanceof BlastFurnaceBlockEntity) {
                 int fireHeight = furnaceInventory.getBurnTimeRemainingScaled(14);
                 drawTexturedModalRect(x + 56, y + 35 + 14 - fireHeight, 176, 14 - fireHeight, 14, fireHeight + 2);
                 int arrowWidth = furnaceInventory.getCookProgressScaled(24);
@@ -64,5 +62,5 @@ public class GuiFurnace extends GuiContainer
         controller.craftingGuiHandler.handleFurnace(this);
     }
 
-    private final TileEntityFurnace furnaceInventory;
+    private final FurnaceBlockEntity furnaceInventory;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiGameOver.java b/src/main/java/net/minecraft/client/gui/GuiGameOver.java
index 8593ee79c..ee948cfb7 100644
--- a/src/main/java/net/minecraft/client/gui/GuiGameOver.java
+++ b/src/main/java/net/minecraft/client/gui/GuiGameOver.java
@@ -1,15 +1,15 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.net.packet.Packet0KeepAlive;
+import net.minecraft.core.net.packet.KeepAlivePacket;
 import net.minecraft.core.player.gamemode.Gamemode;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.core.net.command.TextFormatting;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiScreen, GuiButton, EntityPlayerSP, GuiMainMenu
+//            GuiScreen, GuiButton, LocalPlayer, GuiMainMenu
 
 public class GuiGameOver extends GuiScreen
 {
@@ -21,9 +21,9 @@ public class GuiGameOver extends GuiScreen
     @Override
     public void tick(){
         tickCount++;
-        if (mc.isMultiplayerWorld() && mc.thePlayer instanceof EntityClientPlayerMP && tickCount % 10 == 0){
-            EntityClientPlayerMP clientPlayerMP = (EntityClientPlayerMP) mc.thePlayer;
-            clientPlayerMP.sendQueue.addToSendQueue(new Packet0KeepAlive());
+        if (mc.isMultiplayerWorld() && mc.thePlayer instanceof MultiplayerLocalPlayer && tickCount % 10 == 0){
+            MultiplayerLocalPlayer clientPlayerMP = (MultiplayerLocalPlayer) mc.thePlayer;
+            clientPlayerMP.sendQueue.addToSendQueue(new KeepAlivePacket());
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiHudDesigner.java b/src/main/java/net/minecraft/client/gui/GuiHudDesigner.java
index 586e4e05e..9c6dec263 100644
--- a/src/main/java/net/minecraft/client/gui/GuiHudDesigner.java
+++ b/src/main/java/net/minecraft/client/gui/GuiHudDesigner.java
@@ -33,7 +33,8 @@ public class GuiHudDesigner
         mc.gameSettings.screenPadding.set(0.0f);
 
         add(new GuiButton(0, width / 2 - 100, height - BOTTOM_SPACE + (BOTTOM_SPACE - 20) / 2, 178, 20, I18n.getInstance().translateKey("gui.hud_designer.button.done")));
-        add(resetButton = new GuiTexturedButton(1, "/assets/minecraft/textures/gui/gui.png", width / 2 + 80, height - BOTTOM_SPACE + (BOTTOM_SPACE - 20) / 2, 20 * 4, 86, 20, 20));
+        add(resetButton = new GuiButton(1, width / 2 + 80, height - BOTTOM_SPACE + (BOTTOM_SPACE - 20) / 2, 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_reset", "minecraft:gui/misc/button_reset_highlighted", "minecraft:gui/misc/button_reset"));
     }
 
     @Override
@@ -267,7 +268,7 @@ public class GuiHudDesigner
         GL11.glDisable(GL11.GL_LIGHTING);
         GL11.glDisable(GL11.GL_FOG);
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/designer_bg.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/designer_bg.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         float scale = 32F;
         tessellator.startDrawingQuads();
diff --git a/src/main/java/net/minecraft/client/gui/GuiIngame.java b/src/main/java/net/minecraft/client/gui/GuiIngame.java
index af8ccd02b..c4f7123b2 100644
--- a/src/main/java/net/minecraft/client/gui/GuiIngame.java
+++ b/src/main/java/net/minecraft/client/gui/GuiIngame.java
@@ -9,10 +9,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
 import net.minecraft.client.gui.hud.HudComponent;
 import net.minecraft.client.gui.hud.HudComponents;
 import net.minecraft.client.render.FontRenderer;
@@ -20,17 +20,18 @@ import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.dynamictexture.DynamicTexture;
 import net.minecraft.client.render.entity.ItemEntityRenderer;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.tag.Tag;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.LightLayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.ChatLine;
@@ -40,7 +41,7 @@ import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.season.Season;
 import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
+import net.minecraft.core.world.wind.WindProvider;
 
 public class GuiIngame extends Gui
 {
@@ -53,7 +54,7 @@ public class GuiIngame extends Gui
     public int updateCounter = 0;
     private String recordPlaying = "";
     private int recordPlayingUpFor = 0;
-    private boolean field_22065_l = false;
+    private boolean colorString = false;
     public float damageGuiPartialTime;
     float prevVignetteBrightness = 1.0f;
     protected FontRenderer fontrenderer;
@@ -90,7 +91,7 @@ public class GuiIngame extends Gui
 
         // Render pumpkin overlay
         ItemStack headSlotItem = mc.thePlayer.inventory.armorItemInSlot(3);
-        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Block.pumpkinCarvedIdle.id)
+        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id)
         {
             renderPumpkinBlur(width, height);
         }
@@ -109,7 +110,6 @@ public class GuiIngame extends Gui
         }
 
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
 
         //Sleep Overlay
         Lighting.disable();
@@ -150,20 +150,20 @@ public class GuiIngame extends Gui
             }
             else
             {
-                for (int iinv = 0; iinv < mc.thePlayer.inventory.getSizeInventory(); iinv++)
+                for (int iinv = 0; iinv < mc.thePlayer.inventory.getContainerSize(); iinv++)
                 {
-                    ItemStack item = mc.thePlayer.inventory.getStackInSlot(iinv);
+                    ItemStack item = mc.thePlayer.inventory.getItem(iinv);
                     if (item != null)
                     {
-                        if (item.itemID == Item.toolClock.id)
+                        if (item.itemID == Items.TOOL_CLOCK.id)
                         {
                             clock = true;
                         }
-                        if (item.itemID == Item.toolCompass.id)
+                        if (item.itemID == Items.TOOL_COMPASS.id)
                         {
                             compass = true;
                         }
-                        if (item.itemID == Item.toolCalendar.id)
+                        if (item.itemID == Items.TOOL_CALENDAR.id)
                         {
                             rotaryCalendar = true;
                         }
@@ -194,6 +194,7 @@ public class GuiIngame extends Gui
                 drawDebugScreenLineRight("Used memory: " + (memUsed * 100L) / memMax + "% (" + memUsed / 1024L / 1024L + "MB) of " + memMax / 1024L / 1024L + "MB");
                 drawDebugScreenLineRight("Allocated memory: " + (memTotal * 100L) / memMax + "% (" + memTotal / 1024L / 1024L + "MB)");
                 drawDebugScreenLineRight("JRE: " + System.getProperty("java.version") + " (" + System.getProperty("java.vendor") + ")");
+                drawDebugScreenLineRight("LWJGL version: " + org.lwjgl.Version.getVersion());
 
                 debugOffsetRight += space;
 
@@ -202,6 +203,7 @@ public class GuiIngame extends Gui
                 drawDebugScreenLineRight(GL11.glGetString(GL11.GL_VERSION));
                 drawDebugScreenLineRight("Resolution: " + mc.resolution.width + "x" + mc.resolution.height);
                 drawDebugScreenLineRight("Render Resolution: " + mc.renderer.getRenderWidth() + "x" + mc.renderer.getRenderHeight());
+                
                 drawDebugScreenLine("Better than Adventure! " + Minecraft.VERSION);
                 drawDebugScreenLine(mc.debug);
                 drawDebugScreenLine(mc.getRendererDebugInfo());
@@ -218,8 +220,8 @@ public class GuiIngame extends Gui
                     drawDebugScreenLine("Y: " + mc.thePlayer.y);
                     drawDebugScreenLine("Z: " + mc.thePlayer.z);
                     
-                    int chunkX = MathHelper.floor_double(mc.thePlayer.x) >> 4;
-                	int chunkZ = MathHelper.floor_double(mc.thePlayer.z) >> 4;
+                    int chunkX = MathHelper.floor(mc.thePlayer.x) >> 4;
+                	int chunkZ = MathHelper.floor(mc.thePlayer.z) >> 4;
                     
             		drawDebugScreenLine("Chunk: " + chunkX + ", " + chunkZ);
             		
@@ -236,9 +238,9 @@ public class GuiIngame extends Gui
                 {
                     if (!compass) debugOffset += space;
 
-                    int playerX = MathHelper.floor_double(mc.thePlayer.x);
-                    int playerY = MathHelper.floor_double(mc.thePlayer.y);
-                    int playerZ = MathHelper.floor_double(mc.thePlayer.z);
+                    int playerX = MathHelper.floor(mc.thePlayer.x);
+                    int playerY = MathHelper.floor(mc.thePlayer.y);
+                    int playerZ = MathHelper.floor(mc.thePlayer.z);
                     drawDebugScreenLine("Light: Sky: " + mc.theWorld.getSavedLightValue(LightLayer.Sky, playerX, playerY, playerZ) + " Block: " + mc.theWorld.getSavedLightValue(LightLayer.Block, playerX, playerY, playerZ));
                 }
 
@@ -262,9 +264,9 @@ public class GuiIngame extends Gui
                     Weather weather = mc.theWorld.getCurrentWeather();
                     String weatherString = weather != null ? weather.getTranslatedName() : "None";
                     
-                    int blockX = MathHelper.floor_double(mc.thePlayer.x);
-					int blockY = MathHelper.floor_double(mc.thePlayer.y);
-					int blockZ = MathHelper.floor_double(mc.thePlayer.z);
+                    int blockX = MathHelper.floor(mc.thePlayer.x);
+					int blockY = MathHelper.floor(mc.thePlayer.y);
+					int blockZ = MathHelper.floor(mc.thePlayer.z);
                     
                     drawDebugScreenLine("Season: " + seasonString);
                     drawDebugScreenLine("Weather: " + weatherString + " (" + (mc.theWorld.weatherManager.getWeatherDuration() / 20) + "s I: " + percentRound(mc.theWorld.weatherManager.getWeatherIntensity()) + "% P: " + percentRound(mc.theWorld.weatherManager.getWeatherPower()) + "%)");
@@ -275,10 +277,10 @@ public class GuiIngame extends Gui
                     
                     drawDebugScreenLine("Temperature: " + temperature + " Humidity: " + humidity);
                     
-                    WindManager windManager = mc.theWorld.worldType.getWindManager();
-                    if(windManager != null) {
-                    	float direction = (float) floor100(windManager.getWindDirection(mc.theWorld, 0.0f, 500.0f, 0.0f));
-                    	float intensity = (float) floor100(windManager.getWindIntensity(mc.theWorld, 0.0f, 500.0f, 0.0f));
+                    WindProvider windProvider = mc.theWorld.worldType.getWindManager();
+                    if(windProvider != null) {
+                    	float direction = (float) floor100(windProvider.getWindDirection(mc.theWorld, 0.0f, 500.0f, 0.0f));
+                    	float intensity = (float) floor100(windProvider.getWindIntensity(mc.theWorld, 0.0f, 500.0f, 0.0f));
 
                         int yaw = DynamicTexture.pmod(java.lang.Math.round((direction * 360.0f) + 270.0f), 360);
                     	drawDebugScreenLine("Wind: " + yaw + "°, " + java.lang.Math.round(intensity * 100.0f) + "%");
@@ -432,9 +434,9 @@ public class GuiIngame extends Gui
                     }
 					if(mc.gameSettings.overlayShowBiome.value)
 					{
-						int blockX = MathHelper.floor_double(mc.thePlayer.x);
-						int blockY = MathHelper.floor_double(mc.thePlayer.y);
-						int blockZ = MathHelper.floor_double(mc.thePlayer.z);
+						int blockX = MathHelper.floor(mc.thePlayer.x);
+						int blockY = MathHelper.floor(mc.thePlayer.y);
+						int blockZ = MathHelper.floor(mc.thePlayer.z);
 						String key = mc.theWorld.getBlockBiome(blockX, blockY, blockZ).translationKey;
 						drawString(fontrenderer, stringtranslate.translateKey(key), tsp, tsp + lineHeight * line++, 0xffffff);
 					}
@@ -496,9 +498,9 @@ public class GuiIngame extends Gui
                 {
                     int itemCount = 0;
                     int stackCount = 0;
-                    for (int i = 0; i < mc.thePlayer.inventory.getSizeInventory(); i++)
+                    for (int i = 0; i < mc.thePlayer.inventory.getContainerSize(); i++)
                     {
-                        ItemStack itemStack = mc.thePlayer.inventory.getStackInSlot(i);
+                        ItemStack itemStack = mc.thePlayer.inventory.getItem(i);
                         if (itemStack != null && itemStack.itemID == heldItemStack.itemID && itemStack.getMetadata() == heldItemStack.getMetadata())
                         {
                             itemCount += itemStack.stackSize;
@@ -535,7 +537,7 @@ public class GuiIngame extends Gui
         if (mc.gameSettings.keyToggleTextureAtlas.isPressed()) {
             Tessellator tessellator = Tessellator.instance;
 
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             
             
             int blockW = TextureRegistry.blockAtlas.getAtlasWidth();
@@ -551,7 +553,7 @@ public class GuiIngame extends Gui
 
             int blockEndX = (int) (20 + blockW * scaleBlock + 10);
 
-            TextureRegistry.itemAtlas.bindTexture();
+            TextureRegistry.itemAtlas.bind();
             
             int itemW = TextureRegistry.itemAtlas.getAtlasWidth();
             int itemH = TextureRegistry.itemAtlas.getAtlasHeight();
@@ -566,7 +568,7 @@ public class GuiIngame extends Gui
 
             int itemEndX = (int) (blockEndX + itemW * scaleItem + 10);
 
-            TextureRegistry.particleAtlas.bindTexture();
+            TextureRegistry.particleAtlas.bind();
 
             int particleW = TextureRegistry.particleAtlas.getAtlasWidth();
             int particleH = TextureRegistry.particleAtlas.getAtlasHeight();
@@ -631,9 +633,9 @@ public class GuiIngame extends Gui
         }
         if (!mc.gameSettings.showPlayerList.value) return;
 
-        if (!(mc.thePlayer instanceof EntityClientPlayerMP)) return;
+        if (!(mc.thePlayer instanceof MultiplayerLocalPlayer)) return;
 
-        EntityClientPlayerMP player = (EntityClientPlayerMP) mc.thePlayer;
+        MultiplayerLocalPlayer player = (MultiplayerLocalPlayer) mc.thePlayer;
         HashMap<String, String> players = player.sendQueue.playerList;
 
 //		List<PlayerProfile> players = new ArrayList<>();
@@ -722,7 +724,7 @@ public class GuiIngame extends Gui
                 GL11.glEnable(3042 /* GL_BLEND */);
                 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                 int k4 = 0xffffff;
-                if (field_22065_l)
+                if (colorString)
                 {
                     k4 = Color.HSBtoRGB(f2 / 50F, 0.7F, 0.6F) & 0xffffff;
                 }
@@ -824,7 +826,7 @@ public class GuiIngame extends Gui
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         GL11.glDisable(3008 /* GL_ALPHA_TEST */);
-        GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, mc.renderEngine.getTexture("%blur%/misc/pumpkinblur.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/misc/pumpkinblur.png").bind();
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
         tessellator.addVertexWithUV(0.0D, ySize, -90D, 0.0D, 1.0D);
@@ -846,7 +848,7 @@ public class GuiIngame extends Gui
         GL11.glDepthMask(false);
         GL11.glBlendFunc(0, 769);
         GL11.glColor4f(prevVignetteBrightness, prevVignetteBrightness, prevVignetteBrightness, 1.0F);
-        GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, mc.renderEngine.getTexture("%blur%/misc/vignette.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/misc/vignette.png").bind();
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
         tessellator.addVertexWithUV(0.0D, ySize, -90D, 0.0D, 1.0D);
@@ -874,7 +876,7 @@ public class GuiIngame extends Gui
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, intensity);
         IconCoordinate portal = TextureRegistry.getTexture("minecraft:block/portal_nether");
-        portal.parentAtlas.bindTexture();
+        portal.parentAtlas.bind();
         float f1 = (float) portal.getIconUMin();
         float f2 = (float) portal.getIconVMin();
         float f3 = (float) portal.getIconUMax();
@@ -948,7 +950,7 @@ public class GuiIngame extends Gui
     {
         recordPlaying = I18n.getInstance().translateKeyAndFormat("gui.ingame.label.now_playing", s);
         recordPlayingUpFor = 60;
-        field_22065_l = true;
+        colorString = true;
     }
 
     public void addChatMessageTranslate(String s)
@@ -958,8 +960,8 @@ public class GuiIngame extends Gui
         addChatMessage(result);
     }
 
-    public static String getFacingDirection(EntityPlayer player)
+    public static String getFacingDirection(Player player)
     {
-        return directions[(MathHelper.floor_double((double) ((player.yRot * 4F) / 360F) + 0.5D) + 2) & 3];
+        return directions[(MathHelper.floor((double) ((player.yRot * 4F) / 360F) + 0.5D) + 2) & 3];
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/gui/GuiIngameDoom.java b/src/main/java/net/minecraft/client/gui/GuiIngameDoom.java
index 9076add53..81376bfe5 100644
--- a/src/main/java/net/minecraft/client/gui/GuiIngameDoom.java
+++ b/src/main/java/net/minecraft/client/gui/GuiIngameDoom.java
@@ -2,9 +2,9 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
-import net.minecraft.core.block.Block;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
 import org.lwjgl.opengl.GL11;
 
@@ -47,7 +47,7 @@ public class GuiIngameDoom
 
         // Render pumpkin overlay
         ItemStack headSlotItem = mc.thePlayer.inventory.armorItemInSlot(3);
-        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Block.pumpkinCarvedIdle.id)
+        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id)
         {
             renderPumpkinBlur(width, height);
         }
@@ -69,15 +69,14 @@ public class GuiIngameDoom
         drawStacks();
 
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
 
         if (mc.gameSettings.immersiveMode.drawCrosshair() && mc.gameSettings.thirdPersonView.value == 0)
         {
-            // Render status icons
-            GL11.glEnable(3042 /* GL_BLEND */);
-            GL11.glBlendFunc(775, 769);
-            drawTexturedModalRect(width / 2 - 7, height / 2 - 7, 0, 0, 16, 16);
-            GL11.glDisable(3042 /* GL_BLEND */);
+            // Render crosshair
+            GL11.glEnable(GL11.GL_BLEND);
+            GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR);
+            drawGuiIcon(width/2 - 7, height/2 - 7, 15, 15, TextureRegistry.getTexture("minecraft:gui/hud/crosshair"));
+            GL11.glDisable(GL11.GL_BLEND);
         }
     }
 
@@ -87,7 +86,7 @@ public class GuiIngameDoom
         int height = mc.resolution.scaledHeight;
 
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/doom.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/hud/doom.png").bind();
 
         // Draw main hotbar
         drawTexturedModalRect(width / 2 - 197, height - 43, 0, 0, 197, 43);
@@ -155,7 +154,7 @@ public class GuiIngameDoom
     private void drawNumber(int i, int x, int y)
     {
         GL11.glColor4f(1f, 1f, 1f, 1f);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/doom.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/hud/doom.png").bind();
 
         List<Integer> parts = new ArrayList<>();
 
@@ -207,7 +206,7 @@ public class GuiIngameDoom
     private void drawArmsButton(int x, int y, int number, boolean active)
     {
         GL11.glColor4f(1f, 1f, 1f, 1f);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/doom.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/hud/doom.png").bind();
 
         int u = 13;
         int v = 196;
@@ -267,7 +266,7 @@ public class GuiIngameDoom
         int q = 0;
         for (int i = currentItem - offset; i < currentItem - offset + 4; i++)
         {
-            ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i);
+            ItemStack stack = mc.thePlayer.inventory.getItem(i);
             int x = width / 2 + 94;
             int y = height - 37 + q * 9;
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java b/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
index 582577a94..42bdf4baf 100644
--- a/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
+++ b/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.achievements.GuiAchievements;
 import net.minecraft.client.gui.guidebook.GuiGuidebook;
 import net.minecraft.client.gui.guidebook.PageManager;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
@@ -64,7 +64,7 @@ public class GuiIngameMenu extends GuiScreen
         }
         if(button.id == 1)
         {
-            mc.statsCounter.addValueToStat(StatList.leaveGameStat, 1);
+            mc.statsCounter.add(StatList.leaveGameStat, 1);
             if(mc.isMultiplayerWorld())
             {
                 mc.theWorld.sendQuittingDisconnectingPacket();
@@ -122,7 +122,7 @@ public class GuiIngameMenu extends GuiScreen
         if(isSaving || updateCounter < 20)
         {
             float f1 = ((float)(updateCounter % 10) + partialTick) / 10F;
-            f1 = MathHelper.sin(f1 * 3.141593F * 2.0F) * 0.2F + 0.8F;
+            f1 = MathHelper.sin(f1 * MathHelper.PI * 2.0F) * 0.2F + 0.8F;
             int k = (int)(255F * f1);
             drawString(fontRenderer, i.translateKey("gui.ingame_menu.label.saving"), 8, height - 16, k << 16 | k << 8 | k);
         }
diff --git a/src/main/java/net/minecraft/client/gui/GuiInventory.java b/src/main/java/net/minecraft/client/gui/GuiInventory.java
index 74249ed7c..17c899895 100644
--- a/src/main/java/net/minecraft/client/gui/GuiInventory.java
+++ b/src/main/java/net/minecraft/client/gui/GuiInventory.java
@@ -7,10 +7,11 @@ import java.util.List;
 
 import net.minecraft.client.gui.options.GuiOptionButton;
 import net.minecraft.client.input.controller.ControllerInput;
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.core.player.gamemode.Gamemode;
@@ -22,10 +23,11 @@ import org.lwjgl.opengl.GL11;
 import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.client.option.BooleanOption;
+import org.lwjgl.opengl.GL12;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiContainer, EntityPlayer, AchievementList, FontRenderer, 
-//            RenderEngine, EntityPlayerSP, RenderHelper, RenderManager, 
+//            GuiContainer, Player, Achievements, FontRenderer,
+//            RenderEngine, LocalPlayer, RenderHelper, RenderManager,
 //            GuiButton, GuiAchievements, GuiStats
 
 public class GuiInventory extends GuiContainer
@@ -39,11 +41,11 @@ public class GuiInventory extends GuiContainer
 	
 	private DamageType hoveredDamageType;
 
-    public GuiInventory(EntityPlayer player)
+    public GuiInventory(Player player)
     {
         super(player.inventorySlots);
         allowIngameInput = true;
-        player.addStat(AchievementList.OPEN_INVENTORY, 1);
+        player.addStat(Achievements.OPEN_INVENTORY, 1);
     }
 
     @Override
@@ -90,16 +92,16 @@ public class GuiInventory extends GuiContainer
 			compass = true;
 			rotaryCalendar = true;
 		} else {
-			for (int iinv = 0; iinv < mc.thePlayer.inventory.getSizeInventory(); iinv++) {
-				ItemStack item = mc.thePlayer.inventory.getStackInSlot(iinv);
+			for (int iinv = 0; iinv < mc.thePlayer.inventory.getContainerSize(); iinv++) {
+				ItemStack item = mc.thePlayer.inventory.getItem(iinv);
 				if (item != null) {
-					if (item.itemID == Item.toolClock.id) {
+					if (item.itemID == Items.TOOL_CLOCK.id) {
 						clock = true;
 					}
-					if (item.itemID == Item.toolCompass.id) {
+					if (item.itemID == Items.TOOL_COMPASS.id) {
 						compass = true;
 					}
-					if (item.itemID == Item.toolCalendar.id) {
+					if (item.itemID == Items.TOOL_CALENDAR.id) {
 						rotaryCalendar = true;
 					}
 				}
@@ -153,8 +155,7 @@ public class GuiInventory extends GuiContainer
         if(mc.gameSettings.armorProtectionOverlay.value && armorButton.enabled) {
         	drawProtectionOverlay(mouseX, mouseY);
         }
-        int inventoryTex = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/inventory.png");
-        mc.renderEngine.bindTexture(inventoryTex);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/inventory.png").bind();
         
         glColor4d(1.0, 1.0, 1.0, 1.0);
         glDisable(GL_BLEND);
@@ -200,9 +201,6 @@ public class GuiInventory extends GuiContainer
         glEnable(GL_BLEND);
         drawGradientRect(x, y, x + w, y + h, protectionOverlayBgColor.getARGB(), protectionOverlayBgColor.getARGB());
 
-        int iconsTex = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png");
-        mc.renderEngine.bindTexture(iconsTex);
-        
         glDisable(GL_BLEND);
         glDisable(GL_CULL_FACE);
 
@@ -224,7 +222,7 @@ public class GuiInventory extends GuiContainer
     			
     			glEnable(GL_TEXTURE_2D);
     			glColor4d(1.0, 1.0, 1.0, 1.0);
-    			drawTexturedModalRect(x2 + 2, y2 + 2, 0, 16 + 9 * damageType.getIconIndex(), 9, 9);
+                drawGuiIcon(x2 + 2, y2 + 2, 9, 9, TextureRegistry.getTexture(damageType.getIcon()));
     			
     			glDisable(GL_TEXTURE_2D);
     			
@@ -258,21 +256,20 @@ public class GuiInventory extends GuiContainer
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int inventoryTex = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/inventory.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(inventoryTex);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/inventory.png").bind();
         int j = (width - xSize) / 2;
         int k = (height - ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glEnable(2903 /*GL_COLOR_MATERIAL*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         GL11.glEnable(GL11.GL_DEPTH_TEST);
         GL11.glPushMatrix();
         GL11.glTranslatef(j + 51, k + 75, 50F);
         float f1 = 30F;
         GL11.glScalef(-f1, f1, f1);
         GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
-        float f2 = mc.thePlayer.renderYawOffset;
+        float f2 = mc.thePlayer.yBodyRot;
         float f3 = mc.thePlayer.yRot;
         float f4 = mc.thePlayer.xRot;
         float f5 = (float)(j + 51) - xSize_lo;
@@ -281,7 +278,7 @@ public class GuiInventory extends GuiContainer
         Lighting.enableLight();
         GL11.glRotatef(-135F, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(-(float)Math.atan(f6 / 40F) * 20F, 1.0F, 0.0F, 0.0F);
-        mc.thePlayer.renderYawOffset = (float)Math.atan(f5 / 40F) * 20F;
+        mc.thePlayer.yBodyRot = (float)Math.atan(f5 / 40F) * 20F;
         mc.thePlayer.yRot = (float)Math.atan(f5 / 40F) * 40F;
         mc.thePlayer.xRot = -(float)Math.atan(f6 / 40F) * 20F;
         mc.thePlayer.entityBrightness = 1.0F;
@@ -289,12 +286,12 @@ public class GuiInventory extends GuiContainer
         EntityRenderDispatcher.instance.viewLerpYaw = 180F;
         EntityRenderDispatcher.instance.renderEntityWithPosYaw(Tessellator.instance, mc.thePlayer, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F);
         mc.thePlayer.entityBrightness = 0.0F;
-        mc.thePlayer.renderYawOffset = f2;
+        mc.thePlayer.yBodyRot = f2;
         mc.thePlayer.yRot = f3;
         mc.thePlayer.xRot = f4;
         GL11.glPopMatrix();
         Lighting.disable();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java b/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
index fd1981910..6666bf4ef 100644
--- a/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
+++ b/src/main/java/net/minecraft/client/gui/GuiInventoryCreative.java
@@ -2,10 +2,10 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.client.gui.options.GuiOptionsButton;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.player.inventory.ContainerPlayerCreative;
+import net.minecraft.core.player.inventory.menu.CreativeInventoryMenu;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.EntityRenderDispatcher;
@@ -14,6 +14,7 @@ import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.gui.GuiTextField.ITextChangeListener;
+import org.lwjgl.opengl.GL12;
 
 public class GuiInventoryCreative extends GuiInventory implements ITextChangeListener
 {
@@ -21,14 +22,14 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
 	protected GuiButton nextPageButton;
 	protected GuiOptionsButton clearSearchButton;
 	protected GuiTextField searchField;
-	protected ContainerPlayerCreative container;
+	protected CreativeInventoryMenu container;
 	protected String pageString = "1/1";
 	
-	public GuiInventoryCreative(EntityPlayer entityplayer)
+	public GuiInventoryCreative(Player entityplayer)
 	{
 		super(entityplayer);
 		xSize = 298;
-		container = (ContainerPlayerCreative)entityplayer.inventorySlots;
+		container = (CreativeInventoryMenu)entityplayer.inventorySlots;
 		armourValuesFloat = 186;
 		armourButtonFloatX = 81;
 		overlayButtonsLayout.setOffset(-(xSize / 2), -(ySize / 2) - 10);
@@ -113,8 +114,8 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
     	{
 			if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT))
 			{
-				for(int i = 0; i < container.playerInv.getSizeInventory() + container.craftMatrix.getSizeInventory() + container.craftResult.getSizeInventory(); i++) {
-					mc.playerController.handleInventoryMouseClick(container.windowId, InventoryAction.CREATIVE_DELETE, new int[]{i}, mc.thePlayer);
+				for(int i = 0; i < container.inventory.getContainerSize() + container.craftSlots.getContainerSize() + container.resultSlots.getContainerSize(); i++) {
+					mc.playerController.handleInventoryMouseClick(container.containerId, InventoryAction.CREATIVE_DELETE, new int[]{i}, mc.thePlayer);
 				}
 			}
 			else
@@ -166,10 +167,9 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
 		scroll(Mouse.getDWheel());
-		
-        int i = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/creative.png");
+
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i);
+		mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/creative.png").bind();
         int x = (width - xSize) / 2;
         int y = (height - ySize) / 2;
         lastPageButton.xPosition = x + 182;
@@ -181,15 +181,15 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
         searchField.xPosition = x + 183;
         searchField.yPosition = y + 7;
         drawTexturedModalRect((double)x, (double)y, 0, 0, xSize, ySize, xSize / 2, ySize / 2);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glEnable(2903 /*GL_COLOR_MATERIAL*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         GL11.glEnable(GL11.GL_DEPTH_TEST);
         GL11.glPushMatrix();
         GL11.glTranslatef(x + 51, y + 75, 50F);
         float f1 = 30F;
         GL11.glScalef(-f1, f1, f1);
         GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
-        float f2 = mc.thePlayer.renderYawOffset;
+        float f2 = mc.thePlayer.yBodyRot;
         float f3 = mc.thePlayer.yRot;
         float f4 = mc.thePlayer.xRot;
         float f5 = (float)(x + 51) - xSize_lo;
@@ -198,7 +198,7 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
         Lighting.enableLight();
         GL11.glRotatef(-135F, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(-(float)Math.atan(f6 / 40F) * 20F, 1.0F, 0.0F, 0.0F);
-        mc.thePlayer.renderYawOffset = (float)Math.atan(f5 / 40F) * 20F;
+        mc.thePlayer.yBodyRot = (float)Math.atan(f5 / 40F) * 20F;
         mc.thePlayer.yRot = (float)Math.atan(f5 / 40F) * 40F;
         mc.thePlayer.xRot = -(float)Math.atan(f6 / 40F) * 20F;
         mc.thePlayer.entityBrightness = 1.0F;
@@ -206,12 +206,12 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
         EntityRenderDispatcher.instance.viewLerpYaw = 180F;
         EntityRenderDispatcher.instance.renderEntityWithPosYaw(Tessellator.instance, mc.thePlayer, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F);
         mc.thePlayer.entityBrightness = 0.0F;
-        mc.thePlayer.renderYawOffset = f2;
+        mc.thePlayer.yBodyRot = f2;
         mc.thePlayer.yRot = f3;
         mc.thePlayer.xRot = f4;
         GL11.glPopMatrix();
         Lighting.disable();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         searchField.drawTextBox();
     }
 
@@ -222,10 +222,10 @@ public class GuiInventoryCreative extends GuiInventory implements ITextChangeLis
 	}
 	@Override
 	public void guiSpecificControllerInput(ControllerInput controller){
-		if(controller.buttonL.pressedThisFrame()) {
+		if(controller.buttonLeftShoulder.pressedThisFrame()) {
 			this.scroll(1);
 		}
-		if(controller.buttonR.pressedThisFrame()) {
+		if(controller.buttonRightShoulder.pressedThisFrame()) {
 			this.scroll(-1);
 		}
 		super.guiSpecificControllerInput(controller);
diff --git a/src/main/java/net/minecraft/client/gui/GuiMainMenu.java b/src/main/java/net/minecraft/client/gui/GuiMainMenu.java
index 5039b5b2d..359f01da7 100644
--- a/src/main/java/net/minecraft/client/gui/GuiMainMenu.java
+++ b/src/main/java/net/minecraft/client/gui/GuiMainMenu.java
@@ -16,7 +16,7 @@ import java.util.Random;
 import javax.imageio.ImageIO;
 
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import org.lwjgl.input.Keyboard;
@@ -28,6 +28,7 @@ import net.minecraft.client.gui.options.GuiOptions;
 import net.minecraft.client.gui.options.data.OptionsPages;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
@@ -36,8 +37,8 @@ public class GuiMainMenu extends GuiScreen
 {
 
     private static final Block[] BLOCKS_TO_DRAW = {
-    		Block.stone, Block.dirt, Block.planksOak, Block.cobbleStone, Block.cobbleStoneMossy, Block.basalt, Block.limestone,
-    		Block.granite, Block.brickClay, Block.ice, Block.wool, Block.blockSnow, Block.obsidian, Block.netherrack
+    		Blocks.STONE, Blocks.DIRT, Blocks.PLANKS_OAK, Blocks.COBBLE_STONE, Blocks.COBBLE_STONE_MOSSY, Blocks.BASALT, Blocks.LIMESTONE,
+    		Blocks.GRANITE, Blocks.BRICK_CLAY, Blocks.ICE, Blocks.WOOL, Blocks.BLOCK_SNOW, Blocks.OBSIDIAN, Blocks.NETHERRACK
     };
     private static String[] logoBlockLayers = null;
     
@@ -65,7 +66,7 @@ public class GuiMainMenu extends GuiScreen
 
 		InputStream stream = null;
 		try {
-			stream = GuiMainMenu.class.getResourceAsStream("/title/splashes.txt");
+			stream = GuiMainMenu.class.getResourceAsStream("/assets/minecraft/textures/gui/title/splashes.txt");
 
 			List<String> allSplashes = new ArrayList<>();
 			BufferedReader br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
@@ -165,11 +166,13 @@ public class GuiMainMenu extends GuiScreen
             controlList.add(new GuiButton(4, width / 2 + 2, i + 72 + 12, 98, 20, i18n.translateKey("gui.main_menu.button.quit_game")));
         }
         int d = 1; // Move away from the edge of the screen to prevent unintentional activation because the cursor defaults to 0, 0
-        controlList.add(new GuiClickableLabel(5, d, height - 36 - d, i18n.translateKey("gui.main_menu.button.website"), 0x5AA938));
-        controlList.add(new GuiClickableLabel(6, d, height - 24 - d, i18n.translateKey("gui.main_menu.button.discord"), 0x5865F2));
-        controlList.add(new GuiClickableLabel(7, d, height - 12 - d, i18n.translateKey("gui.main_menu.button.youtube"), 0xFF0000));
-        controlList.add(new GuiTexturedButton(8, "/assets/minecraft/textures/gui/gui.png", width / 2 + 104, i + 72 + 12, 0, 86, 20, 20));
-        GuiButton debugButton = new GuiButton(9, width - 8, height - 8, 8, 8, "");
+        controlList.add(new GuiClickableLabel(5, d, height - 48 - d, i18n.translateKey("gui.main_menu.button.credits"), 0x9F9F9F));
+        controlList.add(new GuiClickableLabel(6, d, height - 36 - d, i18n.translateKey("gui.main_menu.button.website"), 0x5AA938));
+        controlList.add(new GuiClickableLabel(7, d, height - 24 - d, i18n.translateKey("gui.main_menu.button.discord"), 0x5865F2));
+        controlList.add(new GuiClickableLabel(8, d, height - 12 - d, i18n.translateKey("gui.main_menu.button.youtube"), 0xFF0000));
+        controlList.add(new GuiButton(9, width / 2 + 104, i + 72 + 12, 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_language", "minecraft:gui/misc/button_language_highlighted", "minecraft:gui/misc/button_language"));
+        GuiButton debugButton = new GuiButton(10, width - 8, height - 8, 8, 8, "");
         debugButton.visible = false;
         controlList.add(debugButton);
         if(mc.session == null)
@@ -206,17 +209,21 @@ public class GuiMainMenu extends GuiScreen
         {
             mc.shutdown();
         }
-        if(button.id == 8)
+        if(button.id == 5)
+        {
+            mc.displayGuiScreen(new GuiCredits(this));
+        }
+        if(button.id == 9)
         {
             mc.displayGuiScreen(new GuiOptions(this, OptionsPages.LANGUAGE));
         }
-        if(button.id == 9){
+        if(button.id == 10){
             mc.displayGuiScreen(new GuiOptions(this, OptionsPages.DEBUG));
         }
         Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
         if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE))
         {
-            if (button.id == 5) // Website
+            if (button.id == 6) // Website
             {
                 try
                 {
@@ -226,7 +233,7 @@ public class GuiMainMenu extends GuiScreen
                     e.printStackTrace();
                 }
             }
-            if (button.id == 6) // Discord
+            if (button.id == 7) // Discord
             {
                 try
                 {
@@ -236,7 +243,7 @@ public class GuiMainMenu extends GuiScreen
                     e.printStackTrace();
                 }
             }
-            if (button.id == 7) // YouTube
+            if (button.id == 8) // YouTube
             {
                 try
                 {
@@ -316,10 +323,9 @@ public class GuiMainMenu extends GuiScreen
         byte byte0 = 30;
         if (!mc.gameSettings.alphaMenu.value)
         {
-            GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/title/mclogo.png"));
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/title/mclogo.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            drawTexturedModalRect(k + 0, byte0 + 0, 0, 0, 155, 64);
-            drawTexturedModalRect(k + 155, byte0 + 0, 0, 64, 155, 64);
+            drawTexturedModalRect(k + 0, byte0 + 0, 0, 0, 274, 50, 1d/274, 1d/50);
         }
         else
         {
@@ -328,7 +334,7 @@ public class GuiMainMenu extends GuiScreen
         GL11.glPushMatrix();
         GL11.glTranslatef(width / 2 + 140, 80F, 0.0F);
         GL11.glRotatef(-20F, 0.0F, 0.0F, 1.0F);
-        float f1 = 1.8F - MathHelper.abs(MathHelper.sin(((float)(System.currentTimeMillis() % 1000L) / 1000F) * 3.141593F * 2.0F) * 0.1F);
+        float f1 = 1.8F - MathHelper.abs(MathHelper.sin(((float)(System.currentTimeMillis() % 1000L) / 1000F) * MathHelper.PI * 2.0F) * 0.1F);
         f1 = (f1 * 100F) / (float)(fontRenderer.getStringWidth(splashText) + 32);
         GL11.glScalef(f1, f1, f1);
         drawStringCentered(fontRenderer, splashText, 0, -8, 0xffff00);
@@ -407,9 +413,9 @@ public class GuiMainMenu extends GuiScreen
             GL11.glRotatef(15.0F, 1.0F, 0.0F, 0.0F);
             GL11.glScalef(0.89F, 1.0F, 0.4F);
             GL11.glTranslatef((float)(-logoBlockLayers[0].length()) * 0.5F, (float)(-logoBlockLayers.length) * 0.5F, 0.0F);
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             if(var4 == 0) {
-                GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/title/black.png"));
+                this.mc.renderEngine.loadTexture("/title/black.png").bind();
             }
 
             RenderBlocks var5 = new RenderBlocks();
@@ -456,7 +462,7 @@ public class GuiMainMenu extends GuiScreen
     
     public static void loadLogo() {
     	try {
-    		InputStream inputStream = GuiMainMenu.class.getResourceAsStream("/title/retrologo.png");
+    		InputStream inputStream = GuiMainMenu.class.getResourceAsStream("/assets/minecraft/textures/gui/title/retrologo.png");
     		BufferedImage image = ImageIO.read(inputStream);
     		inputStream.close();
     		
diff --git a/src/main/java/net/minecraft/client/gui/GuiMissingMinecraft.java b/src/main/java/net/minecraft/client/gui/GuiMissingMinecraft.java
index 5b2ec3577..8d649f6ea 100644
--- a/src/main/java/net/minecraft/client/gui/GuiMissingMinecraft.java
+++ b/src/main/java/net/minecraft/client/gui/GuiMissingMinecraft.java
@@ -74,11 +74,11 @@ public class GuiMissingMinecraft extends GuiScreen{
 
     public void drawBackground(float partialTick)
     {
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glDisable(2912 /*GL_FOG*/);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_FOG);
 
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/assets/minecraft/textures/block/netherrack_mossy.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/block/netherrack_mossy.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         GL11.glEnable(GL11.GL_BLEND);
 
@@ -92,7 +92,7 @@ public class GuiMissingMinecraft extends GuiScreen{
         tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0);
         tessellator.draw();
 
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/assets/minecraft/textures/block/dirt.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/block/dirt.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0f);
 
         // Then Draw dirt texture
diff --git a/src/main/java/net/minecraft/client/gui/GuiOutOfMemory.java b/src/main/java/net/minecraft/client/gui/GuiOutOfMemory.java
index 7269e00bc..8ceb51df8 100644
--- a/src/main/java/net/minecraft/client/gui/GuiOutOfMemory.java
+++ b/src/main/java/net/minecraft/client/gui/GuiOutOfMemory.java
@@ -18,12 +18,12 @@ public class GuiOutOfMemory extends GuiScreen
         I18n i18n = I18n.getInstance();
         drawDefaultBackground();
         drawStringCentered(fontRenderer, i18n.translateKey("gui.out_of_memory.label.title"), width / 2, (height / 4 - 60) + 20, 0xFFFFFF);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.1"), width / 2 - 140, (height / 4 - 60) + 60 + 0, 0xA0A0A0);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.2"), width / 2 - 140, (height / 4 - 60) + 60 + 18, 0xA0A0A0);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.3"), width / 2 - 140, (height / 4 - 60) + 60 + 27, 0xA0A0A0);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.4"), width / 2 - 140, (height / 4 - 60) + 60 + 36, 0xA0A0A0);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.5"), width / 2 - 140, (height / 4 - 60) + 60 + 45, 0xA0A0A0);
-        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.body.6"), width / 2 - 140, (height / 4 - 60) + 60 + 63, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.1"), width / 2 - 140, (height / 4 - 60) + 60 + 0, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.2"), width / 2 - 140, (height / 4 - 60) + 60 + 18, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.3"), width / 2 - 140, (height / 4 - 60) + 60 + 27, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.4"), width / 2 - 140, (height / 4 - 60) + 60 + 36, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.5"), width / 2 - 140, (height / 4 - 60) + 60 + 45, 0xA0A0A0);
+        drawString(fontRenderer, i18n.translateKey("gui.out_of_memory.label.body.6"), width / 2 - 140, (height / 4 - 60) + 60 + 63, 0xA0A0A0);
         super.drawScreen(mouseX, mouseY, partialTick);
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiPaintingPicker.java b/src/main/java/net/minecraft/client/gui/GuiPaintingPicker.java
index 5e537ec2f..11cae75ca 100644
--- a/src/main/java/net/minecraft/client/gui/GuiPaintingPicker.java
+++ b/src/main/java/net/minecraft/client/gui/GuiPaintingPicker.java
@@ -1,9 +1,9 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.ArtType;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
@@ -17,12 +17,12 @@ import static org.lwjgl.opengl.GL11.GL_BLEND;
 public class GuiPaintingPicker
     extends GuiScreen
 {
-    private final EntityPlayer player;
+    private final Player player;
     private final List<ArtEntry> artEntries = new ArrayList<>();
     private ArtType centerArt = ArtType.Kebab;
     private int tallestSize = 0;
 
-    public GuiPaintingPicker(EntityPlayer player)
+    public GuiPaintingPicker(Player player)
     {
         this.player = player;
         for (ArtType art : ArtType.values){
@@ -162,7 +162,7 @@ public class GuiPaintingPicker
 
     public void drawTexturedIconPainting(int x, int y, int width, int height, IconCoordinate coordinate, float alpha)
     {
-        coordinate.parentAtlas.bindTexture();
+        coordinate.parentAtlas.bind();
         Tessellator tessellator = Tessellator.instance;
         GL11.glColor4f(1f, 1f, 1f, alpha);
         tessellator.startDrawingQuads();
diff --git a/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java b/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
index be7fa667d..b79ddf22d 100644
--- a/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
+++ b/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextureButton;
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
 import net.minecraft.core.Global;
 import net.minecraft.core.util.helper.Utils;
 import net.minecraft.core.world.season.Season;
@@ -27,7 +27,7 @@ public class GuiPhotoMode extends GuiScreen
     private GuiSlider sliderTimeOfDay;
     private GuiButton buttonSeason;
     private GuiButton buttonTakeScreenshot;
-    private GuiListenerTextureButton buttonOpenScreenshotFolder;
+    private GuiListenerButton buttonOpenScreenshotFolder;
     private GuiButton buttonExit;
     private GuiSlider sliderFog;
     private GuiSlider sliderTilt;
@@ -134,7 +134,8 @@ public class GuiPhotoMode extends GuiScreen
         buttonRotateLeft = new GuiButton(0, width / 2 - 59 - 2 - 20, height - 20, 20, 20, "<");
         buttonRotateRight = new GuiButton(1, width / 2 + 59 + 2 + 1, height - 20, 20, 20, ">");
         buttonTakeScreenshot = new GuiButton(4, width / 2 - 59, height - 20, 98, 20, i18n.translateKey("gui.photo_mode.button.take_screenshot"));
-        buttonOpenScreenshotFolder = new GuiListenerTextureButton(30, "/assets/minecraft/textures/gui/gui.png", buttonTakeScreenshot.getWidth() + buttonTakeScreenshot.getX() + 1, buttonTakeScreenshot.getY(), 100, 106 - 20, 20, 20);
+        buttonOpenScreenshotFolder = (GuiListenerButton) new GuiListenerButton(30, buttonTakeScreenshot.getWidth() + buttonTakeScreenshot.getX() + 1, buttonTakeScreenshot.getY(), 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_folder", "minecraft:gui/misc/button_folder_highlighted", "minecraft:gui/misc/button_folder");
         buttonOpenScreenshotFolder.setActionListener(() -> {
             File f = new File(mc.getMinecraftDir(), "screenshots");
             f.mkdirs();
@@ -322,15 +323,15 @@ public class GuiPhotoMode extends GuiScreen
     public void drawScreen(int mouseX, int mouseY, float partialTick)
     {
         GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
-        GL11.glMatrixMode(5889 /*GL_PROJECTION*/);
+        GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
-        GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
+        GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glLoadIdentity();
         GL11.glClear(256);
-        GL11.glMatrixMode(5889 /*GL_PROJECTION*/);
+        GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
         GL11.glOrtho(0.0D, mc.resolution.scaledWidth, mc.resolution.scaledHeight, 0.0D, 1000D, 3000D);
-        GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
+        GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -2000F);
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiPickMonster.java b/src/main/java/net/minecraft/client/gui/GuiPickMonster.java
index 6876101cf..807b4c278 100644
--- a/src/main/java/net/minecraft/client/gui/GuiPickMonster.java
+++ b/src/main/java/net/minecraft/client/gui/GuiPickMonster.java
@@ -2,13 +2,12 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.gui.popup.GuiPopup;
 import net.minecraft.client.gui.popup.PopupBuilder;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.net.packet.Packet132SetMobSpawner;
-import net.minecraft.core.world.World;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.net.packet.SetMobSpawnerPacket;
 
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -35,8 +34,8 @@ public class GuiPickMonster
     public void init() {
         List<String> monsters = new ArrayList<>();
         for (Class<? extends Entity> clazz : EntityDispatcher.classToKeyMap.keySet()) {
-            if (clazz == EntityFireflyCluster.class) continue;
-            if (EntityLiving.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
+            if (clazz == FireflyClusterMob.class) continue;
+            if (Mob.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
                 monsters.add(EntityDispatcher.classToKeyMap.get(clazz));
             }
         }
@@ -62,13 +61,13 @@ public class GuiPickMonster
                 if (statusCode == 1) {
                     mobId = monsters.get((Integer) results.get("list"));
                     if (!mc.theWorld.isClientSide) {
-                        TileEntityMobSpawner spawner = (TileEntityMobSpawner) mc.theWorld.getBlockTileEntity(x, y, z);
+                        MobSpawnerBlockEntity spawner = (MobSpawnerBlockEntity) mc.theWorld.getBlockEntity(x, y, z);
                         if (spawner == null) {
                             return;
                         }
                         spawner.setMobId(mobId);
                     } else {
-                        mc.getSendQueue().addToSendQueue(new Packet132SetMobSpawner(x, y, z, mobId));
+                        mc.getSendQueue().addToSendQueue(new SetMobSpawnerPacket(x, y, z, mobId));
                     }
                 }
                 shouldClose = true;
diff --git a/src/main/java/net/minecraft/client/gui/GuiRenderItem.java b/src/main/java/net/minecraft/client/gui/GuiRenderItem.java
index 8d347dbe2..9be76dd78 100644
--- a/src/main/java/net/minecraft/client/gui/GuiRenderItem.java
+++ b/src/main/java/net/minecraft/client/gui/GuiRenderItem.java
@@ -6,15 +6,15 @@ import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.item.model.ItemModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL12;
 
@@ -41,8 +41,8 @@ public class GuiRenderItem extends Gui
         if (slot != null)
         {
             discovered = slot.getIsDiscovered(mc.thePlayer);
-            if (slot.getBackgroundIconId() != null) {
-                final IconCoordinate iconIndex = TextureRegistry.getTexture(slot.getBackgroundIconId());
+            if (slot.getItemIcon() != null) {
+                final IconCoordinate iconIndex = TextureRegistry.getTexture(slot.getItemIcon());
                 if (itemStack == null)
                 {
                     GL11.glDisable(GL11.GL_LIGHTING);
@@ -61,12 +61,12 @@ public class GuiRenderItem extends Gui
                 BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
                 ItemModel itemModel = ItemModelDispatcher.getInstance().getDispatch(itemStack.getItem());
                 itemModel.renderItemIntoGui(Tessellator.instance, mc.fontRenderer, mc.renderEngine, itemStack, x, y, discovered ? 1.0f : 0.0f, 1.0f);
-                if(slot instanceof SlotGuidebook){
-                    if(((SlotGuidebook) slot).recipe instanceof RecipeEntryTrommel && ((SlotGuidebook) slot).item != null && ((SlotGuidebook) slot).isOutput){
-                        WeightedRandomBag<WeightedRandomLootObject> loot = ((RecipeEntryTrommel)((SlotGuidebook) slot).recipe).getOutput();
-                        int index = slot.id;
-                        if(((SlotGuidebook) slot).recipeAmount > 8){
-                            index = slot.id + (9 * ((SlotGuidebook) slot).recipeIndex);
+                if(slot instanceof GuidebookSlot){
+                    if(((GuidebookSlot) slot).recipe instanceof RecipeEntryTrommel && ((GuidebookSlot) slot).item != null && ((GuidebookSlot) slot).isOutput){
+                        WeightedRandomBag<WeightedRandomLootObject> loot = ((RecipeEntryTrommel)((GuidebookSlot) slot).recipe).getOutput();
+                        int index = slot.index;
+                        if(((GuidebookSlot) slot).recipeAmount > 8){
+                            index = slot.index + (9 * ((GuidebookSlot) slot).recipeIndex);
                         }
                         WeightedRandomLootObject lootObject = loot.getEntries().get(index);
                         String s;
diff --git a/src/main/java/net/minecraft/client/gui/GuiScreen.java b/src/main/java/net/minecraft/client/gui/GuiScreen.java
index cc38d5e21..5b4372aef 100644
--- a/src/main/java/net/minecraft/client/gui/GuiScreen.java
+++ b/src/main/java/net/minecraft/client/gui/GuiScreen.java
@@ -11,7 +11,6 @@ import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.util.debug.DebugRender;
 import net.minecraft.client.input.InputType;
 
-import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.sound.SoundCategory;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
@@ -182,10 +181,10 @@ public class GuiScreen extends Gui
 
     public void drawBackground()
     {
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glDisable(2912 /*GL_FOG*/);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_FOG);
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         float f = 32F;
         tessellator.startDrawingQuads();
@@ -201,8 +200,7 @@ public class GuiScreen extends Gui
     	glDisable(GL_DEPTH_TEST);
     	glEnable(GL_BLEND);
     	glColor3d(1.0, 1.0, 1.0);
-    	glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
-    	drawTexturedModalRect(mc.controllerInput.cursorX - 8, mc.controllerInput.cursorY - 8, 224, 0, 16, 16, 32, 32);
+        drawGuiTexture(mc.renderEngine, (int) (mc.controllerInput.cursorX - 8), (int) (mc.controllerInput.cursorY - 8), 16, 16, "/assets/minecraft/textures/gui/controller/cursor.png");
     	glDisable(GL_BLEND);
     }
     public void controllerInput(ControllerInput controller){
diff --git a/src/main/java/net/minecraft/client/gui/GuiSleepMP.java b/src/main/java/net/minecraft/client/gui/GuiSleepMP.java
index 4b4004fcb..8f23abf8f 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSleepMP.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSleepMP.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.gui;
 
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
-import net.minecraft.client.net.handler.NetClientHandler;
-import net.minecraft.core.net.packet.Packet19EntityAction;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
+import net.minecraft.client.net.handler.ClientPacketHandler;
+import net.minecraft.core.net.packet.PlayerCommandPacket;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.net.ChatEmotes;
 import net.minecraft.core.lang.I18n;
 import org.lwjgl.input.Keyboard;
 
 // Referenced classes of package net.minecraft.src:
-//            GuiChat, StringTranslate, GuiButton, EntityPlayerSP, 
-//            EntityClientPlayerMP, Packet19EntityAction, NetClientHandler
+//            GuiChat, StringTranslate, GuiButton, LocalPlayer,
+//            MultiplayerLocalPlayer, PlayerCommandPacket, ClientPacketHandler
 
 public class GuiSleepMP extends GuiChat
 {
@@ -64,10 +64,10 @@ public class GuiSleepMP extends GuiChat
 
     private void func_22115_j()
     {
-        if(mc.thePlayer instanceof EntityClientPlayerMP)
+        if(mc.thePlayer instanceof MultiplayerLocalPlayer)
         {
-            NetClientHandler netclienthandler = ((EntityClientPlayerMP)mc.thePlayer).sendQueue;
-            netclienthandler.addToSendQueue(new Packet19EntityAction(mc.thePlayer, 3));
+            ClientPacketHandler netclienthandler = ((MultiplayerLocalPlayer)mc.thePlayer).sendQueue;
+            netclienthandler.addToSendQueue(new PlayerCommandPacket(mc.thePlayer, 3));
         }
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiSlider.java b/src/main/java/net/minecraft/client/gui/GuiSlider.java
index 1d1fe3308..f449b25f7 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSlider.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSlider.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.render.FontRenderer;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
@@ -58,16 +59,26 @@ public class GuiSlider extends GuiButton {
 		boolean mouseOver = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
 		int state = getButtonState(mouseOver);
 
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
 		GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
+		IconCoordinate tex;
+		switch (state) {
+			case STATE_DISABLED:
+				tex = disabledTexture;
+				break;
+			case STATE_HOVERED:
+				tex = hoveredTexture;
+				break;
+			case STATE_DEFAULT:
+			default:
+				tex = defaultTexture;
+		}
+
 		// Draw background
-		drawTexturedModalRect(xPosition, yPosition, 0, 46, width / 2, height);
-		drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46, width / 2, height);
+		drawGuiIcon(xPosition, yPosition, width, height, disabledTexture);
 
 		// Draw foreground
-		drawTexturedModalRect(xPosition + (int) (sliderValue * (float) (width - 8)), yPosition, 0, 46 + state * 20, 4, 20);
-		drawTexturedModalRect(xPosition + (int) (sliderValue * (float) (width - 8)) + 4, yPosition, 196, 46 + state * 20, 4, 20);
+		drawGuiIcon(xPosition + (int) (sliderValue * (float) (width - 8)), yPosition, 8, height, tex);
 
 		mouseDragged(mc, mouseX, mouseY);
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiSliderInteger.java b/src/main/java/net/minecraft/client/gui/GuiSliderInteger.java
index 15796b184..c6d4ca21c 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSliderInteger.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSliderInteger.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.render.FontRenderer;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
@@ -59,18 +60,36 @@ public class GuiSliderInteger extends GuiButton {
 		boolean mouseOver = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
 		int state = getButtonState(mouseOver);
 
-		GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
 		GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
+		IconCoordinate tex;
+		switch (state) {
+			case STATE_DISABLED:
+				tex = disabledTexture;
+				break;
+			case STATE_HOVERED:
+				tex = hoveredTexture;
+				break;
+			case STATE_DEFAULT:
+			default:
+				tex = defaultTexture;
+		}
+
 		// Draw background
-		drawTexturedModalRect(xPosition, yPosition, 0, 46, width / 2, height);
-		drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46, width / 2, height);
+//		drawTexturedModalRect(xPosition, yPosition, 0, 46, width / 2, height);
+//		drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46, width / 2, height);
 
 		// Draw foreground
 		int sliderWidth = getSliderWidth();
 		int maxValue = option.size() - 1;
-		drawTexturedModalRect(xPosition + (int) ((sliderValue / (float) maxValue) * (float) (width - sliderWidth)), yPosition, 0, 46 + state * 20, sliderWidth / 2, 20);
-		drawTexturedModalRect(xPosition + (int) ((sliderValue / (float) maxValue) * (float) (width - sliderWidth)) + sliderWidth / 2, yPosition, 200 - sliderWidth / 2, 46 + state * 20, sliderWidth / 2, 20);
+//		drawTexturedModalRect(xPosition + (int) ((sliderValue / (float) maxValue) * (float) (width - sliderWidth)), yPosition, 0, 46 + state * 20, sliderWidth / 2, 20);
+//		drawTexturedModalRect(xPosition + (int) ((sliderValue / (float) maxValue) * (float) (width - sliderWidth)) + sliderWidth / 2, yPosition, 200 - sliderWidth / 2, 46 + state * 20, sliderWidth / 2, 20);
+
+		// Draw background
+		drawGuiIcon(xPosition, yPosition, width, height, disabledTexture);
+
+		// Draw foreground
+		drawGuiIcon(xPosition + (int) ((sliderValue / (float) maxValue) * (float) (width - sliderWidth)), yPosition, sliderWidth, height, tex);
 
 		mouseDragged(mc, mouseX, mouseY);
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiSoundTest.java b/src/main/java/net/minecraft/client/gui/GuiSoundTest.java
new file mode 100644
index 000000000..24b5de7b2
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/GuiSoundTest.java
@@ -0,0 +1,285 @@
+package net.minecraft.client.gui;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
+import net.minecraft.client.gui.modelviewer.elements.IListenerElement;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.sound.SoundEngine;
+import net.minecraft.client.sound.SoundEntry;
+import net.minecraft.client.sound.SoundRepository;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Utils;
+import org.jetbrains.annotations.Nullable;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+import paulscode.sound.SoundSystem;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GuiSoundTest extends GuiScreen{
+    private static final int TOP_SPACING = 24;
+    private static final int BUTTON_SPACING = 4;
+
+    protected int top;
+    protected int bottom;
+
+    protected Field[] repoFields;
+    protected SoundRepository[] repos;
+
+    protected int repoIndex;
+    protected SoundRepository currentRepo;
+    protected int entryIndex = 0;
+    @Nullable
+    protected SoundEntry currentEntry;
+
+    protected GuiListenerButton leftEntry;
+    protected GuiListenerButton leftRepo;
+
+    protected float volume = 1;
+    protected float pitch = 1;
+
+    protected boolean showURL = true;
+
+    public GuiSoundTest(GuiScreen parent) {
+        super(parent);
+        initRepos();
+    }
+
+    public void initRepos(){
+        List<Field> fields = new ArrayList<>();
+        for (Field f : SoundEngine.class.getFields()){
+            if (f.getType().isAssignableFrom(SoundRepository.class)){
+                fields.add(f);
+            }
+        }
+        repoFields = new Field[fields.size()];
+        repos = new SoundRepository[fields.size()];
+        for (int i = 0; i < fields.size(); i++) {
+            repoFields[i] = fields.get(i);
+            try {
+                repos[i] = (SoundRepository) fields.get(i).get(Minecraft.getMinecraft(this).sndManager);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        currentRepo = repos[0];
+        currentEntry = currentRepo.getAllEntries().get(0);
+        entryIndex = 0;
+    }
+    @Override
+    public void keyTyped(char c, int key, int mouseX, int mouseY)
+    {
+        if (key == Keyboard.KEY_ESCAPE) {
+            mc.displayGuiScreen(parentScreen);
+        }
+        List<GuiButton> _buttons = new ArrayList<>(controlList);
+        for (GuiButton button : _buttons){
+            if (button instanceof IListenerElement && button.isHovered(mouseX, mouseY)){
+                ((IListenerElement) button).onKeyTyped(c, key);
+            }
+        }
+    }
+    @Override
+    public void tick(){
+        List<GuiButton> _buttons = new ArrayList<>(controlList);
+        for (GuiButton button : _buttons){
+            if (button instanceof GuiListenerButton){
+                ((GuiListenerButton) button).tick();
+            }
+        }
+    }
+    public void init()
+    {
+
+        top = TOP_SPACING;
+        bottom = height - (BUTTON_SPACING + 20 + BUTTON_SPACING);
+        add(new GuiListenerButton(0, width/2 - 100, height - (BUTTON_SPACING + 20), 200, 20, I18n.getInstance().translateKey("gui.sound_test.button.done")).setActionListener(() -> {
+            onClosed();
+            mc.displayGuiScreen(null);
+        }));
+
+        leftRepo = add(new GuiListenerButton(1, width - (20 + BUTTON_SPACING) * 2, bottom - (BUTTON_SPACING + 20), 20, 20, "<")
+            .setActionListener(() -> cycleRepo(-1)));
+        add(new GuiListenerButton(2, width - (20 + BUTTON_SPACING) * 1, bottom - (BUTTON_SPACING + 20), 20, 20, ">")
+            .setActionListener(() -> cycleRepo(1)));
+
+        leftEntry = add(new GuiListenerButton(11, width - (20 + BUTTON_SPACING) * 2, bottom - (BUTTON_SPACING + 20) * 2, 20, 20, "<")
+            .setActionListener(() -> cycleEntry(-1)));
+        add(new GuiListenerButton(12, width - (20 + BUTTON_SPACING) * 1, bottom - (BUTTON_SPACING + 20) * 2, 20, 20, ">")
+            .setActionListener(() -> cycleEntry(1)));
+
+        add(new GuiListenerButton(20, width/2 - 100, bottom - (BUTTON_SPACING + 20), 100 - BUTTON_SPACING/2, 20, I18n.getInstance().translateKey("gui.sound_test.button.play"))
+            .setActionListener(() -> playEntry(false))
+        );
+        add(new GuiListenerButton(21, width/2 + 100 - (100 - BUTTON_SPACING/2), bottom - (BUTTON_SPACING + 20), 100 - BUTTON_SPACING/2, 20, I18n.getInstance().translateKey("gui.sound_test.button.play_stream"))
+            .setActionListener(() -> playEntry(true))
+        );
+        add(new GuiListenerButton(22, width/2 + 100 + BUTTON_SPACING, bottom - (BUTTON_SPACING + 20), 20, 20, "X")
+            .setActionListener(this::stopSound)
+        );
+
+
+        add(new GuiListenerButton(30, BUTTON_SPACING, bottom - (BUTTON_SPACING + 20), 20, 20, "")
+            .setActionListener(() -> Utils.openDirectory(new File(mc.getMinecraftDir(), "resources")))
+            .setTextures("minecraft:gui/misc/button_folder", "minecraft:gui/misc/button_folder_highlighted", "minecraft:gui/misc/button_folder"));
+
+        add(new GuiListenerButton(31, 20 + BUTTON_SPACING * 2, bottom - (BUTTON_SPACING + 20), 20, 20, "V"))
+            .setActionListener(() -> showURL = !showURL);
+
+        add(new GuiListenerButton(32, 40 + BUTTON_SPACING * 3, bottom - (BUTTON_SPACING + 20), 40, 20, I18n.getInstance().translateKey("gui.sound_test.button.reload")))
+            .setActionListener(() -> {
+                mc.sndManager = new SoundEngine();
+                mc.sndManager.init(mc.gameSettings);
+                mc.downloadResourcesThread.reloadResources();
+                initRepos();
+            });
+
+        GuiListenerTextField volumeField = new GuiListenerTextField(parentScreen, mc.fontRenderer, width - BUTTON_SPACING - 60, bottom - (BUTTON_SPACING + 20) * 3, 60, 20, String.valueOf(volume), "Volume");
+        add(volumeField)
+            .setPrefaceText("Vol: ")
+            .setKeyListener(key -> {
+                try {
+                    volume = Float.parseFloat(volumeField.getText());
+                } catch (Exception ignored){}})
+            .setActionListener(() -> {
+                if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)){
+                    volumeField.setText(String.valueOf(1));
+                    volume = 1;
+                }});
+
+        GuiListenerTextField pitchField = new GuiListenerTextField(parentScreen, mc.fontRenderer, width - BUTTON_SPACING - 60, bottom - (BUTTON_SPACING + 20) * 4, 60, 20, String.valueOf(pitch), "Pitch");
+        add(pitchField)
+            .setPrefaceText("Pitch: ")
+            .setKeyListener(key -> {
+                try {
+                    pitch = Float.parseFloat(pitchField.getText());
+                } catch (Exception ignored){}})
+            .setActionListener(() -> {
+                if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)){
+                    pitchField.setText(String.valueOf(1));
+                    pitch = 1;
+                }});
+    }
+
+    protected void buttonPressed(GuiButton button)
+    {
+    }
+
+    protected void buttonReleased(GuiButton button)
+    {
+    }
+
+    protected void cycleRepo(int offset) {
+        int index = (repoIndex + offset + repos.length) % repos.length;
+        currentRepo = repos[index];
+        repoIndex = index;
+        try {
+            currentEntry = currentRepo.getAllEntries().get(0);
+            entryIndex = 0;
+        } catch (Exception e) {
+            currentEntry = null;
+            entryIndex = -1;
+        }
+    }
+
+    protected void cycleEntry(int offset) {
+        if (currentRepo.getAllEntries().size() <= 0) return;
+        int index = (entryIndex + offset + currentRepo.getAllEntries().size()) % currentRepo.getAllEntries().size();
+        currentEntry = currentRepo.getAllEntries().get(index);
+        entryIndex = index;
+    }
+
+    public void drawScreen(int mouseX, int mouseY, float partialTick) {
+        drawDefaultBackground();
+
+        super.drawScreen(mouseX, mouseY, partialTick);
+
+        fontRenderer.drawCenteredString(I18n.getInstance().translateKey("gui.sound_test.label.title"), width/2, 5, 0xFFFFFF);
+
+        fontRenderer.drawCenteredString(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.repo", repoFields[repoIndex].getName()), width/2, top + 10, 0xFFFFFF);
+
+        String msg = I18n.getInstance().translateKey("gui.sound_test.label.select_repo");
+        fontRenderer.drawString(msg, leftRepo.getX() - BUTTON_SPACING - fontRenderer.getStringWidth(msg), leftRepo.getY() + 6, 0xFFFFFF);
+        msg = I18n.getInstance().translateKey("gui.sound_test.label.select_entry");
+        fontRenderer.drawString(msg, leftEntry.getX() - BUTTON_SPACING - fontRenderer.getStringWidth(msg), leftEntry.getY() + 6, 0xFFFFFF);
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(fontRenderer.wrapFormattedStringToWidth(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.id", currentEntry == null ? null : currentEntry.soundID), width - 10)).append("\n");
+        builder.append(fontRenderer.wrapFormattedStringToWidth(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.name", currentEntry == null ? null : currentEntry.name), width - 10)).append("\n");
+        builder.append(fontRenderer.wrapFormattedStringToWidth(I18n.getInstance().translateKeyAndFormat("gui.sound_test.label.url", String.valueOf(currentEntry == null ? null : (showURL ? currentEntry.url : "REDACTED"))), width - 10)).append("\n");
+        String[] lines = builder.toString().split("\n");
+        int y = top + 30;
+        for (String line : lines) {
+            fontRenderer.drawString(line, 5, y, 0xBBBBBB);
+            y += 10;
+        }
+    }
+    @Override
+    public void drawDefaultBackground() {
+        super.drawDefaultBackground();
+
+        if (mc.theWorld == null)
+        {
+            Tessellator tessellator = Tessellator.instance;
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+            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,              bottom / scale);
+            tessellator.addVertexWithUV(width,  bottom, 0.0D,   width / scale,  bottom / scale);
+            tessellator.addVertexWithUV(width,  top,    0.0D,   width / scale,  top / scale);
+            tessellator.addVertexWithUV(0,      top,    0.0D,   0,              top / scale);
+
+            tessellator.draw();
+        }
+        else
+        {
+            drawRect(0, 0, width, top, 0x5F000000);
+            drawRect(0, bottom, width, height, 0x5F000000);
+        }
+    }
+
+    public void playEntry(boolean asStream) {
+        if (currentEntry == null) return;
+        if (asStream) {
+            final float streamingVolume = 16F;
+            SoundSystem soundSystem = SoundEngine.getSoundSystem();
+            soundSystem.newStreamingSource(true, "debug", currentEntry.url, currentEntry.name, false, 0, 0, 0, 2, streamingVolume * 4F);
+            soundSystem.setVolume("debug", volume * mc.gameSettings.masterVolume.value);
+            soundSystem.play("debug");
+        } else  {
+            mc.sndManager.playSoundEntry(currentEntry, "debug", SoundCategory.GUI_SOUNDS, volume, pitch);
+        }
+    }
+
+    public void stopSound() {
+        SoundEngine.getSoundSystem().stop("debug");
+    }
+
+    private void overlayBackground(int minX, int maxX, int minY, int maxY)
+    {
+        if (mc.theWorld == null)
+        {
+            Tessellator tessellator = Tessellator.instance;
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+            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/GuiStats.java b/src/main/java/net/minecraft/client/gui/GuiStats.java
index e171f1e5e..67b936327 100644
--- a/src/main/java/net/minecraft/client/gui/GuiStats.java
+++ b/src/main/java/net/minecraft/client/gui/GuiStats.java
@@ -3,35 +3,41 @@ package net.minecraft.client.gui;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.achievement.stat.*;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.item.Item;
-import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.Lighting;
-import net.minecraft.client.render.entity.ItemEntityRenderer;
 import net.minecraft.core.sound.SoundCategory;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
 
 import java.util.*;
 
-public class GuiStats extends GuiScreen
-{
-    private static ItemEntityRenderer itemEntityRenderer = new ItemEntityRenderer();
-    protected GuiScreen screen;
+public class GuiStats extends GuiScreen {
+    private static final int STATS_ICON_SIZE = 18;
+    private static final int COLUMN_BUTTON_SIZE = 36;
+    private static final int COLUMN0_RIGHT = 115;
+    private static final int COLUMN1_RIGHT = 165;
+    private static final int COLUMN2_RIGHT = 215;
+
+    protected GuiScreen parent;
+    protected GuiTooltip tooltip;
     protected String title;
     private GeneralStatisticsList generalStatisticsList;
     private ItemStatisticsList itemStatisticsList;
     private BlockStatisticsList blockStatisticsList;
-    private StatsCounter statsCounter;
+    private final StatsCounter statsCounter;
     private ScrolledSelectionList selectionList;
 
-    public GuiStats(GuiScreen guiscreen, StatsCounter statfilewriter)
+    public GuiStats(GuiScreen parent, StatsCounter statsCounter)
     {
         title = I18n.getInstance().translateKey("gui.statistics.label.title");
         selectionList = null;
-        screen = guiscreen;
-        statsCounter = statfilewriter;
+        this.parent = parent;
+        this.statsCounter = statsCounter;
+        tooltip = new GuiTooltip(Minecraft.getMinecraft(this));
     }
 
     @Override
@@ -72,7 +78,7 @@ public class GuiStats extends GuiScreen
         }
         if(button.id == 0)
         {
-            mc.displayGuiScreen(screen);
+            mc.displayGuiScreen(parent);
         } else
         if(button.id == 1)
         {
@@ -96,145 +102,37 @@ public class GuiStats extends GuiScreen
         super.drawScreen(mouseX, mouseY, partialTick);
     }
 
-    private void func_27138_c(int i, int j, int k)
+    private void renderItemAsIcon(int x, int y, int itemID)
     {
-        func_27147_a(i + 1, j + 1);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        renderBackgroundIcon(x + 1, y + 1);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         Lighting.enableInventoryLight();
-        Item item = Item.itemsList[k];
-        ItemModelDispatcher.getInstance().getDispatch(item).renderItemIntoGui(Tessellator.instance, fontRenderer, mc.renderEngine, item.getDefaultStack(), i + 2, j + 2, 1F);
+        Item item = Item.itemsList[itemID];
+        ItemModelDispatcher.getInstance().getDispatch(item).renderItemIntoGui(Tessellator.instance, fontRenderer, mc.renderEngine, item.getDefaultStack(), x + 2, y + 2, 1F);
         Lighting.disable();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-    }
-
-    private void func_27147_a(int i, int j)
-    {
-        func_27136_c(i, j, 0, 0);
-    }
-
-    private void func_27136_c(int i, int j, int k, int l)
-    {
-        int i1 = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/slot.png");
-        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(i1);
-        Tessellator tessellator = Tessellator.instance;
-        tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(i + 0, j + 18, zLevel, (float)(k + 0) * 0.0078125F, (float)(l + 18) * 0.0078125F);
-        tessellator.addVertexWithUV(i + 18, j + 18, zLevel, (float)(k + 18) * 0.0078125F, (float)(l + 18) * 0.0078125F);
-        tessellator.addVertexWithUV(i + 18, j + 0, zLevel, (float)(k + 18) * 0.0078125F, (float)(l + 0) * 0.0078125F);
-        tessellator.addVertexWithUV(i + 0, j + 0, zLevel, (float)(k + 0) * 0.0078125F, (float)(l + 0) * 0.0078125F);
-        tessellator.draw();
-    }
-
-    static Minecraft func_27141_a(GuiStats guistats)
-    {
-        return guistats.mc;
-    }
-
-    static FontRenderer func_27145_b(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    public static StatsCounter func_27142_c(GuiStats guistats)
-    {
-        return guistats.statsCounter;
-    }
-
-    static FontRenderer func_27140_d(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27146_e(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static Minecraft func_27143_f(GuiStats guistats)
-    {
-        return guistats.mc;
-    }
-
-    static void func_27128_a(GuiStats guistats, int i, int j, int k, int l)
-    {
-        guistats.func_27136_c(i, j, k, l);
-    }
-
-    static Minecraft func_27149_g(GuiStats guistats)
-    {
-        return guistats.mc;
-    }
-
-    static FontRenderer func_27133_h(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27137_i(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27132_j(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27134_k(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27139_l(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static void func_27129_a(GuiStats guistats, int i, int j, int k, int l, int i1, int j1)
-    {
-        guistats.drawGradientRect(i, j, k, l, i1, j1);
-    }
-
-    static FontRenderer func_27144_m(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static FontRenderer func_27127_n(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
-    }
-
-    static void func_27135_b(GuiStats guistats, int i, int j, int k, int l, int i1, int j1)
-    {
-        guistats.drawGradientRect(i, j, k, l, i1, j1);
-    }
-
-    static FontRenderer func_27131_o(GuiStats guistats)
-    {
-        return guistats.fontRenderer;
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
-    static void func_27148_a(GuiStats guistats, int i, int j, int k)
+    private void renderBackgroundIcon(int x, int y)
     {
-        guistats.func_27138_c(i, j, k);
+        GL11.glColor4f(1f, 1f, 1f, 1f);
+        drawGuiIcon(x, y, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot"));
     }
 
     abstract class StatsSelectionList extends ScrolledSelectionList
     {
-        protected int field_27268_b;
-        protected List field_27273_c;
-        protected Comparator<StatItem> field_27272_d;
-        public int field_27271_e;
-        public int field_27270_f;
+        protected int clickedColumn;
+        protected List<StatItem> statsList;
+        protected Comparator<StatItem> statsSorter;
+        public int sortingColumn;
+        public int sortingMode;
 
         protected StatsSelectionList()
         {
             super(mc, width, height, 32, height - 64, 20);
-            field_27268_b = -1;
-            field_27271_e = -1;
-            field_27270_f = 0;
+            clickedColumn = -1;
+            sortingColumn = -1;
+            sortingMode = 0;
             setRenderSelection(false);
             setRenderHeader(true, 20);
         }
@@ -261,68 +159,61 @@ public class GuiStats extends GuiScreen
         {
             if(!Mouse.isButtonDown(0))
             {
-                field_27268_b = -1;
+                clickedColumn = -1;
             }
-            if(field_27268_b == 0)
-            {
-                func_27136_c((x + 115) - 18, y + 1, 0, 0);
-            } else
-            {
-                func_27136_c((x + 115) - 18, y + 1, 0, 18);
+            if(clickedColumn == 0) {
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot"));
+            } else {
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot_raised"));
             }
-            if(field_27268_b == 1)
-            {
-                func_27136_c((x + 165) - 18, y + 1, 0, 0);
-            } else
-            {
-                func_27136_c((x + 165) - 18, y + 1, 0, 18);
+            if(clickedColumn == 1) {
+                drawGuiIcon((x + COLUMN1_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot"));
+            } else {
+                drawGuiIcon((x + COLUMN1_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot_raised"));
             }
-            if(field_27268_b == 2)
-            {
-                func_27136_c((x + 215) - 18, y + 1, 0, 0);
-            } else
-            {
-                func_27136_c((x + 215) - 18, y + 1, 0, 18);
+            if(clickedColumn == 2) {
+                drawGuiIcon((x + COLUMN2_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot"));
+            } else {
+                drawGuiIcon((x + COLUMN2_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/slot_raised"));
             }
-            if(field_27271_e != -1)
+            if(sortingColumn != -1)
             {
-                char c = 'O';
-                byte byte0 = 18;
-                if(field_27271_e == 1)
+                int c = COLUMN0_RIGHT - COLUMN_BUTTON_SIZE;
+                boolean up = false;
+                if(sortingColumn == 1)
                 {
-                    c = '\201';
-                } else
-                if(field_27271_e == 2)
+                    c = COLUMN1_RIGHT - COLUMN_BUTTON_SIZE;
+                } else if(sortingColumn == 2)
                 {
-                    c = '\263';
+                    c = COLUMN2_RIGHT - COLUMN_BUTTON_SIZE;
                 }
-                if(field_27270_f == 1)
+                if(sortingMode == 1)
                 {
-                    byte0 = 36;
+                    up = true;
                 }
-                func_27136_c(x + c, y + 1, byte0, 0);
+                drawGuiIcon(x + c, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/arrow_" + (up ? "up" : "down")));
             }
         }
 
         @Override
         protected void clickedHeader(int x, int y)
         {
-            field_27268_b = -1;
-            if(x >= 79 && x < 115)
+            clickedColumn = -1;
+            if(x >= COLUMN0_RIGHT - COLUMN_BUTTON_SIZE && x < COLUMN0_RIGHT)
             {
-                field_27268_b = 0;
+                clickedColumn = 0;
             } else
-            if(x >= 129 && x < 165)
+            if(x >= COLUMN1_RIGHT - COLUMN_BUTTON_SIZE && x < COLUMN1_RIGHT)
             {
-                field_27268_b = 1;
+                clickedColumn = 1;
             } else
-            if(x >= 179 && x < 215)
+            if(x >= COLUMN2_RIGHT - COLUMN_BUTTON_SIZE && x < COLUMN2_RIGHT)
             {
-                field_27268_b = 2;
+                clickedColumn = 2;
             }
-            if(field_27268_b >= 0)
+            if(clickedColumn >= 0)
             {
-                func_27266_c(field_27268_b);
+                clickedColumn(clickedColumn);
                 mc.sndManager.playSound("random.click", SoundCategory.GUI_SOUNDS, 1.0F, 1.0F);
             }
         }
@@ -330,110 +221,88 @@ public class GuiStats extends GuiScreen
         @Override
         protected final int getItemCount()
         {
-            return field_27273_c.size();
+            return statsList.size();
         }
 
-        protected final StatItem func_27264_b(int i)
+        protected final StatItem getStat(int index)
         {
-            return (StatItem)field_27273_c.get(i);
+            return statsList.get(index);
         }
 
-        protected abstract String func_27263_a(int i);
+        protected abstract String getTooltipKey(int column);
 
-        protected void func_27265_a(StatItem statcrafting, int i, int j, boolean flag)
+        protected void renderStatValue(StatItem statItem, int x, int y, boolean white)
         {
-            if(statcrafting != null)
+            if(statItem != null)
             {
-                String s = statcrafting.makeString(statsCounter.readStat(statcrafting));
-                drawString(fontRenderer, s, i - fontRenderer.getStringWidth(s), j + 5, flag ? 0xffffff : 0x909090);
+                String s = statItem.getFormattedValue(statsCounter.readStat(statItem));
+                drawString(fontRenderer, s, x - fontRenderer.getStringWidth(s), y + 5, white ? 0xffffff : 0x909090);
             } else
             {
                 String s1 = "-";
-                drawString(fontRenderer, s1, i - fontRenderer.getStringWidth(s1), j + 5, flag ? 0xffffff : 0x909090);
+                drawString(fontRenderer, s1, x - fontRenderer.getStringWidth(s1), y + 5, white ? 0xffffff : 0x909090);
             }
         }
 
         @Override
         protected void renderDecorations(int x, int y)
         {
+            GL11.glEnable(GL11.GL_TEXTURE_2D);
+            GL11.glShadeModel(GL11.GL_FLAT);
+            GL11.glEnable(GL11.GL_ALPHA_TEST);
             if(y < y0 || y > y1)
             {
                 return;
             }
-            int k = getItemAtPosition(x, y);
-            int l = width / 2 - 92 - 16;
-            if(k >= 0)
-            {
-                if(x < l + 40 || x > l + 40 + 20)
-                {
+            int row = getItemAtPosition(x, y);
+            int statsListLeft = width / 2 - 92 - 16;
+            if(row >= 0) { // If in darkened middle section (stats list)
+                if(x < statsListLeft + 40 || x > statsListLeft + 40 + 20) { // Return if not hovering over item icon column
                     return;
                 }
-                StatItem statcrafting = func_27264_b(k);
-                func_27267_a(statcrafting, x, y);
+                StatItem statItem = getStat(row);
+                renderStatItemTooltip(statItem, x, y);
             } else
             {
-                String s = "";
-                if(x >= (l + 115) - 18 && x <= l + 115)
-                {
-                    s = func_27263_a(0);
-                } else
-                if(x >= (l + 165) - 18 && x <= l + 165)
-                {
-                    s = func_27263_a(1);
-                } else
-                if(x >= (l + 215) - 18 && x <= l + 215)
-                {
-                    s = func_27263_a(2);
-                } else
-                {
+                String s;
+                if(x >= (statsListLeft + COLUMN0_RIGHT) - STATS_ICON_SIZE && x <= statsListLeft + COLUMN0_RIGHT) {
+                    s = getTooltipKey(0);
+                } else if(x >= (statsListLeft + COLUMN1_RIGHT) - STATS_ICON_SIZE && x <= statsListLeft + COLUMN1_RIGHT) {
+                    s = getTooltipKey(1);
+                } else if(x >= (statsListLeft + COLUMN2_RIGHT) - STATS_ICON_SIZE && x <= statsListLeft + COLUMN2_RIGHT) {
+                    s = getTooltipKey(2);
+                } else {
                     return;
                 }
-                s = (new StringBuilder()).append("").append(I18n.getInstance().translateKey(s)).toString().trim();
-                if(s.length() > 0)
-                {
-                    int i1 = x + 12;
-                    int j1 = y - 12;
-                    int k1 = fontRenderer.getStringWidth(s);
-                    drawGradientRect(i1 - 3, j1 - 3, i1 + k1 + 3, j1 + 8 + 3, 0xc0000000, 0xc0000000);
-                    fontRenderer.drawStringWithShadow(s, i1, j1, -1);
-                }
+                s = I18n.getInstance().translateKey(s).trim();
+                tooltip.render(s, x, y, 8, -8);
             }
         }
 
-        protected void func_27267_a(StatItem statcrafting, int i, int j)
+        protected void renderStatItemTooltip(StatItem statItem, int x, int y)
         {
-            if(statcrafting == null)
-            {
+            if(statItem == null) {
                 return;
             }
-            Item item = Item.itemsList[statcrafting.getItemID()];
-            String s = (new StringBuilder()).append("").append(I18n.getInstance().translateNameKey(item.getKey())).toString().trim();
-            if(s.length() > 0)
-            {
-                int k = i + 12;
-                int l = j - 12;
-                int i1 = fontRenderer.getStringWidth(s);
-                drawGradientRect(k - 3, l - 3, k + i1 + 3, l + 8 + 3, 0xc0000000, 0xc0000000);
-                fontRenderer.drawStringWithShadow(s, k, l, -1);
-            }
+            Item item = statItem.getItem();
+            String s = I18n.getInstance().translateNameKey(item.getKey()).trim();
+            tooltip.render(s, x, y, 8, -8);
         }
 
-        protected void func_27266_c(int i)
+        protected void clickedColumn(int column)
         {
-            if(i != field_27271_e)
+            if(column != sortingColumn)
             {
-                field_27271_e = i;
-                field_27270_f = -1;
-            } else
-            if(field_27270_f == -1)
+                sortingColumn = column;
+                sortingMode = -1;
+            } else if(sortingMode == -1)
             {
-                field_27270_f = 1;
-            } else
-            {
-                field_27271_e = -1;
-                field_27270_f = 0;
+                sortingMode = 1;
+            } else {
+                sortingColumn = -1;
+                sortingMode = 0;
             }
-            Collections.sort(field_27273_c, field_27272_d);
+            statsList.sort(statsSorter);
         }
     }
 
@@ -449,7 +318,7 @@ public class GuiStats extends GuiScreen
         @Override
         protected int getItemCount()
         {
-            return StatList.statList2.size();
+            return StatList.basicStats.size();
         }
 
         @Override
@@ -478,9 +347,9 @@ public class GuiStats extends GuiScreen
         @Override
         protected void renderItem(int index, int x, int y, int height, Tessellator tessellator)
         {
-            Stat statbase = (Stat)StatList.statList2.get(index);
-            drawString(fontRenderer, statbase.getStatName(), x + 2, y + 1, index % 2 != 0 ? 0x909090 : 0xffffff);
-            String s = statbase.makeString(statsCounter.readStat(statbase));
+            Stat stat = StatList.basicStats.get(index);
+            drawString(fontRenderer, stat.getStatName(), x + 2, y + 1, index % 2 != 0 ? 0x909090 : 0xffffff);
+            String s = stat.getFormattedValue(statsCounter.readStat(stat));
             drawString(fontRenderer, s, (x + 2 + 213) - fontRenderer.getStringWidth(s), y + 1, index % 2 != 0 ? 0x909090 : 0xffffff);
         }
     }
@@ -490,72 +359,62 @@ public class GuiStats extends GuiScreen
 
         public ItemStatisticsList()
         {
-            field_27273_c = new ArrayList();
-            Iterator iterator = StatList.usedItemStatsList.iterator();
-            do
-            {
-                if(!iterator.hasNext())
-                {
-                    break;
-                }
-                StatItem statcrafting = (StatItem)iterator.next();
+            statsList = new ArrayList<>();
+            for (Stat stat : StatList.usedItemStats) {
+                StatItem statItem = (StatItem) stat;
                 boolean flag = false;
-                int i = statcrafting.getItemID();
-                if(statsCounter.readStat(statcrafting) > 0)
-                {
+                int i = statItem.getItemID();
+                Stat broken = statItem.getItem().getStat(StatList.STAT_DEPLETED);
+                Stat crafted = statItem.getItem().getStat(StatList.STAT_CRAFTED);
+                if (statsCounter.readStat(statItem) > 0) {
                     flag = true;
-                } else
-                if(StatList.breakItemStats[i] != null && statsCounter.readStat(StatList.breakItemStats[i]) > 0)
-                {
+                } else if (broken != null && statsCounter.readStat(broken) > 0) {
                     flag = true;
-                } else
-                if(StatList.craftedItemStats[i] != null && statsCounter.readStat(StatList.craftedItemStats[i]) > 0)
-                {
+                } else if (crafted != null && statsCounter.readStat(crafted) > 0) {
                     flag = true;
                 }
-                if(flag)
-                {
-                    field_27273_c.add(statcrafting);
+                if (flag) {
+                    statsList.add(statItem);
                 }
-            } while(true);
-            field_27272_d = (si1, si2) -> {
-                int i = si1.getItemID();
-                int j = si2.getItemID();
-                Stat statbase = null;
+            }
+            statsSorter = (stat1, stat2) -> {
+                int id1 = stat1.getItemID();
+                int id2 = stat2.getItemID();
                 Stat statbase1 = null;
-                if(field_27271_e == 0)
+                Stat statbase2 = null;
+                if(sortingColumn == 0)
                 {
-                    statbase = StatList.breakItemStats[i];
-                    statbase1 = StatList.breakItemStats[j];
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_DEPLETED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_DEPLETED);
                 } else
-                if(field_27271_e == 1)
+                if(sortingColumn == 1)
                 {
-                    statbase = StatList.craftedItemStats[i];
-                    statbase1 = StatList.craftedItemStats[j];
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_CRAFTED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_CRAFTED);
                 } else
-                if(field_27271_e == 2)
+                if(sortingColumn == 2)
                 {
-                    statbase = StatList.usedItemStats[i];
-                    statbase1 = StatList.usedItemStats[j];
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_USED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_USED);
                 }
-                if(statbase != null || statbase1 != null)
+                if(statbase1 != null || statbase2 != null)
                 {
-                    if(statbase == null)
+                    if(statbase1 == null)
                     {
                         return 1;
                     }
-                    if(statbase1 == null)
+                    if(statbase2 == null)
                     {
                         return -1;
                     }
-                    int k = statsCounter.readStat(statbase);
-                    int l = statsCounter.readStat(statbase1);
+                    int k = statsCounter.readStat(statbase1);
+                    int l = statsCounter.readStat(statbase2);
                     if(k != l)
                     {
-                        return (k - l) * field_27270_f;
+                        return (k - l) * sortingMode;
                     }
                 }
-                return i - j;
+                return id1 - id2;
             };
         }
 
@@ -563,48 +422,48 @@ public class GuiStats extends GuiScreen
         protected void renderHeader(int x, int y, Tessellator tessellator)
         {
             super.renderHeader(x, y, tessellator);
-            if(field_27268_b == 0)
+            if(clickedColumn == 0)
             {
-                func_27136_c(((x + 115) - 18) + 1, y + 1 + 1, 72, 18);
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/depleted"));
             } else
             {
-                func_27136_c((x + 115) - 18, y + 1, 72, 18);
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/depleted"));
             }
-            if(field_27268_b == 1)
+            if(clickedColumn == 1)
             {
-                func_27136_c(((x + 165) - 18) + 1, y + 1 + 1, 18, 18);
+                drawGuiIcon((x + COLUMN1_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/crafted"));
             } else
             {
-                func_27136_c((x + 165) - 18, y + 1, 18, 18);
+                drawGuiIcon((x + COLUMN1_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/crafted"));
             }
-            if(field_27268_b == 2)
+            if(clickedColumn == 2)
             {
-                func_27136_c(((x + 215) - 18) + 1, y + 1 + 1, 36, 18);
+                drawGuiIcon((x + COLUMN2_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/used"));
             } else
             {
-                func_27136_c((x + 215) - 18, y + 1, 36, 18);
+                drawGuiIcon((x + COLUMN2_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/used"));
             }
         }
 
         @Override
         protected void renderItem(int index, int x, int y, int height, Tessellator tessellator)
         {
-            StatItem statcrafting = func_27264_b(index);
-            int i1 = statcrafting.getItemID();
-            func_27138_c(x + 40, y, i1);
-            func_27265_a((StatItem)StatList.breakItemStats[i1], x + 115, y, index % 2 == 0);
-            func_27265_a((StatItem)StatList.craftedItemStats[i1], x + 165, y, index % 2 == 0);
-            func_27265_a(statcrafting, x + 215, y, index % 2 == 0);
+            StatItem statItem = getStat(index);
+            int i1 = statItem.getItemID();
+            renderItemAsIcon(x + 40, y, i1);
+            renderStatValue((StatItem)statItem.getItem().getStat(StatList.STAT_DEPLETED), x + COLUMN0_RIGHT, y, index % 2 == 0);
+            renderStatValue((StatItem)statItem.getItem().getStat(StatList.STAT_CRAFTED), x + COLUMN1_RIGHT, y, index % 2 == 0);
+            renderStatValue(statItem, x + COLUMN2_RIGHT, y, index % 2 == 0);
         }
 
         @Override
-        protected String func_27263_a(int i)
+        protected String getTooltipKey(int column)
         {
-            if(i == 1)
+            if(column == 1)
             {
                 return "stat.crafted";
             }
-            if(i == 2)
+            if(column == 2)
             {
                 return "stat.used";
             } else
@@ -619,72 +478,59 @@ public class GuiStats extends GuiScreen
 
         public BlockStatisticsList()
         {
-            field_27273_c = new ArrayList();
-            Iterator iterator = StatList.statList3.iterator();
-            do
-            {
-                if(!iterator.hasNext())
-                {
-                    break;
-                }
-                StatItem statcrafting = (StatItem)iterator.next();
+            statsList = new ArrayList<>();
+            for (Stat stat : Objects.requireNonNull(Item.getStats(StatList.STAT_MINED))) {
+                StatItem statItem = (StatItem) stat;
                 boolean flag = false;
-                int i = statcrafting.getItemID();
-                if(statsCounter.readStat(statcrafting) > 0)
-                {
+
+                Stat used = statItem.getItem().getStat(StatList.STAT_USED);
+                Stat crafted = statItem.getItem().getStat(StatList.STAT_CRAFTED);
+
+                if (statsCounter.readStat(statItem) > 0) {
                     flag = true;
-                } else
-                if(StatList.usedItemStats[i] != null && statsCounter.readStat(StatList.usedItemStats[i]) > 0)
-                {
+                } else if (used != null && statsCounter.readStat(used) > 0) {
                     flag = true;
-                } else
-                if(StatList.craftedItemStats[i] != null && statsCounter.readStat(StatList.craftedItemStats[i]) > 0)
-                {
+                } else if (crafted != null && statsCounter.readStat(crafted) > 0) {
                     flag = true;
                 }
-                if(flag)
-                {
-                    field_27273_c.add(statcrafting);
+                if (flag) {
+                    statsList.add(statItem);
                 }
-            } while(true);
-            field_27272_d = (si1, si2) -> {
-                int i = si1.getItemID();
-                int j = si2.getItemID();
-                Stat statbase = null;
+            }
+            statsSorter = (stat1, stat2) -> {
+                int id1 = stat1.getItemID();
+                int id2 = stat2.getItemID();
                 Stat statbase1 = null;
-                if(field_27271_e == 2)
-                {
-                    statbase = StatList.mineBlockStatArray[i];
-                    statbase1 = StatList.mineBlockStatArray[j];
-                } else
-                if(field_27271_e == 0)
+                Stat statbase2 = null;
+                if(sortingColumn == 2)
                 {
-                    statbase = StatList.craftedItemStats[i];
-                    statbase1 = StatList.craftedItemStats[j];
-                } else
-                if(field_27271_e == 1)
-                {
-                    statbase = StatList.usedItemStats[i];
-                    statbase1 = StatList.usedItemStats[j];
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_MINED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_MINED);
+                } else if(sortingColumn == 0) {
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_CRAFTED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_CRAFTED);
+                } else if(sortingColumn == 1) {
+                    statbase1 = stat1.getItem().getStat(StatList.STAT_USED);
+                    statbase2 = stat2.getItem().getStat(StatList.STAT_USED);
                 }
-                if(statbase != null || statbase1 != null)
+                if(statbase1 != null || statbase2 != null)
                 {
-                    if(statbase == null)
+                    if(statbase1 == null)
                     {
                         return 1;
                     }
-                    if(statbase1 == null)
+                    if(statbase2 == null)
                     {
                         return -1;
                     }
-                    int k = statsCounter.readStat(statbase);
-                    int l = statsCounter.readStat(statbase1);
+                    int k = statsCounter.readStat(statbase1);
+                    int l = statsCounter.readStat(statbase2);
                     if(k != l)
                     {
-                        return (k - l) * field_27270_f;
+                        return (k - l) * sortingMode;
                     }
                 }
-                return i - j;
+                return id1 - id2;
 
             };
         }
@@ -693,48 +539,48 @@ public class GuiStats extends GuiScreen
         protected void renderHeader(int x, int y, Tessellator tessellator)
         {
             super.renderHeader(x, y, tessellator);
-            if(field_27268_b == 0)
+            if(clickedColumn == 0)
             {
-                func_27136_c(((x + 115) - 18) + 1, y + 1 + 1, 18, 18);
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/crafted"));
             } else
             {
-                func_27136_c((x + 115) - 18, y + 1, 18, 18);
+                drawGuiIcon((x + COLUMN0_RIGHT) - STATS_ICON_SIZE, y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/crafted"));
             }
-            if(field_27268_b == 1)
+            if(clickedColumn == 1)
             {
-                func_27136_c(((x + 165) - 18) + 1, y + 1 + 1, 36, 18);
+                drawGuiIcon(((x + COLUMN1_RIGHT) - STATS_ICON_SIZE) + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/used"));
             } else
             {
-                func_27136_c((x + 165) - 18, y + 1, 36, 18);
+                drawGuiIcon(((x + COLUMN1_RIGHT) - STATS_ICON_SIZE), y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/used"));
             }
-            if(field_27268_b == 2)
+            if(clickedColumn == 2)
             {
-                func_27136_c(((x + 215) - 18) + 1, y + 1 + 1, 54, 18);
+                drawGuiIcon(((x + COLUMN2_RIGHT) - STATS_ICON_SIZE) + 1, y + 2, 18, 18, TextureRegistry.getTexture("minecraft:gui/mined"));
             } else
             {
-                func_27136_c((x + 215) - 18, y + 1, 54, 18);
+                drawGuiIcon(((x + COLUMN2_RIGHT) - STATS_ICON_SIZE), y + 1, 18, 18, TextureRegistry.getTexture("minecraft:gui/mined"));
             }
         }
 
         @Override
         protected void renderItem(int index, int x, int y, int height, Tessellator tessellator)
         {
-            StatItem statcrafting = func_27264_b(index);
-            int i1 = statcrafting.getItemID();
-            func_27138_c(x + 40, y, i1);
-            func_27265_a((StatItem)StatList.craftedItemStats[i1], x + 115, y, index % 2 == 0);
-            func_27265_a((StatItem)StatList.usedItemStats[i1], x + 165, y, index % 2 == 0);
-            func_27265_a(statcrafting, x + 215, y, index % 2 == 0);
+            StatItem statItem = getStat(index);
+            int id = statItem.getItem().id;
+            renderItemAsIcon(x + 40, y, id);
+            renderStatValue((StatItem) statItem.getItem().getStat(StatList.STAT_CRAFTED), x + COLUMN0_RIGHT, y, index % 2 == 0);
+            renderStatValue((StatItem) statItem.getItem().getStat(StatList.STAT_USED), x + COLUMN1_RIGHT, y, index % 2 == 0);
+            renderStatValue(statItem, x + COLUMN2_RIGHT, y, index % 2 == 0);
         }
 
         @Override
-        protected String func_27263_a(int i)
+        protected String getTooltipKey(int column)
         {
-            if(i == 0)
+            if(column == 0)
             {
                 return "stat.crafted";
             }
-            if(i == 1)
+            if(column == 1)
             {
                 return "stat.used";
             } else
diff --git a/src/main/java/net/minecraft/client/gui/GuiSwitchButton.java b/src/main/java/net/minecraft/client/gui/GuiSwitchButton.java
index bb5fcce88..3400102ce 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSwitchButton.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSwitchButton.java
@@ -2,7 +2,7 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
-import net.minecraft.core.lang.I18n;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import org.lwjgl.opengl.GL11;
 
 public class GuiSwitchButton
@@ -56,16 +56,26 @@ public class GuiSwitchButton
         int state = getButtonState(mouseOver);
         int xBar = on ? (width / 3) + 1 : 0;
 
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
+        IconCoordinate tex;
+        switch (state) {
+            case STATE_DISABLED:
+                tex = disabledTexture;
+                break;
+            case STATE_HOVERED:
+                tex = hoveredTexture;
+                break;
+            case STATE_DEFAULT:
+            default:
+                tex = defaultTexture;
+        }
+
         // Draw background
-        drawTexturedModalRect(xPosition, yPosition, 0, 46, width / 2, height);
-        drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46, width / 2, height);
+        drawGuiIcon(xPosition, yPosition, width, height, disabledTexture);
 
         // Draw foreground
-        drawTexturedModalRect(xPosition + xBar, yPosition, 0, 46 + state * 20, width / 3, height);
-        drawTexturedModalRect(xPosition + width / 3 + xBar, yPosition, 200 - width / 3, 46 + state * 20, width / 3, height);
+        drawGuiIcon(xPosition + xBar, yPosition, (width * 2)/3, height, tex);
 
         mouseDragged(mc, mouseX, mouseY);
 
diff --git a/src/main/java/net/minecraft/client/gui/GuiTextureViewer.java b/src/main/java/net/minecraft/client/gui/GuiTextureViewer.java
new file mode 100644
index 000000000..f416f7538
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/GuiTextureViewer.java
@@ -0,0 +1,234 @@
+package net.minecraft.client.gui;
+
+import net.minecraft.client.GLAllocation;
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
+import net.minecraft.client.gui.modelviewer.elements.IListenerElement;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.Texture;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.util.helper.Textures;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.Utils;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.lwjgl.opengl.GL11.GL_BLEND;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_HEIGHT;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_WIDTH;
+import static org.lwjgl.opengl.GL11.glGetTexLevelParameteri;
+
+public class GuiTextureViewer extends GuiScreen{
+    private static final int TOP_SPACING = 24;
+    private static final int BUTTON_SPACING = 4;
+
+    protected int top;
+    protected int bottom;
+
+    protected GuiListenerButton leftTexCycle;
+
+    protected int texIndex = 0;
+
+    protected boolean drawCheckers = true;
+    protected boolean flip = false;
+    protected boolean drawText = true;
+
+    public GuiTextureViewer(GuiScreen parent) {
+        super(parent);
+    }
+
+    @Override
+    public void keyTyped(char c, int key, int mouseX, int mouseY)
+    {
+        if (key == Keyboard.KEY_LEFT) {
+            cycleTexture(-1);
+        } else if (key == Keyboard.KEY_RIGHT) {
+            cycleTexture(1);
+        } else if (key == Keyboard.KEY_ESCAPE) {
+            mc.displayGuiScreen(parentScreen);
+        }
+        List<GuiButton> _buttons = new ArrayList<>(controlList);
+        for (GuiButton button : _buttons){
+            if (button instanceof IListenerElement && button.isHovered(mouseX, mouseY)){
+                ((IListenerElement<?>) button).onKeyTyped(c, key);
+            }
+        }
+    }
+    @Override
+    public void tick(){
+        List<GuiButton> _buttons = new ArrayList<>(controlList);
+        for (GuiButton button : _buttons){
+            if (button instanceof GuiListenerButton){
+                ((GuiListenerButton) button).tick();
+            }
+        }
+    }
+    public void init()
+    {
+
+        top = TOP_SPACING;
+        bottom = height - (BUTTON_SPACING + 20 + BUTTON_SPACING);
+        add(new GuiListenerButton(0, width/2 - 100, height - (BUTTON_SPACING + 20), 200, 20, I18n.getInstance().translateKey("gui.options.button.done")).setActionListener(() -> {
+            onClosed();
+            mc.displayGuiScreen(null);
+        }));
+
+        leftTexCycle = add(new GuiListenerButton(1, width - (20 + BUTTON_SPACING) * 2, bottom - (BUTTON_SPACING + 20), 20, 20, "<")
+            .setActionListener(() -> cycleTexture(-1)));
+        add(new GuiListenerButton(2, width - (20 + BUTTON_SPACING) * 1, bottom - (BUTTON_SPACING + 20), 20, 20, ">")
+            .setActionListener(() -> cycleTexture(1)));
+
+        add(new GuiListenerButton(11, BUTTON_SPACING, bottom - BUTTON_SPACING - 20, 20, 20, "V")
+            .setActionListener(() -> drawCheckers = !drawCheckers)
+        );
+        add(new GuiListenerButton(11, 20 + BUTTON_SPACING * 2, bottom - BUTTON_SPACING - 20, 20, 20, "F")
+            .setActionListener(() -> flip = !flip)
+        );
+        add(new GuiListenerButton(12, 40 + BUTTON_SPACING * 3, bottom - BUTTON_SPACING - 20, 20, 20, "D")
+            .setActionListener(() -> {
+                Textures.dumpTextures();
+                Utils.openDirectory(new File("dumpTextures"));
+            })
+        );
+        add(new GuiListenerButton(13, 60 + BUTTON_SPACING * 4, bottom - BUTTON_SPACING - 20, 20, 20, "T")
+            .setActionListener(() -> drawText = !drawText)
+        );
+    }
+
+    protected void buttonPressed(GuiButton button)
+    {
+    }
+
+    protected void buttonReleased(GuiButton button)
+    {
+    }
+
+    protected void cycleTexture(int offset) {
+        List<Integer> textureList = GLAllocation.textureNames;
+        texIndex += offset;
+        if (texIndex < 0) {
+            texIndex += textureList.size();
+        }
+        texIndex = texIndex % textureList.size();
+    }
+
+    public void drawScreen(int mouseX, int mouseY, float partialTick) {
+        drawDefaultBackground();
+
+        fontRenderer.drawCenteredString(I18n.getInstance().translateKey("gui.texture_viewer.label.title"), width/2, 5, 0xFFFFFF);
+
+        List<Integer> textureList = GLAllocation.textureNames;
+        int id = texIndex % textureList.size();
+        GL11.glBindTexture(GL_TEXTURE_2D, textureList.get(id));
+
+        Texture t = mc.renderEngine.idToTextureMap.get(textureList.get(id));
+
+
+        GL11.glEnable(GL_BLEND);
+        GL11.glEnable(GL11.GL_DEPTH_TEST);
+
+        int texWidth = glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH);
+        int texHeight = glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT);
+        double ratio = (double) texWidth / texHeight;
+
+        double imgHeight = (bottom - top - 40d);
+        double imgWidth = imgHeight * ratio;
+
+        if (imgWidth > width * 0.75) {
+            imgWidth = width * 0.75f;
+            imgHeight = imgWidth/ratio;
+        }
+
+        double x = (width - imgWidth)/2;
+        double y = (height - imgHeight)/2;
+
+        Tessellator tessellator = Tessellator.instance;
+
+        if (drawCheckers) {
+            mc.renderEngine.bindTexture(mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/designer_bg.png"));
+            tessellator.startDrawingQuads();
+            tessellator.addVertexWithUV(x + 0,         y + imgHeight,   zLevel, 0,          imgHeight/2);
+            tessellator.addVertexWithUV(x + imgWidth,  y + imgHeight,   zLevel, imgWidth/2, imgHeight/2);
+            tessellator.addVertexWithUV(x + imgWidth,  y + 0,           zLevel, imgWidth/2, 0);
+            tessellator.addVertexWithUV(x + 0,         y + 0,           zLevel, 0,          0);
+            tessellator.draw();
+        }
+
+        GL11.glBindTexture(GL_TEXTURE_2D, textureList.get(id));
+        tessellator.startDrawingQuads();
+        if (flip) {
+            tessellator.addVertexWithUV(x + 0,          y + imgHeight,  zLevel, 0, 0);
+            tessellator.addVertexWithUV(x + imgWidth,   y + imgHeight,  zLevel, 1, 0);
+            tessellator.addVertexWithUV(x + imgWidth,   y + 0,          zLevel, 1, 1);
+            tessellator.addVertexWithUV(x + 0,          y + 0,          zLevel, 0, 1);
+        } else {
+            tessellator.addVertexWithUV(x + 0,          y + imgHeight,  zLevel, 0, 1);
+            tessellator.addVertexWithUV(x + imgWidth,   y + imgHeight,  zLevel, 1, 1);
+            tessellator.addVertexWithUV(x + imgWidth,   y + 0,          zLevel, 1, 0);
+            tessellator.addVertexWithUV(x + 0,          y + 0,          zLevel, 0, 0);
+        }
+
+        tessellator.draw();
+
+//        int bw = (int) (250 + 100 * Math.sin(System.currentTimeMillis()/1000d));
+//        int bh = (int) (60 + 30 *  Math.cos(System.currentTimeMillis()/1000d));
+
+//        bw = 500;
+//        bh = 60;
+
+//        drawGuiIcon((width - bw)/2, (height - bh)/2, bw, bh, TextureRegistry.getTexture("minecraft:gui/widgets/button"));
+
+        super.drawScreen(mouseX, mouseY, partialTick);
+
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+
+        if (drawText) {
+            fontRenderer.drawString("Tex ID: " + id , 1, top + 1, 0xFFFFFF, true);
+            fontRenderer.drawString("Tex Width: " + texWidth, 1, top + 11, 0xFFFFFF, true);
+            fontRenderer.drawString("Tex Height: " + texHeight, 1, top + 21, 0xFFFFFF, true);
+
+            String s;
+            if (t == null) {
+                s = "None";
+            } else {
+                s = t.toString();
+            }
+            String[] lines = s.split("\n");
+            int yOff = top + 31;
+            for (String line : lines) {
+                fontRenderer.drawString(line, 1, yOff, 0xFFFFFF, true);
+                yOff += 10;
+            }
+        }
+    }
+    @Override
+    public void drawDefaultBackground() {
+        super.drawDefaultBackground();
+
+        if (mc.theWorld == null)
+        {
+            Tessellator tessellator = Tessellator.instance;
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+            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,              bottom / scale);
+            tessellator.addVertexWithUV(width,  bottom, 0.0D,   width / scale,  bottom / scale);
+            tessellator.addVertexWithUV(width,  top,    0.0D,   width / scale,  top / scale);
+            tessellator.addVertexWithUV(0,      top,    0.0D,   0,              top / scale);
+
+            tessellator.draw();
+        }
+        else
+        {
+            drawRect(0, 0, width, top, 0x5F000000);
+            drawRect(0, bottom, width, height, 0x5F000000);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/GuiTexturedButton.java b/src/main/java/net/minecraft/client/gui/GuiTexturedButton.java
index c2b7acbb0..e7f2e164f 100644
--- a/src/main/java/net/minecraft/client/gui/GuiTexturedButton.java
+++ b/src/main/java/net/minecraft/client/gui/GuiTexturedButton.java
@@ -20,7 +20,7 @@ public class GuiTexturedButton extends GuiButton {
         if (!visible) {
             return;
         }
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture(texturePath));
+        mc.renderEngine.loadTexture(texturePath).bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         boolean isHovered = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
         if (!enabled)
diff --git a/src/main/java/net/minecraft/client/gui/GuiTooltip.java b/src/main/java/net/minecraft/client/gui/GuiTooltip.java
index d3b64d572..c9a42285b 100644
--- a/src/main/java/net/minecraft/client/gui/GuiTooltip.java
+++ b/src/main/java/net/minecraft/client/gui/GuiTooltip.java
@@ -9,10 +9,10 @@ import net.minecraft.client.option.enums.TooltipStyle;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
@@ -28,53 +28,78 @@ public class GuiTooltip extends Gui
         this.mc = mc;
         this.fr = mc.fontRenderer;
     }
+    public static final int BASE_PADDING = 3;
+    public static final int LINE_SPACING = 3;
 
     public void render(String string, int x, int y, int offsetX, int offsetY)
     {
         String[] lines = string.split("\n");
         if(lines.length == 0) return;
 
-        int lineSpacing = 3;
-        int padding = 3;
-
         int width = 0;
         for (String line : lines)
         {
             width = Math.max(width, fr.getStringWidth(line));
         }
 
-        int height = lines.length * 8 + (lines.length - 1) * lineSpacing;
+        int height = lines.length * 8 + (lines.length - 1) * LINE_SPACING;
 
         // Flip tooltip X if it goes offscreen to the right
-        if(x + offsetX + width + padding * 2 > mc.resolution.scaledWidth)
+        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.scaledWidth)
         {
             offsetX = -offsetX - width;
         }
 
         // Move tooltip up when it goes offscreen to the bottom
-        offsetY -= Math.max(0, y + height + offsetY + padding * 2 - mc.resolution.scaledHeight);
+        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.scaledHeight);
+
 
         x += offsetX;
         y += offsetY;
 
+        int padding = getPadding();
+
+        drawBackground(x, y, x + width + padding * 2, y + height + padding * 2);
+
+
+        for(int i = 0; i < lines.length; i++)
+        {
+            fr.drawStringWithShadow(lines[i], x + padding, y + padding + i * (8 + LINE_SPACING), 0xFFFFFF);
+        }
+    }
+    public int getPadding(){
         int paddingExtra = 0;
         if (mc.gameSettings.tooltipStyle.value != TooltipStyle.DEFAULT)
         {
             paddingExtra = 1;
         }
-
-        drawBackground(x, y, x + width + padding * 2 + paddingExtra * 2, y + height + padding * 2 + paddingExtra * 2);
-        for(int i = 0; i < lines.length; i++)
+        return BASE_PADDING + paddingExtra;
+    }
+    public int[] drawBackground(int x, int y, int offsetX, int offsetY, int width, int height){
+        int targetOffset = 0;
+        // Flip tooltip X if it goes offscreen to the right
+        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.scaledWidth)
         {
-            fr.drawStringWithShadow(lines[i], x + padding + paddingExtra, y + padding + i * (8 + lineSpacing) + paddingExtra, 0xFFFFFF);
+            int _offsetX = offsetX;
+            offsetX = -offsetX - width;
+            targetOffset = offsetX - _offsetX;
         }
+
+        // Move tooltip up when it goes offscreen to the bottom
+        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.scaledHeight);
+
+        x += offsetX;
+        y += offsetY;
+
+        int padding = getPadding();
+
+        return drawBackground(x, y, x + width + padding * 2, y + height + padding * 2);
     }
 
-    private void drawBackground(int minX, int minY, int maxX, int maxY)
+    private int[] drawBackground(int minX, int minY, int maxX, int maxY)
     {
         if(mc.gameSettings.tooltipStyle.value == TooltipStyle.MODERN) {
-        	drawBackgroundModern(minX, minY, maxX, maxY);
-        	return;
+        	return drawBackgroundModern(minX, minY, maxX, maxY);
         }
         
         int topLeftCornerX = minX;
@@ -92,7 +117,7 @@ public class GuiTooltip extends Gui
 
         Tessellator tl = Tessellator.instance;
 
-        mc.renderEngine.bindTexture(mc.renderEngine.getTexture(mc.gameSettings.tooltipStyle.value.getFilePath()));
+        mc.renderEngine.bindTexture(mc.renderEngine.loadTexture(mc.gameSettings.tooltipStyle.value.getFilePath()));
 
         GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
@@ -162,9 +187,10 @@ public class GuiTooltip extends Gui
         tl.draw();
 
         GL11.glDisable(GL11.GL_BLEND);
+        return new int[]{topLeftCornerX, topLeftCornerY};
     }
     
-    private void drawBackgroundModern(int minX, int minY, int maxX, int maxY) {
+    private int[] drawBackgroundModern(int minX, int minY, int maxX, int maxY) {
     	int x = minX + 4;
     	int y = minY + 4;
     	int width = maxX - minX - 8;
@@ -184,6 +210,7 @@ public class GuiTooltip extends Gui
 		drawGradientRect(x + width + 2, (y - 3) + 1, x + width + 3, (y + height + 3) - 1, lineColorTop, lineColorBottom);
 		drawGradientRect(x - 3, y - 3, x + width + 3, (y - 3) + 1, lineColorTop, lineColorTop);
 		drawGradientRect(x - 3, y + height + 2, x + width + 3, y + height + 3, lineColorBottom, lineColorBottom);
+        return new int[]{x - 3, y - 4};
     }
 
 	public String getTooltipText(ItemStack itemStack, boolean showDescription, Slot slot) {
@@ -197,7 +224,7 @@ public class GuiTooltip extends Gui
 		if(slot != null) {
 			discovered = slot.getIsDiscovered(mc.thePlayer);
 
-			if(slot instanceof SlotCrafting) {
+			if(slot instanceof ResultSlot) {
 				ctrlPressed = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
 				shiftPressed = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
 
@@ -219,13 +246,13 @@ public class GuiTooltip extends Gui
                 text.append(" #").append(itemStack.itemID).append(":").append(itemStack.getMetadata());
             }
 
-            if(slot instanceof SlotGuidebook){
-                if(((SlotGuidebook) slot).recipe != null) {
-                    if (((SlotGuidebook) slot).recipe instanceof RecipeEntryTrommel) {
-                        RecipeSymbol input = (RecipeSymbol) ((SlotGuidebook) slot).recipe.getInput();
-                        if(!input.matches(slot.getStack())){
-                            WeightedRandomBag<?> bag = (WeightedRandomBag<?>) ((SlotGuidebook) slot).recipe.getOutput();
-                            double percent = bag.getAsPercentage(slot.getStack());
+            if(slot instanceof GuidebookSlot){
+                if(((GuidebookSlot) slot).recipe != null) {
+                    if (((GuidebookSlot) slot).recipe instanceof RecipeEntryTrommel) {
+                        RecipeSymbol input = (RecipeSymbol) ((GuidebookSlot) slot).recipe.getInput();
+                        if(!input.matches(slot.getItem())){
+                            WeightedRandomBag<?> bag = (WeightedRandomBag<?>) ((GuidebookSlot) slot).recipe.getOutput();
+                            double percent = bag.getAsPercentage(slot.getItem());
                             text.append('\n').append(TextFormatting.LIGHT_GRAY).append(String.format("%.2f", percent)).append("%");
                         }
                     }
@@ -239,13 +266,13 @@ public class GuiTooltip extends Gui
 					text.append('\n').append(TextFormatting.LIGHT_GRAY).append("NBT: ").append(data.getValue().size()).append(" Tags");
 				}
 
-                if(slot instanceof SlotGuidebook){
-                    if(((SlotGuidebook) slot).recipe != null){
-                        text.append('\n').append(TextFormatting.GRAY).append(((SlotGuidebook) slot).recipe.toString());
+                if(slot instanceof GuidebookSlot){
+                    if(((GuidebookSlot) slot).recipe != null){
+                        text.append('\n').append(TextFormatting.GRAY).append(((GuidebookSlot) slot).recipe.toString());
                     }
-                    if(((SlotGuidebook) slot).symbol != null){
-                        if(((SlotGuidebook) slot).symbol.getItemGroup() != null){
-                            text.append('\n').append(TextFormatting.GRAY).append("Accepts any: ").append(((SlotGuidebook) slot).symbol.getItemGroup());
+                    if(((GuidebookSlot) slot).symbol != null){
+                        if(((GuidebookSlot) slot).symbol.getItemGroup() != null){
+                            text.append('\n').append(TextFormatting.GRAY).append("Accepts any: ").append(((GuidebookSlot) slot).symbol.getItemGroup());
                         }
                     }
                 }
@@ -262,7 +289,7 @@ public class GuiTooltip extends Gui
 				text.append('\n').append(formatDescription(itemStack.getItemDescription(), 16));
 			}
 
-			if(slot instanceof SlotCrafting) {
+			if(slot instanceof ResultSlot) {
 				if(shiftPressed && !ctrlPressed) {
 					text.append('\n').append(TextFormatting.LIGHT_GRAY).append("Craft Stack");
 				}
diff --git a/src/main/java/net/minecraft/client/gui/GuiTrommel.java b/src/main/java/net/minecraft/client/gui/GuiTrommel.java
index 793d0f229..76e24e647 100644
--- a/src/main/java/net/minecraft/client/gui/GuiTrommel.java
+++ b/src/main/java/net/minecraft/client/gui/GuiTrommel.java
@@ -1,21 +1,21 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.core.block.entity.TrommelBlockEntity;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.player.inventory.ContainerTrommel;
-import net.minecraft.core.player.inventory.InventoryPlayer;
-import net.minecraft.core.block.entity.TileEntityTrommel;
+import net.minecraft.core.player.inventory.menu.TrommelMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            GuiContainer, ContainerFurnace, FontRenderer, RenderEngine,
-//            TileEntityFurnace, InventoryPlayer
+//            FurnaceBlockEntity, InventoryPlayer
 
 public class GuiTrommel extends GuiContainer
 {
 
-    public GuiTrommel(InventoryPlayer inventoryplayer, TileEntityTrommel tileentitytrommel)
+    public GuiTrommel(Inventory inventoryplayer, TrommelBlockEntity tileentitytrommel)
     {
-        super(new ContainerTrommel(inventoryplayer, tileentitytrommel));
+        super(new TrommelMenu(inventoryplayer, tileentitytrommel));
         ySize = 192;
         trommelInventory = tileentitytrommel;
     }
@@ -30,9 +30,8 @@ public class GuiTrommel extends GuiContainer
     @Override
 	protected void drawGuiContainerBackgroundLayer(float f)
     {
-        int guiTexture = mc.renderEngine.getTexture("/assets/minecraft/textures/gui/trommel.png");
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        mc.renderEngine.bindTexture(guiTexture);
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/trommel.png").bind();
         int j = (width - xSize) / 2;
         int k = (height - ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
@@ -49,5 +48,5 @@ public class GuiTrommel extends GuiContainer
 
     }
 
-    private TileEntityTrommel trommelInventory;
+    private TrommelBlockEntity trommelInventory;
 }
diff --git a/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java b/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java
index 93585cd1a..e6dd56191 100644
--- a/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java
+++ b/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java
@@ -4,9 +4,9 @@ import net.minecraft.client.gui.popup.GuiPopup;
 import net.minecraft.client.gui.popup.PopupBuilder;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.packet.Packet250CustomPayload;
+import net.minecraft.core.net.packet.CustomPayloadPacket;
 
 import java.lang.reflect.Modifier;
 import java.nio.charset.StandardCharsets;
@@ -29,7 +29,7 @@ public class GuiWandPickerMonster extends GuiScreen {
     public void init() {
         List<String> monsters = new ArrayList<>();
         for (Class<? extends Entity> clazz : EntityDispatcher.classToKeyMap.keySet()) {
-            if (EntityLiving.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
+            if (Mob.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
                 monsters.add(EntityDispatcher.classToKeyMap.get(clazz));
             }
         }
@@ -57,7 +57,7 @@ public class GuiWandPickerMonster extends GuiScreen {
                         if (!mc.theWorld.isClientSide) {
                             wand.getData().putString("monster", mobId);
                         } else {
-                            mc.getSendQueue().addToSendQueue(new Packet250CustomPayload("BTA|WandMonster", mobId.getBytes(StandardCharsets.UTF_8)));
+                            mc.getSendQueue().addToSendQueue(new CustomPayloadPacket("BTA|WandMonster", mobId.getBytes(StandardCharsets.UTF_8)));
                         }
                     }
                     shouldClose = true;
diff --git a/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java b/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
index 8312f28ec..ca81ae218 100644
--- a/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
+++ b/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
@@ -153,10 +153,10 @@ public abstract class ScrolledSelectionList {
             yDrag = -1F;
         }
         capYPosition();
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glDisable(2912 /*GL_FOG*/);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_FOG);
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, minecraft.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+        minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         float f1 = 32F;
         tessellator.startDrawingQuads();
@@ -181,7 +181,7 @@ public abstract class ScrolledSelectionList {
                 int minX = width / 2 - 110;
                 int maxX = width / 2 + 110;
                 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-                GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
+                GL11.glDisable(GL11.GL_TEXTURE_2D);
                 tessellator.startDrawingQuads();
                 tessellator.setColorOpaque_I(0x808080);
                 tessellator.addVertexWithUV(minX, iy + height + 2, 0.0D, 0.0D, 1.0D);
@@ -194,20 +194,20 @@ public abstract class ScrolledSelectionList {
                 tessellator.addVertexWithUV(maxX - 1, iy - 1, 0.0D, 1.0D, 0.0D);
                 tessellator.addVertexWithUV(minX + 1, iy - 1, 0.0D, 0.0D, 0.0D);
                 tessellator.draw();
-                GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
+                GL11.glEnable(GL11.GL_TEXTURE_2D);
             }
             renderItem(itemIndex, ix, iy, height, tessellator);
         }
 
-        GL11.glDisable(2929 /*GL_DEPTH_TEST*/);
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
         byte byte0 = 4;
         renderHoleBackground(0, y0, 255, 255);
         renderHoleBackground(y1, height, 255, 255);
-        GL11.glEnable(3042 /*GL_BLEND*/);
+        GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
-        GL11.glShadeModel(7425 /*GL_SMOOTH*/);
-        GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glDisable(GL11.GL_ALPHA_TEST);
+        GL11.glShadeModel(GL11.GL_SMOOTH);
+        GL11.glDisable(GL11.GL_TEXTURE_2D);
         tessellator.startDrawingQuads();
         tessellator.setColorRGBA_I(0, 0);
         tessellator.addVertexWithUV(x0, y0 + byte0, 0.0D, 0.0D, 1.0D);
@@ -259,16 +259,16 @@ public abstract class ScrolledSelectionList {
             tessellator.addVertexWithUV(l, l4, 0.0D, 0.0D, 0.0D);
             tessellator.draw();
         }
-        renderDecorations(ix, y);
-        GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
-        GL11.glShadeModel(7424 /*GL_FLAT*/);
-        GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
-        GL11.glDisable(3042 /*GL_BLEND*/);
+        renderDecorations(x, y);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        GL11.glShadeModel(GL11.GL_FLAT);
+        GL11.glEnable(GL11.GL_ALPHA_TEST);
+        GL11.glDisable(GL11.GL_BLEND);
     }
 
     private void renderHoleBackground(int y0, int y1, int a0, int a1) {
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, minecraft.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+        minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         float f = 32F;
         tessellator.startDrawingQuads();
diff --git a/src/main/java/net/minecraft/client/gui/achievements/GuiAchievements.java b/src/main/java/net/minecraft/client/gui/achievements/GuiAchievements.java
new file mode 100644
index 000000000..4ddc835e7
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/GuiAchievements.java
@@ -0,0 +1,1015 @@
+package net.minecraft.client.gui.achievements;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiRenderItem;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.GuiTooltip;
+import net.minecraft.client.gui.achievements.data.AchievementPage;
+import net.minecraft.client.gui.achievements.data.AchievementPageRegistry;
+import net.minecraft.client.gui.achievements.data.AchievementPages;
+import net.minecraft.client.gui.options.GuiOptionsButton;
+import net.minecraft.client.render.Lighting;
+import net.minecraft.client.render.Scissor;
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.achievement.stat.StatsCounter;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import java.util.Objects;
+import java.util.Random;
+
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
+import static org.lwjgl.opengl.GL11.glDisable;
+import static org.lwjgl.opengl.GL11.glEnable;
+
+public class GuiAchievements 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 static final int ACHIEVEMENT_CELL_WIDTH = 24;
+    private static final int ACHIEVEMENT_CELL_HEIGHT = 24;
+
+    private static final int ACHIEVEMENT_ICON_WIDTH = 26;
+    private static final int ACHIEVEMENT_ICON_HEIGHT = 26;
+
+    private static final int TOOLTIP_BOX_WIDTH_MIN = 120;
+    private static final int TOOLTIP_OFF_X = 8;
+    private static final int TOOLTIP_OFF_Y = -4;
+
+    protected int mouseXOld;
+    protected int mouseYOld;
+    protected double oldShiftX;
+    protected double oldShiftY;
+    protected double targetShiftX;
+    protected double targetShiftY;
+    protected double currentShiftX;
+    protected double currentShiftY;
+    private boolean draggingViewport;
+    private final StatsCounter statsCounter;
+    private final GuiTooltip tooltip;
+    private GuiRenderItem renderItem = null;
+    GuiScreen parent;
+
+    private int top;
+    private int bottom;
+
+    private int viewportLeft;
+    private int viewportTop;
+    private int viewportRight;
+    private int viewportBottom;
+    private int viewportWidth;
+    private int viewportHeight;
+
+    private double viewportZoom = 1;
+
+    private double shiftMinX;
+    private double shiftMinY;
+    private double shiftMaxX;
+    private double shiftMaxY;
+
+    private int pageListLeft;
+    private int pageListRight;
+
+    private float pageListScrollAmount = 0.0f;
+    private Float oldPagesListScrollAmount;
+    private int pagesListScrollRegionHeight;
+
+    private Integer clickX, clickY;
+
+    private AchievementPage hoveredPage = null;
+    private Achievement hoveredAchievement = null;
+
+    private AchievementPage currentPage = AchievementPages.overworldPage;
+
+    private @NotNull BGLayer[] layers;
+
+    public GuiAchievements(GuiScreen parent, StatsCounter statsCounter)
+    {
+        mouseXOld = 0;
+        mouseYOld = 0;
+        draggingViewport = false;
+        this.statsCounter = statsCounter;
+
+        this.parent = parent;
+        this.mc = Minecraft.getMinecraft(this);
+        this.tooltip = new GuiTooltip(mc);
+        this.renderItem = new GuiRenderItem(mc);
+
+        layers = new BGLayer[currentPage.backgroundLayers()];
+        for (int i = 0; i < layers.length; i++) {
+            layers[i] = new BGLayer(i);
+        }
+    }
+
+    @Override
+	public void init()
+    {
+        controlList.clear();
+        controlList.add(new GuiOptionsButton(1, width / 2 - 100, height - 20 - BUTTON_SPACING, 200, 20, I18n.getInstance().translateKey("gui.achievements.button.done")));
+
+        lastTileX = Integer.MIN_VALUE;
+        lastTileY = Integer.MIN_VALUE;
+
+        top = TOP_SPACING;
+        bottom = height - (BUTTON_SPACING + 20 + BUTTON_SPACING);
+
+        pagesListScrollRegionHeight = bottom - top;
+        pageListLeft = 0;
+        pageListRight = width/4;
+
+        viewportZoom = 1;
+
+        viewportLeft = drawSidebar() ? pageListRight + SEPARATOR_WIDTH : 0;
+        viewportTop = top;
+        viewportBottom = bottom;
+        viewportRight = width;
+
+        viewportWidth = viewportRight - viewportLeft;
+        viewportHeight = viewportBottom - viewportTop;
+
+        int achMinX = Integer.MAX_VALUE;
+        int achMinY = Integer.MAX_VALUE;
+        int achMaxX = Integer.MIN_VALUE;
+        int achMaxY = Integer.MIN_VALUE;
+
+        for (Achievement ach : currentPage.getAchievements()){
+            if (ach.x < achMinX){
+                achMinX = ach.x;
+            }
+            if (ach.y < achMinY){
+                achMinY = ach.y;
+            }
+            if (ach.x > achMaxX){
+                achMaxX = ach.x;
+            }
+            if (ach.y > achMaxY){
+                achMaxY = ach.y;
+            }
+        }
+
+        shiftMinX = achMinX * ACHIEVEMENT_CELL_WIDTH ;
+        shiftMinY = achMinY * ACHIEVEMENT_CELL_HEIGHT;
+        shiftMaxX = achMaxX * ACHIEVEMENT_CELL_WIDTH  + ACHIEVEMENT_CELL_WIDTH;
+        shiftMaxY = achMaxY * ACHIEVEMENT_CELL_HEIGHT + ACHIEVEMENT_CELL_HEIGHT;
+
+        shiftMinX -= (int) (viewportWidth /4d);
+        shiftMinY -= (int) (viewportHeight/4d);
+        shiftMaxX += (int) (viewportWidth /4d);
+        shiftMaxY += (int) (viewportHeight/4d);
+
+        // Centers the screen on the Open Inventory achievement
+        Achievement ach = currentPage.onOpenAchievement();
+        oldShiftX = targetShiftX = currentShiftX = ach.x * ACHIEVEMENT_CELL_WIDTH + ACHIEVEMENT_CELL_WIDTH/2d;
+        oldShiftY = targetShiftY = currentShiftY = ach.y * ACHIEVEMENT_CELL_HEIGHT + ACHIEVEMENT_CELL_HEIGHT/2d;
+    }
+
+    @Override
+	protected void buttonPressed(GuiButton button) {
+        if(button.id == 1) {
+            mc.displayGuiScreen(parent);
+            //mc.setIngameFocus();
+        }
+        super.buttonPressed(button);
+    }
+
+    @Override
+	public void keyTyped(char c, int key, int mouseX, int mouseY)
+    {
+        if (key == Keyboard.KEY_ESCAPE) {
+            mc.displayGuiScreen(parent);
+        } else {
+            super.keyTyped(c, key, mouseX, mouseY);
+        }
+    }
+    @Override
+    public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
+        if (drawSidebar() && mouseX >= pageListLeft && mouseX <= (pageListRight - 6) && mouseY >= top && mouseY <= bottom) {
+            int pagesListHeight = getTotalPagesListHeight();
+            int pagesListY = top - (int) pageListScrollAmount;
+            if (pagesListHeight < bottom - top) {
+                pagesListY = top + (bottom - top - pagesListHeight) / 2;
+            }
+            for(AchievementPage page : AchievementPageRegistry.getInstance().getPages()) {
+                if (mouseX >= pageListLeft && mouseX <= (pageListRight - 6) && mouseY >= pagesListY && mouseY <= pagesListY + PAGE_BUTTON_HEIGHT) {
+                    currentPage = page;
+                    mc.sndManager.playSound("random.click", SoundCategory.GUI_SOUNDS, 1.0F, 1.0F);
+
+                    layers = new BGLayer[currentPage.backgroundLayers()];
+                    for (int i = 0; i < layers.length; i++) {
+                        layers[i] = new BGLayer(i);
+                    }
+
+                    init();
+                    break;
+                }
+                pagesListY += PAGE_BUTTON_HEIGHT;
+            }
+        }
+        super.mouseClicked(mouseX, mouseY, mouseButton);
+
+        clickX = mouseX;
+        clickY = mouseY;
+    }
+
+    @Override
+	public void drawScreen(int mouseX, int mouseY, float partialTick)
+    {
+        if(Mouse.isButtonDown(0)) {
+            if(mouseX >= viewportLeft && mouseX < viewportRight && mouseY >= viewportTop && mouseY < viewportBottom) {
+                if(!draggingViewport) {
+                    draggingViewport = true;
+                } else {
+                    targetShiftX -= (mouseX - mouseXOld) / viewportZoom;
+                    targetShiftY -= (mouseY - mouseYOld) / viewportZoom;
+                    currentShiftX = oldShiftX = targetShiftX;
+                    currentShiftY = oldShiftY = targetShiftY;
+                }
+                mouseXOld = mouseX;
+                mouseYOld = mouseY;
+            }
+            currentShiftX =  MathHelper.clamp(currentShiftX, shiftMinX, shiftMaxX);
+            currentShiftY =  MathHelper.clamp(currentShiftY, shiftMinY, shiftMaxY);
+        } else
+        {
+            clickX = clickY = null;
+            oldPagesListScrollAmount = null;
+            draggingViewport = false;
+        }
+
+        if (drawSidebar() &&mouseX >= pageListLeft && mouseX <= pageListRight) {
+            if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
+                scrollPagesList(Mouse.getDWheel() / -0.01f);
+            } else {
+                scrollPagesList(Mouse.getDWheel() / -0.05f);
+            }
+            onScrollPagesList();
+        } else if (mouseX >= viewportLeft && mouseX <= viewportRight && mouseY >= viewportTop && mouseY <= viewportBottom){
+            viewportZoom = MathHelper.clamp(viewportZoom + (Mouse.getDWheel()/10d), 0.5d, 2);
+
+            // Make zoom notch onto integer multiples
+            final double[] notches = new double[]{0.25, 0.5, 1, 2, 4};
+            for (double notch : notches){
+                if (Math.abs(viewportZoom - notch) < 0.05){
+                    viewportZoom = notch;
+                    break;
+                }
+            }
+        }
+        Mouse.getDWheel();
+
+        drawDefaultBackground();
+
+        if (drawSidebar()){
+            overlayBackground(0, pageListRight, top, bottom, 0x202020);
+        }
+
+        renderAchievementsPanel(mouseX, mouseY, partialTick);
+
+        overlayBackground(0, width, 0, top, 0x404040);
+        overlayBackground(0, width, bottom, height, 0x404040);
+        overlayBackground(pageListRight, viewportLeft, top, bottom, 0x404040);
+
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        GL11.glDisable(GL11.GL_ALPHA_TEST);
+        GL11.glShadeModel(GL11.GL_SMOOTH);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+
+        super.drawScreen(mouseX, mouseY, partialTick); // Draw Buttons
+        GL11.glEnable(GL11.GL_DEPTH_TEST);
+        GL11.glEnable(GL11.GL_LIGHTING);
+        Lighting.disable();
+
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        GL11.glShadeModel(GL11.GL_FLAT);
+        GL11.glEnable(GL11.GL_ALPHA_TEST);
+
+        if (drawSidebar()){
+            Scissor.enable(pageListLeft, top, pageListRight - pageListLeft, bottom - top);
+            int pagesListHeight = getTotalPagesListHeight();
+            int pagesListY = top - (int) pageListScrollAmount;
+            if (pagesListHeight < bottom - top) {
+                pagesListY = top + (bottom - top - pagesListHeight) / 2;
+            }
+            if (mouseY >= top && mouseY <= bottom) {
+                hoveredPage = drawPagesListItems(pageListLeft + PADDING - 4, pagesListY, pageListRight - PADDING, mouseX, mouseY);
+            } else {
+                hoveredPage = drawPagesListItems(pageListLeft + PADDING - 4, pagesListY, pageListRight - PADDING, -1, -1);
+            }
+            Scissor.disable();
+        }
+
+        {
+            GL11.glDisable(GL11.GL_TEXTURE_2D);
+            GL11.glEnable(GL11.GL_BLEND);
+            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+            GL11.glDisable(GL11.GL_ALPHA_TEST);
+            GL11.glShadeModel(GL11.GL_SMOOTH);
+
+            byte fadeDist = 4;
+            Tessellator tessellator = Tessellator.instance;
+            if (drawSidebar()) {
+                tessellator.startDrawingQuads();
+                tessellator.setColorRGBA_I(0, 0);
+                tessellator.addVertexWithUV(pageListLeft, top + fadeDist, 0.0D, 0.0D, 1.0D);
+                tessellator.addVertexWithUV(pageListRight, top + fadeDist, 0.0D, 1.0D, 1.0D);
+                tessellator.setColorRGBA_I(0, 255);
+                tessellator.addVertexWithUV(pageListRight, top, 0.0D, 1.0D, 0.0D);
+                tessellator.addVertexWithUV(pageListLeft, top, 0.0D, 0.0D, 0.0D);
+                tessellator.draw();
+
+                tessellator.startDrawingQuads();
+                tessellator.setColorRGBA_I(0, 255);
+                tessellator.addVertexWithUV(pageListLeft, bottom, 0.0D, 0.0D, 1.0D);
+                tessellator.addVertexWithUV(pageListRight, bottom, 0.0D, 1.0D, 1.0D);
+                tessellator.setColorRGBA_I(0, 0);
+                tessellator.addVertexWithUV(pageListRight, bottom - fadeDist, 0.0D, 1.0D, 0.0D);
+                tessellator.addVertexWithUV(pageListLeft, bottom - fadeDist, 0.0D, 0.0D, 0.0D);
+                tessellator.draw();
+
+                tessellator.startDrawingQuads();
+                tessellator.setColorRGBA_I(0, 0);
+                tessellator.addVertexWithUV(viewportLeft, top + fadeDist, 0.0D, 0.0D, 1.0D);
+                tessellator.addVertexWithUV(viewportRight, top + fadeDist, 0.0D, 1.0D, 1.0D);
+                tessellator.setColorRGBA_I(0, 255);
+                tessellator.addVertexWithUV(viewportRight, top, 0.0D, 1.0D, 0.0D);
+                tessellator.addVertexWithUV(viewportLeft, top, 0.0D, 0.0D, 0.0D);
+                tessellator.draw();
+
+                tessellator.startDrawingQuads();
+                tessellator.setColorRGBA_I(0, 255);
+                tessellator.addVertexWithUV(viewportLeft, bottom, 0.0D, 0.0D, 1.0D);
+                tessellator.addVertexWithUV(viewportRight, bottom, 0.0D, 1.0D, 1.0D);
+                tessellator.setColorRGBA_I(0, 0);
+                tessellator.addVertexWithUV(viewportRight, bottom - fadeDist, 0.0D, 1.0D, 0.0D);
+                tessellator.addVertexWithUV(viewportLeft, bottom - fadeDist, 0.0D, 0.0D, 0.0D);
+                tessellator.draw();
+            } else {
+                tessellator.startDrawingQuads();
+                tessellator.setColorRGBA_I(0, 0);
+                tessellator.addVertexWithUV(0, top + fadeDist, 0.0D, 0.0D, 1.0D);
+                tessellator.addVertexWithUV(width, top + fadeDist, 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 - fadeDist, 0.0D, 1.0D, 0.0D);
+                tessellator.addVertexWithUV(0, bottom - fadeDist, 0.0D, 0.0D, 0.0D);
+                tessellator.draw();
+            }
+            GL11.glEnable(GL_TEXTURE_2D);
+            GL11.glEnable(GL11.GL_ALPHA_TEST);
+        }
+
+        if (hoveredAchievement != null){
+            drawAchievementToolTip(hoveredAchievement, mouseX, mouseY);
+        }
+
+        if (drawSidebar()) {
+            drawPagesListScrollBar(mouseX, mouseY);
+
+            if (hoveredPage != null){
+                String msg = fontRenderer.wrapFormattedStringToWidth(hoveredPage.getDescription(), TOOLTIP_BOX_WIDTH_MIN);
+                int completed = 0;
+                for (Achievement a : hoveredPage.getAchievements()){
+                    if (statsCounter.isUnlocked(a)){
+                        completed++;
+                    }
+                }
+                msg += "\n" + TextFormatting.LIGHT_GRAY + I18n.getInstance().translateKeyAndFormat("gui.achievements.label.completion",  Math.round(hoveredPage.getCompletionFraction(statsCounter) * 100) + "%");
+                tooltip.render(msg, mouseX, mouseY, TOOLTIP_OFF_X, TOOLTIP_OFF_Y);
+            }
+        }
+
+        renderLabels();
+        GL11.glEnable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL11.GL_DEPTH_TEST);
+
+        hoveredAchievement = null;
+        hoveredPage = null;
+    }
+
+    @Override
+	public void tick() {
+        oldShiftX = targetShiftX;
+        oldShiftY = targetShiftY;
+        double xDiff = currentShiftX - targetShiftX;
+        double yDiff = currentShiftY - targetShiftY;
+        if(xDiff * xDiff + yDiff * yDiff < 4D) {
+            targetShiftX += xDiff;
+            targetShiftY += yDiff;
+        } else {
+            targetShiftX += xDiff * 0.85D;
+            targetShiftY += yDiff * 0.85D;
+        }
+    }
+
+    protected void renderLabels() {
+        fontRenderer.drawCenteredString(I18n.getInstance().translateKey("gui.achievements.label.title")/* + " " + viewportZoom + " X:" + currentShiftX + ", Y:" + currentShiftY*/, width/2, 5 , 0xFFFFFF);
+    }
+
+
+    protected void renderAchievementsPanel(int mouseX, int mouseY, float partialTick){
+        double shiftX = MathHelper.lerp(oldShiftX, targetShiftX, partialTick);
+        double shiftY = MathHelper.lerp(oldShiftY, targetShiftY, partialTick);
+        shiftX =  MathHelper.clamp(shiftX, shiftMinX, shiftMaxX);
+        shiftY =  MathHelper.clamp(shiftY, shiftMinY, shiftMaxY);
+
+        zLevel = 0.0F;
+
+        GL11.glDepthFunc(GL11.GL_GEQUAL);
+        GL11.glPushMatrix();
+        GL11.glTranslatef(0, 0, -200F);
+        Scissor.enable(viewportLeft, viewportTop, viewportWidth, viewportHeight);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
+        drawRectDouble(viewportLeft, viewportTop, viewportRight, viewportBottom, 0xFF000000 | currentPage.backgroundColor()); // Ensures that the viewport always has a background of some kind
+
+        GL11.glPushMatrix();
+        drawBackgroundTiles(shiftX, shiftY);
+
+        GL11.glEnable(GL11.GL_DEPTH_TEST);
+        GL11.glDepthFunc(GL11.GL_LEQUAL); // Responsible for culling the overdraw later on
+        drawConnectingLines(mouseX, mouseY,shiftX, shiftY);
+
+        Lighting.enableInventoryLight();
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
+        hoveredAchievement = drawAchievementIcons(mouseX, mouseY, shiftX, shiftY);
+
+        GL11.glPopMatrix();
+
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        Scissor.disable();
+
+//        drawRectDouble(viewportLeft + viewportWidth/2d - 2.5, viewportTop + viewportHeight/2d - 2.5, viewportLeft + viewportWidth/2d + 2.5, viewportTop + viewportHeight/2d + 2.5, 0xFFA0A0A0); // Debug cross-hair
+
+        GL11.glPopMatrix();
+
+        zLevel = 0.0F;
+        GL11.glDepthFunc(GL11.GL_LEQUAL);
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+    }
+
+    private static final int TILE_WIDTH = 16;
+    private static final int TILE_HEIGHT = 16;
+
+    public int lastTileX = Integer.MIN_VALUE;
+    public int lastTileY = Integer.MIN_VALUE;
+    public int lastTilesWide = Integer.MIN_VALUE;
+    public int lastTilesTall = Integer.MIN_VALUE;
+    private void drawBackgroundTiles(double shiftX, double shiftY){
+        double zoom = viewportZoom/* * 0.85*/;
+
+        TextureRegistry.blockAtlas.bind();
+        final int offset = 18 * TILE_WIDTH;
+        int viewTileX = (MathHelper.floor(shiftX) + offset) / TILE_WIDTH;
+        int viewTileY = (MathHelper.floor(shiftY) + offset) / TILE_HEIGHT;
+        double remainderX = (shiftX + offset) % TILE_WIDTH;
+        double remainderY = (shiftY + offset) % TILE_HEIGHT;
+        Random random = new Random();
+
+        int tilesWide = (int) (viewportWidth/(TILE_WIDTH * zoom) + 2);
+        int tilesTall = (int) (viewportHeight/(TILE_HEIGHT * zoom) + 2);
+
+        int orgX = -tilesWide/2 - 1;
+        int orgY = -tilesTall/2 - 1;
+        int endX = tilesWide/2 + 1;
+        int endY = tilesTall/2 + 1;
+
+        tilesWide = endX - orgX;
+        tilesTall = endY - orgY;
+
+        // Cache background, saves some render time which is nice
+        if (viewTileX != lastTileX || viewTileY != lastTileY || tilesWide != lastTilesWide || tilesTall != lastTilesTall) {
+            lastTileX = viewTileX;
+            lastTileY = viewTileY;
+            lastTilesWide = tilesWide;
+            lastTilesTall = tilesTall;
+
+            for (BGLayer layer : layers){
+                layer.resize(tilesWide, tilesTall);
+            }
+
+            long worldSeed = mc.theWorld == null ? 0 : mc.theWorld.getRandomSeed();
+            for (int _y = 0; _y < tilesTall; _y++){
+                for (int _x = 0; _x < tilesWide; _x++) {
+                    int tileX = orgX + _x + viewTileX;
+                    int tileY = orgY + _y + viewTileY;
+                    // Hopefully this is actually random enough :)
+                    random.setSeed(worldSeed);
+                    long l1 = random.nextLong();
+                    random.setSeed(tileX);
+                    long l2 = random.nextLong();
+                    random.setSeed(tileY);
+                    long l3 = random.nextLong();
+
+                    long seed = Objects.hash(l1, l2, ~l3);
+
+                    for (BGLayer layer : layers) {
+                        random.setSeed(seed);
+                        IconCoordinate fore = currentPage.getBackgroundTile(this, layer.id, random, tileX, tileY);
+                        layer.put(fore, _x, _y);
+                    }
+                }
+            }
+
+
+//            long l1 = random.nextLong();
+//            random.setSeed(viewTileX);
+//            long l2 = random.nextLong();
+//            random.setSeed(viewTileY);
+//            long l3 = random.nextLong();
+//
+//            long seed = Objects.hash(l1, l2, ~l3);
+//            random.setSeed(seed);
+
+            for (BGLayer layer : layers) {
+                random.setSeed(worldSeed);
+                currentPage.postProcessBackground(this, random, layer, orgX + viewTileX, orgY + viewTileY);
+            }
+        }
+
+
+
+        for(int _y = 0; _y < tilesTall; _y++) {
+            int tileY = orgY + _y + viewTileY;
+            float brightness = 0.6F - ((float)(tileY) / 25F) * 0.3F;
+            for(int _x = 0; _x < tilesWide; _x++) {
+                int tileX = orgX + _x + viewTileX;
+
+                for (int i = layers.length - 1; i >= 0; i--) {
+                    BGLayer topLayer = getLayer(i);
+                    IconCoordinate fore = topLayer.get(_x, _y);
+
+                    IconCoordinate next = null;
+                    if (i - 1 >= 0) {
+                        BGLayer nextLayer = getLayer(i - 1);
+                        next = nextLayer.get(_x, _y);
+                    }
+
+
+                    boolean bottom = false;
+                    boolean top = false;
+                    boolean left = false;
+                    boolean right = false;
+                    boolean topLeft = false;
+                    boolean topRight = false;
+                    boolean bottomLeft = false;
+                    boolean bottomRight = false;
+
+
+                    if (fore != null && next == null && i - 1 >= 0) {
+                        BGLayer nextLayer = getLayer(i - 1);
+                        top = nextLayer.get(_x, _y - 1) != null;
+                        left = nextLayer.get(_x - 1, _y) != null;
+                        right = nextLayer.get(_x + 1, _y) != null;
+                        bottom = nextLayer.get(_x, _y + 1) != null;
+                        topLeft = nextLayer.get(_x - 1, _y - 1) != null;
+                        topRight = nextLayer.get(_x + 1, _y - 1) != null;
+                        bottomLeft = nextLayer.get(_x - 1, _y + 1) != null;
+                        bottomRight = nextLayer.get(_x + 1, _y + 1) != null;
+                    }
+
+                    double iconLeft = (viewportLeft + viewportWidth / 2d) + zoom * (((orgX + _x) * TILE_WIDTH) - remainderX);
+                    double iconTop = (viewportTop + viewportHeight / 2d) + zoom * (((orgY + _y) * TILE_HEIGHT) - remainderY);
+                    double iconWidth = TILE_WIDTH * zoom;
+                    double iconHeight = TILE_HEIGHT * zoom;
+
+                    if (fore != null) {
+                        float shadowScale = (float) Math.pow(0.65f, i);
+                        if (next != null) {
+                            shadowScale *= 0.5f;
+                        }
+                        GL11.glColor4f(brightness * shadowScale, brightness * shadowScale, brightness * shadowScale, 1.0F);
+                        drawTexturedModalRectDouble(
+                            iconLeft, iconTop,
+                            fore.iconX, fore.iconY,
+                            iconWidth, iconHeight,
+                            fore.width, fore.height,
+                            fore.parentAtlas.getInverseWidth(),
+                            fore.parentAtlas.getInverseHeight());
+                    }
+
+                    GL11.glDisable(GL11.GL_TEXTURE_2D);
+                    GL11.glEnable(GL11.GL_BLEND);
+                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+                    GL11.glDisable(GL11.GL_ALPHA_TEST);
+                    GL11.glShadeModel(GL11.GL_SMOOTH);
+                    Tessellator t = Tessellator.instance;
+                    final double off = 0.05d;
+                    double fadeDist = 6 * zoom;
+                    short shadowDarkness = 128;
+                    if (top) {
+                        t.startDrawingQuads();
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft - off, iconTop + fadeDist + off, 0.0D, 0.0D, 1.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth + off, iconTop + fadeDist + off, 0.0D, 1.0D, 1.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft + iconWidth + off, iconTop - off, 0.0D, 1.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft - off, iconTop - off, 0.0D, 0.0D, 0.0D);
+                        t.draw();
+                    }
+                    if (left) {
+                        t.startDrawingQuads();
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + fadeDist + off, iconTop + iconHeight + off, 0.0D, 1.0D, 1.0D);
+                        t.addVertexWithUV(iconLeft + fadeDist + off, iconTop - off, 0.0D, 0.0D, 1.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft - off, iconTop - off, 0.0D, 0.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft - off, iconTop + iconHeight + off, 0.0D, 1.0D, 0.0D);
+                        t.draw();
+                    }
+                    if (bottom) {
+                        t.startDrawingQuads();
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + iconWidth + off, iconTop + iconHeight - fadeDist + off, 0.0D, 1.0D, 1.0D);
+                        t.addVertexWithUV(iconLeft - off, iconTop + iconHeight - fadeDist + off, 0.0D, 0.0D, 1.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft - off, iconTop + iconHeight - off, 0.0D, 0.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth + off, iconTop + iconHeight - off, 0.0D, 1.0D, 0.0D);
+                        t.draw();
+                    }
+                    if (right) {
+                        t.startDrawingQuads();
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + iconWidth - fadeDist + off, iconTop - off, 0.0D, 0.0D, 1.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth - fadeDist + off, iconTop + iconHeight + off, 0.0D, 1.0D, 1.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop + iconHeight + off, 0.0D, 1.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop - off, 0.0D, 0.0D, 0.0D);
+                        t.draw();
+                    }
+                    if (topLeft && !(left || top)) {
+                        t.startDrawing(GL11.GL_TRIANGLES);
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft - off, iconTop + fadeDist + off, 0.0D, 1.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft + fadeDist + off, iconTop - off, 0.0D, 0.0D, 0.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft - off, iconTop - off, 0.0D, 0.0D, 1.0D);
+                        t.draw();
+                    }
+                    if (topRight && !(right || top)) {
+                        t.startDrawing(GL11.GL_TRIANGLES);
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + iconWidth - fadeDist + off, iconTop - off, 0.0D, 0.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop + fadeDist + off, 0.0D, 1.0D, 0.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop - off, 0.0D, 0.0D, 1.0D);
+                        t.draw();
+                    }
+                    if (bottomLeft && !(left || bottom)) {
+                        t.startDrawing(GL11.GL_TRIANGLES);
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + fadeDist + off, iconTop + iconHeight - off, 0.0D, 0.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft - off, iconTop + iconHeight - fadeDist + off, 0.0D, 1.0D, 0.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft - off, iconTop + iconHeight - off, 0.0D, 0.0D, 1.0D);
+                        t.draw();
+                    }
+                    if (bottomRight && !(right || bottom)) {
+                        t.startDrawing(GL11.GL_TRIANGLES);
+                        t.setColorRGBA_I(0, 0);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop + iconHeight - fadeDist + off, 0.0D, 1.0D, 0.0D);
+                        t.addVertexWithUV(iconLeft + iconWidth - fadeDist + off, iconTop + iconHeight - off, 0.0D, 0.0D, 0.0D);
+                        t.setColorRGBA_I(0, shadowDarkness);
+                        t.addVertexWithUV(iconLeft + iconWidth - off, iconTop + iconHeight - off, 0.0D, 0.0D, 1.0D);
+                        t.draw();
+                    }
+                    GL11.glEnable(GL_TEXTURE_2D);
+                    GL11.glEnable(GL11.GL_ALPHA_TEST);
+                }
+            }
+        }
+    }
+
+    public BGLayer getLayer(int layer){
+        if (layer < 0 || layer >= layers.length) return null;
+        return layers[layer];
+    }
+
+    private double timeSin(double amplitude, long period){
+        return Math.sin(((double)(System.currentTimeMillis() % period) / period) * Math.PI * 2D) * amplitude;
+    }
+    private void drawConnectingLines(int mouseX, int mouseY, double shiftX, double shiftY){
+        double zoom = viewportZoom;
+
+        for(Achievement ach : currentPage.getAchievements()) {
+            if(ach.parent == null) {
+                continue;
+            }
+            if (!currentPage.hasAchievement(ach) || !currentPage.hasAchievement(ach.parent)){
+                continue;
+            }
+            double childX = (viewportLeft + viewportWidth/2d) + ((ach.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
+            double childY = (viewportTop + viewportHeight/2d) + ((ach.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
+            double parentX = (viewportLeft + viewportWidth/2d) + ((ach.parent.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
+            double parentY = (viewportTop + viewportHeight/2d) + ((ach.parent.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
+            boolean unlocked = statsCounter.isUnlocked(ach);
+            boolean canUnlock = statsCounter.canUnlock(ach);
+
+            final double zoomOff = 11 * zoom;
+//            if (
+//                (((childX + zoomOff) <= viewportLeft || (childX - zoomOff) >= viewportRight || (childY - zoomOff) >= viewportBottom || (childY + zoomOff) <= viewportTop) &&
+//                (((parentX + zoomOff) <= viewportLeft || (parentX - zoomOff) >= viewportRight || (parentY - zoomOff) >= viewportBottom || (parentY + zoomOff) <= viewportTop)))) {
+//                continue;
+//            }
+
+            boolean isHovered = false;
+            {
+                double x = parentX - zoomOff;
+                double y = parentY - zoomOff;
+                if ((mouseX >= 0 && mouseY >= viewportTop && mouseX < width && mouseY < viewportBottom) && // In viewport and
+                    (mouseX >= x && mouseX <= x + 22 * zoom && mouseY >= y && mouseY <= y + 22 * zoom)) { // Hovering over achievement
+                    isHovered = true;
+                }
+
+                x = childX - zoomOff;
+                y = childY - zoomOff;
+                if ((mouseX >= 0 && mouseY >= viewportTop && mouseX < width && mouseY < viewportBottom) && // In viewport and
+                    (mouseX >= x && mouseX <= x + 22 * zoom && mouseY >= y && mouseY <= y + 22 * zoom)) { // Hovering over achievement
+                    isHovered = true;
+                }
+            }
+
+            int color;
+            if(unlocked) {
+                color = 0xff << Color.SHIFT_ALPHA | (currentPage.lineColorUnlocked(isHovered) & 0xffffff);
+            } else if (canUnlock) {
+                int alpha = timeSin(1, 600) >= 0.6 ? 0x82 : 0xff;
+                color = (alpha << Color.SHIFT_ALPHA) | (currentPage.lineColorCanUnlock(isHovered) & 0xffffff);
+            } else {
+                color = 0xff << Color.SHIFT_ALPHA | (currentPage.lineColorLocked(isHovered) & 0xffffff);
+            }
+
+            drawLineHorizontalDouble(childX, parentX, childY, color);
+            drawLineVerticalDouble(parentX, childY, parentY, color);
+        }
+    }
+
+    @Nullable
+    private Achievement drawAchievementIcons(int mouseX, int mouseY, double shiftX, double shiftY){
+        double zoom = viewportZoom;
+
+        Achievement hoveredAchievment = null;
+        for(Achievement ach : currentPage.getAchievements()) {
+            double achViewX = (viewportLeft + viewportWidth/2d) + (ach.x * ACHIEVEMENT_CELL_WIDTH - shiftX ) * zoom;
+            double achViewY = (viewportTop + viewportHeight/2d) + (ach.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) * zoom;
+            if(achViewX < viewportLeft - ACHIEVEMENT_CELL_WIDTH * zoom || achViewY < viewportTop - ACHIEVEMENT_CELL_HEIGHT * zoom || achViewX > viewportRight || achViewY > viewportBottom) { // Continue if outside viewport
+                continue;
+            }
+
+            if(statsCounter.isUnlocked(ach)) {
+                float brightness = 1.0F;
+                GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+            } else if(statsCounter.canUnlock(ach)) {
+                // Flicker if can unlock
+                float brightness = timeSin(1, 600) >= 0.6 ? 0.6F : 0.8F;
+                GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+            } else {
+                // Darken if not unlock-able
+                float brightness = 0.3F;
+                GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+            }
+
+            drawGuiIconDouble(achViewX - (ACHIEVEMENT_ICON_WIDTH - ACHIEVEMENT_CELL_WIDTH) * zoom, achViewY - (ACHIEVEMENT_ICON_HEIGHT - ACHIEVEMENT_CELL_HEIGHT) * zoom, ACHIEVEMENT_ICON_WIDTH * zoom, ACHIEVEMENT_ICON_HEIGHT * zoom, currentPage.getAchievementIcon(ach));
+
+            if(!statsCounter.canUnlock(ach)) {
+                float brightness = 0.1F;
+                GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+            }
+
+            GL11.glPushMatrix();
+            GL11.glEnable(GL11.GL_LIGHTING);
+            GL11.glEnable(GL11.GL_CULL_FACE);
+            Item achievementItem = Item.itemsList[ach.iconItemId];
+
+            GL11.glTranslated(achViewX + 3 * zoom, achViewY + 3 * zoom, 0);
+            GL11.glScaled(zoom, zoom, 1);
+            ItemModelDispatcher.getInstance().getDispatch(achievementItem)
+                .renderItemIntoGui(Tessellator.instance, mc.fontRenderer, mc.renderEngine, achievementItem.getDefaultStack(), 0, 0, 1.0f);
+
+            GL11.glDisable(GL11.GL_LIGHTING);
+            GL11.glPopMatrix();
+
+            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+
+            if((mouseX >= 0 && mouseY >= viewportTop && mouseX < width && mouseY < viewportBottom) && // In viewport and
+                (mouseX >= achViewX && mouseX <= achViewX + 22 * zoom && mouseY >= achViewY && mouseY <= achViewY + 22 * zoom)) { // Hovering over achievement
+                hoveredAchievment = ach;
+            }
+        }
+        return hoveredAchievment;
+    }
+    private void drawAchievementToolTip(Achievement achievement, int mouseX, int mouseY){
+        String name = achievement.getStatName();
+        String desc = achievement.getDescription();
+        final int padding = tooltip.getPadding();
+        int[] boxRender;
+        if(statsCounter.canUnlock(achievement)) { // Can unlock/ is unlocked
+            int boxWidth = Math.max(fontRenderer.getStringWidth(name), TOOLTIP_BOX_WIDTH_MIN);
+            int boxHeight = fontRenderer.getHeightOfConstrainedString(desc, boxWidth);
+            if(statsCounter.isUnlocked(achievement)) {
+                boxHeight += 12;
+            }
+            boxRender = tooltip.drawBackground(mouseX, mouseY, TOOLTIP_OFF_X, TOOLTIP_OFF_Y, boxWidth + 3, boxHeight + 3 + 12);
+            fontRenderer.drawStringIntoConstrainedBlock(desc, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth, 0xffa0a0a0);
+            if(statsCounter.isUnlocked(achievement)) { // Add taken string to bottom
+                fontRenderer.drawStringWithShadow(I18n.getInstance().translateKey("gui.achievements.label.taken"), boxRender[0] + padding, boxRender[1] + boxHeight + 8 + padding, 0xff9090ff);
+            }
+        } else { // Not unlocked so darken
+            int boxWidth = Math.max(fontRenderer.getStringWidth(name), TOOLTIP_BOX_WIDTH_MIN);
+            String msg = I18n.getInstance().translateKeyAndFormat("gui.achievements.label.requires", achievement.parent.getStatName());
+            int boxHeight = fontRenderer.getHeightOfConstrainedString(msg, boxWidth);
+            boxRender = tooltip.drawBackground(mouseX, mouseY, TOOLTIP_OFF_X, TOOLTIP_OFF_Y, boxWidth + 3, boxHeight + 3 + 12);
+            fontRenderer.drawStringIntoConstrainedBlock(msg, boxRender[0] + padding, boxRender[1] + 12 + padding, boxWidth, 0xff705050);
+        }
+        int color = statsCounter.canUnlock(achievement) ? achievement.getType().colorName : achievement.getType().colorNameLocked;
+        fontRenderer.drawStringWithShadow(name, boxRender[0] + padding, boxRender[1] + padding, color);
+    }
+    public boolean drawSidebar(){
+        return AchievementPageRegistry.getInstance().getPages().size() > 1;
+    }
+    private void scrollPagesList(float amount) {
+        if(amount == 0.0f) return;
+
+        pageListScrollAmount += amount;
+        onScrollPagesList();
+    }
+
+    private void onScrollPagesList() {
+        int totalPagesListHeight = getTotalPagesListHeight();
+        if (pageListScrollAmount < 0 || pagesListScrollRegionHeight > totalPagesListHeight) pageListScrollAmount = 0;
+        else if (pageListScrollAmount > totalPagesListHeight - pagesListScrollRegionHeight) pageListScrollAmount = totalPagesListHeight - pagesListScrollRegionHeight;
+    }
+    private int getTotalPagesListHeight() {
+        return PAGE_BUTTON_HEIGHT * AchievementPageRegistry.getInstance().getPages().size();
+    }
+
+    @Nullable
+    private AchievementPage drawPagesListItems(int x, int y, int width, int mouseX, int mouseY) {
+        int y2 = y;
+        AchievementPage pageHovered = null;
+        for(AchievementPage page : AchievementPageRegistry.getInstance().getPages()) {
+            String name = page.getName();
+            int textColor = 0xFF7F7F7F;
+            if (page == currentPage) {
+                textColor = 0xFFFFFFFF;
+            }
+            if (mouseX >= x && mouseX < x + width && mouseY >= y2 && mouseY < y2 + PAGE_BUTTON_HEIGHT) {
+                textColor = 0xFFFFFFA0;
+                pageHovered = page;
+            }
+            renderItem.render(page.getIcon(), x, y2 + (PAGE_BUTTON_HEIGHT / 2) - 9);
+            if (page.getCompletionFraction(statsCounter) >= 1) {
+                GL11.glColor4f(1f, 1f, 1f, 1f);
+                drawGuiIcon(x + 8, y2 + (PAGE_BUTTON_HEIGHT / 2) - 9 + 8, 11, 11, TextureRegistry.getTexture("minecraft:gui/achievement/star"));
+            }
+            mc.fontRenderer.drawStringWithShadow(name, x + 19, y2 + (PAGE_BUTTON_HEIGHT / 2) - 4, textColor);
+            y2 += PAGE_BUTTON_HEIGHT;
+        }
+
+        return pageHovered;
+    }
+    protected void drawPagesListScrollBar(int mouseX, int mouseY) {
+        float totalPagesListHeight = getTotalPagesListHeight();
+        float scrollBarHeightPercent = pagesListScrollRegionHeight / totalPagesListHeight;
+
+        if(scrollBarHeightPercent > 1.0f) return;
+
+        glDisable(GL_TEXTURE_2D);
+
+        int scrollBarX = pageListRight - 6;
+
+        int scrollBarHeightPx = (int) (scrollBarHeightPercent * pagesListScrollRegionHeight);
+        if(scrollBarHeightPx < 32) {
+            scrollBarHeightPx = 32;
+        }
+
+        float scrollPercent = pageListScrollAmount / (totalPagesListHeight - pagesListScrollRegionHeight);
+
+        int scrollBarY = (int) (top + (pagesListScrollRegionHeight - scrollBarHeightPx) * scrollPercent);
+
+        Tessellator t = Tessellator.instance;
+
+        t.startDrawingQuads();
+        t.setColorOpaque(0, 0, 0);
+        t.drawRectangle(scrollBarX, top, 6, pagesListScrollRegionHeight);
+        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(oldPagesListScrollAmount == null) {
+                    oldPagesListScrollAmount = pageListScrollAmount;
+                }
+                pageListScrollAmount = oldPagesListScrollAmount + (clickY - mouseY) * (1.0f / scrollBarHeightPercent) * -1.0f;
+                onScrollPagesList();
+            }
+        }else {
+            oldPagesListScrollAmount = null;
+        }
+    }
+
+    private void overlayBackground(int minX, int maxX, int minY, int maxY, int color)
+    {
+        Tessellator tessellator = Tessellator.instance;
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        float scale = 32F;
+        tessellator.startDrawingQuads();
+        tessellator.setColorOpaque_I(color);
+        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(color);
+        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();
+    }
+
+    public static class BGLayer {
+        private IconCoordinate[] data;
+        private int width;
+        private int height;
+        public final int id;
+        public BGLayer(int id) {
+            this.id = id;
+            data = new IconCoordinate[0];
+            width = 0;
+            height = 0;
+        }
+        public int getWidth() {
+            return width;
+        }
+        public int getHeight() {
+            return height;
+        }
+        public IconCoordinate[] getData() {
+            return data;
+        }
+        protected void resize(int width, int height) {
+            this.width = width;
+            this.height = height;
+            data = new IconCoordinate[width * height];
+        }
+        public void put(IconCoordinate coordinate, int x, int y){
+            if (x < 0) return;
+            if (y < 0) return;
+            if (x >= width) return;
+            if (y >= height) return;
+            data[makeIndex(x, y)] = coordinate;
+        }
+
+        public IconCoordinate get(int x, int y){
+            if (x < 0) return null;
+            if (y < 0) return null;
+            if (x >= width) return null;
+            if (y >= height) return null;
+            return data[makeIndex(x, y)];
+        }
+
+        private int makeIndex(int x, int y){
+            return x % width + y * width;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java
new file mode 100644
index 000000000..3d32ea5e1
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java
@@ -0,0 +1,54 @@
+package net.minecraft.client.gui.achievements.data;
+
+import net.minecraft.client.gui.achievements.GuiAchievements;
+import net.minecraft.client.render.block.model.BlockModelDispatcher;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.achievement.stat.StatsCounter;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Random;
+
+public abstract class AchievementPage {
+
+    public abstract @NotNull String getName();
+
+    public abstract @NotNull String getDescription();
+
+    public abstract void addAchievement(@NotNull Achievement achievement);
+
+    public abstract @NotNull Achievement onOpenAchievement();
+
+    public abstract @Nullable IconCoordinate getBackgroundTile(GuiAchievements gui, int layer, Random random, int tileX, int tileY);
+
+    public abstract void postProcessBackground(GuiAchievements gui, Random random, GuiAchievements.BGLayer layerCache, int orgX, int orgY);
+
+    public abstract @NotNull ItemStack getIcon();
+
+    public abstract @NotNull List<Achievement> getAchievements();
+
+    public abstract double getCompletionFraction(StatsCounter counter);
+
+    public abstract int backgroundLayers();
+
+    public abstract int backgroundColor();
+
+    public abstract boolean hasAchievement(Achievement achievement);
+
+    public abstract IconCoordinate getAchievementIcon(Achievement achievement);
+
+    public abstract int lineColorLocked(boolean isHovered);
+
+    public abstract int lineColorUnlocked(boolean isHovered);
+
+    public abstract int lineColorCanUnlock(boolean isHovered);
+
+    public static IconCoordinate getTextureFromBlock(Block block){
+        return BlockModelDispatcher.getInstance().getDispatch(block).getBlockTextureFromSideAndMetadata(Side.TOP, 0);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPageRegistry.java b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPageRegistry.java
new file mode 100644
index 000000000..ac756e4ad
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPageRegistry.java
@@ -0,0 +1,48 @@
+package net.minecraft.client.gui.achievements.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class AchievementPageRegistry {
+    private static final AchievementPageRegistry INSTANCE = new AchievementPageRegistry();
+
+    public static AchievementPageRegistry getInstance()
+    {
+        return INSTANCE;
+    }
+
+    private final List<AchievementPage> pages = new ArrayList<>();
+
+    private AchievementPageRegistry() { }
+
+    public void register(AchievementPage page)
+    {
+        if (!pages.contains(page))
+        {
+            pages.add(page);
+
+            // Move search page to the end
+//            if (OptionsPages.SEARCH != null)
+//            {
+//                pages.remove(OptionsPages.SEARCH);
+//                pages.add(OptionsPages.SEARCH);
+//            }
+        }
+    }
+
+    public int getPageIndex(AchievementPage page)
+    {
+        return pages.indexOf(page);
+    }
+
+    public List<AchievementPage> getPages()
+    {
+        return Collections.unmodifiableList(pages);
+    }
+
+    static
+    {
+        AchievementPages.init();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java
new file mode 100644
index 000000000..072688dbc
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java
@@ -0,0 +1,46 @@
+package net.minecraft.client.gui.achievements.data;
+
+import net.minecraft.client.gui.achievements.pages.DefaultPage;
+import net.minecraft.client.gui.achievements.pages.NetherPage;
+import net.minecraft.client.gui.achievements.pages.OverworldPage;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.block.Blocks;
+
+public class AchievementPages {
+    public static AchievementPage overworldPage;
+    public static AchievementPage netherPage;
+
+    public static AchievementPage register(AchievementPage page){
+        AchievementPageRegistry.getInstance().register(page);
+        return page;
+    }
+
+    private static boolean hasInit = false;
+    public static void init(){
+        if (hasInit) return;
+        hasInit = true;
+        overworldPage = register(new OverworldPage());
+        netherPage = register(new NetherPage());
+//        netherPage = new NetherPage();
+
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+        register(new DefaultPage("DUMMY PAGE", Blocks.SPONGE_DRY.getDefaultStack()));
+    }
+    static {
+        Achievements.init();
+        init();
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/achievements/pages/DefaultPage.java b/src/main/java/net/minecraft/client/gui/achievements/pages/DefaultPage.java
new file mode 100644
index 000000000..30f0d6d52
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/pages/DefaultPage.java
@@ -0,0 +1,476 @@
+package net.minecraft.client.gui.achievements.pages;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.achievements.GuiAchievements;
+import net.minecraft.client.gui.achievements.data.AchievementPage;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.WeightedRandomBag;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.achievement.stat.StatsCounter;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Random;
+import java.util.function.BiFunction;
+
+public class DefaultPage extends AchievementPage {
+    protected final Minecraft mc = Minecraft.getMinecraft(this);
+    protected final ItemStack icon;
+    @NotNull
+    private final List<Achievement> achievementList = new ArrayList<>();
+    protected final String key;
+    public DefaultPage(String key, ItemStack icon){
+        this.key = key;
+        this.icon = icon;
+    }
+    @Override
+    public void addAchievement(@NotNull Achievement achievement){
+        achievementList.add(Objects.requireNonNull(achievement));
+    }
+    @Override
+    public @NotNull String getName() {
+        return I18n.getInstance().translateNameKey(key);
+    }
+
+    @Override
+    public @NotNull String getDescription() {
+        return I18n.getInstance().translateDescKey(key);
+    }
+
+    @Override
+    public @NotNull Achievement onOpenAchievement() {
+        return Achievements.BUILD_WORKBENCH;
+    }
+
+    protected static final int ORE_COAL = 0;
+    protected static final int ORE_IRON = 1;
+    protected static final int ORE_GOLD = 2;
+    protected static final int ORE_DIAMOND = 3;
+    protected static final int ORE_REDSTONE = 4;
+    protected static final int ORE_LAPIS = 5;
+    protected static final Block[] STONE_ORES = new Block[]     { Blocks.ORE_COAL_STONE,    Blocks.ORE_IRON_STONE,      Blocks.ORE_GOLD_STONE,      Blocks.ORE_DIAMOND_STONE,       Blocks.ORE_REDSTONE_STONE,      Blocks.ORE_LAPIS_STONE};
+    protected static final Block[] GRANITE_ORES = new Block[]   { Blocks.ORE_COAL_GRANITE,  Blocks.ORE_IRON_GRANITE,    Blocks.ORE_GOLD_GRANITE,    Blocks.ORE_DIAMOND_GRANITE,     Blocks.ORE_REDSTONE_GRANITE,    Blocks.ORE_LAPIS_GRANITE};
+    protected static final Block[] LIMESTONE_ORES = new Block[] { Blocks.ORE_COAL_LIMESTONE,Blocks.ORE_IRON_LIMESTONE,  Blocks.ORE_GOLD_LIMESTONE,  Blocks.ORE_DIAMOND_LIMESTONE,   Blocks.ORE_REDSTONE_LIMESTONE,  Blocks.ORE_LAPIS_LIMESTONE};
+    protected static final Block[] BASALT_ORES = new Block[]    { Blocks.ORE_COAL_BASALT,   Blocks.ORE_IRON_BASALT,     Blocks.ORE_GOLD_BASALT,     Blocks.ORE_DIAMOND_BASALT,      Blocks.ORE_REDSTONE_BASALT,     Blocks.ORE_LAPIS_BASALT};
+
+    @Override
+    public IconCoordinate getBackgroundTile(GuiAchievements guiAchievements, int layer, Random random, int tileX, int tileY) {
+        random.setSeed(random.nextLong() + key.hashCode()); // makes seed different for each instance of this class :)
+        // expect x range from  0  to 45
+        // expect y range from -12 to 50
+        final int sandLayer = -20;
+        final int dirtLayer = 2;
+        final int bedrockLayer = 35;
+        final int stoneLayer = bedrockLayer - (int) ((bedrockLayer - dirtLayer) * 0.5f);
+        final int basaltLayer = bedrockLayer - (int) ((bedrockLayer - dirtLayer) * 0.25f);
+
+        final int graniteColumn = 5;
+        final int limestoneColumn = 50;
+
+        final int offsetX = tileX + random.nextInt(3) - random.nextInt(3);
+        final int offsetY = tileY + random.nextInt(3) - random.nextInt(3);
+
+        if (offsetY <= sandLayer){
+            return getTextureFromBlock(Blocks.SAND);
+        } else if (offsetY <= dirtLayer) {
+            return getTextureFromBlock(Blocks.DIRT);
+        } else if (offsetY >= bedrockLayer) {
+            return getTextureFromBlock(Blocks.BEDROCK);
+        } else {
+            if (offsetY >= basaltLayer){
+                return getOreFromStone(Blocks.BASALT, random, tileX, tileY);
+            } else if (offsetY >= stoneLayer){
+                return getOreFromStone(Blocks.STONE, random, tileX, tileY);
+            } else {
+                if (offsetX <= graniteColumn){
+                    return getOreFromStone(Blocks.GRANITE, random, tileX, tileY);
+                } else if (offsetX >= limestoneColumn) {
+                    return getOreFromStone(Blocks.LIMESTONE, random, tileX, tileY);
+                }
+                return getOreFromStone(Blocks.STONE, random, tileX, tileY);
+            }
+        }
+    }
+
+    @Override
+    public void postProcessBackground(GuiAchievements gui, Random random, GuiAchievements.BGLayer layer, int orgX, int orgY) {
+        random.setSeed(random.nextLong() + key.hashCode()); // makes seed different for each instance of this class :)
+        if (layer.id == 0) {
+
+            int y = 5;
+            int delta = 0;
+            int tYMin = -2;
+            int tYMax = -6;
+            int lowestY = 0;
+            for (int _x = -100; _x < 100; _x++) {
+                delta += random.nextInt(2) - random.nextInt(2);
+                delta = MathHelper.clamp(delta, -3, 3);
+                int sign = (int) Math.signum(delta);
+                int _d = Math.abs(delta);
+                if (_d != 0) {
+                    y += sign * random.nextInt(_d);
+                }
+
+                if (y > tYMax) {
+                    delta -= 1;
+                }
+                if (y < tYMin) {
+                    delta += 1;
+                }
+                if (y > lowestY) y = lowestY;
+
+                for (int rY = y; rY - orgY >= 0; rY--) {
+                    if (rY == y) {
+                        layer.put(TextureRegistry.getTexture("minecraft:block/grass_side"), _x - orgX, rY - orgY);
+                    } else {
+                        layer.put(null, _x - orgX, rY - orgY);
+                    }
+                    gui.getLayer(1).put(null, _x - orgX, rY - orgY);
+                }
+            }
+
+            int[] brickPos = null;
+            int[] cobblePos = null;
+            int lastY = 0;
+            int cave = -1;
+            for (int _x = -100; _x <= 100; _x++) {
+                if (random.nextInt(20) == 0 && cave <= 0) {
+                    cave = 20 + random.nextInt(5) - random.nextInt(5);
+                }
+                if (cave > 0){
+                    lastY = (25 + random.nextInt(4) - random.nextInt(4));
+                    carveCircle(gui, layer, _x - orgX, lastY - orgY, 2 + random.nextInt(3));
+                }
+                if (cave == 0 && (-10 <= _x && _x <= 40)) {
+                    brickPos = new int[]{_x, lastY};
+                }
+                cave--;
+            }
+            cave = -1;
+            for (int _x = -100; _x <= 100; _x++) {
+                if (random.nextInt(10) == 0 && cave <= 0) {
+                    cave = 5 + random.nextInt(5) - random.nextInt(5);
+                }
+                if (cave > 0){
+                    carveCircle(gui, layer, _x - orgX, (10 + random.nextInt(2) - random.nextInt(2)) - orgY, random.nextInt(3));
+                }
+                cave--;
+            }
+
+            if (brickPos == null) {
+                brickPos = new int[]{5 + random.nextInt(20) + random.nextInt(20), 15 + random.nextInt(10)};
+            }
+
+            placeStructure(gui, dungeonBrick, brickPos[0] - orgX,brickPos[1] - orgY, (struct, cache) -> {
+                if (cache == null) {
+                    if (struct == chest || struct == spawner) {
+                        return struct;
+                    }
+                    return null;
+                }
+                return struct;
+            });
+            placeStructure(gui, dungeonCobble, -orgX + 5 + random.nextInt(20) + random.nextInt(20),-orgY + 5 + random.nextInt(5), (struct, cache) -> {
+                if (cache == null) {
+                    if (struct == chest || struct == spawner) {
+                        return struct;
+                    }
+                    return null;
+                }
+                return struct;
+            });
+        } else if (layer.id == 1) {
+            // Remove covered icons
+            IconCoordinate[] foreground = gui.getLayer(0).getData();
+            IconCoordinate[] background = layer.getData();
+            for (int i = 0; i < background.length; i++) {
+                if (foreground[i] != null && foreground[i] != spawner){
+                    background[i] = null;
+                }
+            }
+        }
+    }
+
+    protected void carveCircle(GuiAchievements gui, GuiAchievements.BGLayer layer, int centerX, int centerY, int radius){
+        for (int i = centerX - radius; i <= centerX + radius ; i++) {
+            for (int j = centerY - radius; j < centerY + radius; j++) {
+                double diffX = (i + 0.5) - centerX;
+                double diffY = (j + 0.5) - centerY;
+                if ((diffX * diffX) + (diffY * diffY) < radius * radius){
+                    layer.put(null, i, j);
+                }
+            }
+        }
+    }
+
+    protected void placeStructure(GuiAchievements gui, PageStructure structure, int tileX, int tileY, @Nullable BiFunction<IconCoordinate, IconCoordinate, IconCoordinate> coordinateProcessor) {
+        if (coordinateProcessor == null) {
+            coordinateProcessor = (i, i2) -> i;
+        }
+        for (int layer = 0; layer < structure.layers; layer++) {
+            GuiAchievements.BGLayer cache = gui.getLayer(layer);
+            if (cache != null) {
+                for (int _x = 0; _x < structure.width; _x++) {
+                    for (int _y = 0; _y < structure.height; _y++) {
+                        IconCoordinate coordinate = structure.getIcon(_x, _y, layer);
+                        cache.put(coordinateProcessor.apply(coordinate, cache.get(tileX + _x, tileY + _y)), tileX + _x, tileY + _y);
+                    }
+                }
+            }
+        }
+    }
+
+    private static final WeightedRandomBag<Integer> oreBag = new WeightedRandomBag<>();
+
+    protected IconCoordinate getOreFromStone(Block stoneBlock, Random random, int tileX, int tileY){
+        oreBag.clear();
+
+        random.setSeed(random.nextLong());
+
+        final int coalStart = 2;
+        final int coalEnd = 20;
+
+        final int ironStart = 2;
+        final int ironEnd = 25;
+
+        final int goldStart = 20;
+        final int goldEnd = 35;
+
+        final int diamondStart = 25;
+        final int diamondEnd = 35;
+
+        final int lapisStart = 25;
+        final int lapisEnd = 35;
+
+        final int redstoneStart = 20;
+        final int redstoneEnd = 35;
+
+        oreBag.addEntry(-1, 300);
+
+        if (tileY >= coalStart && tileY <= coalEnd){
+            oreBag.addEntry(ORE_COAL, 15);
+        }
+
+        if (tileY >= ironStart && tileY <= ironEnd){
+            oreBag.addEntry(ORE_IRON, 15);
+        }
+
+        if (tileY >= goldStart && tileY <= goldEnd){
+            oreBag.addEntry(ORE_GOLD, 3);
+        }
+
+        if (tileY >= diamondStart && tileY <= diamondEnd){
+            oreBag.addEntry(ORE_DIAMOND, 1);
+        }
+
+        if (tileY >= lapisStart && tileY <= lapisEnd){
+            oreBag.addEntry(ORE_LAPIS, 2);
+        }
+
+        if (tileY >= redstoneStart && tileY <= redstoneEnd){
+            oreBag.addEntry(ORE_REDSTONE, 5);
+        }
+
+        int oreIndex = oreBag.getRandom(random);
+
+        if (oreIndex >= 0){
+            if (stoneBlock == Blocks.STONE){
+                return getTextureFromBlock(STONE_ORES[oreIndex]);
+            } else if (stoneBlock == Blocks.BASALT) {
+                return getTextureFromBlock(BASALT_ORES[oreIndex]);
+            } else if (stoneBlock == Blocks.GRANITE) {
+                return getTextureFromBlock(GRANITE_ORES[oreIndex]);
+            } else if (stoneBlock == Blocks.LIMESTONE) {
+                return getTextureFromBlock(LIMESTONE_ORES[oreIndex]);
+            }
+        }
+
+        return getTextureFromBlock(stoneBlock);
+    }
+
+//    @Override
+//    public IconCoordinate getBackgroundTile(Random random, int tileX, int tileY) {
+//        int randomY = random.nextInt(Math.max(1 + tileY, 1)) + (tileY) / 2;
+//        IconCoordinate texture = getTextureFromBlock(Blocks.SAND);
+//        Block[] oreArray = STONE_ORES;
+//        if (randomY >= 28 || tileY > 24) {
+//            oreArray = BASALT_ORES;
+//        } if(randomY > 37 || tileY >= 35) {
+//            texture = getTextureFromBlock(Blocks.BEDROCK);
+//        } else if(randomY == 22) {
+//            if(random.nextInt(2) == 0) {
+//                texture = getTextureFromBlock(oreArray[ORE_DIAMOND]);
+//            } else {
+//                texture = getTextureFromBlock(oreArray[ORE_REDSTONE]);
+//            }
+//        } else if(randomY == 10) {
+//            texture = getTextureFromBlock(oreArray[ORE_IRON]);
+//        } else if(randomY == 8) {
+//            texture = getTextureFromBlock(oreArray[ORE_COAL]);
+//        } else if(randomY > 4) {
+//            texture = getTextureFromBlock(Blocks.STONE);
+//            if (randomY >= 28 || tileY > 24) {
+//                texture = getTextureFromBlock(Blocks.BASALT);
+//            }
+//        } else if(randomY > 0) {
+//            texture = getTextureFromBlock(Blocks.DIRT);
+//        }
+//        return texture;
+//    }
+
+    @Override
+    public @NotNull ItemStack getIcon() {
+        return icon;
+    }
+
+    @Override
+    public @NotNull List<Achievement> getAchievements() {
+        return achievementList;
+    }
+
+    @Override
+    public double getCompletionFraction(StatsCounter counter) {
+        int completed = 0;
+        for (Achievement a : achievementList){
+            if (counter.isUnlocked(a)){
+                completed++;
+            }
+        }
+        return completed / (double)achievementList.size();
+    }
+
+    @Override
+    public int backgroundLayers() {
+        return 2;
+    }
+
+    @Override
+    public int backgroundColor() {
+        return 0x76b6ff;
+    }
+
+    @Override
+    public boolean hasAchievement(Achievement achievement) {
+        return achievementList.contains(achievement);
+    }
+
+    @Override
+    public IconCoordinate getAchievementIcon(Achievement achievement) {
+        return TextureRegistry.getTexture(achievement.getType().texture);
+    }
+
+    @Override
+    public int lineColorLocked(boolean isHovered) {
+        return 0x000000;
+    }
+
+    @Override
+    public int lineColorUnlocked(boolean isHovered) {
+        return 0x707070;
+    }
+
+    @Override
+    public int lineColorCanUnlock(boolean isHovered) {
+        return 0x00ff00;
+    }
+
+    private static final IconCoordinate chest = TextureRegistry.getTexture("minecraft:block/chest_planks_oak_front");
+    private static final IconCoordinate spawner = getTextureFromBlock(Blocks.MOBSPAWNER);
+
+    protected static PageStructure dungeonBrick = new PageStructure(new Object[][][]
+        {
+            {
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, null,              null,              null,              null,              null,               Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, null,              null,              null,              null,              null,               Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, null,              null,              Blocks.MOBSPAWNER, null,              chest,              Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+            },
+            {
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+                {Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY, Blocks.BRICK_CLAY,  Blocks.BRICK_CLAY},
+            },
+        }
+    );
+
+    protected static PageStructure dungeonCobble = new PageStructure(new Object[][][]
+        {
+            {
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY,  Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       null,                      null,                      null,                      null,                      null,                       Blocks.COBBLE_STONE_MOSSY},
+                {Blocks.COBBLE_STONE_MOSSY, null,                      null,                      null,                      null,                      null,                       Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       chest,                     null,                      Blocks.MOBSPAWNER,         null,                      null,                       Blocks.COBBLE_STONE_MOSSY},
+                {Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+            },
+            {
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE_MOSSY, Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+                {Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,       Blocks.COBBLE_STONE,        Blocks.COBBLE_STONE},
+            },
+        }
+    );
+
+    public static class PageStructure {
+        private final IconCoordinate[] data;
+        public final int width;
+        public final int height;
+        public final int layers;
+        public PageStructure(Object[][][] structure) {
+            this.layers = structure.length;
+            this.width = structure[0][0].length;
+            this.height = structure[0].length;
+
+            data = new IconCoordinate[width * height * layers];
+            for (int l = 0; l < layers; l++) {
+                for (int x = 0; x < width; x++) {
+                    for (int y = 0; y < height; y++) {
+                        Object o = structure[l][y][x];
+                        IconCoordinate c = null;
+                        if (o instanceof Block) {
+                            c = getTextureFromBlock((Block) o);
+                        } else if (o instanceof IconCoordinate) {
+                            c = (IconCoordinate) o;
+                        }
+                        data[makeIndex(x, y, l)] = c;
+                    }
+                }
+            }
+        }
+        public PageStructure(int width, int height, int layers){
+            this.width = width;
+            this.height = height;
+            this.layers = layers;
+            this.data = new IconCoordinate[width * height * layers];
+        }
+
+        public PageStructure setIcon(IconCoordinate icon, int x, int y, int layer) {
+            if (x < 0 || x >= width || y < 0 || y >= height || layer < 0 || layer >= layers) return this;
+            data[makeIndex(x, y, layer)] = icon;
+            return this;
+        }
+
+        public IconCoordinate getIcon(int x, int y, int layer){
+            if (x < 0 || x >= width || y < 0 || y >= height || layer < 0 || layer >= layers) return null;
+            return data[makeIndex(x, y, layer)];
+        }
+
+        private int makeIndex(int x, int y, int layer) {
+            return x % width + y * width + layer * (width * height);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/achievements/pages/NetherPage.java b/src/main/java/net/minecraft/client/gui/achievements/pages/NetherPage.java
new file mode 100644
index 000000000..4eb6a4090
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/pages/NetherPage.java
@@ -0,0 +1,44 @@
+package net.minecraft.client.gui.achievements.pages;
+
+import net.minecraft.client.gui.achievements.GuiAchievements;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.block.Blocks;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Random;
+
+public class NetherPage extends DefaultPage{
+    public NetherPage() {
+        super("gui.achievements.page.nether", Blocks.NETHERRACK.getDefaultStack());
+    }
+    @Override
+    public @NotNull Achievement onOpenAchievement() {
+        return Achievements.BUILD_PICKAXE;
+    }
+    @Override
+    public IconCoordinate getBackgroundTile(GuiAchievements guiAchievements, int layer, Random random, int tileX, int tileY) {
+        int r = random.nextInt(5);
+        IconCoordinate texture = getTextureFromBlock(Blocks.NETHERRACK);
+        if (r == 0){
+            texture = getTextureFromBlock(Blocks.ORE_NETHERCOAL_NETHERRACK);
+        }
+        return texture;
+    }
+
+    @Override
+    public int lineColorLocked(boolean isHovered) {
+        return 0x002233;
+    }
+
+    @Override
+    public int lineColorUnlocked(boolean isHovered) {
+        return 0x707070;
+    }
+
+    @Override
+    public int lineColorCanUnlock(boolean isHovered) {
+        return 0xff0000;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/achievements/pages/OverworldPage.java b/src/main/java/net/minecraft/client/gui/achievements/pages/OverworldPage.java
new file mode 100644
index 000000000..fa95cd452
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/achievements/pages/OverworldPage.java
@@ -0,0 +1,9 @@
+package net.minecraft.client.gui.achievements.pages;
+
+import net.minecraft.core.block.Blocks;
+
+public class OverworldPage extends DefaultPage{
+    public OverworldPage() {
+        super("gui.achievements.page.overworld", Blocks.GRASS.getDefaultStack());
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java b/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
index bf2fbb3a6..34e983b56 100644
--- a/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
+++ b/src/main/java/net/minecraft/client/gui/createworld/ButtonComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.createworld;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiTexturedButton;
 import net.minecraft.client.gui.paged.PageComponent;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
@@ -26,7 +25,8 @@ public abstract class ButtonComponent
     public ButtonComponent(String translationKey)
     {
         this.translationKey = translationKey;
-        this.resetButton = new GuiTexturedButton(0, "/assets/minecraft/textures/gui/gui.png", 0, 0, 40, 86, 20, 20);
+        this.resetButton = new GuiButton(0, 0, 0, 20, 20, "")
+            .setTextures("minecraft:gui/misc/icon_reset", "minecraft:gui/misc/icon_reset_highlighted", "minecraft:gui/misc/icon_reset");
     }
 
     public abstract void resetValue();
diff --git a/src/main/java/net/minecraft/client/gui/createworld/CreateWorldPageRegistry.java b/src/main/java/net/minecraft/client/gui/createworld/CreateWorldPageRegistry.java
index 58ce059ee..0465ce016 100644
--- a/src/main/java/net/minecraft/client/gui/createworld/CreateWorldPageRegistry.java
+++ b/src/main/java/net/minecraft/client/gui/createworld/CreateWorldPageRegistry.java
@@ -3,6 +3,7 @@ package net.minecraft.client.gui.createworld;
 import net.minecraft.client.gui.paged.Page;
 import net.minecraft.client.gui.paged.PageRegistry;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 
 public class CreateWorldPageRegistry
@@ -13,9 +14,9 @@ public class CreateWorldPageRegistry
         return INSTANCE;
     }
 
-    public static final Page GENERAL = INSTANCE.register(new Page("gui.create_world.pages.general.title", new ItemStack(Item.map)))
+    public static final Page GENERAL = INSTANCE.register(new Page("gui.create_world.pages.general.title", new ItemStack(Items.MAP)))
         .withComponent(new TextFieldComponent("gui.create_world.pages.general.label.world_name"))
         .withComponent(new TextFieldComponent("gui.create_world.pages.general.label.world_seed"));
-    public static final Page WORLD_SETTINGS = INSTANCE.register(new Page("gui.create_world.pages.world_settings.title", new ItemStack(Item.dustRedstone)));
-    public static final Page GAME_RULES = INSTANCE.register(new Page("gui.create_world.pages.game_rules.title", new ItemStack(Item.book)));
+    public static final Page WORLD_SETTINGS = INSTANCE.register(new Page("gui.create_world.pages.world_settings.title", new ItemStack(Items.DUST_REDSTONE)));
+    public static final Page GAME_RULES = INSTANCE.register(new Page("gui.create_world.pages.game_rules.title", new ItemStack(Items.BOOK)));
 }
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java b/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
index e1f9157ce..e78e5077d 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
@@ -16,6 +16,7 @@ import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
@@ -23,6 +24,7 @@ import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL12;
 
 import java.util.List;
+import java.util.Random;
 
 public class GuiGuidebook
     extends GuiScreen {
@@ -41,6 +43,9 @@ public class GuiGuidebook
     private final GuiTooltip tooltip = new GuiTooltip(Minecraft.getMinecraft(this));
     private Tab[] tabs = new Tab[TABS_PER_SIDE * 2];
 
+    private GuidebookPage lastPage = null;
+    private boolean canPlaySound = true;
+
     public GuiGuidebook() {
         super();
 
@@ -137,6 +142,7 @@ public class GuiGuidebook
 
     @Override
     public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) {
+        lastPage = pageManager.getLeftPage();
         scroll(Mouse.getDWheel());
 
         int xOffset = 0;
@@ -166,6 +172,7 @@ public class GuiGuidebook
             }
         }
         pageManager.offsetPage(MathHelper.clamp(-direction, -1, 1) * 2 * count);
+        playPageSound();
         updateTabList();
     }
 
@@ -176,11 +183,13 @@ public class GuiGuidebook
         // Handle back button
         if (mouseButton == 3) {
             pageManager.goBack();
+            playPageSound();
             updateTabList();
             return;
         }
         if (mouseButton == 4) {
             pageManager.goForward();
+            playPageSound();
             updateTabList();
             return;
         }
@@ -203,11 +212,13 @@ public class GuiGuidebook
         if (pageManager.getLeftPage() != null && pageManager.hasPreviousPage()) {
             if (mouseX >= left && mouseX <= left + size && mouseY >= top && mouseY <= top + size) {
                 pageManager.offsetPage(-2);
+                playPageSound();
                 updateTabList();
                 return;
             }
             if (mouseX >= left && mouseX <= left + size && mouseY >= bottom - size && mouseY <= bottom) {
                 pageManager.offsetPage(-2);
+                playPageSound();
                 updateTabList();
                 return;
             }
@@ -215,11 +226,13 @@ public class GuiGuidebook
         if (pageManager.getRightPage() != null && pageManager.hasNextPage()) {
             if (mouseX >= right - size && mouseX <= right && mouseY >= top && mouseY <= top + size) {
                 pageManager.offsetPage(2);
+                playPageSound();
                 updateTabList();
                 return;
             }
             if (mouseX >= right - size && mouseX <= right && mouseY >= bottom - size && mouseY <= bottom) {
                 pageManager.offsetPage(2);
+                playPageSound();
                 updateTabList();
                 return;
             }
@@ -280,11 +293,20 @@ public class GuiGuidebook
             if (tab == null) return;
             if (tab.mouseOver(mouseX, mouseY)) {
                 pageManager.setCurrentPage(pageManager.getSectionIndex(tab.getSection()), true);
+                playPageSound();
                 updateTabList();
                 return;
             }
         }
     }
+
+    private void playPageSound() {
+        if (!canPlaySound || lastPage == pageManager.getLeftPage()) return;
+        canPlaySound = false;
+        Random r = new Random();
+        mc.sndManager.playSound("random.page", SoundCategory.GUI_SOUNDS, 0.8f, 0.9f + (r.nextFloat() - r.nextFloat()) * 0.1f);
+    }
+
     public void guiSpecificControllerInput(ControllerInput controller){
         if (controller.digitalPad.left.pressedThisFrame() || (controller.digitalPad.left.isPressed() && controller.digitalPad.left.getHoldTime() % 4 == 0)){
             pageManager.offsetPage(-2);
@@ -294,7 +316,7 @@ public class GuiGuidebook
             pageManager.offsetPage(2);
             updateTabList();
         }
-        if (controller.buttonR.pressedThisFrame()){
+        if (controller.buttonRightShoulder.pressedThisFrame()){
             Tab t = getTab(pageManager.getCurrentSection(), true);
             if (t != null){
                 int currentPage = pageManager.getPageIndex(pageManager.getLeftPage());
@@ -305,7 +327,7 @@ public class GuiGuidebook
                 updateTabList();
             }
         }
-        if (controller.buttonL.pressedThisFrame()){
+        if (controller.buttonLeftShoulder.pressedThisFrame()){
             Tab t = getTab(pageManager.getCurrentSection(), false);
             if (t != null){
                 int currentPage = pageManager.getPageIndex(pageManager.getLeftPage());
@@ -346,6 +368,8 @@ public class GuiGuidebook
     public void tick() {
         super.tick();
 
+        canPlaySound = true;
+
         if (pageManager.getLeftPage() != null) {
             pageManager.getLeftPage().onTick();
         }
@@ -434,7 +458,7 @@ public class GuiGuidebook
         int left = width / 2 - xSize / 2 + xOffset;
         int right = width / 2 + xSize / 2 + xOffset;
 
-        mc.renderEngine.bindTexture(mc.renderEngine.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        mc.renderEngine.bindTexture(mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
 
         GL11.glColor4f(1, 1, 1, 1);
         if (pageManager.getLeftPage() != null && pageManager.hasPreviousPage()) {
@@ -493,7 +517,7 @@ public class GuiGuidebook
         public void render(RenderEngine re, FontRenderer fr, int mouseX, int mouseY) {
             boolean mouseOver = mouseOver(mouseX, mouseY);
 
-            re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+            re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
 
             int xo = 16;
             if (mouseOver || active) {
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java b/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
index 796332b4e..e3bad2858 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
@@ -21,7 +21,7 @@ public abstract class GuidebookPage
 
     protected void renderBackground(RenderEngine re, int x, int y) {
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
         drawTexturedModalRect(x, y, 0, 0, width, height);
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/GuidebookSections.java b/src/main/java/net/minecraft/client/gui/guidebook/GuidebookSections.java
index f62b658c5..bf32c9e2f 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/GuidebookSections.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/GuidebookSections.java
@@ -9,6 +9,7 @@ import net.minecraft.client.gui.guidebook.smelting.BlastSmeltingSection;
 import net.minecraft.client.gui.guidebook.smelting.SmeltingSection;
 import net.minecraft.client.gui.guidebook.trommeling.TrommelSection;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
 
 import java.util.ArrayList;
@@ -36,9 +37,9 @@ public abstract class GuidebookSections {
         INDEX = register(new IndexSection());
         SEARCH = register(new SearchSection());
         CRAFTING = register(new CraftingSection());
-        FURNACE = register(new SmeltingSection("guidebook.section.furnace", new ItemStack(Block.furnaceStoneActive), 0x606060, 0x404040));
-        BLAST_FURNACE = register(new BlastSmeltingSection("guidebook.section.blast_furnace", new ItemStack(Block.furnaceBlastActive), 0xA0A0A0, 0x808080));
-        TROMMEL = register(new TrommelSection("guidebook.section.trommel", new ItemStack(Block.trommelActive), 0x202020, 0x404040));
+        FURNACE = register(new SmeltingSection("guidebook.section.furnace", new ItemStack(Blocks.FURNACE_STONE_ACTIVE), 0x606060, 0x404040));
+        BLAST_FURNACE = register(new BlastSmeltingSection("guidebook.section.blast_furnace", new ItemStack(Blocks.FURNACE_BLAST_ACTIVE), 0xA0A0A0, 0x808080));
+        TROMMEL = register(new TrommelSection("guidebook.section.trommel", new ItemStack(Blocks.TROMMEL_ACTIVE), 0x202020, 0x404040));
         MOB = register(new MobSection());
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverPage.java b/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverPage.java
index ee980c743..ddc897956 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverPage.java
@@ -19,7 +19,7 @@ public class CoverPage
 
     @Override
     public void renderBackground(RenderEngine re, int x, int y) {
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/cover.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/cover.png"));
         drawTexturedModalRect(x, y, 0, 0, 158, 220);
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverSection.java b/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverSection.java
index 596dbd3ec..642e40d8c 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/cover/CoverSection.java
@@ -3,6 +3,7 @@ package net.minecraft.client.gui.guidebook.cover;
 import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.GuidebookSection;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
 
 import java.util.ArrayList;
@@ -13,7 +14,7 @@ public class CoverSection
     private final List<GuidebookPage> pages = new ArrayList<>();
 
     public CoverSection() {
-        super("guidebook.section.cover", new ItemStack(Block.motionsensorActive), 0xA42D29, 0xC29B1C);
+        super("guidebook.section.cover", new ItemStack(Blocks.MOTION_SENSOR_ACTIVE), 0xA42D29, 0xC29B1C);
 
         pages.add(new CoverPage(this));
     }
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
index 3c5101454..ac8937515 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingPage.java
@@ -12,15 +12,15 @@ import net.minecraft.client.gui.guidebook.RecipePage;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
@@ -33,12 +33,12 @@ public class CraftingPage
     extends RecipePage<RecipeEntryCrafting<?,?>> {
     public static final int RECIPES_PER_PAGE = 3;
 
-    public List<SlotGuidebook> slots;
-    public Map<RecipeEntryCrafting<?,?>,List<SlotGuidebook>> map;
+    public List<GuidebookSlot> slots;
+    public Map<RecipeEntryCrafting<?,?>,List<GuidebookSlot>> map;
     private final GuiTooltip guiTooltip;
     private final GuiRenderItem guiRenderItem;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
-    private static EntityPlayer player;
+    private static Player player;
     private static long ticks = 0;
 
     public CraftingPage(GuidebookSection section, List<RecipeEntryCrafting<?,?>> recipes) {
@@ -47,14 +47,14 @@ public class CraftingPage
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
         player = mc.thePlayer;
-        player.addStat(AchievementList.OPEN_GUIDEBOOK,1);
+        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         guiTooltip = new GuiTooltip(mc);
         guiRenderItem = new GuiRenderItem(mc);
         int recipeAmount = 0;
         int xOffset = 32;
         int yOffset = 12;
         for (RecipeEntryCrafting<?,?> recipe : recipes) {
-            List<SlotGuidebook> recipeSlots = new ArrayList<>();
+            List<GuidebookSlot> recipeSlots = new ArrayList<>();
             if (recipe instanceof RecipeEntryCraftingShaped)
             {
                 final RecipeEntryCraftingShaped r = (RecipeEntryCraftingShaped) recipe;
@@ -71,17 +71,17 @@ public class CraftingPage
 
                         if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
                         {
-                            recipeSlots.add(new SlotGuidebook(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
                         }
                         else
                         {
                             RecipeSymbol stack = r.getInput()[slotX + (slotY * r.recipeWidth)];
-                            recipeSlots.add(new SlotGuidebook(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
                         }
                     }
 
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).yDisplayPosition + recipeSlots.get(recipeSlots.size()-8).yDisplayPosition) / 2;
-                    recipeSlots.add(new SlotGuidebook(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput().copy()), false,recipe).setAsOutput());
+                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput().copy()), false,recipe).setAsOutput());
 
                     map.put(recipe,recipeSlots);
                     slots.addAll(recipeSlots);
@@ -99,17 +99,17 @@ public class CraftingPage
 
                         if (slotX >= r.recipeWidth || slotY >= r.recipeHeight)
                         {
-                            recipeSlots.add(new SlotGuidebook(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
                         }
                         else
                         {
                             RecipeSymbol stack = r.getInput()[slotX + (slotY * r.recipeWidth)];
-                            recipeSlots.add(new SlotGuidebook(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
                         }
                     }
 
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).yDisplayPosition + recipeSlots.get(recipeSlots.size()-3).yDisplayPosition) / 2;
-                    recipeSlots.add(new SlotGuidebook(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
+                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
 
                     map.put(recipe,recipeSlots);
                     slots.addAll(recipeSlots);
@@ -130,15 +130,15 @@ public class CraftingPage
                     for (int i = 0; i < Math.max(r.getInput().size(),9); i++)
                     {
                         if(i >= r.getInput().size()){
-                            recipeSlots.add(new SlotGuidebook(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe));
                             continue;
                         }
                         RecipeSymbol stack = r.getInput().get(i);
-                        recipeSlots.add(new SlotGuidebook(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
+                        recipeSlots.add(new GuidebookSlot(i, 1 + 18 * (i % 3) + xOffset, 1 + 18 * ((i / 3)+recipeAmount*3) + yOffset, stack, false,recipe));
                     }
 
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).yDisplayPosition + recipeSlots.get(recipeSlots.size()-8).yDisplayPosition) / 2;
-                    recipeSlots.add(new SlotGuidebook(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
+                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
 
                     map.put(recipe,recipeSlots);
                     slots.addAll(recipeSlots);
@@ -151,15 +151,15 @@ public class CraftingPage
                     for (int i = 0; i < Math.max(r.getInput().size(),4); i++)
                     {
                         if(i >= r.getInput().size()){
-                            recipeSlots.add(new SlotGuidebook(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
+                            recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, null, false,recipe));
                             continue;
                         }
                         RecipeSymbol stack = r.getInput().get(i);
-                        recipeSlots.add(new SlotGuidebook(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
+                        recipeSlots.add(new GuidebookSlot(i, 13 + 18 * (i % 2) + xOffset, 10 + 18 * ((i / 2)+recipeAmount*3) + yOffset, stack, false,recipe));
                     }
 
-                    int centerY = (recipeSlots.get(recipeSlots.size()-1).yDisplayPosition + recipeSlots.get(recipeSlots.size()-3).yDisplayPosition) / 2;
-                    recipeSlots.add(new SlotGuidebook(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
+                    int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-3).y) / 2;
+                    recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 81 + xOffset, centerY, new RecipeSymbol(r.getOutput()), false,recipe).setAsOutput());
 
                     map.put(recipe,recipeSlots);
                     slots.addAll(recipeSlots);
@@ -176,9 +176,9 @@ public class CraftingPage
         if(recipes.isEmpty()){
             drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
         }
-        SlotGuidebook mouseOverSlot = null;
+        GuidebookSlot mouseOverSlot = null;
         ticks++;
-        for (SlotGuidebook slot : slots) {
+        for (GuidebookSlot slot : slots) {
             if(slot.item != null){
                 if(!slot.isOutput) slot.item.stackSize = 1;
             }
@@ -188,28 +188,28 @@ public class CraftingPage
                     ticks = 0;
                 }
             }
-            drawSlot(re,x+slot.xDisplayPosition-1,y+slot.yDisplayPosition-1,0xFFFFFFFF);
+            drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
-            guiRenderItem.render(slot.getStack(),x+slot.xDisplayPosition,y+slot.yDisplayPosition,mouseOverSlot == slot,slot);
+            guiRenderItem.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
         }
     }
 
     public boolean getIsMouseOverSlot(final Slot slot, int x, int y, int mouseX, int mouseY)
     {
-        return mouseX >= x+slot.xDisplayPosition - 1 && mouseX < x+slot.xDisplayPosition + 16 + 1 && mouseY >= y+slot.yDisplayPosition - 1 && mouseY < y+slot.yDisplayPosition + 16 + 1;
+        return mouseX >= x+slot.x - 1 && mouseX < x+slot.x + 16 + 1 && mouseY >= y+slot.y - 1 && mouseY < y+slot.y + 16 + 1;
     }
 
     @Override
     public void keyTyped(char c, int key, int x, int y, int mouseX, int mouseY) {
         super.keyTyped(c, key, x, y, mouseX, mouseY);
         if(mc.gameSettings.keyShowRecipe.isKeyboardKey(key)){
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null){
-                if(hoveringSlot.hasStack()){
-                    String query = "r:"+hoveringSlot.getStack().getDisplayName()+"!";
+                if(hoveringSlot.hasItem()){
+                    String query = "r:"+hoveringSlot.getItem().getDisplayName()+"!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -217,13 +217,13 @@ public class CraftingPage
                 }
             }
         } else if (mc.gameSettings.keyShowUsage.isKeyboardKey(key)) {
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null) {
-                if (hoveringSlot.hasStack()) {
-                    String query = "u:" + hoveringSlot.getStack().getDisplayName() + "!";
+                if (hoveringSlot.hasItem()) {
+                    String query = "u:" + hoveringSlot.getItem().getDisplayName() + "!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -242,25 +242,25 @@ public class CraftingPage
     @Override
     protected void renderBackground(RenderEngine re, int x, int y) {
         super.renderBackground(re, x, y);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
         for (int i = 1; i <= recipes.size(); i++) {
             RecipeEntryCrafting<?, ?> recipe = recipes.get(i-1);
-            List<SlotGuidebook> list = map.get(recipe);
-            drawTexturedModalRect(x + list.get(list.size()-1).xDisplayPosition - 25, y +  list.get(list.size()-1).yDisplayPosition, 234, 0, 22, 15);
+            List<GuidebookSlot> list = map.get(recipe);
+            drawTexturedModalRect(x + list.get(list.size()-1).x - 25, y +  list.get(list.size()-1).y, 234, 0, 22, 15);
         }
     }
 
     @Override
     protected void renderOverlay(RenderEngine re, FontRenderer fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         super.renderOverlay(re, fr, x, y, mouseX, mouseY, partialTicks);
-        SlotGuidebook mouseOverSlot = null;
-        for (SlotGuidebook slot : slots) {
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if (mouseOverSlot != null && mouseOverSlot.hasStack())
+            if (mouseOverSlot != null && mouseOverSlot.hasItem())
             {
                 boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-                String str = guiTooltip.getTooltipText(mouseOverSlot.getStack(), showDescription, mouseOverSlot);
+                String str = guiTooltip.getTooltipText(mouseOverSlot.getItem(), showDescription, mouseOverSlot);
                 if(!str.isEmpty())
                 {
                     guiTooltip.render(str, mouseX, mouseY, 8, -8);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
index f090884d0..9eb0887f0 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/crafting/CraftingSection.java
@@ -2,9 +2,9 @@ package net.minecraft.client.gui.guidebook.crafting;
 
 import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.SearchableGuidebookSection;
-import net.minecraft.client.gui.guidebook.smelting.SmeltingPage;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShaped;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingShapeless;
@@ -23,7 +23,7 @@ public class CraftingSection
     private Pair<String,List<GuidebookPage>> filteredPages = null;
 
     public CraftingSection() {
-        super("guidebook.section.crafting", new ItemStack(Block.workbench), 0xA86335, 0xA52922);
+        super("guidebook.section.crafting", new ItemStack(Blocks.WORKBENCH), 0xA86335, 0xA52922);
         reloadRecipes();
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/index/IndexSection.java b/src/main/java/net/minecraft/client/gui/guidebook/index/IndexSection.java
index a5ac3ef7f..f65914977 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/index/IndexSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/index/IndexSection.java
@@ -3,8 +3,8 @@ package net.minecraft.client.gui.guidebook.index;
 import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.GuidebookSection;
 import net.minecraft.client.gui.guidebook.GuidebookSections;
-import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 
 import java.util.ArrayList;
@@ -16,7 +16,7 @@ public class IndexSection
     private ArrayList<GuidebookPage> indexPages = null;
 
     public IndexSection() {
-        super("guidebook.section.index", new ItemStack(Item.toolCompass), 0x0094FF, 0xC29B1C);
+        super("guidebook.section.index", new ItemStack(Items.TOOL_COMPASS), 0x0094FF, 0xC29B1C);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobInfoRegistry.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobInfoRegistry.java
index 66ac1f5bb..1eda5e312 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobInfoRegistry.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobInfoRegistry.java
@@ -2,11 +2,12 @@ package net.minecraft.client.gui.guidebook.mobs;
 
 import net.minecraft.client.render.EntityRenderDispatcher;
 import net.minecraft.client.render.entity.EntityRenderer;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.animal.*;
 import net.minecraft.core.entity.monster.*;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 
 import java.util.*;
@@ -29,148 +30,148 @@ public abstract class MobInfoRegistry {
     }
 
     static {
-        register(EntityPig.class,
+        register(PigMob.class,
             "guidebook.section.mob.pig.name",
             "guidebook.section.mob.pig.desc",
             10,
             10,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.foodPorkchopRaw), 1.0F, 1, 2)
+                new MobDrop(new ItemStack(Items.FOOD_PORKCHOP_RAW), 1.0F, 1, 2)
             }
         );
-        register(EntitySheep.class,
+        register(SheepMob.class,
             "guidebook.section.mob.sheep.name",
             "guidebook.section.mob.sheep.desc",
             10,
             10,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Block.wool), 1.0F, 1, 1)
+                new MobDrop(new ItemStack(Blocks.WOOL), 1.0F, 1, 1)
             }
         );
-        register(EntityCow.class,
+        register(CowMob.class,
             "guidebook.section.mob.cow.name",
             "guidebook.section.mob.cow.desc",
             10,
             10,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.leather), 1.0F, 1, 5)
+                new MobDrop(new ItemStack(Items.LEATHER), 1.0F, 1, 5)
             }
         );
-        register(EntityChicken.class,
+        register(ChickenMob.class,
             "guidebook.section.mob.chicken.name",
             "guidebook.section.mob.chicken.desc",
             4,
             10,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.featherChicken), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.FEATHER_CHICKEN), 0.66f, 1, 2)
             }
         );
-        register(EntitySquid.class,
+        register(SquidMob.class,
             "guidebook.section.mob.squid.name",
             "guidebook.section.mob.squid.desc",
             10,
             10,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.dye, 1, 0), 1.0F, 1, 3)
+                new MobDrop(new ItemStack(Items.DYE, 1, 0), 1.0F, 1, 3)
             }
         );
-        register(EntityWolf.class,
+        register(WolfMob.class,
             "guidebook.section.mob.wolf.name",
             "guidebook.section.mob.wolf.desc",
             8,
             500,
             null
         );
-        register(EntityFireflyCluster.class,
+        register(FireflyClusterMob.class,
             "guidebook.section.mob.firefly_cluster.name",
             "guidebook.section.mob.firefly_cluster.desc",
             -1,
             -1,
             null
         );
-        register(EntityZombie.class,
+        register(ZombieMob.class,
             "guidebook.section.mob.zombie.name",
             "guidebook.section.mob.zombie.desc",
             20,
             300,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.cloth), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.CLOTH), 0.66f, 1, 2)
             }
         );
-        register(EntityArmoredZombie.class,
+        register(ZombieArmoredMob.class,
             "guidebook.section.mob.armored_zombie.name",
             "guidebook.section.mob.armored_zombie.desc",
             40,
             1000,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.cloth), 1.0F, 1, 2),
-                new MobDrop(new ItemStack(Item.chainlink), 0.8f, 1, 4)
+                new MobDrop(new ItemStack(Items.CLOTH), 1.0F, 1, 2),
+                new MobDrop(new ItemStack(Items.CHAINLINK), 0.8f, 1, 4)
             }
         );
-        register(EntitySnowman.class,
+        register(SnowmanMob.class,
             "guidebook.section.mob.snowman.name",
             "guidebook.section.mob.snowman.desc",
             20,
             300,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.ammoSnowball), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.AMMO_SNOWBALL), 0.66f, 1, 2)
             }
         );
-        register(EntityCreeper.class,
+        register(CreeperMob.class,
             "guidebook.section.mob.creeper.name",
             "guidebook.section.mob.creeper.desc",
             20,
             800,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.sulphur), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.SULPHUR), 0.66f, 1, 2)
             }
         );
-        register(EntitySkeleton.class,
+        register(SkeletonMob.class,
             "guidebook.section.mob.skeleton.name",
             "guidebook.section.mob.skeleton.desc",
             20,
             500,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.bone), 0.66f, 1, 2),
-                new MobDrop(new ItemStack(Item.ammoArrow), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.BONE), 0.66f, 1, 2),
+                new MobDrop(new ItemStack(Items.AMMO_ARROW), 0.66f, 1, 2)
             }
         );
-        register(EntitySpider.class,
+        register(SpiderMob.class,
             "guidebook.section.mob.spider.name",
             "guidebook.section.mob.spider.desc",
             20,
             200,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.string), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.STRING), 0.66f, 1, 2)
             }
         );
-        register(EntitySlime.class,
+        register(SlimeMob.class,
             "guidebook.section.mob.slime.name",
             "guidebook.section.mob.slime.desc",
             -1,
             100,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.slimeball), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.SLIMEBALL), 0.66f, 1, 2)
             }
         );
-        register(EntityGhast.class,
+        register(GhastMob.class,
             "guidebook.section.mob.ghast.name",
             "guidebook.section.mob.ghast.desc",
             20,
             1000,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.sulphur), 0.66f, 1, 2)
+                new MobDrop(new ItemStack(Items.SULPHUR), 0.66f, 1, 2)
             }
         );
-        register(EntityPigZombie.class,
+        register(ZombiePigMob.class,
             "guidebook.section.mob.zombie_pigman.name",
             "guidebook.section.mob.zombie_pigman.desc",
             20,
             500,
             new MobDrop[] {
-                new MobDrop(new ItemStack(Item.foodPorkchopRaw), 0.45f * 0.66f, 1, 2),
-                new MobDrop(new ItemStack(Item.oreRawGold), 0.04f * 0.66f, 1, 2),
-                new MobDrop(new ItemStack(Item.toolSwordGold), 0.01f * 0.66f, 1, 1)
+                new MobDrop(new ItemStack(Items.FOOD_PORKCHOP_RAW), 0.45f * 0.66f, 1, 2),
+                new MobDrop(new ItemStack(Items.ORE_RAW_GOLD), 0.04f * 0.66f, 1, 2),
+                new MobDrop(new ItemStack(Items.TOOL_SWORD_GOLD), 0.01f * 0.66f, 1, 1)
             }
         );
     }
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
index 4de8c09ff..fd44d2cd8 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
@@ -7,17 +7,17 @@ import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.GuidebookSection;
 import net.minecraft.client.render.*;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.Global;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import net.minecraft.core.world.World;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
@@ -29,11 +29,11 @@ public class MobPage
     extends GuidebookPage {
     private final Class<? extends Entity> mobClass;
     private final MobInfoRegistry.MobInfo mobInfo;
-    private final EntityLiving example;
+    private final Mob example;
     private String[] descLines;
     private String[] unknownDescLines;
-    private List<SlotGuidebook> slots;
-    private Map<MobInfoRegistry.MobDrop, SlotGuidebook> dropSlotMap;
+    private List<GuidebookSlot> slots;
+    private Map<MobInfoRegistry.MobDrop, GuidebookSlot> dropSlotMap;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
     private static final GuiRenderItem guiRenderItem = new GuiRenderItem(mc);
     private static final GuiTooltip guiTooltip = new GuiTooltip(mc);
@@ -46,9 +46,9 @@ public class MobPage
 
         this.mobClass = mobClass;
         this.mobInfo = mobInfo;
-        EntityLiving example = null;
+        Mob example = null;
         try {
-            example = (EntityLiving) mobClass.getConstructor(World.class).newInstance((Object)null);
+            example = (Mob) mobClass.getConstructor(World.class).newInstance((Object)null);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -60,7 +60,7 @@ public class MobPage
             dropSlotMap = new HashMap<>();
             for (int i = 0; i < mobInfo.getDrops().length; i++) {
                 MobInfoRegistry.MobDrop drop = mobInfo.getDrops()[i];
-                SlotGuidebook slot = new SlotGuidebook(i, 0, 0, new RecipeSymbol(drop.getStack()), false, null);
+                GuidebookSlot slot = new GuidebookSlot(i, 0, 0, new RecipeSymbol(drop.getStack()), false, null);
                 slots.add(slot);
                 dropSlotMap.put(drop, slot);
             }
@@ -99,7 +99,7 @@ public class MobPage
     @Override
     protected void renderBackground(RenderEngine re, int x, int y) {
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/mob.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/mob.png"));
         drawTexturedModalRect(x, y, 0, 0, 158, 220);
     }
 
@@ -139,10 +139,9 @@ public class MobPage
                         drawStringNoShadow(fr, i18n.translateKey("guidebook.section.mob.health"), x + 66, yOffset, 0x505050);
                         yOffset += 6;
                         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-                        GL11.glBindTexture(GL11.GL_TEXTURE_2D, re.getTexture("/assets/minecraft/textures/gui/icons.png"));
                         yOffset += 4;
-                        drawTexturedModalRect(x + 66, yOffset, 16, 0, 9, 9);
-                        drawTexturedModalRect(x + 66, yOffset, 52, 0, 9, 9);
+                        drawGuiIcon(x + 66, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/container"));
+                        drawGuiIcon(x + 66, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/full"));
                         drawStringNoShadow(fr, "x "+mobInfo.getHealth()/2, x + 66 + 12, yOffset, 0x505050);
 
                     } else {
@@ -150,17 +149,16 @@ public class MobPage
                         drawStringNoShadow(fr, i18n.translateKey("guidebook.section.mob.health"), x + 66, yOffset, 0x505050);
                         yOffset += 6;
                         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-                        GL11.glBindTexture(GL11.GL_TEXTURE_2D, re.getTexture("/assets/minecraft/textures/gui/icons.png"));
                         for (int i = 0; i < mobInfo.getHealth() / 2; i++) {
                             if (i % 10 == 0) {
                                 yOffset += 4;
                             }
-                            drawTexturedModalRect(x + 66 + (i % 10) * 8, yOffset, 16, 0, 9, 9);
-                            drawTexturedModalRect(x + 66 + (i % 10) * 8, yOffset, 52, 0, 9, 9);
+                            drawGuiIcon(x + 66 + (i % 10) * 8, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/container"));
+                            drawGuiIcon(x + 66 + (i % 10) * 8, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/full"));
                         }
                         if (mobInfo.getHealth() % 2 == 1) {
-                            drawTexturedModalRect(x + 66 + ((mobInfo.getHealth() / 2) % 10) * 8, yOffset, 16, 0, 9, 9);
-                            drawTexturedModalRect(x + 66 + ((mobInfo.getHealth() / 2) % 10) * 8, yOffset, 61, 0, 9, 9);
+                            drawGuiIcon(x + 66 + ((mobInfo.getHealth() / 2) % 10) * 8, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/container"));
+                            drawGuiIcon(x + 66 + ((mobInfo.getHealth() / 2) % 10) * 8, yOffset, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/half"));
                         }
                     }
                 }
@@ -186,15 +184,15 @@ public class MobPage
                     drawStringNoShadow(fr, i18n.translateKey("guidebook.section.mob.drops"), x + 8, yOffset, 0x000000);
                     yOffset += 12;
                     for (int i = 0; i < mobInfo.getDrops().length; i++) {
-                        SlotGuidebook slot = slots.get(i);
-                        slot.xDisplayPosition = 7 + (i % 7) * 21;
-                        slot.yDisplayPosition = (yOffset - y) + (i / 7) * 20;
+                        GuidebookSlot slot = slots.get(i);
+                        slot.x = 7 + (i % 7) * 21;
+                        slot.y = (yOffset - y) + (i / 7) * 20;
                         MobInfoRegistry.MobDrop drop = mobInfo.getDrops()[i];
                         boolean mouseOver = getIsMouseOverSlot(slot, x, y, mouseX, mouseY);
-                        drawSlot(re, x + 7 + (i % 7) * 21, yOffset + (i / 7) * 20, 0xFFFFFFFF);
+                        drawSlot(x + 7 + (i % 7) * 21, yOffset + (i / 7) * 20, 0xFFFFFFFF);
                         GL11.glPushMatrix();
                         GL11.glTranslatef(0, 0, 50f);
-                        guiRenderItem.render(slot.getStack(), x + 8 + (i % 7) * 21, yOffset + 1 + (i / 7) * 20, mouseOver, slot);
+                        guiRenderItem.render(slot.getItem(), x + 8 + (i % 7) * 21, yOffset + 1 + (i / 7) * 20, mouseOver, slot);
                         GL11.glPopMatrix();
                         if (slot.getIsDiscovered(mc.thePlayer)) {
                             String amountString = drop.getMinAmount() == drop.getMaxAmount() ? String.valueOf(drop.getMinAmount()) : drop.getMinAmount() + "-" + drop.getMaxAmount();
@@ -222,15 +220,15 @@ public class MobPage
         if (discovered) {
             if (mouseX > x + 9 && mouseX < x + 9 + 52 && mouseY > y + 9 && mouseY < y + 9 + 70) {
                 // TODO possibly replace with a function to be called inside the Entity itself?
-                int highestSkinVariant = Global.accessor.getSkinVariantList().getNumSkinsForEntity(mobClass) - 1;
-                if (highestSkinVariant > 0) {
-                    int newSkinVariant = (example.getSkinVariant() + 1) % (highestSkinVariant + 1);
-                    example.setSkinVariant(newSkinVariant);
-                }
-                if (example instanceof EntityFireflyCluster){
-                    EntityFireflyCluster.FireflyColor color = EntityFireflyCluster.FireflyColor.fireFlyColors.get(
-                            ((EntityFireflyCluster) example).getColor().getId() + 1 % EntityFireflyCluster.FireflyColor.fireFlyColors.size());
-                    ((EntityFireflyCluster) example).setColor(color == null ? EntityFireflyCluster.FireflyColor.GREEN : color);
+//                int highestSkinVariant = Global.accessor.getSkinVariantList().getNumSkinsForEntity(mobClass) - 1;
+//                if (highestSkinVariant > 0) {
+//                    int newSkinVariant = (example.getSkinVariant() + 1) % (highestSkinVariant + 1);
+//                    example.setSkinVariant(newSkinVariant);
+//                }
+                if (example instanceof FireflyClusterMob){
+                    FireflyClusterMob.FireflyColor color = FireflyClusterMob.FireflyColor.fireFlyColors.get(
+                            ((FireflyClusterMob) example).getColor().getId() + 1 % FireflyClusterMob.FireflyColor.fireFlyColors.size());
+                    ((FireflyClusterMob) example).setColor(color == null ? FireflyClusterMob.FireflyColor.GREEN : color);
                 }
                 String livingSound = example.getLivingSound();
                 if (livingSound != null) {
@@ -269,7 +267,7 @@ public class MobPage
         Lighting.enableLight();
         GL11.glRotatef(-135F, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(-(float)Math.atan(f6 / 40F) * 20F, 1.0F, 0.0F, 0.0F);
-        example.renderYawOffset = (float)Math.atan(f5 / 40F) * 20F;
+        example.yBodyRot = (float)Math.atan(f5 / 40F) * 20F;
         example.yRot = (float)Math.atan(f5 / 40F) * 40F;
         example.xRot = -(float)Math.atan(f6 / 40F) * 20F;
         example.entityBrightness = 1.0F;
@@ -278,7 +276,7 @@ public class MobPage
         EntityRenderDispatcher.instance.renderEntityPreviewWithPosYaw(Tessellator.instance, example, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F);
         GL11.glPopMatrix();
         Lighting.disable();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glDisable(GL11.GL_DEPTH_TEST);
 
         Scissor.disable();
@@ -288,14 +286,14 @@ public class MobPage
     protected void renderOverlay(RenderEngine re, FontRenderer fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         super.renderOverlay(re, fr, x, y, mouseX, mouseY, partialTicks);
         if (slots == null) return;
-        SlotGuidebook mouseOverSlot = null;
-        for (SlotGuidebook slot : slots) {
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if (mouseOverSlot != null && mouseOverSlot.hasStack())
+            if (mouseOverSlot != null && mouseOverSlot.hasItem())
             {
                 boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-                String str = guiTooltip.getTooltipText(mouseOverSlot.getStack(), showDescription, mouseOverSlot);
+                String str = guiTooltip.getTooltipText(mouseOverSlot.getItem(), showDescription, mouseOverSlot);
                 if(!str.isEmpty())
                 {
                     guiTooltip.render(str, mouseX, mouseY, 8, -8);
@@ -307,7 +305,7 @@ public class MobPage
 
     public boolean getIsMouseOverSlot(final Slot slot, int x, int y, int mouseX, int mouseY)
     {
-        return mouseX >= x+slot.xDisplayPosition - 1 && mouseX < x+slot.xDisplayPosition + 16 + 1 && mouseY >= y+slot.yDisplayPosition - 1 && mouseY < y+slot.yDisplayPosition + 16 + 1;
+        return mouseX >= x+slot.x - 1 && mouseX < x+slot.x + 16 + 1 && mouseY >= y+slot.y - 1 && mouseY < y+slot.y + 16 + 1;
     }
 
 }
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
index c0f43b63f..88fed6e73 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
@@ -9,6 +9,7 @@ import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.gamemode.Gamemode;
@@ -24,7 +25,7 @@ public class MobSection
     private final List<GuidebookSection.Index> indices = new ArrayList<>();
     private Pair<String,List<GuidebookPage>> filteredPages = null;
     public MobSection() {
-        super("guidebook.section.mob", new ItemStack(Item.bone), 0x66962B, 0xC29B1C);
+        super("guidebook.section.mob", new ItemStack(Items.BONE), 0x66962B, 0xC29B1C);
 
         for (Class<? extends Entity> e : MobInfoRegistry.getMobClassList()) {
             MobInfoRegistry.MobInfo mobInfo = MobInfoRegistry.getMobInfo(e);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/search/SearchSection.java b/src/main/java/net/minecraft/client/gui/guidebook/search/SearchSection.java
index 79acc32b6..78ec495d9 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/search/SearchSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/search/SearchSection.java
@@ -3,6 +3,7 @@ package net.minecraft.client.gui.guidebook.search;
 import net.minecraft.client.gui.guidebook.GuidebookPage;
 import net.minecraft.client.gui.guidebook.GuidebookSection;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
 
 import java.util.ArrayList;
@@ -13,7 +14,7 @@ public class SearchSection
     private final List<GuidebookPage> pages = new ArrayList<>();
 
     public SearchSection() {
-        super("guidebook.section.search", new ItemStack(Block.glass), 0x808080,0xFFFFFF);
+        super("guidebook.section.search", new ItemStack(Blocks.GLASS), 0x808080,0xFFFFFF);
         pages.add(new SearchPage(this));
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
index e2fd8bb4c..4311a3a2b 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/smelting/BlastSmeltingPage.java
@@ -12,13 +12,13 @@ import net.minecraft.client.gui.guidebook.RecipePage;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryBlastFurnace;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
@@ -30,12 +30,12 @@ import java.util.Map;
 public class BlastSmeltingPage
     extends RecipePage<RecipeEntryBlastFurnace> {
     public static final int RECIPES_PER_PAGE = 6;
-    public List<SlotGuidebook> slots;
-    public Map<RecipeEntryBlastFurnace,List<SlotGuidebook>> map;
+    public List<GuidebookSlot> slots;
+    public Map<RecipeEntryBlastFurnace,List<GuidebookSlot>> map;
     private final GuiTooltip guiTooltip;
     private final GuiRenderItem guiRenderItem;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
-    private static EntityPlayer player;
+    private static Player player;
     private static long ticks = 0;
     public BlastSmeltingPage(GuidebookSection section, ArrayList<RecipeEntryBlastFurnace> recipes) {
         super(section);
@@ -43,14 +43,14 @@ public class BlastSmeltingPage
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
         player = mc.thePlayer;
-        player.addStat(AchievementList.OPEN_GUIDEBOOK,1);
+        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         guiTooltip = new GuiTooltip(mc);
         guiRenderItem = new GuiRenderItem(mc);
 
         for (RecipeEntryBlastFurnace recipe : recipes) {
-            List<SlotGuidebook> recipeSlots = new ArrayList<>();
-            recipeSlots.add(new SlotGuidebook(0, (width/2)-32, 32*(map.size()+1)-16, recipe.getInput(), false,recipe));
-            recipeSlots.add(new SlotGuidebook(1, (width/2)+24, 32*(map.size()+1)-16, new RecipeSymbol(recipe.getOutput()), false,recipe));
+            List<GuidebookSlot> recipeSlots = new ArrayList<>();
+            recipeSlots.add(new GuidebookSlot(0, (width/2)-32, 32*(map.size()+1)-16, recipe.getInput(), false,recipe));
+            recipeSlots.add(new GuidebookSlot(1, (width/2)+24, 32*(map.size()+1)-16, new RecipeSymbol(recipe.getOutput()), false,recipe));
             map.put(recipe,recipeSlots);
             slots.addAll(recipeSlots);
         }
@@ -61,37 +61,37 @@ public class BlastSmeltingPage
         if(recipes.isEmpty()){
             drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
         }
-        SlotGuidebook mouseOverSlot = null;
+        GuidebookSlot mouseOverSlot = null;
         ticks++;
-        for (SlotGuidebook slot : slots) {
+        for (GuidebookSlot slot : slots) {
             if(ticks > 150) {
                 slot.showRandomItem();
                 if(slots.get(slots.size()-1) == slot){
                     ticks = 0;
                 }
             }
-            drawSlot(re,x+slot.xDisplayPosition-1,y+slot.yDisplayPosition-1,0xFFFFFFFF);
+            drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
-            guiRenderItem.render(slot.getStack(),x+slot.xDisplayPosition,y+slot.yDisplayPosition,mouseOverSlot == slot,slot);
+            guiRenderItem.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
         }
     }
 
     public boolean getIsMouseOverSlot(final Slot slot, int x, int y, int mouseX, int mouseY)
     {
-        return mouseX >= x+slot.xDisplayPosition - 1 && mouseX < x+slot.xDisplayPosition + 16 + 1 && mouseY >= y+slot.yDisplayPosition - 1 && mouseY < y+slot.yDisplayPosition + 16 + 1;
+        return mouseX >= x+slot.x - 1 && mouseX < x+slot.x + 16 + 1 && mouseY >= y+slot.y - 1 && mouseY < y+slot.y + 16 + 1;
     }
 
     @Override
     public void keyTyped(char c, int key, int x, int y, int mouseX, int mouseY) {
         super.keyTyped(c, key, x, y, mouseX, mouseY);
         if(mc.gameSettings.keyShowRecipe.isKeyboardKey(key)){
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null){
-                if(hoveringSlot.hasStack()){
-                    String query = "r:"+hoveringSlot.getStack().getDisplayName()+"!";
+                if(hoveringSlot.hasItem()){
+                    String query = "r:"+hoveringSlot.getItem().getDisplayName()+"!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -99,13 +99,13 @@ public class BlastSmeltingPage
                 }
             }
         } else if (mc.gameSettings.keyShowUsage.isKeyboardKey(key)) {
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null) {
-                if (hoveringSlot.hasStack()) {
-                    String query = "u:" + hoveringSlot.getStack().getDisplayName() + "!";
+                if (hoveringSlot.hasItem()) {
+                    String query = "u:" + hoveringSlot.getItem().getDisplayName() + "!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -124,25 +124,25 @@ public class BlastSmeltingPage
     @Override
     protected void renderBackground(RenderEngine re, int x, int y) {
         super.renderBackground(re, x, y);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
         for (int i = 1; i <= recipes.size(); i++) {
             RecipeEntryBlastFurnace recipe = recipes.get(i-1);
-            List<SlotGuidebook> list = map.get(recipe);
-            drawTexturedModalRect(x + list.get(list.size()-1).xDisplayPosition - 32, y +  list.get(list.size()-1).yDisplayPosition, 234, 0, 22, 15);
+            List<GuidebookSlot> list = map.get(recipe);
+            drawTexturedModalRect(x + list.get(list.size()-1).x - 32, y +  list.get(list.size()-1).y, 234, 0, 22, 15);
         }
     }
 
     @Override
     protected void renderOverlay(RenderEngine re, FontRenderer fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         super.renderOverlay(re, fr, x, y, mouseX, mouseY, partialTicks);
-        SlotGuidebook mouseOverSlot = null;
-        for (SlotGuidebook slot : slots) {
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if (mouseOverSlot != null && mouseOverSlot.hasStack())
+            if (mouseOverSlot != null && mouseOverSlot.hasItem())
             {
                 boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-                String str = guiTooltip.getTooltipText(mouseOverSlot.getStack(), showDescription, mouseOverSlot);
+                String str = guiTooltip.getTooltipText(mouseOverSlot.getItem(), showDescription, mouseOverSlot);
                 if(!str.isEmpty())
                 {
                     guiTooltip.render(str, mouseX, mouseY, 8, -8);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java b/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
index a767038d4..b2b49bbc0 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/smelting/SmeltingPage.java
@@ -12,13 +12,13 @@ import net.minecraft.client.gui.guidebook.RecipePage;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryFurnace;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
@@ -30,12 +30,12 @@ import java.util.Map;
 public class SmeltingPage
     extends RecipePage<RecipeEntryFurnace> {
     public static final int RECIPES_PER_PAGE = 6;
-    public List<SlotGuidebook> slots;
-    public Map<RecipeEntryFurnace,List<SlotGuidebook>> map;
+    public List<GuidebookSlot> slots;
+    public Map<RecipeEntryFurnace,List<GuidebookSlot>> map;
     private final GuiTooltip guiTooltip;
     private final GuiRenderItem guiRenderItem;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
-    private static EntityPlayer player;
+    private static Player player;
     private static long ticks = 0;
     public SmeltingPage(GuidebookSection section, ArrayList<RecipeEntryFurnace> recipes) {
         super(section);
@@ -43,14 +43,14 @@ public class SmeltingPage
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
         player = mc.thePlayer;
-        player.addStat(AchievementList.OPEN_GUIDEBOOK,1);
+        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         guiTooltip = new GuiTooltip(mc);
         guiRenderItem = new GuiRenderItem(mc);
 
         for (RecipeEntryFurnace recipe : recipes) {
-            List<SlotGuidebook> recipeSlots = new ArrayList<>();
-            recipeSlots.add(new SlotGuidebook(0, (width/2)-32, 32*(map.size()+1)-16, recipe.getInput(), false,recipe));
-            recipeSlots.add(new SlotGuidebook(1, (width/2)+24, 32*(map.size()+1)-16, new RecipeSymbol(recipe.getOutput()), false,recipe));
+            List<GuidebookSlot> recipeSlots = new ArrayList<>();
+            recipeSlots.add(new GuidebookSlot(0, (width/2)-32, 32*(map.size()+1)-16, recipe.getInput(), false,recipe));
+            recipeSlots.add(new GuidebookSlot(1, (width/2)+24, 32*(map.size()+1)-16, new RecipeSymbol(recipe.getOutput()), false,recipe));
             map.put(recipe,recipeSlots);
             slots.addAll(recipeSlots);
         }
@@ -61,37 +61,37 @@ public class SmeltingPage
         if(recipes.isEmpty()){
             drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
         }
-        SlotGuidebook mouseOverSlot = null;
+        GuidebookSlot mouseOverSlot = null;
         ticks++;
-        for (SlotGuidebook slot : slots) {
+        for (GuidebookSlot slot : slots) {
             if(ticks > 150) {
                 slot.showRandomItem();
                 if(slots.get(slots.size()-1) == slot){
                     ticks = 0;
                 }
             }
-            drawSlot(re,x+slot.xDisplayPosition-1,y+slot.yDisplayPosition-1,0xFFFFFFFF);
+            drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
-            guiRenderItem.render(slot.getStack(),x+slot.xDisplayPosition,y+slot.yDisplayPosition,mouseOverSlot == slot,slot);
+            guiRenderItem.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
         }
     }
 
     public boolean getIsMouseOverSlot(final Slot slot, int x, int y, int mouseX, int mouseY)
     {
-        return mouseX >= x+slot.xDisplayPosition - 1 && mouseX < x+slot.xDisplayPosition + 16 + 1 && mouseY >= y+slot.yDisplayPosition - 1 && mouseY < y+slot.yDisplayPosition + 16 + 1;
+        return mouseX >= x+slot.x - 1 && mouseX < x+slot.x + 16 + 1 && mouseY >= y+slot.y - 1 && mouseY < y+slot.y + 16 + 1;
     }
 
     @Override
     public void keyTyped(char c, int key, int x, int y, int mouseX, int mouseY) {
         super.keyTyped(c, key, x, y, mouseX, mouseY);
         if(mc.gameSettings.keyShowRecipe.isKeyboardKey(key)){
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null){
-                if(hoveringSlot.hasStack()){
-                    String query = "r:"+hoveringSlot.getStack().getDisplayName()+"!";
+                if(hoveringSlot.hasItem()){
+                    String query = "r:"+hoveringSlot.getItem().getDisplayName()+"!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -99,13 +99,13 @@ public class SmeltingPage
                 }
             }
         } else if (mc.gameSettings.keyShowUsage.isKeyboardKey(key)) {
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null) {
-                if (hoveringSlot.hasStack()) {
-                    String query = "u:" + hoveringSlot.getStack().getDisplayName() + "!";
+                if (hoveringSlot.hasItem()) {
+                    String query = "u:" + hoveringSlot.getItem().getDisplayName() + "!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -124,25 +124,25 @@ public class SmeltingPage
     @Override
     protected void renderBackground(RenderEngine re, int x, int y) {
         super.renderBackground(re, x, y);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
         for (int i = 1; i <= recipes.size(); i++) {
             RecipeEntryFurnace recipe = recipes.get(i-1);
-            List<SlotGuidebook> list = map.get(recipe);
-            drawTexturedModalRect(x + list.get(list.size()-1).xDisplayPosition - 32, y +  list.get(list.size()-1).yDisplayPosition, 234, 0, 22, 15);
+            List<GuidebookSlot> list = map.get(recipe);
+            drawTexturedModalRect(x + list.get(list.size()-1).x - 32, y +  list.get(list.size()-1).y, 234, 0, 22, 15);
         }
     }
 
     @Override
     protected void renderOverlay(RenderEngine re, FontRenderer fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         super.renderOverlay(re, fr, x, y, mouseX, mouseY, partialTicks);
-        SlotGuidebook mouseOverSlot = null;
-        for (SlotGuidebook slot : slots) {
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if (mouseOverSlot != null && mouseOverSlot.hasStack())
+            if (mouseOverSlot != null && mouseOverSlot.hasItem())
             {
                 boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-                String str = guiTooltip.getTooltipText(mouseOverSlot.getStack(), showDescription, mouseOverSlot);
+                String str = guiTooltip.getTooltipText(mouseOverSlot.getItem(), showDescription, mouseOverSlot);
                 if(!str.isEmpty())
                 {
                     guiTooltip.render(str, mouseX, mouseY, 8, -8);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java b/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
index e8c4dd3ed..30395d2c9 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/trommeling/TrommelPage.java
@@ -14,14 +14,14 @@ import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
+import net.minecraft.core.player.inventory.slot.GuidebookSlot;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.GL11;
 
@@ -33,12 +33,12 @@ import java.util.Map;
 public class TrommelPage
     extends RecipePage<RecipeEntryTrommel> {
     public static final int RECIPES_PER_PAGE = 3;
-    public List<SlotGuidebook> slots;
-    public Map<RecipeEntryTrommel,List<SlotGuidebook>> map;
+    public List<GuidebookSlot> slots;
+    public Map<RecipeEntryTrommel,List<GuidebookSlot>> map;
     private final GuiTooltip guiTooltip;
     private final GuiRenderItem guiRenderItem;
     private static final Minecraft mc = Minecraft.getMinecraft(GuidebookPage.class);
-    private static EntityPlayer player;
+    private static Player player;
     private static long ticks = 0;
     private static long ticks2 = 0;
 
@@ -48,27 +48,27 @@ public class TrommelPage
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
         player = mc.thePlayer;
-        player.addStat(AchievementList.OPEN_GUIDEBOOK,1);
+        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         guiTooltip = new GuiTooltip(mc);
         guiRenderItem = new GuiRenderItem(mc);
         int recipeAmount = 0;
         int yOffset = 8;
         for (RecipeEntryTrommel recipe : recipes) {
-            List<SlotGuidebook> recipeSlots = new ArrayList<>();
+            List<GuidebookSlot> recipeSlots = new ArrayList<>();
             int slotsAmount = 10;
 
             for (int i = 0; i < slotsAmount - 1; i++)
             {
                 if(recipe.getOutput().getEntries().size() > i){
                     ItemStack stack = recipe.getOutput().getEntries().get(i).getItemStack();
-                    recipeSlots.add(new SlotGuidebook(i, 81 + 20 * (i % 3), 1 + 20 * ((i / 3)+recipeAmount*3) + yOffset, new RecipeSymbol(stack), false,recipe).setAsOutput());
+                    recipeSlots.add(new GuidebookSlot(i, 81 + 20 * (i % 3), 1 + 20 * ((i / 3)+recipeAmount*3) + yOffset, new RecipeSymbol(stack), false,recipe).setAsOutput());
                 } else {
-                    recipeSlots.add(new SlotGuidebook(i, 81 + 20 * (i % 3), 1 + 20 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe).setAsOutput());
+                    recipeSlots.add(new GuidebookSlot(i, 81 + 20 * (i % 3), 1 + 20 * ((i / 3)+recipeAmount*3) + yOffset, null, false,recipe).setAsOutput());
                 }
             }
 
-            int centerY = (recipeSlots.get(recipeSlots.size()-1).yDisplayPosition + recipeSlots.get(recipeSlots.size()-8).yDisplayPosition) / 2;
-            recipeSlots.add(new SlotGuidebook(slotsAmount - 1, 19, centerY,recipe.getInput(), false,recipe));
+            int centerY = (recipeSlots.get(recipeSlots.size()-1).y + recipeSlots.get(recipeSlots.size()-8).y) / 2;
+            recipeSlots.add(new GuidebookSlot(slotsAmount - 1, 19, centerY,recipe.getInput(), false,recipe));
 
             map.put(recipe,recipeSlots);
             slots.addAll(recipeSlots);
@@ -83,15 +83,15 @@ public class TrommelPage
         if(recipes.isEmpty()){
             drawStringCenteredNoShadow(fr,"No recipes found :(" ,x+width/2,y+height/2,0xFF808080);
         }
-        SlotGuidebook mouseOverSlot = null;
+        GuidebookSlot mouseOverSlot = null;
         ticks++;
         ticks2++;
         if(ticks2 > 200) {
             ticks2 = 0;
-            for (SlotGuidebook slot : slots) {
+            for (GuidebookSlot slot : slots) {
                 if (slot.recipe instanceof RecipeEntryTrommel) {
                     RecipeSymbol input = (RecipeSymbol) slot.recipe.getInput();
-                    if (!input.matches(slot.getStack())) {
+                    if (!input.matches(slot.getItem())) {
                         if(slot.recipeAmount > 8){
                             int recipeIndexMax = Math.round((float) slot.recipeAmount /9);
                             if(slot.recipeIndex >= recipeIndexMax){
@@ -100,7 +100,7 @@ public class TrommelPage
                                 slot.recipeIndex++;
                             }
                             WeightedRandomBag<WeightedRandomLootObject> loot = (WeightedRandomBag<WeightedRandomLootObject>) slot.recipe.getOutput();
-                            int index = slot.id + (9 * slot.recipeIndex);
+                            int index = slot.index + (9 * slot.recipeIndex);
                             if(index > slot.recipeAmount){
                                 slot.item = null;
                             } else {
@@ -111,35 +111,35 @@ public class TrommelPage
                 }
             }
         }
-        for (SlotGuidebook slot : slots) {
+        for (GuidebookSlot slot : slots) {
             if(ticks > 150) {
                 slot.showRandomItem();
                 if(slots.get(slots.size()-1) == slot){
                     ticks = 0;
                 }
             }
-            drawSlot(re,x+slot.xDisplayPosition-1,y+slot.yDisplayPosition-1,0xFFFFFFFF);
+            drawSlot(x+slot.x -1,y+slot.y -1,0xFFFFFFFF);
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
-            guiRenderItem.render(slot.getStack(),x+slot.xDisplayPosition,y+slot.yDisplayPosition,mouseOverSlot == slot,slot);
+            guiRenderItem.render(slot.getItem(),x+slot.x,y+slot.y,mouseOverSlot == slot,slot);
         }
     }
 
     public boolean getIsMouseOverSlot(final Slot slot, int x, int y, int mouseX, int mouseY)
     {
-        return mouseX >= x+slot.xDisplayPosition - 1 && mouseX < x+slot.xDisplayPosition + 16 + 1 && mouseY >= y+slot.yDisplayPosition - 1 && mouseY < y+slot.yDisplayPosition + 16 + 1;
+        return mouseX >= x+slot.x - 1 && mouseX < x+slot.x + 16 + 1 && mouseY >= y+slot.y - 1 && mouseY < y+slot.y + 16 + 1;
     }
 
     @Override
     public void keyTyped(char c, int key, int x, int y, int mouseX, int mouseY) {
         super.keyTyped(c, key, x, y, mouseX, mouseY);
         if(mc.gameSettings.keyShowRecipe.isKeyboardKey(key)){
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null){
-                if(hoveringSlot.hasStack()){
-                    String query = "r:"+hoveringSlot.getStack().getDisplayName()+"!";
+                if(hoveringSlot.hasItem()){
+                    String query = "r:"+hoveringSlot.getItem().getDisplayName()+"!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -147,13 +147,13 @@ public class TrommelPage
                 }
             }
         } else if (mc.gameSettings.keyShowUsage.isKeyboardKey(key)) {
-            SlotGuidebook hoveringSlot= null;
-            for (SlotGuidebook slot : slots) {
+            GuidebookSlot hoveringSlot= null;
+            for (GuidebookSlot slot : slots) {
                 if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) hoveringSlot = slot;
             }
             if(hoveringSlot != null) {
-                if (hoveringSlot.hasStack()) {
-                    String query = "u:" + hoveringSlot.getStack().getDisplayName() + "!";
+                if (hoveringSlot.hasItem()) {
+                    String query = "u:" + hoveringSlot.getItem().getDisplayName() + "!";
                     PageManager.searchQuery = SearchQuery.resolve(query);
                     SearchPage.searchField.setText(query);
                     GuiGuidebook.getPageManager().updatePages();
@@ -172,25 +172,25 @@ public class TrommelPage
     @Override
     protected void renderBackground(RenderEngine re, int x, int y) {
         super.renderBackground(re, x, y);
-        re.bindTexture(re.getTexture("/assets/minecraft/textures/gui/guidebook/guidebook.png"));
+        re.bindTexture(re.loadTexture("/assets/minecraft/textures/gui/container/guidebook/guidebook.png"));
         for (int i = 1; i <= recipes.size(); i++) {
             RecipeEntryTrommel recipe = recipes.get(i-1);
-            List<SlotGuidebook> list = map.get(recipe);
-            drawTexturedModalRect(x + list.get(list.size()-1).xDisplayPosition + 25, y +  list.get(list.size()-1).yDisplayPosition, 234, 0, 22, 15);
+            List<GuidebookSlot> list = map.get(recipe);
+            drawTexturedModalRect(x + list.get(list.size()-1).x + 25, y +  list.get(list.size()-1).y, 234, 0, 22, 15);
         }
     }
 
     @Override
     protected void renderOverlay(RenderEngine re, FontRenderer fr, int x, int y, int mouseX, int mouseY, float partialTicks) {
         super.renderOverlay(re, fr, x, y, mouseX, mouseY, partialTicks);
-        SlotGuidebook mouseOverSlot = null;
-        for (SlotGuidebook slot : slots) {
+        GuidebookSlot mouseOverSlot = null;
+        for (GuidebookSlot slot : slots) {
             if(getIsMouseOverSlot(slot,x,y,mouseX,mouseY)) mouseOverSlot = slot;
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            if (mouseOverSlot != null && mouseOverSlot.hasStack())
+            if (mouseOverSlot != null && mouseOverSlot.hasItem())
             {
                 boolean showDescription = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) || mc.gameSettings.alwaysShowDescriptions.value;
-                String str = guiTooltip.getTooltipText(mouseOverSlot.getStack(), showDescription, mouseOverSlot);
+                String str = guiTooltip.getTooltipText(mouseOverSlot.getItem(), showDescription, mouseOverSlot);
                 if(!str.isEmpty())
                 {
                     guiTooltip.render(str, mouseX, mouseY, 8, -8);
diff --git a/src/main/java/net/minecraft/client/gui/hud/ArmorBarComponent.java b/src/main/java/net/minecraft/client/gui/hud/ArmorBarComponent.java
index fbf8a40bb..80905322f 100644
--- a/src/main/java/net/minecraft/client/gui/hud/ArmorBarComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/ArmorBarComponent.java
@@ -3,12 +3,20 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import org.lwjgl.opengl.GL11;
 
 public class ArmorBarComponent
     extends MovableHudComponent {
+    private final IconCoordinate armor_empty;
+    private final IconCoordinate armor_half;
+    private final IconCoordinate armor_full;
     public ArmorBarComponent(String key, Layout layout) {
         super(key, 81, 10, layout);
+        armor_empty = TextureRegistry.getTexture("minecraft:gui/hud/armor_empty");
+        armor_half = TextureRegistry.getTexture("minecraft:gui/hud/armor_half");
+        armor_full = TextureRegistry.getTexture("minecraft:gui/hud/armor_full");
     }
 
     @Override
@@ -23,7 +31,6 @@ public class ArmorBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int armorValue = mc.thePlayer.getPlayerProtectionAmount();
@@ -34,17 +41,17 @@ public class ArmorBarComponent
                 if (i * 2 + 1 < armorValue)
                 {
                     // Full armor icon
-                    gui.drawTexturedModalRect(xArmor, y, 34, 9, 9, 9);
+                    gui.drawGuiIcon(xArmor, y, 9, 9, armor_full);
                 }
                 if (i * 2 + 1 == armorValue)
                 {
                     // Half armor icon
-                    gui.drawTexturedModalRect(xArmor, y, 25, 9, 9, 9);
+                    gui.drawGuiIcon(xArmor, y, 9, 9, armor_half);
                 }
                 if (i * 2 + 1 > armorValue)
                 {
                     // Empty armor icon
-                    gui.drawTexturedModalRect(xArmor, y, 16, 9, 9, 9);
+                    gui.drawGuiIcon(xArmor, y, 9, 9, armor_empty);
                 }
             }
         }
@@ -57,7 +64,6 @@ public class ArmorBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int armorValue = 11;
@@ -66,17 +72,17 @@ public class ArmorBarComponent
             if (i * 2 + 1 < armorValue)
             {
                 // Full armor icon
-                gui.drawTexturedModalRect(xArmor, y, 34, 9, 9, 9);
+                gui.drawGuiIcon(xArmor, y, 9, 9, armor_full);
             }
             if (i * 2 + 1 == armorValue)
             {
                 // Half armor icon
-                gui.drawTexturedModalRect(xArmor, y, 25, 9, 9, 9);
+                gui.drawGuiIcon(xArmor, y, 9, 9, armor_half);
             }
             if (i * 2 + 1 > armorValue)
             {
                 // Empty armor icon
-                gui.drawTexturedModalRect(xArmor, y, 16, 9, 9, 9);
+                gui.drawGuiIcon(xArmor, y, 9, 9, armor_empty);
             }
         }
     }
diff --git a/src/main/java/net/minecraft/client/gui/hud/CrosshairComponent.java b/src/main/java/net/minecraft/client/gui/hud/CrosshairComponent.java
index f228bde20..866703502 100644
--- a/src/main/java/net/minecraft/client/gui/hud/CrosshairComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/CrosshairComponent.java
@@ -3,6 +3,7 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import org.lwjgl.opengl.GL11;
 
 public class CrosshairComponent
@@ -23,12 +24,11 @@ public class CrosshairComponent
 
         // Setup crosshair texture
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
 
         // Render crosshair
         GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR);
-        gui.drawTexturedModalRect(x, y, 0, 0, 15, 15);
+        gui.drawGuiIcon(x, y, 15, 15, TextureRegistry.getTexture("minecraft:gui/hud/crosshair"));
         GL11.glDisable(GL11.GL_BLEND);
     }
 
@@ -39,9 +39,8 @@ public class CrosshairComponent
 
         // Setup crosshair texture
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
 
         // Render crosshair
-        gui.drawTexturedModalRect(x, y, 0, 0, 15, 15);
+        gui.drawGuiIcon(x, y, 15, 15, TextureRegistry.getTexture("minecraft:gui/hud/crosshair"));
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/hud/FireBarComponent.java b/src/main/java/net/minecraft/client/gui/hud/FireBarComponent.java
index 1bfc5d1d9..f9a177ba9 100644
--- a/src/main/java/net/minecraft/client/gui/hud/FireBarComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/FireBarComponent.java
@@ -3,6 +3,7 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import org.lwjgl.opengl.GL11;
 
 public class FireBarComponent
@@ -23,14 +24,13 @@ public class FireBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         float fire = (float) mc.thePlayer.remainingFireTicks / (float) mc.thePlayer.maxFireTicks;
         int fireBar = (int) Math.min(fire * 20,20);
 
         for (int i = 0; i < fireBar / 2; i++) {
-            gui.drawTexturedModalRect(x + i * 8, y, 0, 52, 9, 9);
+            gui.drawGuiIcon(x + i * 8, y, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/fire"));
         }
     }
 
@@ -41,12 +41,11 @@ public class FireBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int fireBar = 11;
         for (int i = 0; i < fireBar / 2; i++) {
-            gui.drawTexturedModalRect(x + i * 8, y, 0, 52, 9, 9);
+            gui.drawGuiIcon(x + i * 8, y, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/fire"));
         }
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/hud/HealthBarComponent.java b/src/main/java/net/minecraft/client/gui/hud/HealthBarComponent.java
index ea72f10af..289690c39 100644
--- a/src/main/java/net/minecraft/client/gui/hud/HealthBarComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/HealthBarComponent.java
@@ -3,8 +3,10 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
-import net.minecraft.core.item.ItemBucketIceCream;
-import net.minecraft.core.item.ItemFood;
+import net.minecraft.client.render.texture.Texture;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.item.IceCreamBucketItem;
+import net.minecraft.core.item.FoodItem;
 import net.minecraft.core.player.gamemode.Gamemode;
 import org.lwjgl.opengl.GL11;
 
@@ -30,7 +32,6 @@ public class HealthBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         boolean heartsFlash = (mc.thePlayer.heartsFlashTime / 3) % 2 == 1;
@@ -41,7 +42,7 @@ public class HealthBarComponent
         int health = mc.thePlayer.getHealth();
         int prevHealth = mc.thePlayer.prevHealth;
         random.setSeed(gui.updateCounter * 0x4c627L);
-        int v = mc.thePlayer.getGamemode() == Gamemode.hardcore ? 27 : 0;
+        boolean isHardcore = mc.thePlayer.getGamemode() == Gamemode.hardcore;
 
         for (int i = 0; i < 10; i++) {
             int heartOffset = 0;
@@ -56,55 +57,55 @@ public class HealthBarComponent
                 yHeart += random.nextInt(2);
             }
 
-            gui.drawTexturedModalRect(xHeart, yHeart, 16 + heartOffset * 9, v, 9, 9);
+            gui.drawGuiIcon(xHeart, yHeart, 9, 9, heartOffset == 0 ? TextureRegistry.getTexture("minecraft:gui/hud/heart/container") : TextureRegistry.getTexture("minecraft:gui/hud/heart/container_blinking"));
             if (heartsFlash)
             {
                 if (i * 2 + 1 < prevHealth)
                 {
                     // Half flash heart icon
-                    gui.drawTexturedModalRect(xHeart, yHeart, 70, v, 9, 9);
+                    gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "full_blinking"));
                 }
                 if (i * 2 + 1 == prevHealth)
                 {
                     // Full flash heart icon
-                    gui.drawTexturedModalRect(xHeart, yHeart, 79, v, 9, 9);
+                    gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "half_blinking"));
                 }
             }
             if (i * 2 + 1 < health)
             {
                 // Full heart icon
-                gui.drawTexturedModalRect(xHeart, yHeart, 52, v, 9, 9);
+                gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "full"));
             }
             if (i * 2 + 1 == health)
             {
                 // Half heart icon
-                gui.drawTexturedModalRect(xHeart, yHeart, 61, v, 9, 9);
+                gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "half"));
             }
-            if (mc.thePlayer.inventory.getCurrentItem() != null && (mc.thePlayer.inventory.getCurrentItem().getItem() instanceof ItemFood || mc.thePlayer.inventory.getCurrentItem().getItem() instanceof ItemBucketIceCream) && mc.gameSettings.foodHealthRegenOverlay.value)
+            if (mc.thePlayer.inventory.getCurrentItem() != null && (mc.thePlayer.inventory.getCurrentItem().getItem() instanceof FoodItem || mc.thePlayer.inventory.getCurrentItem().getItem() instanceof IceCreamBucketItem) && mc.gameSettings.foodHealthRegenOverlay.value)
             {
                 int healing = 0;
-                if (mc.thePlayer.inventory.getCurrentItem().getItem() instanceof ItemFood)
+                if (mc.thePlayer.inventory.getCurrentItem().getItem() instanceof FoodItem)
                 {
-                    healing = ((ItemFood) mc.thePlayer.inventory.getCurrentItem().getItem()).getHealAmount();
+                    healing = ((FoodItem) mc.thePlayer.inventory.getCurrentItem().getItem()).getHealAmount();
                 }
                 else
                 {
-                    healing = ((ItemBucketIceCream) mc.thePlayer.inventory.getCurrentItem().getItem()).getHealAmount();
+                    healing = ((IceCreamBucketItem) mc.thePlayer.inventory.getCurrentItem().getItem()).getHealAmount();
                 }
 
                 if (i * 2 + 1 >= health)
                 {
                     if (i * 2 + 1 == health)
                     {
-                        gui.drawTexturedModalRect(xHeart, yHeart, 106, 0, 9, 9);
+                        gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "preview_half_right"));
                     }
                     else if (i * 2 + 1 < health + healing)
                     {
-                        gui.drawTexturedModalRect(xHeart, yHeart, 88, 0, 9, 9);
+                        gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "preview_full"));
                     }
                     else if (i * 2 + 1 == health + healing)
                     {
-                        gui.drawTexturedModalRect(xHeart, yHeart, 97, 0, 9, 9);
+                        gui.drawGuiIcon(xHeart, yHeart, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/" + (isHardcore ? "hardcore_" : "") + "preview_half"));
                     }
                 }
             }
@@ -118,22 +119,21 @@ public class HealthBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int health = 11;
         for (int i = 0; i < 10; i++) {
             int xHeart = x + i * 8;
-            gui.drawTexturedModalRect(xHeart, y, 16, 0, 9, 9);
+            gui.drawGuiIcon(xHeart, y, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/container"));
             if (i * 2 + 1 < health)
             {
                 // Full heart icon
-                gui.drawTexturedModalRect(xHeart, y, 52, 0, 9, 9);
+                gui.drawGuiIcon(xHeart, y, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/full"));
             }
             if (i * 2 + 1 == health)
             {
                 // Half heart icon
-                gui.drawTexturedModalRect(xHeart, y, 61, 0, 9, 9);
+                gui.drawGuiIcon(xHeart, y, 9, 9, TextureRegistry.getTexture("minecraft:gui/hud/heart/half"));
             }
         }
     }
diff --git a/src/main/java/net/minecraft/client/gui/hud/HotbarComponent.java b/src/main/java/net/minecraft/client/gui/hud/HotbarComponent.java
index 96d56e2af..352a69c55 100644
--- a/src/main/java/net/minecraft/client/gui/hud/HotbarComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/HotbarComponent.java
@@ -2,31 +2,32 @@ package net.minecraft.client.gui.hud;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
-import net.minecraft.client.gui.GuiHeldItemTooltip;
 import net.minecraft.client.gui.GuiIngame;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.Scissor;
 import net.minecraft.client.render.item.model.ItemModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.Block;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.container.Inventory;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL12;
 
 public class HotbarComponent
     extends MovableHudComponent {
     private static final ItemStack[] PREVIEW_ITEMS = new ItemStack[] {
-        new ItemStack(Block.stone),
-        new ItemStack(Block.cobbleStone),
-        new ItemStack(Block.brickClay),
-        new ItemStack(Block.dirt),
-        new ItemStack(Block.planksOak),
-        new ItemStack(Block.logOak),
-        new ItemStack(Block.leavesOak),
-        new ItemStack(Block.glass),
-        new ItemStack(Block.slabStonePolished)
+        new ItemStack(Blocks.STONE),
+        new ItemStack(Blocks.COBBLE_STONE),
+        new ItemStack(Blocks.BRICK_CLAY),
+        new ItemStack(Blocks.DIRT),
+        new ItemStack(Blocks.PLANKS_OAK),
+        new ItemStack(Blocks.LOG_OAK),
+        new ItemStack(Blocks.LEAVES_OAK),
+        new ItemStack(Blocks.GLASS),
+        new ItemStack(Blocks.SLAB_STONE_POLISHED)
     };
 
     public HotbarComponent(String key, Layout layout) {
@@ -54,19 +55,20 @@ public class HotbarComponent
         int x = this.getLayout().getComponentX(mc, this, xSizeScreen);
         int y = this.getLayout().getComponentY(mc, this, ySizeScreen);
 
-        InventoryPlayer inv = mc.thePlayer.inventory;
+        Inventory inv = mc.thePlayer.inventory;
 
         // Setup hotbar texture
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
 
         // Render hotbar
-        gui.drawTexturedModalRect(x + 5, y, 0, 0, 182, 22);
+        gui.drawGuiIcon(x + 5, y, 182, 22, TextureRegistry.getTexture("minecraft:gui/hud/hotbar"));
+
 
         // Render hotbar switcher and dots
         int selectedHotbar = ((inv.hotbarOffset + 27) % 36) / 9;
-        gui.drawTexturedModalRect(x, y, 24, 22, 6, 22);
-        gui.drawTexturedModalRect(x, y + 1 + selectedHotbar * 5, 30, 23 + selectedHotbar * 5 ,6 ,5);
+        IconCoordinate coordinate = TextureRegistry.getTexture("minecraft:gui/hud/hotbar_selector");
+        gui.drawIconTexture(x, y, x + 6, y + 22, 0, 0, 6, 22, coordinate);
+        gui.drawIconTexture(x, y + selectedHotbar * 5, x + 6, y + selectedHotbar * 5 + 5, 6, selectedHotbar * 5, 12, selectedHotbar * 5 + 5, coordinate);
 
         // Setup items
         GL11.glEnable(GL11.GL_DEPTH_TEST);
@@ -120,10 +122,9 @@ public class HotbarComponent
 
         // Setup hotbar texture
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
 
         // Render selector
-        gui.drawTexturedModalRect((x + 4) + (inv.currentItem % 9) * 20, y - 1, 0, 22, 24, 24);
+        gui.drawGuiIcon((x + 4) + (inv.currentItem % 9) * 20, y - 1, 24, 24, TextureRegistry.getTexture("minecraft:gui/hud/hotbar_selection"));
 
         gui.guiHeldItemTooltip.updateAndRender(mc, x + 187/2, y - 20);
     }
@@ -135,17 +136,18 @@ public class HotbarComponent
 
         // Setup hotbar texture
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/gui.png"));
 
         // Render hotbar
-        gui.drawTexturedModalRect(x + 5, y, 0, 0, 182, 22);
+        gui.drawGuiIcon(x + 5, y, 182, 22, TextureRegistry.getTexture("minecraft:gui/hud/hotbar"));
 
         // Render hotbar switcher and dots
-        gui.drawTexturedModalRect(x, y, 24, 22, 6, 22);
-        gui.drawTexturedModalRect(x, y + 16, 30, 23, 6,5);
+        IconCoordinate coordinate = TextureRegistry.getTexture("minecraft:gui/hud/hotbar_selector");
+        gui.drawIconTexture(x, y,       x + 6, y + 22, 0, 0, 6, 22, coordinate);
+        gui.drawIconTexture(x, y + 15,  x + 6, y + 15 + 5, 6, 5, 12, 10, coordinate);
 
         // Render selector
-        gui.drawTexturedModalRect(x + 4, y - 1, 0, 22, 24, 24);
+        gui.drawGuiIcon((x + 4), y - 1, 24, 24, TextureRegistry.getTexture("minecraft:gui/hud/hotbar_selection"));
+
 
         // Setup items
         GL11.glEnable(GL11.GL_DEPTH_TEST);
diff --git a/src/main/java/net/minecraft/client/gui/hud/OxygenBarComponent.java b/src/main/java/net/minecraft/client/gui/hud/OxygenBarComponent.java
index f1a5542d3..1028528ac 100644
--- a/src/main/java/net/minecraft/client/gui/hud/OxygenBarComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/OxygenBarComponent.java
@@ -3,13 +3,19 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.material.Material;
 import org.lwjgl.opengl.GL11;
 
 public class OxygenBarComponent
     extends MovableHudComponent {
+    private final IconCoordinate air;
+    private final IconCoordinate air_pop;
     public OxygenBarComponent(String key, Layout layout) {
         super(key, 81, 10, layout);
+        air = TextureRegistry.getTexture("minecraft:gui/hud/air");
+        air_pop = TextureRegistry.getTexture("minecraft:gui/hud/air_pop");
     }
 
     @Override
@@ -24,7 +30,6 @@ public class OxygenBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int numBubbles = (int) Math.ceil(((double) (mc.thePlayer.airSupply - 2) * 10D) / 300D);
@@ -33,11 +38,11 @@ public class OxygenBarComponent
         {
             if (i < numBubbles)
             {
-                gui.drawTexturedModalRect(x + i * 8, y, 16, 18, 9, 9);
+                gui.drawGuiIcon(x + i * 8, y, 9, 9, air);
             }
             else
             {
-                gui.drawTexturedModalRect(x + i * 8, y, 25, 18, 9, 9);
+                gui.drawGuiIcon(x + i * 8, y, 9, 9, air_pop);
             }
         }
     }
@@ -49,7 +54,6 @@ public class OxygenBarComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int numBubbles = 5;
@@ -58,11 +62,11 @@ public class OxygenBarComponent
         {
             if (i < numBubbles)
             {
-                gui.drawTexturedModalRect(x + i * 8, y, 16, 18, 9, 9);
+                gui.drawGuiIcon(x + i * 8, y, 9, 9, air);
             }
             else
             {
-                gui.drawTexturedModalRect(x + i * 8, y, 25, 18, 9, 9);
+                gui.drawGuiIcon(x + i * 8, y, 9, 9, air_pop);
             }
         }
     }
diff --git a/src/main/java/net/minecraft/client/gui/hud/RotationLockComponent.java b/src/main/java/net/minecraft/client/gui/hud/RotationLockComponent.java
index 9856d4d73..02cc03dd5 100644
--- a/src/main/java/net/minecraft/client/gui/hud/RotationLockComponent.java
+++ b/src/main/java/net/minecraft/client/gui/hud/RotationLockComponent.java
@@ -3,7 +3,8 @@ package net.minecraft.client.gui.hud;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiIngame;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Direction;
 import org.lwjgl.opengl.GL11;
 
@@ -22,16 +23,14 @@ public class RotationLockComponent
     public void render(Minecraft mc, GuiIngame gui, int xSizeScreen, int ySizeScreen, float partialTick) {
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
         int x = this.getLayout().getComponentX(mc, this, xSizeScreen);
         int y = this.getLayout().getComponentY(mc, this, ySizeScreen);
 
-        int u = mc.gameSettings.rotationOverlayMode.value % 2 == 1 ? 16 : 0;
-        int v = 160;
+        String prefix = mc.gameSettings.rotationOverlayMode.value % 2 == 1 ? "arrow" : "cube";
 
-        EntityPlayer player = mc.thePlayer;
+        Player player = mc.thePlayer;
 
         boolean facingUp = player.xRot < -45;
         boolean facingDown = player.xRot > 45;
@@ -78,9 +77,11 @@ public class RotationLockComponent
             }
         }
 
-        gui.drawTexturedModalRect(x, y, u, v + dir.index * 16, 16, 16);
+        String[] dirTextures = new String[]{"down", "up", "back", "front", "left", "right"};
+        gui.drawGuiIcon(x, y, 16, 16, TextureRegistry.getTexture("minecraft:gui/hud/rotation/" + prefix + "_" + dirTextures[dir.getId()]));
         dir = Direction.getVerticalDirection(player);
-        gui.drawTexturedModalRect(x + 16, y + 4, u + (dir.index - 4) * 8, v - 8, 8, 8);
+        dirTextures = new String[]{"downer", "upper", "back", "front", "left", "right"};
+        gui.drawGuiIcon(x + 16, y + 4, 8, 8, TextureRegistry.getTexture("minecraft:gui/hud/rotation/" + prefix + "_" + dirTextures[dir.getId()]));
     }
 
     @Override
@@ -90,13 +91,11 @@ public class RotationLockComponent
 
         // Setup rendering
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset color
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/icons.png"));
         GL11.glDisable(GL11.GL_BLEND);
 
-        int u = mc.gameSettings.rotationOverlayMode.value % 2 == 1 ? 16 : 0;
-        int v = 160;
+        String prefix = mc.gameSettings.rotationOverlayMode.value % 2 == 1 ? "arrow" : "cube";
 
-        gui.drawTexturedModalRect(x, y, u, v, 16, 16);
-        gui.drawTexturedModalRect(x + 16, y + 4, u, v - 8, 8, 8);
+        gui.drawGuiIcon(x, y, 16, 16, TextureRegistry.getTexture("minecraft:gui/hud/rotation/" + prefix + "_front"));
+        gui.drawGuiIcon(x + 16, y + 4, 8, 8, TextureRegistry.getTexture("minecraft:gui/hud/rotation/" + prefix + "_downer"));
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java b/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
index caf228148..15ef85781 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
@@ -1,6 +1,5 @@
 package net.minecraft.client.gui.modelviewer;
 
-import com.b100.utils.FileUtils;
 import com.b100.utils.ImageUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
@@ -12,25 +11,22 @@ import net.minecraft.client.gui.modelviewer.categories.ParticleCategory;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
-import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextureButton;
-import net.minecraft.client.gui.modelviewer.elements.IActionListener;
 import net.minecraft.client.gui.modelviewer.elements.IListenerElement;
 import net.minecraft.client.gui.options.GuiOptions;
 import net.minecraft.client.gui.options.data.OptionsPages;
-import net.minecraft.client.render.Texture;
-import net.minecraft.client.render.TileEntityRenderDispatcher;
+import net.minecraft.client.render.BlockEntityRenderDispatcher;
 import net.minecraft.client.render.shader.PhotoModeRenderer;
 import net.minecraft.client.render.shader.Shaders;
 import net.minecraft.client.render.shader.ShadersRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.Texture;
 import net.minecraft.client.util.helper.Textures;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.Buffer;
 import net.minecraft.core.util.helper.Utils;
-import net.minecraft.core.world.World;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
@@ -87,7 +83,7 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
         mc.thePlayer.absMoveTo(0.5, 64.5, 0.5, 180, 0);
         mc.thePlayer.noPhysics = true;
         mc.renderEngine.refreshTexturesAndDisplayErrors();
-        mc.renderEngine.updateDynamicTextures();
+        mc.renderEngine.updateDynamicTextures(false);
 
         if(Shaders.enableShaders) {
             photoModeRenderer = new PhotoModeRenderer(mc, this);
@@ -141,7 +137,8 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
 
         buttonReloadTextures = new GuiListenerButton(12, 21, height - 20, 98, 20, i18n.translateKey("gui.model_viewer.button.reload_textures"));
         buttonReloadTextures.setActionListener(() -> mc.renderEngine.refreshTexturesAndDisplayErrors());
-        buttonOpenScreenshotFolder = new GuiListenerTextureButton(30, "/assets/minecraft/textures/gui/gui.png", buttonReloadTextures.getWidth() + buttonReloadTextures.getX() + 1, buttonReloadTextures.getY(), 100, 106 - 20, 20, 20);
+        buttonOpenScreenshotFolder = (GuiListenerButton) new GuiListenerButton(30, buttonReloadTextures.getWidth() + buttonReloadTextures.getX() + 1, buttonReloadTextures.getY(), 20, 20, "")
+            .setTextures("minecraft:gui/misc/button_folder", "minecraft:gui/misc/button_folder_highlighted", "minecraft:gui/misc/button_folder");
         buttonOpenScreenshotFolder.setActionListener(() -> Utils.openDirectory(new File(mc.getMinecraftDir(), "")));
 
         buttonCenterScreen = new GuiListenerButton(10, 0, 0, 120, 20, i18n.translateKey("gui.photo_mode.button.center_camera"));
@@ -381,7 +378,7 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
 
         scroll(Mouse.getDWheel());
 
-        TileEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, new TileEntity(), -0.5D, -0.75D, -0.5D, partialTick);
+        BlockEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, new BlockEntity(), -0.5D, -0.75D, -0.5D, partialTick);
 
         drawStringCentered(fontRenderer, currentCategory.getCurrentDisplayInfo(I18n.getInstance()), width/2, 1, 0xffffff);
     }
@@ -433,7 +430,7 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
         Minecraft.doPartialTick = tickProgress;
     }
     private void entryTick(){
-        mc.renderEngine.updateDynamicTextures();
+        mc.renderEngine.updateDynamicTextures(false);
         mc.effectRenderer.updateEffects();
         currentCategory.onTick();
         // TODO this fixes world time based animation, but also ticks things like wind and im not certain on the best way to set wind direction arbitrarily right now
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/BlockCategory.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/BlockCategory.java
index 022063230..171038428 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/BlockCategory.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/BlockCategory.java
@@ -9,7 +9,8 @@ import net.minecraft.client.gui.modelviewer.categories.entries.block.MobSpawnerE
 import net.minecraft.client.gui.modelviewer.categories.entries.block.SignEntry;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
@@ -32,10 +33,10 @@ public class BlockCategory extends ModelViewerCategory {
             if (block == null) continue;
             entryHashMap.put(block, new BasicBlockEntry(block));
         }
-        entryHashMap.put(Block.signWallPlanksOak, new SignEntry(Block.signWallPlanksOak));
-        entryHashMap.put(Block.signPostPlanksOak, new SignEntry(Block.signPostPlanksOak));
-        entryHashMap.put(Block.mobspawner, new MobSpawnerEntry());
-        entryHashMap.put(Block.jarGlass, new JarEntry());
+        entryHashMap.put(Blocks.SIGN_WALL_PLANKS_OAK, new SignEntry(Blocks.SIGN_WALL_PLANKS_OAK));
+        entryHashMap.put(Blocks.SIGN_POST_PLANKS_OAK, new SignEntry(Blocks.SIGN_POST_PLANKS_OAK));
+        entryHashMap.put(Blocks.MOBSPAWNER, new MobSpawnerEntry());
+        entryHashMap.put(Blocks.JAR_GLASS, new JarEntry());
     }
 
     @Override
@@ -49,7 +50,7 @@ public class BlockCategory extends ModelViewerCategory {
         String name = "None";
         if (displayBlock != null){
             name = I18n.getInstance().translateNameKey(displayBlock.getKey());
-            ItemStack[] nameStack = displayBlock.getBreakResult(mc.theWorld, EnumDropCause.PICK_BLOCK, DisplayChunk.displayBlockPosX, DisplayChunk.displayBlockPosY, DisplayChunk.displayBlockPosZ, DisplayChunk.displayBlockMeta, DisplayChunk.displayTileEntity);
+            ItemStack[] nameStack = displayBlock.getBreakResult(mc.theWorld, EnumDropCause.PICK_BLOCK, DisplayChunk.displayBlockPosX, DisplayChunk.displayBlockPosY, DisplayChunk.displayBlockPosZ, DisplayChunk.displayBlockMeta, DisplayChunk.displayBlockEntity);
             if (nameStack != null && nameStack.length > 0){
                 name = nameStack[0].getDisplayName();
             }
@@ -166,7 +167,7 @@ public class BlockCategory extends ModelViewerCategory {
             entry.onTick(mc.theWorld, DisplayChunk.displayBlockMeta);
         }
         // Delete any items blocks create when added/removed
-        mc.theWorld.loadedEntityList.removeIf(entity -> entity instanceof EntityItem);
+        mc.theWorld.loadedEntityList.removeIf(entity -> entity instanceof ItemEntity);
     }
     public void setDisplayBlock(int id, int meta){
         Block displayBlock = Block.blocksList[DisplayChunk.displayBlockId];
@@ -188,7 +189,7 @@ public class BlockCategory extends ModelViewerCategory {
         displayBlock = Block.blocksList[id];
         if (displayBlock != null && _id != id){
             entry = entryHashMap.get(Block.getBlock(DisplayChunk.displayBlockId));
-            displayBlock.onBlockAdded(mc.theWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z);
+            displayBlock.onBlockPlacedByWorld(mc.theWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z);
             if (entry != null) entry.onOpen(mc.theWorld, DisplayChunk.displayBlockMeta);
         }
         if (_id != id){
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/EntityCategory.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/EntityCategory.java
index ef8f5e3a6..eb1600c4f 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/EntityCategory.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/EntityCategory.java
@@ -20,9 +20,9 @@ import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.monster.EntityHuman;
-import net.minecraft.core.entity.monster.EntityZombie;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.monster.HumanMob;
+import net.minecraft.core.entity.monster.ZombieMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.MathHelper;
 
@@ -89,12 +89,12 @@ public class EntityCategory extends ModelViewerCategory{
     @Override
     public void addContextButtons(List<GuiButton> buttonList) {
         GuiButton lastButton = buttonList.get(buttonList.size()-1);
-        boolean isLiving = displayEntity instanceof EntityLiving;
+        boolean isLiving = displayEntity instanceof Mob;
         if (isLiving){
             entityVariant = new GuiTextCycle<Integer>(modelViewer, mc.fontRenderer, modelViewer.width - 120, lastButton.yPosition + 21, 120, 20, 0) {
                 @Override
                 public Integer cycleElement(Integer current, int offset) {
-                    return (current + offset) & 0x7F;
+                    return (current + offset) & 0xFF;
                 }
 
                 @Override
@@ -111,7 +111,7 @@ public class EntityCategory extends ModelViewerCategory{
                     return String.valueOf(element);
                 }
             };
-            entityVariant.setOnValueChanged(() -> ((EntityLiving) displayEntity).setSkinVariant(entityVariant.getCurrentElement()));
+            entityVariant.setOnValueChanged(() -> ((Mob) displayEntity).setSkinVariant(entityVariant.getCurrentElement()));
             entityVariant.textField.setPlaceholder("Variant");
             entityVariant.textField.setPrefaceText("Variant: ");
             buttonList.add(entityVariant);
@@ -151,7 +151,7 @@ public class EntityCategory extends ModelViewerCategory{
 
     @Override
     public void onOpen() {
-        currentEntry = entryMap.get(EntityZombie.class);
+        currentEntry = entryMap.get(ZombieMob.class);
         currentEntry.onOpen();
         setDisplayEntity(currentEntry.getEntityInstance(mc, mc.theWorld));
     }
@@ -168,11 +168,11 @@ public class EntityCategory extends ModelViewerCategory{
             displayEntity.tickCount++;
             getEntry(displayEntity).onTick(displayEntity);
         }
-        if (!(displayEntity instanceof EntityHuman) || System.currentTimeMillis() > modelViewer.timeLastKeyPressed + 1000){
-            if (displayEntity != null && displayEntity instanceof EntityLiving){
-                String oldNick = ((EntityLiving) displayEntity).nickname;
+        if (!(displayEntity instanceof HumanMob) || System.currentTimeMillis() > modelViewer.timeLastKeyPressed + 1000){
+            if (displayEntity != null && displayEntity instanceof Mob){
+                String oldNick = ((Mob) displayEntity).nickname;
                 if (!oldNick.equals(entityName.getText())){
-                    ((EntityLiving) displayEntity).setNickname(entityName.getText());
+                    ((Mob) displayEntity).setNickname(entityName.getText());
                 }
             }
         }
@@ -186,8 +186,8 @@ public class EntityCategory extends ModelViewerCategory{
             displayEntity.absMoveTo(mc.thePlayer.x, mc.thePlayer.y - displayEntity.bbHeight/2, mc.thePlayer.z, displayEntity.yRot, displayEntity.xRot);
             displayEntity.lerpMotion(0, 0, 0);
             mc.theWorld.entityJoinedWorld(displayEntity);
-            if (displayEntity instanceof EntityLiving){
-                ((EntityLiving) displayEntity).setSkinVariant(0);
+            if (displayEntity instanceof Mob){
+                ((Mob) displayEntity).setSkinVariant(0);
             }
         }
         mc.effectRenderer.clearEffects(mc.theWorld);
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ParticleCategory.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ParticleCategory.java
index 49ea7430d..4a2a5e530 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ParticleCategory.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ParticleCategory.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.gui.modelviewer.categories;
 
-import net.minecraft.client.entity.fx.ParticleDispatcher;
+import net.minecraft.client.entity.particle.ParticleDispatcher;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.gui.modelviewer.categories.entries.particle.BlockFXEntry;
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BasicBlockEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BasicBlockEntry.java
index ec6d09414..056256d7a 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BasicBlockEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BasicBlockEntry.java
@@ -4,6 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.List;
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BlockEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BlockEntry.java
index 5725909fc..765800e1f 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BlockEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/BlockEntry.java
@@ -4,6 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.List;
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/JarEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/JarEntry.java
index 7fa0c24ed..9a20b985f 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/JarEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/JarEntry.java
@@ -6,7 +6,8 @@ import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlowerJar;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.FlowerJarBlockEntity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.DisplayChunk;
@@ -16,7 +17,7 @@ import java.util.List;
 
 public class JarEntry extends BlockEntry{
     public JarEntry() {
-        super(Block.jarGlass);
+        super(Blocks.JAR_GLASS);
     }
 
     @Override
@@ -50,7 +51,7 @@ public class JarEntry extends BlockEntry{
         };
         jarCycle.textField.setPrefaceText("Jar: ");
         jarCycle.textField.setPlaceholder("Jar ID");
-        jarCycle.setOnValueChanged(() -> ((TileEntityFlowerJar)DisplayChunk.displayTileEntity).flowerInPot = jarCycle.getCurrentElement());
+        jarCycle.setOnValueChanged(() -> ((FlowerJarBlockEntity)DisplayChunk.displayBlockEntity).flowerInPot = jarCycle.getCurrentElement());
 
         return new ArrayList<GuiButton>(){{add(jarCycle);}};
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/MobSpawnerEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/MobSpawnerEntry.java
index 4b8bad0f2..a88e0de49 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/MobSpawnerEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/MobSpawnerEntry.java
@@ -4,8 +4,8 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListSelectorButton;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.entity.EntityDispatcher;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
@@ -16,12 +16,12 @@ import java.util.List;
 
 public class MobSpawnerEntry extends BlockEntry{
     public MobSpawnerEntry() {
-        super(Block.mobspawner);
+        super(Blocks.MOBSPAWNER);
     }
 
     @Override
     public void onTick(World world, int meta) {
-        TileEntityMobSpawner spawner = (TileEntityMobSpawner) DisplayChunk.displayTileEntity;
+        MobSpawnerBlockEntity spawner = (MobSpawnerBlockEntity) DisplayChunk.displayBlockEntity;
         spawner.yaw2 = spawner.yaw;
         double xPos = (double) spawner.x + spawner.worldObj.rand.nextFloat();
         double yPos = (double) spawner.y + spawner.worldObj.rand.nextFloat();
@@ -45,7 +45,7 @@ public class MobSpawnerEntry extends BlockEntry{
                 return element;
             }
         };
-        dispatcherIds.setOnValueChanged(() -> ((TileEntityMobSpawner)DisplayChunk.displayTileEntity).setMobId(dispatcherIds.getCurrentElement()));
+        dispatcherIds.setOnValueChanged(() -> ((MobSpawnerBlockEntity)DisplayChunk.displayBlockEntity).setMobId(dispatcherIds.getCurrentElement()));
         return new ArrayList<GuiButton>(){{add(dispatcherIds);}};
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/SignEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/SignEntry.java
index af1fba73a..0789f9652 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/SignEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/block/SignEntry.java
@@ -5,7 +5,7 @@ import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.DisplayChunk;
 
@@ -24,7 +24,7 @@ public class SignEntry extends BlockEntry{
 
     @Override
     public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, World world, int meta) {
-        TileEntitySign sign = (TileEntitySign)DisplayChunk.displayTileEntity;
+        SignBlockEntity sign = (SignBlockEntity)DisplayChunk.displayBlockEntity;
         GuiListenerTextField line1 = new GuiListenerTextField(parentScreen, mc.fontRenderer, -120, 0,                       120, 20, "", "Line 1");
         GuiListenerTextField line2 = new GuiListenerTextField(parentScreen, mc.fontRenderer, -120, line1.yPosition + 21,    120, 20, "", "Line 2");
         GuiListenerTextField line3 = new GuiListenerTextField(parentScreen, mc.fontRenderer, -120, line2.yPosition + 21,    120, 20, "", "Line 3");
@@ -49,6 +49,6 @@ public class SignEntry extends BlockEntry{
 
     @Override
     public void onOpen(World world, int meta) {
-        DisplayChunk.setDisplayTileEntity(world, new TileEntitySign());
+        DisplayChunk.setDisplayTileEntity(world, new SignBlockEntity());
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityArmoredZombieEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityArmoredZombieEntry.java
index b8339e7a1..7ec452b4b 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityArmoredZombieEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityArmoredZombieEntry.java
@@ -4,21 +4,21 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
-import net.minecraft.core.entity.monster.EntityArmoredZombie;
+import net.minecraft.core.entity.monster.ZombieArmoredMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityArmoredZombieEntry extends EntityEntry<EntityArmoredZombie>{
+public class EntityArmoredZombieEntry extends EntityEntry<ZombieArmoredMob>{
     @Override
-    public void onTick(EntityArmoredZombie entity) {
+    public void onTick(ZombieArmoredMob entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityArmoredZombie armoredZombie) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, ZombieArmoredMob armoredZombie) {
         List<GuiButton> buttonList = new ArrayList<>();
         GuiListenerButton swordButton = new GuiListenerButton(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.armored_zombie.button.sword", false));
         swordButton.setActionListener(() -> {
@@ -31,8 +31,8 @@ public class EntityArmoredZombieEntry extends EntityEntry<EntityArmoredZombie>{
     }
 
     @Override
-    public EntityArmoredZombie getEntityInstance(Minecraft mc, World world) {
-        EntityArmoredZombie armoredZombie = new EntityArmoredZombie(world);
+    public ZombieArmoredMob getEntityInstance(Minecraft mc, World world) {
+        ZombieArmoredMob armoredZombie = new ZombieArmoredMob(world);
         armoredZombie.setHoldingSword(false);
         return armoredZombie;
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityBoatEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityBoatEntry.java
index a9b502be5..c9085d1b9 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityBoatEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityBoatEntry.java
@@ -4,27 +4,27 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityBoatEntry extends EntityEntry<EntityBoat>{
+public class EntityBoatEntry extends EntityEntry<BoatEntity>{
     @Override
-    public void onTick(EntityBoat entity) {
+    public void onTick(BoatEntity entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityBoat entity) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, BoatEntity entity) {
         GuiListenerButton flagButton = new GuiListenerButton(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.boat.button.flag", false));
         flagButton.setActionListener(() -> {
             boolean flag;
             if (entity.tileEntityFlag == null){
-                entity.tileEntityFlag = new TileEntityFlag();
+                entity.tileEntityFlag = new FlagBlockEntity();
                 flag = true;
             } else {
                 entity.tileEntityFlag = null;
@@ -36,8 +36,8 @@ public class EntityBoatEntry extends EntityEntry<EntityBoat>{
     }
 
     @Override
-    public EntityBoat getEntityInstance(Minecraft mc, World world) {
-        EntityBoat boat = new EntityBoat(world);
+    public BoatEntity getEntityInstance(Minecraft mc, World world) {
+        BoatEntity boat = new BoatEntity(world);
         boat.yRot = 270f;
         boat.zd = 100; // Causes the flag to rotate when enabled
         return boat;
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityCreeperEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityCreeperEntry.java
index 2fe012e36..c495ec7ba 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityCreeperEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityCreeperEntry.java
@@ -4,21 +4,21 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
-import net.minecraft.core.entity.monster.EntityCreeper;
+import net.minecraft.core.entity.monster.CreeperMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityCreeperEntry extends EntityEntry<EntityCreeper>{
+public class EntityCreeperEntry extends EntityEntry<CreeperMob>{
     @Override
-    public void onTick(EntityCreeper entity) {
+    public void onTick(CreeperMob entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityCreeper creeper) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, CreeperMob creeper) {
         List<GuiButton> buttonList = new ArrayList<>();
         boolean isCharged = creeper.getPowered();
         GuiListenerButton chargedToggle = new GuiListenerButton(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.creeper.button.charged", isCharged));
@@ -33,8 +33,8 @@ public class EntityCreeperEntry extends EntityEntry<EntityCreeper>{
     }
 
     @Override
-    public EntityCreeper getEntityInstance(Minecraft mc, World world) {
-        return new EntityCreeper(world);
+    public CreeperMob getEntityInstance(Minecraft mc, World world) {
+        return new CreeperMob(world);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFallingSandEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFallingSandEntry.java
index 1b7a020b0..12258c0f6 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFallingSandEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFallingSandEntry.java
@@ -6,21 +6,21 @@ import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.EntityFallingSand;
-import net.minecraft.core.util.helper.MathHelper;
+
+import net.minecraft.core.entity.FallingBlockEntity;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityFallingSandEntry extends EntityEntry<EntityFallingSand>{
+public class EntityFallingSandEntry extends EntityEntry<FallingBlockEntity>{
     @Override
-    public void onTick(EntityFallingSand entity) {
+    public void onTick(FallingBlockEntity entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityFallingSand sand) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, FallingBlockEntity sand) {
         GuiTextCycle<Integer> blockIdCycle = new GuiTextCycle<Integer>(parentScreen, mc.fontRenderer, - 120, 0, 120, 20, sand.blockID) {
             @Override
             public Integer cycleElement(Integer current, int offset) {
@@ -48,8 +48,8 @@ public class EntityFallingSandEntry extends EntityEntry<EntityFallingSand>{
     }
 
     @Override
-    public EntityFallingSand getEntityInstance(Minecraft mc, World world) {
-        return new EntityFallingSand(world);
+    public FallingBlockEntity getEntityInstance(Minecraft mc, World world) {
+        return new FallingBlockEntity(world);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFireflyEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFireflyEntry.java
index 6fde34902..f310e30f3 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFireflyEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityFireflyEntry.java
@@ -5,7 +5,7 @@ import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListSelectorButton;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
@@ -13,9 +13,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-public class EntityFireflyEntry extends EntityEntry<EntityFireflyCluster>{
+public class EntityFireflyEntry extends EntityEntry<FireflyClusterMob>{
     @Override
-    public void onTick(EntityFireflyCluster fireflyCluster) {
+    public void onTick(FireflyClusterMob fireflyCluster) {
         Random random = fireflyCluster.world.rand;
         double dy = (random.nextFloat() * 2F - 1F) * (fireflyCluster.bbHeight);
         double dx = (random.nextFloat() * 2F - 1F) * (fireflyCluster.bbWidth);
@@ -27,7 +27,7 @@ public class EntityFireflyEntry extends EntityEntry<EntityFireflyCluster>{
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityFireflyCluster fireflyCluster) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, FireflyClusterMob fireflyCluster) {
         List<GuiButton> buttonList = new ArrayList<>();
         GuiListenerSlider slider = new GuiListenerSlider(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.fireflycluster.slider.size", 0), 0f);
         slider.setOnValueChanged(() -> {
@@ -35,9 +35,9 @@ public class EntityFireflyEntry extends EntityEntry<EntityFireflyCluster>{
             slider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.fireflycluster.slider.size", fireflyCluster.getClusterSize());
         });
 
-        GuiListSelectorButton<EntityFireflyCluster.FireflyColor> button = new GuiListSelectorButton<EntityFireflyCluster.FireflyColor>(-1, - 120, slider.yPosition + 21, 120, 20, I18n.getInstance().translateKey("model.category.entity.fireflycluster.button.cycle"), EntityFireflyCluster.FireflyColor.fireFlyColors.values(), EntityFireflyCluster.FireflyColor.GREEN) {
+        GuiListSelectorButton<FireflyClusterMob.FireflyColor> button = new GuiListSelectorButton<FireflyClusterMob.FireflyColor>(-1, - 120, slider.yPosition + 21, 120, 20, I18n.getInstance().translateKey("model.category.entity.fireflycluster.button.cycle"), FireflyClusterMob.FireflyColor.fireFlyColors.values(), FireflyClusterMob.FireflyColor.GREEN) {
             @Override
-            public String getNameFromElement(EntityFireflyCluster.FireflyColor element) {
+            public String getNameFromElement(FireflyClusterMob.FireflyColor element) {
                 return element.getParticleName();
             }
         };
@@ -48,8 +48,8 @@ public class EntityFireflyEntry extends EntityEntry<EntityFireflyCluster>{
     }
 
     @Override
-    public EntityFireflyCluster getEntityInstance(Minecraft mc, World world) {
-        EntityFireflyCluster cluster = new EntityFireflyCluster(world);
+    public FireflyClusterMob getEntityInstance(Minecraft mc, World world) {
+        FireflyClusterMob cluster = new FireflyClusterMob(world);
         cluster.setClusterSize(0);
         return cluster;
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityItemEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityItemEntry.java
index aefb08c79..8aada06d3 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityItemEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityItemEntry.java
@@ -6,8 +6,8 @@ import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
@@ -17,16 +17,16 @@ import net.minecraft.core.world.World;
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityItemEntry extends EntityEntry<EntityItem>{
+public class EntityItemEntry extends EntityEntry<ItemEntity>{
     @Override
-    public void onTick(EntityItem entityItem) {
-        entityItem.age++;
+    public void onTick(ItemEntity itemEntity) {
+        itemEntity.age++;
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityItem entityItem) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, ItemEntity itemEntity) {
         List<GuiButton> buttonList = new ArrayList<>();
-        entityItem.item = Block.stone.getDefaultStack();
+        itemEntity.item = Blocks.STONE.getDefaultStack();
         GuiTextCycle<Integer> itemIdCycle = new GuiTextCycle<Integer>(parentScreen, mc.fontRenderer, - 120, 0, 120, 20, 1) {
             @Override
             public Integer cycleElement(Integer current, int offset) {
@@ -39,7 +39,7 @@ public class EntityItemEntry extends EntityEntry<EntityItem>{
                     int id = Integer.parseInt(s);
                     return MathHelper.clamp(id, 0, Item.itemsList.length);
                 } catch (Exception ignored){}
-                return entityItem.item.itemID;
+                return itemEntity.item.itemID;
             }
 
             @Override
@@ -62,7 +62,7 @@ public class EntityItemEntry extends EntityEntry<EntityItem>{
                     int id = Integer.parseInt(s);
                     return MathHelper.clamp(id, 0, 0x3FFF);
                 } catch (Exception ignored){}
-                return entityItem.item.getMetadata();
+                return itemEntity.item.getMetadata();
             }
 
             @Override
@@ -74,12 +74,12 @@ public class EntityItemEntry extends EntityEntry<EntityItem>{
         metaCycle.textField.setPlaceholder("Meta");
         GuiListenerSlider sizeSlider = new GuiListenerSlider(-1, - 120, metaCycle.yPosition + 21,120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.item.slider.size", 1), 1/64f);
 
-        itemIdCycle.setOnValueChanged(() -> entityItem.item = new ItemStack(itemIdCycle.getCurrentElement(), (int) (sizeSlider.sliderValue * 64), metaCycle.getCurrentElement()));
-        metaCycle.setOnValueChanged(() -> entityItem.item = new ItemStack(itemIdCycle.getCurrentElement(), (int) (sizeSlider.sliderValue * 64), metaCycle.getCurrentElement()));
+        itemIdCycle.setOnValueChanged(() -> itemEntity.item = new ItemStack(itemIdCycle.getCurrentElement(), (int) (sizeSlider.sliderValue * 64), metaCycle.getCurrentElement()));
+        metaCycle.setOnValueChanged(() -> itemEntity.item = new ItemStack(itemIdCycle.getCurrentElement(), (int) (sizeSlider.sliderValue * 64), metaCycle.getCurrentElement()));
 
         sizeSlider.setOnValueChanged(() -> {
-            entityItem.item.stackSize = (int) (sizeSlider.sliderValue * 64);
-            sizeSlider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.item.slider.size", entityItem.item.stackSize);
+            itemEntity.item.stackSize = (int) (sizeSlider.sliderValue * 64);
+            sizeSlider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.item.slider.size", itemEntity.item.stackSize);
         });
 
         buttonList.add(itemIdCycle);
@@ -89,8 +89,8 @@ public class EntityItemEntry extends EntityEntry<EntityItem>{
     }
 
     @Override
-    public EntityItem getEntityInstance(Minecraft mc, World world) {
-        return new EntityItem(world);
+    public ItemEntity getEntityInstance(Minecraft mc, World world) {
+        return new ItemEntity(world);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityMinecartEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityMinecartEntry.java
index 55ad456a2..1d64b63d9 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityMinecartEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityMinecartEntry.java
@@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 import org.lwjgl.input.Keyboard;
@@ -12,22 +12,22 @@ import org.lwjgl.input.Keyboard;
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityMinecartEntry extends EntityEntry<EntityMinecart>{
+public class EntityMinecartEntry extends EntityEntry<MinecartEntity>{
     @Override
-    public void onTick(EntityMinecart entity) {
+    public void onTick(MinecartEntity entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityMinecart minecart) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, MinecartEntity minecart) {
         GuiListenerButton button = new GuiListenerButton(-1, - 120, 0, 120, 20, I18n.getInstance().translateKey("model.category.entity.minecart.button.cycle"));
-        button.setActionListener(() -> minecart.minecartType = (minecart.minecartType + 3 + (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? -1 : 1)) % 3);
+        button.setActionListener(() -> minecart.type = (minecart.type + 3 + (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? -1 : 1)) % 3);
         return new ArrayList<GuiButton>(){{add(button);}};
     }
 
     @Override
-    public EntityMinecart getEntityInstance(Minecraft mc, World world) {
-        EntityMinecart minecart = new EntityMinecart(world);
+    public MinecartEntity getEntityInstance(Minecraft mc, World world) {
+        MinecartEntity minecart = new MinecartEntity(world);
         minecart.yRot = 270;
         return minecart;
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityPaintingEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityPaintingEntry.java
index df97616ca..8e0122dce 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityPaintingEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityPaintingEntry.java
@@ -4,21 +4,21 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
-import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.entity.PaintingEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityPaintingEntry extends EntityEntry<EntityPainting>{
+public class EntityPaintingEntry extends EntityEntry<PaintingEntity>{
     @Override
-    public void onTick(EntityPainting entity) {
+    public void onTick(PaintingEntity entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityPainting painting) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, PaintingEntity painting) {
         GuiListenerSlider slider = new GuiListenerSlider(-1, - 120, 0, 120, 20, painting.art.key, 0f);
         slider.setOnValueChanged(() -> {
             painting.art = ArtType.values.get((int) (slider.sliderValue * (ArtType.values.size() - 1)));
@@ -28,8 +28,8 @@ public class EntityPaintingEntry extends EntityEntry<EntityPainting>{
     }
 
     @Override
-    public EntityPainting getEntityInstance(Minecraft mc, World world) {
-        EntityPainting painting = new EntityPainting(world);
+    public PaintingEntity getEntityInstance(Minecraft mc, World world) {
+        PaintingEntity painting = new PaintingEntity(world);
         painting.setDirection(2);
         return painting;
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySheepEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySheepEntry.java
index 2005f4784..7c4fd4fc6 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySheepEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySheepEntry.java
@@ -4,27 +4,28 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
-import net.minecraft.core.entity.animal.EntitySheep;
-import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.entity.animal.SheepMob;
+import net.minecraft.core.item.DyeItem;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntitySheepEntry extends EntityEntry<EntitySheep>{
+public class EntitySheepEntry extends EntityEntry<SheepMob>{
     @Override
-    public void onTick(EntitySheep entity) {
+    public void onTick(SheepMob entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntitySheep sheep) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, SheepMob sheep) {
         List<GuiButton> buttonList = new ArrayList<>();
         GuiListenerSlider slider = new GuiListenerSlider(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.sheep.slider.color", "White"), 0f);
         slider.setOnValueChanged(() -> {
-            sheep.setFleeceColor((int) (slider.sliderValue * 15));
-            String color = ItemDye.dyeColors[15 - sheep.getFleeceColor()];
+            sheep.setFleeceColor(DyeColor.colorFromBlockMeta((int) (slider.sliderValue * 15)));
+            String color = sheep.getFleeceColor().colorID;
             String c = String.valueOf(color.charAt(0));
             color = c.toUpperCase() + color.substring(1);
             slider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.sheep.slider.color", color);
@@ -34,9 +35,9 @@ public class EntitySheepEntry extends EntityEntry<EntitySheep>{
     }
 
     @Override
-    public EntitySheep getEntityInstance(Minecraft mc, World world) {
-        EntitySheep sheep = new EntitySheep(world);
-        sheep.setFleeceColor(0);
+    public SheepMob getEntityInstance(Minecraft mc, World world) {
+        SheepMob sheep = new SheepMob(world);
+        sheep.setFleeceColor(DyeColor.WHITE);
         return sheep;
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySlimeEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySlimeEntry.java
index 2bbd32a5e..1da73ad79 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySlimeEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntitySlimeEntry.java
@@ -4,21 +4,21 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
-import net.minecraft.core.entity.monster.EntitySlime;
+import net.minecraft.core.entity.monster.SlimeMob;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntitySlimeEntry extends EntityEntry<EntitySlime>{
+public class EntitySlimeEntry extends EntityEntry<SlimeMob>{
     @Override
-    public void onTick(EntitySlime entity) {
+    public void onTick(SlimeMob entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntitySlime entity) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, SlimeMob entity) {
         List<GuiButton> buttonList = new ArrayList<>();
         GuiListenerSlider slider = new GuiListenerSlider(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.slime.slider.size", 1), 0f);
         slider.setOnValueChanged(() -> {
@@ -30,8 +30,8 @@ public class EntitySlimeEntry extends EntityEntry<EntitySlime>{
     }
 
     @Override
-    public EntitySlime getEntityInstance(Minecraft mc, World world) {
-        return new EntitySlime(world);
+    public SlimeMob getEntityInstance(Minecraft mc, World world) {
+        return new SlimeMob(world);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityTNTEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityTNTEntry.java
index abe344c0c..102fb5a7c 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityTNTEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityTNTEntry.java
@@ -4,21 +4,21 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
-import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.entity.TNTPrimedEntity;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityTNTEntry extends EntityEntry<EntityTNT>{
+public class EntityTNTEntry extends EntityEntry<TNTPrimedEntity>{
     @Override
-    public void onTick(EntityTNT entity) {
+    public void onTick(TNTPrimedEntity entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityTNT tnt) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, TNTPrimedEntity tnt) {
         tnt.fuse = 80;
         GuiListenerSlider slider = new GuiListenerSlider(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.tnt.slider.fuse", 80), 1f);
         slider.setOnValueChanged(() -> {
@@ -29,8 +29,8 @@ public class EntityTNTEntry extends EntityEntry<EntityTNT>{
     }
 
     @Override
-    public EntityTNT getEntityInstance(Minecraft mc, World world) {
-        return new EntityTNT(world);
+    public TNTPrimedEntity getEntityInstance(Minecraft mc, World world) {
+        return new TNTPrimedEntity(world);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityWolfEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityWolfEntry.java
index 0c305b3c3..d63598723 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityWolfEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityWolfEntry.java
@@ -7,8 +7,9 @@ import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.gui.modelviewer.elements.GuiListSelectorButton;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ArmorMaterial;
 import net.minecraft.core.lang.I18n;
@@ -18,19 +19,19 @@ import net.minecraft.core.world.World;
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityWolfEntry extends EntityEntry<EntityWolf>{
-    private static final List<ArmorMaterial> armorMaterials = new ArrayList<>(EntityWolf.ARMOR_MATERIALS.keySet());
+public class EntityWolfEntry extends EntityEntry<WolfMob>{
+    private static final List<ArmorMaterial> armorMaterials = new ArrayList<>(WolfMob.ARMOR_MATERIALS.keySet());
     static {
         armorMaterials.add(null);
     }
 
     @Override
-    public void onTick(EntityWolf entity) {
+    public void onTick(WolfMob entity) {
 
     }
 
     @Override
-    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, EntityWolf entityWolf) {
+    public List<GuiButton> getEntryButtons(Minecraft mc, GuiScreen parentScreen, WolfMob entityWolf) {
         List<GuiButton> buttonList = new ArrayList<>();
         boolean isTamed = entityWolf.isWolfTamed();
         GuiListenerButton tamed = new GuiListenerButton(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.wolf.button.tamed", isTamed));
@@ -151,8 +152,8 @@ public class EntityWolfEntry extends EntityEntry<EntityWolf>{
     }
 
     @Override
-    public EntityWolf getEntityInstance(Minecraft mc, World world) {
-        EntityWolf wolf = new EntityWolf(world);
+    public WolfMob getEntityInstance(Minecraft mc, World world) {
+        WolfMob wolf = new WolfMob(world);
         wolf.setWolfHeldItem(null);
         return wolf;
     }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BlockFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BlockFXEntry.java
index c9c160cc9..bed996f35 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BlockFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BlockFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityDiggingFX;
+import net.minecraft.client.entity.particle.TerrainParticle;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
@@ -93,7 +93,7 @@ public class BlockFXEntry extends GenericFXEntry{
 
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityDiggingFX(world, x, y, z, motionX,motionY,motionZ, Block.getBlock(blockId), side.getId(), meta));
+        mc.effectRenderer.addEffect(new TerrainParticle(world, x, y, z, motionX,motionY,motionZ, Block.getBlock(blockId), side.getId(), meta));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BubbleFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BubbleFXEntry.java
index 46a8587b5..c76bebe6b 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BubbleFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/BubbleFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityBubbleFX;
+import net.minecraft.client.entity.particle.BubbleParticle;
 import net.minecraft.core.world.World;
 
 public class BubbleFXEntry extends GenericFXEntry{
@@ -10,6 +10,6 @@ public class BubbleFXEntry extends GenericFXEntry{
     }
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityBubbleFX(world, x, y, z, motionX, motionY, motionZ, false));
+        mc.effectRenderer.addEffect(new BubbleParticle(world, x, y, z, motionX, motionY, motionZ, false));
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ItemFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ItemFXEntry.java
index be56276f7..d2f3e95e3 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ItemFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ItemFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityItemFX;
+import net.minecraft.client.entity.particle.BreakingItemParticle;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiTextCycle;
@@ -55,7 +55,7 @@ public class ItemFXEntry extends ParticleEntry{
 
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityItemFX(world, x, y, z, Item.itemsList[itemID]));
+        mc.effectRenderer.addEffect(new BreakingItemParticle(world, x, y, z, Item.itemsList[itemID]));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/LeafFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/LeafFXEntry.java
index fd9ebfdef..0481e5c19 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/LeafFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/LeafFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityLeafFX;
+import net.minecraft.client.entity.particle.LeafParticle;
 import net.minecraft.core.world.World;
 
 public class LeafFXEntry extends GenericFXEntry{
@@ -10,6 +10,6 @@ public class LeafFXEntry extends GenericFXEntry{
     }
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityLeafFX(world, x, y, z, motionX, motionY, motionZ));
+        mc.effectRenderer.addEffect(new LeafParticle(world, x, y, z, motionX, motionY, motionZ));
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/NoteFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/NoteFXEntry.java
index 6df504b4b..b5eac2d72 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/NoteFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/NoteFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityNoteFX;
+import net.minecraft.client.entity.particle.NoteParticle;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
@@ -34,7 +34,7 @@ public class NoteFXEntry extends ParticleEntry{
 
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityNoteFX(world, x, y, z, (double) note / 24D, 0.0D, 0.0D));
+        mc.effectRenderer.addEffect(new NoteParticle(world, x, y, z, (double) note / 24D, 0.0D, 0.0D));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/RedDustFXEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/RedDustFXEntry.java
index e6f3b2790..de87b4c6d 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/RedDustFXEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/RedDustFXEntry.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityReddustFX;
+import net.minecraft.client.entity.particle.RedstoneDustParticle;
 import net.minecraft.client.gui.GuiButton;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
@@ -71,7 +71,7 @@ public class RedDustFXEntry extends ParticleEntry{
 
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.effectRenderer.addEffect(new EntityReddustFX(world, x, y, z, red/255f, green/255f, blue/255f, 15));
+        mc.effectRenderer.addEffect(new RedstoneDustParticle(world, x, y, z, red/255f, green/255f, blue/255f, 15));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerButton.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerButton.java
index 547793dfb..331e21c69 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerButton.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerButton.java
@@ -3,7 +3,7 @@ package net.minecraft.client.gui.modelviewer.elements;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
 
-public class GuiListenerButton extends GuiButton implements IListenerElement {
+public class GuiListenerButton extends GuiButton implements IListenerElement<GuiListenerButton> {
     protected IActionListener action;
     protected IKeyListener keyListener;
     protected Runnable onValueChanged;
@@ -29,17 +29,20 @@ public class GuiListenerButton extends GuiButton implements IListenerElement {
         }
     }
     @Override
-    public void setActionListener(IActionListener listener) {
+    public GuiListenerButton setActionListener(IActionListener listener) {
         action = listener;
+        return this;
     }
 
     @Override
-    public void setKeyListener(IKeyListener listener) {
+    public GuiListenerButton setKeyListener(IKeyListener listener) {
         keyListener = listener;
+        return this;
     }
     @Override
-    public void setOnValueChanged(Runnable runnable){
+    public GuiListenerButton setOnValueChanged(Runnable runnable){
         onValueChanged = runnable;
+        return this;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerSlider.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerSlider.java
index f59a43df4..1b54b47cf 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerSlider.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerSlider.java
@@ -4,7 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiSlider;
 import net.minecraft.client.option.FloatOption;
 
-public class GuiListenerSlider extends GuiSlider implements IListenerElement {
+public class GuiListenerSlider extends GuiSlider implements IListenerElement<GuiListenerSlider> {
     private IActionListener action;
     private IKeyListener keyListener;
     private Runnable onValueChanged;
@@ -41,17 +41,20 @@ public class GuiListenerSlider extends GuiSlider implements IListenerElement {
     }
 
     @Override
-    public void setActionListener(IActionListener listener) {
+    public GuiListenerSlider setActionListener(IActionListener listener) {
         action = listener;
+        return this;
     }
 
     @Override
-    public void setKeyListener(IKeyListener listener) {
+    public GuiListenerSlider setKeyListener(IKeyListener listener) {
         keyListener = listener;
+        return this;
     }
     @Override
-    public void setOnValueChanged(Runnable runnable){
+    public GuiListenerSlider setOnValueChanged(Runnable runnable){
         onValueChanged = runnable;
+        return this;
     }
     @Override
     public void onKeyTyped(char c, int key) {
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextField.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextField.java
index 389d185c9..b4765594a 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextField.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextField.java
@@ -35,8 +35,9 @@ public class GuiListenerTextField extends GuiListenerButton implements ITextFiel
         setText(defaultText);
         editor.setCursor(10000);
     }
-    public void setPrefaceText(String prefaceText){
+    public GuiListenerTextField setPrefaceText(String prefaceText){
         this.prefaceText = prefaceText;
+        return this;
     }
 
     @Override
@@ -176,8 +177,9 @@ public class GuiListenerTextField extends GuiListenerButton implements ITextFiel
         return isFocused || super.isHovered(mouseX, mouseY);
     }
 
-    public void setTextChangeListener(ITextChangeListener textChangeListener) {
+    public GuiListenerTextField setTextChangeListener(ITextChangeListener textChangeListener) {
         this.textChangeListener = textChangeListener;
+        return this;
     }
 
     public interface ITextChangeListener
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java
index 2f9d8d47f..5393017fe 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java
@@ -13,13 +13,19 @@ public class GuiListenerTextureButton extends GuiListenerButton{
         this.u = u;
         this.v = v;
     }
+    public GuiListenerTextureButton(int id, String texturePath, int xPosition, int yPosition, int u, int v, int width, int height, String s) {
+        super(id, xPosition, yPosition, width, height, s);
+        this.texturePath = texturePath;
+        this.u = u;
+        this.v = v;
+    }
 
     @Override
     public void drawButton(Minecraft mc, int mouseX, int mouseY) {
         if (!visible) {
             return;
         }
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(texturePath));
+        mc.renderEngine.loadTexture(texturePath).bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         boolean isHovered = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
         if (!enabled)
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/IListenerElement.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/IListenerElement.java
index 98a74d34d..537123eae 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/elements/IListenerElement.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/IListenerElement.java
@@ -1,9 +1,9 @@
 package net.minecraft.client.gui.modelviewer.elements;
 
-public interface IListenerElement {
-    void setActionListener(IActionListener listener);
-    void setKeyListener(IKeyListener listener);
-    void setOnValueChanged(Runnable action);
+public interface IListenerElement<T> {
+    T setActionListener(IActionListener listener);
+    T setKeyListener(IKeyListener listener);
+    T setOnValueChanged(Runnable action);
     void onKeyTyped(char c, int key);
     void onValueChanged();
 }
diff --git a/src/main/java/net/minecraft/client/gui/options/GuiOptions.java b/src/main/java/net/minecraft/client/gui/options/GuiOptions.java
index fb530fc7c..edb1b6dc2 100644
--- a/src/main/java/net/minecraft/client/gui/options/GuiOptions.java
+++ b/src/main/java/net/minecraft/client/gui/options/GuiOptions.java
@@ -205,16 +205,16 @@ public class GuiOptions
             mouseY = -1;
         } else if (doOptionsScroll && mouseX > pagesListWidth + SEPARATOR_WIDTH + PADDING && mouseX < width) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
-                scrollOptions(Mouse.getDWheel() * -1.0f);
+                scrollOptions(Mouse.getDWheel() / -0.01f);
             } else {
-                scrollOptions(Mouse.getDWheel() / -5.0f);
+                scrollOptions(Mouse.getDWheel() / -0.05f);
             }
             onScrollOptions();
         } else if (doPagesListScroll && mouseX >= 0 && mouseX <= pagesListWidth) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
-                scrollPagesList(Mouse.getDWheel() * -1.0f);
+                scrollPagesList(Mouse.getDWheel() / -0.01f);
             } else {
-                scrollPagesList(Mouse.getDWheel() / -5.0f);
+                scrollPagesList(Mouse.getDWheel() / -0.05f);
             }
             onScrollPagesList();
         }
@@ -471,7 +471,7 @@ public class GuiOptions
         if (mc.theWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
-            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             float scale = 32F;
             tessellator.startDrawingQuads();
@@ -502,7 +502,7 @@ public class GuiOptions
         if (mc.theWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
-            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             float scale = 32F;
             tessellator.startDrawingQuads();
diff --git a/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java b/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
index eb0a401c8..fb765e2bf 100644
--- a/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
+++ b/src/main/java/net/minecraft/client/gui/options/components/ButtonComponent.java
@@ -2,7 +2,6 @@ package net.minecraft.client.gui.options.components;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiTexturedButton;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.lang.I18n;
@@ -26,7 +25,8 @@ public abstract class ButtonComponent
     public ButtonComponent(String translationKey)
     {
         this.translationKey = translationKey;
-        this.resetButton = new GuiTexturedButton(0, "/assets/minecraft/textures/gui/gui.png", 0, 0, 40, 86, 20, 20);
+        this.resetButton = new GuiButton(0, 0, 0, 20, 20, "")
+            .setTextures("minecraft:gui/misc/icon_reset", "minecraft:gui/misc/icon_reset_highlighted", "minecraft:gui/misc/icon_reset");
     }
 
     public abstract void resetValue();
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 d88ca6e70..07e1ebc04 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
@@ -4,43 +4,53 @@ import net.betterthanadventure.utils.BiomeFinder;
 import net.betterthanadventure.utils.DataDumper;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiControllerSetup;
-import net.minecraft.client.gui.GuiException;
 import net.minecraft.client.gui.GuiHudDesigner;
-import net.minecraft.client.gui.GuiMainMenu;
-import net.minecraft.client.gui.guidebook.GuiGuidebook;
-import net.minecraft.client.gui.guidebook.PageManager;
-import net.minecraft.client.gui.guidebook.search.SearchPage;
+import net.minecraft.client.gui.GuiSoundTest;
+import net.minecraft.client.gui.GuiTextureViewer;
+import net.minecraft.client.gui.achievements.GuiAchievements;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
-import net.minecraft.client.gui.options.components.*;
-import net.minecraft.client.gui.popup.GuiPopup;
+import net.minecraft.client.gui.options.components.AvailableTexturePackListComponent;
+import net.minecraft.client.gui.options.components.BooleanOptionComponent;
+import net.minecraft.client.gui.options.components.FloatOptionComponent;
+import net.minecraft.client.gui.options.components.FramerateOptionComponent;
+import net.minecraft.client.gui.options.components.IntegerOptionComponent;
+import net.minecraft.client.gui.options.components.KeyBindingComponent;
+import net.minecraft.client.gui.options.components.LanguagePackListComponent;
+import net.minecraft.client.gui.options.components.OptionsCategory;
+import net.minecraft.client.gui.options.components.SearchFieldComponent;
+import net.minecraft.client.gui.options.components.SelectedTexturePackListComponent;
+import net.minecraft.client.gui.options.components.ShortcutComponent;
+import net.minecraft.client.gui.options.components.ToggleableOptionComponent;
+import net.minecraft.client.gui.options.components.TooltipPickerComponent;
 import net.minecraft.client.player.controller.PlayerControllerSP;
-import net.minecraft.client.render.OpenGLHelper;
+import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.core.Global;
+import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.Utils;
 import net.minecraft.core.world.World;
-import org.lwjgl.opengl.GL11;
 
+import javax.management.RuntimeErrorException;
 import java.io.File;
 
 
 public abstract class OptionsPages
 {
     private static final Minecraft mc = Minecraft.getMinecraft(OptionsPages.class);
-    public static final OptionsPage GENERAL = register(new OptionsPage("gui.options.page.general.title", new ItemStack(Block.grassRetro))
+    public static final OptionsPage GENERAL = register(new OptionsPage("gui.options.page.general.title", new ItemStack(Blocks.GRASS_RETRO))
         .withComponent(new OptionsCategory("gui.options.page.general.category.gameplay")
             .withComponent(new FloatOptionComponent(mc.gameSettings.FoV))
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.difficulty))
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.placementMode))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.autoHit))
+            .withComponent(new BooleanOptionComponent(mc.gameSettings.easyBridge))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.viewBobbing))
         )
         .withComponent(new OptionsCategory("gui.options.page.general.category.user_interface")
+            .withComponent(new ShortcutComponent("gui.options.page.general.button.edit_hud", () -> mc.displayGuiScreen(new GuiHudDesigner(mc.currentScreen))))
             .withComponent(new IntegerOptionComponent(mc.gameSettings.guiScale))
             .withComponent(new FloatOptionComponent(mc.gameSettings.screenPadding))
             .withComponent(new TooltipPickerComponent<>(mc.gameSettings.tooltipStyle))
@@ -59,7 +69,6 @@ public abstract class OptionsPages
             .withComponent(new BooleanOptionComponent(mc.gameSettings.forceUnicodeFont))
             .withComponent(new FloatOptionComponent(mc.gameSettings.autosaveTimer))
         )
-        .withComponent(new ShortcutComponent("gui.options.page.general.button.edit_hud", () -> mc.displayGuiScreen(new GuiHudDesigner(mc.currentScreen))))
         .withComponent(new ShortcutComponent("gui.options.page.general.button.open_worlds_folder", () -> Utils.openDirectory(new File(mc.getMinecraftDir(), "saves"))))
         .withComponent(new ShortcutComponent("gui.options.page.general.button.open_screenshots_folder", () -> {
             File f = new File(mc.getMinecraftDir(), "screenshots");
@@ -68,7 +77,7 @@ public abstract class OptionsPages
         }))
     );
 
-    public static final OptionsPage AUDIO = register(new OptionsPage("gui.options.page.audio.title", new ItemStack(Item.recordCat))
+    public static final OptionsPage AUDIO = register(new OptionsPage("gui.options.page.audio.title", new ItemStack(Items.RECORD_CAT))
         .withComponent(new OptionsCategory("gui.options.page.audio.category.audio")
             .withComponent(new BooleanOptionComponent(mc.gameSettings.muteOnLostFocus))
             .withComponent(new FloatOptionComponent(mc.gameSettings.masterVolume))
@@ -80,7 +89,7 @@ public abstract class OptionsPages
             .withComponent(new FloatOptionComponent(mc.gameSettings.guiSoundsVolume))
         )
     );
-    public static final OptionsPage VIDEO = register(new OptionsPage("gui.options.page.video.title", new ItemStack(Item.flag))
+    public static final OptionsPage VIDEO = register(new OptionsPage("gui.options.page.video.title", new ItemStack(Items.FLAG))
         .withComponent(new OptionsCategory("gui.options.page.video.category.graphics")
             .withComponent(new BooleanOptionComponent(mc.gameSettings.fullscreen))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.borderlessFullscreen))
@@ -119,8 +128,7 @@ public abstract class OptionsPages
             .withComponent(new FloatOptionComponent(mc.gameSettings.blockOutlineWidth))
         )
     );
-    public static final OptionsPage CONTROLS = register(new OptionsPage("gui.options.page.controls.title", new ItemStack(Item.boat))
-        .withComponent(new ShortcutComponent("gui.options.page.controls.button.controller_setup", () -> mc.displayGuiScreen(new GuiControllerSetup(mc.currentScreen))))
+    public static final OptionsPage CONTROLS = register(new OptionsPage("gui.options.page.controls.title", new ItemStack(Items.BOAT))
         .withComponent(new OptionsCategory("gui.options.page.controls.category.mouse")
             .withComponent(new FloatOptionComponent(mc.gameSettings.mouseSensitivity))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.invertMouse))
@@ -135,6 +143,7 @@ public abstract class OptionsPages
             .withComponent(new BooleanOptionComponent(mc.gameSettings.swapCraftingButtons))
         )
         .withComponent(new OptionsCategory("gui.options.page.controls.category.controller")
+            .withComponent(new ShortcutComponent("gui.options.page.controls.button.controller_setup", () -> mc.displayGuiScreen(new GuiControllerSetup(mc.currentScreen))))
             .withComponent(new FloatOptionComponent(mc.gameSettings.controllerSensitivity))
             .withComponent(new FloatOptionComponent(mc.gameSettings.controllerMenuSensitivity))
             .withComponent(new FloatOptionComponent(mc.gameSettings.controllerDeadzoneLeft))
@@ -205,7 +214,7 @@ public abstract class OptionsPages
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyScreenshot))
         )
     );
-    public static final OptionsPage TEXTURE_PACKS = register(new OptionsPage("gui.options.page.texture_packs.title", new ItemStack(Item.painting))
+    public static final OptionsPage TEXTURE_PACKS = register(new OptionsPage("gui.options.page.texture_packs.title", new ItemStack(Items.PAINTING))
         .withComponent(new ShortcutComponent("gui.options.page.texture_packs.button.open_folder", () -> Utils.openDirectory(new File(mc.getMinecraftDir(), "texturepacks"))))
         .withComponent(new OptionsCategory("gui.options.page.texture_packs.category.textures")
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.animations))
@@ -221,16 +230,16 @@ public abstract class OptionsPages
             .withComponent(new AvailableTexturePackListComponent())
         )
     );
-    public static final OptionsPage LANGUAGE = register(new OptionsPage("gui.options.page.language_packs.title", new ItemStack(Item.book))
+    public static final OptionsPage LANGUAGE = register(new OptionsPage("gui.options.page.language_packs.title", new ItemStack(Items.BOOK))
         .withComponent(new ShortcutComponent("gui.options.page.language_packs.button.open_folder", () -> Utils.openDirectory(new File(mc.getMinecraftDir(), "languages"))))
         .withComponent(new OptionsCategory("gui.options.page.language_packs.category.language_packs")
             .withComponent(new LanguagePackListComponent())
         )
     );
-    public static final OptionsPage SEARCH = register(new OptionsPage("gui.options.page.search.title", new ItemStack(Block.glass))
+    public static final OptionsPage SEARCH = register(new OptionsPage("gui.options.page.search.title", new ItemStack(Blocks.GLASS))
         .withComponent(new SearchFieldComponent())
     );
-    public static final OptionsPage DEBUG = new OptionsPage("gui.options.page.debug.title", Block.bedrock.getDefaultStack())
+    public static final OptionsPage DEBUG = new OptionsPage("gui.options.page.debug.title", Blocks.BEDROCK.getDefaultStack())
         .withComponent(new OptionsCategory("gui.options.page.debug.category.controls")
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyToggleTextureAtlas))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyToggleDebug))
@@ -278,6 +287,8 @@ public abstract class OptionsPages
                                }
                            }
             )
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.sound_test", () -> mc.displayGuiScreen(new GuiSoundTest(mc.currentScreen))))
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.texture_viewer", () -> mc.displayGuiScreen(new GuiTextureViewer(mc.currentScreen))))
             .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.biome_finder", () -> {
                 BiomeFinder.main(new String[0]);
                 Global.accessor = mc;
@@ -287,18 +298,38 @@ public abstract class OptionsPages
                 Utils.openDirectory(new File(mc.getMinecraftDir(), "infodump"));
                 Global.accessor = mc;
             }))
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.achievements", () -> mc.displayGuiScreen(new GuiAchievements(mc.currentScreen, mc.statsCounter))))
         )
         .withComponent(new OptionsCategory("gui.options.page.debug.category.test")
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.music.skip", () -> {
+                SoundEngine.getSoundSystem().stop("BgMusic");
+                mc.sndManager.ticksBeforeMusic = -1;
+                mc.sndManager.tick();
+            }))
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.cheat", () -> {
+                mc.theWorld.getLevelData().setCheatsEnabled(true);
+            }) {
+                @Override
+                public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
+                    button.enabled = (mc.theWorld != null && !mc.theWorld.isClientSide);
+                    super.render(x, y, width, relativeMouseX, relativeMouseY);
+                }
+            })
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.wipestats", () -> {
+                mc.statsCounter.wipe("I want to delete all the saved stats");
+            }))
+            .withComponent(new ShortcutComponent("gui.options.page.debug.button.unlockedall", () -> {
+                for (Stat stat : StatList.getAllStats()){
+                    mc.thePlayer.addStat(stat, mc.thePlayer.getStat(stat) == 0 ? 1 : 0);
+                }
+            }))
             .withComponent(new ShortcutComponent("gui.options.page.debug.button.crash.soft", () -> {
                 throw new RuntimeException("Test Soft Exception");
             }))
             .withComponent(new ShortcutComponent("gui.options.page.debug.button.crash.hard", () -> {
-                mc.changeWorld(null);
-                GuiPopup error = GuiException.createFatal(new RuntimeException("Test Hard Exception"), mc);
-                mc.displayGuiScreen(error);
+                throw new RuntimeErrorException(new Error(), "Test Hard Exception");
             }))
-        )
-            ;
+        );
 
     public static OptionsPage register(OptionsPage page)
     {
diff --git a/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java b/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java
index af5df7c22..8439fdd2f 100644
--- a/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java
+++ b/src/main/java/net/minecraft/client/gui/paged/GuiPaged.java
@@ -177,16 +177,16 @@ public class GuiPaged
     {
         if (mouseX > leftWidth + SEPARATOR_WIDTH + PADDING && mouseX < width) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
-                scrollRightPanel(Mouse.getDWheel() * -1.0f);
+                scrollRightPanel(Mouse.getDWheel() / -0.01f);
             } else {
-                scrollRightPanel(Mouse.getDWheel() / -5.0f);
+                scrollRightPanel(Mouse.getDWheel() / -0.05f);
             }
             onScrollRightPanel();
         } else if (mouseX >= 0 && mouseX <= leftWidth) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
-                scrollLeftPanel(Mouse.getDWheel() * -1.0f);
+                scrollLeftPanel(Mouse.getDWheel() / -0.01f);
             } else {
-                scrollLeftPanel(Mouse.getDWheel() / -5.0f);
+                scrollLeftPanel(Mouse.getDWheel() / -0.05f);
             }
             onScrollLeftPanel();
         }
@@ -427,7 +427,7 @@ public class GuiPaged
         if (mc.theWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
-            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             float scale = 32F;
             tessellator.startDrawingQuads();
@@ -458,7 +458,7 @@ public class GuiPaged
         if (mc.theWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
-            GL11.glBindTexture(GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             float scale = 32F;
             tessellator.startDrawingQuads();
diff --git a/src/main/java/net/minecraft/client/gui/popup/GuiPopup.java b/src/main/java/net/minecraft/client/gui/popup/GuiPopup.java
index c0ef45899..8aa438cd8 100644
--- a/src/main/java/net/minecraft/client/gui/popup/GuiPopup.java
+++ b/src/main/java/net/minecraft/client/gui/popup/GuiPopup.java
@@ -202,7 +202,7 @@ public final class GuiPopup
         GL11.glEnable(GL11.GL_TEXTURE_2D);
         float f = 32F;
         tessellator.startDrawingQuads();
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/background.png"));
+        mc.renderEngine.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         tessellator.setColorOpaque_I(0x404040);
         tessellator.addVertexWithUV(popupX, popupY + popupHeight, 0.0D, 0.0D, (float)popupHeight / f);
         tessellator.addVertexWithUV(popupX + popupWidth, popupY + popupHeight, 0.0D, (float)popupWidth / f, (float)popupHeight / f);
diff --git a/src/main/java/net/minecraft/client/gui/popup/ListComponent.java b/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
index 76bed7d7a..4979e5fb8 100644
--- a/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
+++ b/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
@@ -99,7 +99,7 @@ public class ListComponent
         {
             float wheel = Mouse.getDWheel();
             if (wheel != 0.0f)
-                scroll(wheel / -1200.0f);
+                scroll(wheel / -12.0f);
         }
 
         GL11.glDisable(GL11.GL_TEXTURE_2D);
diff --git a/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java b/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
index b2b4c7d43..0ad03e175 100644
--- a/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
+++ b/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
@@ -106,7 +106,7 @@ public class MessageBoxComponent
         {
             float wheel = Mouse.getDWheel();
             if (wheel != 0.0f)
-                scroll(wheel / -1200.0f);
+                scroll(wheel / -12.0f);
         }
 
         GL11.glDisable(GL11.GL_TEXTURE_2D);
diff --git a/src/main/java/net/minecraft/client/gui/toasts/AchievementToast.java b/src/main/java/net/minecraft/client/gui/toasts/AchievementToast.java
new file mode 100644
index 000000000..ae5761f09
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/toasts/AchievementToast.java
@@ -0,0 +1,98 @@
+package net.minecraft.client.gui.toasts;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.sound.SoundCategory;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
+
+public class AchievementToast implements IToastable {
+    private static final double ANIMATION_DURATION_MILLIS = 3000L;
+    private long startTime;
+    private final Minecraft mc = Minecraft.getMinecraft(this);
+    private final Achievement achievement;
+    private final boolean informational;
+    public AchievementToast(Achievement achievement, boolean informational){
+        this.achievement = achievement;
+        this.informational = informational;
+    }
+    @Override
+    public boolean messageOnly(long runtime) {
+        return informational;
+    }
+
+    @Override
+    public String getTitle(long runtime) {
+        return I18n.getInstance().translateKey("gui.achievement.label.get");
+    }
+
+    @Override
+    public int nameColor(long runtime) {
+        return 0xffffff00;
+    }
+
+    @Override
+    public String getMessage(long runtime) {
+        return informational ? achievement.getDescription() : achievement.getStatName();
+    }
+
+    @Override
+    public int descriptionColor(long runtime) {
+        return 0xffffffff;
+    }
+
+    @Override
+    public double getAnimationProgress(long runtime) {
+        runtime = System.currentTimeMillis() - startTime;
+        double progress = runtime / ANIMATION_DURATION_MILLIS;
+        if (informational && !mc.statsCounter.isUnlocked(achievement)) {
+            progress = Math.min(progress, 0.5);
+            startTime = (long) (System.currentTimeMillis() - ANIMATION_DURATION_MILLIS/2);
+        }
+        return progress;
+    }
+
+    @Override
+    public String getTexture(long runtime) {
+        return "minecraft:gui/toast";
+    }
+
+    @Override
+    public void onToastStart() {
+        Random r = new Random();
+//        mc.sndManager.playSound("random.whoosh_in", SoundCategory.GUI_SOUNDS, 0.5f, 1f + (r.nextFloat() - r.nextFloat()) * 0.1f);
+        startTime = System.currentTimeMillis();
+        if (!informational) {
+            mc.sndManager.playSound("random.achievement", SoundCategory.GUI_SOUNDS, 1f, 1f);
+//            mc.sndManager.playSound("note.harp", SoundCategory.GUI_SOUNDS, 1f, 1f);
+//            mc.sndManager.playSound("note.snare", SoundCategory.GUI_SOUNDS, 1f, 0.9f);
+//            mc.sndManager.playSound("note.harp", SoundCategory.GUI_SOUNDS, 1f, 0.8f);
+        }
+    }
+
+    @Override
+    public void onToastEnd() {
+        Random r = new Random();
+//        mc.sndManager.playSound("random.whoosh_out", SoundCategory.GUI_SOUNDS, 0.5f, 1f + (r.nextFloat() - r.nextFloat()) * 0.1f);
+    }
+
+    @Override
+    public boolean isEquivalentToast(@NotNull IToastable toast) {
+        if (toast instanceof AchievementToast){
+            AchievementToast achievementToast = (AchievementToast) toast;
+            return (achievement == achievementToast.achievement) && (informational == ((AchievementToast) toast).informational);
+        }
+        return false;
+    }
+
+    @Override
+    public @Nullable ItemStack getIcon(long runtime) {
+        return Item.getItem(achievement.iconItemId).getDefaultStack();
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/gui/toasts/GuiHudToasts.java b/src/main/java/net/minecraft/client/gui/toasts/GuiHudToasts.java
new file mode 100644
index 000000000..497e3c57f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/toasts/GuiHudToasts.java
@@ -0,0 +1,195 @@
+package net.minecraft.client.gui.toasts;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.render.Scissor;
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.Global;
+import net.minecraft.client.render.Lighting;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.lang.I18n;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public class GuiHudToasts extends Gui {
+    private static final int TOAST_WIDTH = 160;
+    private static final int TOAST_HEIGHT = 32;
+    private static final int MAX_SHOWN_ENTRIES = 5;
+
+    private final List<IToastable> overflowEntries = new ArrayList<>();
+    private final List<ToastEntry> activeEntries = new ArrayList<>();
+
+    private final Minecraft mc;
+
+    public GuiHudToasts(Minecraft minecraft) {
+        mc = minecraft;
+    }
+
+    public boolean isDisplayingToast(IToastable toast) {
+        for (ToastEntry entry : activeEntries){
+            if (entry.toast.isEquivalentToast(toast)){
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void addToast(IToastable toast) {
+        if (activeEntries.size() >= MAX_SHOWN_ENTRIES){
+            overflowEntries.add(toast);
+            return;
+        }
+        activeEntries.add(new ToastEntry(toast, System.currentTimeMillis()));
+        toast.onToastStart();
+        sortList();
+    }
+
+    public void endToast(IToastable toast){
+        for (int i = 0; i < activeEntries.size(); i++) {
+            ToastEntry entry = activeEntries.get(i);
+            if (entry.toast.isEquivalentToast(toast)){
+                activeEntries.remove(i);
+                entry.toast.onToastEnd();
+                sortList();
+                return;
+            }
+        }
+    }
+
+    protected void sortList(){
+        activeEntries.sort(ToastEntry.TOAST_SORTER);
+    }
+
+    private void updateScale() {
+        GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
+        GL11.glMatrixMode(GL11.GL_PROJECTION);
+        GL11.glLoadIdentity();
+        GL11.glMatrixMode(GL11.GL_MODELVIEW);
+        GL11.glLoadIdentity();
+        GL11.glClear(256);
+        GL11.glMatrixMode(GL11.GL_PROJECTION);
+        GL11.glLoadIdentity();
+        GL11.glOrtho(0.0D, mc.resolution.scaledWidth, mc.resolution.scaledHeight, 0.0D, 1000D, 3000D);
+        GL11.glMatrixMode(GL11.GL_MODELVIEW);
+        GL11.glLoadIdentity();
+        GL11.glTranslatef(0.0F, 0.0F, -2000F);
+    }
+
+    public void render(float partialTick)
+    {
+        if(Minecraft.hasPaidCheckTime > 0L) { // Puts unlicensed copy message at top left of screen
+            GL11.glDisable(GL11.GL_DEPTH_TEST);
+            GL11.glDepthMask(false);
+            Lighting.disable();
+            String s = I18n.getInstance().translateKeyAndFormat("gui.achievement.label.unlicensed.1", Global.VERSION);
+            String s1 = I18n.getInstance().translateKey("gui.achievement.label.unlicensed.2");
+            String s2 = I18n.getInstance().translateKey("gui.achievement.label.unlicensed.3");
+            mc.fontRenderer.drawStringWithShadow(s, 2, 2, 0xffffff);
+            mc.fontRenderer.drawStringWithShadow(s1, 2, 11, 0xffffff);
+            mc.fontRenderer.drawStringWithShadow(s2, 2, 20, 0xffffff);
+            GL11.glDepthMask(true);
+            GL11.glEnable(GL11.GL_DEPTH_TEST);
+        }
+
+        if (!overflowEntries.isEmpty()){
+            while (activeEntries.size() < MAX_SHOWN_ENTRIES && !overflowEntries.isEmpty()){
+                IToastable toast = overflowEntries.get(0);
+                overflowEntries.remove(0);
+                activeEntries.add(new ToastEntry(toast, System.currentTimeMillis() + 1));
+                toast.onToastStart();
+                sortList();
+            }
+        }
+
+        // Remove finished entries
+        List<ToastEntry> entriesCopy = new ArrayList<>(activeEntries);
+        for (ToastEntry entry : entriesCopy){
+            long duration = System.currentTimeMillis() - entry.startTime;
+            double animProgress = entry.toast.getAnimationProgress(duration);
+            if((animProgress < 0.0D || animProgress > 1.0D)) { // Finish animation
+                endToast(entry.toast);
+            }
+        }
+
+        if(activeEntries.isEmpty() || mc.thePlayer == null) {
+            return;
+        }
+        updateScale();
+
+
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+        GL11.glDepthMask(false);
+
+        int yOff = 0;
+        for (ToastEntry entry : activeEntries){ // Render all entries
+            long duration = System.currentTimeMillis() - entry.startTime;
+
+            double animProgress = entry.toast.getAnimationProgress(duration);
+            double hideAmount = animProgress * 2D; // when hideAmount == 0 the toast is fully on-screen | when hideAmount == 1 the toast is fully off-screen
+            if(hideAmount > 1.0D)
+            {
+                hideAmount = 2D - hideAmount;
+            }
+            hideAmount *= 4D;
+            hideAmount = 1.0D - hideAmount;
+            if(hideAmount < 0.0D)
+            {
+                hideAmount = 0.0D;
+            }
+            hideAmount *= hideAmount;
+            hideAmount *= hideAmount;
+            int toastLeft = mc.resolution.scaledWidth - TOAST_WIDTH;
+            int toastTop = (int) (-hideAmount * TOAST_HEIGHT);
+            if (toastTop < 0) {
+                Scissor.enable(toastLeft, yOff, TOAST_WIDTH, TOAST_HEIGHT);
+            }
+            renderToast(entry.toast, duration, toastLeft, toastTop + yOff);
+            Scissor.disable();
+            yOff += TOAST_HEIGHT + toastTop;
+        }
+
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+        Lighting.disable();
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+    }
+    protected void renderToast(IToastable toast, long duration, int x, int y){
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        GL11.glDisable(GL11.GL_LIGHTING);
+
+        drawGuiIcon(x, y, TOAST_WIDTH, TOAST_HEIGHT, TextureRegistry.getTexture(toast.getTexture(duration)));
+        if(toast.messageOnly(duration)) {
+            mc.fontRenderer.drawStringIntoConstrainedBlock(toast.getMessage(duration), x + 30, y + 7, 120, toast.descriptionColor(duration));
+        } else {
+            mc.fontRenderer.drawString(toast.getTitle(duration), x + 30, y + 7, toast.nameColor(duration));
+            mc.fontRenderer.drawString(toast.getMessage(duration), x + 30, y + 18, toast.descriptionColor(duration));
+        }
+
+        GL11.glDepthMask(true);
+        Lighting.enableInventoryLight();
+        GL11.glColor4f(1, 1, 1, 1);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+
+        GL11.glEnable(GL11.GL_DEPTH_TEST);
+        ItemStack icon = toast.getIcon(duration);
+        ItemModelDispatcher.getInstance().getDispatch(icon).renderItemIntoGui(Tessellator.instance, mc.fontRenderer, mc.renderEngine, icon, x + 8, y + 8, 1.0f);
+        GL11.glDisable(GL11.GL_DEPTH_TEST);
+    }
+
+    static class ToastEntry {
+        public static final Comparator<ToastEntry> TOAST_SORTER = (o1, o2) -> (int) (o1.startTime - o2.startTime);
+        public final long startTime;
+        public final IToastable toast;
+        public ToastEntry(IToastable toast, long startTime){
+            this.toast = toast;
+            this.startTime = startTime;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/toasts/IToastable.java b/src/main/java/net/minecraft/client/gui/toasts/IToastable.java
new file mode 100644
index 000000000..48ee651b1
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/toasts/IToastable.java
@@ -0,0 +1,29 @@
+package net.minecraft.client.gui.toasts;
+
+import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface IToastable {
+    boolean messageOnly(long runtime);
+
+    String getTitle(long runtime);
+
+    int nameColor(long runtime);
+
+    String getMessage(long runtime);
+
+    int descriptionColor(long runtime);
+
+    double getAnimationProgress(long runtime);
+
+    String getTexture(long runtime);
+
+    void onToastStart();
+    void onToastEnd();
+
+    boolean isEquivalentToast(@NotNull IToastable toast);
+
+    @Nullable
+    ItemStack getIcon(long runtime);
+}
diff --git a/src/main/java/net/minecraft/client/input/InputHandler.java b/src/main/java/net/minecraft/client/input/InputHandler.java
index feeadfe63..cb36ff0fc 100644
--- a/src/main/java/net/minecraft/client/input/InputHandler.java
+++ b/src/main/java/net/minecraft/client/input/InputHandler.java
@@ -1,23 +1,20 @@
 package net.minecraft.client.input;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import net.minecraft.client.input.glfw.GlfwGamepad;
+import net.minecraft.client.input.glfw.GlfwJoystick;
+import org.lwjgl.glfw.GLFW;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
 
-import net.java.games.input.Component;
-import net.java.games.input.Controller;
-import net.java.games.input.Controller.Type;
-import net.java.games.input.ControllerEnvironment;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.input.controller.ControllerInput;
 
 public abstract class InputHandler {
-	
-	public static List<ControllerInput> controllers; 
+	private static Minecraft minecraft;
+	public static ControllerInput[] controllers = new ControllerInput[GLFW.GLFW_JOYSTICK_LAST + 1];
 	
 	public static void init(Minecraft minecraft) throws Exception{
+		InputHandler.minecraft = minecraft;
     	System.out.println("Creating Keyboard & Mouse");
     	Keyboard.create();
     	Mouse.create();
@@ -32,39 +29,89 @@ public abstract class InputHandler {
         }else {
         	System.err.println("JInput is disabled!");
         }
+		try {
+			initLWJGL3(minecraft);
+		} catch (Throwable e) {
+			System.err.println("Could not initialize SDL2.");
+			e.printStackTrace();
+		}
+	}
+
+	public static void poll() {
+		for (int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
+			if (controllers[i] != null) {
+				if (!controllers[i].getController().isPresent()) {
+					disconnected(controllers[i]);
+					controllers[i] = null;
+				} else {
+					controllers[i].getController().poll();
+				}
+			} else {
+				if (GLFW.glfwJoystickPresent(i)) {
+					GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
+					if (gamepad != null) {
+						ControllerInput input = new ControllerInput(minecraft, gamepad);
+						controllers[i] = input;
+						connected(input);
+					}
+				}
+			}
+		}
+	}
+
+	private static void connected(ControllerInput controller) {
+		System.out.println("Controller connected: " + controller.getGUID());
+		minecraft.controllerInput = getController(controller.getGUID());
+	}
+
+	private static void disconnected(ControllerInput controller) {
+		System.out.println("Controller disconnected: " + controller.getGUID());
+		if(minecraft.controllerInput == controller) {
+			minecraft.setInputType(InputType.KEYBOARD);
+			minecraft.controllerInput = null;
+		}
+	}
+
+	public static void initLWJGL3(Minecraft minecraft) throws Throwable {
+		int found = 0;
+		for (int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
+			if (GLFW.glfwJoystickPresent(i)) {
+				GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
+				if (gamepad != null) {
+					ControllerInput input = new ControllerInput(minecraft, gamepad);
+					controllers[i] = input;
+					found++;
+				}
+			}
+		}
+		System.out.println(found + " controllers found!");
 	}
 	
 	public static void initJInput(Minecraft minecraft) throws Throwable{
-		Controller[] devices = getControllers();
+		net.java.games.input.Controller[] devices = getControllers();
 		
 		if(devices == null) {
 			System.err.println("Could not get devices!");
 			return;
 		}
 		
-		System.out.println(devices.length + " Devices found!");
+		System.out.println(devices.length + " devices found!");
 		
-		List<ControllerInput> controllerList = new ArrayList<>();
-		for(Controller controller : devices) {
-			if(controller.getType() == Type.GAMEPAD) {
-				controllerList.add(new ControllerInput(minecraft, controller));
-			}
-			if(controller.getType() == Type.MOUSE) {
+		for(net.java.games.input.Controller controller : devices) {
+			if(controller.getType() == net.java.games.input.Controller.Type.MOUSE) {
 				minecraft.mouseInput.addMouse(controller);
 			}
 		}
-		
-		controllers = controllerList;
 	}
 	
-	public static Controller[] getControllers() throws Throwable{
-		return ControllerEnvironment.getDefaultEnvironment().getControllers();
+	public static net.java.games.input.Controller[] getControllers() throws Throwable{
+		return net.java.games.input.ControllerEnvironment.getDefaultEnvironment().getControllers();
 	}
 	
-	public static ControllerInput getController(String name) {
+	public static ControllerInput getController(String guid) {
 		try {
 			for(ControllerInput controllerInput : controllers) {
-				if(controllerInput.getController().getName().equalsIgnoreCase(name)) {
+				if(controllerInput.getGUID().equalsIgnoreCase(guid)) {
 					return controllerInput;
 				}
 			}
@@ -72,13 +119,12 @@ public abstract class InputHandler {
 		return null;
 	}
 	
-	public static Component getComponent(Controller controller, String id) {
+	public static net.java.games.input.Component getComponent(net.java.games.input.Controller controller, String id) {
 		try {
-			for(Component component : controller.getComponents()) {
+			for(net.java.games.input.Component component : controller.getComponents()) {
 				if(component.getIdentifier().toString().equalsIgnoreCase(id)) return component;
 			}
 		}catch (Exception e) {}
 		return null;
 	}
-	
 }
diff --git a/src/main/java/net/minecraft/client/input/PlayerInput.java b/src/main/java/net/minecraft/client/input/PlayerInput.java
index 9afae5192..0d2bbe04a 100644
--- a/src/main/java/net/minecraft/client/input/PlayerInput.java
+++ b/src/main/java/net/minecraft/client/input/PlayerInput.java
@@ -2,7 +2,7 @@ package net.minecraft.client.input;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.option.GameSettings;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.MathHelper;
 
 public class PlayerInput {
@@ -86,7 +86,7 @@ public class PlayerInput {
 		}
 	}
 
-	public void tick(EntityPlayer entityplayer) {
+	public void tick(Player entityplayer) {
 		moveStrafe = 0.0f;
 		moveForward = 0.0f;
 		jump = false;
diff --git a/src/main/java/net/minecraft/client/input/controller/Button.java b/src/main/java/net/minecraft/client/input/controller/Button.java
index 59c787b3a..34844a81e 100644
--- a/src/main/java/net/minecraft/client/input/controller/Button.java
+++ b/src/main/java/net/minecraft/client/input/controller/Button.java
@@ -1,12 +1,10 @@
 package net.minecraft.client.input.controller;
 
-import net.java.games.input.Component;
-
 public class Button implements IButton{
 	
 	public final String name;
 	
-	public Component component;
+	public int button;
 	public IButtonListener buttonListener;
 	
 	private boolean pressed = false;
@@ -17,9 +15,9 @@ public class Button implements IButton{
 	
 	private int holdTime;
 	
-	public Button(String name, Component component, IButtonListener buttonListener) {
+	public Button(String name, int button, IButtonListener buttonListener) {
 		this.name = name;
-		this.component = component;
+		this.button = button;
 		this.buttonListener = buttonListener;
 	}
 
@@ -43,7 +41,7 @@ public class Button implements IButton{
 
 	@Override
 	public void update() {
-		boolean p = buttonListener.isPressed(component);
+		boolean p = buttonListener.isPressed(button);
 		if(!p) {
 			this.cancelled = false;
 			this.holdTime = 0;
diff --git a/src/main/java/net/minecraft/client/input/controller/ControllerInput.java b/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
index 9a32cb29b..b9433474a 100644
--- a/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
+++ b/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
@@ -1,184 +1,333 @@
 package net.minecraft.client.input.controller;
 
 import com.b100.utils.ReflectUtils;
-import net.java.games.input.Component;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiContainer;
-import net.minecraft.client.gui.GuiCrafting;
-import net.minecraft.client.gui.GuiFurnace;
-import net.minecraft.client.gui.GuiInventory;
-import net.minecraft.client.gui.GuiInventoryCreative;
-import net.minecraft.client.gui.guidebook.GuiGuidebook;
+import net.minecraft.client.input.glfw.GlfwGamepad;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Time;
-import net.minecraft.client.input.InputHandler;
+import org.lwjgl.glfw.GLFW;
 
 public class ControllerInput {
-	
-	public final Minecraft minecraft;
-	
-	private final net.java.games.input.Controller controller;
-	
-	public Joystick joyLeft;
-	public Joystick joyRight;
-
-	public Button buttonA;
-	public Button buttonB;
-	public Button buttonX;
-	public Button buttonY;
-	
-	public Button buttonZL;
-	public Button buttonZR;
-	
-	public Button buttonMinus;
-	public Button buttonPlus;
-	
-	public Button buttonL;
-	public Button buttonR;
-	
-	public DigitalPad digitalPad;
-	
-	public Button[] buttons;
-	public Joystick[] joysticks;
-	
-	public double cursorX;
-	public double cursorY;
-	
-	public final ControllerInventoryHandler craftingGuiHandler = new ControllerInventoryHandler(this);
-	
-	private boolean disconnected = false;
-	
-	public ControllerInput(Minecraft minecraft, net.java.games.input.Controller controller) {
-		this.minecraft = minecraft;
-		this.controller = controller;
-		
-		System.out.println("Controller: "+controller+" Type: "+controller.getType());
-		
-		setup();
-	}
-	
-	public void setup() {
-		Component[] c = controller.getComponents();
-		
-		IButtonListener defaultListener = (comp) -> comp.getPollData() > 0.5f;
-		
-		joyLeft = new Joystick("Analog Left", c[1], c[0], new Button("Left Stick", c[13], defaultListener), minecraft.gameSettings.controllerDeadzoneLeft);
-		joyRight = new Joystick("Analog Right", c[3], c[2], new Button("Right Stick", c[14], defaultListener), minecraft.gameSettings.controllerDeadzoneRight);
-		
-		buttonMinus = new Button("-", comp("6"), defaultListener);
-		buttonPlus = new Button("+", comp("7"), defaultListener);
-		
-		if(!minecraft.gameSettings.controllerSwapAB.value) {
-			buttonA = new Button("A", comp("0"), defaultListener);
-			buttonB = new Button("B", comp("1"), defaultListener);
-		}else {
-			buttonA = new Button("A", comp("1"), defaultListener);
-			buttonB = new Button("B", comp("0"), defaultListener);
-		}
-		
-		if(!minecraft.gameSettings.controllerSwapXY.value) {
-			buttonX = new Button("X", comp("2"), defaultListener);
-			buttonY = new Button("Y", comp("3"), defaultListener);
-		}else {
-			buttonX = new Button("X", comp("3"), defaultListener);
-			buttonY = new Button("Y", comp("2"), defaultListener);
-		}
-		
-		if(minecraft.gameSettings.controllerSwapShoulderButtons.value) {
-			buttonZL = new Button("ZL", comp("4"), defaultListener);
-			buttonZR = new Button("ZR", comp("5"), defaultListener);
-			
-			buttonL = new Button("L", comp("z"), (comp) -> comp.getPollData() > 0.5f);
-			buttonR = new Button("R", comp("z"), (comp) -> comp.getPollData() < -0.5f);
-		}else {
-			buttonL = new Button("ZL", comp("4"), defaultListener);
-			buttonR = new Button("ZR", comp("5"), defaultListener);
-			
-			buttonZL = new Button("L", comp("z"), (comp) -> comp.getPollData() > 0.5f);
-			buttonZR = new Button("R", comp("z"), (comp) -> comp.getPollData() < -0.5f);
-		}
-		
-		digitalPad = new DigitalPad(this, comp("pov"));
-		
-		buttons = ReflectUtils.getAllObjects(ControllerInput.class, Button.class, this);
-		joysticks = ReflectUtils.getAllObjects(ControllerInput.class, Joystick.class, this);
-	}
-	
-	public void moveCursor() {
-		double speed = 300 * Time.delta * (minecraft.gameSettings.controllerMenuSensitivity.value + 0.5f);
-		
-		cursorX += ((Math.pow(joyLeft.getX(), 3.0f) + joyLeft.getX()) / 2.0f) * speed;
-		cursorY += ((Math.pow(joyLeft.getY(), 3.0f) + joyLeft.getY()) / 2.0f) * speed;
-		
-		cursorX = Math.max(cursorX, 0);
-		cursorY = Math.max(cursorY, 0);
-		
-		cursorX = Math.min(cursorX, minecraft.resolution.scaledWidth);
-		cursorY = Math.min(cursorY, minecraft.resolution.scaledHeight);
-	}
-	
-	public net.java.games.input.Controller getController() {
-		return controller;
-	}
-
-	public void update() {
-		if(disconnected || !controller.poll()) {
-			this.disconnected = true;
-			throw new RuntimeException("Controller Disconnected!");
-		}
-		
-		for(int i=0; i < buttons.length; i++) {
-			buttons[i].update();
-		}
-		for(int i=0; i < joysticks.length; i++) {
-			joysticks[i].update();
-		}
-		digitalPad.update();
-	}
-	
-	public Slot getSlotAtCursor(GuiContainer guiContainer) {
-		return getSlotAt((int)cursorX, (int)cursorY, guiContainer);
-	}
-    
+
+    public final Minecraft minecraft;
+
+    private final GlfwGamepad controller;
+
+    public Joystick joyLeft;
+    public Joystick joyRight;
+
+    public Button buttonA;
+    public Button buttonB;
+    public Button buttonX;
+    public Button buttonY;
+
+    public Button buttonLeftTrigger;
+    public Button buttonRightTrigger;
+
+    public Button buttonBack;
+    public Button buttonStart;
+
+    public Button buttonLeftShoulder;
+    public Button buttonRightShoulder;
+
+    public DigitalPad digitalPad;
+
+    public Button[] buttons;
+    public Joystick[] joysticks;
+
+    public double cursorX;
+    public double cursorY;
+
+    private final ControllerType type;
+
+    public final ControllerInventoryHandler craftingGuiHandler = new ControllerInventoryHandler(this);
+
+    private boolean disconnected = false;
+
+    public ControllerInput(Minecraft minecraft, GlfwGamepad controller) {
+        this.minecraft = minecraft;
+        this.controller = controller;
+
+        this.type = ControllerType.fromController(controller);
+
+        setup();
+    }
+
+    public String getGUID() {
+        return controller.getName();
+    }
+
+    public ControllerType getType() {
+        return type;
+    }
+
+    public void setup() {
+        IButtonListener defaultButtonListener = controller::isButtonPressed;
+        IJoystickListener defaultJoystickListener = controller::getAxisValue;
+
+        joyLeft = new Joystick(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_X), GLFW.GLFW_GAMEPAD_AXIS_LEFT_X, GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y, defaultJoystickListener, new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneLeft);
+        joyRight = new Joystick(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y, defaultJoystickListener, new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB, defaultButtonListener), minecraft.gameSettings.controllerDeadzoneRight);
+
+        buttonBack = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_BACK), GLFW.GLFW_GAMEPAD_BUTTON_BACK, defaultButtonListener);
+        buttonStart = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_START), GLFW.GLFW_GAMEPAD_BUTTON_START, defaultButtonListener);
+
+        if (minecraft.gameSettings.controllerSwapAB.value) {
+            buttonA = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_A), GLFW.GLFW_GAMEPAD_BUTTON_B, defaultButtonListener);
+            buttonB = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_B), GLFW.GLFW_GAMEPAD_BUTTON_A, defaultButtonListener);
+        } else {
+            buttonA = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_A), GLFW.GLFW_GAMEPAD_BUTTON_A, defaultButtonListener);
+            buttonB = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_B), GLFW.GLFW_GAMEPAD_BUTTON_B, defaultButtonListener);
+        }
+
+        if (minecraft.gameSettings.controllerSwapXY.value) {
+            buttonX = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_X), GLFW.GLFW_GAMEPAD_BUTTON_Y, defaultButtonListener);
+            buttonY = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_Y), GLFW.GLFW_GAMEPAD_BUTTON_X, defaultButtonListener);
+        } else {
+            buttonX = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_X), GLFW.GLFW_GAMEPAD_BUTTON_X, defaultButtonListener);
+            buttonY = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_Y), GLFW.GLFW_GAMEPAD_BUTTON_Y, defaultButtonListener);
+        }
+
+        if (minecraft.gameSettings.controllerSwapShoulderButtons.value) {
+            buttonLeftShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, defaultButtonListener);
+            buttonRightShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, defaultButtonListener);
+
+            buttonLeftTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonRightTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+        } else {
+            buttonLeftShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, defaultButtonListener);
+            buttonRightShoulder = new Button(translateBtn(type, GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER), GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, defaultButtonListener);
+
+            buttonLeftTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+            buttonRightTrigger = new Button(translateAxis(type, GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER), GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, (axis) -> this.controller.getAxisValue(axis) > 0.5f);
+        }
+
+        digitalPad = new DigitalPad(
+            new Button("Digital Up", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP, defaultButtonListener),
+            new Button("Digital Left", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT, defaultButtonListener),
+            new Button("Digital Down", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, defaultButtonListener),
+            new Button("Digital Right", GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT, defaultButtonListener)
+        );
+
+        buttons = ReflectUtils.getAllObjects(ControllerInput.class, Button.class, this);
+        joysticks = ReflectUtils.getAllObjects(ControllerInput.class, Joystick.class, this);
+    }
+
+    public void moveCursor() {
+        double speed = 300 * Time.delta * (minecraft.gameSettings.controllerMenuSensitivity.value + 0.5f);
+
+        cursorX += ((Math.pow(joyLeft.getX(), 3.0f) + joyLeft.getX()) / 2.0f) * speed;
+        cursorY += ((Math.pow(joyLeft.getY(), 3.0f) + joyLeft.getY()) / 2.0f) * speed;
+
+        cursorX = Math.max(cursorX, 0);
+        cursorY = Math.max(cursorY, 0);
+
+        cursorX = Math.min(cursorX, minecraft.resolution.scaledWidth);
+        cursorY = Math.min(cursorY, minecraft.resolution.scaledHeight);
+    }
+
+    public GlfwGamepad getController() {
+        return controller;
+    }
+
+    public void update() {
+        if (disconnected || !controller.isPresent()) {
+            this.disconnected = true;
+            throw new RuntimeException("Controller Disconnected!");
+        }
+
+        for (int i = 0; i < buttons.length; i++) {
+            buttons[i].update();
+        }
+        for (int i = 0; i < joysticks.length; i++) {
+            joysticks[i].update();
+        }
+        digitalPad.update();
+    }
+
+    public Slot getSlotAtCursor(GuiContainer guiContainer) {
+        return getSlotAt((int) cursorX, (int) cursorY, guiContainer);
+    }
+
     public Slot getSlotAt(int x, int y, GuiContainer guiContainer) {
-		for(Slot slot : guiContainer.inventorySlots.inventorySlots) {
-			int mx = (int) cursorX;
-			int my = (int) cursorY;
-			
-			int slotX = (slot.xDisplayPosition + (minecraft.resolution.scaledWidth - guiContainer.xSize) / 2) - 2;
-			int slotY = (slot.yDisplayPosition + (minecraft.resolution.scaledHeight - guiContainer.ySize) / 2) - 2;
-			
-			if(mx > slotX && my > slotY && mx < slotX + 20 && my < slotY + 20) {
-				return slot;
-			}
-		}
-		return null;
+        for (Slot slot : guiContainer.inventorySlots.slots) {
+            int mx = (int) cursorX;
+            int my = (int) cursorY;
+
+            int slotX = (slot.x + (minecraft.resolution.scaledWidth - guiContainer.xSize) / 2) - 2;
+            int slotY = (slot.y + (minecraft.resolution.scaledHeight - guiContainer.ySize) / 2) - 2;
+
+            if (mx > slotX && my > slotY && mx < slotX + 20 && my < slotY + 20) {
+                return slot;
+            }
+        }
+        return null;
+    }
+
+    public void snapToSlot(GuiContainer guiContainer, int id) {
+        snapToSlot(guiContainer, guiContainer.inventorySlots.getSlot(id));
+    }
+
+    public void snapToSlot(GuiContainer guiContainer, Slot slot) {
+        if (slot == null) return;
+
+        int slotX = (slot.x + (minecraft.resolution.scaledWidth - guiContainer.xSize) / 2) - 1;
+        int slotY = (slot.y + (minecraft.resolution.scaledHeight - guiContainer.ySize) / 2) - 1;
+
+        //Snap to Slot
+        cursorX = slotX + 8;
+        cursorY = slotY + 8;
+    }
+
+    public void cancelButtonPresses() {
+        for (Button button : buttons) {
+            button.cancelButtonPress();
+        }
+    }
+
+    private String translateAxis(ControllerType controllerType, int axis) {
+        switch (axis) {
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X:
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y:
+                return "Analog Left";
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X:
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y:
+                return "Analog Right";
+            case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "L2";
+                    case NINTENDO_SWITCH_PRO:
+                        return "ZL";
+                    default:
+                        return "LT";
+                }
+            case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "R2";
+                    case NINTENDO_SWITCH_PRO:
+                        return "ZR";
+                    default:
+                        return "RT";
+                }
+            default:
+                return "Axis " + axis;
+        }
+    }
+
+    private String translateBtn(ControllerType controllerType, int button) {
+        switch (button) {
+            case GLFW.GLFW_GAMEPAD_BUTTON_A:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "X";
+                    case NINTENDO_SWITCH_PRO:
+                        return "B";
+                    default:
+                        return "A";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_B:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "O";
+                    case NINTENDO_SWITCH_PRO:
+                        return "A";
+                    default:
+                        return "B";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_X:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "□";
+                    case NINTENDO_SWITCH_PRO:
+                        return "Y";
+                    default:
+                        return "X";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_Y:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "△";
+                    case NINTENDO_SWITCH_PRO:
+                        return "X";
+                    default:
+                        return "Y";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_BACK:
+                switch (controllerType) {
+                    case XBOXONE:
+                        return "View";
+                    case PS3:
+                        return "Select";
+                    case PS4:
+                    case PS5:
+                        return "Share";
+                    case NINTENDO_SWITCH_PRO:
+                        return "-";
+                    default:
+                        return "Back";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_START:
+                switch (controllerType) {
+                    case XBOXONE:
+                        return "Menu";
+                    case PS4:
+                    case PS5:
+                        return "Options";
+                    case NINTENDO_SWITCH_PRO:
+                        return "+";
+                    default:
+                        return "Start";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "L1";
+                    case NINTENDO_SWITCH_PRO:
+                        return "L";
+                    default:
+                        return "LB";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER:
+                switch (controllerType) {
+                    case PS3:
+                    case PS4:
+                    case PS5:
+                        return "R1";
+                    case NINTENDO_SWITCH_PRO:
+                        return "R";
+                    default:
+                        return "RB";
+                }
+            case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB:
+                return "Left Stick";
+            case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB:
+                return "Right Stick";
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP:
+                return "Digital Up";
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN:
+                return "Digital Down";
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT:
+                return "Digital Left";
+            case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT:
+                return "Digital Right";
+            default:
+                return "Button " + button;
+        }
     }
-	
-	public void snapToSlot(GuiContainer guiContainer, int id) {
-		snapToSlot(guiContainer, guiContainer.inventorySlots.getSlot(id));
-	}
-	
-	public void snapToSlot(GuiContainer guiContainer, Slot slot) {
-		if(slot == null) return;
-		
-		int slotX = (slot.xDisplayPosition + (minecraft.resolution.scaledWidth - guiContainer.xSize) / 2) - 1;
-		int slotY = (slot.yDisplayPosition + (minecraft.resolution.scaledHeight - guiContainer.ySize) / 2) - 1;
-		
-		//Snap to Slot
-		cursorX = slotX + 8;
-		cursorY = slotY + 8;
-	}
-	
-	private Component comp(String id) {
-		return InputHandler.getComponent(controller, id);
-	}
-	
-	public void cancelButtonPresses() {
-		for(Button button : buttons) {
-			button.cancelButtonPress();
-		}
-	}
-	
 }
diff --git a/src/main/java/net/minecraft/client/input/controller/ControllerInventoryHandler.java b/src/main/java/net/minecraft/client/input/controller/ControllerInventoryHandler.java
index fcded9beb..01ae1f0a8 100644
--- a/src/main/java/net/minecraft/client/input/controller/ControllerInventoryHandler.java
+++ b/src/main/java/net/minecraft/client/input/controller/ControllerInventoryHandler.java
@@ -21,18 +21,18 @@ public class ControllerInventoryHandler {
 		Slot slot = controllerInput.getSlotAtCursor(container);
 		
 		if(controllerInput.buttonA.pressedThisFrame()) {
-			for(Slot slot2 : container.inventorySlots.inventorySlots) {
-				System.out.println(slot2.id+": "+slot2.getStack());
+			for(Slot slot2 : container.inventorySlots.slots) {
+				System.out.println(slot2.index +": "+slot2.getItem());
 			}
 		}
 		
-		if(slot != null && isCraftingSlot.isTrue(slot) && slot.hasStack() && controllerInput.buttonA.isPressed()) {
+		if(slot != null && isCraftingSlot.isTrue(slot) && slot.hasItem() && controllerInput.buttonA.isPressed()) {
 			if(controllerInput.buttonA.getHoldTime() > 10 && controllerInput.buttonA.getHoldTime() % 2 == 1) {
 				click(container, 0);
 			}
 		}
 		
-		if(controllerInput.buttonZL.pressedThisFrame()) {
+		if(controllerInput.buttonLeftTrigger.pressedThisFrame()) {
 			if(slot != null) {
 				if(isCraftingSlot.isTrue(slot)) {
 					//Is in crafting field
@@ -42,14 +42,14 @@ public class ControllerInventoryHandler {
 						controllerInput.snapToSlot(container, invSlot); //Inventory Center
 					}
 				}else {
-					if(slot != null && slot.id > 9) lastSlot = slot;
+					if(slot != null && slot.index > 9) lastSlot = slot;
 					controllerInput.snapToSlot(container, craftingSlot); //Crafting Grid Center
 				}
 			}else {
 				controllerInput.snapToSlot(container, invSlot);
 			}
 		}
-		if(controllerInput.buttonZR.pressedThisFrame()) {
+		if(controllerInput.buttonRightTrigger.pressedThisFrame()) {
 			if(slot != null) {
 				if(isResultSlot.isTrue(slot)) {
 					if(lastSlot != null) {
@@ -68,15 +68,15 @@ public class ControllerInventoryHandler {
 	}
 	
 	public void handleCrafting(GuiCrafting crafting) {
-		handleAbstractCrafting(crafting, (e) -> e.id > 9, (e) -> e.id > 0 && e.id < 10, (e) -> e.id == 0, 5, 0, 24);
+		handleAbstractCrafting(crafting, (e) -> e.index > 9, (e) -> e.index > 0 && e.index < 10, (e) -> e.index == 0, 5, 0, 24);
 	}
 	
 	public void handleInventory(GuiInventory inventory) {
-		handleAbstractCrafting(inventory, (e) -> e.id >= 9 && e.id <= 44, (e) -> e.id >= 1 && e.id <= 4, (e) -> e.id == 0, 1, 0, 22);
+		handleAbstractCrafting(inventory, (e) -> e.index >= 9 && e.index <= 44, (e) -> e.index >= 1 && e.index <= 4, (e) -> e.index == 0, 1, 0, 22);
 	}
 	
 	public void handleFurnace(GuiFurnace furnace) {
-		handleAbstractCrafting(furnace, (e) -> e.id >= 3 && e.id <= 38, (e) -> e.id >= 0 && e.id <= 1, (e) -> e.id == 2, 0, 2, 16);
+		handleAbstractCrafting(furnace, (e) -> e.index >= 3 && e.index <= 38, (e) -> e.index >= 0 && e.index <= 1, (e) -> e.index == 2, 0, 2, 16);
 	}
 	
 	public void click(GuiContainer guiCrafting, int button) {
diff --git a/src/main/java/net/minecraft/client/input/controller/ControllerType.java b/src/main/java/net/minecraft/client/input/controller/ControllerType.java
new file mode 100644
index 000000000..399cc6eae
--- /dev/null
+++ b/src/main/java/net/minecraft/client/input/controller/ControllerType.java
@@ -0,0 +1,64 @@
+package net.minecraft.client.input.controller;
+
+import net.minecraft.client.input.glfw.GlfwGamepad;
+import java.util.Arrays;
+import java.util.List;
+
+public enum ControllerType {
+    UNKNOWN(Category.XBOX, "xbox", "UNKNOWN"),
+    XBOX360(Category.XBOX, "xbox", "XBOX 360"),
+    XBOXONE(Category.XBOX, "xbox", "XBOX ONE"),
+    PS3(Category.PLAYSTATION, "playstation", "PLAYSTATION 3"),
+    PS4(Category.PLAYSTATION, "playstation", "PLAYSTATION 4"),
+    PS5(Category.PLAYSTATION, "playstation", "PLAYSTATION 5"),
+    NINTENDO_SWITCH_PRO(Category.NINTENDO, "nintendo", "NINTENDO SWITCH PRO");
+
+    private final Category category;
+    private final String assetName;
+    private final String printableName;
+
+    ControllerType(Category category, String assetName, String printableName) {
+        this.category = category;
+        this.assetName = assetName;
+        this.printableName = printableName;
+    }
+
+    public static ControllerType fromController(GlfwGamepad controller) {
+        List<String> name = Arrays.asList(controller.getName().toLowerCase().split(" "));
+        if (name.contains("xbox") || name.contains("xinput")) {
+            if (name.contains("one")) {
+                return XBOXONE;
+            }
+            return XBOX360;
+        }
+        if ((name.contains("playstation") && name.contains("3")) || name.contains("ps3")) {
+            return PS3;
+        } else if ((name.contains("playstation") && name.contains("4")) || name.contains("ps4")) {
+            return PS4;
+        } else if ((name.contains("playstation") && name.contains("5")) || name.contains("ps5")) {
+            return PS5;
+        } else if (name.contains("nintendo") && name.contains("switch") && name.contains("pro")) {
+            return NINTENDO_SWITCH_PRO;
+        } else {
+            return UNKNOWN;
+        }
+    }
+
+    public Category getCategory() {
+        return this.category;
+    }
+
+    public String getAssetName() {
+        return this.assetName;
+    }
+
+    public String getPrintableName() {
+        return this.printableName;
+    }
+
+    public enum Category {
+        XBOX,
+        PLAYSTATION,
+        NINTENDO;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/input/controller/DigitalPad.java b/src/main/java/net/minecraft/client/input/controller/DigitalPad.java
index c049fc1c0..49ea31c1b 100644
--- a/src/main/java/net/minecraft/client/input/controller/DigitalPad.java
+++ b/src/main/java/net/minecraft/client/input/controller/DigitalPad.java
@@ -4,20 +4,16 @@ import net.java.games.input.Component;
 
 public class DigitalPad {
 	
-	public final ControllerInput controller;
-	
 	public IButton up;
 	public IButton left;
 	public IButton down;
 	public IButton right;
 	
-	public DigitalPad(ControllerInput controller, Component component) {
-		this.controller = controller;
-
-		up = new Button("Digital Up", component, (comp) -> comp.getPollData() > 0.1 && comp.getPollData() < 0.4);
-		right = new Button("Digital Right", component, (comp) -> comp.getPollData() > 0.3 && comp.getPollData() < 0.7);
-		down = new Button("Digital Down", component, (comp) -> comp.getPollData() > 0.6 && comp.getPollData() < 0.9);
-		left = new Button("Digital Left", component, (comp) -> (comp.getPollData() > 0.8 || comp.getPollData() < 0.2) && comp.getPollData() > 0.0);
+	public DigitalPad(IButton up, IButton left, IButton down, IButton right) {
+		this.up = up;
+		this.down = down;
+		this.left = left;
+		this.right = right;
 	}
 	
 	public void update() {
diff --git a/src/main/java/net/minecraft/client/input/controller/IButtonListener.java b/src/main/java/net/minecraft/client/input/controller/IButtonListener.java
index d7a9b3ce6..69168223d 100644
--- a/src/main/java/net/minecraft/client/input/controller/IButtonListener.java
+++ b/src/main/java/net/minecraft/client/input/controller/IButtonListener.java
@@ -4,6 +4,6 @@ import net.java.games.input.Component;
 
 public interface IButtonListener {
 	
-	public boolean isPressed(Component comp);
+	boolean isPressed(int button);
 	
 }
diff --git a/src/main/java/net/minecraft/client/input/controller/IJoystickListener.java b/src/main/java/net/minecraft/client/input/controller/IJoystickListener.java
new file mode 100644
index 000000000..1da7189d8
--- /dev/null
+++ b/src/main/java/net/minecraft/client/input/controller/IJoystickListener.java
@@ -0,0 +1,5 @@
+package net.minecraft.client.input.controller;
+
+public interface IJoystickListener {
+    float getValue(int axis);
+}
diff --git a/src/main/java/net/minecraft/client/input/controller/Joystick.java b/src/main/java/net/minecraft/client/input/controller/Joystick.java
index 8af8ab1a2..cb7f710b1 100644
--- a/src/main/java/net/minecraft/client/input/controller/Joystick.java
+++ b/src/main/java/net/minecraft/client/input/controller/Joystick.java
@@ -1,11 +1,10 @@
 package net.minecraft.client.input.controller;
 
-import net.java.games.input.Component;
 import net.minecraft.client.option.FloatOption;
 
 public class Joystick{
-	
-	public Component compX, compY;
+	public int xAxis, yAxis;
+	public IJoystickListener joystickListener;
 	public final String name;
 	
 	public final Button button;
@@ -14,12 +13,13 @@ public class Joystick{
 	
 	private boolean moving = false;
 	private boolean moveLastFrame = false;
-	
-	public Joystick(String name, Component x, Component y, Button button, FloatOption deadzone) {
+
+	public Joystick(String name, int xAxis, int yAxis, IJoystickListener joystickListener, Button button, FloatOption deadzone) {
 		this.name = name;
 		this.deadzone = deadzone;
-		this.compX = x;
-		this.compY = y;
+		this.xAxis = xAxis;
+		this.yAxis = yAxis;
+		this.joystickListener = joystickListener;
 		this.button = button;
 	}
 	
@@ -38,8 +38,8 @@ public class Joystick{
 	public void update() {
 		button.update();
 		
-		float x = this.compX.getPollData();
-		float y = this.compY.getPollData();
+		float x = this.joystickListener.getValue(xAxis);
+		float y = this.joystickListener.getValue(yAxis);
 		
 		boolean xInDeadzone = x < deadzone.value && x > -deadzone.value;
 		boolean yInDeadzone = y < deadzone.value && y > -deadzone.value;
diff --git a/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java b/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
new file mode 100644
index 000000000..8bc096f35
--- /dev/null
+++ b/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
@@ -0,0 +1,49 @@
+package net.minecraft.client.input.glfw;
+
+import org.lwjgl.glfw.GLFW;
+import org.lwjgl.glfw.GLFWGamepadState;
+
+import java.nio.ByteBuffer;
+
+public class GlfwGamepad extends GlfwJoystick {
+    private GLFWGamepadState state = null;
+
+    public GlfwGamepad(int id) {
+        super(id);
+    }
+
+    @Override
+    public void poll() {
+        super.poll();
+        this.state = new GLFWGamepadState(ByteBuffer.allocateDirect(GLFWGamepadState.SIZEOF));
+        GLFW.glfwGetGamepadState(this.getId(), this.state);
+    }
+
+    @Override
+    public String getName() {
+        return GLFW.glfwGetGamepadName(this.getId());
+    }
+
+    @Override
+    public float getAxisValue(int axis) {
+        if (this.state != null && axis >= 0 && axis < this.state.axes().capacity()) {
+            return this.state.axes().get(axis);
+        }
+
+        return 0.0F;
+    }
+
+    @Override
+    public boolean isButtonPressed(int button) {
+        if (this.state != null && button >= 0 && button < this.state.buttons().capacity()) {
+            return this.state.buttons().get(button) == GLFW.GLFW_PRESS;
+        }
+
+        return false;
+    }
+
+    @Override
+    public GlfwGamepad intoGamepad() {
+        return this;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java b/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
new file mode 100644
index 000000000..31b2401f8
--- /dev/null
+++ b/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
@@ -0,0 +1,68 @@
+package net.minecraft.client.input.glfw;
+
+import org.lwjgl.glfw.GLFW;
+
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+
+public class GlfwJoystick {
+    private final int id;
+    private FloatBuffer axes = null;
+    private ByteBuffer buttons = null;
+    private ByteBuffer hats = null;
+    private GlfwGamepad gamepad = null;
+
+    public GlfwJoystick(int id) {
+        this.id = id;
+    }
+
+    public int getId() {
+        return this.id;
+    }
+
+    public void poll() {
+        this.axes = GLFW.glfwGetJoystickAxes(this.id);
+        this.buttons = GLFW.glfwGetJoystickButtons(this.id);
+        this.hats = GLFW.glfwGetJoystickHats(this.id);
+    }
+
+    public boolean isPresent() {
+        return GLFW.glfwJoystickPresent(this.id);
+    }
+
+    public String getName() {
+        return GLFW.glfwGetJoystickName(this.id);
+    }
+
+    public float getAxisValue(int axis) {
+        if (isPresent() && axes != null && axis >= 0 && axis < axes.capacity()) {
+            return axes.get(axis);
+        }
+
+        return 0.0F;
+    }
+
+    public boolean isButtonPressed(int button) {
+        if (isPresent() && buttons != null && button >= 0 && button < buttons.capacity()) {
+            return buttons.get(button) == GLFW.GLFW_PRESS;
+        }
+
+        return false;
+    }
+
+    public int getHatValue(int hat) {
+        if (isPresent() && hats != null && hat >= 0 && hat < hats.capacity()) {
+            return hats.get(hat);
+        }
+
+        return GLFW.GLFW_HAT_CENTERED;
+    }
+
+    public GlfwGamepad intoGamepad() {
+        if (gamepad == null && isPresent() && GLFW.glfwJoystickIsGamepad(this.id)) {
+            gamepad = new GlfwGamepad(id);
+        }
+
+        return gamepad;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java b/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java
new file mode 100644
index 000000000..a374995cc
--- /dev/null
+++ b/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java
@@ -0,0 +1,1210 @@
+package net.minecraft.client.net.handler;
+
+import com.b100.utils.StringUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.particle.TakeAnimationParticle;
+import net.minecraft.client.entity.player.LocalPlayer;
+import net.minecraft.client.entity.player.RemotePlayer;
+import net.minecraft.client.gui.GuiConnectFailed;
+import net.minecraft.client.gui.GuiDownloadTerrain;
+import net.minecraft.client.gui.GuiIngameMenu;
+import net.minecraft.client.gui.guidebook.GuiGuidebook;
+import net.minecraft.client.gui.guidebook.PageManager;
+import net.minecraft.client.gui.guidebook.search.SearchPage;
+import net.minecraft.client.player.controller.PlayerControllerMP;
+import net.minecraft.client.world.WorldClient;
+import net.minecraft.core.Global;
+import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.BlastFurnaceBlockEntity;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
+import net.minecraft.core.block.entity.TrommelBlockEntity;
+import net.minecraft.core.data.DataLoader;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.RecipeRegistry;
+import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityDispatcher;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.PaintingEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.Projectile;
+import net.minecraft.core.enums.ArtType;
+import net.minecraft.core.item.MapItem;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.net.NetworkManager;
+import net.minecraft.core.net.PlayerProfile;
+import net.minecraft.core.net.entity.NetEntityHandler;
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.net.packet.AESSendKeyPacket;
+import net.minecraft.core.net.packet.AddEntityPacket;
+import net.minecraft.core.net.packet.AddItemEntityPacket;
+import net.minecraft.core.net.packet.AddMobPacket;
+import net.minecraft.core.net.packet.AddPaintingPacket;
+import net.minecraft.core.net.packet.AddParticlePacket;
+import net.minecraft.core.net.packet.AddPlayerPacket;
+import net.minecraft.core.net.packet.AnimatePacket;
+import net.minecraft.core.net.packet.BedMessagePacket;
+import net.minecraft.core.net.packet.BlockEventPacket;
+import net.minecraft.core.net.packet.BlockRegionUpdatePacket;
+import net.minecraft.core.net.packet.BlockUpdatePacket;
+import net.minecraft.core.net.packet.ChatPacket;
+import net.minecraft.core.net.packet.ChunkBlocksUpdatePacket;
+import net.minecraft.core.net.packet.ChunkVisibilityPacket;
+import net.minecraft.core.net.packet.ContainerAckPacket;
+import net.minecraft.core.net.packet.ContainerClosePacket;
+import net.minecraft.core.net.packet.ContainerOpenPacket;
+import net.minecraft.core.net.packet.ContainerSetContentPacket;
+import net.minecraft.core.net.packet.ContainerSetDataPacket;
+import net.minecraft.core.net.packet.ContainerSetSlotPacket;
+import net.minecraft.core.net.packet.CustomPayloadPacket;
+import net.minecraft.core.net.packet.DisconnectPacket;
+import net.minecraft.core.net.packet.EnitityEventPacket;
+import net.minecraft.core.net.packet.EntityNicknamePacket;
+import net.minecraft.core.net.packet.SetEntityDataPacket;
+import net.minecraft.core.net.packet.EntityTagDataPacket;
+import net.minecraft.core.net.packet.ExplosionPacket;
+import net.minecraft.core.net.packet.FlagOpenPacket;
+import net.minecraft.core.net.packet.GameRulePacket;
+import net.minecraft.core.net.packet.LoginPacket;
+import net.minecraft.core.net.packet.MapDataPacket;
+import net.minecraft.core.net.packet.MoveEntityPacket;
+import net.minecraft.core.net.packet.MovePlayerPacket;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.PhotoModePacket;
+import net.minecraft.core.net.packet.PlaySoundEffectDirectPacket;
+import net.minecraft.core.net.packet.PlaySoundEffectPacket;
+import net.minecraft.core.net.packet.PlayerGamemodePacket;
+import net.minecraft.core.net.packet.PlayerListPacket;
+import net.minecraft.core.net.packet.PreLoginPacket;
+import net.minecraft.core.net.packet.RecipeSyncPacket;
+import net.minecraft.core.net.packet.RemoveEntityPacket;
+import net.minecraft.core.net.packet.RespawnPacket;
+import net.minecraft.core.net.packet.SetCarriedItemPacket;
+import net.minecraft.core.net.packet.SetEntityMotionPacket;
+import net.minecraft.core.net.packet.SetEquippedItemPacket;
+import net.minecraft.core.net.packet.SetHealthPacket;
+import net.minecraft.core.net.packet.SetMobSpawnerPacket;
+import net.minecraft.core.net.packet.SetRidingPacket;
+import net.minecraft.core.net.packet.SetSpawnPositionPacket;
+import net.minecraft.core.net.packet.SetTimePacket;
+import net.minecraft.core.net.packet.SleepPacket;
+import net.minecraft.core.net.packet.StatisticPacket;
+import net.minecraft.core.net.packet.SyncIDsPacket;
+import net.minecraft.core.net.packet.TakeItemEntityPacket;
+import net.minecraft.core.net.packet.TeleportEntityPacket;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
+import net.minecraft.core.net.packet.WeatherEffectPacket;
+import net.minecraft.core.net.packet.WeatherStatusPacket;
+import net.minecraft.core.player.gamemode.Gamemode;
+import net.minecraft.core.player.inventory.menu.AbstractContainerMenu;
+import net.minecraft.core.player.inventory.container.SimpleContainer;
+import net.minecraft.core.sound.SoundTypes;
+import net.minecraft.core.util.helper.AES;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.RSA;
+import net.minecraft.core.world.Explosion;
+import net.minecraft.core.world.ExplosionCannonball;
+import net.minecraft.core.world.IVehicle;
+import net.minecraft.core.world.chunk.ChunkCoordinates;
+import net.minecraft.core.world.save.LevelData;
+import net.minecraft.core.world.saveddata.SavedDataStorage;
+import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+
+public class ClientPacketHandler extends PacketHandler
+{
+    private boolean disconnected;
+    private final NetworkManager netManager;
+    public String message; // Name from b1.2 leak
+    private final Minecraft mc;
+    private WorldClient worldClient;
+    private boolean started; // Name from b1.2 leak
+    public SavedDataStorage savedDataStorage;
+    public List<PlayerProfile> players;
+    public HashMap<String, String> playerList = new HashMap<>();
+    Random rand;
+
+    public ClientPacketHandler(Minecraft minecraft, String host, int port)
+            throws UnknownHostException, IOException
+    {
+        disconnected = false;
+        started = false;
+        savedDataStorage = new SavedDataStorage(null);
+        rand = new Random();
+        mc = minecraft;
+        Socket socket = new Socket(InetAddress.getByName(host), port);
+        netManager = new NetworkManager(socket, "Client", this);
+        players = new ArrayList<>();
+    }
+
+    public void tick()
+    {
+        if (!disconnected)
+        {
+            netManager.processReadPackets();
+        }
+        netManager.wakeThreads();
+    }
+
+    public int findPlayerInList(PlayerProfile playerProfile)
+    {
+        for (int i = 0; i < players.size(); i++)
+        {
+            if (players.get(i).playerName.equals(playerProfile.playerName))
+            {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    public void addPlayer(PlayerProfile playerProfile)
+    {
+        players.add(playerProfile);
+    }
+
+    public PlayerProfile getPlayer(String username)
+    {
+        for (PlayerProfile player : players)
+        {
+            if (player.playerName.equals(username))
+            {
+                return player;
+            }
+        }
+
+        return null;
+    }
+
+    public void removePlayer(int index)
+    {
+        players.remove(index);
+    }
+
+
+    @Override
+    public void handleLogin(LoginPacket loginPacket)
+    {
+        mc.playerController = new PlayerControllerMP(mc, this);
+        mc.statsCounter.add(StatList.joinMultiplayerStat, 1);
+        worldClient = new WorldClient(mc, this, loginPacket.worldSeed, loginPacket.dimensionId, loginPacket.worldTypeId);
+        worldClient.isClientSide = true;
+        mc.changeWorld(worldClient);
+        mc.thePlayer.dimension = loginPacket.dimensionId;
+        mc.displayGuiScreen(new GuiDownloadTerrain(this));
+        mc.thePlayer.id = loginPacket.playerEntityIdAndProtocolVersion;
+        NetworkManager.PACKET_DELAY = loginPacket.packetDelay;
+        Registries.RECIPES = new RecipeRegistry();
+    }
+
+    @Override
+    public void handlePickupSpawn(AddItemEntityPacket addItemEntityPacket21Pickupspawn)
+    {
+        double x = addItemEntityPacket21Pickupspawn.xPosition / 32D;
+        double y = addItemEntityPacket21Pickupspawn.yPosition / 32D;
+        double z = addItemEntityPacket21Pickupspawn.zPosition / 32D;
+        ItemEntity entityitem = new ItemEntity(worldClient, x, y, z, new ItemStack(addItemEntityPacket21Pickupspawn.itemID, addItemEntityPacket21Pickupspawn.count, addItemEntityPacket21Pickupspawn.itemDamage, addItemEntityPacket21Pickupspawn.tag));
+        entityitem.xd = (double) addItemEntityPacket21Pickupspawn.xd / 128D;
+        entityitem.yd = (double) addItemEntityPacket21Pickupspawn.yd / 128D;
+        entityitem.zd = (double) addItemEntityPacket21Pickupspawn.zd / 128D;
+        entityitem.serverPosX = addItemEntityPacket21Pickupspawn.xPosition;
+        entityitem.serverPosY = addItemEntityPacket21Pickupspawn.yPosition;
+        entityitem.serverPosZ = addItemEntityPacket21Pickupspawn.zPosition;
+        worldClient.addEntityToWorld(addItemEntityPacket21Pickupspawn.entityId, entityitem);
+    }
+
+
+    @Override
+    public void handleVehicleSpawn(AddEntityPacket packet23) {
+        if (!NetEntityHandler.hasType(packet23.type)){ return; }
+        double xPosition = ((double) packet23.xPosition) / 32D;
+        double yPosition = ((double) packet23.yPosition) / 32D;
+        double zPosition = ((double) packet23.zPosition) / 32D;
+        Entity owner;
+        if (packet23.ownerId >= 0){
+            owner = getEntityByID(packet23.ownerId);
+        } else {
+            owner = null;
+        }
+        Entity newEntity = NetEntityHandler.getTypeEntry(packet23.type).getEntity(worldClient, xPosition, yPosition, zPosition, packet23.metaData, packet23.hasVelocity, packet23.xVelocity / 8000D, packet23.yVelocity / 8000D, packet23.zVelocity / 8000D, owner);
+        if (newEntity != null) {
+            newEntity.serverPosX = packet23.xPosition;
+            newEntity.serverPosY = packet23.yPosition;
+            newEntity.serverPosZ = packet23.zPosition;
+            newEntity.yRot = packet23.yaw;
+            newEntity.xRot = packet23.pitch;
+            newEntity.id = packet23.entityId;
+            worldClient.addEntityToWorld(packet23.entityId, newEntity);
+            if (owner instanceof Mob && newEntity instanceof Projectile){
+                ((Projectile) newEntity).owner = (Mob) owner;
+            }
+            if (packet23.hasVelocity){
+                newEntity.lerpMotion(((double) packet23.xVelocity) / 8000D, ((double) packet23.yVelocity) / 8000D, ((double) packet23.zVelocity) / 8000D);
+            }
+        }
+    }
+
+    @Override
+    public void handleWeather(WeatherEffectPacket weatherEffectPacket)
+    {
+        double x = (double) weatherEffectPacket.x / 32D;
+        double y = (double) weatherEffectPacket.y / 32D;
+        double z = (double) weatherEffectPacket.z / 32D;
+        Entity weatherEntity = null;
+        if (weatherEffectPacket.effectId == WeatherEffectPacket.EFFECT_LIGHTNING) {
+            weatherEntity = new LightningEntity(worldClient, x, y, z);
+        }
+        if (weatherEntity != null)
+        {
+            weatherEntity.serverPosX = weatherEffectPacket.x;
+            weatherEntity.serverPosY = weatherEffectPacket.y;
+            weatherEntity.serverPosZ = weatherEffectPacket.z;
+            weatherEntity.yRot = 0.0F;
+            weatherEntity.xRot = 0.0F;
+            weatherEntity.id = weatherEffectPacket.id;
+            worldClient.addWeatherEffect(weatherEntity);
+        }
+    }
+
+    @Override
+    public void handleWeatherStatus(WeatherStatusPacket packet)
+    {
+        if (worldClient.dimension.id != packet.dimId) return;
+        Weather currentWeather = packet.id == -1 ? null : Weathers.WEATHERS[packet.id];
+        Weather newWeather = packet.newId == -1 ? null : Weathers.WEATHERS[packet.newId];
+        worldClient.weatherManager.overrideWeather(currentWeather, newWeather, packet.duration, packet.intensity, packet.power);
+    }
+
+    @Override
+    public void handleEntityPainting(AddPaintingPacket packet)
+    {
+        Entity entity = worldClient.getEntityFromId(packet.entityId);
+        if (entity instanceof PaintingEntity){
+            PaintingEntity painting = (PaintingEntity) entity;
+            painting.blockX = packet.xPosition;
+            painting.blockY = packet.yPosition;
+            painting.blockZ = packet.zPosition;
+
+            if (ArtType.map.containsKey(packet.key)) painting.art = ArtType.map.get(packet.key);
+
+            painting.setDirection(packet.direction);
+            if (packet.itemID > 0){
+                painting.setStack(new ItemStack(packet.itemID, 1, packet.meta));
+            }
+        } else {
+            PaintingEntity entitypainting = new PaintingEntity(worldClient, packet.xPosition, packet.yPosition, packet.zPosition, packet.direction, packet.key);
+            worldClient.addEntityToWorld(packet.entityId, entitypainting);
+            if (packet.itemID > 0){
+                entitypainting.setStack(new ItemStack(packet.itemID, 1, packet.meta));
+            }
+        }
+
+    }
+
+    @Override
+    public void handleEntityVelocity(SetEntityMotionPacket setEntityvelocity)
+    {
+        Entity entity = getEntityByID(setEntityvelocity.entityId);
+        if (entity == null)
+        {
+            return;
+        }
+        else
+        {
+            entity.lerpMotion((double) setEntityvelocity.motionX / 8000D, (double) setEntityvelocity.motionY / 8000D, (double) setEntityvelocity.motionZ / 8000D);
+            return;
+        }
+    }
+
+    @Override
+    public void handleEntityMetadata(SetEntityDataPacket entitymetadata)
+    {
+        Entity entity = getEntityByID(entitymetadata.entityId);
+        if (entity != null && entitymetadata.getUnpackedData() != null)
+        {
+            entity.getEntityData().assignValues(entitymetadata.getUnpackedData());
+        }
+    }
+
+    @Override
+    public void handleNamedEntitySpawn(AddPlayerPacket addPlayerPacket20Namedentityspawn)
+    {
+        double d = (double) addPlayerPacket20Namedentityspawn.xPosition / 32D;
+        double d1 = (double) addPlayerPacket20Namedentityspawn.yPosition / 32D;
+        double d2 = (double) addPlayerPacket20Namedentityspawn.zPosition / 32D;
+        float f = (float) (addPlayerPacket20Namedentityspawn.rotation * 360) / 256F;
+        float f1 = (float) (addPlayerPacket20Namedentityspawn.pitch * 360) / 256F;
+        RemotePlayer entityotherplayermp = new RemotePlayer(mc.theWorld, addPlayerPacket20Namedentityspawn.name);
+        entityotherplayermp.xo = entityotherplayermp.serverPosX = addPlayerPacket20Namedentityspawn.xPosition;
+        entityotherplayermp.yo = entityotherplayermp.serverPosY = addPlayerPacket20Namedentityspawn.yPosition;
+        entityotherplayermp.zo = entityotherplayermp.serverPosZ = addPlayerPacket20Namedentityspawn.zPosition;
+        int i = addPlayerPacket20Namedentityspawn.currentItem;
+        if (i == 0)
+        {
+            entityotherplayermp.inventory.mainInventory[entityotherplayermp.inventory.currentItem] = null;
+        }
+        else
+        {
+            entityotherplayermp.inventory.mainInventory[entityotherplayermp.inventory.currentItem] = new ItemStack(i, 1, 0);
+        }
+        entityotherplayermp.absMoveTo(d, d1, d2, f, f1);
+        worldClient.addEntityToWorld(addPlayerPacket20Namedentityspawn.entityId, entityotherplayermp);
+        entityotherplayermp.nickname = StringUtils.substring(addPlayerPacket20Namedentityspawn.nickname, 0, 32);
+        entityotherplayermp.chatColor = addPlayerPacket20Namedentityspawn.chatColor;
+    }
+
+    @Override
+    public void handleEntityTeleport(TeleportEntityPacket packet34EntityteleportEntityPacket)
+    {
+        Entity entity = getEntityByID(packet34EntityteleportEntityPacket.id);
+        if (entity == null)
+        {
+            return;
+        }
+        else
+        {
+            entity.serverPosX = packet34EntityteleportEntityPacket.x;
+            entity.serverPosY = packet34EntityteleportEntityPacket.y;
+            entity.serverPosZ = packet34EntityteleportEntityPacket.z;
+            double d = (double) entity.serverPosX / 32D;
+            double d1 = (double) entity.serverPosY / 32D + 0.015625D;
+            double d2 = (double) entity.serverPosZ / 32D;
+            float f = (float) (packet34EntityteleportEntityPacket.yaw * 360) / 256F;
+            float f1 = (float) (packet34EntityteleportEntityPacket.pitch * 360) / 256F;
+            entity.lerpTo(d, d1, d2, f, f1, 3);
+            return;
+        }
+    }
+
+    @Override
+    public void handleEntity(MoveEntityPacket moveEntityPacket)
+    {
+        Entity entity = getEntityByID(moveEntityPacket.id);
+        if (entity == null)
+        {
+            return;
+        }
+        else
+        {
+            entity.serverPosX += moveEntityPacket.x;
+            entity.serverPosY += moveEntityPacket.y;
+            entity.serverPosZ += moveEntityPacket.z;
+            double d = (double) entity.serverPosX / 32D;
+            double d1 = (double) entity.serverPosY / 32D;
+            double d2 = (double) entity.serverPosZ / 32D;
+            float f = moveEntityPacket.rotating ? (float) (moveEntityPacket.yaw * 360) / 256F : entity.yRot;
+            float f1 = moveEntityPacket.rotating ? (float) (moveEntityPacket.pitch * 360) / 256F : entity.xRot;
+            entity.lerpTo(d, d1, d2, f, f1, 3);
+            return;
+        }
+    }
+
+    @Override
+    public void handleEntityTagData(EntityTagDataPacket packet) {
+        Entity entity = getEntityByID(packet.entityId);
+        if (entity != null) {
+            entity.readAdditionalSaveData(packet.tag);
+        }
+    }
+
+    @Override
+    public void handleSetMobSpawner(SetMobSpawnerPacket setMobSpawnerPacket)
+    {
+        if (mc.theWorld.isBlockLoaded(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition))
+        {
+            BlockEntity tileentity = mc.theWorld.getBlockEntity(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition);
+            if (tileentity instanceof MobSpawnerBlockEntity)
+            {
+                MobSpawnerBlockEntity tileEntityMobSpawner = (MobSpawnerBlockEntity) tileentity;
+                tileEntityMobSpawner.setMobId(setMobSpawnerPacket.spawnType);
+
+                tileEntityMobSpawner.setChanged();
+            }
+        }
+    }
+
+    @Override
+    public void handleDestroyEntity(RemoveEntityPacket packet29DestroyentityPacket)
+    {
+        worldClient.removeEntityFromWorld(packet29DestroyentityPacket.entityId);
+    }
+
+    @Override
+    public void handleFlying(MovePlayerPacket movePlayerPacket)
+    {
+        LocalPlayer entityplayersp = mc.thePlayer;
+        double d = ((Player) (entityplayersp)).x;
+        double d1 = ((Player) (entityplayersp)).y;
+        double d2 = ((Player) (entityplayersp)).z;
+        float f = ((Player) (entityplayersp)).yRot;
+        float f1 = ((Player) (entityplayersp)).xRot;
+        if (movePlayerPacket.hasPosition)
+        {
+            d = movePlayerPacket.x;
+            d1 = movePlayerPacket.y;
+            d2 = movePlayerPacket.z;
+        }
+        if (movePlayerPacket.hasRotation)
+        {
+            f = movePlayerPacket.yaw;
+            f1 = movePlayerPacket.pitch;
+        }
+        entityplayersp.ySlideOffset = 0.0F;
+        entityplayersp.xd = entityplayersp.yd = entityplayersp.zd = 0.0D;
+        entityplayersp.absMoveTo(d, d1, d2, f, f1);
+        movePlayerPacket.x = ((Player) (entityplayersp)).x;
+        movePlayerPacket.y = ((Player) (entityplayersp)).bb.minY;
+        movePlayerPacket.z = ((Player) (entityplayersp)).z;
+        movePlayerPacket.yView = ((Player) (entityplayersp)).y;
+        netManager.addToSendQueue(movePlayerPacket);
+        if (!started)
+        {
+            mc.thePlayer.xo = mc.thePlayer.x;
+            mc.thePlayer.yo = mc.thePlayer.y;
+            mc.thePlayer.zo = mc.thePlayer.z;
+            started = true;
+            mc.displayGuiScreen(null);
+        }
+    }
+
+    @Override
+    public void handlePreChunk(ChunkVisibilityPacket packet50PrechunkVisibilityPacket)
+    {
+        worldClient.doPreChunk(packet50PrechunkVisibilityPacket.xPosition, packet50PrechunkVisibilityPacket.yPosition, packet50PrechunkVisibilityPacket.mode);
+    }
+
+    @Override
+    public void handleMultiBlockChange(ChunkBlocksUpdatePacket packet)
+    {
+        int xBase = packet.xChunk * 16;
+        int zBase = packet.zChunk * 16;
+        for (int k = 0; k < packet.size; k++)
+        {
+            int coord = packet.coordinateArray[k];
+            int type = packet.typeArray[k] & 0x3fff;
+            byte data = packet.metadataArray[k];
+            int x = coord >> 0 & 0xf;
+            int y = coord >> 8 & 0xff;
+            int z = coord >> 4 & 0xf;
+            worldClient.setBlockAndMetadataWithNotify(x + xBase, y, z + zBase, type, data);
+            worldClient.func_711_c(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
+            worldClient.markBlocksDirty(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
+        }
+
+    }
+
+    @Override
+    public void handleMapChunk(BlockRegionUpdatePacket packet)
+    {
+        worldClient.func_711_c(packet.xPosition, packet.yPosition, packet.zPosition, (packet.xPosition + packet.xSize) - 1, (packet.yPosition + packet.ySize) - 1, (packet.zPosition + packet.zSize) - 1);
+        worldClient.setChunkData(packet.xPosition, packet.yPosition, packet.zPosition, packet.xSize, packet.ySize, packet.zSize, packet.chunk);
+    }
+
+    @Override
+    public void handleBlockChange(BlockUpdatePacket blockchange)
+    {
+        worldClient.blockChange(blockchange.xPosition, blockchange.yPosition, blockchange.zPosition, blockchange.type, blockchange.metadata);
+    }
+
+    @Override
+    public void handleKickDisconnect(DisconnectPacket packet255KickdisconnectPacket)
+    {
+        netManager.networkShutdown("disconnect.kicked", new Object[0]);
+        disconnected = true;
+        mc.changeWorld(null);
+        mc.displayGuiScreen(new GuiConnectFailed("disconnect.disconnected", "disconnect.genericReason", new Object[]{
+            packet255KickdisconnectPacket.reason
+        }));
+    }
+
+    @Override
+    public void handleErrorMessage(String s, Object[] errorLines)
+    {
+        if (!disconnected) {
+            disconnected = true;
+            mc.changeWorld(null);
+            mc.displayGuiScreen(new GuiConnectFailed("disconnect.lost", s, errorLines));
+        }
+    }
+
+    public void func_28117_a(Packet packet)
+    {
+        if (disconnected)
+        {
+            return;
+        }
+        else
+        {
+            netManager.addToSendQueue(packet);
+            netManager.serverShutdown();
+            return;
+        }
+    }
+
+    public void addToSendQueue(Packet packet)
+    {
+        if (!disconnected) {
+            netManager.addToSendQueue(packet);
+        }
+    }
+
+    @Override
+    public void handleCollect(TakeItemEntityPacket takeItemEntityPacket)
+    {
+        Entity entity = getEntityByID(takeItemEntityPacket.collectedEntityId);
+        Object obj = (Mob) getEntityByID(takeItemEntityPacket.collectorEntityId);
+        if (obj == null)
+        {
+            obj = mc.thePlayer;
+        }
+        if (entity != null)
+        {
+            // this class does not seem to handle pick up from server dropped items. find where it is.
+            // something about that isn't working on servers if the player changed their gamemode.
+            worldClient.playSoundAtEntity(null, entity, "random.pop", 0.2F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+            mc.effectRenderer.addEffect(new TakeAnimationParticle(mc.theWorld, entity, ((Entity) (obj)), -0.5F));
+            worldClient.removeEntityFromWorld(takeItemEntityPacket.collectedEntityId);
+        }
+    }
+
+	@Override
+	public void handleChat(ChatPacket packet) {
+		String message;
+		if(packet.encrypted) {
+			try {
+				message = AES.decrypt(packet.message, AES.clientKeyChain);
+			}catch (Exception e) {
+				throw new RuntimeException(ChatPacket.ENCRYPTION_ERROR_MESSAGE, e);
+			}
+		}else {
+			message = packet.message;
+		}
+		
+		int type = packet.type;
+		if(type == 1) {
+			mc.ingameGUI.guiHeldItemTooltip.setString(message);
+		}else {
+			mc.ingameGUI.addChatMessage(message);
+		}
+	}
+
+    public void handlePlayerJoin(ChatPacket chatPacket)
+    {
+        mc.ingameGUI.addChatMessage(chatPacket.message);
+    }
+
+    public void handlePlayerLeave(ChatPacket chatPacket)
+    {
+        mc.ingameGUI.addChatMessage(chatPacket.message);
+    }
+
+    @Override
+    public void handleAnimation(AnimatePacket animatePacket)
+    {
+        Entity entity = getEntityByID(animatePacket.entityId);
+        if (entity == null)
+        {
+            return;
+        }
+        if (animatePacket.animate == 1)
+        {
+            Player entityplayer = (Player) entity;
+            entityplayer.swingItem();
+        }
+        else if (animatePacket.animate == 2)
+        {
+            entity.animateHurt();
+        }
+        else if (animatePacket.animate == 3)
+        {
+            Player entityplayer1 = (Player) entity;
+            entityplayer1.wakeUpPlayer(false, false);
+        }
+        else if (animatePacket.animate == 4)
+        {
+            Player entityplayer2 = (Player) entity;
+            entityplayer2.func_6420_o();
+        }
+    }
+
+    @Override
+    public void handleSleep(SleepPacket sleepPacket)
+    {
+        Entity entity = getEntityByID(sleepPacket.entityID);
+        if (entity == null)
+        {
+            return;
+        }
+        if (sleepPacket.field_22046_e == 0)
+        {
+            Player entityplayer = (Player) entity;
+            entityplayer.sleepInBedAt(sleepPacket.x, sleepPacket.y, sleepPacket.z);
+        }
+    }
+
+    @Override
+    public void handleHandshake(PreLoginPacket preLoginPacket)
+    {
+        if (preLoginPacket.username.equals("-"))
+        {
+            try
+            {
+                RSA.RSAKeyChain = RSA.generateKeyPair();
+                addToSendQueue(new LoginPacket(mc.session.username, Global.MP_PROTOCOL_VERSION, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+        else
+        {
+            try
+            {
+                URL url = new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + mc.session.username + "&sessionId=" + mc.session.sessionId + "&serverId=" + preLoginPacket.username);
+                BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream()));
+                String s = bufferedreader.readLine();
+                bufferedreader.close();
+                if (s.equalsIgnoreCase("ok"))
+                {
+                    try
+                    {
+                        RSA.RSAKeyChain = RSA.generateKeyPair();
+                        addToSendQueue(new LoginPacket(mc.session.username, Global.MP_PROTOCOL_VERSION, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
+                    }
+                    catch (Exception e)
+                    {
+                        throw new RuntimeException(e);
+                    }
+                }
+                else
+                {
+                    netManager.networkShutdown("disconnect.loginFailedInfo", new Object[]{
+                            s
+                    });
+                }
+            }
+            catch (Exception exception)
+            {
+                exception.printStackTrace();
+                netManager.networkShutdown("disconnect.genericReason", new Object[]{
+                        "Internal client error: " + exception.toString()
+                });
+            }
+        }
+    }
+
+    @Override
+    public void handleSendKey(AESSendKeyPacket AESSendKeyPacket)
+    {
+        try
+        {
+            AES.clientKeyChain = AES.getKey(RSA.decrypt(AESSendKeyPacket.KEY, RSA.RSAKeyChain.getPrivate()));
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void handlePlayerList(PlayerListPacket playerListPacket)
+    {
+        playerList.clear();
+        String[] players = playerListPacket.players;
+        String[] scores = playerListPacket.scores;
+        for (int i = 0; i < players.length; i++)
+        {
+            playerList.put(players[i], scores[i]);
+        }
+    }
+
+    public void disconnect()
+    {
+        disconnected = true;
+        netManager.wakeThreads();
+        netManager.networkShutdown("disconnect.closed", new Object[0]);
+    }
+
+    @Override
+    public void handleMobSpawn(AddMobPacket addMobspawn)
+    {
+        double d = (double) addMobspawn.x / 32D;
+        double d1 = (double) addMobspawn.y / 32D;
+        double d2 = (double) addMobspawn.z / 32D;
+        float f = (float) (addMobspawn.yaw * 360) / 256F;
+        float f1 = (float) (addMobspawn.pitch * 360) / 256F;
+        Mob entityliving = (Mob) EntityDispatcher.createEntity(addMobspawn.type, mc.theWorld);
+        entityliving.serverPosX = addMobspawn.x;
+        entityliving.serverPosY = addMobspawn.y;
+        entityliving.serverPosZ = addMobspawn.z;
+        entityliving.id = addMobspawn.id;
+        entityliving.absMoveTo(d, d1, d2, f, f1);
+        entityliving.isMultiplayerEntity = true;
+        worldClient.addEntityToWorld(addMobspawn.id, entityliving);
+        java.util.List list = addMobspawn.getUnpackedData();
+        if (list != null)
+        {
+            entityliving.getEntityData().assignValues(list);
+        }
+        entityliving.nickname = StringUtils.substring(addMobspawn.nickname, 0, 32);
+        entityliving.chatColor = addMobspawn.chatColor;
+    }
+
+    @Override
+    public void handleUpdateTime(SetTimePacket packet4UpdatetimePacket)
+    {
+        mc.theWorld.setWorldTime(packet4UpdatetimePacket.time);
+    }
+
+    @Override
+    public void handleSpawnPosition(SetSpawnPositionPacket setSpawnpositionPacket)
+    {
+        mc.thePlayer.setPlayerSpawnCoordinate(new ChunkCoordinates(setSpawnpositionPacket.x, setSpawnpositionPacket.y, setSpawnpositionPacket.z));
+        mc.theWorld.getLevelData().setSpawn(setSpawnpositionPacket.x, setSpawnpositionPacket.y, setSpawnpositionPacket.z);
+    }
+
+    @Override
+    public void handleAttachEntity(SetRidingPacket packet)
+    {
+        Entity passenger = getEntityByID(packet.passengerId);
+        IVehicle vehicle;
+        if (packet.passengerId == mc.thePlayer.id)
+        {
+            passenger = mc.thePlayer;
+        }
+        if (packet.isTileEntity) {
+            vehicle = (IVehicle) worldClient.getBlockEntity(packet.x, packet.y, packet.z);
+        } else {
+            vehicle = getEntityByID(packet.vehicleId);
+        }
+        if (passenger != null && vehicle != null) {
+            passenger.startRiding(vehicle);
+        }
+    }
+
+    @Override
+    public void handleEntityStatus(EnitityEventPacket enitityEventPacket38Entitystatus)
+    {
+        Entity entity = getEntityByID(enitityEventPacket38Entitystatus.entityId);
+        if (entity != null)
+        {
+            entity.handleEntityEvent(enitityEventPacket38Entitystatus.entityStatus, enitityEventPacket38Entitystatus.attackedAtYaw);
+        }
+    }
+
+    protected Entity getEntityByID(int i)
+    {
+        if (i == mc.thePlayer.id)
+        {
+            return mc.thePlayer;
+        }
+        else
+        {
+            return worldClient.getEntityFromId(i);
+        }
+    }
+
+    @Override
+    public void handleUpdateHealth(SetHealthPacket packet8UpdatehealthPacket)
+    {
+        mc.thePlayer.setHealth(packet8UpdatehealthPacket.healthMP);
+    }
+
+    @Override
+    public void handleUpdatePlayerProfile(UpdatePlayerProfilePacket packet72playerprofile)
+    {
+        PlayerProfile playerProfile = new PlayerProfile(packet72playerprofile.username, packet72playerprofile.nickname, packet72playerprofile.score, packet72playerprofile.chatColor, packet72playerprofile.isOperator);
+        if (playerProfile.playerName.equals(mc.thePlayer.username))
+        {
+            mc.thePlayer.score = playerProfile.scoreTotal;
+        }
+        int index = findPlayerInList(playerProfile);
+        if (index != -1)
+        {
+            if (!packet72playerprofile.isOnline)
+            {
+                removePlayer(index);
+            }
+            else
+            {
+                players.set(index, playerProfile);
+            }
+        }
+        else
+        {
+            addPlayer(playerProfile);
+        }
+    }
+
+    @Override
+    public void handleRespawn(RespawnPacket respawnPacket)
+    {
+        if (respawnPacket.respawnDimensionId != mc.thePlayer.dimension)
+        {
+            started = false;
+            worldClient = new WorldClient(mc, this, worldClient.getLevelData().getRandomSeed(), respawnPacket.respawnDimensionId, respawnPacket.respawnWorldTypeId);
+            worldClient.isClientSide = true;
+            mc.changeWorld(worldClient);
+            mc.thePlayer.dimension = respawnPacket.respawnDimensionId;
+            mc.displayGuiScreen(new GuiDownloadTerrain(this));
+        }
+        mc.respawn(true, respawnPacket.respawnDimensionId);
+    }
+
+    @Override
+    public void handleExplosion(ExplosionPacket explosionPacket)
+    {
+        Explosion explosion;
+        if (explosionPacket.isCannonball)
+        {
+            explosion = new ExplosionCannonball(mc.theWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
+        }
+        else
+        {
+            explosion = new Explosion(mc.theWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
+        }
+        explosion.destroyedBlockPositions = explosionPacket.destroyedBlockPositions;
+        //explosion.doExplosionA();
+        explosion.addEffects(true);
+    }
+
+    @Override
+    public void handleOpenWindow(ContainerOpenPacket containerOpenwindow)
+    {
+        if (containerOpenwindow.inventoryType == 0)
+        {
+            SimpleContainer inventorybasic = new SimpleContainer(containerOpenwindow.windowTitle, containerOpenwindow.slotsCount);
+            mc.thePlayer.displayGUIChest(inventorybasic);
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+        else if (containerOpenwindow.inventoryType == 2)
+        {
+            FurnaceBlockEntity tileentityfurnace = new FurnaceBlockEntity();
+            mc.thePlayer.displayGUIFurnace(tileentityfurnace);
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+        else if (containerOpenwindow.inventoryType == 3)
+        {
+            DispenserBlockEntity tileentitydispenser = new DispenserBlockEntity();
+            mc.thePlayer.displayGUIDispenser(tileentitydispenser);
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+        else if (containerOpenwindow.inventoryType == 4)
+        {
+            BlastFurnaceBlockEntity tileentityblastfurnace = new BlastFurnaceBlockEntity();
+            mc.thePlayer.displayGUIFurnace(tileentityblastfurnace);
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+        else if (containerOpenwindow.inventoryType == 5)
+        {
+            TrommelBlockEntity tileentitytrommel = new TrommelBlockEntity();
+            mc.thePlayer.displayGUITrommel(tileentitytrommel);
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+        else if (containerOpenwindow.inventoryType == 7)
+        {
+            mc.thePlayer.displayGUIPaintingPicker();
+        }
+        else if (containerOpenwindow.inventoryType == 1)
+        {
+            LocalPlayer entityplayersp = mc.thePlayer;
+            mc.thePlayer.displayGUIWorkbench(MathHelper.floor(entityplayersp.x), MathHelper.floor(entityplayersp.y), MathHelper.floor(entityplayersp.z));
+            mc.thePlayer.craftingInventory.containerId = containerOpenwindow.windowId;
+        }
+    }
+
+    @Override
+    public void handleOpenFlagWindow(FlagOpenPacket packet)
+    {
+        BlockEntity blockEntity = worldClient.getBlockEntity(packet.x, packet.y, packet.z);
+        if (blockEntity instanceof FlagBlockEntity)
+        {
+            FlagBlockEntity tileEntityFlag = (FlagBlockEntity) blockEntity;
+            mc.thePlayer.displayGUIEditFlag(tileEntityFlag);
+            mc.thePlayer.craftingInventory.containerId = packet.windowId;
+        }
+    }
+
+    @Override
+    public void handlePhotoMode(PhotoModePacket packet)
+    {
+        GuiIngameMenu.photoModeDisabled = packet.disabled;
+    }
+
+    @Override
+    public void handleSetSlot(ContainerSetSlotPacket containerSetslotPacket)
+    {
+        if (containerSetslotPacket.windowId == -1)
+        {
+            mc.thePlayer.inventory.setHeldItemStack(containerSetslotPacket.myItemStack);
+        }
+        else if (containerSetslotPacket.windowId == 0 && containerSetslotPacket.itemSlot >= 36 && containerSetslotPacket.itemSlot < 45)
+        {
+            ItemStack itemstack = mc.thePlayer.inventorySlots.getSlot(containerSetslotPacket.itemSlot).getItem();
+            if (containerSetslotPacket.myItemStack != null && (itemstack == null || itemstack.stackSize < containerSetslotPacket.myItemStack.stackSize))
+            {
+                containerSetslotPacket.myItemStack.animationsToGo = 5;
+            }
+            mc.thePlayer.inventorySlots.setItem(containerSetslotPacket.itemSlot, containerSetslotPacket.myItemStack);
+        }
+        else if (containerSetslotPacket.windowId == mc.thePlayer.craftingInventory.containerId)
+        {
+            mc.thePlayer.craftingInventory.setItem(containerSetslotPacket.itemSlot, containerSetslotPacket.myItemStack);
+        }
+    }
+
+    @Override
+    public void handleTransaction(ContainerAckPacket containerAckPacket)
+    {
+        AbstractContainerMenu container = null;
+        if (containerAckPacket.windowId == 0)
+        {
+            container = mc.thePlayer.inventorySlots;
+        }
+        else if (containerAckPacket.windowId == mc.thePlayer.craftingInventory.containerId)
+        {
+            container = mc.thePlayer.craftingInventory;
+        }
+        if (container != null)
+        {
+            if (containerAckPacket.accepted)
+            {
+                container.deleteBackup(containerAckPacket.shortWindowId);
+            }
+            else
+            {
+                container.rollbackToBackup(containerAckPacket.shortWindowId);
+                addToSendQueue(new ContainerAckPacket(containerAckPacket.windowId, containerAckPacket.shortWindowId, true));
+            }
+        }
+    }
+
+    @Override
+    public void handleWindowItems(ContainerSetContentPacket containerSetContentPacket104Windowitems)
+    {
+        if (containerSetContentPacket104Windowitems.windowId == 0)
+        {
+            mc.thePlayer.inventorySlots.setAll(containerSetContentPacket104Windowitems.stackList);
+        }
+        else if (containerSetContentPacket104Windowitems.windowId == mc.thePlayer.craftingInventory.containerId)
+        {
+            mc.thePlayer.craftingInventory.setAll(containerSetContentPacket104Windowitems.stackList);
+        }
+    }
+
+    @Override
+    public void handleUpdateProgressbar(ContainerSetDataPacket containerSetDataPacket105Updateprogressbar)
+    {
+        handleInvalidPacket(containerSetDataPacket105Updateprogressbar);
+        if (mc.thePlayer.craftingInventory != null && mc.thePlayer.craftingInventory.containerId == containerSetDataPacket105Updateprogressbar.windowId)
+        {
+            mc.thePlayer.craftingInventory.setData(containerSetDataPacket105Updateprogressbar.progressBar, containerSetDataPacket105Updateprogressbar.progressBarValue);
+        }
+    }
+
+    @Override
+    public void handlePlayerInventory(SetEquippedItemPacket setEquippedItemPacket5Playerinventory)
+    {
+        Entity entity = getEntityByID(setEquippedItemPacket5Playerinventory.entityID);
+        if (entity != null)
+        {
+            entity.setEquippedSlot(setEquippedItemPacket5Playerinventory.slot, setEquippedItemPacket5Playerinventory.itemID, setEquippedItemPacket5Playerinventory.itemMeta, setEquippedItemPacket5Playerinventory.itemData);
+        }
+    }
+
+    @Override
+    public void handleCloseWindow(ContainerClosePacket containerClosewindow)
+    {
+        mc.thePlayer.closeScreen();
+    }
+
+    @Override
+    public void handlePlayNoteBlock(BlockEventPacket packet54PlaynoteblockEventPacket)
+    {
+        mc.theWorld.triggerEvent(packet54PlaynoteblockEventPacket.xLocation, packet54PlaynoteblockEventPacket.yLocation, packet54PlaynoteblockEventPacket.zLocation, packet54PlaynoteblockEventPacket.instrumentType, packet54PlaynoteblockEventPacket.pitch);
+    }
+
+    // TODO
+    // todo what?
+    @Override
+    public void handleBed(BedMessagePacket bedMessagePacket)
+    {
+        int state = bedMessagePacket.bedState;
+        if (state >= 0 && state < BedMessagePacket.BED_MESSAGE_KEYS.length && BedMessagePacket.BED_MESSAGE_KEYS[state] != null)
+        {
+            mc.thePlayer.sendTranslatedChatMessage(BedMessagePacket.BED_MESSAGE_KEYS[state]);
+        }
+    }
+
+    @Override
+    public void handleMapData(MapDataPacket mapdataPacket)
+    {
+        if (mapdataPacket.itemId == Items.MAP.id)
+        {
+            MapItem.getOrCreateSavedData(mapdataPacket.meta, mapdataPacket.scale, mc.theWorld).setColors(mapdataPacket.mapData);
+        }
+        else
+        {
+            System.out.println((new StringBuilder()).append("Unknown itemid: ").append(mapdataPacket.meta).toString());
+        }
+    }
+
+    @Override
+    public void handlePlaySoundEffect(PlaySoundEffectPacket playsoundeffectPacket)
+    {
+        mc.theWorld.playSoundEffect(playsoundeffectPacket.soundID, playsoundeffectPacket.x, playsoundeffectPacket.y, playsoundeffectPacket.z, playsoundeffectPacket.data);
+    }
+
+	@Override
+	public void handlePlaySoundDirectly(PlaySoundEffectDirectPacket packet) {
+		String soundPath = SoundTypes.getSoundById(packet.soundId);
+		if(soundPath == null) {
+			return;
+		}
+		mc.sndManager.playSoundAt(soundPath, packet.soundType, (float) packet.x, (float) packet.y, (float) packet.z, packet.volume, packet.pitch);
+	}
+    
+    @Override
+    public void handleSpawnParticle(AddParticlePacket addParticlePacket)
+    {
+        if (addParticlePacket.isGroup){
+            for (int i = 0; i < addParticlePacket.amount; i++) {
+                mc.renderGlobal.addParticle(addParticlePacket.particleKey,
+                        addParticlePacket.x + rand.nextDouble() * addParticlePacket.randOffX,
+                        addParticlePacket.y + rand.nextDouble() * addParticlePacket.randOffY,
+                        addParticlePacket.z + rand.nextDouble() * addParticlePacket.randOffZ,
+                        addParticlePacket.motionX + rand.nextGaussian() * addParticlePacket.randMotionX,
+                        addParticlePacket.motionY + rand.nextGaussian() * addParticlePacket.randMotionY,
+                        addParticlePacket.motionZ + rand.nextGaussian() * addParticlePacket.randMotionZ,
+                        addParticlePacket.data,
+                        addParticlePacket.maxDistance);
+            }
+        } else {
+            mc.renderGlobal.addParticle(addParticlePacket.particleKey,
+                    addParticlePacket.x,
+                    addParticlePacket.y,
+                    addParticlePacket.z,
+                    addParticlePacket.motionX,
+                    addParticlePacket.motionY,
+                    addParticlePacket.motionZ,
+                    addParticlePacket.data,
+                    addParticlePacket.maxDistance);
+        }
+
+    }
+
+    @Override
+    public void handleStatistic(StatisticPacket statisticPacket)
+    {
+        mc.thePlayer.addStat(StatList.getStat(statisticPacket.statID), statisticPacket.valueChange);
+    }
+
+    @Override
+    public void handleEntityPlayerGamemode(PlayerGamemodePacket packet)
+    {
+        Entity entity = getEntityByID(packet.entityId);
+        if (entity instanceof Player){
+            ((Player) entity).setGamemode(Gamemode.gamemodesList[packet.gamemodeId]);
+        }
+    }
+
+    @Override
+    public void handleEntityNickname(EntityNicknamePacket entityNicknamePacket)
+    {
+        Entity entity = getEntityByID(entityNicknamePacket.entityId);
+
+        if (entity instanceof Mob) {
+            ((Mob) entity).nickname = StringUtils.substring(entityNicknamePacket.nickname, 0, 32);
+            ((Mob) entity).chatColor = entityNicknamePacket.chatColor;
+        }
+    }
+
+    @Override
+    public boolean isServerHandler()
+    {
+        return false;
+    }
+    
+    @Override
+    public void handleBlockItemSwitch(SetCarriedItemPacket packet16blockitemswitch) {
+        mc.thePlayer.inventory.currentItem = packet16blockitemswitch.id;
+    }
+
+    @Override
+    public void handleTileEntityData(BlockEntityDataPacket packet)
+    {
+        Class<?> clazz = BlockEntity.getClassFromID(packet.tag.getString("id"));
+        if (clazz == null) return;
+        BlockEntity existingBlockEntity = worldClient.getBlockEntity(packet.tag.getInteger("x"), packet.tag.getInteger("y"), packet.tag.getInteger("z"));
+        if (existingBlockEntity == null || existingBlockEntity.getClass() != clazz)
+        {
+            BlockEntity blockEntity = BlockEntity.createAndLoadEntity(packet.tag);
+            if (blockEntity != null)
+            {
+                mc.theWorld.setBlockTileEntity(blockEntity.x, blockEntity.y, blockEntity.z, blockEntity);
+            }
+        }
+        else
+        {
+            existingBlockEntity.readFromNBT(packet.tag);
+        }
+        worldClient.markBlockDirty(packet.tag.getInteger("x"), packet.tag.getInteger("y"), packet.tag.getInteger("z"));
+    }
+
+    @Override
+    public void handleGameRule(GameRulePacket packet) {
+        LevelData levelData = mc.theWorld.getLevelData();
+        if (packet.getGameRules() != null) {
+            levelData.getGameRules().setValues(packet.getGameRules());
+        }
+    }
+
+    @Override
+    public void handleSyncedRecipe(RecipeSyncPacket recipeSyncPacket) {
+        if(Registries.RECIPES.getAllSerializableRecipes().isEmpty()){
+            System.out.println("Receiving "+ recipeSyncPacket.maxRecipes+" recipes from server..");
+        }
+        DataLoader.loadRecipeFromServer(recipeSyncPacket);
+        if(Registries.RECIPES.getAllSerializableRecipes().size() == recipeSyncPacket.maxRecipes){
+            System.out.println("All recipes received!");
+            Registries.RECIPES.invalidateCaches();
+            SearchPage.searchField.setText("_");
+            PageManager.searchQuery = SearchQuery.resolve(SearchPage.searchField.getText());
+            GuiGuidebook.getPageManager().updatePages();
+            SearchPage.searchField.setText("");
+            PageManager.searchQuery = SearchQuery.resolve(SearchPage.searchField.getText());
+            GuiGuidebook.getPageManager().updatePages();
+        }
+    }
+    
+    @Override
+    public void handleIds(SyncIDsPacket packet) {
+    	SoundTypes.setSoundIds(packet.soundIds);
+    }
+    
+    @Override
+    public void handleCustomPayload(CustomPayloadPacket packet) {
+    	
+    }
+}
diff --git a/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java b/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java
deleted file mode 100644
index ee06c910e..000000000
--- a/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java
+++ /dev/null
@@ -1,1215 +0,0 @@
-package net.minecraft.client.net.handler;
-
-import com.b100.utils.StringUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityPickupFX;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
-import net.minecraft.client.entity.player.EntityOtherPlayerMP;
-import net.minecraft.client.entity.player.EntityPlayerSP;
-import net.minecraft.client.gui.GuiConnectFailed;
-import net.minecraft.client.gui.GuiDownloadTerrain;
-import net.minecraft.client.gui.GuiIngameMenu;
-import net.minecraft.client.gui.guidebook.GuiGuidebook;
-import net.minecraft.client.gui.guidebook.PageManager;
-import net.minecraft.client.gui.guidebook.search.SearchPage;
-import net.minecraft.client.player.controller.PlayerControllerMP;
-import net.minecraft.client.world.WorldClient;
-import net.minecraft.core.Global;
-import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityBlastFurnace;
-import net.minecraft.core.block.entity.TileEntityDispenser;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.block.entity.TileEntityFurnace;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
-import net.minecraft.core.block.entity.TileEntityTrommel;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-import net.minecraft.core.data.DataLoader;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.RecipeRegistry;
-import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLightningBolt;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.EntityPainting;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityProjectile;
-import net.minecraft.core.enums.ArtType;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemMap;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.NetworkManager;
-import net.minecraft.core.net.PlayerProfile;
-import net.minecraft.core.net.entity.NetEntityHandler;
-import net.minecraft.core.net.handler.NetHandler;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet100OpenWindow;
-import net.minecraft.core.net.packet.Packet101CloseWindow;
-import net.minecraft.core.net.packet.Packet103SetSlot;
-import net.minecraft.core.net.packet.Packet104WindowItems;
-import net.minecraft.core.net.packet.Packet105UpdateProgressbar;
-import net.minecraft.core.net.packet.Packet106Transaction;
-import net.minecraft.core.net.packet.Packet10Flying;
-import net.minecraft.core.net.packet.Packet131MapData;
-import net.minecraft.core.net.packet.Packet132SetMobSpawner;
-import net.minecraft.core.net.packet.Packet136SendKey;
-import net.minecraft.core.net.packet.Packet138PlayerList;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
-import net.minecraft.core.net.packet.Packet142OpenFlagWindow;
-import net.minecraft.core.net.packet.Packet143PhotoMode;
-import net.minecraft.core.net.packet.Packet16BlockItemSwitch;
-import net.minecraft.core.net.packet.Packet17Sleep;
-import net.minecraft.core.net.packet.Packet18Animation;
-import net.minecraft.core.net.packet.Packet1Login;
-import net.minecraft.core.net.packet.Packet200Statistic;
-import net.minecraft.core.net.packet.Packet201Ids;
-import net.minecraft.core.net.packet.Packet20NamedEntitySpawn;
-import net.minecraft.core.net.packet.Packet21PickupSpawn;
-import net.minecraft.core.net.packet.Packet22Collect;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
-import net.minecraft.core.net.packet.Packet24MobSpawn;
-import net.minecraft.core.net.packet.Packet250CustomPayload;
-import net.minecraft.core.net.packet.Packet255KickDisconnect;
-import net.minecraft.core.net.packet.Packet25EntityPainting;
-import net.minecraft.core.net.packet.Packet28EntityVelocity;
-import net.minecraft.core.net.packet.Packet29DestroyEntity;
-import net.minecraft.core.net.packet.Packet2Handshake;
-import net.minecraft.core.net.packet.Packet30Entity;
-import net.minecraft.core.net.packet.Packet34EntityTeleport;
-import net.minecraft.core.net.packet.Packet35EntityNickname;
-import net.minecraft.core.net.packet.Packet38EntityStatus;
-import net.minecraft.core.net.packet.Packet39AttachEntity;
-import net.minecraft.core.net.packet.Packet3Chat;
-import net.minecraft.core.net.packet.Packet40EntityMetadata;
-import net.minecraft.core.net.packet.Packet41EntityPlayerGamemode;
-import net.minecraft.core.net.packet.Packet42EntityTagData;
-import net.minecraft.core.net.packet.Packet4UpdateTime;
-import net.minecraft.core.net.packet.Packet50PreChunk;
-import net.minecraft.core.net.packet.Packet51MapChunk;
-import net.minecraft.core.net.packet.Packet52MultiBlockChange;
-import net.minecraft.core.net.packet.Packet53BlockChange;
-import net.minecraft.core.net.packet.Packet54PlayNoteBlock;
-import net.minecraft.core.net.packet.Packet5PlayerInventory;
-import net.minecraft.core.net.packet.Packet60Explosion;
-import net.minecraft.core.net.packet.Packet61PlaySoundEffect;
-import net.minecraft.core.net.packet.Packet62PlaySoundDirect;
-import net.minecraft.core.net.packet.Packet63SpawnParticleEffect;
-import net.minecraft.core.net.packet.Packet6SpawnPosition;
-import net.minecraft.core.net.packet.Packet70Bed;
-import net.minecraft.core.net.packet.Packet71Weather;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
-import net.minecraft.core.net.packet.Packet73WeatherStatus;
-import net.minecraft.core.net.packet.Packet74GameRule;
-import net.minecraft.core.net.packet.Packet75RecipeSync;
-import net.minecraft.core.net.packet.Packet8UpdateHealth;
-import net.minecraft.core.net.packet.Packet9Respawn;
-import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.Container;
-import net.minecraft.core.player.inventory.InventoryBasic;
-import net.minecraft.core.sound.SoundTypes;
-import net.minecraft.core.util.helper.AES;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.RSA;
-import net.minecraft.core.world.Explosion;
-import net.minecraft.core.world.ExplosionCannonball;
-import net.minecraft.core.world.IVehicle;
-import net.minecraft.core.world.chunk.ChunkCoordinates;
-import net.minecraft.core.world.save.LevelData;
-import net.minecraft.core.world.saveddata.SavedDataStorage;
-import net.minecraft.core.world.weather.Weather;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Random;
-
-public class NetClientHandler extends NetHandler
-{
-    private boolean disconnected;
-    private final NetworkManager netManager;
-    public String field_1209_a;
-    private final Minecraft mc;
-    private WorldClient worldClient;
-    private boolean field_1210_g;
-    public SavedDataStorage savedDataStorage;
-    public List<PlayerProfile> players;
-    public HashMap<String, String> playerList = new HashMap<>();
-    Random rand;
-
-    public NetClientHandler(Minecraft minecraft, String host, int port)
-            throws UnknownHostException, IOException
-    {
-        disconnected = false;
-        field_1210_g = false;
-        savedDataStorage = new SavedDataStorage(null);
-        rand = new Random();
-        mc = minecraft;
-        Socket socket = new Socket(InetAddress.getByName(host), port);
-        netManager = new NetworkManager(socket, "Client", this);
-        players = new ArrayList<>();
-    }
-
-    public void processReadPackets()
-    {
-        if (!disconnected)
-        {
-            netManager.processReadPackets();
-        }
-        netManager.wakeThreads();
-    }
-
-    public int findPlayerInList(PlayerProfile playerProfile)
-    {
-        for (int i = 0; i < players.size(); i++)
-        {
-            if (players.get(i).playerName.equals(playerProfile.playerName))
-            {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    public void addPlayer(PlayerProfile playerProfile)
-    {
-        players.add(playerProfile);
-    }
-
-    public PlayerProfile getPlayer(String username)
-    {
-        for (PlayerProfile player : players)
-        {
-            if (player.playerName.equals(username))
-            {
-                return player;
-            }
-        }
-
-        return null;
-    }
-
-    public void removePlayer(int index)
-    {
-        players.remove(index);
-    }
-
-
-    @Override
-    public void handleLogin(Packet1Login packet1login)
-    {
-        mc.playerController = new PlayerControllerMP(mc, this);
-        mc.statsCounter.addValueToStat(StatList.joinMultiplayerStat, 1);
-        worldClient = new WorldClient(mc, this, packet1login.worldSeed, packet1login.dimensionId, packet1login.worldTypeId);
-        worldClient.isClientSide = true;
-        mc.changeWorld(worldClient);
-        mc.thePlayer.dimension = packet1login.dimensionId;
-        mc.displayGuiScreen(new GuiDownloadTerrain(this));
-        mc.thePlayer.id = packet1login.playerEntityIdAndProtocolVersion;
-        NetworkManager.PACKET_DELAY = packet1login.packetDelay;
-        Registries.RECIPES = new RecipeRegistry();
-        CraftingManager.getInstance().reset();
-        CraftingManager.getInstance().init();
-    }
-
-    @Override
-    public void handlePickupSpawn(Packet21PickupSpawn packet21pickupspawn)
-    {
-        double x = packet21pickupspawn.xPosition / 32D;
-        double y = packet21pickupspawn.yPosition / 32D;
-        double z = packet21pickupspawn.zPosition / 32D;
-        EntityItem entityitem = new EntityItem(worldClient, x, y, z, new ItemStack(packet21pickupspawn.itemID, packet21pickupspawn.count, packet21pickupspawn.itemDamage, packet21pickupspawn.tag));
-        entityitem.xd = (double) packet21pickupspawn.xd / 128D;
-        entityitem.yd = (double) packet21pickupspawn.yd / 128D;
-        entityitem.zd = (double) packet21pickupspawn.zd / 128D;
-        entityitem.serverPosX = packet21pickupspawn.xPosition;
-        entityitem.serverPosY = packet21pickupspawn.yPosition;
-        entityitem.serverPosZ = packet21pickupspawn.zPosition;
-        worldClient.addEntityToWorld(packet21pickupspawn.entityId, entityitem);
-    }
-
-
-    @Override
-    public void handleVehicleSpawn(Packet23VehicleSpawn packet23) {
-        if (!NetEntityHandler.hasType(packet23.type)){ return; }
-        double xPosition = ((double) packet23.xPosition) / 32D;
-        double yPosition = ((double) packet23.yPosition) / 32D;
-        double zPosition = ((double) packet23.zPosition) / 32D;
-        Entity owner;
-        if (packet23.ownerId >= 0){
-            owner = getEntityByID(packet23.ownerId);
-        } else {
-            owner = null;
-        }
-        Entity newEntity = NetEntityHandler.getTypeEntry(packet23.type).getEntity(worldClient, xPosition, yPosition, zPosition, packet23.metaData, packet23.hasVelocity, packet23.xVelocity / 8000D, packet23.yVelocity / 8000D, packet23.zVelocity / 8000D, owner);
-        if (newEntity != null) {
-            newEntity.serverPosX = packet23.xPosition;
-            newEntity.serverPosY = packet23.yPosition;
-            newEntity.serverPosZ = packet23.zPosition;
-            newEntity.yRot = packet23.yaw;
-            newEntity.xRot = packet23.pitch;
-            newEntity.id = packet23.entityId;
-            worldClient.addEntityToWorld(packet23.entityId, newEntity);
-            if (owner instanceof EntityLiving && newEntity instanceof EntityProjectile){
-                ((EntityProjectile) newEntity).owner = (EntityLiving) owner;
-            }
-            if (packet23.hasVelocity){
-                newEntity.lerpMotion(((double) packet23.xVelocity) / 8000D, ((double) packet23.yVelocity) / 8000D, ((double) packet23.zVelocity) / 8000D);
-            }
-        }
-    }
-
-    @Override
-    public void handleWeather(Packet71Weather packet71weather)
-    {
-        double d = (double) packet71weather.field_27053_b / 32D;
-        double d1 = (double) packet71weather.field_27057_c / 32D;
-        double d2 = (double) packet71weather.field_27056_d / 32D;
-        EntityLightningBolt entitylightningbolt = null;
-        if (packet71weather.field_27055_e == 1)
-        {
-            entitylightningbolt = new EntityLightningBolt(worldClient, d, d1, d2);
-        }
-        if (entitylightningbolt != null)
-        {
-            entitylightningbolt.serverPosX = packet71weather.field_27053_b;
-            entitylightningbolt.serverPosY = packet71weather.field_27057_c;
-            entitylightningbolt.serverPosZ = packet71weather.field_27056_d;
-            entitylightningbolt.yRot = 0.0F;
-            entitylightningbolt.xRot = 0.0F;
-            entitylightningbolt.id = packet71weather.field_27054_a;
-            worldClient.addWeatherEffect(entitylightningbolt);
-        }
-    }
-
-    @Override
-    public void handleWeatherStatus(Packet73WeatherStatus packet)
-    {
-        if (worldClient.dimension.id != packet.dimId) return;
-        Weather currentWeather = packet.id == -1 ? null : Weather.weatherList[packet.id];
-        Weather newWeather = packet.newId == -1 ? null : Weather.weatherList[packet.newId];
-        worldClient.weatherManager.overrideWeather(currentWeather, newWeather, packet.duration, packet.intensity, packet.power);
-    }
-
-    @Override
-    public void handleEntityPainting(Packet25EntityPainting packet)
-    {
-        Entity entity = worldClient.getEntityFromId(packet.entityId);
-        if (entity instanceof EntityPainting){
-            EntityPainting painting = (EntityPainting) entity;
-            painting.xPosition = packet.xPosition;
-            painting.yPosition = packet.yPosition;
-            painting.zPosition = packet.zPosition;
-
-            if (ArtType.map.containsKey(packet.key)) painting.art = ArtType.map.get(packet.key);
-
-            painting.setDirection(packet.direction);
-            if (packet.itemID > 0){
-                painting.setStack(new ItemStack(packet.itemID, 1, packet.meta));
-            }
-        } else {
-            EntityPainting entitypainting = new EntityPainting(worldClient, packet.xPosition, packet.yPosition, packet.zPosition, packet.direction, packet.key);
-            worldClient.addEntityToWorld(packet.entityId, entitypainting);
-            if (packet.itemID > 0){
-                entitypainting.setStack(new ItemStack(packet.itemID, 1, packet.meta));
-            }
-        }
-
-    }
-
-    @Override
-    public void handleEntityVelocity(Packet28EntityVelocity packet28entityvelocity)
-    {
-        Entity entity = getEntityByID(packet28entityvelocity.entityId);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
-            entity.lerpMotion((double) packet28entityvelocity.motionX / 8000D, (double) packet28entityvelocity.motionY / 8000D, (double) packet28entityvelocity.motionZ / 8000D);
-            return;
-        }
-    }
-
-    @Override
-    public void handleEntityMetadata(Packet40EntityMetadata packet40entitymetadata)
-    {
-        Entity entity = getEntityByID(packet40entitymetadata.entityId);
-        if (entity != null && packet40entitymetadata.func_21047_b() != null)
-        {
-            entity.getEntityData().assignValues(packet40entitymetadata.func_21047_b());
-        }
-    }
-
-    @Override
-    public void handleNamedEntitySpawn(Packet20NamedEntitySpawn packet20namedentityspawn)
-    {
-        double d = (double) packet20namedentityspawn.xPosition / 32D;
-        double d1 = (double) packet20namedentityspawn.yPosition / 32D;
-        double d2 = (double) packet20namedentityspawn.zPosition / 32D;
-        float f = (float) (packet20namedentityspawn.rotation * 360) / 256F;
-        float f1 = (float) (packet20namedentityspawn.pitch * 360) / 256F;
-        EntityOtherPlayerMP entityotherplayermp = new EntityOtherPlayerMP(mc.theWorld, packet20namedentityspawn.name);
-        entityotherplayermp.xo = entityotherplayermp.serverPosX = packet20namedentityspawn.xPosition;
-        entityotherplayermp.yo = entityotherplayermp.serverPosY = packet20namedentityspawn.yPosition;
-        entityotherplayermp.zo = entityotherplayermp.serverPosZ = packet20namedentityspawn.zPosition;
-        int i = packet20namedentityspawn.currentItem;
-        if (i == 0)
-        {
-            entityotherplayermp.inventory.mainInventory[entityotherplayermp.inventory.currentItem] = null;
-        }
-        else
-        {
-            entityotherplayermp.inventory.mainInventory[entityotherplayermp.inventory.currentItem] = new ItemStack(i, 1, 0);
-        }
-        entityotherplayermp.absMoveTo(d, d1, d2, f, f1);
-        worldClient.addEntityToWorld(packet20namedentityspawn.entityId, entityotherplayermp);
-        entityotherplayermp.nickname = StringUtils.substring(packet20namedentityspawn.nickname, 0, 32);
-        entityotherplayermp.chatColor = packet20namedentityspawn.chatColor;
-    }
-
-    @Override
-    public void handleEntityTeleport(Packet34EntityTeleport packet34entityteleport)
-    {
-        Entity entity = getEntityByID(packet34entityteleport.entityId);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
-            entity.serverPosX = packet34entityteleport.xPosition;
-            entity.serverPosY = packet34entityteleport.yPosition;
-            entity.serverPosZ = packet34entityteleport.zPosition;
-            double d = (double) entity.serverPosX / 32D;
-            double d1 = (double) entity.serverPosY / 32D + 0.015625D;
-            double d2 = (double) entity.serverPosZ / 32D;
-            float f = (float) (packet34entityteleport.yaw * 360) / 256F;
-            float f1 = (float) (packet34entityteleport.pitch * 360) / 256F;
-            entity.lerpTo(d, d1, d2, f, f1, 3);
-            return;
-        }
-    }
-
-    @Override
-    public void handleEntity(Packet30Entity packet30entity)
-    {
-        Entity entity = getEntityByID(packet30entity.entityId);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
-            entity.serverPosX += packet30entity.xPosition;
-            entity.serverPosY += packet30entity.yPosition;
-            entity.serverPosZ += packet30entity.zPosition;
-            double d = (double) entity.serverPosX / 32D;
-            double d1 = (double) entity.serverPosY / 32D;
-            double d2 = (double) entity.serverPosZ / 32D;
-            float f = packet30entity.rotating ? (float) (packet30entity.yaw * 360) / 256F : entity.yRot;
-            float f1 = packet30entity.rotating ? (float) (packet30entity.pitch * 360) / 256F : entity.xRot;
-            entity.lerpTo(d, d1, d2, f, f1, 3);
-            return;
-        }
-    }
-
-    @Override
-    public void handleEntityTagData(Packet42EntityTagData packet) {
-        Entity entity = getEntityByID(packet.entityId);
-        if (entity != null) {
-            entity.readAdditionalSaveData(packet.tag);
-        }
-    }
-
-    @Override
-    public void handleSetMobSpawner(Packet132SetMobSpawner packet132SetMobSpawner)
-    {
-        if (mc.theWorld.isBlockLoaded(packet132SetMobSpawner.xPosition, packet132SetMobSpawner.yPosition, packet132SetMobSpawner.zPosition))
-        {
-            TileEntity tileentity = mc.theWorld.getBlockTileEntity(packet132SetMobSpawner.xPosition, packet132SetMobSpawner.yPosition, packet132SetMobSpawner.zPosition);
-            if (tileentity instanceof TileEntityMobSpawner)
-            {
-                TileEntityMobSpawner tileEntityMobSpawner = (TileEntityMobSpawner) tileentity;
-                tileEntityMobSpawner.setMobId(packet132SetMobSpawner.spawnType);
-
-                tileEntityMobSpawner.onInventoryChanged();
-            }
-        }
-    }
-
-    @Override
-    public void handleDestroyEntity(Packet29DestroyEntity packet29destroyentity)
-    {
-        worldClient.removeEntityFromWorld(packet29destroyentity.entityId);
-    }
-
-    @Override
-    public void handleFlying(Packet10Flying packet10flying)
-    {
-        EntityPlayerSP entityplayersp = mc.thePlayer;
-        double d = ((EntityPlayer) (entityplayersp)).x;
-        double d1 = ((EntityPlayer) (entityplayersp)).y;
-        double d2 = ((EntityPlayer) (entityplayersp)).z;
-        float f = ((EntityPlayer) (entityplayersp)).yRot;
-        float f1 = ((EntityPlayer) (entityplayersp)).xRot;
-        if (packet10flying.moving)
-        {
-            d = packet10flying.xPosition;
-            d1 = packet10flying.yPosition;
-            d2 = packet10flying.zPosition;
-        }
-        if (packet10flying.rotating)
-        {
-            f = packet10flying.yaw;
-            f1 = packet10flying.pitch;
-        }
-        entityplayersp.ySlideOffset = 0.0F;
-        entityplayersp.xd = entityplayersp.yd = entityplayersp.zd = 0.0D;
-        entityplayersp.absMoveTo(d, d1, d2, f, f1);
-        packet10flying.xPosition = ((EntityPlayer) (entityplayersp)).x;
-        packet10flying.yPosition = ((EntityPlayer) (entityplayersp)).bb.minY;
-        packet10flying.zPosition = ((EntityPlayer) (entityplayersp)).z;
-        packet10flying.stance = ((EntityPlayer) (entityplayersp)).y;
-        netManager.addToSendQueue(packet10flying);
-        if (!field_1210_g)
-        {
-            mc.thePlayer.xo = mc.thePlayer.x;
-            mc.thePlayer.yo = mc.thePlayer.y;
-            mc.thePlayer.zo = mc.thePlayer.z;
-            field_1210_g = true;
-            mc.displayGuiScreen(null);
-        }
-    }
-
-    @Override
-    public void handlePreChunk(Packet50PreChunk packet50prechunk)
-    {
-        worldClient.doPreChunk(packet50prechunk.xPosition, packet50prechunk.yPosition, packet50prechunk.mode);
-    }
-
-    @Override
-    public void handleMultiBlockChange(Packet52MultiBlockChange packet)
-    {
-        int xBase = packet.xChunk * 16;
-        int zBase = packet.zChunk * 16;
-        for (int k = 0; k < packet.size; k++)
-        {
-            int coord = packet.coordinateArray[k];
-            int type = packet.typeArray[k] & 0x3fff;
-            byte data = packet.metadataArray[k];
-            int x = coord >> 0 & 0xf;
-            int y = coord >> 8 & 0xff;
-            int z = coord >> 4 & 0xf;
-            worldClient.setBlockAndMetadataWithNotify(x + xBase, y, z + zBase, type, data);
-            worldClient.func_711_c(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
-            worldClient.markBlocksDirty(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
-        }
-
-    }
-
-    @Override
-    public void handleMapChunk(Packet51MapChunk packet)
-    {
-        worldClient.func_711_c(packet.xPosition, packet.yPosition, packet.zPosition, (packet.xPosition + packet.xSize) - 1, (packet.yPosition + packet.ySize) - 1, (packet.zPosition + packet.zSize) - 1);
-        worldClient.setChunkData(packet.xPosition, packet.yPosition, packet.zPosition, packet.xSize, packet.ySize, packet.zSize, packet.chunk);
-    }
-
-    @Override
-    public void handleBlockChange(Packet53BlockChange packet53blockchange)
-    {
-        worldClient.blockChange(packet53blockchange.xPosition, packet53blockchange.yPosition, packet53blockchange.zPosition, packet53blockchange.type, packet53blockchange.metadata);
-    }
-
-    @Override
-    public void handleKickDisconnect(Packet255KickDisconnect packet255kickdisconnect)
-    {
-        netManager.networkShutdown("disconnect.kicked", new Object[0]);
-        disconnected = true;
-        mc.changeWorld(null);
-        mc.displayGuiScreen(new GuiConnectFailed("disconnect.disconnected", "disconnect.genericReason", new Object[]{
-            packet255kickdisconnect.reason
-        }));
-    }
-
-    @Override
-    public void handleErrorMessage(String s, Object[] errorLines)
-    {
-        if (!disconnected) {
-            disconnected = true;
-            mc.changeWorld(null);
-            mc.displayGuiScreen(new GuiConnectFailed("disconnect.lost", s, errorLines));
-        }
-    }
-
-    public void func_28117_a(Packet packet)
-    {
-        if (disconnected)
-        {
-            return;
-        }
-        else
-        {
-            netManager.addToSendQueue(packet);
-            netManager.serverShutdown();
-            return;
-        }
-    }
-
-    public void addToSendQueue(Packet packet)
-    {
-        if (!disconnected) {
-            netManager.addToSendQueue(packet);
-        }
-    }
-
-    @Override
-    public void handleCollect(Packet22Collect packet22collect)
-    {
-        Entity entity = getEntityByID(packet22collect.collectedEntityId);
-        Object obj = (EntityLiving) getEntityByID(packet22collect.collectorEntityId);
-        if (obj == null)
-        {
-            obj = mc.thePlayer;
-        }
-        if (entity != null)
-        {
-            // this class does not seem to handle pick up from server dropped items. find where it is.
-            // something about that isn't working on servers if the player changed their gamemode.
-            worldClient.playSoundAtEntity(null, entity, "random.pop", 0.2F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
-            mc.effectRenderer.addEffect(new EntityPickupFX(mc.theWorld, entity, ((Entity) (obj)), -0.5F));
-            worldClient.removeEntityFromWorld(packet22collect.collectedEntityId);
-        }
-    }
-
-	@Override
-	public void handleChat(Packet3Chat packet) {
-		String message;
-		if(packet.encrypted) {
-			try {
-				message = AES.decrypt(packet.message, AES.clientKeyChain);
-			}catch (Exception e) {
-				throw new RuntimeException(Packet3Chat.ENCRYPTION_ERROR_MESSAGE, e);
-			}
-		}else {
-			message = packet.message;
-		}
-		
-		int type = packet.type;
-		if(type == 1) {
-			mc.ingameGUI.guiHeldItemTooltip.setString(message);
-		}else {
-			mc.ingameGUI.addChatMessage(message);
-		}
-	}
-
-    public void handlePlayerJoin(Packet3Chat packet3chat)
-    {
-        mc.ingameGUI.addChatMessage(packet3chat.message);
-    }
-
-    public void handlePlayerLeave(Packet3Chat packet3chat)
-    {
-        mc.ingameGUI.addChatMessage(packet3chat.message);
-    }
-
-    @Override
-    public void handleAnimation(Packet18Animation packet18animation)
-    {
-        Entity entity = getEntityByID(packet18animation.entityId);
-        if (entity == null)
-        {
-            return;
-        }
-        if (packet18animation.animate == 1)
-        {
-            EntityPlayer entityplayer = (EntityPlayer) entity;
-            entityplayer.swingItem();
-        }
-        else if (packet18animation.animate == 2)
-        {
-            entity.animateHurt();
-        }
-        else if (packet18animation.animate == 3)
-        {
-            EntityPlayer entityplayer1 = (EntityPlayer) entity;
-            entityplayer1.wakeUpPlayer(false, false);
-        }
-        else if (packet18animation.animate == 4)
-        {
-            EntityPlayer entityplayer2 = (EntityPlayer) entity;
-            entityplayer2.func_6420_o();
-        }
-    }
-
-    @Override
-    public void handleSleep(Packet17Sleep packet17sleep)
-    {
-        Entity entity = getEntityByID(packet17sleep.entityID);
-        if (entity == null)
-        {
-            return;
-        }
-        if (packet17sleep.field_22046_e == 0)
-        {
-            EntityPlayer entityplayer = (EntityPlayer) entity;
-            entityplayer.sleepInBedAt(packet17sleep.x, packet17sleep.y, packet17sleep.z);
-        }
-    }
-
-    @Override
-    public void handleHandshake(Packet2Handshake packet2handshake)
-    {
-        if (packet2handshake.username.equals("-"))
-        {
-            try
-            {
-                RSA.RSAKeyChain = RSA.generateKeyPair();
-                addToSendQueue(new Packet1Login(mc.session.username, Global.MP_PROTOCOL_VERSION, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-        else
-        {
-            try
-            {
-                URL url = new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + mc.session.username + "&sessionId=" + mc.session.sessionId + "&serverId=" + packet2handshake.username);
-                BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream()));
-                String s = bufferedreader.readLine();
-                bufferedreader.close();
-                if (s.equalsIgnoreCase("ok"))
-                {
-                    try
-                    {
-                        RSA.RSAKeyChain = RSA.generateKeyPair();
-                        addToSendQueue(new Packet1Login(mc.session.username, Global.MP_PROTOCOL_VERSION, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
-                    }
-                    catch (Exception e)
-                    {
-                        throw new RuntimeException(e);
-                    }
-                }
-                else
-                {
-                    netManager.networkShutdown("disconnect.loginFailedInfo", new Object[]{
-                            s
-                    });
-                }
-            }
-            catch (Exception exception)
-            {
-                exception.printStackTrace();
-                netManager.networkShutdown("disconnect.genericReason", new Object[]{
-                        "Internal client error: " + exception.toString()
-                });
-            }
-        }
-    }
-
-    @Override
-    public void handleSendKey(Packet136SendKey packet136SendKey)
-    {
-        try
-        {
-            AES.clientKeyChain = AES.getKey(RSA.decrypt(packet136SendKey.KEY, RSA.RSAKeyChain.getPrivate()));
-        }
-        catch (Exception e)
-        {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public void handlePlayerList(Packet138PlayerList packet138PlayerList)
-    {
-        playerList.clear();
-        String[] players = packet138PlayerList.players;
-        String[] scores = packet138PlayerList.scores;
-        for (int i = 0; i < players.length; i++)
-        {
-            playerList.put(players[i], scores[i]);
-        }
-    }
-
-    public void disconnect()
-    {
-        disconnected = true;
-        netManager.wakeThreads();
-        netManager.networkShutdown("disconnect.closed", new Object[0]);
-    }
-
-    @Override
-    public void handleMobSpawn(Packet24MobSpawn packet24mobspawn)
-    {
-        double d = (double) packet24mobspawn.xPosition / 32D;
-        double d1 = (double) packet24mobspawn.yPosition / 32D;
-        double d2 = (double) packet24mobspawn.zPosition / 32D;
-        float f = (float) (packet24mobspawn.yaw * 360) / 256F;
-        float f1 = (float) (packet24mobspawn.pitch * 360) / 256F;
-        EntityLiving entityliving = (EntityLiving) EntityDispatcher.createEntity(packet24mobspawn.type, mc.theWorld);
-        entityliving.serverPosX = packet24mobspawn.xPosition;
-        entityliving.serverPosY = packet24mobspawn.yPosition;
-        entityliving.serverPosZ = packet24mobspawn.zPosition;
-        entityliving.id = packet24mobspawn.entityId;
-        entityliving.absMoveTo(d, d1, d2, f, f1);
-        entityliving.isMultiplayerEntity = true;
-        worldClient.addEntityToWorld(packet24mobspawn.entityId, entityliving);
-        java.util.List list = packet24mobspawn.getMetadata();
-        if (list != null)
-        {
-            entityliving.getEntityData().assignValues(list);
-        }
-        entityliving.nickname = StringUtils.substring(packet24mobspawn.nickname, 0, 32);
-        entityliving.chatColor = packet24mobspawn.chatColor;
-    }
-
-    @Override
-    public void handleUpdateTime(Packet4UpdateTime packet4updatetime)
-    {
-        mc.theWorld.setWorldTime(packet4updatetime.time);
-    }
-
-    @Override
-    public void handleSpawnPosition(Packet6SpawnPosition packet6spawnposition)
-    {
-        mc.thePlayer.setPlayerSpawnCoordinate(new ChunkCoordinates(packet6spawnposition.xPosition, packet6spawnposition.yPosition, packet6spawnposition.zPosition));
-        mc.theWorld.getLevelData().setSpawn(packet6spawnposition.xPosition, packet6spawnposition.yPosition, packet6spawnposition.zPosition);
-    }
-
-    @Override
-    public void handleAttachEntity(Packet39AttachEntity packet)
-    {
-        Entity passenger = getEntityByID(packet.passengerId);
-        IVehicle vehicle;
-        if (packet.passengerId == mc.thePlayer.id)
-        {
-            passenger = mc.thePlayer;
-        }
-        if (packet.isTileEntity) {
-            vehicle = (IVehicle) worldClient.getBlockTileEntity(packet.x, packet.y, packet.z);
-        } else {
-            vehicle = getEntityByID(packet.vehicleId);
-        }
-        if (passenger != null && vehicle != null) {
-            passenger.startRiding(vehicle);
-        }
-    }
-
-    @Override
-    public void handleEntityStatus(Packet38EntityStatus packet38entitystatus)
-    {
-        Entity entity = getEntityByID(packet38entitystatus.entityId);
-        if (entity != null)
-        {
-            entity.handleEntityEvent(packet38entitystatus.entityStatus, packet38entitystatus.attackedAtYaw);
-        }
-    }
-
-    protected Entity getEntityByID(int i)
-    {
-        if (i == mc.thePlayer.id)
-        {
-            return mc.thePlayer;
-        }
-        else
-        {
-            return worldClient.getEntityFromId(i);
-        }
-    }
-
-    @Override
-    public void handleUpdateHealth(Packet8UpdateHealth packet8updatehealth)
-    {
-        mc.thePlayer.setHealth(packet8updatehealth.healthMP);
-    }
-
-    @Override
-    public void handleUpdatePlayerProfile(Packet72UpdatePlayerProfile packet72playerprofile)
-    {
-        PlayerProfile playerProfile = new PlayerProfile(packet72playerprofile.username, packet72playerprofile.nickname, packet72playerprofile.score, packet72playerprofile.chatColor, packet72playerprofile.isOperator);
-        if (playerProfile.playerName.equals(mc.thePlayer.username))
-        {
-            mc.thePlayer.score = playerProfile.scoreTotal;
-        }
-        int index = findPlayerInList(playerProfile);
-        if (index != -1)
-        {
-            if (!packet72playerprofile.isOnline)
-            {
-                removePlayer(index);
-            }
-            else
-            {
-                players.set(index, playerProfile);
-            }
-        }
-        else
-        {
-            addPlayer(playerProfile);
-        }
-    }
-
-    @Override
-    public void handleRespawn(Packet9Respawn packet9respawn)
-    {
-        if (packet9respawn.respawnDimensionId != mc.thePlayer.dimension)
-        {
-            field_1210_g = false;
-            worldClient = new WorldClient(mc, this, worldClient.getLevelData().getRandomSeed(), packet9respawn.respawnDimensionId, packet9respawn.respawnWorldTypeId);
-            worldClient.isClientSide = true;
-            mc.changeWorld(worldClient);
-            mc.thePlayer.dimension = packet9respawn.respawnDimensionId;
-            mc.displayGuiScreen(new GuiDownloadTerrain(this));
-        }
-        mc.respawn(true, packet9respawn.respawnDimensionId);
-    }
-
-    @Override
-    public void handleExplosion(Packet60Explosion packet60explosion)
-    {
-        Explosion explosion;
-        if (packet60explosion.isCannonball)
-        {
-            explosion = new ExplosionCannonball(mc.theWorld, null, packet60explosion.explosionX, packet60explosion.explosionY, packet60explosion.explosionZ, packet60explosion.explosionSize);
-        }
-        else
-        {
-            explosion = new Explosion(mc.theWorld, null, packet60explosion.explosionX, packet60explosion.explosionY, packet60explosion.explosionZ, packet60explosion.explosionSize);
-        }
-        explosion.destroyedBlockPositions = packet60explosion.destroyedBlockPositions;
-        //explosion.doExplosionA();
-        explosion.doExplosionB(true);
-    }
-
-    @Override
-    public void handleOpenWindow(Packet100OpenWindow packet100openwindow)
-    {
-        if (packet100openwindow.inventoryType == 0)
-        {
-            InventoryBasic inventorybasic = new InventoryBasic(packet100openwindow.windowTitle, packet100openwindow.slotsCount);
-            mc.thePlayer.displayGUIChest(inventorybasic);
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-        else if (packet100openwindow.inventoryType == 2)
-        {
-            TileEntityFurnace tileentityfurnace = new TileEntityFurnace();
-            mc.thePlayer.displayGUIFurnace(tileentityfurnace);
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-        else if (packet100openwindow.inventoryType == 3)
-        {
-            TileEntityDispenser tileentitydispenser = new TileEntityDispenser();
-            mc.thePlayer.displayGUIDispenser(tileentitydispenser);
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-        else if (packet100openwindow.inventoryType == 4)
-        {
-            TileEntityBlastFurnace tileentityblastfurnace = new TileEntityBlastFurnace();
-            mc.thePlayer.displayGUIFurnace(tileentityblastfurnace);
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-        else if (packet100openwindow.inventoryType == 5)
-        {
-            TileEntityTrommel tileentitytrommel = new TileEntityTrommel();
-            mc.thePlayer.displayGUITrommel(tileentitytrommel);
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-        else if (packet100openwindow.inventoryType == 7)
-        {
-            mc.thePlayer.displayGUIPaintingPicker();
-        }
-        else if (packet100openwindow.inventoryType == 1)
-        {
-            EntityPlayerSP entityplayersp = mc.thePlayer;
-            mc.thePlayer.displayGUIWorkbench(MathHelper.floor_double(entityplayersp.x), MathHelper.floor_double(entityplayersp.y), MathHelper.floor_double(entityplayersp.z));
-            mc.thePlayer.craftingInventory.windowId = packet100openwindow.windowId;
-        }
-    }
-
-    @Override
-    public void handleOpenFlagWindow(Packet142OpenFlagWindow packet)
-    {
-        TileEntity tileEntity = worldClient.getBlockTileEntity(packet.x, packet.y, packet.z);
-        if (tileEntity instanceof TileEntityFlag)
-        {
-            TileEntityFlag tileEntityFlag = (TileEntityFlag) tileEntity;
-            mc.thePlayer.displayGUIEditFlag(tileEntityFlag);
-            mc.thePlayer.craftingInventory.windowId = packet.windowId;
-        }
-    }
-
-    @Override
-    public void handlePhotoMode(Packet143PhotoMode packet)
-    {
-        GuiIngameMenu.photoModeDisabled = packet.disabled;
-    }
-
-    @Override
-    public void handleSetSlot(Packet103SetSlot packet103setslot)
-    {
-        if (packet103setslot.windowId == -1)
-        {
-            mc.thePlayer.inventory.setHeldItemStack(packet103setslot.myItemStack);
-        }
-        else if (packet103setslot.windowId == 0 && packet103setslot.itemSlot >= 36 && packet103setslot.itemSlot < 45)
-        {
-            ItemStack itemstack = mc.thePlayer.inventorySlots.getSlot(packet103setslot.itemSlot).getStack();
-            if (packet103setslot.myItemStack != null && (itemstack == null || itemstack.stackSize < packet103setslot.myItemStack.stackSize))
-            {
-                packet103setslot.myItemStack.animationsToGo = 5;
-            }
-            mc.thePlayer.inventorySlots.putStackInSlot(packet103setslot.itemSlot, packet103setslot.myItemStack);
-        }
-        else if (packet103setslot.windowId == mc.thePlayer.craftingInventory.windowId)
-        {
-            mc.thePlayer.craftingInventory.putStackInSlot(packet103setslot.itemSlot, packet103setslot.myItemStack);
-        }
-    }
-
-    @Override
-    public void handleTransaction(Packet106Transaction packet106transaction)
-    {
-        Container container = null;
-        if (packet106transaction.windowId == 0)
-        {
-            container = mc.thePlayer.inventorySlots;
-        }
-        else if (packet106transaction.windowId == mc.thePlayer.craftingInventory.windowId)
-        {
-            container = mc.thePlayer.craftingInventory;
-        }
-        if (container != null)
-        {
-            if (packet106transaction.field_20030_c)
-            {
-                container.func_20113_a(packet106transaction.shortWindowId);
-            }
-            else
-            {
-                container.func_20110_b(packet106transaction.shortWindowId);
-                addToSendQueue(new Packet106Transaction(packet106transaction.windowId, packet106transaction.shortWindowId, true));
-            }
-        }
-    }
-
-    @Override
-    public void handleWindowItems(Packet104WindowItems packet104windowitems)
-    {
-        if (packet104windowitems.windowId == 0)
-        {
-            mc.thePlayer.inventorySlots.putStacksInSlots(packet104windowitems.stackList);
-        }
-        else if (packet104windowitems.windowId == mc.thePlayer.craftingInventory.windowId)
-        {
-            mc.thePlayer.craftingInventory.putStacksInSlots(packet104windowitems.stackList);
-        }
-    }
-
-    @Override
-    public void handleUpdateProgressbar(Packet105UpdateProgressbar packet105updateprogressbar)
-    {
-        handleInvalidPacket(packet105updateprogressbar);
-        if (mc.thePlayer.craftingInventory != null && mc.thePlayer.craftingInventory.windowId == packet105updateprogressbar.windowId)
-        {
-            mc.thePlayer.craftingInventory.updateClientProgressBar(packet105updateprogressbar.progressBar, packet105updateprogressbar.progressBarValue);
-        }
-    }
-
-    @Override
-    public void handlePlayerInventory(Packet5PlayerInventory packet5playerinventory)
-    {
-        Entity entity = getEntityByID(packet5playerinventory.entityID);
-        if (entity != null)
-        {
-            entity.setEquippedSlot(packet5playerinventory.slot, packet5playerinventory.itemID, packet5playerinventory.itemDamage, packet5playerinventory.itemData);
-        }
-    }
-
-    @Override
-    public void handleCloseWindow(Packet101CloseWindow packet101closewindow)
-    {
-        mc.thePlayer.closeScreen();
-    }
-
-    @Override
-    public void handlePlayNoteBlock(Packet54PlayNoteBlock packet54playnoteblock)
-    {
-        mc.theWorld.triggerEvent(packet54playnoteblock.xLocation, packet54playnoteblock.yLocation, packet54playnoteblock.zLocation, packet54playnoteblock.instrumentType, packet54playnoteblock.pitch);
-    }
-
-    // TODO
-    // todo what?
-    @Override
-    public void handleBed(Packet70Bed packet70bed)
-    {
-        int i = packet70bed.field_25019_b;
-        if (i >= 0 && i < Packet70Bed.field_25020_a.length && Packet70Bed.field_25020_a[i] != null)
-        {
-            mc.thePlayer.sendTranslatedChatMessage(Packet70Bed.field_25020_a[i]);
-        }
-    }
-
-    @Override
-    public void handleMapData(Packet131MapData packet131mapdata)
-    {
-        if (packet131mapdata.itemId == Item.map.id)
-        {
-            ItemMap.getOrCreateSavedData(packet131mapdata.meta, mc.theWorld).setColors(packet131mapdata.mapData);
-        }
-        else
-        {
-            System.out.println((new StringBuilder()).append("Unknown itemid: ").append(packet131mapdata.meta).toString());
-        }
-    }
-
-    @Override
-    public void handlePlaySoundEffect(Packet61PlaySoundEffect packet61playsoundeffect)
-    {
-        mc.theWorld.playSoundEffect(packet61playsoundeffect.soundID, packet61playsoundeffect.x, packet61playsoundeffect.y, packet61playsoundeffect.z, packet61playsoundeffect.data);
-    }
-
-	@Override
-	public void handlePlaySoundDirectly(Packet62PlaySoundDirect packet) {
-		String soundPath = SoundTypes.getSoundById(packet.soundId);
-		if(soundPath == null) {
-			return;
-		}
-		mc.sndManager.playSound(soundPath, packet.soundType, (float) packet.x, (float) packet.y, (float) packet.z, packet.volume, packet.pitch);	
-	}
-    
-    @Override
-    public void handleSpawnParticle(Packet63SpawnParticleEffect packet63SpawnParticleEffect)
-    {
-        if (packet63SpawnParticleEffect.isGroup){
-            for (int i = 0; i < packet63SpawnParticleEffect.amount; i++) {
-                mc.renderGlobal.addParticle(packet63SpawnParticleEffect.particleKey,
-                        packet63SpawnParticleEffect.x + rand.nextDouble() * packet63SpawnParticleEffect.randOffX,
-                        packet63SpawnParticleEffect.y + rand.nextDouble() * packet63SpawnParticleEffect.randOffY,
-                        packet63SpawnParticleEffect.z + rand.nextDouble() * packet63SpawnParticleEffect.randOffZ,
-                        packet63SpawnParticleEffect.motionX + rand.nextGaussian() * packet63SpawnParticleEffect.randMotionX,
-                        packet63SpawnParticleEffect.motionY + rand.nextGaussian() * packet63SpawnParticleEffect.randMotionY,
-                        packet63SpawnParticleEffect.motionZ + rand.nextGaussian() * packet63SpawnParticleEffect.randMotionZ,
-                        packet63SpawnParticleEffect.data,
-                        packet63SpawnParticleEffect.maxDistance);
-            }
-        } else {
-            mc.renderGlobal.addParticle(packet63SpawnParticleEffect.particleKey,
-                    packet63SpawnParticleEffect.x,
-                    packet63SpawnParticleEffect.y,
-                    packet63SpawnParticleEffect.z,
-                    packet63SpawnParticleEffect.motionX,
-                    packet63SpawnParticleEffect.motionY,
-                    packet63SpawnParticleEffect.motionZ,
-                    packet63SpawnParticleEffect.data,
-                    packet63SpawnParticleEffect.maxDistance);
-        }
-
-    }
-
-    @Override
-    public void handleStatistic(Packet200Statistic packet200statistic)
-    {
-        ((EntityClientPlayerMP) mc.thePlayer).func_27027_b(StatList.getStat(packet200statistic.field_27052_a), packet200statistic.field_27051_b);
-    }
-
-    @Override
-    public void handleEntityPlayerGamemode(Packet41EntityPlayerGamemode packet)
-    {
-        Entity entity = getEntityByID(packet.entityId);
-        if (entity instanceof EntityPlayer){
-            ((EntityPlayer) entity).setGamemode(Gamemode.gamemodesList[packet.gamemodeId]);
-        }
-    }
-
-    @Override
-    public void handleEntityNickname(Packet35EntityNickname packet35EntityNickname)
-    {
-        Entity entity = getEntityByID(packet35EntityNickname.entityId);
-
-        if (entity instanceof EntityLiving)
-        {
-            ((EntityLiving) entity).nickname = StringUtils.substring(packet35EntityNickname.nickname, 0, 32);
-            ((EntityLiving) entity).chatColor = packet35EntityNickname.chatColor;
-        }
-    }
-
-    @Override
-    public boolean isServerHandler()
-    {
-        return false;
-    }
-    
-    @Override
-    public void handleBlockItemSwitch(Packet16BlockItemSwitch packet16blockitemswitch) {
-        mc.thePlayer.inventory.currentItem = packet16blockitemswitch.id;
-    }
-
-    @Override
-    public void handleTileEntityData(Packet140TileEntityData packet)
-    {
-        Class<?> clazz = TileEntity.getClassFromID(packet.tag.getString("id"));
-        if (clazz == null) return;
-        TileEntity existingTileEntity = worldClient.getBlockTileEntity(packet.tag.getInteger("x"), packet.tag.getInteger("y"), packet.tag.getInteger("z"));
-        if (existingTileEntity == null || existingTileEntity.getClass() != clazz)
-        {
-            TileEntity tileEntity = TileEntity.createAndLoadEntity(packet.tag);
-            if (tileEntity != null)
-            {
-                mc.theWorld.setBlockTileEntity(tileEntity.x, tileEntity.y, tileEntity.z, tileEntity);
-            }
-        }
-        else
-        {
-            existingTileEntity.readFromNBT(packet.tag);
-        }
-        worldClient.markBlockDirty(packet.tag.getInteger("x"), packet.tag.getInteger("y"), packet.tag.getInteger("z"));
-    }
-
-    @Override
-    public void handleGameRule(Packet74GameRule packet) {
-        LevelData levelData = mc.theWorld.getLevelData();
-        if (packet.getGameRules() != null) {
-            levelData.getGameRules().setValues(packet.getGameRules());
-        }
-    }
-
-    @Override
-    public void handleSyncedRecipe(Packet75RecipeSync packet75RecipeSync) {
-        if(Registries.RECIPES.getAllSerializableRecipes().isEmpty()){
-            System.out.println("Receiving "+packet75RecipeSync.maxRecipes+" recipes from server..");
-        }
-        DataLoader.loadRecipeFromServer(packet75RecipeSync);
-        if(Registries.RECIPES.getAllSerializableRecipes().size() == packet75RecipeSync.maxRecipes){
-            System.out.println("All recipes received!");
-            Registries.RECIPES.invalidateCaches();
-            SearchPage.searchField.setText("_");
-            PageManager.searchQuery = SearchQuery.resolve(SearchPage.searchField.getText());
-            GuiGuidebook.getPageManager().updatePages();
-            SearchPage.searchField.setText("");
-            PageManager.searchQuery = SearchQuery.resolve(SearchPage.searchField.getText());
-            GuiGuidebook.getPageManager().updatePages();
-        }
-    }
-    
-    @Override
-    public void handleIds(Packet201Ids packet) {
-    	SoundTypes.setSoundIds(packet.soundIds);
-    }
-    
-    @Override
-    public void handleCustomPayload(Packet250CustomPayload packet) {
-    	
-    }
-}
diff --git a/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java b/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
similarity index 88%
rename from src/main/java/net/minecraft/client/net/handler/NetPingHandler.java
rename to src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
index 810b0601d..218fccdc7 100644
--- a/src/main/java/net/minecraft/client/net/handler/NetPingHandler.java
+++ b/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
@@ -4,16 +4,16 @@ 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.handler.PacketHandler;
+import net.minecraft.core.net.packet.DisconnectPacket;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet255KickDisconnect;
 
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.Socket;
 
-public class NetPingHandler
-    extends NetHandler
+public class PingPacketHandler
+    extends PacketHandler
 {
     private boolean disconnected = false;
     private final GuiSelectServer gui;
@@ -21,7 +21,7 @@ public class NetPingHandler
     private final ServerData server;
     public static long startTime = 0;
 
-    public NetPingHandler(GuiSelectServer gui, ServerData server)
+    public PingPacketHandler(GuiSelectServer gui, ServerData server)
         throws IOException {
         this.gui = gui;
         this.server = server;
@@ -52,7 +52,7 @@ public class NetPingHandler
     }
 
     @Override
-    public void handleKickDisconnect(Packet255KickDisconnect packet) {
+    public void handleKickDisconnect(DisconnectPacket packet) {
         if (packet.reason.startsWith("§1"))
         {
             String[] serverInfo = packet.reason.split("\0");
diff --git a/src/main/java/net/minecraft/client/net/thread/ThreadCheckHasPaid.java b/src/main/java/net/minecraft/client/net/thread/ThreadCheckHasPaid.java
deleted file mode 100644
index 606b92a3e..000000000
--- a/src/main/java/net/minecraft/client/net/thread/ThreadCheckHasPaid.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.minecraft.client.net.thread;
-
-import java.net.HttpURLConnection;
-import java.net.URL;
-import net.minecraft.client.Minecraft;
-
-// Referenced classes of package net.minecraft.src:
-//            Session
-
-public class ThreadCheckHasPaid extends Thread
-{
-
-    public ThreadCheckHasPaid(Minecraft minecraft)
-    {
-//        super();
-        field_28146_a = minecraft;
-    }
-
-    @Override
-	public void run()
-    {
-        try
-        {
-            HttpURLConnection httpurlconnection = (HttpURLConnection)(new URL((new StringBuilder()).append("http://session.minecraft.net/game/joinserver.jsp?user=").append(field_28146_a.session.username).append("&session=").append(field_28146_a.session.sessionId).toString())).openConnection();
-            httpurlconnection.connect();
-            if(httpurlconnection.getResponseCode() == 400)
-            {
-                Minecraft.hasPaidCheckTime = System.currentTimeMillis();
-            }
-            httpurlconnection.disconnect();
-        }
-        catch(Exception exception)
-        {
-            exception.printStackTrace();
-        }
-    }
-
-    final Minecraft field_28146_a; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/client/net/thread/ThreadConnectToServer.java b/src/main/java/net/minecraft/client/net/thread/ThreadConnectToServer.java
deleted file mode 100644
index 7b6baf386..000000000
--- a/src/main/java/net/minecraft/client/net/thread/ThreadConnectToServer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package net.minecraft.client.net.thread;
-
-import java.net.ConnectException;
-import java.net.UnknownHostException;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiConnectFailed;
-import net.minecraft.client.gui.GuiConnecting;
-import net.minecraft.client.net.handler.NetClientHandler;
-import net.minecraft.core.net.packet.Packet2Handshake;
-
-// Referenced classes of package net.minecraft.src:
-//            NetClientHandler, GuiConnecting, Packet2Handshake, Session, 
-//            GuiConnectFailed
-
-public class ThreadConnectToServer extends Thread
-{
-
-    public ThreadConnectToServer(GuiConnecting guiconnecting, Minecraft minecraft, String s, int i)
-    {
-//        super();
-        connectingGui = guiconnecting;
-        mc = minecraft;
-        hostName = s;
-        port = i;
-    }
-
-    @Override
-	public void run()
-    {
-        try
-        {
-            GuiConnecting.setNetClientHandler(connectingGui, new NetClientHandler(mc, hostName, port));
-            if(GuiConnecting.isCancelled(connectingGui))
-            {
-                return;
-            }
-            GuiConnecting.getNetClientHandler(connectingGui).addToSendQueue(new Packet2Handshake(mc.session.username));
-        }
-        catch(UnknownHostException unknownhostexception)
-        {
-            if(GuiConnecting.isCancelled(connectingGui))
-            {
-                return;
-            }
-            mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
-                "Unknown host '" + hostName + "'"
-            }));
-        }
-        catch(ConnectException connectexception)
-        {
-            if(GuiConnecting.isCancelled(connectingGui))
-            {
-                return;
-            }
-            mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
-                connectexception.getMessage()
-            }));
-        }
-        catch(Exception exception)
-        {
-            if(GuiConnecting.isCancelled(connectingGui))
-            {
-                return;
-            }
-            exception.printStackTrace();
-            mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[] {
-                exception.toString()
-            }));
-        }
-    }
-
-    final Minecraft mc; /* synthetic field */
-    final String hostName; /* synthetic field */
-    final int port; /* synthetic field */
-    final GuiConnecting connectingGui; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/client/net/thread/ThreadDownloadImage.java b/src/main/java/net/minecraft/client/net/thread/ThreadDownloadImage.java
index 75b59e083..8a46b17cb 100644
--- a/src/main/java/net/minecraft/client/net/thread/ThreadDownloadImage.java
+++ b/src/main/java/net/minecraft/client/net/thread/ThreadDownloadImage.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.net.thread;
 
-import net.minecraft.client.render.DownloadedTexture;
+import net.minecraft.client.render.texture.DownloadedTexture;
 import net.minecraft.client.render.ImageParser;
 
 import java.awt.image.BufferedImage;
@@ -18,10 +18,10 @@ public class ThreadDownloadImage extends Thread {
 	public final ImageParser imageParser;
 	public final DownloadedTexture texture;
 
-	public ThreadDownloadImage(DownloadedTexture texture, String url, ImageParser imageBuffer) {
+	public ThreadDownloadImage(DownloadedTexture texture, String url, ImageParser imageParser) {
 		this.texture = texture;
 		this.url = url;
-		this.imageParser = imageBuffer;
+		this.imageParser = imageParser;
 		setName("DownloadImage " + counter++);
 	}
 
@@ -46,7 +46,7 @@ public class ThreadDownloadImage extends Thread {
 				texture.image = imageParser.parseImage(image);
 			else
 				texture.image = image;
-			
+
 			inputStream.close();
 		} catch (Exception exception) {
 			exception.printStackTrace();
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 4e7b5fe75..ec1702841 100644
--- a/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
+++ b/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.net.thread;
 
 import net.minecraft.client.gui.GuiSelectServer;
-import net.minecraft.client.net.handler.NetPingHandler;
+import net.minecraft.client.net.handler.PingPacketHandler;
 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;
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.net.packet.PingHandshakePacket;
 
 public class ThreadPingServer
     extends Thread {
@@ -14,7 +14,7 @@ public class ThreadPingServer
     private final GuiSelectServer gui;
     private final ServerData server;
     private boolean done = false;
-    private NetPingHandler netHandler = null;
+    private PingPacketHandler netHandler = null;
 
     public ThreadPingServer(GuiSelectServer gui, ServerData server) {
         this.gui = gui;
@@ -35,7 +35,7 @@ public class ThreadPingServer
         if (netHandler != null && isDone()) netHandler.processReadPackets();
     }
 
-    public NetHandler getNetHandler() {
+    public PacketHandler getNetHandler() {
         return netHandler;
     }
 
@@ -46,8 +46,8 @@ public class ThreadPingServer
         int port = address.getPort();
 
         try {
-            netHandler = new NetPingHandler(gui, server);
-            netHandler.addToSendQueue(new Packet254PingHandshake(0x01, 0xFA, "BTAPingHost", Global.MP_PROTOCOL_VERSION, hostName, port));
+            netHandler = new PingPacketHandler(gui, server);
+            netHandler.addToSendQueue(new PingHandshakePacket(0x01, 0xFA, "BTAPingHost", Global.MP_PROTOCOL_VERSION, hostName, port));
         } catch (Exception ignored) {
         } finally {
             done = true;
diff --git a/src/main/java/net/minecraft/client/net/thread/ThreadSleepForeverClient.java b/src/main/java/net/minecraft/client/net/thread/ThreadSleepForeverClient.java
deleted file mode 100644
index f00ac7514..000000000
--- a/src/main/java/net/minecraft/client/net/thread/ThreadSleepForeverClient.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.minecraft.client.net.thread;
-
-import net.minecraft.client.Minecraft;
-
-public class ThreadSleepForeverClient extends Thread
-{
-
-    public ThreadSleepForeverClient(Minecraft minecraft, String s)
-    {
-        super(s);
-        mc = minecraft;
-        setDaemon(true);
-        start();
-    }
-
-    @Override
-	public void run()
-    {
-        while(mc.running) 
-        {
-            try
-            {
-                Thread.sleep(0x7fffffffL);
-            }
-            catch(InterruptedException interruptedexception) { }
-        }
-    }
-
-    final Minecraft mc; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index 98459f623..49be04e35 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -12,8 +12,6 @@ import java.util.List;
 
 import org.lwjgl.opengl.Display;
 
-import com.b100.utils.ReflectUtils;
-
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.discord.RichPresenceHandlerThread;
 import net.minecraft.client.gui.hud.HudComponents;
@@ -83,6 +81,7 @@ public class GameSettings {
 	public BooleanOption disableShaders = new BooleanOption(this, "disableShaders", false);
 	public StringOption shaderOverride = new StringOption(this, "shaderOverride", "");
 	public BooleanOption autoHit = new BooleanOption(this, "autoHit", true);
+	public BooleanOption easyBridge = new BooleanOption(this, "easyBridge", true);
 	public BooleanOption foodHealthRegenOverlay = new BooleanOption(this, "foodHealthRegenOverlay", true);
 	public BooleanOption fpsInOverlay = new BooleanOption(this, "fpsInOverlay", false);
 	public BooleanOption versionInOverlay = new BooleanOption(this, "versionInOverlay", false);
@@ -236,14 +235,14 @@ public class GameSettings {
 	public KeyBinding keyShowShortcuts = new KeyBinding("key.debug.shortcuts").setDefault(InputDevice.keyboard, KEY_Q);
 	public KeyBinding keyToggleTextureAtlas = new KeyBinding("key.debug.textureAtlas");
 
-	public KeyBinding[] keys = ReflectUtils.getAllObjects(GameSettings.class, KeyBinding.class, this);
-
-	public Option<?>[] getAllOptions(){
-		return ReflectUtils.getAllObjects(GameSettings.class, Option.class, this);
+	public static final List<KeyBinding> keys = new ArrayList<>();
+	public static final List<Option<?>> options = new ArrayList<>();
+	public List<Option<?>> getAllOptions(){
+		return options;
 	}
 	
 	public KeyBinding getKey(int i) {
-		return keys[i];
+		return keys.get(i);
 	}
 
 	public String getKeyBindName(int id) {
@@ -420,13 +419,13 @@ public class GameSettings {
 		if(option == advancedOpenGL) mc.renderGlobal.loadRenderers();
 		if(option == biomeWater) {
 			mc.renderGlobal.loadRenderers();
-			mc.renderEngine.updateDynamicTextures();
+			mc.renderEngine.updateDynamicTextures(false);
 		}
 		if(option == treeShadows) mc.renderGlobal.loadRenderers();
 		if(option == placementMode && mc.thePlayer != null) mc.thePlayer.syncPlacementMode();
 		if(option == animations || option == customAnimations) {
 			mc.renderEngine.refreshTexturesAndDisplayErrors();
-			mc.renderEngine.updateDynamicTextures();
+			mc.renderEngine.updateDynamicTextures(false);
 		}
 		if(option == fullscreen || option == borderlessFullscreen) mc.gameWindow.updateWindowState();
 		if(option == guiScale) {
diff --git a/src/main/java/net/minecraft/client/option/KeyBinding.java b/src/main/java/net/minecraft/client/option/KeyBinding.java
index 1f91132fb..68184cee3 100644
--- a/src/main/java/net/minecraft/client/option/KeyBinding.java
+++ b/src/main/java/net/minecraft/client/option/KeyBinding.java
@@ -7,7 +7,6 @@ import net.minecraft.client.input.InputDevice;
 import net.minecraft.core.lang.I18n;
 
 public class KeyBinding {
-	
 	private static Map<Character, InputDevice> charToInputDeviceMap = new HashMap<>();
 	private static Map<InputDevice, Character> inputDeviceToCharMap = new HashMap<>();
 	
@@ -39,6 +38,7 @@ public class KeyBinding {
 		this.id = id;
 		this.inputDevice = null;
 		this.keyCode = -1;
+		GameSettings.keys.add(this);
 	}
 
 	public KeyBinding setDefault(InputDevice device, int keyCode) {
diff --git a/src/main/java/net/minecraft/client/option/Option.java b/src/main/java/net/minecraft/client/option/Option.java
index d05b7b1da..6b197e4b7 100644
--- a/src/main/java/net/minecraft/client/option/Option.java
+++ b/src/main/java/net/minecraft/client/option/Option.java
@@ -14,6 +14,7 @@ public abstract class Option<E> {
 		this.name = name;
 		this.value = defaultValue;
 		this.defaultValue = defaultValue;
+		GameSettings.options.add(this);
 	}
 
 	public void set(E value) {
diff --git a/src/main/java/net/minecraft/client/option/VolumeOption.java b/src/main/java/net/minecraft/client/option/VolumeOption.java
index c2e807161..4f0974e19 100644
--- a/src/main/java/net/minecraft/client/option/VolumeOption.java
+++ b/src/main/java/net/minecraft/client/option/VolumeOption.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.option;
 
 import net.minecraft.client.sound.SoundCategoryHelper;
-import net.minecraft.client.sound.SoundManager;
+import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.core.sound.SoundCategory;
 import paulscode.sound.SoundSystem;
 
@@ -16,10 +16,10 @@ public class VolumeOption extends FloatOption{
 	@Override
 	public void onUpdate() {
 		super.onUpdate();
-		gameSettings.mc.sndManager.onSoundOptionsChanged();
-		SoundSystem soundSystem = SoundManager.getSoundSystem();
+		gameSettings.mc.sndManager.updateOptions();
+		SoundSystem soundSystem = SoundEngine.getSoundSystem();
 		if (soundCategory != SoundCategory.GUI_SOUNDS && !soundSystem.playing("sound_audio_options")) {
-			gameSettings.mc.sndManager.playSound(soundCategory.changedSound, soundCategory, 1f, 1f, "sound_audio_options");
+			gameSettings.mc.sndManager.playSoundId(soundCategory.changedSound, soundCategory, 1f, 1f, "sound_audio_options");
 		} else if (soundCategory != SoundCategory.GUI_SOUNDS) {
 			soundSystem.setVolume("sound_audio_options", SoundCategoryHelper.getEffectiveVolume(soundCategory, gameSettings));
 		}
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 9c4ff7cbe..80d9856b1 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -1,11 +1,11 @@
 package net.minecraft.client.player.controller;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.core.InventoryAction;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
@@ -143,7 +143,7 @@ public abstract class PlayerController {
 		return false;
 	}
 
-	public boolean destroyBlock(int x, int y, int z, Side side, EntityPlayer player) {
+	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
 		if (!player.getGamemode().canInteract()) return false;
 		setMineBlock(null, null, null);
 		World world = mc.theWorld;
@@ -217,7 +217,7 @@ public abstract class PlayerController {
 		return mc.thePlayer.getGamemode().getEntityReachDistance();
 	}
 
-	public boolean useItem(EntityPlayer player, World world, ItemStack stack) {
+	public boolean useItem(Player player, World world, ItemStack stack) {
 		if (!player.getGamemode().canInteract()) return false;
 		int prevStackSize = stack.stackSize;
 		ItemStack newItemStack = stack.useItemRightClick(world, player);
@@ -231,7 +231,7 @@ public abstract class PlayerController {
 		return false;
 	}
 
-	public void initPlayer(EntityPlayer player) {
+	public void initPlayer(Player player) {
 		player.yRot = -180F;
 	}
 
@@ -240,53 +240,53 @@ public abstract class PlayerController {
 		
 		syncCurrentPlayItem();
 		previousDamage = currentDamage;
-		mc.sndManager.playRandomMusicIfReady();
+		mc.sndManager.tick();
 	}
 
 	public boolean canHurtPlayer() {
 		return true;
 	}
 
-	public void adjustPlayer(EntityPlayer player) {
+	public void adjustPlayer(Player player) {
 	}
 
-	public boolean useItemOn(EntityPlayer entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+	public boolean useItemOn(Player player, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
 	{
-		if (!entityplayer.getGamemode().canInteract()) return false;
+		if (!player.getGamemode().canInteract()) return false;
 		int i1 = world.getBlockId(blockX, blockY, blockZ);
-		if (!entityplayer.isSneaking() || entityplayer.inventory.getCurrentItem() == null) {
-			if (i1 > 0 && Block.blocksList[i1].onBlockRightClicked(world, blockX, blockY, blockZ, entityplayer, side, xPlaced, yPlaced)) {
+		if (!player.isSneaking() || player.inventory.getCurrentItem() == null) {
+			if (i1 > 0 && Block.blocksList[i1].onBlockRightClicked(world, blockX, blockY, blockZ, player, side, xPlaced, yPlaced)) {
 				return true;
 			}
 		}
 		if (itemstack == null) {
 			return false;
 		} else {
-			return itemstack.useItem(entityplayer, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+			return itemstack.useItem(player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
 		}
 	}
 
-	public EntityPlayer createPlayer(World world) {
-		return new EntityPlayerSP(mc, world, mc.session, world.dimension.id);
+	public Player createPlayer(World world) {
+		return new LocalPlayer(mc, world, mc.session, world.dimension.id);
 	}
 
-	public boolean interact(EntityPlayer entityplayer, Entity entity) {
-		if (!entityplayer.getGamemode().canInteract()) return false;
-		return entityplayer.useCurrentItemOnEntity(entity);
+	public boolean interact(Player player, Entity entity) {
+		if (!player.getGamemode().canInteract()) return false;
+		return player.useCurrentItemOnEntity(entity);
 	}
 
-	public void attack(EntityPlayer entityplayer, Entity entity) {
-		if (!entityplayer.getGamemode().canInteract()) return;
-		entityplayer.attackTargetEntityWithCurrentItem(entity);
+	public void attack(Player player, Entity entity) {
+		if (!player.getGamemode().canInteract()) return;
+		player.attackTargetEntityWithCurrentItem(entity);
 	}
 
-	public ItemStack handleInventoryMouseClick(int windowId, InventoryAction action, int[] args, EntityPlayer entityplayer) {
-		return entityplayer.craftingInventory.clickInventorySlot(action, args, entityplayer);
+	public ItemStack handleInventoryMouseClick(int windowId, InventoryAction action, int[] args, Player player) {
+		return player.craftingInventory.clicked(action, args, player);
 	}
 
-	public void handleCloseInventory(int i, EntityPlayer entityplayer) {
-		entityplayer.craftingInventory.onCraftGuiClosed(entityplayer);
-		entityplayer.craftingInventory = entityplayer.inventorySlots;
+	public void handleCloseInventory(int i, Player player) {
+		player.craftingInventory.onCraftGuiClosed(player);
+		player.craftingInventory = player.inventorySlots;
 	}
 	
 	public void playDigSound(Block block, int x, int y, int z) {
@@ -304,7 +304,7 @@ public abstract class PlayerController {
 	
 	public void sendDestroyBlockPacket(int x, int y, int z, Side side, double xHit, double yHit) {}
 
-	public void initLevel(World world) {}
+	public void initWorld(World world) {}
 
 	public void setPaintingType(ArtType art)
 	{
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
index 760aeae39..8e9290846 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.player.controller;
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
+import net.minecraft.client.net.handler.ClientPacketHandler;
 import net.minecraft.core.InventoryAction;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.client.net.handler.NetClientHandler;
 import net.minecraft.core.net.packet.*;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
@@ -15,17 +15,17 @@ import net.minecraft.core.world.World;
 
 public class PlayerControllerMP extends PlayerController {
 
-	protected NetClientHandler netHandler;
+	protected ClientPacketHandler netHandler;
 	protected int currentItem;
 
-	public PlayerControllerMP(Minecraft minecraft, NetClientHandler netHandler) {
+	public PlayerControllerMP(Minecraft minecraft, ClientPacketHandler netHandler) {
 		super(minecraft);
 		
 		this.netHandler = netHandler;
 	}
 
 	@Override
-	public boolean destroyBlock(int x, int y, int z, Side side, EntityPlayer player) {
+	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
 		int id = mc.theWorld.getBlockId(x, y, z);
 		boolean removed = super.destroyBlock(x, y, z, side, player);
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
@@ -41,17 +41,17 @@ public class PlayerControllerMP extends PlayerController {
 	@Override
 	protected void hitBlock(int x, int y, int z, Side side, double xHit, double yHit) {
 		super.hitBlock(x, y, z, side, xHit, yHit);
-		netHandler.addToSendQueue(new Packet14BlockDig(1, x, y, z, side, xHit, yHit));
+		netHandler.addToSendQueue(new PlayerActionPacket(1, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
 	public void sendStartDigPacket(int x, int y, int z, Side side, double xHit, double yHit) {
-		netHandler.addToSendQueue(new Packet14BlockDig(0, x, y, z, side, xHit, yHit));
+		netHandler.addToSendQueue(new PlayerActionPacket(0, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
 	public void sendDestroyBlockPacket(int x, int y, int z, Side side, double xHit, double yHit) {
-		netHandler.addToSendQueue(new Packet14BlockDig(2, x, y, z, side, xHit, yHit));
+		netHandler.addToSendQueue(new PlayerActionPacket(2, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
@@ -59,55 +59,55 @@ public class PlayerControllerMP extends PlayerController {
 		int i = mc.thePlayer.inventory.currentItem;
 		if (i != currentItem) {
 			currentItem = i;
-			netHandler.addToSendQueue(new Packet16BlockItemSwitch(currentItem));
+			netHandler.addToSendQueue(new SetCarriedItemPacket(currentItem));
 		}
 	}
 
 	@Override
-	public boolean useItemOn(EntityPlayer entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean useItemOn(Player entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new Packet15Place(blockX, blockY, blockZ, side.getDirection(), entityplayer.inventory.getCurrentItem(), xPlaced, yPlaced));
+		netHandler.addToSendQueue(new UseItemPacket(blockX, blockY, blockZ, side.getDirection(), entityplayer.inventory.getCurrentItem(), xPlaced, yPlaced));
 		boolean flag = super.useItemOn(entityplayer, world, itemstack, blockX, blockY, blockZ, side, xPlaced, yPlaced);
 		return flag;
 	}
 
 	@Override
-	public boolean useItem(EntityPlayer entityplayer, World world, ItemStack itemstack) {
+	public boolean useItem(Player entityplayer, World world, ItemStack itemstack) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new Packet15Place(-1, -1, -1, Direction.NONE, entityplayer.inventory.getCurrentItem(), 0, 0));
+		netHandler.addToSendQueue(new UseItemPacket(-1, -1, -1, Direction.NONE, entityplayer.inventory.getCurrentItem(), 0, 0));
 		boolean flag = super.useItem(entityplayer, world, itemstack);
 		return flag;
 	}
 
 	@Override
-	public EntityPlayer createPlayer(World world) {
-		return new EntityClientPlayerMP(mc, world, mc.session, netHandler);
+	public Player createPlayer(World world) {
+		return new MultiplayerLocalPlayer(mc, world, mc.session, netHandler);
 	}
 
 	@Override
-	public void attack(EntityPlayer entityplayer, Entity entity) {
+	public void attack(Player entityplayer, Entity entity) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new Packet7UseEntity(entityplayer.id, entity.id, 1));
+		netHandler.addToSendQueue(new InteractPacket(entityplayer.id, entity.id, InteractPacket.ACTION_ATTACK));
 		entityplayer.attackTargetEntityWithCurrentItem(entity);
 	}
 
 	@Override
-	public boolean interact(EntityPlayer entityplayer, Entity entity) {
+	public boolean interact(Player entityplayer, Entity entity) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new Packet7UseEntity(entityplayer.id, entity.id, 0));
+		netHandler.addToSendQueue(new InteractPacket(entityplayer.id, entity.id, InteractPacket.ACTION_INTERACT));
 		return entityplayer.useCurrentItemOnEntity(entity);
 	}
 
 	@Override
-	public ItemStack handleInventoryMouseClick(int windowId, InventoryAction action, int[] args, EntityPlayer entityplayer) {
-		short actionId = entityplayer.craftingInventory.getActionId(entityplayer.inventory);
+	public ItemStack handleInventoryMouseClick(int windowId, InventoryAction action, int[] args, Player entityplayer) {
+		short actionId = entityplayer.craftingInventory.backup(entityplayer.inventory);
 		ItemStack itemstack = super.handleInventoryMouseClick(windowId, action, args, entityplayer);
-		netHandler.addToSendQueue(new Packet102WindowClick(windowId, action, args, itemstack, actionId));
+		netHandler.addToSendQueue(new ContainerClickPacket(windowId, action, args, itemstack, actionId));
 		return itemstack;
 	}
 
 	@Override
-	public void handleCloseInventory(int i, EntityPlayer entityplayer) {
+	public void handleCloseInventory(int i, Player entityplayer) {
 		if (i == -9999) {
         } else {
         }
@@ -116,6 +116,6 @@ public class PlayerControllerMP extends PlayerController {
 	@Override
 	public void setPaintingType(ArtType art)
 	{
-		netHandler.addToSendQueue(new Packet139SetPaintingMotive(art));
+		netHandler.addToSendQueue(new SetPaintingArtPacket(art));
 	}
 }
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
index e417cc58f..05e609360 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
@@ -2,8 +2,8 @@ package net.minecraft.client.player.controller;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 
@@ -14,11 +14,11 @@ public class PlayerControllerSP extends PlayerController {
 	}
 
 	@Override
-	public boolean destroyBlock(int x, int y, int z, Side side, EntityPlayer player) {
+	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
 		if (!player.getGamemode().canInteract()) return false;
 		int id = mc.theWorld.getBlockId(x, y, z);
 		int meta = mc.theWorld.getBlockMetadata(x, y, z);
-		TileEntity tileEntity = mc.theWorld.getBlockTileEntity(x, y, z);
+		BlockEntity blockEntity = mc.theWorld.getBlockEntity(x, y, z);
 		boolean removed = super.destroyBlock(x, y, z, side, player);
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
 
@@ -26,7 +26,7 @@ public class PlayerControllerSP extends PlayerController {
 			item.onDestroyBlock(mc.theWorld, id, x, y, z, side, mc.thePlayer);
 		}
 		if (removed && mc.thePlayer.getGamemode().dropBlockOnBreak()) {
-			Block.blocksList[id].harvestBlock(mc.theWorld, mc.thePlayer, x, y, z, meta, tileEntity);
+			Block.blocksList[id].harvestBlock(mc.theWorld, mc.thePlayer, x, y, z, meta, blockEntity);
 		}
 
 		if (item != null && item.stackSize <= 0)
diff --git a/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java b/src/main/java/net/minecraft/client/render/BlockEntityRenderDispatcher.java
similarity index 62%
rename from src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
rename to src/main/java/net/minecraft/client/render/BlockEntityRenderDispatcher.java
index 1a53d964b..a9785542e 100644
--- a/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/BlockEntityRenderDispatcher.java
@@ -4,46 +4,46 @@ import java.util.*;
 
 import net.minecraft.client.render.camera.ICamera;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.client.render.tileentity.*;
+import net.minecraft.client.render.blockentity.*;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.entity.*;
-import net.minecraft.core.block.piston.TileEntityPistonMoving;
+import net.minecraft.core.block.piston.MovingPistonBlockEntity;
 import net.minecraft.core.world.World;
 import org.lwjgl.opengl.GL11;
 
-public class TileEntityRenderDispatcher
+public class BlockEntityRenderDispatcher
 {
 
-    private TileEntityRenderDispatcher()
+    private BlockEntityRenderDispatcher()
     {
         renderers = new HashMap<>();
-        renderers.put(TileEntitySign.class, new TileEntityRendererSign());
-        renderers.put(TileEntityFlag.class, new TileEntityRendererFlag());
-        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())
+        renderers.put(SignBlockEntity.class, new SignBlockEntityRenderer());
+        renderers.put(FlagBlockEntity.class, new FlagBlockEntityRenderer());
+        renderers.put(MobSpawnerBlockEntity.class, new MobSpawnerBlockEntityRenderer());
+        renderers.put(MovingPistonBlockEntity.class, new PistonBlockEntityRenderer());
+        renderers.put(FlowerJarBlockEntity.class, new FlowerJarBlockEntityRenderer());
+        renderers.put(GoldMeshBlockEntity.class, new MeshBlockEntityRenderer());
+
+        for (BlockEntityRenderer<?> blockEntityRenderer : renderers.values())
         {
-            tileEntityRenderer.setRenderDispatcher(this);
+            blockEntityRenderer.setRenderDispatcher(this);
         }
 
     }
 
     @SuppressWarnings("unchecked") // trust me this is safe, Notch did it first
-    public <T extends TileEntity> TileEntityRenderer<T> getRenderer(Class<? extends TileEntity> e)
+    public <T extends BlockEntity> BlockEntityRenderer<T> getRenderer(Class<? extends BlockEntity> e)
     {
-        TileEntityRenderer<? extends TileEntity> r = renderers.get(e);
-        if(r == null && e != TileEntity.class)
+        BlockEntityRenderer<? extends BlockEntity> r = renderers.get(e);
+        if(r == null && e != BlockEntity.class)
         {
-            r = getRenderer((Class<? extends TileEntity>) e.getSuperclass());
+            r = getRenderer((Class<? extends BlockEntity>) e.getSuperclass());
             renderers.put(e, r);
         }
-        return (TileEntityRenderer<T>) r;
+        return (BlockEntityRenderer<T>) r;
     }
 
-    public <T extends TileEntity> TileEntityRenderer<T> getRenderer(T tileEntity)
+    public <T extends BlockEntity> BlockEntityRenderer<T> getRenderer(T tileEntity)
     {
         if(tileEntity == null)
         {
@@ -55,7 +55,7 @@ public class TileEntityRenderDispatcher
         }
     }
 
-    public <T extends TileEntity> boolean hasRenderer(T tileEntity)
+    public <T extends BlockEntity> boolean hasRenderer(T tileEntity)
     {
         return getRenderer(tileEntity) != null;
     }
@@ -76,7 +76,7 @@ public class TileEntityRenderDispatcher
         viewLerpPosZ = (float) camera.getZ(partialTick);
     }
 
-    public <T extends TileEntity> void renderTileEntity(Tessellator tessellator, T tileEntity, float partialTick)
+    public <T extends BlockEntity> void renderTileEntity(Tessellator tessellator, T tileEntity, float partialTick)
     {
         if(tileEntity.getDistanceFrom(viewLerpPosX, viewLerpPosY, viewLerpPosZ) < 4096D)
         {
@@ -97,9 +97,9 @@ public class TileEntityRenderDispatcher
         }
     }
 
-    public <T extends TileEntity> void renderTileEntity(Tessellator tessellator, T tileEntity, double x, double y, double z, float partialTick)
+    public <T extends BlockEntity> void renderTileEntity(Tessellator tessellator, T tileEntity, double x, double y, double z, float partialTick)
     {
-        TileEntityRenderer<T> renderer = getRenderer(tileEntity);
+        BlockEntityRenderer<T> renderer = getRenderer(tileEntity);
         if(renderer != null)
         {
             renderer.doRender(tessellator, tileEntity, x, y, z, partialTick);
@@ -109,7 +109,7 @@ public class TileEntityRenderDispatcher
     public void updateRendererWorldCache(World world)
     {
         worldObj = world;
-        for (TileEntityRenderer<?> renderer : renderers.values())
+        for (BlockEntityRenderer<?> renderer : renderers.values())
         {
             if (renderer != null)
             {
@@ -123,8 +123,8 @@ public class TileEntityRenderDispatcher
         return fontRenderer;
     }
 
-    private final Map<Class<?>, TileEntityRenderer<?>> renderers;
-    public static TileEntityRenderDispatcher instance = new TileEntityRenderDispatcher();
+    private final Map<Class<?>, BlockEntityRenderer<?>> renderers;
+    public static BlockEntityRenderDispatcher instance = new BlockEntityRenderDispatcher();
     private FontRenderer fontRenderer;
     public static double renderPosX;
     public static double renderPosY;
diff --git a/src/main/java/net/minecraft/client/render/CameraSorter.java b/src/main/java/net/minecraft/client/render/CameraSorter.java
index 2d3a60845..1a4c4a725 100644
--- a/src/main/java/net/minecraft/client/render/CameraSorter.java
+++ b/src/main/java/net/minecraft/client/render/CameraSorter.java
@@ -1,6 +1,5 @@
 package net.minecraft.client.render;
 
-import net.minecraft.client.render.ChunkRenderer;
 import net.minecraft.client.render.camera.ICamera;
 
 import java.util.Comparator;
@@ -21,12 +20,12 @@ public class CameraSorter
 
     public int sortByDistanceToEntity(ChunkRenderer a, ChunkRenderer b)
     {
-        double dx1 = (double)a.posXPlus + posX;
-        double dy1 = (double)a.posYPlus + posY;
-        double dz1 = (double)a.posZPlus + posZ;
-        double dx2 = (double)b.posXPlus + posX;
-        double dy2 = (double)b.posYPlus + posY;
-        double dz2 = (double)b.posZPlus + posZ;
+        double dx1 = (double)a.xm + posX;
+        double dy1 = (double)a.ym + posY;
+        double dz1 = (double)a.zm + posZ;
+        double dx2 = (double)b.xm + posX;
+        double dy2 = (double)b.ym + posY;
+        double dz2 = (double)b.zm + posZ;
         return (int)(((dx1 * dx1 + dy1 * dy1 + dz1 * dz1) - (dx2 * dx2 + dy2 * dy2 + dz2 * dz2)) * 1024D);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/ChunkRenderer.java b/src/main/java/net/minecraft/client/render/ChunkRenderer.java
index 10fc0cc9a..80f657931 100644
--- a/src/main/java/net/minecraft/client/render/ChunkRenderer.java
+++ b/src/main/java/net/minecraft/client/render/ChunkRenderer.java
@@ -7,7 +7,7 @@ import net.minecraft.client.render.culling.CameraFrustum;
 import net.minecraft.client.render.entity.ItemEntityRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
@@ -25,71 +25,104 @@ public class ChunkRenderer
 {
     public static final int MAX_RENDER_PASSES = 2;
 
-    public ChunkRenderer(RenderEngine renderEngine, World world, List<TileEntity> list, int posX, int posY, int posZ, int size, int renderList)
+    public World world;
+    private final int lists;
+    private static final Tessellator tessellator;
+    public static int updates = 0;
+    public int x;
+    public int y;
+    public int z;
+    public int xs;
+    public int ys;
+    public int zs;
+    public int xRender;
+    public int yRender;
+    public int zRender;
+    public int xRenderOffs;
+    public int yRenderOffs;
+    public int zRenderOffs;
+    public boolean visible;
+    public boolean[] empty;
+    public int xm;
+    public int ym;
+    public int zm;
+    public float radius;
+    public boolean dirty;
+    public AABB bb;
+    public int id;
+    public boolean occlusionVisible;
+    public boolean occlusionQuerying;
+    public int occlusionId;
+    public boolean skyLit;
+    private boolean compiled;
+    public List<BlockEntity> renderableBlockEntities;
+    private final List<BlockEntity> globalRenderableBlockEntities;
+
+    public ChunkRenderer(World world, List<BlockEntity> globalRenderableTileEntities, int x, int y, int z, int size, int lists)
     {
-        isInFrustum = false;
-        skipRenderPass = new boolean[MAX_RENDER_PASSES];
-        isVisible = true;
-        isInitialized = false;
-        specialTileEntities = new ArrayList<>();
-        worldObj = world;
-        tileEntities = list;
-        sizeWidth = sizeHeight = sizeDepth = size;
-        rendererRadius = MathHelper.sqrt_float(sizeWidth * sizeWidth + sizeHeight * sizeHeight + sizeDepth * sizeDepth) / 2.0F;
-        glRenderList = renderList;
-        this.posX = -999;
-        setPosition(posX, posY, posZ);
-        needsUpdate = false;
+        visible = false;
+        empty = new boolean[MAX_RENDER_PASSES];
+        occlusionVisible = true;
+        compiled = false;
+        renderableBlockEntities = new ArrayList<>();
+        this.world = world;
+        globalRenderableBlockEntities = globalRenderableTileEntities;
+        xs = ys = zs = size;
+        radius = MathHelper.sqrt_float(xs * xs + ys * ys + zs * zs) / 2.0F;
+        this.lists = lists;
+        this.x = -999;
+        setPos(x, y, z);
+        dirty = false;
     }
 
-    public void setPosition(int x, int y, int z)
+    public void setPos(int x, int y, int z)
     {
-        if (x != posX || y != posY || z != posZ)
+        if (x != this.x || y != this.y || z != this.z)
         {
-            setDontDraw();
-            posX = x;
-            posY = y;
-            posZ = z;
-            posXPlus = x + sizeWidth / 2;
-            posYPlus = y + sizeHeight / 2;
-            posZPlus = z + sizeDepth / 2;
-            posXClip = x & 0x3ff;
-            posYClip = y;
-            posZClip = z & 0x3ff;
-            posXMinus = x - posXClip;
-            posYMinus = y - posYClip;
-            posZMinus = z - posZClip;
+            reset();
+            this.x = x;
+            this.y = y;
+            this.z = z;
+            xm = x + xs / 2;
+            ym = y + ys / 2;
+            zm = z + zs / 2;
+            xRenderOffs = x & 0x3ff;
+            yRenderOffs = y;
+            zRenderOffs = z & 0x3ff;
+            xRender = x - xRenderOffs;
+            yRender = y - yRenderOffs;
+            zRender = z - zRenderOffs;
             float f = 6F;
-            rendererBoundingBox = AABB.getBoundingBox((float)x - f, (float)y - f, (float)z - f, (float)(x + sizeWidth) + f, (float)(y + sizeHeight) + f, (float)(z + sizeDepth) + f);
-            GL11.glNewList(glRenderList + MAX_RENDER_PASSES, GL11.GL_COMPILE);
-            ItemEntityRenderer.renderAABB(AABB.getBoundingBoxFromPool((float)posXClip - f, (float)posYClip - f, (float)posZClip - f, (float)(posXClip + sizeWidth) + f, (float)(posYClip + sizeHeight) + f, (float)(posZClip + sizeDepth) + f));
+            bb = AABB.getPermanentBB((float)x - f, (float)y - f, (float)z - f, (float)(x + xs) + f, (float)(y + ys) + f, (float)(z + zs) + f);
+            GL11.glNewList(lists + MAX_RENDER_PASSES, GL11.GL_COMPILE);
+            ItemEntityRenderer.renderFlatAABB(AABB.getTemporaryBB((float) xRenderOffs - f, (float) yRenderOffs - f, (float) zRenderOffs - f, (float)(xRenderOffs + xs) + f, (float)(yRenderOffs + ys) + f, (float)(zRenderOffs + zs) + f));
             GL11.glEndList();
-            markDirty();
+            setDirty();
         }
     }
 
-    private void setupGLTranslation()
+    private void translateToPos()
     {
-        GL11.glTranslatef(posXClip, posYClip, posZClip);
+        GL11.glTranslatef(xRenderOffs, yRenderOffs, zRenderOffs);
     }
 
-    public void updateRenderer()
+    public void rebuild()
     {
-        if(!needsUpdate) { return; }
-        chunksUpdated++;
-        final int minX = posX;
-        final int minY = posY;
-        final int minZ = posZ;
-        final int maxX = posX + sizeWidth;
-        final int maxY = posY + sizeHeight;
-        final int maxZ = posZ + sizeDepth;
-        for(int i = 0; i < MAX_RENDER_PASSES; i++) { skipRenderPass[i] = true; }
+        if(!dirty) { return; }
+        updates++;
+        final int minX = x;
+        final int minY = y;
+        final int minZ = z;
+        final int maxX = x + xs;
+        final int maxY = y + ys;
+        final int maxZ = z + zs;
+        for(int i = 0; i < MAX_RENDER_PASSES; i++) { empty[i] = true; }
 
         Chunk.isLit = false;
-        final Set<TileEntity> lastSpecialTileEntities = new HashSet<>(specialTileEntities);
-        specialTileEntities.clear();
+        final Set<BlockEntity> lastSpecialTileEntities = new HashSet<>(renderableBlockEntities);
+        renderableBlockEntities.clear();
         final int cacheRadius = 1;
-        final ChunkCache chunkcache = new ChunkCache(worldObj, minX - cacheRadius, minY - cacheRadius, minZ - cacheRadius, maxX + cacheRadius, maxY + cacheRadius, maxZ + cacheRadius);
+        final ChunkCache chunkcache = new ChunkCache(world, minX - cacheRadius, minY - cacheRadius, minZ - cacheRadius, maxX + cacheRadius, maxY + cacheRadius, maxZ + cacheRadius);
         final RenderBlocks renderblocks = new RenderBlocks(chunkcache);
         BlockModel.setRenderBlocks(renderblocks);
         int renderPass = 0;
@@ -113,15 +146,15 @@ public class ChunkRenderer
                         }
                         if(!hasStartedDrawing) {
                             hasStartedDrawing = true;
-                            GL11.glNewList(glRenderList + renderPass, GL11.GL_COMPILE);
+                            GL11.glNewList(lists + renderPass, GL11.GL_COMPILE);
                             GL11.glPushMatrix();
-                            setupGLTranslation();
+                            translateToPos();
                             final float scale = 1.000001F;
-                            GL11.glTranslatef((float)(-sizeDepth) / 2.0F, (float)(-sizeHeight) / 2.0F, (float)(-sizeDepth) / 2.0F);
+                            GL11.glTranslatef((float)(-zs) / 2.0F, (float)(-ys) / 2.0F, (float)(-zs) / 2.0F);
                             GL11.glScalef(scale, scale, scale);
-                            GL11.glTranslatef((float)sizeDepth / 2.0F, (float)sizeHeight / 2.0F, (float)sizeDepth / 2.0F);
+                            GL11.glTranslatef((float) zs / 2.0F, (float) ys / 2.0F, (float) zs / 2.0F);
                             tessellator.startDrawingQuads();
-                            tessellator.setTranslation(-posX, -posY, -posZ);
+                            tessellator.setTranslation(-this.x, -this.y, -this.z);
                             
                             if(LightmapHelper.isLightmapEnabled()) {
                             	// Make sure it's active
@@ -129,20 +162,20 @@ public class ChunkRenderer
                             }
                         }
                         if(renderPass == 0 && Block.isEntityTile[blockId]) {
-                            final TileEntity tileentity = chunkcache.getBlockTileEntity(x, y, z);
-                            if(TileEntityRenderDispatcher.instance.hasRenderer(tileentity)) {
-                                specialTileEntities.add(tileentity);
+                            final BlockEntity tileentity = chunkcache.getBlockEntity(x, y, z);
+                            if(BlockEntityRenderDispatcher.instance.hasRenderer(tileentity)) {
+                                renderableBlockEntities.add(tileentity);
                             }
                         }
                         final Block block = Block.blocksList[blockId];
-                        final int blockRenderPass = block.getRenderBlockPass();
+                        final int blockRenderPass = block.getRenderLayer();
                         if(blockRenderPass != renderPass) {
                             needsMoreRenderPasses = true;
                         }
                         else {
                         	if(LightmapHelper.isLightmapEnabled()) {
                         		// Can probably be removed once all block models support the lightmap
-                        		tessellator.setLightmapCoord(LightmapHelper.getLightmapCoord(15, 0));	
+                        		tessellator.setLightmapCoord(LightmapHelper.getLightmapCoord(15, 0));
                         	}
                             
                             final BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(block);
@@ -166,7 +199,7 @@ public class ChunkRenderer
             }
             
             if(hasRenderedBlock) {
-                skipRenderPass[renderPass] = false;
+                empty[renderPass] = false;
             }            
             if(!needsMoreRenderPasses) {
                 break;
@@ -174,57 +207,57 @@ public class ChunkRenderer
             
             renderPass++;
         } while(true);
-        HashSet<TileEntity> newSpecialTileEntities = new HashSet<>(specialTileEntities);
+        HashSet<BlockEntity> newSpecialTileEntities = new HashSet<>(renderableBlockEntities);
         newSpecialTileEntities.removeAll(lastSpecialTileEntities);
-        tileEntities.addAll(newSpecialTileEntities);
-        specialTileEntities.forEach(lastSpecialTileEntities::remove);
-        tileEntities.removeAll(lastSpecialTileEntities);
-        isChunkLit = Chunk.isLit;
-        isInitialized = true;
+        globalRenderableBlockEntities.addAll(newSpecialTileEntities);
+        renderableBlockEntities.forEach(lastSpecialTileEntities::remove);
+        globalRenderableBlockEntities.removeAll(lastSpecialTileEntities);
+        skyLit = Chunk.isLit;
+        compiled = true;
     }
 
     public float distanceToEntitySquared(Entity entity)
     {
-        float dx = (float)(entity.x - (double)posXPlus);
-        float dy = (float)(entity.y - (double)posYPlus);
-        float dz = (float)(entity.z - (double)posZPlus);
+        float dx = (float)(entity.x - (double) xm);
+        float dy = (float)(entity.y - (double) ym);
+        float dz = (float)(entity.z - (double) zm);
         return dx * dx + dy * dy + dz * dz;
     }
 
     public float distanceToCameraSquared(ICamera camera)
     {
-        float dx = (float)(camera.getX(1f) - posXPlus);
-        float dy = (float)(camera.getY(1f) - posYPlus);
-        float dz = (float)(camera.getZ(1f) - posZPlus);
+        float dx = (float)(camera.getX(1f) - xm);
+        float dy = (float)(camera.getY(1f) - ym);
+        float dz = (float)(camera.getZ(1f) - zm);
         return dx * dx + dy * dy + dz * dz;
     }
 
-    public void setDontDraw()
+    public void reset()
     {
         for(int i = 0; i < MAX_RENDER_PASSES; i++)
         {
-            skipRenderPass[i] = true;
+            empty[i] = true;
         }
 
-        isInFrustum = false;
-        isInitialized = false;
+        visible = false;
+        compiled = false;
     }
 
-    public void reset()
+    public void delete()
     {
-        setDontDraw();
-        worldObj = null;
+        reset();
+        world = null;
     }
 
-    public int getGLCallListForPass(int i)
+    public int getList(int layer)
     {
-        if(!isInFrustum)
+        if(!visible)
         {
             return -1;
         }
-        if(!skipRenderPass[i])
+        if(!empty[layer])
         {
-            return glRenderList + i;
+            return lists + layer;
         } 
         else
         {
@@ -232,65 +265,32 @@ public class ChunkRenderer
         }
     }
 
-    public void updateInFrustum(CameraFrustum frustum, float partialTick)
+    public void cull(CameraFrustum frustum, float partialTick)
     {
-        isInFrustum = frustum.isVisible(rendererBoundingBox, partialTick);
+        visible = frustum.isVisible(bb, partialTick);
     }
 
-    public void callOcclusionQueryList()
+    public void renderBB()
     {
-        GL11.glCallList(glRenderList + MAX_RENDER_PASSES);
+        GL11.glCallList(lists + MAX_RENDER_PASSES);
     }
 
-    public boolean skipAllRenderPasses()
+    public boolean isEmpty()
     {
-        if(!isInitialized)
+        if(!compiled)
         {
             return false;
         } else
         {
-            return skipRenderPass[0] && skipRenderPass[1];
+            return empty[0] && empty[1];
         }
     }
 
-    public void markDirty()
+    public void setDirty()
     {
-        needsUpdate = true;
+        dirty = true;
     }
 
-    public World worldObj;
-    private final int glRenderList;
-    private static final Tessellator tessellator;
-    public static int chunksUpdated = 0;
-    public int posX;
-    public int posY;
-    public int posZ;
-    public int sizeWidth;
-    public int sizeHeight;
-    public int sizeDepth;
-    public int posXMinus;
-    public int posYMinus;
-    public int posZMinus;
-    public int posXClip;
-    public int posYClip;
-    public int posZClip;
-    public boolean isInFrustum;
-    public boolean[] skipRenderPass;
-    public int posXPlus;
-    public int posYPlus;
-    public int posZPlus;
-    public float rendererRadius;
-    public boolean needsUpdate;
-    public AABB rendererBoundingBox;
-    public int chunkIndex;
-    public boolean isVisible;
-    public boolean isWaitingOnOcclusionQuery;
-    public int glOcclusionQuery;
-    public boolean isChunkLit;
-    private boolean isInitialized;
-    public List<TileEntity> specialTileEntities;
-    private final List<TileEntity> tileEntities;
-
     static 
     {
         tessellator = Tessellator.instance;
diff --git a/src/main/java/net/minecraft/client/render/ChunkRendererComparator.java b/src/main/java/net/minecraft/client/render/ChunkRendererComparator.java
index eb38caa4b..86185a0e9 100644
--- a/src/main/java/net/minecraft/client/render/ChunkRendererComparator.java
+++ b/src/main/java/net/minecraft/client/render/ChunkRendererComparator.java
@@ -5,7 +5,7 @@ import net.minecraft.client.render.camera.ICamera;
 import java.util.Comparator;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldRenderer, EntityLiving
+//            WorldRenderer, Mob
 
 public class ChunkRendererComparator
     implements Comparator<ChunkRenderer>
@@ -19,8 +19,8 @@ public class ChunkRendererComparator
     @Override
     public int compare(ChunkRenderer cr1, ChunkRenderer cr2)
     {
-        boolean cr1InFrustum = cr1.isInFrustum;
-        boolean cr2InFrustum = cr2.isInFrustum;
+        boolean cr1InFrustum = cr1.visible;
+        boolean cr2InFrustum = cr2.visible;
         if (cr1.equals(cr2))
         {
             return 0;
@@ -45,7 +45,7 @@ public class ChunkRendererComparator
         }
         else
         {
-            return cr1.chunkIndex >= cr2.chunkIndex ? -1 : 1;
+            return cr1.id >= cr2.id ? -1 : 1;
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/DownloadedTexture.java b/src/main/java/net/minecraft/client/render/DownloadedTexture.java
deleted file mode 100644
index cd08c9d7e..000000000
--- a/src/main/java/net/minecraft/client/render/DownloadedTexture.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.minecraft.client.render;
-
-import net.minecraft.client.net.thread.ThreadDownloadImage;
-
-import java.awt.image.BufferedImage;
-
-public class DownloadedTexture {
-
-	public BufferedImage image;
-	public int referenceCount;
-	public int textureId;
-
-	public DownloadedTexture(String url, ImageParser imagebuffer) {
-		referenceCount = 1;
-		textureId = -1;
-		
-		new ThreadDownloadImage(this, url, imagebuffer).start();
-	}
-}
diff --git a/src/main/java/net/minecraft/client/render/EffectRenderer.java b/src/main/java/net/minecraft/client/render/EffectRenderer.java
index 527d5d8b7..d1b2c1e2c 100644
--- a/src/main/java/net/minecraft/client/render/EffectRenderer.java
+++ b/src/main/java/net/minecraft/client/render/EffectRenderer.java
@@ -3,14 +3,15 @@ package net.minecraft.client.render;
 import java.util.*;
 
 import net.minecraft.client.render.camera.ICamera;
-import net.minecraft.client.entity.fx.EntityDiggingFX;
-import net.minecraft.client.entity.fx.EntityFX;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.entity.particle.TerrainParticle;
+import net.minecraft.client.entity.particle.Particle;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
@@ -36,9 +37,9 @@ public class EffectRenderer
 
     }
 
-    public void addEffect(EntityFX entityfx)
+    public void addEffect(Particle entityfx)
     {
-        int i = entityfx.getFXLayer();
+        int i = entityfx.getParticleTexture();
         if(fxLayers[i].size() >= 4000)
         {
             fxLayers[i].remove(0);
@@ -52,7 +53,7 @@ public class EffectRenderer
         {
             for(int j = 0; j < fxLayers[i].size(); j++)
             {
-                EntityFX entityfx = (EntityFX)fxLayers[i].get(j);
+                Particle entityfx = (Particle)fxLayers[i].get(j);
                 entityfx.tick();
                 if(entityfx.removed)
                 {
@@ -73,9 +74,9 @@ public class EffectRenderer
         float rotationYZ = -rotationZ * MathHelper.sin((float) ((pitch * Math.PI) / 180F));
         float rotationXY = rotationX * MathHelper.sin((float) ((pitch * Math.PI) / 180F));
         float rotationXZ = MathHelper.cos((float) ((pitch * Math.PI) / 180F));
-        EntityFX.lerpPosX = camera.getX(partialTick);
-        EntityFX.lerpPosY = camera.getY(partialTick);
-        EntityFX.lerpPosZ = camera.getZ(partialTick);
+        Particle.xOff = camera.getX(partialTick);
+        Particle.yOff = camera.getY(partialTick);
+        Particle.zOff = camera.getZ(partialTick);
 
         for(int i = 0; i < 3; i++)
         {
@@ -86,23 +87,23 @@ public class EffectRenderer
             int texture = 0;
             if(i == 0)
             {
-                texture = TextureRegistry.particleAtlas.getTextureId();
+                texture = TextureRegistry.particleAtlas.id();
             }
             if(i == 1)
             {
-                texture = TextureRegistry.blockAtlas.getTextureId();
+                texture = TextureRegistry.blockAtlas.id();
             }
             if(i == 2)
             {
-                texture = TextureRegistry.itemAtlas.getTextureId();
+                texture = TextureRegistry.itemAtlas.id();
             }
             GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
             Tessellator tessellator = Tessellator.instance;
             tessellator.startDrawingQuads();
             for(int k = 0; k < fxLayers[i].size(); k++)
             {
-                EntityFX entityfx = (EntityFX)fxLayers[i].get(k);
-                entityfx.renderParticle(tessellator, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
+                Particle entityfx = (Particle)fxLayers[i].get(k);
+                entityfx.render(tessellator, partialTick, rotationX, rotationXZ, rotationZ, rotationYZ, rotationXY);
             }
 
             tessellator.draw();
@@ -119,8 +120,8 @@ public class EffectRenderer
         Tessellator tessellator = Tessellator.instance;
         for(int i = 0; i < fxLayers[layerId].size(); i++)
         {
-            EntityFX entityfx = (EntityFX)fxLayers[layerId].get(i);
-            entityfx.renderParticle(tessellator, partialTick, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
+            Particle entityfx = (Particle)fxLayers[layerId].get(i);
+            entityfx.render(tessellator, partialTick, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
         }
 
     }
@@ -140,7 +141,7 @@ public class EffectRenderer
         Block block = Block.blocksList[blockId];
         if (block == null) return;
         int amount = 4;
-        if(block == Block.fire)
+        if(block == Blocks.FIRE)
             return;
         for(int _x = 0; _x < amount; _x++)
         {
@@ -152,7 +153,7 @@ public class EffectRenderer
                     double pY = (double)y + ((double)_y + 0.5D) / (double)amount;
                     double pZ = (double)z + ((double)_z + 0.5D) / (double)amount;
                     int side = rand.nextInt(6);
-                    addEffect((new EntityDiggingFX(worldObj, pX, pY, pZ, pX - (double)x - 0.5D, pY - (double)y - 0.5D, pZ - (double)z - 0.5D, block, side, i1)).setParticleColor(x, y, z));
+                    addEffect((new TerrainParticle(worldObj, pX, pY, pZ, pX - (double)x - 0.5D, pY - (double)y - 0.5D, pZ - (double)z - 0.5D, block, side, i1)).init(x, y, z));
                 }
 
             }
@@ -198,7 +199,7 @@ public class EffectRenderer
         {
             d = (double)i + block.maxX + (double)f;
         }
-        addEffect((new EntityDiggingFX(worldObj, d, d1, d2, 0.0D, 0.0D, 0.0D, block, l, worldObj.getBlockMetadata(i, j, k))).setParticleColor(i, j, k).func_407_b(0.2F).func_405_d(0.6F));
+        addEffect((new TerrainParticle(worldObj, d, d1, d2, 0.0D, 0.0D, 0.0D, block, l, worldObj.getBlockMetadata(i, j, k))).init(i, j, k).setPower(0.2F).setScale(0.6F));
     }
 
     public String getNumParticlesString()
diff --git a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
index 3be1a3e85..5867617a9 100644
--- a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
@@ -3,92 +3,90 @@ package net.minecraft.client.render;
 import java.util.HashMap;
 import java.util.Map;
 
+import net.minecraft.client.render.model.BipedModel;
+import net.minecraft.client.render.model.ChickenModel;
+import net.minecraft.client.render.model.CowModel;
+import net.minecraft.client.render.model.SheepModel;
+import net.minecraft.client.render.model.SkeletonModel;
+import net.minecraft.client.render.model.SquidModel;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.animal.SquidMob;
+import net.minecraft.core.entity.monster.CreeperMob;
+import net.minecraft.core.entity.monster.SkeletonMob;
+import net.minecraft.core.entity.monster.SlimeMob;
+import net.minecraft.core.entity.monster.ZombieArmoredMob;
+import net.minecraft.core.entity.projectile.CannonballProjectile;
+import net.minecraft.core.entity.projectile.EggProjectile;
+import net.minecraft.core.entity.projectile.SnowballProjectile;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.item.Items;
 import org.lwjgl.opengl.GL11;
-
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.camera.ICamera;
 import net.minecraft.client.render.entity.ArmoredZombieRenderer;
 import net.minecraft.client.render.entity.ArrowRenderer;
 import net.minecraft.client.render.entity.BoatRenderer;
-import net.minecraft.client.render.entity.BobberRenderer;
+import net.minecraft.client.render.entity.FishingBobberRenderer;
 import net.minecraft.client.render.entity.CannonballRenderer;
 import net.minecraft.client.render.entity.ChickenRenderer;
 import net.minecraft.client.render.entity.CowRenderer;
 import net.minecraft.client.render.entity.CreeperRenderer;
 import net.minecraft.client.render.entity.DefaultRenderer;
 import net.minecraft.client.render.entity.EntityRenderer;
-import net.minecraft.client.render.entity.FallingSandRenderer;
-import net.minecraft.client.render.entity.FireballRenderer;
+import net.minecraft.client.render.entity.FallingBlockRenderer;
 import net.minecraft.client.render.entity.FireflyRenderer;
 import net.minecraft.client.render.entity.GhastRenderer;
 import net.minecraft.client.render.entity.GiantRenderer;
 import net.minecraft.client.render.entity.ItemEntityRenderer;
 import net.minecraft.client.render.entity.LightningBoltRenderer;
-import net.minecraft.client.render.entity.LivingRenderer;
-import net.minecraft.client.render.entity.MinecartRenderer;
 import net.minecraft.client.render.entity.MobRenderer;
-import net.minecraft.client.render.entity.MonsterRenderer;
+import net.minecraft.client.render.entity.MinecartRenderer;
+import net.minecraft.client.render.entity.BipedRenderer;
+import net.minecraft.client.render.entity.HumanRenderer;
 import net.minecraft.client.render.entity.PaintingRenderer;
 import net.minecraft.client.render.entity.PigRenderer;
 import net.minecraft.client.render.entity.PlayerRenderer;
 import net.minecraft.client.render.entity.ScorpionRenderer;
 import net.minecraft.client.render.entity.SheepRenderer;
 import net.minecraft.client.render.entity.SlimeRenderer;
-import net.minecraft.client.render.entity.SnowballRenderer;
+import net.minecraft.client.render.entity.SpriteRenderer;
 import net.minecraft.client.render.entity.SpiderRenderer;
 import net.minecraft.client.render.entity.SquidRenderer;
 import net.minecraft.client.render.entity.TNTRenderer;
 import net.minecraft.client.render.entity.WolfRenderer;
-import net.minecraft.client.render.model.ModelBiped;
-import net.minecraft.client.render.model.ModelChicken;
-import net.minecraft.client.render.model.ModelCow;
-import net.minecraft.client.render.model.ModelPig;
-import net.minecraft.client.render.model.ModelSheep;
-import net.minecraft.client.render.model.ModelSheepOverlay;
-import net.minecraft.client.render.model.ModelSheepWool;
-import net.minecraft.client.render.model.ModelSkeleton;
-import net.minecraft.client.render.model.ModelSlime;
-import net.minecraft.client.render.model.ModelSquid;
-import net.minecraft.client.render.model.ModelWolf;
-import net.minecraft.client.render.model.ModelZombie;
+import net.minecraft.client.render.model.PigModel;
+import net.minecraft.client.render.model.SheepOverlayModel;
+import net.minecraft.client.render.model.SheepWoolModel;
+import net.minecraft.client.render.model.SlimeModel;
+import net.minecraft.client.render.model.WolfModel;
+import net.minecraft.client.render.model.ZombieModel;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityBobber;
-import net.minecraft.core.entity.EntityFallingSand;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLightningBolt;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.EntityPainting;
-import net.minecraft.core.entity.EntityTNT;
-import net.minecraft.core.entity.animal.EntityChicken;
-import net.minecraft.core.entity.animal.EntityCow;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.animal.EntityPig;
-import net.minecraft.core.entity.animal.EntitySheep;
-import net.minecraft.core.entity.animal.EntitySquid;
-import net.minecraft.core.entity.animal.EntityWolf;
-import net.minecraft.core.entity.monster.EntityArmoredZombie;
-import net.minecraft.core.entity.monster.EntityCreeper;
-import net.minecraft.core.entity.monster.EntityGhast;
-import net.minecraft.core.entity.monster.EntityGiant;
-import net.minecraft.core.entity.monster.EntityHuman;
-import net.minecraft.core.entity.monster.EntityScorpion;
-import net.minecraft.core.entity.monster.EntitySkeleton;
-import net.minecraft.core.entity.monster.EntitySlime;
-import net.minecraft.core.entity.monster.EntitySnowman;
-import net.minecraft.core.entity.monster.EntitySpider;
-import net.minecraft.core.entity.monster.EntityZombie;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityCannonball;
-import net.minecraft.core.entity.projectile.EntityEgg;
-import net.minecraft.core.entity.projectile.EntityFireball;
-import net.minecraft.core.entity.projectile.EntityPebble;
-import net.minecraft.core.entity.projectile.EntitySnowball;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.FishingBobberEntity;
+import net.minecraft.core.entity.FallingBlockEntity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.PaintingEntity;
+import net.minecraft.core.entity.TNTPrimedEntity;
+import net.minecraft.core.entity.animal.ChickenMob;
+import net.minecraft.core.entity.animal.CowMob;
+import net.minecraft.core.entity.animal.PigMob;
+import net.minecraft.core.entity.animal.SheepMob;
+import net.minecraft.core.entity.animal.WolfMob;
+import net.minecraft.core.entity.monster.GhastMob;
+import net.minecraft.core.entity.monster.GiantMob;
+import net.minecraft.core.entity.monster.HumanMob;
+import net.minecraft.core.entity.monster.ScorpionMob;
+import net.minecraft.core.entity.monster.SnowmanMob;
+import net.minecraft.core.entity.monster.SpiderMob;
+import net.minecraft.core.entity.monster.ZombieMob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.entity.projectile.FireballProjectile;
+import net.minecraft.core.entity.projectile.PebbleProjectile;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.world.World;
 
 public class EntityRenderDispatcher
@@ -96,45 +94,46 @@ public class EntityRenderDispatcher
     private EntityRenderDispatcher()
     {
         renderers = new HashMap<>();
-        renderers.put(EntitySpider.class, new SpiderRenderer());
-        renderers.put(EntityScorpion.class, new ScorpionRenderer());
-        renderers.put(EntityPig.class, new PigRenderer(new ModelPig(), new ModelPig(0.5F), 0.7F));
-        renderers.put(EntitySheep.class, new SheepRenderer(new ModelSheep(), new ModelSheepWool(), new ModelSheepOverlay(), 0.7F));
-        renderers.put(EntityCow.class, new CowRenderer(new ModelCow(), 0.7F));
-        renderers.put(EntityWolf.class, new WolfRenderer(new ModelWolf(0.0f), 0.5F));
-        renderers.put(EntityChicken.class, new ChickenRenderer(new ModelChicken(), 0.3F));
-        renderers.put(EntityCreeper.class, new CreeperRenderer());
-        renderers.put(EntitySkeleton.class, new MobRenderer<>(new ModelSkeleton(), 0.5F));
-        renderers.put(EntityZombie.class, new MobRenderer<>(new ModelZombie(), 0.5F));
-        renderers.put(EntitySnowman.class, new MobRenderer<>(new ModelZombie(), 0.5F));
-        renderers.put(EntityArmoredZombie.class, new ArmoredZombieRenderer(new ModelZombie(), 0.5F));
-        renderers.put(EntitySlime.class, new SlimeRenderer(new ModelSlime(16), new ModelSlime(0), 0.25F));
-        renderers.put(EntityPlayer.class, new PlayerRenderer());
-        renderers.put(EntityHuman.class, new MonsterRenderer());
-        renderers.put(EntityGiant.class, new GiantRenderer(new ModelZombie(), 0.5F, 6F));
-        renderers.put(EntityGhast.class, new GhastRenderer());
-        renderers.put(EntitySquid.class, new SquidRenderer(new ModelSquid(), 0.7F));
-        renderers.put(EntityLiving.class, new LivingRenderer<>(new ModelBiped(), 0.5F));
+        renderers.put(SpiderMob.class, new SpiderRenderer());
+        renderers.put(ScorpionMob.class, new ScorpionRenderer());
+        renderers.put(PigMob.class, new PigRenderer(new PigModel(), new PigModel(0.5F), 0.7F));
+        renderers.put(SheepMob.class, new SheepRenderer(new SheepModel(), new SheepWoolModel(), new SheepOverlayModel(), 0.7F));
+        renderers.put(CowMob.class, new CowRenderer(new CowModel(), 0.7F));
+        renderers.put(WolfMob.class, new WolfRenderer(new WolfModel(0.0f), 0.5F));
+        renderers.put(ChickenMob.class, new ChickenRenderer(new ChickenModel(), 0.3F));
+        renderers.put(CreeperMob.class, new CreeperRenderer());
+        renderers.put(SkeletonMob.class, new BipedRenderer<>(new SkeletonModel(), 0.5F));
+        renderers.put(ZombieMob.class, new BipedRenderer<>(new ZombieModel(), 0.5F));
+        renderers.put(SnowmanMob.class, new BipedRenderer<>(new ZombieModel(), 0.5F));
+        renderers.put(ZombieArmoredMob.class, new ArmoredZombieRenderer(new ZombieModel(), 0.5F));
+        renderers.put(SlimeMob.class, new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25F));
+        renderers.put(Player.class, new PlayerRenderer());
+        renderers.put(HumanMob.class, new HumanRenderer());
+        renderers.put(GiantMob.class, new GiantRenderer(new ZombieModel(), 0.5F, 6F));
+        renderers.put(GhastMob.class, new GhastRenderer());
+        renderers.put(SquidMob.class, new SquidRenderer(new SquidModel(), 0.7F));
+        renderers.put(Mob.class, new MobRenderer<>(new BipedModel(), 0.5F));
         renderers.put(Entity.class, new DefaultRenderer());
-        renderers.put(EntityPainting.class, new PaintingRenderer());
-        renderers.put(EntityArrow.class, new ArrowRenderer());
-        renderers.put(EntitySnowball.class, new SnowballRenderer(Item.ammoSnowball));
-        renderers.put(EntityEgg.class, new SnowballRenderer(Item.eggChicken));
-        renderers.put(EntityFireball.class, new FireballRenderer());
-        renderers.put(EntityItem.class, new ItemEntityRenderer());
-        renderers.put(EntityTNT.class, new TNTRenderer());
-        renderers.put(EntityFallingSand.class, new FallingSandRenderer());
-        renderers.put(EntityMinecart.class, new MinecartRenderer());
-        renderers.put(EntityBoat.class, new BoatRenderer());
-        renderers.put(EntityBobber.class, new BobberRenderer());
-        renderers.put(EntityFireflyCluster.class, new FireflyRenderer());
-        renderers.put(EntityLightningBolt.class, new LightningBoltRenderer());
-        renderers.put(EntityCannonball.class, new CannonballRenderer());
-        renderers.put(EntityPebble.class, new SnowballRenderer(Item.ammoPebble));
+        renderers.put(PaintingEntity.class, new PaintingRenderer());
+        renderers.put(ArrowProjectile.class, new ArrowRenderer());
+        renderers.put(SnowballProjectile.class, new SpriteRenderer<SnowballProjectile>(Items.AMMO_SNOWBALL));
+        renderers.put(EggProjectile.class, new SpriteRenderer<EggProjectile>(Items.EGG_CHICKEN));
+        renderers.put(FireballProjectile.class, new SpriteRenderer<FireballProjectile>(Items.AMMO_FIREBALL).setScale(4).setFullBright());
+        renderers.put(ItemEntity.class, new ItemEntityRenderer());
+        renderers.put(TNTPrimedEntity.class, new TNTRenderer());
+        renderers.put(FallingBlockEntity.class, new FallingBlockRenderer());
+        renderers.put(MinecartEntity.class, new MinecartRenderer());
+        renderers.put(BoatEntity.class, new BoatRenderer());
+        renderers.put(FishingBobberEntity.class, new FishingBobberRenderer());
+        renderers.put(FireflyClusterMob.class, new FireflyRenderer());
+        renderers.put(LightningEntity.class, new LightningBoltRenderer());
+        renderers.put(CannonballProjectile.class, new CannonballRenderer());
+        renderers.put(PebbleProjectile.class, new SpriteRenderer<PebbleProjectile>(Items.AMMO_PEBBLE));
+
 
         for (EntityRenderer<?> renderer : renderers.values())
         {
-            renderer.setRenderDispatcher(this);
+            renderer.init(this);
         }
     }
 
@@ -198,8 +197,8 @@ public class EntityRenderDispatcher
         EntityRenderer<T> renderer = getRenderer(entity);
         if(renderer != null)
         {
-            renderer.doRender(tessellator, entity, x, y, z, yaw, partialTick);
-            renderer.doRenderShadowAndFire(tessellator, entity, x, y, z, yaw, partialTick);
+            renderer.render(tessellator, entity, x, y, z, yaw, partialTick);
+            renderer.postRender(tessellator, entity, x, y, z, yaw, partialTick);
         }
     }
 
@@ -208,7 +207,7 @@ public class EntityRenderDispatcher
         EntityRenderer<T> renderer = getRenderer(entity);
         if(renderer != null)
         {
-            renderer.doRenderPreview(tessellator, entity, x, y, z, yaw, partialTick);
+            renderer.renderPreview(tessellator, entity, x, y, z, yaw, partialTick);
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/FlagRenderer.java b/src/main/java/net/minecraft/client/render/FlagRenderer.java
index af9714c1b..c4b09a2c3 100644
--- a/src/main/java/net/minecraft/client/render/FlagRenderer.java
+++ b/src/main/java/net/minecraft/client/render/FlagRenderer.java
@@ -1,8 +1,8 @@
 package net.minecraft.client.render;
 
 import net.minecraft.client.GLAllocation;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.client.util.helper.Colors;
@@ -28,7 +28,7 @@ public class FlagRenderer {
         GLAllocation.deleteTexture(texture);
     }
 
-    public void updateTexture(TileEntityFlag tileEntity)
+    public void updateTexture(FlagBlockEntity tileEntity)
     {
         byte[] flagColors = tileEntity.flagColors;
         int[] rgbFlagColors = flagDataToRGB(tileEntity, flagColors);
@@ -40,7 +40,7 @@ public class FlagRenderer {
         return texture;
     }
 
-    private int[] flagDataToRGB(TileEntityFlag tileEntity, byte[] colorData)
+    private int[] flagDataToRGB(FlagBlockEntity tileEntity, byte[] colorData)
     {
         int[] data = new int[CANVAS_WIDTH * CANVAS_HEIGHT];
 
@@ -61,13 +61,13 @@ public class FlagRenderer {
         return data;
     }
 
-    private int getColorMap(TileEntityFlag tileEntity, int index)
+    private int getColorMap(FlagBlockEntity tileEntity, int index)
     {
         int col = 0x00FFFFFF;
         if(index > 0 && index <= 3)
         {
-            ItemStack stack = tileEntity.getStackInSlot(35 + index);
-            if (stack != null && stack.getItem() == Item.dye)
+            ItemStack stack = tileEntity.getItem(35 + index);
+            if (stack != null && stack.getItem() == Items.DYE)
             {
                 col = Colors.allFlagColors[TextFormatting.get(15 - stack.getMetadata()).id].getARGB();
             }
diff --git a/src/main/java/net/minecraft/client/render/FogManager.java b/src/main/java/net/minecraft/client/render/FogManager.java
index 3e46d7808..1a0c9d8fe 100644
--- a/src/main/java/net/minecraft/client/render/FogManager.java
+++ b/src/main/java/net/minecraft/client/render/FogManager.java
@@ -4,6 +4,7 @@ import static org.lwjgl.opengl.GL11.*;
 
 import java.nio.FloatBuffer;
 
+import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.opengl.NVFogDistance;
 
 import net.minecraft.client.GLAllocation;
@@ -15,7 +16,6 @@ import net.minecraft.client.render.camera.CameraUtil;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
 
@@ -44,7 +44,7 @@ public class FogManager {
         float fogModifier = mc.theWorld.getCurrentWeather() != null ? mc.theWorld.getCurrentWeather().fogDistance : 1.0f;
         fogModifier = (1.0f - ((1.0f - fogModifier) * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower()));
 
-        float brightnessAtCamera = mc.theWorld.getLightBrightness(MathHelper.floor_double(mc.activeCamera.getX(1f)), MathHelper.floor_double(mc.activeCamera.getY(1f)), MathHelper.floor_double(mc.activeCamera.getZ(1f)));
+        float brightnessAtCamera = mc.theWorld.getLightBrightness(MathHelper.floor(mc.activeCamera.getX(1f)), MathHelper.floor(mc.activeCamera.getY(1f)), MathHelper.floor(mc.activeCamera.getZ(1f)));
         if (mc.fullbright) brightnessAtCamera = 1.0f;
         float renderDistanceModifier = ((3 - mc.gameSettings.renderDistance.value.legacyValue) * fogModifier) / 3F;
         float newBrightness = brightnessAtCamera * (1.0F - renderDistanceModifier) + renderDistanceModifier;
@@ -54,7 +54,7 @@ public class FogManager {
 
     public void setupFog(int fogMode, float farPlaneDistance, float partialTick)
     {
-        glFog(GL_FOG_COLOR, buffer(fogRed, fogGreen, fogBlue, 0.5F));
+        glFogfv(GL_FOG_COLOR, buffer(fogRed, fogGreen, fogBlue, 0.5F));
         glNormal3f(0.0F, -1F, 0.0F);
         glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.water, partialTick))
@@ -111,15 +111,15 @@ public class FogManager {
         float renderDistanceScale = 1.0F / (float)(4 - mc.gameSettings.renderDistance.value.legacyValue);
         renderDistanceScale = 1.0F - (float) Math.pow(renderDistanceScale, 0.25D);
 
-        Vec3d skyColor = world.getSkyColor(mc.activeCamera, partialTick);
-        float rSky = (float)skyColor.xCoord;
-        float gSky = (float)skyColor.yCoord;
-        float bSky = (float)skyColor.zCoord;
+        Vec3 skyColor = world.getSkyColor(mc.activeCamera, partialTick);
+        float rSky = (float)skyColor.x;
+        float gSky = (float)skyColor.y;
+        float bSky = (float)skyColor.z;
 
-        Vec3d worldColor = world.getFogColor(mc.activeCamera, partialTick);
-        fogRed = (float)worldColor.xCoord;
-        fogGreen = (float)worldColor.yCoord;
-        fogBlue = (float)worldColor.zCoord;
+        Vec3 worldColor = world.getFogColor(mc.activeCamera, partialTick);
+        fogRed = (float)worldColor.x;
+        fogGreen = (float)worldColor.y;
+        fogBlue = (float)worldColor.z;
 
         fogRed += (rSky - fogRed) * renderDistanceScale;
         fogGreen += (gSky - fogGreen) * renderDistanceScale;
@@ -139,8 +139,8 @@ public class FogManager {
             fogBlue = 0.2F;
             if(mc.gameSettings.biomeWater.value)
             {
-                int x = MathHelper.floor_double(mc.activeCamera.getX(partialTick));
-                int z = MathHelper.floor_double(mc.activeCamera.getZ(partialTick));
+                int x = MathHelper.floor(mc.activeCamera.getX(partialTick));
+                int z = MathHelper.floor(mc.activeCamera.getZ(partialTick));
                 double temp = world.getBlockTemperature(x, z);
                 double humid = world.getBlockHumidity(x, z);
                 int waterColor = Colorizers.water.getColor(temp, humid);
diff --git a/src/main/java/net/minecraft/client/render/FontRenderer.java b/src/main/java/net/minecraft/client/render/FontRenderer.java
index 539b6d640..e1b89fbf9 100644
--- a/src/main/java/net/minecraft/client/render/FontRenderer.java
+++ b/src/main/java/net/minecraft/client/render/FontRenderer.java
@@ -4,6 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.lang.text.Text;
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.Texture;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
 import net.minecraft.core.util.helper.Color;
@@ -16,7 +17,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.text.Bidi;
 import java.util.Arrays;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
 import java.util.regex.Pattern;
@@ -120,19 +120,15 @@ public class FontRenderer {
         String fontPath = String.format("/font/font_%02X.png", id);
         String glyphPath = String.format("/font/glyph_%02X.png", id);
 
-        BufferedImage fontTexture;
-        try {
-            fontTexture = ImageIO.read(mc.texturePackList.getResourceAsStream(fontPath));
-        } catch (IOException | IllegalArgumentException e) {
-            success = false;
-            try {
-                fontTexture = ImageIO.read(mc.texturePackList.getResourceAsStream(glyphPath));
-            } catch (IOException e1) {
-                throw new RuntimeException(e1);
-            }
+        Texture fontTexture = this.renderEngine.loadTextureNoDefault(fontPath);
+        if (fontTexture == null) {
+            fontTexture = this.renderEngine.loadTextureNoDefault(glyphPath);
+        }
+        if (fontTexture == null) {
+            throw new RuntimeException("Failed to load texture from '" + fontPath + "' or '" + glyphPath + "'!");
         }
 
-        this.fontTextureNames[id] = this.renderEngine.allocateAndSetupTexture(fontTexture);
+        this.fontTextureNames[id] = fontTexture.id();
         this.boundTextureName = this.fontTextureNames[id];
         return success;
     }
@@ -191,7 +187,7 @@ public class FontRenderer {
             throw new RuntimeException(var5);
         }
 
-        this.glyphTextureNames[id] = this.renderEngine.allocateAndSetupTexture(glyphTexture);
+        this.glyphTextureNames[id] = this.renderEngine.loadBufferedTexture(glyphTexture).id();
         this.boundTextureName = this.glyphTextureNames[id];
     }
 
@@ -502,14 +498,14 @@ public class FontRenderer {
 
     }
 
-    private int renderStringAligned(String par1Str, int par2, int par3, int par4, int par5, boolean par6) {
+    private int renderStringAligned(String s, int x, int y, int maxWidth, int argb, boolean isShadow) {
         if(this.bidiFlag) {
-            par1Str = this.bidiReorder(par1Str);
-            int var7 = this.getStringWidth(par1Str);
-            par2 = par2 + par4 - var7;
+            s = this.bidiReorder(s);
+            int width = this.getStringWidth(s);
+            x = x + maxWidth - width;
         }
 
-        return this.renderStringInternal(par1Str, par2, par3, par5, par6);
+        return this.renderStringInternal(s, x, y, argb, isShadow);
     }
 
     public void renderString(String par1Str, int par2, int par3, int par4, boolean par5) {
@@ -613,20 +609,20 @@ public class FontRenderer {
         }
     }
 
-    public String trimStringToWidth(String par1Str, int par2) {
-        return this.trimStringToWidth(par1Str, par2, false);
+    public String trimStringToWidth(String s, int maxWidth) {
+        return this.trimStringToWidth(s, maxWidth, false);
     }
 
-    public String trimStringToWidth(String par1Str, int par2, boolean par3) {
+    public String trimStringToWidth(String s, int maxWidth, boolean par3) {
         StringBuilder var4 = new StringBuilder();
         int var5 = 0;
-        int var6 = par3 ? par1Str.length() - 1 : 0;
+        int var6 = par3 ? s.length() - 1 : 0;
         int var7 = par3 ? -1 : 1;
         boolean var8 = false;
         boolean var9 = false;
 
-        for(int var10 = var6; var10 >= 0 && var10 < par1Str.length() && var5 < par2; var10 += var7) {
-            char var11 = par1Str.charAt(var10);
+        for(int var10 = var6; var10 >= 0 && var10 < s.length() && var5 < maxWidth; var10 += var7) {
+            char var11 = s.charAt(var10);
             int var12 = this.getCharWidth(var11);
             if(var8) {
                 var8 = false;
@@ -646,7 +642,7 @@ public class FontRenderer {
                 }
             }
 
-            if(var5 > par2) {
+            if(var5 > maxWidth) {
                 break;
             }
 
@@ -660,50 +656,50 @@ public class FontRenderer {
         return var4.toString();
     }
 
-    private String trimStringNewline(String par1Str) {
-        while(par1Str != null && par1Str.endsWith("\n")) {
-            par1Str = par1Str.substring(0, par1Str.length() - 1);
+    private String trimStringNewline(String s) {
+        while(s != null && s.endsWith("\n")) {
+            s = s.substring(0, s.length() - 1);
         }
 
-        return par1Str;
+        return s;
     }
 
-    public void func_27278_a(String par1Str, int par2, int par3, int par4, int par5) {
-        this.func_40609_a(par1Str, par2, par3, par4, par5, false);
+    public void drawStringIntoConstrainedBlock(String s, int x, int y, int maxWidth, int argb) {
+        this.drawStringIntoConstrainedBlock(s, x, y, maxWidth, argb, false);
     }
 
-    private void renderSplitString(String par1Str, int par2, int par3, int par4, boolean par5) {
-        List var6 = this.listFormattedStringToWidth(par1Str, par4);
+    private void renderSplitString(String s, int x, int y, int maxWidth, boolean isShadow) {
+        List<String> lines = this.listFormattedStringToWidth(s, maxWidth);
 
-        for(Iterator var7 = var6.iterator(); var7.hasNext(); par3 += this.fontHeight) {
-            String var8 = (String)var7.next();
-            this.renderStringAligned(var8, par2, par3, par4, this.textColor, par5);
+        for (String line : lines) {
+            this.renderStringAligned(line, x, y, maxWidth, this.textColor, isShadow);
+            y += this.fontHeight;
         }
 
     }
 
-    public int func_27277_a(String par1Str, int par2) {
-        return this.fontHeight * this.listFormattedStringToWidth(par1Str, par2).size();
+    public int getHeightOfConstrainedString(String s, int maxWidth) {
+        return this.fontHeight * this.listFormattedStringToWidth(s, maxWidth).size();
     }
 
     public void setBidiFlag(boolean par1) {
         this.bidiFlag = par1;
     }
 
-    public List listFormattedStringToWidth(String par1Str, int par2) {
-        return Arrays.asList(this.wrapFormattedStringToWidth(par1Str, par2).split("\n"));
+    public List<String> listFormattedStringToWidth(String s, int maxWidth) {
+        return Arrays.asList(this.wrapFormattedStringToWidth(s, maxWidth).split("\n"));
     }
 
-    String wrapFormattedStringToWidth(String par1Str, int par2) {
-        int var3 = this.sizeStringToWidth(par1Str, par2);
-        if(par1Str.length() <= var3) {
-            return par1Str;
+    public String wrapFormattedStringToWidth(String s, int maxWidth) {
+        int var3 = this.sizeStringToWidth(s, maxWidth);
+        if(s.length() <= var3) {
+            return s;
         } else {
-            String var4 = par1Str.substring(0, var3);
-            char var5 = par1Str.charAt(var3);
+            String var4 = s.substring(0, var3);
+            char var5 = s.charAt(var3);
             boolean var6 = var5 == 32 || var5 == 10;
-            String var7 = getFormatFromString(var4) + par1Str.substring(var3 + (var6 ? 1 : 0));
-            return var4 + "\n" + this.wrapFormattedStringToWidth(var7, par2);
+            String var7 = getFormatFromString(var4) + s.substring(var3 + (var6 ? 1 : 0));
+            return var4 + "\n" + this.wrapFormattedStringToWidth(var7, maxWidth);
         }
     }
 
@@ -772,9 +768,9 @@ public class FontRenderer {
             if(var2 < var3 - 1) {
                 char var4 = par0Str.charAt(var2 + 1);
                 if(isFormatColor(var4)) {
-                    var1 = new StringBuilder("\u00a7" + var4);
+                    var1 = new StringBuilder("§" + var4);
                 } else if(isFormatSpecial(var4)) {
-                    var1.append("\u00a7").append(var4);
+                    var1.append("§").append(var4);
                 }
             }
         }
@@ -786,15 +782,14 @@ public class FontRenderer {
         return this.bidiFlag;
     }
 
-    public static String stripColorCodes(String par0Str) {
-        return FORMATTING_CODE_REGEX.matcher(par0Str).replaceAll("");
+    public static String stripColorCodes(String s) {
+        return FORMATTING_CODE_REGEX.matcher(s).replaceAll("");
     }
 
-    public void func_40609_a(String par1Str, int par2, int par3, int par4, int par5, boolean flag) {
+    public void drawStringIntoConstrainedBlock(String s, int x, int y, int maxWidth, int argb, boolean isShadow) {
         this.resetStyles();
-        this.textColor = par5;
-        par1Str = this.trimStringNewline(par1Str);
-        this.renderSplitString(par1Str, par2, par3, par4, flag);
+        this.textColor = argb;
+        this.renderSplitString(trimStringNewline(s), x, y, maxWidth, isShadow);
     }
 
     public void drawCenteredString(String string, int x, int y, int color) {
diff --git a/src/main/java/net/minecraft/client/render/ItemRenderer.java b/src/main/java/net/minecraft/client/render/ItemRenderer.java
index 5045e1200..931d744ea 100644
--- a/src/main/java/net/minecraft/client/render/ItemRenderer.java
+++ b/src/main/java/net/minecraft/client/render/ItemRenderer.java
@@ -1,23 +1,19 @@
 package net.minecraft.client.render;
 
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.block.model.BlockModelStairs;
-import net.minecraft.client.render.block.model.BlockModelStandard;
-import net.minecraft.client.render.item.model.ItemModel;
-import net.minecraft.client.render.item.model.ItemModelStandard;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.item.block.BlockItem;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.EntityPlayerSP;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.entity.EntityRenderer;
 import net.minecraft.client.render.entity.PlayerRenderer;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.material.Material;
@@ -25,12 +21,11 @@ import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
+import org.lwjgl.opengl.GL12;
 
 import static org.lwjgl.opengl.GL11.GL_ALPHA_TEST;
 import static org.lwjgl.opengl.GL11.GL_BLEND;
 import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
-import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
-import static org.lwjgl.opengl.GL11.glBindTexture;
 import static org.lwjgl.opengl.GL11.glColor4f;
 import static org.lwjgl.opengl.GL11.glDisable;
 import static org.lwjgl.opengl.GL11.glEnable;
@@ -39,10 +34,10 @@ import static org.lwjgl.opengl.GL11.glPushMatrix;
 
 // Referenced classes of package net.minecraft.src:
 //            RenderBlocks, MapItemRenderer, ItemStack, Block, 
-//            RenderEngine, EntityLiving, Tessellator, EntityPlayer,
+//            RenderEngine, Mob, Tessellator, Player,
 //            RenderHelper, MathHelper, World, Item, 
-//            ItemMap, EntityPlayerSP, RenderManager, RenderPlayer, 
-//            Material, BlockFire, InventoryPlayer
+//            MapItem, LocalPlayer, RenderManager, RenderPlayer,
+//            Material, FireBlock, InventoryPlayer
 
 public class ItemRenderer
 {
@@ -50,19 +45,19 @@ public class ItemRenderer
     public ItemRenderer(Minecraft minecraft)
     {
         itemToRender = null;
-        equippedProgress = 0.0F;
-        prevEquippedProgress = 0.0F;
+        height = 0.0F;
+        oHeight = 0.0F;
         renderBlocksInstance = new RenderBlocks();
-        field_20099_f = -1;
+        lastSlot = -1;
         mc = minecraft;
     }
     public float getEquippedProgress(float partialTick){
-        return prevEquippedProgress + (equippedProgress - prevEquippedProgress) * partialTick;
+        return oHeight + (height - oHeight) * partialTick;
     }
 
     public int getItemColorFromMetadata(Item item, int metadata) {
-        if (item instanceof ItemBlock) {
-            Block block = ((ItemBlock)item).getBlock();
+        if (item instanceof BlockItem) {
+            Block block = ((BlockItem)item).getBlock();
             return BlockColorDispatcher.getInstance().getDispatch(block).getFallbackColor(metadata);
         }
         return 0xFFFFFF;
@@ -71,7 +66,7 @@ public class ItemRenderer
     public void renderItemInFirstPerson(float partialTick)
     {
         float equipProgress = getEquippedProgress(partialTick);
-        EntityPlayerSP player = mc.thePlayer;
+        LocalPlayer player = mc.thePlayer;
         float rotationPitch = player.xRotO + (player.xRot - player.xRotO) * partialTick;
         GL11.glPushMatrix();
         GL11.glRotatef(rotationPitch, 1.0F, 0.0F, 0.0F);
@@ -91,7 +86,7 @@ public class ItemRenderer
         	}else if(mc.fullbright) {
         		
         	}else {
-        		brightness = mc.theWorld.getLightBrightness(MathHelper.floor_double(player.x), MathHelper.floor_double(player.y), MathHelper.floor_double(player.z));
+        		brightness = mc.theWorld.getLightBrightness(MathHelper.floor(player.x), MathHelper.floor(player.y), MathHelper.floor(player.z));
         	}
             GL11.glColor4f(brightness, brightness, brightness, 1.0f);
             float f6 = 0.8F;
@@ -101,12 +96,12 @@ public class ItemRenderer
             GL11.glTranslatef(-f18 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(swingProgress) * MathHelper.PI * 2.0F) * 0.4F, -f14 * 0.4F);
             GL11.glTranslatef(0.8F * f6, -0.75F * f6 - (1.0F - equipProgress) * 0.6F, -0.9F * f6);
             GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F);
-            GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
             f14 = MathHelper.sin(swingProgress * swingProgress * MathHelper.PI);
             f18 = MathHelper.sin(MathHelper.sqrt_float(swingProgress) * MathHelper.PI);
             GL11.glRotatef(f18 * 70F, 0.0F, 1.0F, 0.0F);
             GL11.glRotatef(-f14 * 20F, 0.0F, 0.0F, 1.0F);
-            mc.renderEngine.loadDownloadableTexture(mc.thePlayer.skinURL, mc.thePlayer.getEntityTexture(), PlayerSkinParser.instance);
+            mc.renderEngine.bindDownloadableTexture(mc.thePlayer.skinURL, mc.thePlayer.getEntityTexture(), PlayerSkinParser.instance);
             GL11.glTranslatef(-1F, 3.6F, 3.5F);
             GL11.glRotatef(120F, 0.0F, 0.0F, 1.0F);
             GL11.glRotatef(200F, 1.0F, 0.0F, 0.0F);
@@ -118,7 +113,7 @@ public class ItemRenderer
             renderplayer.drawFirstPersonHand(mc.thePlayer, false);
         }
         GL11.glPopMatrix();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         Lighting.disable();
     }
 
@@ -127,16 +122,16 @@ public class ItemRenderer
 		glDisable(GL_ALPHA_TEST);
 		
 		if(mc.thePlayer.isOnFire()) {
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
 			renderFireInFirstPerson(partialTicks);
 		}
 		
 		if(mc.thePlayer.isInWall() && !mc.thePlayer.noPhysics) {
-			int blockX = MathHelper.floor_double(mc.thePlayer.x);
-			int blockY = MathHelper.floor_double(mc.thePlayer.y);
-			int blockZ = MathHelper.floor_double(mc.thePlayer.z);
+			int blockX = MathHelper.floor(mc.thePlayer.x);
+			int blockY = MathHelper.floor(mc.thePlayer.y);
+			int blockZ = MathHelper.floor(mc.thePlayer.z);
 
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
 			
 			int id = mc.theWorld.getBlockId(blockX, blockY, blockZ);
             int meta = mc.theWorld.getBlockMetadata(blockX, blockY, blockZ);
@@ -169,8 +164,7 @@ public class ItemRenderer
 
 		}
 		if(mc.thePlayer.isUnderLiquid(Material.water)) {
-			int k = mc.renderEngine.getTexture("/misc/water.png");
-			glBindTexture(GL_TEXTURE_2D, k);
+            mc.renderEngine.loadTexture("/assets/minecraft/textures/misc/water.png").bind();
 			renderWarpedTextureOverlay(partialTicks);
 		}
 		glEnable(GL_ALPHA_TEST);
@@ -271,15 +265,15 @@ public class ItemRenderer
         }
 
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glDisable(3042 /*GL_BLEND*/);
+        GL11.glDisable(GL11.GL_BLEND);
     }
 
     public void updateEquippedItem()
     {
-        prevEquippedProgress = equippedProgress;
-        EntityPlayerSP entityplayersp = mc.thePlayer;
+        oHeight = height;
+        LocalPlayer entityplayersp = mc.thePlayer;
         ItemStack itemstack = entityplayersp.inventory.getCurrentItem();
-        boolean flag = field_20099_f == entityplayersp.inventory.currentItem && itemstack == itemToRender;
+        boolean flag = lastSlot == entityplayersp.inventory.currentItem && itemstack == itemToRender;
         if(itemToRender == null && itemstack == null)
         {
             flag = true;
@@ -291,7 +285,7 @@ public class ItemRenderer
         }
         float f = 0.4F;
         float f1 = flag ? 1.0F : 0.0F;
-        float f2 = f1 - equippedProgress;
+        float f2 = f1 - height;
         if(f2 < -f)
         {
             f2 = -f;
@@ -300,23 +294,23 @@ public class ItemRenderer
         {
             f2 = f;
         }
-        equippedProgress += f2;
-        if(equippedProgress < 0.1F)
+        height += f2;
+        if(height < 0.1F)
         {
             itemToRender = itemstack;
-            field_20099_f = entityplayersp.inventory.currentItem;
+            lastSlot = entityplayersp.inventory.currentItem;
         }
     }
 
     public void resetEquippedProgress()
     {
-        equippedProgress = 0.0F;
+        height = 0.0F;
     }
 
     private final Minecraft mc;
     private ItemStack itemToRender;
-    private float equippedProgress;
-    private float prevEquippedProgress;
+    private float height;
+    private float oHeight;
     public RenderBlocks renderBlocksInstance;
-    private int field_20099_f;
+    private int lastSlot;
 }
diff --git a/src/main/java/net/minecraft/client/render/Lighting.java b/src/main/java/net/minecraft/client/render/Lighting.java
index f9d7d736f..8afaf7acc 100644
--- a/src/main/java/net/minecraft/client/render/Lighting.java
+++ b/src/main/java/net/minecraft/client/render/Lighting.java
@@ -5,7 +5,7 @@ import static org.lwjgl.opengl.GL11.*;
 import java.nio.FloatBuffer;
 
 import net.minecraft.client.GLAllocation;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public class Lighting {
 
@@ -38,20 +38,20 @@ public class Lighting {
 		glEnable(GL_COLOR_MATERIAL);
 		glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
 		
-		Vec3d vec = Vec3d.createVector(0.2D, 1.0D, -0.7D).normalize();
-		glLight(GL_LIGHT0, GL_POSITION, getBuffer(vec.xCoord, vec.yCoord, vec.zCoord, 0.0D));
-		glLight(GL_LIGHT0, GL_DIFFUSE, getBuffer(lightBrightness, lightBrightness, lightBrightness, 1.0F));
-		glLight(GL_LIGHT0, GL_AMBIENT, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
-		glLight(GL_LIGHT0, GL_SPECULAR, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
+		Vec3 vec = Vec3.getTempVec3(0.2D, 1.0D, -0.7D).normalize();
+		glLightfv(GL_LIGHT0, GL_POSITION, getBuffer(vec.x, vec.y, vec.z, 0.0D));
+		glLightfv(GL_LIGHT0, GL_DIFFUSE, getBuffer(lightBrightness, lightBrightness, lightBrightness, 1.0F));
+		glLightfv(GL_LIGHT0, GL_AMBIENT, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
+		glLightfv(GL_LIGHT0, GL_SPECULAR, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
 		
-		vec = Vec3d.createVector(-0.2D, 1.0D, 0.7D).normalize();
-		glLight(GL_LIGHT1, GL_POSITION, getBuffer(vec.xCoord, vec.yCoord, vec.zCoord, 0.0D));
-		glLight(GL_LIGHT1, GL_DIFFUSE, getBuffer(lightBrightness, lightBrightness, lightBrightness, 1.0F));
-		glLight(GL_LIGHT1, GL_AMBIENT, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
-		glLight(GL_LIGHT1, GL_SPECULAR, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
+		vec = Vec3.getTempVec3(-0.2D, 1.0D, 0.7D).normalize();
+		glLightfv(GL_LIGHT1, GL_POSITION, getBuffer(vec.x, vec.y, vec.z, 0.0D));
+		glLightfv(GL_LIGHT1, GL_DIFFUSE, getBuffer(lightBrightness, lightBrightness, lightBrightness, 1.0F));
+		glLightfv(GL_LIGHT1, GL_AMBIENT, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
+		glLightfv(GL_LIGHT1, GL_SPECULAR, getBuffer(0.0F, 0.0F, 0.0F, 1.0F));
 		
 		glShadeModel(GL_FLAT);
-		glLightModel(GL_LIGHT_MODEL_AMBIENT, getBuffer(ambientBrightness, ambientBrightness, ambientBrightness, 1.0F));
+		glLightModelfv(GL_LIGHT_MODEL_AMBIENT, getBuffer(ambientBrightness, ambientBrightness, ambientBrightness, 1.0F));
 	}
 
 	private static FloatBuffer getBuffer(double d, double d1, double d2, double d3) {
diff --git a/src/main/java/net/minecraft/client/render/LightmapHelper.java b/src/main/java/net/minecraft/client/render/LightmapHelper.java
index 108a009cd..17b446b2b 100644
--- a/src/main/java/net/minecraft/client/render/LightmapHelper.java
+++ b/src/main/java/net/minecraft/client/render/LightmapHelper.java
@@ -43,7 +43,7 @@ public class LightmapHelper {
 		if(mc.gameSettings.customLightmap.value && world != null) {
 			int dimension = world.dimension.id;
 			
-			String path = "/environment/lightmap" + dimension + ".png";
+			String path = "/assets/minecraft/textures/environment/lightmap" + dimension + ".png";
 			
 			System.out.println("Loading lightmap '" + path + "'");
 			customLightmap = mc.renderEngine.getImage(path);
@@ -145,7 +145,7 @@ public class LightmapHelper {
 		glMatrixMode(GL_MODELVIEW);
 
 		// Bind texture
-		mc.renderEngine.bindTexture(lightmapTexture);
+		glBindTexture(GL_TEXTURE_2D, lightmapTexture);
 
 		// Back to default texture
 		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
diff --git a/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java b/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
index f9a5adeb0..63d489866 100644
--- a/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
+++ b/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
@@ -172,8 +172,7 @@ public class LoadingScreenRenderer
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -200F);
         Tessellator t = Tessellator.instance;
-        int bgTexture = minecraft.renderEngine.getTexture(backgroundPath);
-        GL11.glBindTexture(GL_TEXTURE_2D, bgTexture);
+        minecraft.renderEngine.loadTexture(backgroundPath).bind();
         float f = 32F;
 
         // Draw background
diff --git a/src/main/java/net/minecraft/client/render/MapItemRenderer.java b/src/main/java/net/minecraft/client/render/MapItemRenderer.java
index 63cc85662..383e6fe05 100644
--- a/src/main/java/net/minecraft/client/render/MapItemRenderer.java
+++ b/src/main/java/net/minecraft/client/render/MapItemRenderer.java
@@ -3,7 +3,8 @@ package net.minecraft.client.render;
 import java.awt.image.BufferedImage;
 import java.util.Iterator;
 
-import org.lwjgl.opengl.GL11;
+import net.minecraft.client.render.texture.BufferedTexture;
+import net.minecraft.core.util.helper.MathHelper;
 
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.tessellator.Tessellator;
@@ -12,21 +13,25 @@ import net.minecraft.core.util.helper.Color;
 import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.world.saveddata.maps.ItemMapSavedData;
 import net.minecraft.core.world.saveddata.maps.MapWaypoint;
+import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            RenderEngine, MapData, MapColor, GameSettings, 
-//            Tessellator, MapCoord, FontRenderer, EntityPlayer
+//            Tessellator, MapCoord, FontRenderer, Player
 
 public class MapItemRenderer
 {
+    public static final int IMAGE_WIDTH = 128;
+    public static final int IMAGE_HEIGHT = 128;
+    public static final int IMAGE_AREA = 128 * 128;
 
     public MapItemRenderer(FontRenderer fontrenderer, GameSettings gamesettings, RenderEngine renderengine)
     {
-        mapImageData = new int[16384 /*GL_LIGHT0*/];
+        mapImageData = new int[IMAGE_AREA];
         gameSettings = gamesettings;
         fontRenderer = fontrenderer;
-        mapTexture = renderengine.allocateAndSetupTexture(new BufferedImage(128, 128, 2));
-        for(int i = 0; i < 16384 /*GL_LIGHT0*/; i++)
+        mapTexture = renderengine.loadBufferedTexture(new BufferedImage(128, 128, 2));
+        for(int i = 0; i < IMAGE_AREA; i++)
         {
             mapImageData[i] = 0;
         }
@@ -36,56 +41,58 @@ public class MapItemRenderer
 
     public void renderMap(RenderEngine renderengine, ItemMapSavedData mapdata, float brightness)
     {
-        for(int i = 0; i < 16384 /*GL_LIGHT0*/; i++)
+        for(int i = 0; i < IMAGE_AREA; i++)
         {
-            byte colorIndex = mapdata.colors[i];
+            int colorIndex = mapdata.colors[i];
             //value is divided by 4 to get the map colour id
-            if(colorIndex / 4 == 0)
+            if(colorIndex >> 2 == 0)
             {
                 //if blank, render checkerboard texture
                 mapImageData[i] = (i + i / 128 & 1) * 8 + 16 << 24;
                 continue;
             }
-            int col = MaterialColor.materialColors[colorIndex / 4].col;
-            int i1 = colorIndex & 3;
-            char shade = '\334';
+            int col = MaterialColor.getColorFromIndex(colorIndex >> 2);
+
+            int i1 = colorIndex & 0b11;
+
+            int shade = 220;
             // if higher shade
             if(i1 == 2)
             {
-                shade = '\377';
+                shade = 255;
             }
             // if lower shade
             if(i1 == 0)
             {
-                shade = '\264';
+                shade = 180;
             }
 
 
-            int red = ((col >> 16 & 0xff) * shade) / 255;
-            int green = ((col >> 8 & 0xff) * shade) / 255;
-            int blue = ((col & 0xff) * shade) / 255;
-            mapImageData[i] = 0xff000000 | red << 16 | green << 8 | blue;
+            int red =   (Color.redFromInt(col)   * shade) / 255;
+            int green = (Color.greenFromInt(col) * shade) / 255;
+            int blue =  (Color.blueFromInt(col)  * shade) / 255;
+            mapImageData[i] = Color.intToIntARGB(255, red, green, blue);
         }
 
 
-        renderengine.updateTextureData(mapImageData, 128, 128, mapTexture);
+        renderengine.updateTextureData(mapImageData, 128, 128, mapTexture.id());
         int j = 0;
         int k = 0;
         Tessellator tessellator = Tessellator.instance;
         float f = 0.0F;
         //renders the map
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, mapTexture);
-        GL11.glEnable(3042 /*GL_BLEND*/);
-        GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
+        mapTexture.bind();
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glDisable(GL11.GL_ALPHA_TEST);
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV((float)(j + 0) + f, (float)(k + 128) - f, -0.0099999997764825821D, 0.0D, 1.0D);
-        tessellator.addVertexWithUV((float)(j + 128) - f, (float)(k + 128) - f, -0.0099999997764825821D, 1.0D, 1.0D);
-        tessellator.addVertexWithUV((float)(j + 128) - f, (float)(k + 0) + f, -0.0099999997764825821D, 1.0D, 0.0D);
-        tessellator.addVertexWithUV((float)(j + 0) + f, (float)(k + 0) + f, -0.0099999997764825821D, 0.0D, 0.0D);
+        tessellator.addVertexWithUV((float)(j + 0) + f, (float)(k + 128) - f, -0.01D, 0.0D, 1.0D);
+        tessellator.addVertexWithUV((float)(j + 128) - f, (float)(k + 128) - f, -0.01D, 1.0D, 1.0D);
+        tessellator.addVertexWithUV((float)(j + 128) - f, (float)(k + 0) + f, -0.01D, 1.0D, 0.0D);
+        tessellator.addVertexWithUV((float)(j + 0) + f, (float)(k + 0) + f, -0.01D, 0.0D, 0.0D);
         tessellator.draw();
-        GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        renderengine.bindTexture(renderengine.getTexture("/misc/mapicons.png"));
+        GL11.glEnable(GL11.GL_ALPHA_TEST);
+        GL11.glDisable(GL11.GL_BLEND);
+        renderengine.bindTexture(renderengine.loadTexture("/assets/minecraft/textures/misc/mapicons.png"));
 
         for(Iterator<MapWaypoint> iterator = mapdata.mapWaypoints.iterator(); iterator.hasNext(); GL11.glPopMatrix())
         {
@@ -108,7 +115,7 @@ public class MapItemRenderer
             tessellator.draw();
         }
         //renders map icons
-        renderengine.bindTexture(renderengine.getTexture("/misc/mapicons.png"));
+        renderengine.bindTexture(renderengine.loadTexture("/assets/minecraft/textures/misc/mapicons.png"));
         for(Iterator<ItemMapSavedData.MapDecoration> iterator = mapdata.decorations.iterator(); iterator.hasNext(); GL11.glPopMatrix())
         {
             ItemMapSavedData.MapDecoration mapcoord = iterator.next();
@@ -135,7 +142,7 @@ public class MapItemRenderer
         }
         GL11.glPushMatrix();
 
-        renderengine.bindTexture(renderengine.getTexture("/misc/flagicon.png"));
+        renderengine.bindTexture(renderengine.loadTexture("/assets/minecraft/textures/misc/flagicon.png"));
         // begin drawing flag colors
         for(Iterator<MapWaypoint> iterator = mapdata.mapWaypoints.iterator(); iterator.hasNext(); GL11.glPopMatrix()) {
             MapWaypoint mapWaypoint = iterator.next();
@@ -176,7 +183,7 @@ public class MapItemRenderer
     }
 
     private final int[] mapImageData;
-    private final int mapTexture;
+    private final BufferedTexture mapTexture;
     private final GameSettings gameSettings;
     private FontRenderer fontRenderer;
 }
diff --git a/src/main/java/net/minecraft/client/render/Polygon.java b/src/main/java/net/minecraft/client/render/Polygon.java
index a6ad40dce..4f0076b48 100644
--- a/src/main/java/net/minecraft/client/render/Polygon.java
+++ b/src/main/java/net/minecraft/client/render/Polygon.java
@@ -1,16 +1,20 @@
 package net.minecraft.client.render;
 
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public class Polygon
 {
+    public Vertex[] vertices;
+    public int vertexCount;
+    public boolean flipNormal;
+
 
     public Polygon(Vertex[] vertices)
     {
-        invertNormal = false;
-        vertexPositions = vertices;
-        nVertices = vertices.length;
+        flipNormal = false;
+        this.vertices = vertices;
+        vertexCount = vertices.length;
     }
 
     public Polygon(Vertex[] vertices, int minU, int minV, int maxU, int maxV, int texWidth, int texHeight)
@@ -18,46 +22,46 @@ public class Polygon
         this(vertices);
         float offsetU = 0.0015625F;
         float offsetV = 0.003125F;
-        vertices[0] = vertices[0].setTexturePosition((float)maxU / texWidth - offsetU, (float)minV / texHeight + offsetV);
-        vertices[1] = vertices[1].setTexturePosition((float)minU / texWidth + offsetU, (float)minV / texHeight + offsetV);
-        vertices[2] = vertices[2].setTexturePosition((float)minU / texWidth + offsetU, (float)maxV / texHeight - offsetV);
-        vertices[3] = vertices[3].setTexturePosition((float)maxU / texWidth - offsetU, (float)maxV / texHeight - offsetV);
+        vertices[0] = vertices[0].remap((float)maxU / texWidth - offsetU, (float)minV / texHeight + offsetV);
+        vertices[1] = vertices[1].remap((float)minU / texWidth + offsetU, (float)minV / texHeight + offsetV);
+        vertices[2] = vertices[2].remap((float)minU / texWidth + offsetU, (float)maxV / texHeight - offsetV);
+        vertices[3] = vertices[3].remap((float)maxU / texWidth - offsetU, (float)maxV / texHeight - offsetV);
     }
 
-    public void flipFace()
+    public void mirror()
     {
-        Vertex[] vertices = new Vertex[vertexPositions.length];
-        for(int i = 0; i < vertexPositions.length; i++)
+        Vertex[] vertices = new Vertex[this.vertices.length];
+        for(int i = 0; i < this.vertices.length; i++)
         {
-            vertices[i] = vertexPositions[vertexPositions.length - i - 1];
+            vertices[i] = this.vertices[this.vertices.length - i - 1];
         }
 
-        vertexPositions = vertices;
+        this.vertices = vertices;
     }
 
-    public void draw(Tessellator tessellator, float scale)
+    public void render(Tessellator tessellator, float scale)
     {
-        Vec3d vec3d = vertexPositions[1].vector3D.subtract(vertexPositions[0].vector3D);
-        Vec3d vec3d1 = vertexPositions[1].vector3D.subtract(vertexPositions[2].vector3D);
-        Vec3d vec3d2 = vec3d1.crossProduct(vec3d).normalize();
+        Vec3 vec3 = vertices[1].pos.vectorTo(vertices[0].pos);
+        Vec3 vec31 = vertices[1].pos.vectorTo(vertices[2].pos);
+        Vec3 vec32 = vec31.crossProduct(vec3).normalize();
         tessellator.startDrawingQuads();
-        if(invertNormal)
+        if(flipNormal)
         {
-            tessellator.setNormal(-(float)vec3d2.xCoord, -(float)vec3d2.yCoord, -(float)vec3d2.zCoord);
+            tessellator.setNormal(-(float) vec32.x, -(float) vec32.y, -(float) vec32.z);
         } else
         {
-            tessellator.setNormal((float)vec3d2.xCoord, (float)vec3d2.yCoord, (float)vec3d2.zCoord);
+            tessellator.setNormal((float) vec32.x, (float) vec32.y, (float) vec32.z);
         }
         for(int i = 0; i < 4; i++)
         {
-            Vertex positiontexturevertex = vertexPositions[i];
-            tessellator.addVertexWithUV((float)positiontexturevertex.vector3D.xCoord * scale, (float)positiontexturevertex.vector3D.yCoord * scale, (float)positiontexturevertex.vector3D.zCoord * scale, positiontexturevertex.texturePositionX, positiontexturevertex.texturePositionY);
+            Vertex positiontexturevertex = vertices[i];
+            tessellator.addVertexWithUV((float)positiontexturevertex.pos.x * scale, (float)positiontexturevertex.pos.y * scale, (float)positiontexturevertex.pos.z * scale, positiontexturevertex.u, positiontexturevertex.v);
         }
 
         tessellator.draw();
     }
-
-    public Vertex[] vertexPositions;
-    public int nVertices;
-    public boolean invertNormal;
+    public Polygon flipNormal() {
+        this.flipNormal = true;
+        return this;
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/PostProcessingManager.java b/src/main/java/net/minecraft/client/render/PostProcessingManager.java
index ff2cc31ab..85e67a2c7 100644
--- a/src/main/java/net/minecraft/client/render/PostProcessingManager.java
+++ b/src/main/java/net/minecraft/client/render/PostProcessingManager.java
@@ -3,11 +3,10 @@ package net.minecraft.client.render;
 import net.minecraft.client.Minecraft;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.biome.Biome;
-import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.season.Seasons;
 import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 public class PostProcessingManager
 {
@@ -111,32 +110,32 @@ public class PostProcessingManager
         if (activeWeather != null)
         {
             float intensity = mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherIntensity();
-            if (activeWeather == Weather.overworldSnow || activeWeather == Weather.overworldWinterSnow)
+            if (activeWeather == Weathers.OVERWORLD_SNOW || activeWeather == Weathers.OVERWORLD_WINTER_SNOW)
             {
                 contrast += -0.125f * intensity * surfaceness;
                 saturation += -0.25f * intensity * surfaceness;
                 bMod += 0.25f * intensity * surfaceness;
             }
-            else if (activeWeather == Weather.overworldRainBlood)
+            else if (activeWeather == Weathers.OVERWORLD_RAIN_BLOOD)
             {
                 rMod += 0.4f * intensity * surfaceness;
                 gMod += 0.1f * intensity * surfaceness;
                 saturation += 0.125f * intensity * surfaceness;
                 exposure -= 0.125f * intensity * surfaceness;
             }
-            else if (activeWeather == Weather.overworldRain)
+            else if (activeWeather == Weathers.OVERWORLD_RAIN)
             {
                 bMod += 0.1f * intensity * surfaceness;
                 saturation += -0.125f * intensity * surfaceness;
                 brightness += -0.0625f * intensity * surfaceness;
             }
-            else if (activeWeather == Weather.overworldStorm)
+            else if (activeWeather == Weathers.OVERWORLD_STORM)
             {
                 bMod += 0.1f * intensity * surfaceness;
                 saturation += -0.2f * intensity * surfaceness;
                 brightness += -0.1f * intensity * surfaceness;
             }
-            else if (activeWeather == Weather.overworldFog && mc.gameSettings.fog.value)
+            else if (activeWeather == Weathers.OVERWORLD_FOG && mc.gameSettings.fog.value)
             {
                 saturation += -0.4f * intensity * surfaceness;
                 contrast += -0.25f * intensity * surfaceness;
diff --git a/src/main/java/net/minecraft/client/render/RenderBlockCache.java b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
index 2f5b87f33..e700d2b2c 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlockCache.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
@@ -4,6 +4,7 @@ import java.util.Arrays;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.WorldSource;
 
 final public class RenderBlockCache {
diff --git a/src/main/java/net/minecraft/client/render/RenderBlocks.java b/src/main/java/net/minecraft/client/render/RenderBlocks.java
index 44d6a01db..7423d47e6 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlocks.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlocks.java
@@ -5,7 +5,7 @@ import org.lwjgl.opengl.GL11;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.block.model.BlockModel;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.enums.LightLayer;
@@ -13,11 +13,11 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
 // Referenced classes of package net.minecraft.src:
-//            Block, BlockRail, Tessellator, IBlockAccess,
-//            BlockBed, ModelBed, BlockRedstoneRepeater, BlockPistonBase, 
-//            BlockPistonExtension, Vec3D, BlockFire, BlockRedstoneWire, 
-//            EntityRenderer, BlockFluid, MathHelper, Material, 
-//            BlockDoor, World
+//            Block, RailBlock, Tessellator, IBlockAccess,
+//            BedBlock, ModelBed, RepeaterBlock, BasePistonBlock,
+//            BlockPistonExtension, Vec3D, FireBlock, RedstoneWireBlock,
+//            EntityRenderer, FluidBlock, MathHelper, Material,
+//            DoorBlock, World
 
 public class RenderBlocks
 {
diff --git a/src/main/java/net/minecraft/client/render/RenderEngine.java b/src/main/java/net/minecraft/client/render/RenderEngine.java
index e9fed0614..3de2fa842 100644
--- a/src/main/java/net/minecraft/client/render/RenderEngine.java
+++ b/src/main/java/net/minecraft/client/render/RenderEngine.java
@@ -6,25 +6,20 @@ import static org.lwjgl.opengl.GL11.*;
 import static org.lwjgl.opengl.GL12.*;
 
 import java.awt.image.BufferedImage;
-import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
-import com.b100.json.element.JsonArray;
-import com.b100.json.element.JsonElement;
-import com.b100.json.element.JsonObject;
+import java.util.Objects;
 
 import net.minecraft.client.GLAllocation;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.popup.GuiPopup;
 import net.minecraft.client.gui.popup.PopupBuilder;
 import net.minecraft.client.option.GameSettings;
-import net.minecraft.client.option.enums.MipmapType;
 import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.client.render.customatlas.CustomAtlasHandler;
 import net.minecraft.client.render.dynamictexture.DynamicTexture;
 import net.minecraft.client.render.dynamictexture.DynamicTextureCalendar;
 import net.minecraft.client.render.dynamictexture.DynamicTextureClock;
@@ -38,32 +33,36 @@ import net.minecraft.client.render.dynamictexture.DynamicTexturePortal;
 import net.minecraft.client.render.dynamictexture.DynamicTextureTrommel;
 import net.minecraft.client.render.dynamictexture.DynamicTextureWaterFlow;
 import net.minecraft.client.render.dynamictexture.DynamicTextureWaterStill;
-import net.minecraft.client.render.stitcher.AtlasStitcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.texturepack.TexturePack;
+import net.minecraft.client.render.texture.meta.AnimationProperties;
+import net.minecraft.client.render.texture.stitcher.AtlasStitcher;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.BufferedTexture;
+import net.minecraft.client.render.texture.DownloadedTexture;
+import net.minecraft.client.render.texture.FileTexture;
+import net.minecraft.client.render.texture.Texture;
 import net.minecraft.client.render.texturepack.TexturePackException;
 import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.client.util.helper.Colors;
-import net.minecraft.client.util.helper.TexturePackJsonHelper;
 import net.minecraft.client.util.helper.Textures;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.Buffer;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.lwjgl.opengl.GL11;
 
 public class RenderEngine {
 
-	public static boolean debugMipmap = false;
-	private static boolean fixArtifacts = true;
-	
 	public final Minecraft mc;
-	
-	private Map<String, Integer> textureMap = new HashMap<>();
-	private Map<String, int[]> intArrayTextureData = new HashMap<>();
-	private Map<Integer, BufferedImage> textureNameToImageMap = new HashMap<>();
-	private Map<String, DownloadedTexture> downloadedTextures = new HashMap<>();
 
-	private List<DynamicTexture> dynamicTextures = new ArrayList<>();
+	public final Map<Integer, Texture> idToTextureMap = new HashMap<>();
+	public final Map<String, Texture> textureMap = new HashMap<>();
+	public final List<BufferedTexture> bufferedTextures = new ArrayList<>();
+	public final Map<String, DownloadedTexture> downloadedTextures = new HashMap<>();
+	public final Map<NamespaceID, DynamicTexture> dynamicTextures = new HashMap<>();
 	
-	private GameSettings gameSettings;
+	private final GameSettings gameSettings;
 	public TexturePackList texturePacks;
 	
 	private boolean clampTexture;
@@ -85,377 +84,94 @@ public class RenderEngine {
 		dynamicTextures.clear();
 
 		if (mc.gameSettings.animations.value != 0) {
-			TexturePack tp;
-
 			boolean useCustomAnimations = mc.gameSettings.animations.value == 2;
 
 			try {
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_water_still.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_water_still.png", "minecraft:block/water_still", false));
-				}else {
-					dynamicTextures.add(new DynamicTextureWaterStill());
-				}
-
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_water_flowing.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_water_flowing.png", "minecraft:block/water_flowing", true));
-				}else {
-					dynamicTextures.add(new DynamicTextureWaterFlow());
-				}
-
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_lava_still.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_lava_still.png", "minecraft:block/lava_still", false));
-				}else {
-					dynamicTextures.add(new DynamicTextureLavaStill());
+                addDynamicTexture(new DynamicTextureWaterStill(TextureRegistry.getTexture("minecraft:block/water_still")));
+                addDynamicTexture(new DynamicTextureWaterFlow(TextureRegistry.getTexture("minecraft:block/water_flowing")));
+                addDynamicTexture(new DynamicTextureLavaStill(TextureRegistry.getTexture("minecraft:block/lava_still")));
+                addDynamicTexture(new DynamicTextureLavaFlowing(TextureRegistry.getTexture("minecraft:block/lava_flowing")));
+                addDynamicTexture(new DynamicTexturePortal(TextureRegistry.getTexture("minecraft:block/portal_nether"),false));
+                addDynamicTexture(new DynamicTextureFire(TextureRegistry.getTexture("minecraft:block/fire")));
+
+                String[] fireflycolors = new String[] {"blue", "orange", "green", "red"};
+				for (String color : fireflycolors) {
+					addDynamicTexture(new DynamicTextureFireflyJar(TextureRegistry.getTexture("minecraft:block/lantern_firefly_" + color)));
 				}
 
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_lava_flowing.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_lava_flowing.png", "minecraft:block/lava_flowing", true));
-				}else {
-					dynamicTextures.add(new DynamicTextureLavaFlowing());
-				}
-
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_portal.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_portal.png", "minecraft:block/portal_nether", false));
-				}else {
-					dynamicTextures.add(new DynamicTexturePortal(false));
-				}
-
-				tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/custom_fire.png");
-				if(useCustomAnimations && tp != null) {
-					dynamicTextures.add(new DynamicTextureCustom(mc, tp, "/anim/custom_fire.png", "minecraft:block/fire", false));
-				}else {
-					dynamicTextures.add(new DynamicTextureFire());
-				}
-
-				String[] fireflycolors = new String[] {"blue", "orange", "green", "red"};
-				for(int i=0; i < 4; i++) {
-					String color = fireflycolors[i];
+				addDynamicTexture(new DynamicTextureTrommel(mc, TextureRegistry.getTexture("minecraft:block/trommel_active_front"), true));
+				addDynamicTexture(new DynamicTextureTrommel(mc, TextureRegistry.getTexture("minecraft:block/trommel_active_back"), false));
 
-					String animationPath = "/anim/custom_firefly_jar_" + color + ".png";
-					String texturePath = "/assets/minecraft/textures/block/lantern_firefly_" + color + ".png";
-					String textureName = "minecraft:block/lantern_firefly_" + color;
-
-					tp = mc.texturePackList.getHighestPriorityTexturePackWithFile(animationPath);
-					if(useCustomAnimations && tp != null) {
-						dynamicTextures.add(new DynamicTextureCustom(mc, tp, animationPath, textureName, false));
-					}else {
-						dynamicTextures.add(new DynamicTextureFireflyJar(mc, texturePath, textureName));
-					}
+				if (useCustomAnimations) {
+					loadCustomAnimations();
 				}
-
 			}catch (TexturePackException e) {
 				errors.add(e);
 			}
-
-			tp = mc.texturePackList.getHighestPriorityTexturePackWithFile("/anim/animations.json");
-			if(useCustomAnimations && tp != null) {
-				loadCustomAnimations(tp, errors);
-			}
-
-			dynamicTextures.add(new DynamicTextureTrommel(mc, TextureRegistry.getTexture("minecraft:block/trommel_active_front"), true));
-			dynamicTextures.add(new DynamicTextureTrommel(mc, TextureRegistry.getTexture("minecraft:block/trommel_active_back"), false));
 		}
 
-        dynamicTextures.add(new DynamicTextureClock(mc));
-		dynamicTextures.add(new DynamicTextureCalendar(mc));
-		dynamicTextures.add(new DynamicTextureCompass(mc));
+        addDynamicTextureOverride(new DynamicTextureClock(mc), true);
+		addDynamicTextureOverride(new DynamicTextureCalendar(mc), true);
+		addDynamicTextureOverride(new DynamicTextureCompass(mc, TextureRegistry.getTexture("minecraft:item/tool_compass")), true);
 	}
-	
-	private void loadCustomAnimations(TexturePack tp, List<Throwable> errors) {
+
+	protected void addDynamicTexture(DynamicTexture texture) {
+		addDynamicTextureOverride(texture, false);
+	}
+	protected void addDynamicTextureOverride(DynamicTexture texture, boolean override) {
+		if (!override && dynamicTextures.containsKey(texture.targetTexture.namespaceId)) return;
+		dynamicTextures.put(texture.targetTexture.namespaceId, texture);
+	}
+
+	private void loadCustomAnimations() {
 		if(!mc.gameSettings.customAnimations.value) {
 			return;
 		}
-		try {
-			List<DynamicTexture> customAnimations = new ArrayList<>();
 
-			JsonObject rootObject = TexturePackJsonHelper.readJsonObject(tp, "/anim/animations.json");
-			JsonArray animations = TexturePackJsonHelper.getArray(rootObject, "animations");
-			try {
-				for(int i=0; i < animations.length(); i++) {
-					JsonElement element = animations.get(i);
-					if(!element.isObject()) {
-						throw new TexturePackException("Index "+i+" is not an object!");
-					}
-
-					try {
-						JsonObject animationObject = element.getAsObject();
-
-                        String id = TexturePackJsonHelper.getString(animationObject, "id");
-						String name = TexturePackJsonHelper.getString(animationObject, "name");
-						
-						String animationSource = "/anim/" + name + ".png";
-						if(!tp.hasFile(animationSource)) {
-							throw new TexturePackException("File '"+animationSource+"' does not exist!");
-						}
-						
-						customAnimations.add(new DynamicTextureCustom(mc, tp, animationSource, id, false));
-					}catch (TexturePackException e) {
-						throw new TexturePackException("Error at index " + i, e);
-					}
+		for (AtlasStitcher stitcher : TextureRegistry.stitcherMap.values()){
+			for (IconCoordinate c : stitcher.textureMap.values()) {
+				if (c.hasMeta("animation")) {
+					System.out.println("Icon '" + c.namespaceId + "' has 'animation' meta!");
+					addDynamicTextureOverride(new DynamicTextureCustom(c, c.getMeta("animation", AnimationProperties.class)), true);
 				}
-			}catch (Exception e) {
-				throw new TexturePackException("Error in animations.json", e);
 			}
-
-			this.dynamicTextures.addAll(customAnimations);
-		}catch (Exception e) {
-			errors.add(e);
 		}
 	}
-	
-	public int[] getTextureImageData(String name) {
-		int[] imageData = intArrayTextureData.get(name);
-		if (imageData != null) return imageData;
-		
-		imageData = getImageData(readImage(texturePacks.getResourceAsStream(name)));
-		if(imageData == null) imageData = getImageData(missingTexture);
+
+	public @NotNull Texture loadTexture(@NotNull final String name) {
+		Texture t = loadTextureNoDefault(name);
 		
-		intArrayTextureData.put(name, imageData);
-		return imageData;
-	}
+		if (t == null) {
+			t = new BufferedTexture(missingTexture, false, false, false);
+			textureMap.put(name, t);
+			idToTextureMap.put(t.id(), t);
+        }
+        return t;
+    }
 
-	public int getTexture(String name) {
-		if(name == null) throw new NullPointerException();
+	public @Nullable Texture loadTextureNoDefault(@NotNull final String name) {
+		Objects.requireNonNull(name);
+
+		Texture texture = textureMap.get(name);
+		if (texture != null) return texture;
 
-		Integer id = textureMap.get(name);
-		if (id != null) return id;
-		
 		try {
-			id = GLAllocation.generateTexture();
-			
-			if (name.startsWith("##")) {
-				setupTexture(unwrapImageByColumns(readImage(texturePacks.getResourceAsStream(name.substring(2)))), id);
-			} else if (name.startsWith("%clamp%")) {
-				clampTexture = true;
-				setupTexture(readImage(texturePacks.getResourceAsStream(name.substring(7))), id);
-				clampTexture = false;
-			} else if (name.startsWith("%blur%")) {
-				blurTexture = true;
-				setupTexture(readImage(texturePacks.getResourceAsStream(name.substring(6))), id);
-				blurTexture = false;
-			} else {
-				InputStream inputstream = texturePacks.getResourceAsStream(name);
-				if (inputstream == null) {
-					setupTexture(missingTexture, id);
-				} else {
-					setupTexture(readImage(inputstream), id);
-				}
-			}
-			textureMap.put(name, id);
-			return id;
+			texture = new FileTexture(name);
+			textureMap.put(name, texture);
+			idToTextureMap.put(texture.id(), texture);
+			return texture;
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		
-		int j = GLAllocation.generateTexture();
-		setupTexture(missingTexture, j);
-		textureMap.put(name, j);
-		return j;
+		return null;
 	}
 
-	public int allocateAndSetupTexture(BufferedImage bufferedimage) {
-		int i = GLAllocation.generateTexture();
-		setupTexture(bufferedimage, i);
-		textureNameToImageMap.put(i, bufferedimage);
-		return i;
-	}
-	
-	public void setupTexture(BufferedImage img, int id) {
-		setupTexture(img, id, false);
-	}
-	
-	public void setupTexture(BufferedImage img, int id, boolean mipmap) {
-		glBindTexture(GL_TEXTURE_2D, id);
-		
-		if(blurTexture) {
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-		}else {
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-		}
-		
-		if(clampTexture) {
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-		}else {
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-		}
-		
-		int w = img.getWidth();
-		int h = img.getHeight();
-		
-		Buffer.put(img);
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-		
-		if(mipmap) {
-			generateMipmaps(buffer, img, mc.gameSettings.mipmapLevels.value, mc.gameSettings.mipmapType.value == MipmapType.SMOOTH);
-		}
+	public BufferedTexture loadBufferedTexture(BufferedImage bufferedimage) { // TODO, this may need a way to reduce textures from the same BufferedImage, since this allocates a new texture to memory every time its called
+		BufferedTexture texture = new BufferedTexture(bufferedimage, false, false, false);
+		bufferedTextures.add(texture);
+		return texture;
 	}
-	
-	private void generateMipmaps(ByteBuffer buffer, BufferedImage image, int levels, boolean smooth) {
-		System.out.println("Generating Mipmaps...");
-		
-		final int width = image.getWidth();
-		final int height = image.getHeight();
-		
-		int[] data = new int[width * height];
-		int[] newData = null;
-		
-		for(int x=0; x < width; x++) {
-			for(int y=0; y < height; y++) {
-				data[width * y + x] = image.getRGB(x, y);
-			}
-		}
-		
-		if(fixArtifacts) {
-			for(int level = levels; level > 0; level--) {
-				int lod = (int) Math.pow(2, level);
-				
-				int tilesX = width / lod;
-				int tilesY = height / lod;
-				
-				for(int x = 0; x < tilesX; x++) {
-					for(int y = 0; y < tilesY; y++) {
-						
-						Integer nonTransparentColor = null;
-						
-						getColor: for(int i=0; i < lod; i++) {
-							for(int j=0; j < lod; j++) {
-								int x0 = x * lod + i;
-								int y0 = y * lod + j;
-								
-								int color = data[width * y0 + x0];
-
-								if(((color >> 24) & 0xFF) > 0) {
-									nonTransparentColor = color;
-									break getColor;
-								}
-							}
-						}
-						
-						if(nonTransparentColor != null) {
-							nonTransparentColor &= 0x00FFFFFF;
-							
-							for(int i=0; i < lod; i++) {
-								for(int j=0; j < lod; j++) {
-									int x0 = x * lod + i;
-									int y0 = y * lod + j;
-									
-									int color = data[width * y0 + x0];
-
-									if(((color >> 24) & 0xFF) == 0) {
-										data[width * y0 + x0] = nonTransparentColor;
-									}
-								}
-							}	
-						}			
-					}
-				}
-			}
-		}
-		
-		int previousWidth = width;
-		int newWidth = width;
-		int newHeight = height;
-		
-		for(int level = 0; level <= levels; level++) {
-			newData = new int[newWidth * newHeight];
-
-			for(int y = 0; y < newWidth; y++) {
-				for(int x = 0; x < newHeight; x++) {
-					int color;
-					
-					if(level == 0) {
-						color = data[width * y + x];
-					}else {
-						int x1 = x << 1;
-						int y1 = y << 1;
-						
-						if(smooth) {
-							int color0 = data[previousWidth * (y1 + 0) + (x1 + 0)];
-							int color1 = data[previousWidth * (y1 + 0) + (x1 + 1)];
-							int color2 = data[previousWidth * (y1 + 1) + (x1 + 0)];
-							int color3 = data[previousWidth * (y1 + 1) + (x1 + 1)];
-							
-							color = blendColor(blendColor(color0, color1), blendColor(color2, color3));
-						}else {
-							color = data[previousWidth * y1 + x1];
-						}
-					}
-					
-					newData[y * newWidth + x] = color;
-				}
-			}
-			
-			buffer.position(0).limit(buffer.capacity());
-			
-			for(int i=0; i < newData.length; i++) {
-				int color = newData[i];
-
-				buffer.put((byte) ((color >> 16) & 0xFF));
-				buffer.put((byte) ((color >>  8) & 0xFF));
-				buffer.put((byte) ((color >>  0) & 0xFF));
-				buffer.put((byte) ((color >> 24) & 0xFF));
-			}
-			
-			buffer.limit(buffer.position()).flip();
-			
-			glTexImage2D(GL_TEXTURE_2D, debugMipmap ? 0 : level, GL_RGBA, newWidth, newHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-			if(!debugMipmap) {
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
-				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
-			}
-			
-			data = newData;
-			previousWidth = newWidth;
-			
-			newWidth /= 2;
-			newHeight /= 2;
-		}
-	}
-	
-	private int blendColor(int color0, int color1) {
-		int alpha0 = (color0 >> 24) & 0xFF;
-		int alpha1 = (color1 >> 24) & 0xFF;
-		
-		int alphaAvg = (alpha0 + alpha1) / 2;
-		
-		if(alpha0 == 0 && alpha1 == 0) {
-			alpha0 = 1;
-			alpha1 = 1;
-		}else {
-			if(alpha0 == 0) {
-				color0 = color1;
-				alphaAvg /= 2;
-			}
-			if(alpha1 == 0) {
-				color1 = color0;
-				alphaAvg /= 2;
-			}
-		}
 
-		int r0 = (color0 >> 16 & 0xFF) * alpha0;
-		int g0 = (color0 >>  8 & 0xFF) * alpha0;
-		int b0 = (color0 >>  0 & 0xFF) * alpha0;
-		
-		int r1 = (color1 >> 16 & 0xFF) * alpha1;
-		int g1 = (color1 >>  8 & 0xFF) * alpha1;
-		int b1 = (color1 >>  0 & 0xFF) * alpha1;
-		
-		int rAvg = (r0 + r1) / (alpha0 + alpha1);
-		int gAvg = (g0 + g1) / (alpha0 + alpha1);
-		int bAvg = (b0 + b1) / (alpha0 + alpha1);
-		
-		return alphaAvg << 24 | rAvg << 16 | gAvg << 8 | bAvg;
-	}
-	
 	public int createTexture(int width, int height)
 	{
 		int tex = GLAllocation.generateTexture();
@@ -475,14 +191,14 @@ public class RenderEngine {
 		buffer.put(anim.imageData);
 		buffer.position(0).limit(anim.imageData.length);
 
-		anim.texture.parentAtlas.bindTexture();
-		IconCoordinate icon = anim.texture;
+		anim.targetTexture.parentAtlas.bind();
+		IconCoordinate icon = anim.targetTexture;
 
 		int x1 = icon.iconX;
 		int y1 = icon.iconY;
 		glTexSubImage2D(GL_TEXTURE_2D, 0, x1, y1, icon.width, icon.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
 		
-		if(mc.gameSettings.mipmapLevels.value > 0) {
+		if(mc.gameSettings.mipmapLevels.value > 0 && anim.targetTexture.parentAtlas.hasMipmaps()) {
 			int levels = glGetTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL);
 
 			for(int level = 1; level <= levels; level++) {
@@ -547,58 +263,31 @@ public class RenderEngine {
 		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
 	}
 
-	public void deleteTexture(int i) {
-		textureNameToImageMap.remove(Integer.valueOf(i));
-		glDeleteTextures(i);
-	}
-
-	public void updateDynamicTextures() {
-        List<DynamicTexture> dynamics = new ArrayList<>(dynamicTextures);
+	public void updateDynamicTextures(boolean isPaused) {
+        List<DynamicTexture> dynamics = new ArrayList<>(dynamicTextures.values());
 		for (DynamicTexture dynamicTexture : dynamics) {
 			try {
-				if (dynamicTexture.runUpdates()) {
+				if (dynamicTexture.runUpdates(isPaused)) {
 					updateDynamicTexture(dynamicTexture);
 				}
 			} catch(Exception e){
-				new RuntimeException("Exception while updating dynamic for '" + dynamicTexture.texture.namespaceId + "'. Removing from dynamic texture pool and skipping!", e).printStackTrace();
-				dynamicTextures.remove(dynamicTexture); // Remove broken texture
+				new RuntimeException("Exception while updating dynamic for '" + dynamicTexture.targetTexture.namespaceId + "'. Removing from dynamic texture pool and skipping!", e).printStackTrace();
+				dynamicTextures.remove(dynamicTexture.targetTexture.namespaceId); // Remove broken texture
 			}
 		}
 	}
 	
 	public BufferedImage getImage(String name) {
 		try {
-			BufferedImage img;
-			if (name.startsWith("##")) {
-				img = unwrapImageByColumns(readImage(texturePacks.getResourceAsStream(name.substring(2))));
-			} else if (name.startsWith("%clamp%")) {
-				clampTexture = true;
-				img = readImage(texturePacks.getResourceAsStream(name.substring(7)));
-			} else if (name.startsWith("%blur%")) {
-				blurTexture = true;
-				img = readImage(texturePacks.getResourceAsStream(name.substring(6)));
-			} else {
-				img = readImage(texturePacks.getResourceAsStream(name));
-			}
-			return img;
+			return readImage(texturePacks.getResourceAsStream(name));
 		}catch (Exception e) {
 			return Textures.missingTexture;
 		}
 	}
-	
-	public void setupTexture(String name) {
-		try {
-			BufferedImage img = getImage(name);
-			int j = textureMap.get(name);
-			setupTexture(img, j);
-			blurTexture = false;
-			clampTexture = false;
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
+
 	public void refreshTexturesAndDisplayErrors() {
+		MaterialColor.assignManualEntries();
+
     	List<Throwable> errors = new ArrayList<>();
     	
     	refreshTextures(errors);
@@ -668,42 +357,31 @@ public class RenderEngine {
 	 * @param errors A list of errors to be displayed in a popup when selecting the texture pack. Errors of type {@link TexturePackException} will be displayed as a readable message
 	 */
 	public void refreshTextures(List<Throwable> errors) {
-		// Animations may change the size of textures, so they need to be initialized before the atlas is generated
-		initDynamicTextures(errors);
+		CustomAtlasHandler.beforeRefreshTextures();
 		
+		// Animations may change the size of textures, so they need to be initialized before the atlas is generated
+
+		long start = System.nanoTime();
 		for (AtlasStitcher stitcher : TextureRegistry.stitcherMap.values()){
-			stitcher.generateAtlas();
+			stitcher.preinit();
 		}
+		System.out.println("Took '" + (System.nanoTime() - start)/1_000_000_000d + "' seconds to load atlases.");
+
+		initDynamicTextures(errors);
 
-		for (int i=0; i < dynamicTextures.size(); i++) {
-			dynamicTextures.get(i).postInit();
+		for (AtlasStitcher stitcher : TextureRegistry.stitcherMap.values()){
+			stitcher.init();
 		}
 
+        for (DynamicTexture dynamicTexture : dynamicTextures.values()) {
+            dynamicTexture.postInit();
+        }
 
-		
-		textureNameToImageMap.forEach((i, img) -> setupTexture(img, i));
-		textureMap.forEach((name, id) -> setupTexture(name));
-		
-		for (String s : intArrayTextureData.keySet()) {
-			try {
-				BufferedImage img;
-				if (s.startsWith("##")) {
-					img = unwrapImageByColumns(readImage(texturePacks.getResourceAsStream(s.substring(2))));
-				} else if (s.startsWith("%clamp%")) {
-					clampTexture = true;
-					img = readImage(texturePacks.getResourceAsStream(s.substring(7)));
-				} else if (s.startsWith("%blur%")) {
-					blurTexture = true;
-					img = readImage(texturePacks.getResourceAsStream(s.substring(6)));
-				} else {
-					img = readImage(texturePacks.getResourceAsStream(s));
-				}
-				getImageData(img, intArrayTextureData.get(s));
-				blurTexture = false;
-				clampTexture = false;
-			} catch (Exception ioexception1) {
-				ioexception1.printStackTrace();
-			}
+		for (BufferedTexture t : bufferedTextures) {
+			t.init();
+		}
+		for (Texture t : textureMap.values()) {
+			t.init();
 		}
 
 		Colors.loadColors();
@@ -719,40 +397,41 @@ public class RenderEngine {
         mc.worldRenderer.lightmapHelper.setup();
 	}
 
-	public void bindTexture(int i) {
-		if (i < 0) return;
-		glBindTexture(GL_TEXTURE_2D, i);
+	public void bindTexture(Texture texture) {
+		if (texture == null) return;
+		texture.bind();
 	}
-	
-	public Map<String, Integer> getTextureMap() {
-		return textureMap;
+
+	public void bindTexture(int textureID) {
+		if (textureID < 0) return;
+		GL11.glBindTexture(GL_TEXTURE_2D, textureID);
 	}
 
-	public boolean loadDownloadableTexture(String url, String localTexture, ImageParser imageParser) {
-		if(url == null) {
-			if(localTexture != null) {
-				bindTexture(getTexture(localTexture));
+	public boolean bindDownloadableTexture(String urlTexture, String backupTexture, ImageParser imageParser) {
+		if(urlTexture == null) {
+			if(backupTexture != null) {
+				bindTexture(loadTexture(backupTexture));
 				return true;
 			}else {
 				return false;
 			}
 		}
-		DownloadedTexture texture = downloadedTextures.get(url);
+		DownloadedTexture texture = downloadedTextures.get(urlTexture);
 		if(texture == null) {
-			texture = new DownloadedTexture(url, imageParser);
-			downloadedTextures.put(url, texture);
+			texture = new DownloadedTexture(urlTexture, imageParser);
+			downloadedTextures.put(urlTexture, texture);
 		}
-		if(texture.textureId < 0) {
+		if(!texture.isGenerated()) {
 			if(texture.image != null) {
-				texture.textureId = allocateAndSetupTexture(texture.image);
+				texture.generate();
+				texture.setupTexture(texture.image, false, false, false);
 			}
 		}
-		if(texture.textureId > 0) {
-			bindTexture(texture.textureId);
+		if(texture.bind()) {
 			return true;
 		}else {
-			if(localTexture != null) {
-				bindTexture(getTexture(localTexture));
+			if(backupTexture != null) {
+				bindTexture(loadTexture(backupTexture));
 				return true;
 			}else {
 				return false;
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index 7e9751ea6..1fdd7fd59 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -2,41 +2,41 @@ package net.minecraft.client.render;
 
 import net.minecraft.client.GLAllocation;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityFX;
-import net.minecraft.client.entity.fx.ParticleDispatcher;
+import net.minecraft.client.entity.particle.Particle;
+import net.minecraft.client.entity.particle.ParticleDispatcher;
 import net.minecraft.client.gui.GuiPhotoMode;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.option.enums.RenderDistance;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.block.model.BlockModelLeaves;
+import net.minecraft.client.render.block.model.LeavesBlockModel;
 import net.minecraft.client.render.camera.EntityCamera;
 import net.minecraft.client.render.camera.ICamera;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.render.culling.CameraFrustum;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.MusicDiscItem;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemRecord;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.BoundingVolume;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.AuroraProvider;
-import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 import org.lwjgl.opengl.ARBOcclusionQuery;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL15;
@@ -53,16 +53,16 @@ import static org.lwjgl.opengl.GL11.*;
 //            IWorldAccess, GLAllocation, RenderList, OpenGlCapsChecker, 
 //            Tessellator, World, RenderManager, RenderBlocks,
 //            Block, GameSettings, BlockLeaves, WorldRenderer, 
-//            Entity, MathHelper, EntitySorter, TileEntityRenderer, 
-//            ICamera, EntityLiving, TileEntity, RenderHelper, 
+//            Entity, MathHelper, EntitySorter, BlockEntityRenderer,
+//            ICamera, Mob, BlockEntity, RenderHelper,
 //            EntityRenderer, WorldProvider, Vec3D, RenderEngine, 
-//            RenderSorter, MovingObjectPosition, EntityPlayer, EnumMovingObjectType, 
-//            AxisAlignedBB, GuiIngame, SoundManager, EntityBubbleFX, 
+//            RenderSorter, MovingObjectPosition, Player, EnumMovingObjectType,
+//            AxisAlignedBB, GuiIngame, SoundEngine, EntityBubbleFX,
 //            EffectRenderer, EntitySmokeFX, EntityNoteFX, EntityPortalFX, 
 //            EntityExplodeFX, EntityFlameFX, EntityLavaFX, EntityFootStepFX, 
 //            EntitySplashFX, EntityReddustFX, EntityItemFX, Item,
 //            EntitySnowShovelFX, EntityHeartFX, ImageBufferDownload, StepSound, 
-//            ItemRecord, ItemStack
+//            MusicDiscItem, ItemStack
 
 public class RenderGlobal
     implements LevelListener
@@ -165,7 +165,7 @@ public class RenderGlobal
             double d11 = java.lang.Math.atan2(java.lang.Math.sqrt(d * d + d2 * d2), d1);
             double d12 = java.lang.Math.sin(d11);
             double d13 = java.lang.Math.cos(d11);
-            double d14 = random.nextDouble() * 3.1415926535897931D * 2D;
+            double d14 = random.nextDouble() * Math.PI * 2D;
             double d15 = java.lang.Math.sin(d14);
             double d16 = java.lang.Math.cos(d14);
             for(int j = 0; j < 4; j++)
@@ -218,7 +218,7 @@ public class RenderGlobal
         deleteRenderListBase();
         glRenderListBase = GLAllocation.generateDisplayLists(RENDER_LIST_BASE_WIDTH * RENDER_LIST_BASE_WIDTH * RENDER_LIST_BASE_WIDTH * 3);
 
-        BlockModelLeaves.setGraphicsLevel(mc.gameSettings.fancyGraphics.value == 1);
+        LeavesBlockModel.setGraphicsLevel(mc.gameSettings.fancyGraphics.value == 1);
         renderDistance = mc.gameSettings.renderDistance.value;
         if (worldObj == null) return;
 
@@ -227,7 +227,7 @@ public class RenderGlobal
         {
             for (ChunkRenderer chunkRenderer : chunkRenderers)
             {
-                chunkRenderer.reset();
+                chunkRenderer.delete();
             }
         }
         int renderDiameterBlocks = renderDistance.chunks * 16 * 2;
@@ -250,7 +250,7 @@ public class RenderGlobal
         maxBlockZ = renderChunksDeep;
         for (ChunkRenderer cr : chunkRenderersToUpdate)
         {
-            cr.needsUpdate = false;
+            cr.dirty = false;
         }
 
         chunkRenderersToUpdate.clear();
@@ -262,16 +262,16 @@ public class RenderGlobal
                 for(int z = 0; z < renderChunksDeep; z++)
                 {
                     int index = (z * renderChunksTall + y) * renderChunksWide + x;
-                    chunkRenderers[index] = new ChunkRenderer(renderEngine, worldObj, tileEntities, x * RENDER_CHUNK_SIZE, y * RENDER_CHUNK_SIZE, z * RENDER_CHUNK_SIZE, RENDER_CHUNK_SIZE, glRenderListBase + renderListOffset);
+                    chunkRenderers[index] = new ChunkRenderer(worldObj, tileEntities, x * RENDER_CHUNK_SIZE, y * RENDER_CHUNK_SIZE, z * RENDER_CHUNK_SIZE, RENDER_CHUNK_SIZE, glRenderListBase + renderListOffset);
                     if(occlusionEnabled)
                     {
-                        chunkRenderers[index].glOcclusionQuery = glOcclusionQueryBase.get(chunkIndex);
+                        chunkRenderers[index].occlusionId = glOcclusionQueryBase.get(chunkIndex);
                     }
-                    chunkRenderers[index].isWaitingOnOcclusionQuery = false;
-                    chunkRenderers[index].isVisible = true;
-                    chunkRenderers[index].isInFrustum = true;
-                    chunkRenderers[index].chunkIndex = chunkIndex++;
-                    chunkRenderers[index].markDirty();
+                    chunkRenderers[index].occlusionQuerying = false;
+                    chunkRenderers[index].occlusionVisible = true;
+                    chunkRenderers[index].visible = true;
+                    chunkRenderers[index].id = chunkIndex++;
+                    chunkRenderers[index].setDirty();
                     sortedChunkRenderers[index] = chunkRenderers[index];
                     chunkRenderersToUpdate.add(chunkRenderers[index]);
                     renderListOffset += ChunkRenderer.MAX_RENDER_PASSES + 1;
@@ -285,7 +285,7 @@ public class RenderGlobal
         {
             if (mc.activeCamera != null)
             {
-                markRenderersForNewPosition(MathHelper.floor_double(mc.activeCamera.getX()), MathHelper.floor_double(mc.activeCamera.getY()), MathHelper.floor_double(mc.activeCamera.getZ()));
+                markRenderersForNewPosition(MathHelper.floor(mc.activeCamera.getX()), MathHelper.floor(mc.activeCamera.getY()), MathHelper.floor(mc.activeCamera.getZ()));
                 Arrays.sort(sortedChunkRenderers, new CameraSorter(mc.activeCamera));
             }
         }
@@ -351,7 +351,7 @@ public class RenderGlobal
         double rotationX = Math.cos(((cameraYaw * Math.PI) / 180D));
         double rotationZ = Math.sin(((cameraYaw * Math.PI) / 180D));
 
-        renderEngine.bindTexture(renderEngine.getTexture("%blur%/environment/aurora.png"));
+        renderEngine.bindTexture(renderEngine.loadTexture("/assets/minecraft/textures/environment/aurora.png"));
         double time = worldObj.getWorldTime() + partialTick;
         AuroraProvider aurora = worldObj.auroraProvider;
 
@@ -413,7 +413,7 @@ public class RenderGlobal
             renderEntitiesStartupCounter--;
             return;
         }
-        TileEntityRenderDispatcher.instance.cacheActiveRenderInfo(worldObj, renderEngine, mc.fontRenderer, camera, partialTick);
+        BlockEntityRenderDispatcher.instance.cacheActiveRenderInfo(worldObj, renderEngine, mc.fontRenderer, camera, partialTick);
         EntityRenderDispatcher.instance.cacheActiveRenderInfo(worldObj, renderEngine, mc.fontRenderer, camera, mc.gameSettings, partialTick);
         countEntitiesTotal = 0;
         countEntitiesRendered = 0;
@@ -421,9 +421,9 @@ public class RenderGlobal
         EntityRenderDispatcher.renderPosX = camera.getX(partialTick);
         EntityRenderDispatcher.renderPosY = camera.getY(partialTick);
         EntityRenderDispatcher.renderPosZ = camera.getZ(partialTick);
-        TileEntityRenderDispatcher.renderPosX = camera.getX(partialTick);
-        TileEntityRenderDispatcher.renderPosY = camera.getY(partialTick);
-        TileEntityRenderDispatcher.renderPosZ = camera.getZ(partialTick);
+        BlockEntityRenderDispatcher.renderPosX = camera.getX(partialTick);
+        BlockEntityRenderDispatcher.renderPosY = camera.getY(partialTick);
+        BlockEntityRenderDispatcher.renderPosZ = camera.getZ(partialTick);
         List<Entity> loadedEntities = worldObj.getLoadedEntityList();
         countEntitiesTotal = loadedEntities.size();
         Tessellator tessellator = Tessellator.instance;
@@ -432,7 +432,7 @@ public class RenderGlobal
         {
             Entity entity = worldObj.weatherEffects.get(i);
             countEntitiesRendered++;
-            if(entity.shouldRender(camera.getPosition(partialTick)))
+            if(entity.shouldRender(camera.getPosition(partialTick)) || mc.thePlayer.vehicle == entity)
             {
                 EntityRenderDispatcher.instance.renderEntity(tessellator, entity, partialTick);
             }
@@ -442,18 +442,18 @@ public class RenderGlobal
         for (int i = 0; i < loadedEntities.size(); i++)
         {
             Entity entity = loadedEntities.get(i);
-            if (mc.activeCamera != null && mc.activeCamera instanceof EntityCamera && ((EntityCamera) mc.activeCamera).entity == entity)
+            if (mc.activeCamera != null && mc.activeCamera instanceof EntityCamera && ((EntityCamera) mc.activeCamera).mob == entity)
             {
                 if (!mc.activeCamera.showPlayer())
                 {
                     continue;
                 }
             }
-            if (!entity.shouldRender(camera.getPosition(partialTick)) || !entity.ignoreFrustumCheck && !camera.getFrustum().isVisible(entity.bb, partialTick))
+            if (mc.thePlayer.vehicle != entity && (!entity.shouldRender(camera.getPosition(partialTick)) || !entity.ignoreFrustumCheck && !camera.getFrustum().isVisible(entity.bb, partialTick)))
             {
                 continue;
             }
-            int floorY = MathHelper.floor_double(entity.y);
+            int floorY = MathHelper.floor(entity.y);
             if (floorY < 0)
             {
                 floorY = 0;
@@ -463,16 +463,16 @@ public class RenderGlobal
                 floorY = worldObj.getHeightBlocks() - 1;
 
             }
-            if (worldObj.isBlockLoaded(MathHelper.floor_double(entity.x), floorY, MathHelper.floor_double(entity.z)))
+            if (worldObj.isBlockLoaded(MathHelper.floor(entity.x), floorY, MathHelper.floor(entity.z)) || mc.thePlayer.vehicle == entity)
             {
                 countEntitiesRendered++;
                 EntityRenderDispatcher.instance.renderEntity(tessellator, entity, partialTick);
             }
         }
 
-        for (TileEntity tileEntity : tileEntities)
+        for (BlockEntity blockEntity : tileEntities)
         {
-            TileEntityRenderDispatcher.instance.renderTileEntity(tessellator, tileEntity, partialTick);
+            BlockEntityRenderDispatcher.instance.renderTileEntity(tessellator, blockEntity, partialTick);
         }
     }
 
@@ -547,9 +547,9 @@ public class RenderGlobal
                         maxBlockY = i3;
                     }
                     ChunkRenderer worldrenderer = chunkRenderers[(i2 * renderChunksTall + l2) * renderChunksWide + j1];
-                    boolean flag = worldrenderer.needsUpdate;
-                    worldrenderer.setPosition(k1, i3, j2);
-                    if(!flag && worldrenderer.needsUpdate)
+                    boolean flag = worldrenderer.dirty;
+                    worldrenderer.setPos(k1, i3, j2);
+                    if(!flag && worldrenderer.dirty)
                     {
                         chunkRenderersToUpdate.add(worldrenderer);
                     }
@@ -567,7 +567,7 @@ public class RenderGlobal
         {
             worldRenderersCheckIndex = (worldRenderersCheckIndex + 1) % chunkRenderers.length;
             ChunkRenderer chunkRenderer = chunkRenderers[worldRenderersCheckIndex];
-            if(chunkRenderer.needsUpdate && !chunkRenderersToUpdate.contains(chunkRenderer))
+            if(chunkRenderer.dirty && !chunkRenderersToUpdate.contains(chunkRenderer))
             {
                 chunkRenderersToUpdate.add(chunkRenderer);
             }
@@ -596,7 +596,7 @@ public class RenderGlobal
             prevSortX = camera.getX();
             prevSortY = camera.getY();
             prevSortZ = camera.getZ();
-            markRenderersForNewPosition(MathHelper.floor_double(camera.getX()), MathHelper.floor_double(camera.getY()), MathHelper.floor_double(camera.getZ()));
+            markRenderersForNewPosition(MathHelper.floor(camera.getX()), MathHelper.floor(camera.getY()), MathHelper.floor(camera.getZ()));
             Arrays.sort(sortedChunkRenderers, new CameraSorter(camera));
         }
         Lighting.disable();
@@ -608,7 +608,7 @@ public class RenderGlobal
             checkOcclusionQueryResult(min, max);
             for(int i = min; i < max; i++)
             {
-                sortedChunkRenderers[i].isVisible = true;
+                sortedChunkRenderers[i].occlusionVisible = true;
             }
 
             k += renderSortedRenderers(min, max, renderPass, partialTick);
@@ -620,10 +620,10 @@ public class RenderGlobal
                 {
                     max = sortedChunkRenderers.length;
                 }
-                GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
-                GL11.glDisable(2896 /*GL_LIGHTING*/);
-                GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
-                GL11.glDisable(2912 /*GL_FOG*/);
+                GL11.glDisable(GL11.GL_TEXTURE_2D);
+                GL11.glDisable(GL11.GL_LIGHTING);
+                GL11.glDisable(GL11.GL_ALPHA_TEST);
+                GL11.glDisable(GL11.GL_FOG);
                 GL11.glColorMask(false, false, false, false);
                 GL11.glDepthMask(false);
                 checkOcclusionQueryResult(byte0, max);
@@ -633,16 +633,16 @@ public class RenderGlobal
                 float f2 = 0.0F;
                 for(int k1 = byte0; k1 < max; k1++)
                 {
-                    if(sortedChunkRenderers[k1].skipAllRenderPasses())
+                    if(sortedChunkRenderers[k1].isEmpty())
                     {
-                        sortedChunkRenderers[k1].isInFrustum = false;
+                        sortedChunkRenderers[k1].visible = false;
                         continue;
                     }
-                    if(!sortedChunkRenderers[k1].isInFrustum)
+                    if(!sortedChunkRenderers[k1].visible)
                     {
-                        sortedChunkRenderers[k1].isVisible = true;
+                        sortedChunkRenderers[k1].occlusionVisible = true;
                     }
-                    if(!sortedChunkRenderers[k1].isInFrustum || sortedChunkRenderers[k1].isWaitingOnOcclusionQuery)
+                    if(!sortedChunkRenderers[k1].visible || sortedChunkRenderers[k1].occlusionQuerying)
                     {
                         continue;
                     }
@@ -653,9 +653,9 @@ public class RenderGlobal
                         continue;
                     }
                     ChunkRenderer worldrenderer1 = sortedChunkRenderers[k1];
-                    float f4 = (float)((double)worldrenderer1.posXMinus - entityPosX);
-                    float f5 = (float)((double)worldrenderer1.posYMinus - entityPosY);
-                    float f6 = (float)((double)worldrenderer1.posZMinus - entityPosZ);
+                    float f4 = (float)((double)worldrenderer1.xRender - entityPosX);
+                    float f5 = (float)((double)worldrenderer1.yRender - entityPosY);
+                    float f6 = (float)((double)worldrenderer1.zRender - entityPosZ);
                     float f7 = f4 - f;
                     float f8 = f5 - f1;
                     float f9 = f6 - f2;
@@ -666,18 +666,18 @@ public class RenderGlobal
                         f1 += f8;
                         f2 += f9;
                     }
-                    ARBOcclusionQuery.glBeginQueryARB(35092 /*GL_SAMPLES_PASSED_ARB*/, sortedChunkRenderers[k1].glOcclusionQuery);
-                    sortedChunkRenderers[k1].callOcclusionQueryList();
+                    ARBOcclusionQuery.glBeginQueryARB(35092 /*GL_SAMPLES_PASSED_ARB*/, sortedChunkRenderers[k1].occlusionId);
+                    sortedChunkRenderers[k1].renderBB();
                     ARBOcclusionQuery.glEndQueryARB(35092 /*GL_SAMPLES_PASSED_ARB*/);
-                    sortedChunkRenderers[k1].isWaitingOnOcclusionQuery = true;
+                    sortedChunkRenderers[k1].occlusionQuerying = true;
                 }
 
                 GL11.glPopMatrix();
                 GL11.glColorMask(true, true, true, true);
                 GL11.glDepthMask(true);
-                GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
-                GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
-                GL11.glEnable(2912 /*GL_FOG*/);
+                GL11.glEnable(GL11.GL_TEXTURE_2D);
+                GL11.glEnable(GL11.GL_ALPHA_TEST);
+                GL11.glEnable(GL11.GL_FOG);
                 k += renderSortedRenderers(byte0, max, renderPass, partialTick);
             } while(max < sortedChunkRenderers.length);
         }
@@ -692,18 +692,18 @@ public class RenderGlobal
     {
         for(int i = min; i < max; i++)
         {
-            if(!sortedChunkRenderers[i].isWaitingOnOcclusionQuery)
+            if(!sortedChunkRenderers[i].occlusionQuerying)
             {
                 continue;
             }
             occlusionResult.clear();
-            ARBOcclusionQuery.glGetQueryObjectuARB(sortedChunkRenderers[i].glOcclusionQuery, GL15.GL_QUERY_RESULT_AVAILABLE, occlusionResult);
+            ARBOcclusionQuery.glGetQueryObjectuivARB(sortedChunkRenderers[i].occlusionId, GL15.GL_QUERY_RESULT_AVAILABLE, occlusionResult);
             if(occlusionResult.get(0) != 0)
             {
-                sortedChunkRenderers[i].isWaitingOnOcclusionQuery = false;
+                sortedChunkRenderers[i].occlusionQuerying = false;
                 occlusionResult.clear();
-                ARBOcclusionQuery.glGetQueryObjectuARB(sortedChunkRenderers[i].glOcclusionQuery, GL15.GL_QUERY_RESULT, occlusionResult);
-                sortedChunkRenderers[i].isVisible = occlusionResult.get(0) != 0;
+                ARBOcclusionQuery.glGetQueryObjectuivARB(sortedChunkRenderers[i].occlusionId, GL15.GL_QUERY_RESULT, occlusionResult);
+                sortedChunkRenderers[i].occlusionVisible = occlusionResult.get(0) != 0;
             }
         }
 
@@ -718,15 +718,15 @@ public class RenderGlobal
             if(renderPass == 0)
             {
                 renderersLoaded++;
-                if(sortedChunkRenderers[i].skipRenderPass[renderPass])
+                if(sortedChunkRenderers[i].empty[renderPass])
                 {
                     renderersSkippingRenderPass++;
                 }
-                else if (!sortedChunkRenderers[i].isInFrustum)
+                else if (!sortedChunkRenderers[i].visible)
                 {
                     renderersBeingClipped++;
                 }
-                else if (occlusionEnabled && !sortedChunkRenderers[i].isVisible)
+                else if (occlusionEnabled && !sortedChunkRenderers[i].occlusionVisible)
                 {
                     renderersBeingOccluded++;
                 } else
@@ -734,11 +734,11 @@ public class RenderGlobal
                     renderersBeingRendered++;
                 }
             }
-            if(sortedChunkRenderers[i].skipRenderPass[renderPass] || !sortedChunkRenderers[i].isInFrustum || occlusionEnabled && !sortedChunkRenderers[i].isVisible)
+            if(sortedChunkRenderers[i].empty[renderPass] || !sortedChunkRenderers[i].visible || occlusionEnabled && !sortedChunkRenderers[i].occlusionVisible)
             {
                 continue;
             }
-            int callList = sortedChunkRenderers[i].getGLCallListForPass(renderPass);
+            int callList = sortedChunkRenderers[i].getList(renderPass);
             if(callList >= 0)
             {
                 glRenderLists.add(sortedChunkRenderers[i]);
@@ -760,7 +760,7 @@ public class RenderGlobal
             int displayListIndex = -1;
             for (int i = 0; i < k1; i++)
             {
-                if (allDisplayLists[i].isSetToPos(chunkRenderer.posXMinus, chunkRenderer.posYMinus, chunkRenderer.posZMinus))
+                if (allDisplayLists[i].isSetToPos(chunkRenderer.xRender, chunkRenderer.yRender, chunkRenderer.zRender))
                 {
                     displayListIndex = i;
                 }
@@ -769,9 +769,9 @@ public class RenderGlobal
             if (displayListIndex < 0)
             {
                 displayListIndex = k1++;
-                allDisplayLists[displayListIndex].setToPos(chunkRenderer.posXMinus, chunkRenderer.posYMinus, chunkRenderer.posZMinus, posX, posY, posZ);
+                allDisplayLists[displayListIndex].setToPos(chunkRenderer.xRender, chunkRenderer.yRender, chunkRenderer.zRender, posX, posY, posZ);
             }
-            allDisplayLists[displayListIndex].addCallToList(chunkRenderer.getGLCallListForPass(renderPass));
+            allDisplayLists[displayListIndex].addCallToList(chunkRenderer.getList(renderPass));
         }
 
         if (!mc.gameSettings.fog.value)
@@ -826,10 +826,10 @@ public class RenderGlobal
         }
         float celestialAngle = worldObj.getCelestialAngle(partialTick);
         GL11.glDisable(GL_TEXTURE_2D);
-        Vec3d skyColor = worldObj.getSkyColor(mc.activeCamera, partialTick);
-        float r = (float)skyColor.xCoord;
-        float g = (float)skyColor.yCoord;
-        float b = (float)skyColor.zCoord;
+        Vec3 skyColor = worldObj.getSkyColor(mc.activeCamera, partialTick);
+        float r = (float)skyColor.x;
+        float g = (float)skyColor.y;
+        float b = (float)skyColor.z;
         GL11.glColor3f(r, g, b);
         Tessellator t = Tessellator.instance;
         GL11.glDepthMask(false);
@@ -873,8 +873,8 @@ public class RenderGlobal
         GL11.glEnable(GL_TEXTURE_2D);
         GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
         GL11.glPushMatrix();
-        float sunAlpha = 1.0F - (worldObj.getCurrentWeather() != null && worldObj.getCurrentWeather() != Weather.overworldClear ? (worldObj.weatherManager.getWeatherIntensity() * worldObj.weatherManager.getWeatherPower()) * 1.5f : 0.0f);
-        if (!mc.gameSettings.fog.value && worldObj.getCurrentWeather() == Weather.overworldFog)
+        float sunAlpha = 1.0F - (worldObj.getCurrentWeather() != null && worldObj.getCurrentWeather() != Weathers.OVERWORLD_CLEAR ? (worldObj.weatherManager.getWeatherIntensity() * worldObj.weatherManager.getWeatherPower()) * 1.5f : 0.0f);
+        if (!mc.gameSettings.fog.value && worldObj.getCurrentWeather() == Weathers.OVERWORLD_FOG)
         {
             sunAlpha = 1f;
         }
@@ -888,7 +888,7 @@ public class RenderGlobal
 
         // Render sun
         float f15 = 30F;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, renderEngine.getTexture("/terrain/sun.png"));
+        renderEngine.loadTexture("/terrain/sun.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, sunAlpha);
         t.startDrawingQuads();
         t.addVertexWithUV(-f15, 100D, -f15, 0.0D, 0.0D);
@@ -899,7 +899,7 @@ public class RenderGlobal
 
         // Render moon
         f15 = 20F;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, renderEngine.getTexture("/terrain/moon.png"));
+        renderEngine.loadTexture("/terrain/moon.png").bind();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, sunAlpha);
         t.startDrawingQuads();
         t.addVertexWithUV(-f15, -100D, f15, 1.0D, 1.0D);
@@ -908,7 +908,7 @@ public class RenderGlobal
         t.addVertexWithUV(-f15, -100D, -f15, 1.0D, 0.0D);
         t.draw();
 
-        GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glDisable(GL11.GL_TEXTURE_2D);
         float f17 = worldObj.getStarBrightness(partialTick) * sunAlpha;
         if(f17 > 0.0F)
         {
@@ -916,9 +916,9 @@ public class RenderGlobal
             GL11.glCallList(starGLCallList);
         }
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
-        GL11.glEnable(2912 /*GL_FOG*/);
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_ALPHA_TEST);
+        GL11.glEnable(GL11.GL_FOG);
         GL11.glPopMatrix();
         if(worldObj.worldType.hasGround())
         {
@@ -927,7 +927,7 @@ public class RenderGlobal
         {
             GL11.glColor3f(r, g, b);
         }
-        GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
         GL11.glDepthMask(true);
     }
 
@@ -950,23 +950,23 @@ public class RenderGlobal
             renderCloudsFancy(partialTick);
             return;
         }
-        GL11.glDisable(2884 /*GL_CULL_FACE*/);
+        GL11.glDisable(GL11.GL_CULL_FACE);
         float cameraY = (float) mc.activeCamera.getY(partialTick);
         byte cloudRadius = 32;
         int i = 256 / cloudRadius;
         Tessellator tessellator = Tessellator.instance;
-        GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, renderEngine.getTexture("/environment/clouds.png"));
-        GL11.glEnable(3042 /*GL_BLEND*/);
+        renderEngine.loadTexture("/assets/minecraft/textures/environment/clouds.png").bind();
+        GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        Vec3d dimensionColor = worldObj.getDimensionColor(mc.activeCamera, partialTick);
-        float r = (float)dimensionColor.xCoord;
-        float g = (float)dimensionColor.yCoord;
-        float b = (float)dimensionColor.zCoord;
+        Vec3 dimensionColor = worldObj.getDimensionColor(mc.activeCamera, partialTick);
+        float r = (float)dimensionColor.x;
+        float g = (float)dimensionColor.y;
+        float b = (float)dimensionColor.z;
         float f6 = 1f / 2048f;
         double posX = mc.activeCamera.getX(partialTick) + (double)((lastCloudOffsetX + (cloudOffsetX - lastCloudOffsetX) * partialTick) * 0.03F);
         double posZ = mc.activeCamera.getZ(partialTick) + (double)((lastCloudOffsetZ + (cloudOffsetZ - lastCloudOffsetZ) * partialTick) * 0.03F);
-        int j = MathHelper.floor_double(posX / 2048D);
-        int k = MathHelper.floor_double(posZ / 2048D);
+        int j = MathHelper.floor(posX / 2048D);
+        int k = MathHelper.floor(posZ / 2048D);
         posX -= j * 2048;
         posZ -= k * 2048;
         float cloudHeight = (worldObj.worldType.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
@@ -988,8 +988,8 @@ public class RenderGlobal
 
         tessellator.draw();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glEnable(2884 /*GL_CULL_FACE*/);
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_CULL_FACE);
     }
 
     public void renderCloudsFancy(float partialTick)
@@ -1006,10 +1006,10 @@ public class RenderGlobal
             aSun = sunriseColor[3] / 2;
         }
 
-        Vec3d dimensionColor = worldObj.getDimensionColor(mc.activeCamera, partialTick);
-        final float rDim = (float)dimensionColor.xCoord;
-        final float gDim = (float)dimensionColor.yCoord;
-        final float bDim = (float)dimensionColor.zCoord;
+        Vec3 dimensionColor = worldObj.getDimensionColor(mc.activeCamera, partialTick);
+        final float rDim = (float)dimensionColor.x;
+        final float gDim = (float)dimensionColor.y;
+        final float bDim = (float)dimensionColor.z;
 
         GL11.glDisable(GL11.GL_CULL_FACE);
         float cameraY = (float) mc.activeCamera.getY(partialTick);
@@ -1019,18 +1019,18 @@ public class RenderGlobal
         double dx = (mc.activeCamera.getX(partialTick) + (double)((lastCloudOffsetX + (cloudOffsetX - lastCloudOffsetX) * partialTick) * 0.03F)) / (double)cloudWidth;
         double dz = (mc.activeCamera.getZ(partialTick) + (double)((lastCloudOffsetZ + (cloudOffsetZ - lastCloudOffsetZ) * partialTick) * 0.03F)) / (double)cloudWidth + 0.33D;
         float dy = (worldObj.worldType.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
-        int i = MathHelper.floor_double(dx / 2048D);
-        int j = MathHelper.floor_double(dz / 2048D);
+        int i = MathHelper.floor(dx / 2048D);
+        int j = MathHelper.floor(dz / 2048D);
         dx -= i * 2048;
         dz -= j * 2048;
-        GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderEngine.getTexture("/environment/clouds.png"));
+        renderEngine.loadTexture("/assets/minecraft/textures/environment/clouds.png").bind();
         GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
         float f13 = 1F / 256F;
-        float f9 = (float) MathHelper.floor_double(dx) * f13;
-        float f11 = (float) MathHelper.floor_double(dz) * f13;
-        float f14 = (float)(dx - (double) MathHelper.floor_double(dx));
-        float f15 = (float)(dz - (double) MathHelper.floor_double(dz));
+        float f9 = (float) MathHelper.floor(dx) * f13;
+        float f11 = (float) MathHelper.floor(dz) * f13;
+        float f14 = (float)(dx - (double) MathHelper.floor(dx));
+        float f15 = (float)(dz - (double) MathHelper.floor(dz));
         int cloudWidthScale = 8;
         byte radius = 3;
         float f16 = 1F / 1024F;
@@ -1136,8 +1136,8 @@ public class RenderGlobal
         }
 
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glEnable(2884 /*GL_CULL_FACE*/);
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_CULL_FACE);
         
     	mc.renderer.endRenderClouds(partialTick);
     }
@@ -1179,20 +1179,20 @@ public class RenderGlobal
                 rendererList.sort(comparator);
             }
             for (ChunkRenderer renderer : rendererList){
-                renderer.updateRenderer();
-                renderer.needsUpdate = false;
+                renderer.rebuild();
+                renderer.dirty = false;
             }
         }
         int renderersUpdated = 0;
         for(int layer = numLayers - 1; layer >= 0; layer--) {
             ChunkRenderer renderer = chunkRenderers[layer];
             if(renderer == null) { continue; }
-            if(!renderer.isInFrustum && layer != numLayers - 1) {
+            if(!renderer.visible && layer != numLayers - 1) {
                 chunkRenderers[layer] = null;
                 break;
             }
-            renderer.updateRenderer();
-            renderer.needsUpdate = false;
+            renderer.rebuild();
+            renderer.dirty = false;
             renderersUpdated++;
         }
 
@@ -1222,19 +1222,19 @@ public class RenderGlobal
     public void drawBlockBreaking(ICamera camera, HitResult hitResult, float partialTick)
     {
         Tessellator tessellator = Tessellator.instance;
-        GL11.glEnable(3042 /*GL_BLEND*/);
-        GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_ALPHA_TEST);
         GL11.glBlendFunc(770, 1);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)System.currentTimeMillis() / 100F) * 0.2F + 0.4F) * 0.5F);
         if(damagePartialTime > 0.0F)
         {
             GL11.glBlendFunc(774, 768);
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F);
             GL11.glPushMatrix();
             int k = worldObj.getBlockId(hitResult.x, hitResult.y, hitResult.z);
             Block block = k <= 0 ? null : Block.blocksList[k];
-            GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
+            GL11.glDisable(GL11.GL_ALPHA_TEST);
             GL11.glPolygonOffset(-3F, -3F);
             GL11.glEnable(32823 /*GL_POLYGON_OFFSET_FILL*/);
             double x = camera.getX(partialTick);
@@ -1242,9 +1242,9 @@ public class RenderGlobal
             double z = camera.getZ(partialTick);
             if(block == null)
             {
-                block = Block.stone;
+                block = Blocks.STONE;
             }
-            GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
+            GL11.glEnable(GL11.GL_ALPHA_TEST);
             tessellator.startDrawingQuads();
             tessellator.setTranslation(-x, -y, -z);
             tessellator.lockColor();
@@ -1252,27 +1252,27 @@ public class RenderGlobal
             BlockModelDispatcher.getInstance().getDispatch(block).renderWithOverrideTexture(tessellator, hitResult.x, hitResult.y, hitResult.z, breakingAnimation[MathHelper.clamp((int)(damagePartialTime * 10F), 0, breakingAnimation.length)] );
             tessellator.draw();
             tessellator.setTranslation(0.0D, 0.0D, 0.0D);
-            GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
+            GL11.glDisable(GL11.GL_ALPHA_TEST);
             GL11.glPolygonOffset(0.0F, 0.0F);
             GL11.glDisable(32823 /*GL_POLYGON_OFFSET_FILL*/);
-            GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
+            GL11.glEnable(GL11.GL_ALPHA_TEST);
             GL11.glDepthMask(true);
             GL11.glPopMatrix();
         }
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glDisable(GL11.GL_ALPHA_TEST);
     }
 
     public void drawSelectionBox(ICamera camera, HitResult hitResult, float partialTick)
     {
         if (mc.gameSettings.immersiveMode.drawOutline() && mc.gameSettings.blockOutlineWidth.value > 0.01f && !(mc.currentScreen instanceof GuiModelViewer))
         {
-            GL11.glEnable(3042 /*GL_BLEND*/);
+            GL11.glEnable(GL11.GL_BLEND);
             GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
             float w = mc.getOutlineWidth();
             GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.35f + w * 0.3f);
             GL11.glLineWidth(java.lang.Math.max(4.0f * w * 2.0f, 1.0f));
-            GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
+            GL11.glDisable(GL11.GL_TEXTURE_2D);
             GL11.glDepthMask(false);
             double offsetX = camera.getX(partialTick);
             double offsetY = camera.getY(partialTick);
@@ -1292,7 +1292,7 @@ public class RenderGlobal
                     else
                     {
                         Block.blocksList[j].setBlockBoundsBasedOnState(worldObj, hitResult.x, hitResult.y, hitResult.z);
-                        drawOutlinedBoundingBox(Block.blocksList[j].getSelectedBoundingBoxFromPool(worldObj, hitResult.x, hitResult.y, hitResult.z).expand(expand, expand, expand).getOffsetBoundingBox(-offsetX, -offsetY, -offsetZ));
+                        drawOutlinedBoundingBox(Block.blocksList[j].getSelectedBoundingBoxFromPool(worldObj, hitResult.x, hitResult.y, hitResult.z).grow(expand, expand, expand).cloneMove(-offsetX, -offsetY, -offsetZ));
                     }
                 }
             }
@@ -1302,8 +1302,8 @@ public class RenderGlobal
             }
 
             GL11.glDepthMask(true);
-            GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
-            GL11.glDisable(3042 /*GL_BLEND*/);
+            GL11.glEnable(GL11.GL_TEXTURE_2D);
+            GL11.glDisable(GL11.GL_BLEND);
         }
     }
     
@@ -1315,10 +1315,10 @@ public class RenderGlobal
 		double offsetY = camera.getY(partialTicks);
 		double offsetZ = camera.getZ(partialTicks);
 		float expand = 0.002F;
-		List<AABB> collidingBoundingBoxes = worldObj.getCubes(mc.thePlayer, mc.thePlayer.bb.expand(expand, expand, expand));
+		List<AABB> collidingBoundingBoxes = worldObj.getCubes(mc.thePlayer, mc.thePlayer.bb.grow(expand, expand, expand));
 		glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 		for (AABB aabb : collidingBoundingBoxes) {
-			drawOutlinedBoundingBox(aabb.getOffsetBoundingBox(-offsetX, -offsetY, -offsetZ).expand(expand, expand, expand));
+			drawOutlinedBoundingBox(aabb.cloneMove(-offsetX, -offsetY, -offsetZ).grow(expand, expand, expand));
 		}
 
 		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
@@ -1326,7 +1326,7 @@ public class RenderGlobal
 		if(mc.thePlayer.getGamemode() == Gamemode.creative) {
 			entityRadius = 100.0f;
 		}
-		List<Entity> entitiesNearby = worldObj.getEntitiesWithinAABBExcludingEntity(mc.thePlayer, mc.thePlayer.bb.expand(entityRadius, entityRadius, entityRadius));
+		List<Entity> entitiesNearby = worldObj.getEntitiesWithinAABBExcludingEntity(mc.thePlayer, mc.thePlayer.bb.grow(entityRadius, entityRadius, entityRadius));
 		for (Entity e : entitiesNearby) {
 			drawInterpolatedEntityBoundingBox(e, camera, partialTicks);
 		}
@@ -1343,10 +1343,10 @@ public class RenderGlobal
         double lerpOffsetY = entity.yo + (entity.y - entity.yo) * partialTicks;
         double lerpOffsetZ = entity.zo + (entity.z - entity.zo) * partialTicks;
         AABB boundingBox = entity.bb;
-        boundingBox = boundingBox.expand(expand, expand, expand);
-        boundingBox = boundingBox.getOffsetBoundingBox(-entity.x, -entity.y, -entity.z);
-        boundingBox = boundingBox.getOffsetBoundingBox(-cameraX, -cameraY, -cameraZ);
-        boundingBox = boundingBox.getOffsetBoundingBox(lerpOffsetX, lerpOffsetY, lerpOffsetZ);
+        boundingBox = boundingBox.grow(expand, expand, expand);
+        boundingBox = boundingBox.cloneMove(-entity.x, -entity.y, -entity.z);
+        boundingBox = boundingBox.cloneMove(-cameraX, -cameraY, -cameraZ);
+        boundingBox = boundingBox.cloneMove(lerpOffsetX, lerpOffsetY, lerpOffsetZ);
         drawOutlinedBoundingBox(boundingBox);
     }
 
@@ -1361,8 +1361,8 @@ public class RenderGlobal
 		Tessellator tessellator = Tessellator.instance;
 		tessellator.setTranslation(-offsetX, -offsetY, -offsetZ);
 		
-		int blockX = MathHelper.floor_double(mc.thePlayer.x);
-		int blockZ = MathHelper.floor_double(mc.thePlayer.z);
+		int blockX = MathHelper.floor(mc.thePlayer.x);
+		int blockZ = MathHelper.floor(mc.thePlayer.z);
 
 		int chunkX = blockX >> 4;
         int chunkZ = blockZ >> 4;
@@ -1513,10 +1513,10 @@ public class RenderGlobal
                     }
                     int i = (realWrZ * renderChunksTall + realWrY) * renderChunksWide + realWrX;
                     ChunkRenderer worldrenderer = chunkRenderers[i];
-                    if(!worldrenderer.needsUpdate)
+                    if(!worldrenderer.dirty)
                     {
                         chunkRenderersToUpdate.add(worldrenderer);
-                        worldrenderer.markDirty();
+                        worldrenderer.setDirty();
                     }
                 }
             }
@@ -1539,9 +1539,9 @@ public class RenderGlobal
     {
         for(int i = 0; i < chunkRenderers.length; i++)
         {
-            if(!chunkRenderers[i].skipAllRenderPasses() && (!chunkRenderers[i].isInFrustum || (i + frustumCheckOffset & 0xf) == 0))
+            if(!chunkRenderers[i].isEmpty() && (!chunkRenderers[i].visible || (i + frustumCheckOffset & 0xf) == 0))
             {
-                chunkRenderers[i].updateInFrustum(frustum, partialTick);
+                chunkRenderers[i].cull(frustum, partialTick);
             }
         }
 
@@ -1573,7 +1573,7 @@ public class RenderGlobal
         }
         if(mc.activeCamera.distanceToSqr(x, y, z) < (double)(soundDistance * soundDistance))
         {
-            mc.sndManager.playSound(soundPath, category, (float)x, (float)y, (float)z, volume, pitch);
+            mc.sndManager.playSoundAt(soundPath, category, (float)x, (float)y, (float)z, volume, pitch);
         }
     }
     
@@ -1597,7 +1597,7 @@ public class RenderGlobal
         {
             return;
         }
-        EntityFX fx = ParticleDispatcher.getInstance().getDispatch(particleId).newParticle(worldObj, x, y, z, motionX, motionY, motionZ, data);
+        Particle fx = ParticleDispatcher.getInstance().getDispatch(particleId).newParticle(worldObj, x, y, z, motionX, motionY, motionZ, data);
         if (fx != null){
             mc.effectRenderer.addEffect(fx);
         }
@@ -1610,16 +1610,16 @@ public class RenderGlobal
 		}
 		if(seasonChanged || lightChanged && !LightmapHelper.isLightmapEnabled()) {
 			for(ChunkRenderer chunkRenderer : chunkRenderers) {
-				if(chunkRenderer.isChunkLit && !chunkRenderer.needsUpdate) {
+				if(chunkRenderer.skyLit && !chunkRenderer.dirty) {
 					chunkRenderersToUpdate.add(chunkRenderer);
-					chunkRenderer.markDirty();
+					chunkRenderer.setDirty();
 				}
 			}
 		}
 	}
 
     @Override
-    public void tileEntityChanged(int x, int y, int z, TileEntity tileEntity)
+    public void tileEntityChanged(int x, int y, int z, BlockEntity blockEntity)
     {
     }
 
@@ -1630,7 +1630,7 @@ public class RenderGlobal
         }
     }
     @Override
-    public void levelEvent(EntityPlayer player, int id, int x, int y, int z, int data)
+    public void levelEvent(Player player, int id, int x, int y, int z, int data)
     {
         Random random = worldObj.rand;
         switch(id) {
@@ -1690,8 +1690,8 @@ public class RenderGlobal
                 break;
 
             case EVENT_JUKEBOX_TOGGLE: // Jukebox play/stop record
-                if(Item.itemsList[data] instanceof ItemRecord) {
-                    ItemRecord record = ((ItemRecord)Item.itemsList[data]);
+                if(Item.itemsList[data] instanceof MusicDiscItem) {
+                    MusicDiscItem record = ((MusicDiscItem)Item.itemsList[data]);
                     worldObj.playRecord(record.recordName, record.recordAuthor, x, y, z);
                 } else {
                     worldObj.playRecord(null, null, x, y, z);
@@ -1714,7 +1714,7 @@ public class RenderGlobal
 	public void entityRemoved(Entity entity) {
 	}
 
-    public List<TileEntity> tileEntities;
+    public List<BlockEntity> tileEntities;
     private World worldObj;
     private final RenderEngine renderEngine;
     private final List<ChunkRenderer> chunkRenderersToUpdate;
diff --git a/src/main/java/net/minecraft/client/render/Texture.java b/src/main/java/net/minecraft/client/render/Texture.java
deleted file mode 100644
index a51d63c8f..000000000
--- a/src/main/java/net/minecraft/client/render/Texture.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package net.minecraft.client.render;
-
-import static org.lwjgl.opengl.GL11.*;
-
-import net.minecraft.client.GLAllocation;
-
-public class Texture {
-	
-	private int id;
-	
-	public boolean generate() {
-		if(isGenerated()) {
-			return false;
-		}
-		
-		id = GLAllocation.generateTexture();
-		if(!isGenerated()) {
-			throw new RuntimeException("Texture not created!");
-		}
-		
-		return true;
-	}
-	
-	public boolean delete() {
-		if(!isGenerated()) {
-			return false;
-		}
-		GLAllocation.deleteTexture(id);
-		id = 0;
-		return true;
-	}
-	
-	public boolean bind() {
-		if(!isGenerated()) {
-			return false;
-		}
-		
-		glBindTexture(GL_TEXTURE_2D, id);
-		return true;
-	}
-
-	public void unbind() {
-		glBindTexture(GL_TEXTURE_2D, 0);
-	}
-	
-	public boolean isGenerated() {
-		return id != 0;
-	}
-	
-	public int getWidth() {
-		return glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH);
-	}
-	
-	public int getHeight() {
-		return glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT);
-	}
-	
-	public int id() {
-		return id;
-	}
-	
-}
diff --git a/src/main/java/net/minecraft/client/render/Vertex.java b/src/main/java/net/minecraft/client/render/Vertex.java
index e1ecec97c..4193a1d79 100644
--- a/src/main/java/net/minecraft/client/render/Vertex.java
+++ b/src/main/java/net/minecraft/client/render/Vertex.java
@@ -1,39 +1,33 @@
 package net.minecraft.client.render;
 
-
-// Referenced classes of package net.minecraft.src:
-//            Vec3D
-
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public class Vertex
 {
+    public Vec3 pos;
+    public float u;
+    public float v;
 
-    public Vertex(float f, float f1, float f2, float f3, float f4)
+    public Vertex(float x, float y, float z, float u, float v)
     {
-        this(Vec3d.createVectorHelper(f, f1, f2), f3, f4);
+        this(Vec3.getPermanentVec3(x, y, z), u, v);
     }
 
-    public Vertex setTexturePosition(float f, float f1)
-    {
-        return new Vertex(this, f, f1);
+    public Vertex(Vertex vertex, float u, float v) {
+        pos = vertex.pos;
+        this.u = u;
+        this.v = v;
     }
 
-    public Vertex(Vertex positiontexturevertex, float f, float f1)
-    {
-        vector3D = positiontexturevertex.vector3D;
-        texturePositionX = f;
-        texturePositionY = f1;
+    public Vertex(Vec3 vec3, float u, float v) {
+        pos = vec3;
+        this.u = u;
+        this.v = v;
     }
 
-    public Vertex(Vec3d vec3d, float f, float f1)
+    public Vertex remap(float u, float v)
     {
-        vector3D = vec3d;
-        texturePositionX = f;
-        texturePositionY = f1;
+        return new Vertex(this, u, v);
     }
 
-    public Vec3d vector3D;
-    public float texturePositionX;
-    public float texturePositionY;
 }
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 224dccb2c..4a0dfa662 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -5,14 +5,16 @@ import static org.lwjgl.opengl.GL11.*;
 import java.util.List;
 import java.util.Random;
 
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.util.glu.GLU;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.fx.EntityRainFX;
-import net.minecraft.client.entity.fx.EntitySmokeFX;
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.client.entity.particle.WaterDropParticle;
+import net.minecraft.client.entity.particle.SmokeParticle;
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.client.gui.GuiPhotoMode;
 import net.minecraft.client.gui.modelviewer.GuiModelViewer;
 import net.minecraft.client.input.InputType;
@@ -27,22 +29,20 @@ import net.minecraft.client.render.camera.EntityCameraThirdPersonFront;
 import net.minecraft.client.render.camera.EntityCameraThirdPersonRear;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.render.culling.Frustum;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.window.GameWindowLWJGL2;
 import net.minecraft.client.util.debug.Debug;
 import net.minecraft.client.world.chunk.provider.ChunkProviderStatic;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.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.entity.player.Player;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Time;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
@@ -109,7 +109,7 @@ public class WorldRenderer
 
     private void updateSpeedFov()
     {
-        EntityPlayerSP player = mc.thePlayer;
+        LocalPlayer player = mc.thePlayer;
         currentFovModifier = player.getFovModifier();
         a = b;
         b += (currentFovModifier - b) * 0.5f;
@@ -126,9 +126,9 @@ public class WorldRenderer
 		final double blockReach = mc.playerController.getBlockReachDistance();
 		final double entityReach = mc.playerController.getEntityReachDistance();
 		
-		Vec3d pos1 = mc.thePlayer.getPosition(partialTicks);
-		Vec3d look = mc.thePlayer.getViewVector(partialTicks);
-		Vec3d pos2 = pos1.addVector(look.xCoord * blockReach, look.yCoord * blockReach, look.zCoord * blockReach);
+		Vec3 pos1 = mc.thePlayer.getPosition(partialTicks);
+		Vec3 look = mc.thePlayer.getViewVector(partialTicks);
+		Vec3 pos2 = pos1.add(look.x * blockReach, look.y * blockReach, look.z * blockReach);
 		
 		// Raytrace blocks
 		mc.objectMouseOver = mc.theWorld.checkBlockCollisionBetweenPoints(pos1, pos2);
@@ -136,7 +136,7 @@ public class WorldRenderer
 		// Calculate again because block raytrace changes the values
 		pos1 = mc.thePlayer.getPosition(partialTicks);
 		look = mc.thePlayer.getViewVector(partialTicks);
-		pos2 = pos1.addVector(look.xCoord * entityReach, look.yCoord * entityReach, look.zCoord * entityReach);
+		pos2 = pos1.add(look.x * entityReach, look.y * entityReach, look.z * entityReach);
 		
 		double hitBlockDistance = 1000.0;
 		if(mc.objectMouseOver != null) {
@@ -145,7 +145,7 @@ public class WorldRenderer
 		
 		this.pointedEntity = null;
 		float expand = 1.0f;
-		AABB entitySearchBox = mc.thePlayer.bb.addCoord(look.xCoord * entityReach, look.yCoord * entityReach, look.zCoord * entityReach).expand(expand, expand, expand);
+		AABB entitySearchBox = mc.thePlayer.bb.expand(look.x * entityReach, look.y * entityReach, look.z * entityReach).grow(expand, expand, expand);
 		
 		List<Entity> entities = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.thePlayer, entitySearchBox);
 		
@@ -158,15 +158,15 @@ public class WorldRenderer
 			}
 			
 			float hitRadius = entity.getPickRadius();
-			AABB hitBox = entity.bb.expand(hitRadius, hitRadius, hitRadius);
+			AABB hitBox = entity.bb.grow(hitRadius, hitRadius, hitRadius);
 			
-			if(hitBox.isVecInside(pos1)) {
+			if(hitBox.contains(pos1)) {
 				this.pointedEntity = entity;
 				pointedEntityDistance = 0.0;
 				continue;
 			}
 			
-			HitResult hitResult = hitBox.func_1169_a(pos1, pos2);
+			HitResult hitResult = hitBox.clip(pos1, pos2);
 			if(hitResult == null) {
 				continue;
 			}
@@ -191,10 +191,10 @@ public class WorldRenderer
 
     private float getFOVModifier(float partialTick, boolean isModifiedByFOV)
     {
-        EntityLiving entityliving = null;
+        Mob entityliving = null;
         if (mc.activeCamera instanceof EntityCamera)
         {
-            entityliving = ((EntityCamera) mc.activeCamera).entity;
+            entityliving = ((EntityCamera) mc.activeCamera).mob;
         }
         float f1 = 70f;
         if(isModifiedByFOV)
@@ -217,7 +217,7 @@ public class WorldRenderer
     private void hurtCameraEffect(float partialTick)
     {
         if (!(mc.activeCamera instanceof EntityCamera)) return;
-        EntityLiving entityliving = ((EntityCamera) mc.activeCamera).entity;
+        Mob entityliving = ((EntityCamera) mc.activeCamera).mob;
         float f1 = (float)entityliving.hurtTime - partialTick;
         if(entityliving.getHealth() <= 0)
         {
@@ -230,7 +230,7 @@ public class WorldRenderer
         } else
         {
             f1 /= entityliving.maxHurtTime;
-            f1 = MathHelper.sin(f1 * f1 * f1 * f1 * 3.141593F);
+            f1 = MathHelper.sin(f1 * f1 * f1 * f1 * MathHelper.PI);
             float f3 = entityliving.attackedAtYaw;
             glRotatef(-f3, 0.0F, 1.0F, 0.0F);
             glRotatef(-f1 * 14F, 0.0F, 0.0F, 1.0F);
@@ -241,9 +241,9 @@ public class WorldRenderer
 
     private void setupViewBobbing(float partialTick)
     {
-        if (mc.activeCamera instanceof EntityCamera && ((EntityCamera) mc.activeCamera).entity instanceof EntityPlayer)
+        if (mc.activeCamera instanceof EntityCamera && ((EntityCamera) mc.activeCamera).mob instanceof Player)
         {
-            EntityPlayer player = (EntityPlayer)((EntityCamera) mc.activeCamera).entity;
+            Player player = (Player)((EntityCamera) mc.activeCamera).mob;
             float walkDist = -MathHelper.lerp(player.walkDistO, player.walkDist, partialTick);
             float cameraVel = MathHelper.lerp(player.cameraVelocityOld, player.cameraVelocity, partialTick);
             float cameraPitch = MathHelper.lerp(player.prevCameraPitch, player.cameraPitch, partialTick);
@@ -262,7 +262,7 @@ public class WorldRenderer
     {
         if (mc.activeCamera instanceof EntityCamera)
         {
-            EntityLiving entityliving = ((EntityCamera) mc.activeCamera).entity;
+            Mob entityliving = ((EntityCamera) mc.activeCamera).mob;
             if (mc.currentScreen instanceof GuiPhotoMode)
             {
                 mc.activeCamera = new EntityCameraIsometric(mc, entityliving);
@@ -272,7 +272,7 @@ public class WorldRenderer
                 if (!(mc.activeCamera instanceof EntityCameraSleeping))
                 {
                     mc.activeCamera = new EntityCameraSleeping(mc, entityliving,
-                            MathHelper.floor_double(entityliving.x), MathHelper.floor_double(entityliving.y), MathHelper.floor_double(entityliving.z),
+                            MathHelper.floor(entityliving.x), MathHelper.floor(entityliving.y), MathHelper.floor(entityliving.z),
                             mc.activeCamera.getX(partialTick), mc.activeCamera.getY(partialTick), mc.activeCamera.getZ(partialTick), mc.activeCamera.getYRot(partialTick), mc.activeCamera.getXRot(partialTick)
                     );
                 }
@@ -375,7 +375,7 @@ public class WorldRenderer
         {
             setupViewBobbing(partialTick);
         }
-        if(mc.gameSettings.thirdPersonView.value == 0 && !(mc.currentScreen instanceof GuiPhotoMode) && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).entity.isPlayerSleeping()) && mc.gameSettings.immersiveMode.drawHand())
+        if(mc.gameSettings.thirdPersonView.value == 0 && !(mc.currentScreen instanceof GuiPhotoMode) && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).mob.isPlayerSleeping()) && mc.gameSettings.immersiveMode.drawHand())
         {
             lightmapHelper.enableLightmapRendering();
             if(!zooming) itemRenderer.renderItemInFirstPerson(partialTick);
@@ -386,7 +386,7 @@ public class WorldRenderer
         Debug.change("post");
         mc.renderer.endRenderWorld(partialTick);
         
-        if(mc.gameSettings.thirdPersonView.value == 0 && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).entity.isPlayerSleeping()))
+        if(mc.gameSettings.thirdPersonView.value == 0 && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).mob.isPlayerSleeping()))
         {
             itemRenderer.renderOverlays(partialTick);
             hurtCameraEffect(partialTick);
@@ -399,7 +399,7 @@ public class WorldRenderer
     private float getZoomedFOV(float currentFov, float partialTick){
         currentFov *= 0.45f;
         float prevZoomProgress = zoomProgress;
-        zoomProgress -= Mouse.getDWheel()/256f;
+        zoomProgress -= Mouse.getDWheel()/0.256f;
         zoomProgress = MathHelper.clamp(zoomProgress, -7.5f, 7.5f);
         final float maxFOV = 160f;
         final float minFOV = 5f;
@@ -595,10 +595,10 @@ public class WorldRenderer
             mc.activeCamera = new EntityCameraFirstPerson(mc, mc.thePlayer);
         }
         getMouseOver(partialTick);
-        EntityLiving activeEntity = null;
+        Mob activeEntity = null;
         if (mc.activeCamera instanceof EntityCamera)
         {
-            activeEntity = ((EntityCamera)mc.activeCamera).entity;
+            activeEntity = ((EntityCamera)mc.activeCamera).mob;
         }
 
         if (activeEntity != null)
@@ -637,7 +637,7 @@ public class WorldRenderer
         fogManager.setupFog(FogManager.FOG_MODE_NORMAL, farPlaneDistance, partialTick);
         if(mc.gameSettings.ambientOcclusion.value)
         {
-            glShadeModel(7425 /*GL_SMOOTH*/);
+            glShadeModel(GL11.GL_SMOOTH);
         }
         
         mc.renderGlobal.clipRenderersByFrustum(mc.activeCamera.getFrustum(), partialTick);
@@ -661,7 +661,7 @@ public class WorldRenderer
 
         fogManager.setupFog(FogManager.FOG_MODE_NORMAL, farPlaneDistance, partialTick);
         glEnable(GL_FOG);
-        TextureRegistry.blockAtlas.bindTexture();
+        TextureRegistry.blockAtlas.bind();
         Lighting.disable();
 
         Debug.change("terrain");
@@ -712,7 +712,7 @@ public class WorldRenderer
         fogManager.setupFog(FogManager.FOG_MODE_NORMAL, farPlaneDistance, partialTick);
         glEnable(GL_BLEND);
         glDisable(GL_CULL_FACE);
-        TextureRegistry.blockAtlas.bindTexture();
+        TextureRegistry.blockAtlas.bind();
 
         Debug.change("water");
         if(mc.gameSettings.ambientOcclusion.value)
@@ -786,9 +786,9 @@ public class WorldRenderer
         }
         random.setSeed((long)rendererUpdateCount * 0x12a7ce5fL);
         World world = mc.theWorld;
-        int cameraX = MathHelper.floor_double(mc.activeCamera.getX());
-        int cameraY = MathHelper.floor_double(mc.activeCamera.getY());
-        int cameraZ = MathHelper.floor_double(mc.activeCamera.getZ());
+        int cameraX = MathHelper.floor(mc.activeCamera.getX());
+        int cameraY = MathHelper.floor(mc.activeCamera.getY());
+        int cameraZ = MathHelper.floor(mc.activeCamera.getZ());
         byte byte0 = 10;
         double d = 0.0D;
         double d1 = 0.0D;
@@ -820,7 +820,7 @@ public class WorldRenderer
             }
             if(Block.blocksList[i2].blockMaterial == Material.lava)
             {
-                mc.effectRenderer.addEffect(new EntitySmokeFX(world, (float)randX + f1, (double)((float)y + 0.1F) - Block.blocksList[i2].minY, (float)randZ + f2, 0.0D, 0.0D, 0.0D));
+                mc.effectRenderer.addEffect(new SmokeParticle(world, (float)randX + f1, (double)((float)y + 0.1F) - Block.blocksList[i2].minY, (float)randZ + f2, 0.0D, 0.0D, 0.0D));
                 continue;
             }
             if(random.nextInt(++l) == 0)
@@ -829,13 +829,13 @@ public class WorldRenderer
                 d1 = (double)((float)y + 0.1F) - Block.blocksList[i2].minY;
                 d2 = (float)randZ + f2;
             }
-            mc.effectRenderer.addEffect(new EntityRainFX(world, (float)randX + f1, (double)((float)y + 0.1F) - Block.blocksList[i2].minY, (float)randZ + f2));
+            mc.effectRenderer.addEffect(new WaterDropParticle(world, (float)randX + f1, (double)((float)y + 0.1F) - Block.blocksList[i2].minY, (float)randZ + f2));
         }
 
         if(l > 0 && random.nextInt(3) < rainSoundCounter++)
         {
             rainSoundCounter = 0;
-            if(d1 > mc.activeCamera.getY() + 1.0D && world.getHeightValue(MathHelper.floor_double(mc.activeCamera.getX()), MathHelper.floor_double(mc.activeCamera.getZ())) > MathHelper.floor_double(mc.activeCamera.getY()))
+            if(d1 > mc.activeCamera.getY() + 1.0D && world.getHeightValue(MathHelper.floor(mc.activeCamera.getX()), MathHelper.floor(mc.activeCamera.getZ())) > MathHelper.floor(mc.activeCamera.getY()))
             {
                 mc.theWorld.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, d, d1, d2, "ambient.weather.rain", 0.1F * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower() * 0.5f, 0.5F);
             } else
@@ -851,22 +851,22 @@ public class WorldRenderer
         if (weather == null || !weather.isPrecipitation) return;
         
         World world = mc.theWorld;
-        int posX = MathHelper.floor_double(mc.activeCamera.getX());
-        int posY = MathHelper.floor_double(mc.activeCamera.getY());
-        int posZ = MathHelper.floor_double(mc.activeCamera.getZ());
+        int posX = MathHelper.floor(mc.activeCamera.getX());
+        int posY = MathHelper.floor(mc.activeCamera.getY());
+        int posZ = MathHelper.floor(mc.activeCamera.getZ());
         Tessellator tessellator = Tessellator.instance;
-        glDisable(2884 /*GL_CULL_FACE*/);
+        glDisable(GL11.GL_CULL_FACE);
         glNormal3f(0.0F, 1.0F, 0.0F);
-        glEnable(3042 /*GL_BLEND*/);
+        glEnable(GL11.GL_BLEND);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         glAlphaFunc(516, 0.01F);
-        
-        glBindTexture(3553 /*GL_TEXTURE_2D*/, mc.renderEngine.getTexture(weather.getPrecipitationTexture(world)));
+
+        mc.renderEngine.loadTexture(weather.getPrecipitationTexture(world)).bind();
         
         double nextPosX = mc.activeCamera.getX(partialTick);
         double nextPosY = mc.activeCamera.getY(partialTick);
         double nextPosZ = mc.activeCamera.getZ(partialTick);
-        int floorPosY = MathHelper.floor_double(nextPosY);
+        int floorPosY = MathHelper.floor(nextPosY);
         int radiusEffect = 10;
 
         if (weather.precipitationType == 1)
@@ -905,7 +905,7 @@ public class WorldRenderer
                         float f8 = random.nextFloat() + f5 * (float)random.nextGaussian() * 0.001F;
                         double d5 = (double)((float)x + 0.5F) - mc.activeCamera.getX();
                         double d6 = (double)((float)z + 0.5F) - mc.activeCamera.getZ();
-                        float f11 = MathHelper.sqrt_double(d5 * d5 + d6 * d6) / (float)radiusEffect;
+                        float f11 = MathHelper.sqrt(d5 * d5 + d6 * d6) / (float)radiusEffect;
                         tessellator.startDrawingQuads();
                         float f12 = world.getLightBrightness(x, i3, z);
                         if (mc.fullbright) f12 = 1.0f;
@@ -952,7 +952,7 @@ public class WorldRenderer
                         float f4 = (((float)(rendererUpdateCount + x * x * 3121 /*GL_RGBA_MODE*/ + x * 0x2b24abb + z * z * 0x66397 + z * 13761 & 0x1f) + partialTick) / 32F) * (3F + random.nextFloat());
                         double d3 = (double)((float)x + 0.5F) - mc.activeCamera.getX();
                         double d4 = (double)((float)z + 0.5F) - mc.activeCamera.getZ();
-                        float f9 = MathHelper.sqrt_double(d3 * d3 + d4 * d4) / (float)radiusEffect;
+                        float f9 = MathHelper.sqrt(d3 * d3 + d4 * d4) / (float)radiusEffect;
                         tessellator.startDrawingQuads();
                         float f10 = world.getLightBrightness(x, world.getHeightBlocks(), z) * 0.85F + 0.15F;
                         if (mc.fullbright) f10 = 1.0f;
@@ -1006,7 +1006,7 @@ public class WorldRenderer
                         float vOffset = (((float)(rendererUpdateCount + x * x * 3121 /*GL_RGBA_MODE*/ + x * 0x2b24abb + z * z * 0x66397 + z * 13761 & 0x1f) + partialTick) / 32F) * (3F + random.nextFloat());
                         double d3 = (double)((float)x + 0.5F) - mc.activeCamera.getX();
                         double d4 = (double)((float)z + 0.5F) - mc.activeCamera.getZ();
-                        float f9 = MathHelper.sqrt_double(d3 * d3 + d4 * d4) / (float)radiusEffect;
+                        float f9 = MathHelper.sqrt(d3 * d3 + d4 * d4) / (float)radiusEffect;
                         tessellator.startDrawingQuads();
                         float f10 = world.getLightBrightness(x, world.getHeightBlocks(), z) * 0.85F + 0.15F;
                         if (mc.fullbright) f10 = 1.0f;
@@ -1029,18 +1029,18 @@ public class WorldRenderer
         }
 
 
-        glEnable(2884 /*GL_CULL_FACE*/);
-        glDisable(3042 /*GL_BLEND*/);
+        glEnable(GL11.GL_CULL_FACE);
+        glDisable(GL11.GL_BLEND);
         glAlphaFunc(516, 0.1F);
     }
 
     public void setupScaledResolution()
     {
         glClear(256);
-        glMatrixMode(5889 /*GL_PROJECTION*/);
+        glMatrixMode(GL11.GL_PROJECTION);
         glLoadIdentity();
         glOrtho(0.0D, mc.resolution.scaledWidthExact, mc.resolution.scaledHeightExact, 0.0D, 1000D, 3000D);
-        glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
+        glMatrixMode(GL11.GL_MODELVIEW);
         glLoadIdentity();
         glTranslatef(0.0F, 0.0F, -2000F);
     }
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 79b263d9c..0c4865e08 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
@@ -3,12 +3,13 @@ package net.minecraft.client.render.block.color;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.util.dispatch.Dispatcher;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
 public final class BlockColorDispatcher
     extends Dispatcher<Block, BlockColor>
 {
     private static final BlockColorDispatcher instance = new BlockColorDispatcher();
-    private static final BlockColor defaultColor = new BlockColorDefault();
+    private static final BlockColor defaultColor = new DefaultBlockColor();
 
     public static BlockColorDispatcher getInstance()
     {
@@ -17,28 +18,28 @@ public final class BlockColorDispatcher
 
     private BlockColorDispatcher()
     {
-        addDispatch(Block.algae, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.fluidWaterStill, new BlockColorWater(Colorizers.water));
-        addDispatch(Block.fluidWaterFlowing, new BlockColorWater(Colorizers.water));
-        addDispatch(Block.grass, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.layerLeavesOak, new BlockColorCustom(Colorizers.oak));
-        addDispatch(Block.leavesBirch, new BlockColorCustom(Colorizers.birch));
-        addDispatch(Block.leavesCherry, new BlockColorCustom(Colorizers.cherry));
-        addDispatch(Block.leavesCherryFlowering, new BlockColorCustom(Colorizers.cherry));
-        addDispatch(Block.leavesEucalyptus, new BlockColorCustom(Colorizers.eucalyptus));
-        addDispatch(Block.leavesCacao, new BlockColorCustom(Colorizers.cacao));
-        addDispatch(Block.leavesOak, new BlockColorCustom(Colorizers.oak));
-        addDispatch(Block.leavesPine, new BlockColorCustom(Colorizers.pine));
-        addDispatch(Block.leavesShrub, new BlockColorCustom(Colorizers.shrub));
-        addDispatch(Block.leavesThorn, new BlockColorCustom(Colorizers.thorn));
-        addDispatch(Block.leavesPalm, new BlockColorCustom(Colorizers.palm));
-        addDispatch(Block.mossStone, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.mossBasalt, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.mossLimestone, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.mossGranite, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.wireRedstone, new BlockColorRedstoneWire());
-        addDispatch(Block.tallgrass, new BlockColorCustom(Colorizers.grass));
-        addDispatch(Block.tallgrassFern, new BlockColorCustom(Colorizers.grass));
+        addDispatch(Blocks.ALGAE, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.FLUID_WATER_STILL, new WaterBlockColor(Colorizers.water));
+        addDispatch(Blocks.FLUID_WATER_FLOWING, new WaterBlockColor(Colorizers.water));
+        addDispatch(Blocks.GRASS, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.LAYER_LEAVES_OAK, new CustomBlockColor(Colorizers.oak));
+        addDispatch(Blocks.LEAVES_BIRCH, new CustomBlockColor(Colorizers.birch));
+        addDispatch(Blocks.LEAVES_CHERRY, new CustomBlockColor(Colorizers.cherry));
+        addDispatch(Blocks.LEAVES_CHERRY_FLOWERING, new CustomBlockColor(Colorizers.cherry));
+        addDispatch(Blocks.LEAVES_EUCALYPTUS, new CustomBlockColor(Colorizers.eucalyptus));
+        addDispatch(Blocks.LEAVES_CACAO, new CustomBlockColor(Colorizers.cacao));
+        addDispatch(Blocks.LEAVES_OAK, new CustomBlockColor(Colorizers.oak));
+        addDispatch(Blocks.LEAVES_PINE, new CustomBlockColor(Colorizers.pine));
+        addDispatch(Blocks.LEAVES_SHRUB, new CustomBlockColor(Colorizers.shrub));
+        addDispatch(Blocks.LEAVES_THORN, new CustomBlockColor(Colorizers.thorn));
+        addDispatch(Blocks.LEAVES_PALM, new CustomBlockColor(Colorizers.palm));
+        addDispatch(Blocks.MOSS_STONE, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.MOSS_BASALT, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.MOSS_LIMESTONE, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.MOSS_GRANITE, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.WIRE_REDSTONE, new RedstoneWireBlockColor());
+        addDispatch(Blocks.TALLGRASS, new CustomBlockColor(Colorizers.grass));
+        addDispatch(Blocks.TALLGRASS_FERN, new CustomBlockColor(Colorizers.grass));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorCustom.java b/src/main/java/net/minecraft/client/render/block/color/CustomBlockColor.java
similarity index 84%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorCustom.java
rename to src/main/java/net/minecraft/client/render/block/color/CustomBlockColor.java
index a0fcdb374..76d4a3c27 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorCustom.java
+++ b/src/main/java/net/minecraft/client/render/block/color/CustomBlockColor.java
@@ -3,11 +3,11 @@ package net.minecraft.client.render.block.color;
 import net.minecraft.client.render.colorizer.Colorizer;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockColorCustom extends BlockColor {
+public class CustomBlockColor extends BlockColor {
 
 	public Colorizer colorizer;
 	
-	public BlockColorCustom(Colorizer colorizer) {
+	public CustomBlockColor(Colorizer colorizer) {
 		this.colorizer = colorizer;
 		
 		if(colorizer == null) {
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorDefault.java b/src/main/java/net/minecraft/client/render/block/color/DefaultBlockColor.java
similarity index 87%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorDefault.java
rename to src/main/java/net/minecraft/client/render/block/color/DefaultBlockColor.java
index ce2dd08ae..cf5117ea0 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorDefault.java
+++ b/src/main/java/net/minecraft/client/render/block/color/DefaultBlockColor.java
@@ -1,19 +1,19 @@
-package net.minecraft.client.render.block.color;
-
-import net.minecraft.core.world.WorldSource;
-
-public class BlockColorDefault
-    extends BlockColor
-{
-    @Override
-    public int getFallbackColor(int meta)
-    {
-        return 0xFFFFFF;
-    }
-
-    @Override
-    public int getWorldColor(WorldSource world, int x, int y, int z)
-    {
-        return 0xFFFFFF;
-    }
-}
+package net.minecraft.client.render.block.color;
+
+import net.minecraft.core.world.WorldSource;
+
+public class DefaultBlockColor
+    extends BlockColor
+{
+    @Override
+    public int getFallbackColor(int meta)
+    {
+        return 0xFFFFFF;
+    }
+
+    @Override
+    public int getWorldColor(WorldSource world, int x, int y, int z)
+    {
+        return 0xFFFFFF;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorLeavesOak.java b/src/main/java/net/minecraft/client/render/block/color/LeavesOakBlockColor.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorLeavesOak.java
rename to src/main/java/net/minecraft/client/render/block/color/LeavesOakBlockColor.java
index 4191dae30..d00e842c1 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorLeavesOak.java
+++ b/src/main/java/net/minecraft/client/render/block/color/LeavesOakBlockColor.java
@@ -1,42 +1,42 @@
-package net.minecraft.client.render.block.color;
-
-import java.util.Random;
-
-import net.minecraft.client.render.colorizer.Colorizer;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.noise.ImprovedNoise;
-import net.minecraft.core.world.season.Season;
-import net.minecraft.core.world.season.Seasons;
-
-public class BlockColorLeavesOak extends BlockColorCustom {
-	
-	private static ImprovedNoise fallColorPerlin = new ImprovedNoise(new Random(0));
-	
-	public BlockColorLeavesOak(Colorizer colorizer) {
-		super(colorizer);
-	}
-	
-	@Override
-	public int getWorldColor(WorldSource world, int x, int y, int z) {
-		int color = super.getWorldColor(world, x, y, z);
-		
-		Season season = world.getSeasonManager().getCurrentSeason();
-		if(season != null) {
-			float progress = world.getSeasonManager().getSeasonProgress();
-			if(season == Seasons.OVERWORLD_FALL) {
-				float offsetIntensity = 1 - Math.abs((progress * 2) - 1);
-				float green = ((color & 0x00FF00) >> 8) / 255F;
-				float greenOffset = (float) fallColorPerlin.getValue(x / 10D, y / 10D, z / 10D) * offsetIntensity * 0.5f;
-				if(green + greenOffset > 0.8f)
-					greenOffset = 0.8f - green;
-				if(green + greenOffset < 0.0f)
-					greenOffset = -green;
-				int newGreen = ((int) ((green + greenOffset) * 255)) & 0xFF;
-				color &= 0xFF00FF;
-				color |= (newGreen << 8);
-			}
-		}
-		
-		return color;
-	}
-}
+package net.minecraft.client.render.block.color;
+
+import java.util.Random;
+
+import net.minecraft.client.render.colorizer.Colorizer;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.noise.ImprovedNoise;
+import net.minecraft.core.world.season.Season;
+import net.minecraft.core.world.season.Seasons;
+
+public class LeavesOakBlockColor extends CustomBlockColor {
+	
+	private static ImprovedNoise fallColorPerlin = new ImprovedNoise(new Random(0));
+	
+	public LeavesOakBlockColor(Colorizer colorizer) {
+		super(colorizer);
+	}
+	
+	@Override
+	public int getWorldColor(WorldSource world, int x, int y, int z) {
+		int color = super.getWorldColor(world, x, y, z);
+		
+		Season season = world.getSeasonManager().getCurrentSeason();
+		if(season != null) {
+			float progress = world.getSeasonManager().getSeasonProgress();
+			if(season == Seasons.OVERWORLD_FALL) {
+				float offsetIntensity = 1 - Math.abs((progress * 2) - 1);
+				float green = ((color & 0x00FF00) >> 8) / 255F;
+				float greenOffset = (float) fallColorPerlin.getValue(x / 10D, y / 10D, z / 10D) * offsetIntensity * 0.5f;
+				if(green + greenOffset > 0.8f)
+					greenOffset = 0.8f - green;
+				if(green + greenOffset < 0.0f)
+					greenOffset = -green;
+				int newGreen = ((int) ((green + greenOffset) * 255)) & 0xFF;
+				color &= 0xFF00FF;
+				color |= (newGreen << 8);
+			}
+		}
+		
+		return color;
+	}
+}
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorRedstoneWire.java b/src/main/java/net/minecraft/client/render/block/color/RedstoneWireBlockColor.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorRedstoneWire.java
rename to src/main/java/net/minecraft/client/render/block/color/RedstoneWireBlockColor.java
index 6aabcc46e..af73cfbd8 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorRedstoneWire.java
+++ b/src/main/java/net/minecraft/client/render/block/color/RedstoneWireBlockColor.java
@@ -1,22 +1,22 @@
-package net.minecraft.client.render.block.color;
-
-import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.world.WorldSource;
-
-public class BlockColorRedstoneWire
-    extends BlockColor
-{
-
-    @Override
-    public int getFallbackColor(int meta)
-    {
-        return Colors.allRedstoneColors[15].getARGB();
-    }
-
-    @Override
-    public int getWorldColor(WorldSource world, int x, int y, int z)
-    {
-        // Colored by renderer
-    	return Colors.allRedstoneColors[15].getARGB();
-    }
-}
+package net.minecraft.client.render.block.color;
+
+import net.minecraft.client.util.helper.Colors;
+import net.minecraft.core.world.WorldSource;
+
+public class RedstoneWireBlockColor
+    extends BlockColor
+{
+
+    @Override
+    public int getFallbackColor(int meta)
+    {
+        return Colors.allRedstoneColors[15].getARGB();
+    }
+
+    @Override
+    public int getWorldColor(WorldSource world, int x, int y, int z)
+    {
+        // Colored by renderer
+    	return Colors.allRedstoneColors[15].getARGB();
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java b/src/main/java/net/minecraft/client/render/block/color/TallGrassBlockColor.java
similarity index 88%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java
rename to src/main/java/net/minecraft/client/render/block/color/TallGrassBlockColor.java
index 24e967e4b..3000589e2 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorTallGrass.java
+++ b/src/main/java/net/minecraft/client/render/block/color/TallGrassBlockColor.java
@@ -1,38 +1,38 @@
-package net.minecraft.client.render.block.color;
-
-import java.util.Random;
-
-import net.minecraft.client.render.colorizer.Colorizer;
-import net.minecraft.client.render.colorizer.Colorizers;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.noise.ImprovedNoise;
-
-public class BlockColorTallGrass extends BlockColorCustom {
-	
-	protected static ImprovedNoise grassColorPerlin = new ImprovedNoise(new Random(0));
-	
-	public BlockColorTallGrass(Colorizer colorizer) {
-		super(colorizer);
-	}
-	
-	@Override
-	public int getWorldColor(WorldSource world, int x, int y, int z) {
-
-		double localTemperature = world.getBlockTemperature(x, z);
-		double localHumidity = world.getBlockHumidity(x, z);
-
-		long l1 = x * 0x2fc20fL + z * 0x5d8875L + y;
-		l1 = l1 * l1 * 0x285b825L + l1 * 11L;
-		int xO = (int) ((long) x + (l1 >> 14 & 31L));
-		int yO = (int) ((long) y + (l1 >> 19 & 31L));
-		int zO = (int) ((long) z + (l1 >> 24 & 31L));
-
-		float offsetT = (float) grassColorPerlin.getValue(xO / 32D, yO / 32D, z / 32D) / 2.5F;
-		float offsetH = (float) grassColorPerlin.getValue(x / 32D, yO / 32D, zO / 32D) / 2.5F;
-
-		localTemperature += offsetT;
-		localHumidity += offsetH;
-
-		return Colorizers.grass.getColor(localTemperature, localHumidity);
-	}
-}
+package net.minecraft.client.render.block.color;
+
+import java.util.Random;
+
+import net.minecraft.client.render.colorizer.Colorizer;
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.noise.ImprovedNoise;
+
+public class TallGrassBlockColor extends CustomBlockColor {
+	
+	protected static ImprovedNoise grassColorPerlin = new ImprovedNoise(new Random(0));
+	
+	public TallGrassBlockColor(Colorizer colorizer) {
+		super(colorizer);
+	}
+	
+	@Override
+	public int getWorldColor(WorldSource world, int x, int y, int z) {
+
+		double localTemperature = world.getBlockTemperature(x, z);
+		double localHumidity = world.getBlockHumidity(x, z);
+
+		long l1 = x * 0x2fc20fL + z * 0x5d8875L + y;
+		l1 = l1 * l1 * 0x285b825L + l1 * 11L;
+		int xO = (int) ((long) x + (l1 >> 14 & 31L));
+		int yO = (int) ((long) y + (l1 >> 19 & 31L));
+		int zO = (int) ((long) z + (l1 >> 24 & 31L));
+
+		float offsetT = (float) grassColorPerlin.getValue(xO / 32D, yO / 32D, z / 32D) / 2.5F;
+		float offsetH = (float) grassColorPerlin.getValue(x / 32D, yO / 32D, zO / 32D) / 2.5F;
+
+		localTemperature += offsetT;
+		localHumidity += offsetH;
+
+		return Colorizers.grass.getColor(localTemperature, localHumidity);
+	}
+}
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java b/src/main/java/net/minecraft/client/render/block/color/WaterBlockColor.java
similarity index 86%
rename from src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java
rename to src/main/java/net/minecraft/client/render/block/color/WaterBlockColor.java
index ca43c3990..0a3568e71 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java
+++ b/src/main/java/net/minecraft/client/render/block/color/WaterBlockColor.java
@@ -4,11 +4,11 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.colorizer.Colorizer;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockColorWater extends BlockColorCustom {
+public class WaterBlockColor extends CustomBlockColor {
 
 	public Minecraft mc = Minecraft.getMinecraft(this);
 	
-	public BlockColorWater(Colorizer colorizer) {
+	public WaterBlockColor(Colorizer colorizer) {
 		super(colorizer);
 	}
 	
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelAlgae.java b/src/main/java/net/minecraft/client/render/block/model/AlgaeBlockModel.java
similarity index 90%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelAlgae.java
rename to src/main/java/net/minecraft/client/render/block/model/AlgaeBlockModel.java
index 403526041..1f55d8914 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelAlgae.java
+++ b/src/main/java/net/minecraft/client/render/block/model/AlgaeBlockModel.java
@@ -2,14 +2,14 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelAlgae<T extends Block> extends BlockModelStandard<T>{
-    public BlockModelAlgae(Block block) {
+public class AlgaeBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public AlgaeBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java b/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
similarity index 81%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java
rename to src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
index 7b0a967d2..235d662c3 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelAxisAligned.java
+++ b/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
@@ -1,15 +1,15 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRotatable;
+import net.minecraft.core.block.RotatableBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 
-public class BlockModelAxisAligned<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelAxisAligned(Block block) {
+public class AxisAlignedBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public AxisAlignedBlockModel(Block block) {
         super(block);
     }
 
@@ -17,7 +17,7 @@ public class BlockModelAxisAligned<T extends Block> extends BlockModelStandard<T
     public boolean render(Tessellator tessellator, int x, int y, int z) {
         block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
         int l = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        int i1 = BlockRotatable.getOrientation(l);
+        int i1 = RotatableBlock.getOrientation(l);
         switch(i1)
         {
             case 0: // '\0'
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelBasket.java b/src/main/java/net/minecraft/client/render/block/model/BasketBlockModel.java
similarity index 87%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelBasket.java
rename to src/main/java/net/minecraft/client/render/block/model/BasketBlockModel.java
index a320ac8da..d9f143c21 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelBasket.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BasketBlockModel.java
@@ -1,15 +1,15 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBasket;
+import net.minecraft.core.block.BasketBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelBasket<T extends BlockBasket> extends BlockModelStandard<T>{
+public class BasketBlockModel<T extends BasketBlock> extends StandardBlockModel<T> {
     protected IconCoordinate fillTexture = TextureRegistry.getTexture("minecraft:block/basket_fill");
-    public BlockModelBasket(Block block) {
+    public BasketBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelBed.java b/src/main/java/net/minecraft/client/render/block/model/BedBlockModel.java
similarity index 82%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelBed.java
rename to src/main/java/net/minecraft/client/render/block/model/BedBlockModel.java
index 15dd1fbe0..d9c1bf169 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelBed.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BedBlockModel.java
@@ -1,16 +1,15 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.block.BedBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBed;
-import net.minecraft.core.block.logic.BedDirections;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelBed<T extends Block> extends BlockModelStandard<T>{
+public class BedBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate underTexture = TextureRegistry.getTexture("minecraft:block/planks_oak");
-    public BlockModelBed(Block block) {
+    public BedBlockModel(Block block) {
         super(block);
         atlasIndices[0] = TextureRegistry.getTexture("minecraft:block/bed_foot_front");
         atlasIndices[1] = TextureRegistry.getTexture("minecraft:block/bed_foot_side");
@@ -27,8 +26,8 @@ public class BlockModelBed<T extends Block> extends BlockModelStandard<T>{
         renderBlocks.cache.setupCache(block, renderBlocks.blockAccess, x, y, z);
 
         final int meta = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        final int direction = BlockBed.getDirectionFromMetadata(meta);
-        final boolean isFootOfBed = BlockBed.isBlockFootOfBed(meta);
+        final int direction = BedBlock.getDirection(meta);
+        final boolean isFootOfBed = BedBlock.isBlockFootOfBed(meta);
 
         final double minY = block.minY;
         block.minY += 0.1875D;
@@ -50,7 +49,7 @@ public class BlockModelBed<T extends Block> extends BlockModelStandard<T>{
         renderSide(tessellator, block, x, y, z, Side.TOP, meta);
 
         renderBlocks.uvRotateTop = 0;
-        final int f17 = isFootOfBed ? BedDirections.headOfBedMap[BedDirections.footToHeadMap[direction]] : BedDirections.headOfBedMap[direction];
+        final int f17 = isFootOfBed ? BedBlock.headOfBedMap[BedBlock.footToHeadMap[direction]] : BedBlock.headOfBedMap[direction];
 
         if(f17 != 2 && (renderBlocks.renderAllFaces || shouldSideBeRendered(renderBlocks.blockAccess, x, y, z - 1, 2)))
         {
@@ -88,9 +87,9 @@ public class BlockModelBed<T extends Block> extends BlockModelStandard<T>{
         if(side == Side.BOTTOM) {
             return underTexture;
         }
-        int k = BlockBed.getDirectionFromMetadata(data);
-        int l = BedDirections.bedDirection[k][side.getId()];
-        if(BlockBed.isBlockFootOfBed(data)) {
+        int k = BedBlock.getDirection(data);
+        int l = BedBlock.bedDirection[k][side.getId()];
+        if(BedBlock.isBlockFootOfBed(data)) {
             if(l == 2) {
                 return atlasIndices[3];
             }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModel.java b/src/main/java/net/minecraft/client/render/block/model/BlockModel.java
index b853530bc..d74eae690 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModel.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.RenderBlocks;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelChestPainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelChestPainted.java
deleted file mode 100644
index 2b193e1cb..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelChestPainted.java
+++ /dev/null
@@ -1,79 +0,0 @@
-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.BlockChest;
-import net.minecraft.core.item.ItemDye;
-import net.minecraft.core.util.helper.Axis;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.WorldSource;
-
-public class BlockModelChestPainted<T extends Block> extends BlockModelChest<T>{
-    public static final IconCoordinate[][] texCoords = new IconCoordinate[16][];
-
-    static {
-        for(int i = 0; i < 16; i++) {
-            String rootKey = "minecraft:block/chest_planks_oak_painted_" + ItemDye.dyeColors[15 - i];
-            texCoords[i] = new IconCoordinate[7];
-            texCoords[i][0] = TextureRegistry.getTexture(rootKey + "_front");
-            texCoords[i][1] = TextureRegistry.getTexture(rootKey + "_left_front");
-            texCoords[i][2] = TextureRegistry.getTexture(rootKey + "_right_front");
-            texCoords[i][3] = TextureRegistry.getTexture(rootKey + "_left_back");
-            texCoords[i][4] = TextureRegistry.getTexture(rootKey + "_right_back");
-            texCoords[i][5] = TextureRegistry.getTexture(rootKey + "_side");
-            texCoords[i][6] = TextureRegistry.getTexture(rootKey + "_top");
-        }
-    }
-    public BlockModelChestPainted(Block block) {
-        super(block, "minecraft:block/chest_planks_oak");
-    }
-
-    @Override
-    public IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side) {
-        int meta = blockAccess.getBlockMetadata(x, y, z);
-        int color = meta >> 4;
-
-        if(side == Side.TOP || side == Side.BOTTOM) {
-            return texCoords[color][6];
-        }
-
-        Side facing = BlockChest.getDirectionFromMeta(meta).getSide();
-        BlockChest.Type type = BlockChest.getTypeFromMeta(meta);
-
-        if(type == BlockChest.Type.SINGLE) {
-            if(side == facing) {
-                return texCoords[color][0];
-            }
-        }
-        if(type == BlockChest.Type.LEFT) {
-            if(side == facing) {
-                return texCoords[color][1];
-            }
-            if(side == facing.getOpposite()) {
-                return texCoords[color][4];
-            }
-        }
-        if(type == BlockChest.Type.RIGHT) {
-            if(side == facing) {
-                return texCoords[color][2];
-            }
-            if(side == facing.getOpposite()) {
-                return texCoords[color][3];
-            }
-        }
-        if(side.getAxis() != Axis.Y) {
-            return texCoords[color][5];
-        }
-
-        return texCoords[color][6];
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data) {
-        int color = data >> 4;
-        if (side == Side.SOUTH) return texCoords[color][0];
-        if (side.isHorizontal()) return texCoords[color][5];
-        return texCoords[color][6];
-    }
-}
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 6e4db5802..8647daba8 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
@@ -1,8 +1,9 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.util.dispatch.Dispatcher;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
 public class BlockModelDispatcher
     extends Dispatcher<Block, BlockModel>
@@ -12,7 +13,7 @@ public class BlockModelDispatcher
     {
         return instance;
     }
-    public static BlockModelEmpty modelEmpty = new BlockModelEmpty(null);
+    public static EmptyBlockModel modelEmpty = new EmptyBlockModel(null);
     public void addDispatch(BlockModel dispatchable)
     {
         addDispatch(dispatchable.block, dispatchable);
@@ -33,390 +34,405 @@ public class BlockModelDispatcher
     private BlockModelDispatcher()
     {
         instance = this;
-        addDispatch(new BlockModelStandard<>(Block.stone).withTextures("minecraft:block/stone"));
-        addDispatch(new BlockModelStandard<>(Block.basalt).withTextures("minecraft:block/basalt"));
-        addDispatch(new BlockModelStandard<>(Block.limestone).withTextures("minecraft:block/limestone"));
-        addDispatch(new BlockModelStandard<>(Block.granite).withTextures("minecraft:block/granite"));
-        addDispatch(new BlockModelStandard<>(Block.marble).withTextures("minecraft:block/marble"));
-        addDispatch(new BlockModelStandard<>(Block.slate).withTextures("minecraft:block/slate_top", "minecraft:block/slate_side"));
-        addDispatch(new BlockModelStandard<>(Block.permafrost).withTextures("minecraft:block/permafrost"));
-
-        addDispatch(new BlockModelStandard<>(Block.cobbleStone).withTextures("minecraft:block/cobbled_stone"));
-        addDispatch(new BlockModelStandard<>(Block.cobbleStoneMossy).withTextures("minecraft:block/cobbled_stone_mossy"));
-        addDispatch(new BlockModelStandard<>(Block.cobbleBasalt).withTextures("minecraft:block/cobbled_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.cobbleLimestone).withTextures("minecraft:block/cobbled_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.cobbleGranite).withTextures("minecraft:block/cobbled_granite"));
-        addDispatch(new BlockModelStandard<>(Block.cobblePermafrost).withTextures("minecraft:block/cobbled_permafrost"));
-
-        addDispatch(new BlockModelStandard<>(Block.stonePolished).withTextures("minecraft:block/polished_stone_top", "minecraft:block/polished_stone_side"));
-        addDispatch(new BlockModelStandard<>(Block.granitePolished).withTextures("minecraft:block/polished_granite_top", "minecraft:block/polished_granite_side"));
-        addDispatch(new BlockModelStandard<>(Block.limestonePolished).withTextures("minecraft:block/polished_limestone_top", "minecraft:block/polished_limestone_side"));
-        addDispatch(new BlockModelStandard<>(Block.basaltPolished).withTextures("minecraft:block/polished_basalt_top", "minecraft:block/polished_basalt_side"));
-        addDispatch(new BlockModelStandard<>(Block.slatePolished).withTextures("minecraft:block/polished_slate_top", "minecraft:block/polished_slate_side"));
-        addDispatch(new BlockModelStandard<>(Block.permafrostPolished).withTextures("minecraft:block/polished_permafrost_top", "minecraft:block/polished_permafrost_side"));
-
-        addDispatch(new BlockModelAxisAligned<>(Block.pillarMarble).withTextures("minecraft:block/pillar_marble_top", "minecraft:block/pillar_marble_side"));
-        addDispatch(new BlockModelStandard<>(Block.capstoneMarble).withTextures("minecraft:block/capstone_marble_top", "minecraft:block/capstone_marble_side"));
-
-        addDispatch(new BlockModelStandard<>(Block.sandstone).withTextures("minecraft:block/sandstone_top", "minecraft:block/sandstone_bottom", "minecraft:block/sandstone_side"));
-
-        addDispatch(new BlockModelStandard<>(Block.stoneCarved).withTextures("minecraft:block/polished_stone_top", "minecraft:block/carved_stone"));
-        addDispatch(new BlockModelStandard<>(Block.graniteCarved).withTextures("minecraft:block/polished_granite_top", "minecraft:block/carved_granite"));
-        addDispatch(new BlockModelStandard<>(Block.limestoneCarved).withTextures("minecraft:block/polished_limestone_top", "minecraft:block/carved_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.basaltCarved).withTextures("minecraft:block/polished_basalt_top", "minecraft:block/carved_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.permafrostCarved).withTextures("minecraft:block/polished_permafrost_top", "minecraft:block/carved_permafrost"));
-
-        addDispatch(new BlockModelStandard<>(Block.planksOak).withTextures("minecraft:block/planks_oak"));
-        addDispatch(new BlockModelPlanksPainted<>(Block.planksOakPainted));
-
-        addDispatch(new BlockModelTorch<>(Block.torchCoal).withTextures("minecraft:block/torch_coal"));
-
-        addDispatch(new BlockModelLadder<>(Block.ladderOak).withTextures("minecraft:block/ladder"));
-
-        addDispatch(new BlockModelFence<>(Block.fencePlanksOak).withTextures("minecraft:block/planks_oak"));
-        addDispatch(new BlockModelFencePainted<>(Block.fencePlanksOakPainted));
-
-        addDispatch(new BlockModelFenceGate<>(Block.fencegatePlanksOak).withTextures("minecraft:block/planks_oak"));
-        addDispatch(new BlockModelFenceGatePainted<>(Block.fencegatePlanksOakPainted));
-
-        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"));
-        addDispatch(new BlockModelStandard<>(Block.brickStonePolishedMossy).withTextures("minecraft:block/brick_polished_stone_mossy"));
-        addDispatch(new BlockModelStandard<>(Block.brickSandstone).withTextures("minecraft:block/brick_sandstone"));
-        addDispatch(new BlockModelStandard<>(Block.brickGold).withTextures("minecraft:block/brick_gold"));
-        addDispatch(new BlockModelStandard<>(Block.brickLapis).withTextures("minecraft:block/brick_lapis"));
-        addDispatch(new BlockModelStandard<>(Block.brickBasalt).withTextures("minecraft:block/brick_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.brickLimestone).withTextures("minecraft:block/brick_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.brickGranite).withTextures("minecraft:block/brick_granite"));
-        addDispatch(new BlockModelStandard<>(Block.brickMarble).withTextures("minecraft:block/brick_marble"));
-        addDispatch(new BlockModelStandard<>(Block.brickSlate).withTextures("minecraft:block/brick_slate"));
-        addDispatch(new BlockModelStandard<>(Block.brickStone).withTextures("minecraft:block/brick_stone"));
-        addDispatch(new BlockModelStandard<>(Block.brickPermafrost).withTextures("minecraft:block/brick_permafrost"));
-        addDispatch(new BlockModelStandard<>(Block.brickIron).withTextures("minecraft:block/brick_iron"));
-
-        addDispatch(new BlockModelSlab<>(Block.slabPlanksOak));
-        addDispatch(new BlockModelSlab<>(Block.slabCobbleStone));
-        addDispatch(new BlockModelSlab<>(Block.slabSandstone));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickStonePolished));
-        addDispatch(new BlockModelSlab<>(Block.slabStonePolished));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickMarble));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickClay));
-        addDispatch(new BlockModelSlabMarble<>(Block.slabCapstoneMarble));
-        addDispatch(new BlockModelSlab<>(Block.slabCobbleBasalt));
-        addDispatch(new BlockModelSlab<>(Block.slabCobbleLimestone));
-        addDispatch(new BlockModelSlab<>(Block.slabCobbleGranite));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickBasalt));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickLimestone));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickGranite));
-        addDispatch(new BlockModelSlabPainted<>(Block.slabPlanksOakPainted));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickSlate));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickStone));
-        addDispatch(new BlockModelSlab<>(Block.slabGranitePolished));
-        addDispatch(new BlockModelSlab<>(Block.slabLimestonePolished));
-        addDispatch(new BlockModelSlab<>(Block.slabBasaltPolished));
-        addDispatch(new BlockModelSlab<>(Block.slabPermafrostPolished));
-        addDispatch(new BlockModelSlab<>(Block.slabCobblePermafrost));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickSandstone));
-        addDispatch(new BlockModelSlab<>(Block.slabBrickPermafrost));
-
-        addDispatch(new BlockModelStairs<>(Block.stairsPlanksOak));
-        addDispatch(new BlockModelStairs<>(Block.stairsCobbleStone));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickStonePolished));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickMarble));
-        addDispatch(new BlockModelStairs<>(Block.stairsCobbleBasalt));
-        addDispatch(new BlockModelStairs<>(Block.stairsCobbleLimestone));
-        addDispatch(new BlockModelStairs<>(Block.stairsCobbleGranite));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickBasalt));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickLimestone));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickGranite));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickClay));
-        addDispatch(new BlockModelStairsPainted<>(Block.stairsPlanksOakPainted));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickSlate));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickStone));
-        addDispatch(new BlockModelStairs<>(Block.stairsSandstone));
-        addDispatch(new BlockModelStairs<>(Block.stairsCobblePermafrost));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickSandstone));
-        addDispatch(new BlockModelStairs<>(Block.stairsBrickPermafrost));
-
-        addDispatch(new BlockModelStandard<>(Block.obsidian).withTextures("minecraft:block/obsidian"));
-
-        addDispatch(new BlockModelTransparent<>(Block.glass, false).withTextures("minecraft:block/glass"));
-        addDispatch(new BlockModelTransparent<>(Block.glassTinted, false).withTextures("minecraft:block/glass_tinted"));
-
-        addDispatch(new BlockModelGrass<>(Block.grass)
+        addDispatch(new StandardBlockModel<>(Blocks.STONE).withTextures("minecraft:block/stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BASALT).withTextures("minecraft:block/basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.LIMESTONE).withTextures("minecraft:block/limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRANITE).withTextures("minecraft:block/granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.MARBLE).withTextures("minecraft:block/marble"));
+        addDispatch(new StandardBlockModel<>(Blocks.SLATE).withTextures("minecraft:block/slate_top", "minecraft:block/slate_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.PERMAFROST).withTextures("minecraft:block/permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_STONE).withTextures("minecraft:block/cobbled_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_STONE_MOSSY).withTextures("minecraft:block/cobbled_stone_mossy"));
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_BASALT).withTextures("minecraft:block/cobbled_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_LIMESTONE).withTextures("minecraft:block/cobbled_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_GRANITE).withTextures("minecraft:block/cobbled_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.COBBLE_PERMAFROST).withTextures("minecraft:block/cobbled_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.STONE_POLISHED).withTextures("minecraft:block/polished_stone_top", "minecraft:block/polished_stone_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRANITE_POLISHED).withTextures("minecraft:block/polished_granite_top", "minecraft:block/polished_granite_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.LIMESTONE_POLISHED).withTextures("minecraft:block/polished_limestone_top", "minecraft:block/polished_limestone_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.BASALT_POLISHED).withTextures("minecraft:block/polished_basalt_top", "minecraft:block/polished_basalt_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.SLATE_POLISHED).withTextures("minecraft:block/polished_slate_top", "minecraft:block/polished_slate_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.PERMAFROST_POLISHED).withTextures("minecraft:block/polished_permafrost_top", "minecraft:block/polished_permafrost_side"));
+
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.PILLAR_MARBLE).withTextures("minecraft:block/pillar_marble_top", "minecraft:block/pillar_marble_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.CAPSTONE_MARBLE).withTextures("minecraft:block/capstone_marble_top", "minecraft:block/capstone_marble_side"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.SANDSTONE).withTextures("minecraft:block/sandstone_top", "minecraft:block/sandstone_bottom", "minecraft:block/sandstone_side"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.STONE_CARVED).withTextures("minecraft:block/polished_stone_top", "minecraft:block/carved_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRANITE_CARVED).withTextures("minecraft:block/polished_granite_top", "minecraft:block/carved_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.LIMESTONE_CARVED).withTextures("minecraft:block/polished_limestone_top", "minecraft:block/carved_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BASALT_CARVED).withTextures("minecraft:block/polished_basalt_top", "minecraft:block/carved_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.PERMAFROST_CARVED).withTextures("minecraft:block/polished_permafrost_top", "minecraft:block/carved_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.PLANKS_OAK).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new PlanksPaintedBlockModel<>(Blocks.PLANKS_OAK_PAINTED));
+
+        addDispatch(new TorchBlockModel<>(Blocks.TORCH_COAL).withTextures("minecraft:block/torch_coal"));
+
+        addDispatch(new LadderBlockModel<>(Blocks.LADDER_OAK).withTextures("minecraft:block/ladder"));
+
+        addDispatch(new FenceBlockModel<>(Blocks.FENCE_PLANKS_OAK).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new FencePaintedBlockModel<>(Blocks.FENCE_PLANKS_OAK_PAINTED));
+
+        addDispatch(new FenceGateBlockModel<>(Blocks.FENCE_GATE_PLANKS_OAK).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new FenceGatePaintedBlockModel<>(Blocks.FENCE_GATE_PLANKS_OAK_PAINTED));
+
+        addDispatch(new StandardBlockModel<>(Blocks.BOOKSHELF_PLANKS_OAK).withTextures("minecraft:block/planks_oak", "minecraft:block/bookshelf_side"));
+
+        addDispatch(new WoolBlockModel<>(Blocks.WOOL));
+        addDispatch(new RopeBlockModel<>(Blocks.ROPE).withTextures("minecraft:block/rope"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_CLAY).withTextures("minecraft:block/brick_clay"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_STONE_POLISHED).withTextures("minecraft:block/brick_polished_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_STONE_POLISHED_MOSSY).withTextures("minecraft:block/brick_polished_stone_mossy"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_SANDSTONE).withTextures("minecraft:block/brick_sandstone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_GOLD).withTextures("minecraft:block/brick_gold"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_LAPIS).withTextures("minecraft:block/brick_lapis"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_BASALT).withTextures("minecraft:block/brick_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_LIMESTONE).withTextures("minecraft:block/brick_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_GRANITE).withTextures("minecraft:block/brick_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_MARBLE).withTextures("minecraft:block/brick_marble"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_SLATE).withTextures("minecraft:block/brick_slate"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_STONE).withTextures("minecraft:block/brick_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_PERMAFROST).withTextures("minecraft:block/brick_permafrost"));
+        addDispatch(new StandardBlockModel<>(Blocks.BRICK_IRON).withTextures("minecraft:block/brick_iron"));
+
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_PLANKS_OAK));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_COBBLE_STONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_SANDSTONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_STONE_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_STONE_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_MARBLE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_CLAY));
+        addDispatch(new SlabMarbleBlockModel<>(Blocks.SLAB_CAPSTONE_MARBLE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_COBBLE_BASALT));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_COBBLE_LIMESTONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_COBBLE_GRANITE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_BASALT));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_LIMESTONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_GRANITE));
+        addDispatch(new SlabPaintedBlockModel<>(Blocks.SLAB_PLANKS_PAINTED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_SLATE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_STONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_GRANITE_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_LIMESTONE_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BASALT_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_PERMAFROST_POLISHED));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_COBBLE_PERMAFROST));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_SANDSTONE));
+        addDispatch(new SlabBlockModel<>(Blocks.SLAB_BRICK_PERMAFROST));
+
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_PLANKS_OAK));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_COBBLE_STONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_STONE_POLISHED));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_MARBLE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_COBBLE_BASALT));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_COBBLE_LIMESTONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_COBBLE_GRANITE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_BASALT));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_LIMESTONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_GRANITE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_CLAY));
+        addDispatch(new StairsPaintedBlockModel<>(Blocks.STAIRS_PLANKS_PAINTED));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_SLATE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_STONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_SANDSTONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_COBBLE_PERMAFROST));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_SANDSTONE));
+        addDispatch(new StairsBlockModel<>(Blocks.STAIRS_BRICK_PERMAFROST));
+
+        addDispatch(new StandardBlockModel<>(Blocks.OBSIDIAN).withTextures("minecraft:block/obsidian"));
+
+        addDispatch(new TransparentBlockModel<>(Blocks.GLASS, false).withTextures("minecraft:block/glass"));
+        addDispatch(new TransparentBlockModel<>(Blocks.GLASS_TINTED, false).withTextures("minecraft:block/glass_tinted"));
+
+        addDispatch(new GrassBlockModel<>(Blocks.GRASS)
                 .withTextures("minecraft:block/grass_top", "minecraft:block/dirt", "minecraft:block/grass_side"));
-        addDispatch(new BlockModelStandard<>(Block.grassRetro).withTextures("minecraft:block/grass_retro_top", "minecraft:block/dirt", "minecraft:block/grass_retro_side"));
-        addDispatch(new BlockModelStandard<>(Block.grassScorched).withTextures("minecraft:block/grass_scorched_top", "minecraft:block/dirt_scorched", "minecraft:block/grass_scorched_side"));
-
-        addDispatch(new BlockModelStandard<>(Block.pathDirt).withTextures("minecraft:block/grass_path_top", "minecraft:block/dirt", "minecraft:block/grass_path_side"));
-
-        addDispatch(new BlockModelStandard<>(Block.dirt).withTextures("minecraft:block/dirt"));
-        addDispatch(new BlockModelStandard<>(Block.dirtScorched).withTextures("minecraft:block/dirt_scorched"));
-        addDispatch(new BlockModelStandard<>(Block.dirtScorchedRich).withTextures("minecraft:block/dirt_scorched_rich"));
-
-        addDispatch(new BlockModelStandard<>(Block.mud).withTextures("minecraft:block/mud"));
-        addDispatch(new BlockModelStandard<>(Block.mudBaked).withTextures("minecraft:block/mud_baked"));
-
-        addDispatch(new BlockModelStandard<>(Block.spongeDry).withTextures("minecraft:block/sponge"));
-        addDispatch(new BlockModelStandard<>(Block.spongeWet).withTextures("minecraft:block/sponge_wet"));
-
-        addDispatch(new BlockModelMossyStone<>(Block.mossStone).withTextures("minecraft:block/stone"));
-        addDispatch(new BlockModelMossyStone<>(Block.mossBasalt).withTextures("minecraft:block/basalt"));
-        addDispatch(new BlockModelMossyStone<>(Block.mossLimestone).withTextures("minecraft:block/limestone"));
-        addDispatch(new BlockModelMossyStone<>(Block.mossGranite).withTextures("minecraft:block/granite"));
-
-        addDispatch(new BlockModelStandard<>(Block.sand).withTextures("minecraft:block/sand"));
-        addDispatch(new BlockModelStandard<>(Block.gravel).withTextures("minecraft:block/gravel"));
-
-        addDispatch(new BlockModelStandard<>(Block.bedrock).withTextures("minecraft:block/bedrock"));
-
-        addDispatch(new BlockModelFluid<>(Block.fluidWaterFlowing).withTextures("minecraft:block/water_still", "minecraft:block/water_flowing", "minecraft:block/water_flowing"));
-        addDispatch(new BlockModelFluid<>(Block.fluidWaterStill).withTextures("minecraft:block/water_still", "minecraft:block/water_flowing"));
-        addDispatch(new BlockModelFluid<>(Block.fluidLavaFlowing).withTextures("minecraft:block/lava_still", "minecraft:block/lava_flowing", "minecraft:block/lava_flowing"));
-        addDispatch(new BlockModelFluid<>(Block.fluidLavaStill).withTextures("minecraft:block/lava_still", "minecraft:block/lava_flowing"));
-
-        addDispatch(new BlockModelAxisAligned<>(Block.logOak).withTextures("minecraft:block/log_oak_top", "minecraft:block/log_oak_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logPine).withTextures("minecraft:block/log_pine_top", "minecraft:block/log_pine_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logBirch).withTextures("minecraft:block/log_birch_top", "minecraft:block/log_birch_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logCherry).withTextures("minecraft:block/log_cherry_top", "minecraft:block/log_cherry_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logEucalyptus).withTextures("minecraft:block/log_eucalyptus_top", "minecraft:block/log_eucalyptus_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logOakMossy).withTextures("minecraft:block/log_oak_mossy_top", "minecraft:block/log_oak_mossy_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logThorn).withTextures("minecraft:block/log_thorn_top", "minecraft:block/log_thorn_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.logPalm).withTextures("minecraft:block/log_palm_top", "minecraft:block/log_palm_side"));
-
-        addDispatch(new BlockModelLeaves<>(Block.leavesOak, "minecraft:block/leaves_oak"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesOakRetro, "minecraft:block/leaves_oak_retro"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesPine, "minecraft:block/leaves_pine"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesBirch, "minecraft:block/leaves_birch"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesCherry, "minecraft:block/leaves_cherry"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesEucalyptus, "minecraft:block/leaves_eucalyptus"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesShrub, "minecraft:block/leaves_shrub"));
-        addDispatch(new BlockModelCherryLeavesBloom<>(Block.leavesCherryFlowering));
-        addDispatch(new BlockModelCacaoLeaves<>(Block.leavesCacao));
-        addDispatch(new BlockModelLeaves<>(Block.leavesThorn, "minecraft:block/leaves_caatinga"));
-        addDispatch(new BlockModelLeaves<>(Block.leavesPalm, "minecraft:block/leaves_palm"));
-
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingOak).withTextures("minecraft:block/sapling_oak"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingOakRetro).withTextures("minecraft:block/sapling_oak_retro"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingPine).withTextures("minecraft:block/sapling_pine"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingBirch).withTextures("minecraft:block/sapling_birch"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingCherry).withTextures("minecraft:block/sapling_cherry"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingEucalyptus).withTextures("minecraft:block/sapling_eucalyptus"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingShrub).withTextures("minecraft:block/sapling_shrub"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingCacao).withTextures("minecraft:block/sapling_cacao"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingThorn).withTextures("minecraft:block/sapling_thorn"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.saplingPalm).withTextures("minecraft:block/sapling_palm"));
-
-        addDispatch(new BlockModelCrossedSquares<>(Block.tallgrass).withTextures("minecraft:block/tallgrass"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.tallgrassFern).withTextures("minecraft:block/fern"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.deadbush).withTextures("minecraft:block/deadbush"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.spinifex).withTextures("minecraft:block/spinifex"));
-        addDispatch(new BlockModelAlgae<>(Block.algae).withTextures("minecraft:block/algae").withCustomItemBounds(0.0f, 0.01f, 0.0f, 1.0f, 0.0125f, 1.0f));
-
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerYellow).withTextures("minecraft:block/flower_yellow"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerRed).withTextures("minecraft:block/flower_red"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerPink).withTextures("minecraft:block/flower_pink"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerPurple).withTextures("minecraft:block/flower_purple"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerLightBlue).withTextures("minecraft:block/flower_light_blue"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.flowerOrange).withTextures("minecraft:block/flower_orange"));
-
-        addDispatch(new BlockModelCrossedSquares<>(Block.mushroomBrown).withTextures("minecraft:block/mushroom_brown"));
-        addDispatch(new BlockModelCrossedSquares<>(Block.mushroomRed).withTextures("minecraft:block/mushroom_red"));
-
-        addDispatch(new BlockModelStandard<>(Block.oreCoalStone).withTextures("minecraft:block/ore_coal_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreCoalBasalt).withTextures("minecraft:block/ore_coal_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreCoalLimestone).withTextures("minecraft:block/ore_coal_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreCoalGranite).withTextures("minecraft:block/ore_coal_granite"));
-        addDispatch(new BlockModelStandard<>(Block.oreIronStone).withTextures("minecraft:block/ore_iron_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreIronBasalt).withTextures("minecraft:block/ore_iron_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreIronLimestone).withTextures("minecraft:block/ore_iron_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreIronGranite).withTextures("minecraft:block/ore_iron_granite"));
-        addDispatch(new BlockModelStandard<>(Block.oreGoldStone).withTextures("minecraft:block/ore_gold_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreGoldBasalt).withTextures("minecraft:block/ore_gold_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreGoldLimestone).withTextures("minecraft:block/ore_gold_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreGoldGranite).withTextures("minecraft:block/ore_gold_granite"));
-        addDispatch(new BlockModelStandard<>(Block.oreLapisStone).withTextures("minecraft:block/ore_lapis_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreLapisBasalt).withTextures("minecraft:block/ore_lapis_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreLapisLimestone).withTextures("minecraft:block/ore_lapis_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreLapisGranite).withTextures("minecraft:block/ore_lapis_granite"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneStone).withTextures("minecraft:block/ore_redstone_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneBasalt).withTextures("minecraft:block/ore_redstone_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneLimestone).withTextures("minecraft:block/ore_redstone_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneGranite).withTextures("minecraft:block/ore_redstone_granite"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneGlowingStone).withTextures("minecraft:block/ore_redstone_stone").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneGlowingBasalt).withTextures("minecraft:block/ore_redstone_basalt").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneGlowingLimestone).withTextures("minecraft:block/ore_redstone_limestone").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
-        addDispatch(new BlockModelStandard<>(Block.oreRedstoneGlowingGranite).withTextures("minecraft:block/ore_redstone_granite").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
-        addDispatch(new BlockModelStandard<>(Block.oreDiamondStone).withTextures("minecraft:block/ore_diamond_stone"));
-        addDispatch(new BlockModelStandard<>(Block.oreDiamondBasalt).withTextures("minecraft:block/ore_diamond_basalt"));
-        addDispatch(new BlockModelStandard<>(Block.oreDiamondLimestone).withTextures("minecraft:block/ore_diamond_limestone"));
-        addDispatch(new BlockModelStandard<>(Block.oreDiamondGranite).withTextures("minecraft:block/ore_diamond_granite"));
-
-        addDispatch(new BlockModelStandard<>(Block.oreNethercoalNetherrack).withTextures("minecraft:block/ore_nethercoal_netherrack").withOverbrightTexture("minecraft:block/ore_nethercoal_netherrack_overlay"));
-
-        addDispatch(new BlockModelStandard<>(Block.blockCoal).withTextures("minecraft:block/block_coal"));
-        addDispatch(new BlockModelStandard<>(Block.blockIron).withTextures("minecraft:block/block_iron_top", "minecraft:block/block_iron_bottom", "minecraft:block/block_iron_side"));
-        addDispatch(new BlockModelStandard<>(Block.blockGold).withTextures("minecraft:block/block_gold_top", "minecraft:block/block_gold_bottom", "minecraft:block/block_gold_side"));
-        addDispatch(new BlockModelStandard<>(Block.blockLapis).withTextures("minecraft:block/block_lapis"));
-        addDispatch(new BlockModelStandard<>(Block.blockRedstone).withTextures("minecraft:block/block_redstone"));
-        addDispatch(new BlockModelStandard<>(Block.blockDiamond).withTextures("minecraft:block/block_diamond_top", "minecraft:block/block_diamond_bottom", "minecraft:block/block_diamond_side"));
-        addDispatch(new BlockModelStandard<>(Block.blockNetherCoal).withTextures("minecraft:block/block_nethercoal").withOverbrightTexture("minecraft:block/block_nethercoal_overlay"));
-        addDispatch(new BlockModelStandard<>(Block.blockSteel).withTextures("minecraft:block/block_steel_top", "minecraft:block/block_steel_bottom", "minecraft:block/block_steel_side"));
-        addDispatch(new BlockModelStandard<>(Block.blockQuartz).withTextures("minecraft:block/block_quartz"));
-        addDispatch(new BlockModelStandard<>(Block.blockOlivine).withTextures("minecraft:block/block_olivine"));
-        addDispatch(new BlockModelStandard<>(Block.blockCharcoal).withTextures("minecraft:block/block_charcoal"));
-
-        addDispatch(new BlockModelRedstoneWire<>(Block.wireRedstone));
-
-        addDispatch(new BlockModelTorchRedstone(Block.torchRedstoneIdle).withTextures("minecraft:block/torch_redstone_idle"));
-        addDispatch(new BlockModelTorchRedstone(Block.torchRedstoneActive).withTextures("minecraft:block/torch_redstone_active"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRASS_RETRO).withTextures("minecraft:block/grass_retro_top", "minecraft:block/dirt", "minecraft:block/grass_retro_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRASS_SCORCHED).withTextures("minecraft:block/grass_scorched_top", "minecraft:block/dirt_scorched", "minecraft:block/grass_scorched_side"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.PATH_DIRT).withTextures("minecraft:block/grass_path_top", "minecraft:block/dirt", "minecraft:block/grass_path_side"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.DIRT).withTextures("minecraft:block/dirt"));
+        addDispatch(new StandardBlockModel<>(Blocks.DIRT_SCORCHED).withTextures("minecraft:block/dirt_scorched"));
+        addDispatch(new StandardBlockModel<>(Blocks.DIRT_SCORCHED_RICH).withTextures("minecraft:block/dirt_scorched_rich"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.MUD).withTextures("minecraft:block/mud"));
+        addDispatch(new StandardBlockModel<>(Blocks.MUD_BAKED).withTextures("minecraft:block/mud_baked"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.SPONGE_DRY).withTextures("minecraft:block/sponge"));
+        addDispatch(new StandardBlockModel<>(Blocks.SPONGE_WET).withTextures("minecraft:block/sponge_wet"));
+
+        addDispatch(new MossyStoneBlockModel<>(Blocks.MOSS_STONE).withTextures("minecraft:block/stone"));
+        addDispatch(new MossyStoneBlockModel<>(Blocks.MOSS_BASALT).withTextures("minecraft:block/basalt"));
+        addDispatch(new MossyStoneBlockModel<>(Blocks.MOSS_LIMESTONE).withTextures("minecraft:block/limestone"));
+        addDispatch(new MossyStoneBlockModel<>(Blocks.MOSS_GRANITE).withTextures("minecraft:block/granite"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.SAND).withTextures("minecraft:block/sand"));
+        addDispatch(new StandardBlockModel<>(Blocks.GRAVEL).withTextures("minecraft:block/gravel"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.BEDROCK).withTextures("minecraft:block/bedrock"));
+
+        addDispatch(new FluidBlockModel<>(Blocks.FLUID_WATER_FLOWING).withTextures("minecraft:block/water_still", "minecraft:block/water_flowing", "minecraft:block/water_flowing"));
+        addDispatch(new FluidBlockModel<>(Blocks.FLUID_WATER_STILL).withTextures("minecraft:block/water_still", "minecraft:block/water_flowing"));
+        addDispatch(new FluidBlockModel<>(Blocks.FLUID_LAVA_FLOWING).withTextures("minecraft:block/lava_still", "minecraft:block/lava_flowing", "minecraft:block/lava_flowing"));
+        addDispatch(new FluidBlockModel<>(Blocks.FLUID_LAVA_STILL).withTextures("minecraft:block/lava_still", "minecraft:block/lava_flowing"));
+
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_OAK).withTextures("minecraft:block/log_oak_top", "minecraft:block/log_oak_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_PINE).withTextures("minecraft:block/log_pine_top", "minecraft:block/log_pine_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_BIRCH).withTextures("minecraft:block/log_birch_top", "minecraft:block/log_birch_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_CHERRY).withTextures("minecraft:block/log_cherry_top", "minecraft:block/log_cherry_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_EUCALYPTUS).withTextures("minecraft:block/log_eucalyptus_top", "minecraft:block/log_eucalyptus_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_OAK_MOSSY).withTextures("minecraft:block/log_oak_mossy_top", "minecraft:block/log_oak_mossy_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_THORN).withTextures("minecraft:block/log_thorn_top", "minecraft:block/log_thorn_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.LOG_PALM).withTextures("minecraft:block/log_palm_top", "minecraft:block/log_palm_side"));
+
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_OAK, "minecraft:block/leaves_oak"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_OAK_RETRO, "minecraft:block/leaves_oak_retro"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_PINE, "minecraft:block/leaves_pine"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_BIRCH, "minecraft:block/leaves_birch"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_CHERRY, "minecraft:block/leaves_cherry"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_EUCALYPTUS, "minecraft:block/leaves_eucalyptus"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_SHRUB, "minecraft:block/leaves_shrub"));
+        addDispatch(new FloweringCherryLeavesBlockModel<>(Blocks.LEAVES_CHERRY_FLOWERING));
+        addDispatch(new CacaoLeavesBlockModel<>(Blocks.LEAVES_CACAO));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_THORN, "minecraft:block/leaves_caatinga"));
+        addDispatch(new LeavesBlockModel<>(Blocks.LEAVES_PALM, "minecraft:block/leaves_palm"));
+
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_OAK).withTextures("minecraft:block/sapling_oak"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_OAK_RETRO).withTextures("minecraft:block/sapling_oak_retro"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_PINE).withTextures("minecraft:block/sapling_pine"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_BIRCH).withTextures("minecraft:block/sapling_birch"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_CHERRY).withTextures("minecraft:block/sapling_cherry"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_EUCALYPTUS).withTextures("minecraft:block/sapling_eucalyptus"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_SHRUB).withTextures("minecraft:block/sapling_shrub"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_CACAO).withTextures("minecraft:block/sapling_cacao"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_THORN).withTextures("minecraft:block/sapling_thorn"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SAPLING_PALM).withTextures("minecraft:block/sapling_palm"));
+
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.TALLGRASS).withTextures("minecraft:block/tallgrass"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.TALLGRASS_FERN).withTextures("minecraft:block/fern"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.DEADBUSH).withTextures("minecraft:block/deadbush"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SPINIFEX).withTextures("minecraft:block/spinifex"));
+        addDispatch(new AlgaeBlockModel<>(Blocks.ALGAE).withTextures("minecraft:block/algae").withCustomItemBounds(0.0f, 0.01f, 0.0f, 1.0f, 0.0125f, 1.0f));
+
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_YELLOW).withTextures("minecraft:block/flower_yellow"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_RED).withTextures("minecraft:block/flower_red"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_PINK).withTextures("minecraft:block/flower_pink"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_PURPLE).withTextures("minecraft:block/flower_purple"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_LIGHT_BLUE).withTextures("minecraft:block/flower_light_blue"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.FLOWER_ORANGE).withTextures("minecraft:block/flower_orange"));
+
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.MUSHROOM_BROWN).withTextures("minecraft:block/mushroom_brown"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.MUSHROOM_RED).withTextures("minecraft:block/mushroom_red"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_COAL_STONE).withTextures("minecraft:block/ore_coal_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_COAL_BASALT).withTextures("minecraft:block/ore_coal_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_COAL_LIMESTONE).withTextures("minecraft:block/ore_coal_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_COAL_GRANITE).withTextures("minecraft:block/ore_coal_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_COAL_PERMAFROST).withTextures("minecraft:block/ore_coal_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_IRON_STONE).withTextures("minecraft:block/ore_iron_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_IRON_BASALT).withTextures("minecraft:block/ore_iron_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_IRON_LIMESTONE).withTextures("minecraft:block/ore_iron_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_IRON_GRANITE).withTextures("minecraft:block/ore_iron_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_IRON_PERMAFROST).withTextures("minecraft:block/ore_iron_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_GOLD_STONE).withTextures("minecraft:block/ore_gold_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_GOLD_BASALT).withTextures("minecraft:block/ore_gold_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_GOLD_LIMESTONE).withTextures("minecraft:block/ore_gold_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_GOLD_GRANITE).withTextures("minecraft:block/ore_gold_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_GOLD_PERMAFROST).withTextures("minecraft:block/ore_gold_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_LAPIS_STONE).withTextures("minecraft:block/ore_lapis_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_LAPIS_BASALT).withTextures("minecraft:block/ore_lapis_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_LAPIS_LIMESTONE).withTextures("minecraft:block/ore_lapis_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_LAPIS_GRANITE).withTextures("minecraft:block/ore_lapis_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_LAPIS_PERMAFROST).withTextures("minecraft:block/ore_lapis_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_STONE).withTextures("minecraft:block/ore_redstone_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_BASALT).withTextures("minecraft:block/ore_redstone_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_LIMESTONE).withTextures("minecraft:block/ore_redstone_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GRANITE).withTextures("minecraft:block/ore_redstone_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_PERMAFROST).withTextures("minecraft:block/ore_redstone_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GLOWING_STONE).withTextures("minecraft:block/ore_redstone_stone").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GLOWING_BASALT).withTextures("minecraft:block/ore_redstone_basalt").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GLOWING_LIMESTONE).withTextures("minecraft:block/ore_redstone_limestone").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GLOWING_GRANITE).withTextures("minecraft:block/ore_redstone_granite").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_REDSTONE_GLOWING_PERMAFROST).withTextures("minecraft:block/ore_redstone_permafrost").withOverbrightTexture("minecraft:block/ore_redstone_overlay"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_DIAMOND_STONE).withTextures("minecraft:block/ore_diamond_stone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_DIAMOND_BASALT).withTextures("minecraft:block/ore_diamond_basalt"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_DIAMOND_LIMESTONE).withTextures("minecraft:block/ore_diamond_limestone"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_DIAMOND_GRANITE).withTextures("minecraft:block/ore_diamond_granite"));
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_DIAMOND_PERMAFROST).withTextures("minecraft:block/ore_diamond_permafrost"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.ORE_NETHERCOAL_NETHERRACK).withTextures("minecraft:block/ore_nethercoal_netherrack").withOverbrightTexture("minecraft:block/ore_nethercoal_netherrack_overlay"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_COAL).withTextures("minecraft:block/block_coal"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_IRON).withTextures("minecraft:block/block_iron_top", "minecraft:block/block_iron_bottom", "minecraft:block/block_iron_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_GOLD).withTextures("minecraft:block/block_gold_top", "minecraft:block/block_gold_bottom", "minecraft:block/block_gold_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_LAPIS).withTextures("minecraft:block/block_lapis"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_REDSTONE).withTextures("minecraft:block/block_redstone"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_DIAMOND).withTextures("minecraft:block/block_diamond_top", "minecraft:block/block_diamond_bottom", "minecraft:block/block_diamond_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_NETHER_COAL).withTextures("minecraft:block/block_nethercoal").withOverbrightTexture("minecraft:block/block_nethercoal_overlay"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_STEEL).withTextures("minecraft:block/block_steel_top", "minecraft:block/block_steel_bottom", "minecraft:block/block_steel_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_QUARTZ).withTextures("minecraft:block/block_quartz"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_OLIVINE).withTextures("minecraft:block/block_olivine"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_CHARCOAL).withTextures("minecraft:block/block_charcoal"));
+
+        addDispatch(new RedstoneWireBlockModel<>(Blocks.WIRE_REDSTONE));
+
+        addDispatch(new TorchRedstoneBlockModel(Blocks.TORCH_REDSTONE_IDLE).withTextures("minecraft:block/torch_redstone_idle"));
+        addDispatch(new TorchRedstoneBlockModel(Blocks.TORCH_REDSTONE_ACTIVE).withTextures("minecraft:block/torch_redstone_active"));
 
         final float width = 0.1875F;
         final float height = 0.125F;
         final float depth = 0.125F;
-        addDispatch(new BlockModelStandard<>(Block.buttonStone).withTextures("minecraft:block/stone").withCustomItemBounds(0.5F - width, 0.5F - height, 0.5F - depth, 0.5F + width, 0.5F + height, 0.5F + depth));
+        addDispatch(new StandardBlockModel<>(Blocks.BUTTON_STONE).withTextures("minecraft:block/stone").withCustomItemBounds(0.5F - width, 0.5F - height, 0.5F - depth, 0.5F + width, 0.5F + height, 0.5F + depth));
 
-        addDispatch(new BlockModelLever<>(Block.leverCobbleStone).withTextures("minecraft:block/lever_cobbled_stone"));
+        addDispatch(new LeverBlockModel<>(Blocks.LEVER_COBBLE_STONE).withTextures("minecraft:block/lever_cobbled_stone"));
 
         final float f = 0.5F;
         final float f1 = 0.125F;
         final float f2 = 0.5F;
-        addDispatch(new BlockModelStandard<>(Block.pressureplateStone).withTextures("minecraft:block/stone").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
-        addDispatch(new BlockModelStandard<>(Block.pressureplatePlanksOak).withTextures("minecraft:block/planks_oak").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
-        addDispatch(new BlockModelStandard<>(Block.pressureplateCobbleStone).withTextures("minecraft:block/cobbled_stone").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
+        addDispatch(new StandardBlockModel<>(Blocks.PRESSURE_PLATE_STONE).withTextures("minecraft:block/stone").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
+        addDispatch(new StandardBlockModel<>(Blocks.PRESSURE_PLATE_PLANKS_OAK).withTextures("minecraft:block/planks_oak").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
+        addDispatch(new StandardBlockModel<>(Blocks.PRESSURE_PLATE_COBBLE_STONE).withTextures("minecraft:block/cobbled_stone").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
 
-        addDispatch(new BlockModelMotionSensor(Block.motionsensorIdle).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_idle_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
-        addDispatch(new BlockModelMotionSensor(Block.motionsensorActive).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_active_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
+        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_IDLE).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_idle_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
+        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_ACTIVE).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_active_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
 
-        addDispatch(new BlockModelRepeater(Block.repeaterIdle).withTextures("minecraft:block/repeater_idle_top", "minecraft:block/polished_stone_top"));
-        addDispatch(new BlockModelRepeater(Block.repeaterActive).withTextures("minecraft:block/repeater_active_top", "minecraft:block/polished_stone_top").withOverbrightTexture("minecraft:block/repeater_active_overlay"));
+        addDispatch(new RepeaterBlockModel(Blocks.REPEATER_IDLE).withTextures("minecraft:block/repeater_idle_top", "minecraft:block/polished_stone_top"));
+        addDispatch(new RepeaterBlockModel(Blocks.REPEATER_ACTIVE).withTextures("minecraft:block/repeater_active_top", "minecraft:block/polished_stone_top").withOverbrightTexture("minecraft:block/repeater_active_overlay"));
 
-        addDispatch(new BlockModelPiston<>(Block.pistonBase, TextureRegistry.getTexture("minecraft:block/piston_face")).withTextures("minecraft:block/piston_face").withCustomItemBounds(0,0,0,1,1,1));
-        addDispatch(new BlockModelPiston<>(Block.pistonBaseSticky,TextureRegistry.getTexture("minecraft:block/piston_face_sticky")).withTextures("minecraft:block/piston_face_sticky").withCustomItemBounds(0,0,0,1,1,1));
-        addDispatch(new BlockModelPistonHead(Block.pistonHead).withTextures("minecraft:block/piston_face"));
-        addDispatch(new BlockModelEmpty(Block.pistonMoving));
+        addDispatch(new PistonBlockModel<>(Blocks.PISTON_BASE, TextureRegistry.getTexture("minecraft:block/piston_face")).withTextures("minecraft:block/piston_face").withCustomItemBounds(0,0,0,1,1,1));
+        addDispatch(new PistonBlockModel<>(Blocks.PISTON_BASE_STICKY,TextureRegistry.getTexture("minecraft:block/piston_face_sticky")).withTextures("minecraft:block/piston_face_sticky").withCustomItemBounds(0,0,0,1,1,1));
+        addDispatch(new PistonHeadBlockModel(Blocks.PISTON_HEAD).withTextures("minecraft:block/piston_face"));
+        addDispatch(new EmptyBlockModel(Blocks.PISTON_MOVING));
 
-        addDispatch(new BlockModelStandard<>(Block.noteblock).withTextures("minecraft:block/noteblock"));
+        addDispatch(new StandardBlockModel<>(Blocks.NOTEBLOCK).withTextures("minecraft:block/noteblock"));
 
-        addDispatch(new BlockModelRail<>(Block.rail).withTextures("minecraft:block/rail_straight"));
-        addDispatch(new BlockModelRail<>(Block.railPowered).withTextures("minecraft:block/rail_powered_idle"));
-        addDispatch(new BlockModelRail<>(Block.railDetector).withTextures("minecraft:block/rail_detector"));
+        addDispatch(new RailBlockModel<>(Blocks.RAIL).withTextures("minecraft:block/rail_straight"));
+        addDispatch(new RailBlockModel<>(Blocks.RAIL_POWERED).withTextures("minecraft:block/rail_powered_idle"));
+        addDispatch(new RailBlockModel<>(Blocks.RAIL_DETECTOR).withTextures("minecraft:block/rail_detector"));
 
-        addDispatch(new BlockModelSpikes<>(Block.spikes).withTextures("minecraft:block/spikes_top", "minecraft:block/spikes_bottom", "minecraft:block/spikes_side"));
+        addDispatch(new SpikesBlockModel<>(Blocks.SPIKES).withTextures("minecraft:block/spikes_top", "minecraft:block/spikes_bottom", "minecraft:block/spikes_side"));
 
-        addDispatch(new BlockModelHorizontalRotation<>(Block.dispenserCobbleStone).withTextures("minecraft:block/dispenser_top", "minecraft:block/dispenser_top", "minecraft:block/dispenser_front", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.DISPENSER_COBBLE_STONE).withTextures("minecraft:block/dispenser_top", "minecraft:block/dispenser_top", "minecraft:block/dispenser_front", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side"));
 
-        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 TrapDoorBlockModel<>(Blocks.TRAPDOOR_PLANKS_OAK).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/trapdoor_planks_oak_side"));
+        addDispatch(new TrapDoorBlockModel<>(Blocks.TRAPDOOR_IRON).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/trapdoor_iron_side"));
+        addDispatch(new TrapDoorBlockModel<>(Blocks.TRAPDOOR_GLASS).withTextures("minecraft:block/glass", "minecraft:block/trapdoor_glass_side"));
+        addDispatch(new TrapDoorPaintedBlockModel<>(Blocks.TRAPDOOR_PLANKS_PAINTED));
 
-        addDispatch(new BlockModelStandard<>(Block.tnt).withTextures("minecraft:block/tnt_top", "minecraft:block/tnt_bottom", "minecraft:block/tnt_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.TNT).withTextures("minecraft:block/tnt_top", "minecraft:block/tnt_bottom", "minecraft:block/tnt_side"));
 
-        addDispatch(new BlockModelDoor<>(Block.doorPlanksOakBottom).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_bottom"));
-        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 DoorBlockModel<>(Blocks.DOOR_PLANKS_OAK_BOTTOM).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_bottom"));
+        addDispatch(new DoorBlockModel<>(Blocks.DOOR_PLANKS_OAK_TOP).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_top"));
+        addDispatch(new DoorBlockModel<>(Blocks.DOOR_IRON_BOTTOM).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/door_iron_bottom"));
+        addDispatch(new DoorBlockModel<>(Blocks.DOOR_IRON_TOP).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/door_iron_top"));
+        addDispatch(new PaintedDoorBlockModel<>(Blocks.DOOR_PLANKS_PAINTED_BOTTOM, false).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_bottom"));
+        addDispatch(new PaintedDoorBlockModel<>(Blocks.DOOR_PLANKS_PAINTED_TOP, true).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/door_planks_oak_top"));
+        addDispatch(new GlassDoorBlockModel<>(Blocks.DOOR_GLASS_BOTTOM).withTextures("minecraft:block/glass", "minecraft:block/door_glass_bottom"));
+        addDispatch(new GlassDoorBlockModel<>(Blocks.DOOR_GLASS_TOP).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 TransparentBlockModel<>(Blocks.MESH, true).withTextures("minecraft:block/mesh"));
+        addDispatch(new TransparentBlockModel<>(Blocks.MESH_GOLD, 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 BedBlockModel<>(Blocks.BED));
+        addDispatch(new SeatBlockModel<>(Blocks.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 CrossedSquaresBlockModel<>(Blocks.COBWEB).withTextures("minecraft:block/cobweb"));
+        addDispatch(new FireBlockModel<>(Blocks.FIRE).withTextures("minecraft:block/fire"));
+        addDispatch(new BrazierBlockModel<>(Blocks.BRAZIER_INACTIVE).withTextures("minecraft:block/brazier_base", "minecraft:block/brazier_side"));
+        addDispatch(new BrazierBlockModel<>(Blocks.BRAZIER_ACTIVE).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"));
+        addDispatch(new StandardBlockModel<>(Blocks.MOBSPAWNER).withTextures("minecraft:block/mobspawner"));
+        addDispatch(new TransparentBlockModel<>(Blocks.MOBSPAWNER_DEACTIVATED, true).withTextures("minecraft:block/mobspawner"));
 
-        addDispatch(new BlockModelStandard<>(Block.workbench).withTextures("minecraft:block/workbench_top", "minecraft:block/planks_oak", "minecraft:block/workbench_front", "minecraft:block/workbench_side", "minecraft:block/workbench_front", "minecraft:block/workbench_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.WORKBENCH).withTextures("minecraft:block/workbench_top", "minecraft:block/planks_oak", "minecraft:block/workbench_front", "minecraft:block/workbench_side", "minecraft:block/workbench_front", "minecraft:block/workbench_side"));
 
-        addDispatch(new BlockModelHorizontalRotation<>(Block.furnaceStoneIdle).withTextures("minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_idle_front", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.furnaceStoneActive).withTextures("minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_active_front", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.furnaceBlastIdle).withTextures("minecraft:block/furnace_blast_top", "minecraft:block/furnace_blast_bottom", "minecraft:block/furnace_blast_idle_front", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.furnaceBlastActive).withTextures("minecraft:block/furnace_blast_top", "minecraft:block/furnace_blast_bottom", "minecraft:block/furnace_blast_active_front", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.FURNACE_STONE_IDLE).withTextures("minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_idle_front", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.FURNACE_STONE_ACTIVE).withTextures("minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_top", "minecraft:block/furnace_stone_active_front", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side", "minecraft:block/furnace_stone_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.FURNACE_BLAST_IDLE).withTextures("minecraft:block/furnace_blast_top", "minecraft:block/furnace_blast_bottom", "minecraft:block/furnace_blast_idle_front", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.FURNACE_BLAST_ACTIVE).withTextures("minecraft:block/furnace_blast_top", "minecraft:block/furnace_blast_bottom", "minecraft:block/furnace_blast_active_front", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side", "minecraft:block/furnace_blast_side"));
 
-        addDispatch(new BlockModelHorizontalRotation<>(Block.trommelIdle).withTextures("minecraft:block/trommel_top", "minecraft:block/trommel_top", "minecraft:block/trommel_idle_front", "minecraft:block/trommel_side_slot", "minecraft:block/trommel_idle_front", "minecraft:block/trommel_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.trommelActive).withTextures("minecraft:block/trommel_top", "minecraft:block/trommel_top", "minecraft:block/trommel_active_front", "minecraft:block/trommel_side_slot", "minecraft:block/trommel_active_back", "minecraft:block/trommel_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.TROMMEL_IDLE).withTextures("minecraft:block/trommel_top", "minecraft:block/trommel_top", "minecraft:block/trommel_idle_front", "minecraft:block/trommel_side_slot", "minecraft:block/trommel_idle_front", "minecraft:block/trommel_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.TROMMEL_ACTIVE).withTextures("minecraft:block/trommel_top", "minecraft:block/trommel_top", "minecraft:block/trommel_active_front", "minecraft:block/trommel_side_slot", "minecraft:block/trommel_active_back", "minecraft:block/trommel_side"));
 
-        addDispatch(new BlockModelStandard<>(Block.chestLegacy).withTextures("minecraft:block/chest_planks_oak_top"));
-        addDispatch(new BlockModelStandard<>(Block.chestLegacyPainted).withTextures("minecraft:block/chest_planks_oak_top"));
-        addDispatch(new BlockModelChest<>(Block.chestPlanksOak, "minecraft:block/chest_planks_oak").withTextures("minecraft:block/chest_planks_oak_top"));
-        addDispatch(new BlockModelChestPainted<>(Block.chestPlanksOakPainted).withTextures("minecraft:block/chest_planks_oak_top"));
+        addDispatch(new StandardBlockModel<>(Blocks.CHEST_LEGACY).withTextures("minecraft:block/chest_planks_oak_top"));
+        addDispatch(new StandardBlockModel<>(Blocks.CHEST_LEGACY_PAINTED).withTextures("minecraft:block/chest_planks_oak_top"));
+        addDispatch(new ChestBlockModel<>(Blocks.CHEST_PLANKS_OAK, "minecraft:block/chest_planks_oak").withTextures("minecraft:block/chest_planks_oak_top"));
+        addDispatch(new PaintedChestBlockModel<>(Blocks.CHEST_PLANKS_OAK_PAINTED).withTextures("minecraft:block/chest_planks_oak_top"));
 
-        addDispatch(new BlockModelCropsWheat<>(Block.cropsWheat));
-        addDispatch(new BlockModelCropsPumpkin<>(Block.cropsPumpkin));
+        addDispatch(new CropsWheatBlockModel<>(Blocks.CROPS_WHEAT));
+        addDispatch(new CropsPumpkinBlockModel<>(Blocks.CROPS_PUMPKIN));
 
-        addDispatch(new BlockModelFarmland<>(Block.farmlandDirt).withTextures("minecraft:block/dirt"));
+        addDispatch(new FarmlandBlockModel<>(Blocks.FARMLAND_DIRT).withTextures("minecraft:block/dirt"));
 
-        addDispatch(new BlockModelEmpty(Block.signPostPlanksOak).withTextures("minecraft:block/planks_oak"));
-        addDispatch(new BlockModelEmpty(Block.signWallPlanksOak).withTextures("minecraft:block/planks_oak"));
-        addDispatch(new BlockModelEmpty(Block.flag).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new EmptyBlockModel(Blocks.SIGN_POST_PLANKS_OAK).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new EmptyBlockModel(Blocks.SIGN_WALL_PLANKS_OAK).withTextures("minecraft:block/planks_oak"));
+        addDispatch(new EmptyBlockModel(Blocks.FLAG).withTextures("minecraft:block/planks_oak"));
 
-        addDispatch(new BlockModelLayer<>(Block.layerSnow).withTextures("minecraft:block/block_snow"));
-        addDispatch(new BlockModelLayer<>(Block.layerLeavesOak).withTextures("minecraft:block/leaves_oak_fancy"));
-        addDispatch(new BlockModelLayer<>(Block.layerSlate).withTextures("minecraft:block/slate_top", "minecraft:block/slate_side"));
+        addDispatch(new LayerBlockModel<>(Blocks.LAYER_SNOW).withTextures("minecraft:block/block_snow"));
+        addDispatch(new LayerBlockModel<>(Blocks.LAYER_LEAVES_OAK).withTextures("minecraft:block/leaves_oak_fancy"));
+        addDispatch(new LayerBlockModel<>(Blocks.LAYER_SLATE).withTextures("minecraft:block/slate_top", "minecraft:block/slate_side"));
 
-        addDispatch(new BlockModelIce<>(Block.ice).withTextures("minecraft:block/ice"));
-        addDispatch(new BlockModelStandard<>(Block.permaice).withTextures("minecraft:block/permaice"));
+        addDispatch(new IceBlockModel<>(Blocks.ICE).withTextures("minecraft:block/ice"));
+        addDispatch(new StandardBlockModel<>(Blocks.PERMAICE).withTextures("minecraft:block/permaice"));
 
-        addDispatch(new BlockModelStandard<>(Block.blockSnow).withTextures("minecraft:block/block_snow"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_SNOW).withTextures("minecraft:block/block_snow"));
 
-        addDispatch(new BlockModelCactus<>(Block.cactus).withTextures("minecraft:block/cactus_top", "minecraft:block/cactus_bottom", "minecraft:block/cactus_side"));
+        addDispatch(new CactusBlockModel<>(Blocks.CACTUS).withTextures("minecraft:block/cactus_top", "minecraft:block/cactus_bottom", "minecraft:block/cactus_side"));
 
-        addDispatch(new BlockModelStandard<>(Block.blockClay).withTextures("minecraft:block/block_clay"));
+        addDispatch(new StandardBlockModel<>(Blocks.BLOCK_CLAY).withTextures("minecraft:block/block_clay"));
 
-        addDispatch(new BlockModelCrossedSquares<>(Block.sugarcane).withTextures("minecraft:block/sugarcane"));
+        addDispatch(new CrossedSquaresBlockModel<>(Blocks.SUGARCANE).withTextures("minecraft:block/sugarcane"));
 
-        addDispatch(new BlockModelAxisAligned<>(Block.blockSugarcane).withTextures("minecraft:block/block_sugarcane_top", "minecraft:block/block_sugarcane_side"));
-        addDispatch(new BlockModelAxisAligned<>(Block.blockSugarcaneBaked).withTextures("minecraft:block/block_sugarcane_baked_top", "minecraft:block/block_sugarcane_baked_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.BLOCK_SUGARCANE).withTextures("minecraft:block/block_sugarcane_top", "minecraft:block/block_sugarcane_side"));
+        addDispatch(new AxisAlignedBlockModel<>(Blocks.BLOCK_SUGARCANE_BAKED).withTextures("minecraft:block/block_sugarcane_baked_top", "minecraft:block/block_sugarcane_baked_side"));
 
-        addDispatch(new BlockModelStandard<>(Block.jukebox).withTextures("minecraft:block/jukebox_top", "minecraft:block/jukebox_side", "minecraft:block/jukebox_side"));
+        addDispatch(new StandardBlockModel<>(Blocks.JUKEBOX).withTextures("minecraft:block/jukebox_top", "minecraft:block/jukebox_side", "minecraft:block/jukebox_side"));
 
-        addDispatch(new BlockModelHorizontalRotation<>(Block.pumpkin).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.pumpkinCarvedIdle).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_carved_idle", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side"));
-        addDispatch(new BlockModelHorizontalRotation<>(Block.pumpkinCarvedActive).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_carved_active", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.PUMPKIN).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.PUMPKIN_CARVED_IDLE).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_carved_idle", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side"));
+        addDispatch(new HorizontalRotationBlockModel<>(Blocks.PUMPKIN_CARVED_ACTIVE).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_carved_active", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side"));
+        addDispatch(new RedstonePumpkinBlockModel(Blocks.PUMPKIN_REDSTONE).withTextures("minecraft:block/pumpkin_top", "minecraft:block/pumpkin_bottom", "minecraft:block/pumpkin_redstone", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side", "minecraft:block/pumpkin_side"));
 
-        addDispatch(new BlockModelStandard<>(Block.netherrack).withTextures("minecraft:block/netherrack"));
-        addDispatch(new BlockModelStandard<>(Block.netherrackIgneous).withTextures("minecraft:block/netherrack_igneous").withOverbrightTexture("minecraft:block/netherrack_igneous_overlay"));
 
-        addDispatch(new BlockModelStandard<>(Block.soulsand).withTextures("minecraft:block/soulsand"));
-        addDispatch(new BlockModelStandard<>(Block.glowstone).withTextures("minecraft:block/glowstone"));
+        addDispatch(new StandardBlockModel<>(Blocks.NETHERRACK).withTextures("minecraft:block/netherrack"));
+        addDispatch(new StandardBlockModel<>(Blocks.NETHERRACK_IGNEOUS).withTextures("minecraft:block/netherrack_igneous").withOverbrightTexture("minecraft:block/netherrack_igneous_overlay"));
 
-        addDispatch(new BlockModelPortal<>(Block.portalNether).withTextures("minecraft:block/portal_nether"));
-        addDispatch(new BlockModelPortal<>(Block.portalParadise).withTextures("minecraft:block/portal_nether"));
+        addDispatch(new StandardBlockModel<>(Blocks.SOULSAND).withTextures("minecraft:block/soulsand"));
+        addDispatch(new StandardBlockModel<>(Blocks.GLOWSTONE).withTextures("minecraft:block/glowstone"));
 
-        addDispatch(new BlockModelCake<>(Block.cake).withTextures("minecraft:block/cake_top", "minecraft:block/cake_bottom", "minecraft:block/cake_side"));
-        addDispatch(new BlockModelPumpkinPie<>(Block.pumpkinPie).withTextures("minecraft:block/pumpkin_pie_top", "minecraft:block/pumpkin_pie_bottom", "minecraft:block/pumpkin_pie_side"));
+        addDispatch(new PortalBlockModel<>(Blocks.PORTAL_NETHER).withTextures("minecraft:block/portal_nether"));
+        addDispatch(new PortalBlockModel<>(Blocks.PORTAL_PARADISE).withTextures("minecraft:block/portal_nether"));
 
-        addDispatch(new BlockModelLamp<>(Block.lampIdle));
-        addDispatch(new BlockModelLamp<>(Block.lampActive));
+        addDispatch(new CakeBlockModel<>(Blocks.CAKE).withTextures("minecraft:block/cake_top", "minecraft:block/cake_bottom", "minecraft:block/cake_side"));
+        addDispatch(new PumpkinPieBlockModel<>(Blocks.PUMPKIN_PIE).withTextures("minecraft:block/pumpkin_pie_top", "minecraft:block/pumpkin_pie_bottom", "minecraft:block/pumpkin_pie_side"));
 
-        addDispatch(new BlockModelLantern<>(Block.lanternFireflyGreen).withTextures("minecraft:block/lantern_firefly_green"));
-        addDispatch(new BlockModelLantern<>(Block.lanternFireflyBlue).withTextures("minecraft:block/lantern_firefly_blue"));
-        addDispatch(new BlockModelLantern<>(Block.lanternFireflyOrange).withTextures("minecraft:block/lantern_firefly_orange"));
-        addDispatch(new BlockModelLantern<>(Block.lanternFireflyRed).withTextures("minecraft:block/lantern_firefly_red"));
-        addDispatch(new BlockModelJar<>(Block.jarGlass));
+        addDispatch(new LampBlockModel<>(Blocks.LAMP_IDLE));
+        addDispatch(new LampBlockModel<>(Blocks.LAMP_ACTIVE));
 
-        addDispatch(new BlockModelPebbles<>(Block.overlayPebbles));
+        addDispatch(new LanternBlockModel<>(Blocks.LANTERN_FIREFLY_GREEN).withTextures("minecraft:block/lantern_firefly_green"));
+        addDispatch(new LanternBlockModel<>(Blocks.LANTERN_FIREFLY_BLUE).withTextures("minecraft:block/lantern_firefly_blue"));
+        addDispatch(new LanternBlockModel<>(Blocks.LANTERN_FIREFLY_ORANGE).withTextures("minecraft:block/lantern_firefly_orange"));
+        addDispatch(new LanternBlockModel<>(Blocks.LANTERN_FIREFLY_RED).withTextures("minecraft:block/lantern_firefly_red"));
+        addDispatch(new JarBlockModel<>(Blocks.JAR_GLASS));
 
-        addDispatch(new BlockModelFenceThin<>(Block.fenceChainlink,TextureRegistry.getTexture("minecraft:block/fence_chain_center"), null, TextureRegistry.getTexture("minecraft:block/fence_chain_top"), TextureRegistry.getTexture("minecraft:block/fence_chain_column")).withTextures("minecraft:block/fence_chain_center"));
-        addDispatch(new BlockModelFenceThin<>(Block.fencePaperWall,TextureRegistry.getTexture("minecraft:block/fence_paper_center"), null, null, TextureRegistry.getTexture("minecraft:block/fence_paper_column")).withTextures("minecraft:block/fence_paper_center"));
+        addDispatch(new PebblesBlockModel<>(Blocks.OVERLAY_PEBBLES));
 
-        addDispatch(new BlockModelBasket<>(Block.basket).withTextures("minecraft:block/basket_bottom", "minecraft:block/basket_side"));
+        addDispatch(new FenceThinBlockModel<>(Blocks.FENCE_CHAINLINK,TextureRegistry.getTexture("minecraft:block/fence_chain_center"), null, TextureRegistry.getTexture("minecraft:block/fence_chain_top"), TextureRegistry.getTexture("minecraft:block/fence_chain_column")).withTextures("minecraft:block/fence_chain_center"));
+        addDispatch(new FenceThinBlockModel<>(Blocks.FENCE_PAPER_WALL,TextureRegistry.getTexture("minecraft:block/fence_paper_center"), null, null, TextureRegistry.getTexture("minecraft:block/fence_paper_column")).withTextures("minecraft:block/fence_paper_center"));
 
-        addDispatch(new BlockModelStandard<>(Block.paperWall).withTextures("minecraft:block/paperwall"));
+        addDispatch(new BasketBlockModel<>(Blocks.BASKET).withTextures("minecraft:block/basket_bottom", "minecraft:block/basket_side"));
+
+        addDispatch(new StandardBlockModel<>(Blocks.PAPER_WALL).withTextures("minecraft:block/paperwall"));
     }
 }
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
deleted file mode 100644
index f2e521150..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorPainted.java
+++ /dev/null
@@ -1,37 +0,0 @@
-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/BlockModelFenceGatePainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceGatePainted.java
deleted file mode 100644
index 9224eb307..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceGatePainted.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.minecraft.client.render.block.model;
-
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFenceGate;
-import net.minecraft.core.util.helper.Side;
-
-public class BlockModelFenceGatePainted<T extends BlockFenceGate> extends BlockModelFenceGate<T>{
-    public BlockModelFenceGatePainted(Block block) {
-        super(block);
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
-        meta = meta >> 4;
-        return BlockModelPlanksPainted.texCoords[meta & 0x0F];
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFencePainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelFencePainted.java
deleted file mode 100644
index 094c8e1f2..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFencePainted.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.minecraft.client.render.block.model;
-
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFence;
-import net.minecraft.core.util.helper.Side;
-
-public class BlockModelFencePainted<T extends BlockFence> extends BlockModelFence<T>{
-
-
-    public BlockModelFencePainted(Block block) {
-        super(block);
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
-        return BlockModelPlanksPainted.texCoords[meta & 15];
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLamp.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelLamp.java
deleted file mode 100644
index 5961ba0a9..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLamp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-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.BlockLamp;
-import net.minecraft.core.item.ItemDye;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.WorldSource;
-
-public class BlockModelLamp<T extends BlockLamp> extends BlockModelStandard<T> {
-    private static final IconCoordinate[] texCoordsInactive = new IconCoordinate[16];
-    private static final IconCoordinate[] texCoordsActive = new IconCoordinate[16];
-
-    static {
-        for(int i = 0; i < 16; i++) {
-            texCoordsInactive[i] = TextureRegistry.getTexture("minecraft:block/lamp_" + ItemDye.dyeColors[15 - i] + "_idle");
-            texCoordsActive[i] = TextureRegistry.getTexture("minecraft:block/lamp_" + ItemDye.dyeColors[15 - i] + "_active");
-        }
-    }
-
-    public BlockModelLamp(Block block) {
-        super(block);
-    }
-
-    @Override
-    public IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side)
-    {
-        int data = blockAccess.getBlockMetadata(x, y, z);
-        if (block.isActive) {
-            return texCoordsActive[data & 0xF];
-        } else {
-            return texCoordsInactive[data & 0xF];
-        }
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
-    {
-        return texCoordsActive[data & 0xF];
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPlanksPainted.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelPlanksPainted.java
deleted file mode 100644
index 850841e84..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPlanksPainted.java
+++ /dev/null
@@ -1,26 +0,0 @@
-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.item.ItemDye;
-import net.minecraft.core.util.helper.Side;
-
-public class BlockModelPlanksPainted<T extends Block> extends BlockModelStandard<T> {
-    public static final IconCoordinate[] texCoords = new IconCoordinate[16];
-
-    static {
-        for(int i = 0; i < 16; i++) {
-            texCoords[i] = TextureRegistry.getTexture("minecraft:block/planks_oak_painted_" + ItemDye.dyeColors[15 - i]);
-        }
-    }
-
-    public BlockModelPlanksPainted(Block block) {
-        super(block);
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
-        return texCoords[meta & 0x0F];
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelWool.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelWool.java
deleted file mode 100644
index 74f9493b4..000000000
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelWool.java
+++ /dev/null
@@ -1,25 +0,0 @@
-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.item.ItemDye;
-import net.minecraft.core.util.helper.Side;
-
-public class BlockModelWool<T extends Block> extends BlockModelStandard<T>{
-    public static final IconCoordinate[] texCoords = new IconCoordinate[16];
-
-    static {
-        for(int i = 0; i < 16; i++) {
-            texCoords[i] = TextureRegistry.getTexture("minecraft:block/wool_" + ItemDye.dyeColors[15 - i]);
-        }
-    }
-    public BlockModelWool(Block block) {
-        super(block);
-    }
-
-    @Override
-    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data) {
-        return texCoords[data & 15];
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java b/src/main/java/net/minecraft/client/render/block/model/BrazierBlockModel.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java
rename to src/main/java/net/minecraft/client/render/block/model/BrazierBlockModel.java
index 5c36b7387..14a1e2eaf 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelBrazier.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BrazierBlockModel.java
@@ -1,22 +1,23 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBrazier;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.BrazierBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelBrazier<T extends BlockBrazier>
-    extends BlockModelStandard<T> {
+public class BrazierBlockModel<T extends BrazierBlock>
+    extends StandardBlockModel<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");
+    protected StandardBlockModel<Block> fireModel = new FireBlockModel<>(Blocks.FIRE, true).withTextures("minecraft:block/fire");
 
-    public BlockModelBrazier(Block block) {
+    public BrazierBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCacaoLeaves.java b/src/main/java/net/minecraft/client/render/block/model/CacaoLeavesBlockModel.java
similarity index 93%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCacaoLeaves.java
rename to src/main/java/net/minecraft/client/render/block/model/CacaoLeavesBlockModel.java
index d962fb936..8ab16cc30 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCacaoLeaves.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CacaoLeavesBlockModel.java
@@ -1,20 +1,20 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelCacaoLeaves<T extends Block> extends BlockModelLeaves<T>{
+public class CacaoLeavesBlockModel<T extends Block> extends LeavesBlockModel<T> {
     protected IconCoordinate[] growthStages = new IconCoordinate[]{
             TextureRegistry.getTexture("minecraft:block/leaves_cacao_bean_stage0"),
             TextureRegistry.getTexture("minecraft:block/leaves_cacao_bean_stage1"),
             TextureRegistry.getTexture("minecraft:block/leaves_cacao_bean_stage2"),
             TextureRegistry.getTexture("minecraft:block/leaves_cacao_bean_stage3")};
-    public BlockModelCacaoLeaves(Block block) {
+    public CacaoLeavesBlockModel(Block block) {
         super(block, "minecraft:block/leaves_cacao");
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCactus.java b/src/main/java/net/minecraft/client/render/block/model/CactusBlockModel.java
similarity index 96%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCactus.java
rename to src/main/java/net/minecraft/client/render/block/model/CactusBlockModel.java
index 17b00a8bc..0683630b1 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCactus.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CactusBlockModel.java
@@ -7,8 +7,8 @@ import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelCactus<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelCactus(Block block) {
+public class CactusBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public CactusBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCake.java b/src/main/java/net/minecraft/client/render/block/model/CakeBlockModel.java
similarity index 71%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCake.java
rename to src/main/java/net/minecraft/client/render/block/model/CakeBlockModel.java
index 2f0d4c148..099ac455c 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCake.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CakeBlockModel.java
@@ -1,13 +1,13 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelCake<T extends Block> extends BlockModelStandard<T> {
+public class CakeBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate cakeInner = TextureRegistry.getTexture("minecraft:block/cake_inner");
-    public BlockModelCake(Block block) {
+    public CakeBlockModel(Block block) {
         super(block);
         float f = 0.0625F;
         float f1 = 0.5F;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCandle.java b/src/main/java/net/minecraft/client/render/block/model/CandleBlockModel.java
similarity index 96%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCandle.java
rename to src/main/java/net/minecraft/client/render/block/model/CandleBlockModel.java
index d7a654b06..d2feaf649 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCandle.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CandleBlockModel.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelCandle<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelCandle(Block block) {
+public class CandleBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public CandleBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelChest.java b/src/main/java/net/minecraft/client/render/block/model/ChestBlockModel.java
similarity index 79%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelChest.java
rename to src/main/java/net/minecraft/client/render/block/model/ChestBlockModel.java
index 9be7e9128..2844dfb7a 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelChest.java
+++ b/src/main/java/net/minecraft/client/render/block/model/ChestBlockModel.java
@@ -1,14 +1,14 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockChest;
+import net.minecraft.core.block.ChestBlock;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelChest<T extends Block> extends BlockModelStandard<T>{
+public class ChestBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate chestFrontSingle;
     protected IconCoordinate chestFrontLeft;
     protected IconCoordinate chestFrontRight;
@@ -16,7 +16,7 @@ public class BlockModelChest<T extends Block> extends BlockModelStandard<T>{
     protected IconCoordinate chestBackRight;
     protected IconCoordinate chestSide;
     protected IconCoordinate chestTop;
-    public BlockModelChest(Block block, String rootKey) {
+    public ChestBlockModel(Block block, String rootKey) {
         super(block);
         chestFrontSingle = TextureRegistry.getTexture(rootKey + "_front");
         chestFrontLeft = TextureRegistry.getTexture(rootKey + "_left_front");
@@ -35,15 +35,15 @@ public class BlockModelChest<T extends Block> extends BlockModelStandard<T>{
             return chestTop;
         }
 
-        Side facing = BlockChest.getDirectionFromMeta(meta).getSide();
-        BlockChest.Type type = BlockChest.getTypeFromMeta(meta);
+        Side facing = ChestBlock.getDirectionFromMeta(meta).getSide();
+        ChestBlock.Type type = ChestBlock.getTypeFromMeta(meta);
 
-        if(type == BlockChest.Type.SINGLE) {
+        if(type == ChestBlock.Type.SINGLE) {
             if(side == facing) {
                 return chestFrontSingle;
             }
         }
-        if(type == BlockChest.Type.LEFT) {
+        if(type == ChestBlock.Type.LEFT) {
             if(side == facing) {
                 return chestFrontLeft;
             }
@@ -51,7 +51,7 @@ public class BlockModelChest<T extends Block> extends BlockModelStandard<T>{
                 return chestBackRight;
             }
         }
-        if(type == BlockChest.Type.RIGHT) {
+        if(type == ChestBlock.Type.RIGHT) {
             if(side == facing) {
                 return chestFrontRight;
             }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCropsPumpkin.java b/src/main/java/net/minecraft/client/render/block/model/CropsPumpkinBlockModel.java
similarity index 93%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCropsPumpkin.java
rename to src/main/java/net/minecraft/client/render/block/model/CropsPumpkinBlockModel.java
index 70735cd7b..d1cc13db0 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCropsPumpkin.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CropsPumpkinBlockModel.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelCropsPumpkin<T extends Block> extends BlockModelStandard<T>{
+public class CropsPumpkinBlockModel<T extends Block> extends StandardBlockModel<T> {
     public static final IconCoordinate[] GROWTH_STAGE_TEXTURES_TOP = {
             TextureRegistry.getTexture("minecraft:block/crops_pumpkin_stage1_top"),
             TextureRegistry.getTexture("minecraft:block/crops_pumpkin_stage2_top"),
@@ -23,7 +23,7 @@ public class BlockModelCropsPumpkin<T extends Block> extends BlockModelStandard<
 
     public static final IconCoordinate LEAF_TEXTURE = TextureRegistry.getTexture("minecraft:block/crops_pumpkin_stage0");
 
-    public BlockModelCropsPumpkin(Block block) {
+    public CropsPumpkinBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCropsWheat.java b/src/main/java/net/minecraft/client/render/block/model/CropsWheatBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCropsWheat.java
rename to src/main/java/net/minecraft/client/render/block/model/CropsWheatBlockModel.java
index b141c0b91..516b1c711 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCropsWheat.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CropsWheatBlockModel.java
@@ -1,14 +1,14 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelCropsWheat<T extends Block> extends BlockModelStandard<T>{
+public class CropsWheatBlockModel<T extends Block> extends StandardBlockModel<T> {
     public final IconCoordinate[] growthStageTextures = {
             TextureRegistry.getTexture("minecraft:block/crops_wheat_stage0"),
             TextureRegistry.getTexture("minecraft:block/crops_wheat_stage1"),
@@ -20,7 +20,7 @@ public class BlockModelCropsWheat<T extends Block> extends BlockModelStandard<T>
             TextureRegistry.getTexture("minecraft:block/crops_wheat_stage7")
     };
 
-    public BlockModelCropsWheat(Block block) {
+    public CropsWheatBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCrossedSquares.java b/src/main/java/net/minecraft/client/render/block/model/CrossedSquaresBlockModel.java
similarity index 95%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCrossedSquares.java
rename to src/main/java/net/minecraft/client/render/block/model/CrossedSquaresBlockModel.java
index 7fe1d29b6..d9062f8a6 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCrossedSquares.java
+++ b/src/main/java/net/minecraft/client/render/block/model/CrossedSquaresBlockModel.java
@@ -2,15 +2,16 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelCrossedSquares<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelCrossedSquares(Block block) {
+public class CrossedSquaresBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public CrossedSquaresBlockModel(Block block) {
         super(block);
     }
     @Override
@@ -105,7 +106,7 @@ public class BlockModelCrossedSquares<T extends Block> extends BlockModelStandar
         double zd = z;
 
         // Shift grass position with deterministic position based random
-        if(block == Block.tallgrass || block == Block.tallgrassFern || block == Block.spinifex)
+        if(block == Blocks.TALLGRASS || block == Blocks.TALLGRASS_FERN || block == Blocks.SPINIFEX)
         {
             long dRandom = (x * 0x2fc20fL) ^ (long)z * 0x6ebfff5L ^ (long)y;
             dRandom = dRandom * dRandom * 0x285b825L + dRandom * 11L;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoor.java b/src/main/java/net/minecraft/client/render/block/model/DoorBlockModel.java
similarity index 93%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelDoor.java
rename to src/main/java/net/minecraft/client/render/block/model/DoorBlockModel.java
index 224fb1453..391d4e5bf 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoor.java
+++ b/src/main/java/net/minecraft/client/render/block/model/DoorBlockModel.java
@@ -2,14 +2,14 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderBlocks;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockDoor;
+import net.minecraft.core.block.DoorBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelDoor<T extends BlockDoor> extends BlockModelStandard<T>{
-    public BlockModelDoor(Block block) {
+public class DoorBlockModel<T extends DoorBlock> extends StandardBlockModel<T> {
+    public DoorBlockModel(Block block) {
         super(block);
     }
     
@@ -43,8 +43,8 @@ public class BlockModelDoor<T extends BlockDoor> extends BlockModelStandard<T>{
 			sideEastWest = 0.6f;
 		}
 		
-		boolean aboveIsDoor = renderBlocks.blockAccess.getBlock(x, y + 1, z) instanceof BlockDoor;
-		boolean belowIsDoor = renderBlocks.blockAccess.getBlock(x, y - 1, z) instanceof BlockDoor;
+		boolean aboveIsDoor = renderBlocks.blockAccess.getBlock(x, y + 1, z) instanceof DoorBlock;
+		boolean belowIsDoor = renderBlocks.blockAccess.getBlock(x, y - 1, z) instanceof DoorBlock;
 
 		int meta = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
 		
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelEmpty.java b/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
similarity index 84%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelEmpty.java
rename to src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
index 826772431..19e20201c 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelEmpty.java
+++ b/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
@@ -4,8 +4,8 @@ import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import org.jetbrains.annotations.Nullable;
 
-public class BlockModelEmpty extends BlockModelStandard<Block> {
-    public BlockModelEmpty(Block block) {
+public class EmptyBlockModel extends StandardBlockModel<Block> {
+    public EmptyBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFarmland.java b/src/main/java/net/minecraft/client/render/block/model/FarmlandBlockModel.java
similarity index 75%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFarmland.java
rename to src/main/java/net/minecraft/client/render/block/model/FarmlandBlockModel.java
index ec02466be..a2e4c9ac0 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFarmland.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FarmlandBlockModel.java
@@ -1,27 +1,27 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFarmland;
+import net.minecraft.core.block.FarmlandBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelFarmland<T extends Block> extends BlockModelStandard<T>{
+public class FarmlandBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate topWet = TextureRegistry.getTexture("minecraft:block/farmland_wet_top");
     protected IconCoordinate topWetFertilized = TextureRegistry.getTexture("minecraft:block/farmland_wet_fertilized_top");
     protected IconCoordinate topDry = TextureRegistry.getTexture("minecraft:block/farmland_dry_top");
     protected IconCoordinate topDryFertilized = TextureRegistry.getTexture("minecraft:block/farmland_dry_fertilized_top");
     protected IconCoordinate mud = TextureRegistry.getTexture("minecraft:block/mud");
 
-    public BlockModelFarmland(Block block) {
+    public FarmlandBlockModel(Block block) {
         super(block);
     }
 
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, final int data)
     {
-        boolean isWet = BlockFarmland.isWet(data);
-        boolean isFertilized = BlockFarmland.isFertilized(data);
+        boolean isWet = FarmlandBlock.isWet(data);
+        boolean isFertilized = FarmlandBlock.isFertilized(data);
 
         if (side == Side.TOP) {
             if (isWet && isFertilized) {
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFence.java b/src/main/java/net/minecraft/client/render/block/model/FenceBlockModel.java
similarity index 97%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFence.java
rename to src/main/java/net/minecraft/client/render/block/model/FenceBlockModel.java
index 4829a7b28..c9b06bace 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFence.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FenceBlockModel.java
@@ -3,13 +3,13 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFence;
+import net.minecraft.core.block.FenceBlock;
 import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelFence<T  extends BlockFence> extends BlockModelStandard<T> {
-    public BlockModelFence(Block block) {
+public class FenceBlockModel<T  extends FenceBlock> extends StandardBlockModel<T> {
+    public FenceBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceGate.java b/src/main/java/net/minecraft/client/render/block/model/FenceGateBlockModel.java
similarity index 97%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFenceGate.java
rename to src/main/java/net/minecraft/client/render/block/model/FenceGateBlockModel.java
index 2c249770e..76fcf3ee0 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceGate.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FenceGateBlockModel.java
@@ -3,13 +3,13 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFenceGate;
+import net.minecraft.core.block.FenceGateBlock;
 import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelFenceGate<T extends BlockFenceGate> extends BlockModelStandard<T>{
-    public BlockModelFenceGate(Block block) {
+public class FenceGateBlockModel<T extends FenceGateBlock> extends StandardBlockModel<T> {
+    public FenceGateBlockModel(Block block) {
         super(block);
     }
 
@@ -18,8 +18,8 @@ public class BlockModelFenceGate<T extends BlockFenceGate> extends BlockModelSta
         block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
         boolean flag = true;
         int l = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        boolean flag1 = BlockFenceGate.func_35291_d(l);
-        int i1 = BlockFenceGate.func_35290_f(l);
+        boolean flag1 = FenceGateBlock.func_35291_d(l);
+        int i1 = FenceGateBlock.func_35290_f(l);
         if(i1 == 3 || i1 == 1)
         {
             float f = 0.4375F;
diff --git a/src/main/java/net/minecraft/client/render/block/model/FenceGatePaintedBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/FenceGatePaintedBlockModel.java
new file mode 100644
index 000000000..9e0419584
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/FenceGatePaintedBlockModel.java
@@ -0,0 +1,18 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.FenceGateBlock;
+import net.minecraft.core.util.helper.Side;
+
+public class FenceGatePaintedBlockModel<T extends FenceGateBlock> extends FenceGateBlockModel<T> {
+    public FenceGatePaintedBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
+        meta = meta >> 4;
+        return PlanksPaintedBlockModel.texCoords[meta & 0x0F];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/FencePaintedBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/FencePaintedBlockModel.java
new file mode 100644
index 000000000..86aca6978
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/FencePaintedBlockModel.java
@@ -0,0 +1,19 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.FenceBlock;
+import net.minecraft.core.util.helper.Side;
+
+public class FencePaintedBlockModel<T extends FenceBlock> extends FenceBlockModel<T> {
+
+
+    public FencePaintedBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
+        return PlanksPaintedBlockModel.texCoords[meta & 15];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceThin.java b/src/main/java/net/minecraft/client/render/block/model/FenceThinBlockModel.java
similarity index 98%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFenceThin.java
rename to src/main/java/net/minecraft/client/render/block/model/FenceThinBlockModel.java
index 8e5fbf685..9dd8e40a6 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFenceThin.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FenceThinBlockModel.java
@@ -3,21 +3,21 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFenceThin;
+import net.minecraft.core.block.ThinFenceBlock;
 import net.minecraft.core.util.helper.Direction;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelFenceThin<T extends BlockFenceThin> extends BlockModelStandard<T> {
+public class FenceThinBlockModel<T extends ThinFenceBlock> extends StandardBlockModel<T> {
     private final IconCoordinate texIndex;
     private final IconCoordinate bottomTexIndex;
     private final IconCoordinate topTexIndex;
     private final IconCoordinate columnTexIndex;
 
-    public BlockModelFenceThin(Block block, IconCoordinate texIndex, IconCoordinate bottomTexIndex, IconCoordinate topTexIndex, IconCoordinate columnTexIndex){
+    public FenceThinBlockModel(Block block, IconCoordinate texIndex, IconCoordinate bottomTexIndex, IconCoordinate topTexIndex, IconCoordinate columnTexIndex){
         super(block);
         this.texIndex = texIndex;
         this.bottomTexIndex = bottomTexIndex;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java b/src/main/java/net/minecraft/client/render/block/model/FireBlockModel.java
similarity index 92%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
rename to src/main/java/net/minecraft/client/render/block/model/FireBlockModel.java
index 56fae4788..c5030e9a7 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FireBlockModel.java
@@ -1,20 +1,21 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFire;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.FireBlock;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
+public class FireBlockModel<T extends Block> extends StandardBlockModel<T> {
     private final boolean overrideRender;
-    public BlockModelFire(Block block) {
+    public FireBlockModel(Block block) {
         this(block, false);
     }
 
-    public BlockModelFire(Block block, boolean overrideRender) {
+    public FireBlockModel(Block block, boolean overrideRender) {
         super(block);
         this.overrideRender = overrideRender;
     }
@@ -39,7 +40,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
         double vMin = tex.getIconVMin();
         double vMax = tex.getIconVMax();
         final float yOffset = 1.4F;
-        if(overrideRender || 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) || ((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x, y - 1, z))
         {
             double d8 = (double)x + 0.5D + 0.2D;
             double d9 = ((double)x + 0.5D) - 0.2D;
@@ -114,7 +115,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
                 uMax = uMin;
                 uMin = d10;
             }
-            if(((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x - 1, y, z))
+            if(((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x - 1, y, z))
             {
                 tessellator.addVertexWithUV((float)x + f3, (float)y + yOffset + f4, z + 1, uMax, vMin);
                 tessellator.addVertexWithUV(x, (float)(y) + f4, z + 1, uMax, vMax);
@@ -125,7 +126,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
                 tessellator.addVertexWithUV(x, (float)(y) + f4, z + 1, uMax, vMax);
                 tessellator.addVertexWithUV((float)x + f3, (float)y + yOffset + f4, z + 1, uMax, vMin);
             }
-            if(((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x + 1, y, z))
+            if(((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x + 1, y, z))
             {
                 tessellator.addVertexWithUV((float)(x + 1) - f3, (float)y + yOffset + f4, z, uMin, vMin);
                 tessellator.addVertexWithUV((x + 1), (float)(y) + f4, z, uMin, vMax);
@@ -136,7 +137,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
                 tessellator.addVertexWithUV((x + 1), (float)(y) + f4, z, uMin, vMax);
                 tessellator.addVertexWithUV((float)(x + 1) - f3, (float)y + yOffset + f4, z, uMin, vMin);
             }
-            if(((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x, y, z - 1))
+            if(((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x, y, z - 1))
             {
                 tessellator.addVertexWithUV(x, (float)y + yOffset + f4, (float)z + f3, uMax, vMin);
                 tessellator.addVertexWithUV(x, (float)(y) + f4, z, uMax, vMax);
@@ -147,7 +148,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
                 tessellator.addVertexWithUV(x, (float)(y) + f4, z, uMax, vMax);
                 tessellator.addVertexWithUV(x, (float)y + yOffset + f4, (float)z + f3, uMax, vMin);
             }
-            if(((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x, y, z + 1))
+            if(((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x, y, z + 1))
             {
                 tessellator.addVertexWithUV(x + 1, (float)y + yOffset + f4, (float)(z + 1) - f3, uMin, vMin);
                 tessellator.addVertexWithUV(x + 1, (float)(y) + f4, (z + 1), uMin, vMax);
@@ -158,7 +159,7 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
                 tessellator.addVertexWithUV(x + 1, (float)(y) + f4, (z + 1), uMin, vMax);
                 tessellator.addVertexWithUV(x + 1, (float)y + yOffset + f4, (float)(z + 1) - f3, uMin, vMin);
             }
-            if(((BlockFire)Block.fire).canBlockCatchFire(renderBlocks.blockAccess, x, y + 1, z))
+            if(((FireBlock)Blocks.FIRE).canBurn(renderBlocks.blockAccess, x, y + 1, z))
             {
                 double d11 = (double)x + 0.5D + 0.5D;
                 double d13 = ((double)x + 0.5D) - 0.5D;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelCherryLeavesBloom.java b/src/main/java/net/minecraft/client/render/block/model/FloweringCherryLeavesBlockModel.java
similarity index 85%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelCherryLeavesBloom.java
rename to src/main/java/net/minecraft/client/render/block/model/FloweringCherryLeavesBlockModel.java
index b58434ea2..f38dda9c1 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelCherryLeavesBloom.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FloweringCherryLeavesBlockModel.java
@@ -1,16 +1,17 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.FloweringCherryLeavesBlock;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelCherryLeavesBloom<T extends Block> extends BlockModelLeaves<T> {
+public class FloweringCherryLeavesBlockModel<T extends Block> extends LeavesBlockModel<T> {
     private final IconCoordinate grownCherryOverlay = TextureRegistry.getTexture("minecraft:block/leaves_cherry_overlay");
     private final IconCoordinate floweringCherryOverlay = TextureRegistry.getTexture("minecraft:block/leaves_cherry_flowering_overlay");
-    public BlockModelCherryLeavesBloom(Block block) {
+    public FloweringCherryLeavesBlockModel(Block block) {
         super(block, "minecraft:block/leaves_cherry");
     }
 
@@ -18,7 +19,7 @@ public class BlockModelCherryLeavesBloom<T extends Block> extends BlockModelLeav
     public boolean render(Tessellator tessellator, int x, int y, int z) {
         super.render(tessellator, x, y, z);
 
-        int growthRate = (renderBlocks.blockAccess.getBlockMetadata(x, y, z) & 0XF0) >> 4;
+        int growthRate = FloweringCherryLeavesBlock.getGrowthRate(renderBlocks.blockAccess.getBlockMetadata(x, y, z));
         if(growthRate > 0) {
             renderBlocks.overrideBlockTexture = grownCherryOverlay;
         } else {
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java b/src/main/java/net/minecraft/client/render/block/model/FluidBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java
rename to src/main/java/net/minecraft/client/render/block/model/FluidBlockModel.java
index ff56d4b7c..648c2abbc 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java
+++ b/src/main/java/net/minecraft/client/render/block/model/FluidBlockModel.java
@@ -2,17 +2,17 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
+import net.minecraft.core.block.FluidBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelFluid<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelFluid(Block block) {
+public class FluidBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public FluidBlockModel(Block block) {
         super(block);
     }
 
@@ -46,15 +46,15 @@ public class BlockModelFluid<T extends Block> extends BlockModelStandard<T> {
         final float yOff = 0.001f;
         Material material = block.blockMaterial;
         int meta = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        float f7 = BlockFluid.getFluidHeight(renderBlocks.blockAccess, x, y, z, material);
-        float f8 = BlockFluid.getFluidHeight(renderBlocks.blockAccess, x, y, z + 1, material);
-        float f9 = BlockFluid.getFluidHeight(renderBlocks.blockAccess, x + 1, y, z + 1, material);
-        float f10 = BlockFluid.getFluidHeight(renderBlocks.blockAccess, x + 1, y, z, material);
+        float f7 = FluidBlock.getFluidHeight(renderBlocks.blockAccess, x, y, z, material);
+        float f8 = FluidBlock.getFluidHeight(renderBlocks.blockAccess, x, y, z + 1, material);
+        float f9 = FluidBlock.getFluidHeight(renderBlocks.blockAccess, x + 1, y, z + 1, material);
+        float f10 = FluidBlock.getFluidHeight(renderBlocks.blockAccess, x + 1, y, z, material);
         if(renderBlocks.renderAllFaces || renderTop)
         {
             didRender = true;
             IconCoordinate texture = getBlockTextureFromSideAndMetadata(Side.TOP, meta);
-            float rotation = (float) BlockFluid.getSlopeAngle(renderBlocks.blockAccess, x, y, z, material);
+            float rotation = (float) FluidBlock.getSlopeAngle(renderBlocks.blockAccess, x, y, z, material);
             if(rotation > -999F)
             {
                 texture = getBlockTextureFromSideAndMetadata(Side.NORTH, meta);
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java b/src/main/java/net/minecraft/client/render/block/model/GlassDoorBlockModel.java
similarity index 61%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java
rename to src/main/java/net/minecraft/client/render/block/model/GlassDoorBlockModel.java
index d52dce33a..2e7b055ad 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelDoorGlass.java
+++ b/src/main/java/net/minecraft/client/render/block/model/GlassDoorBlockModel.java
@@ -1,11 +1,11 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockDoor;
+import net.minecraft.core.block.DoorBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelDoorGlass<T extends BlockDoor> extends BlockModelDoor<T>{
-    public BlockModelDoorGlass(Block block) {
+public class GlassDoorBlockModel<T extends DoorBlock> extends DoorBlockModel<T> {
+    public GlassDoorBlockModel(Block block) {
         super(block);
     }
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelGrass.java b/src/main/java/net/minecraft/client/render/block/model/GrassBlockModel.java
similarity index 95%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelGrass.java
rename to src/main/java/net/minecraft/client/render/block/model/GrassBlockModel.java
index dc0ae1411..365741006 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelGrass.java
+++ b/src/main/java/net/minecraft/client/render/block/model/GrassBlockModel.java
@@ -2,8 +2,8 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.RenderBlocks;
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.material.Material;
@@ -13,7 +13,7 @@ import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelGrass<T extends Block> extends BlockModelStandard<T> {
+public class GrassBlockModel<T extends Block> extends StandardBlockModel<T> {
     public static boolean useOverlay = false;
     private static final IconCoordinate[] overlayIndices = new IconCoordinate[]{
             null,
@@ -23,7 +23,7 @@ public class BlockModelGrass<T extends Block> extends BlockModelStandard<T> {
             TextureRegistry.getTexture("minecraft:block/grass_side_overlay"),
             TextureRegistry.getTexture("minecraft:block/grass_side_overlay")};
     protected IconCoordinate snowSide = TextureRegistry.getTexture("minecraft:block/grass_snowy_side");
-    public BlockModelGrass(Block block) {
+    public GrassBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelHorizontalRotation.java b/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
similarity index 71%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelHorizontalRotation.java
rename to src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
index 19c721a87..6187733eb 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelHorizontalRotation.java
+++ b/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 
-public class BlockModelHorizontalRotation<T extends Block> extends BlockModelStandard<T>{
-    public BlockModelHorizontalRotation(Block block) {
+public class HorizontalRotationBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public HorizontalRotationBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelIce.java b/src/main/java/net/minecraft/client/render/block/model/IceBlockModel.java
similarity index 75%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelIce.java
rename to src/main/java/net/minecraft/client/render/block/model/IceBlockModel.java
index 1dd6af6ef..f0793e134 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelIce.java
+++ b/src/main/java/net/minecraft/client/render/block/model/IceBlockModel.java
@@ -3,8 +3,8 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelIce<T extends Block> extends BlockModelTransparent<T> {
-    public BlockModelIce(Block block) {
+public class IceBlockModel<T extends Block> extends TransparentBlockModel<T> {
+    public IceBlockModel(Block block) {
         super(block, false);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelJar.java b/src/main/java/net/minecraft/client/render/block/model/JarBlockModel.java
similarity index 96%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelJar.java
rename to src/main/java/net/minecraft/client/render/block/model/JarBlockModel.java
index 28869cd8a..2add4dbee 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelJar.java
+++ b/src/main/java/net/minecraft/client/render/block/model/JarBlockModel.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelJar<T extends Block> extends BlockModelStandard<T> {
+public class JarBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate jarEmpty = TextureRegistry.getTexture("minecraft:block/jar");
     protected IconCoordinate jarFull = TextureRegistry.getTexture("minecraft:block/jar_dirt");
-    public BlockModelJar(Block block) {
+    public JarBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLadder.java b/src/main/java/net/minecraft/client/render/block/model/LadderBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLadder.java
rename to src/main/java/net/minecraft/client/render/block/model/LadderBlockModel.java
index 7bf61368c..cb1537d4b 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLadder.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LadderBlockModel.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelLadder<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelLadder(Block block) {
+public class LadderBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public LadderBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/LampBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/LampBlockModel.java
new file mode 100644
index 000000000..aeb0d8e59
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/LampBlockModel.java
@@ -0,0 +1,42 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.LampBlock;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.WorldSource;
+
+public class LampBlockModel<T extends LampBlock> extends StandardBlockModel<T> {
+    private static final IconCoordinate[] texCoordsInactive = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+    private static final IconCoordinate[] texCoordsActive = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+
+    static {
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            texCoordsInactive[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/lamp_" + c.colorID + "_idle");
+            texCoordsActive[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/lamp_" + c.colorID + "_active");
+        }
+    }
+
+    public LampBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockTexture(WorldSource worldSource, int x, int y, int z, Side side)
+    {
+        int color = worldSource.getBlockMetadata(x, y, z) & DyeColor.MASK_COLOR;
+        if (block.isActive) {
+            return texCoordsActive[color];
+        } else {
+            return texCoordsInactive[color];
+        }
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        return texCoordsActive[data & DyeColor.MASK_COLOR];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLantern.java b/src/main/java/net/minecraft/client/render/block/model/LanternBlockModel.java
similarity index 98%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLantern.java
rename to src/main/java/net/minecraft/client/render/block/model/LanternBlockModel.java
index 791781b79..a0197810e 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLantern.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LanternBlockModel.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelLantern<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelLantern(Block block) {
+public class LanternBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public LanternBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java b/src/main/java/net/minecraft/client/render/block/model/LayerBlockModel.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java
rename to src/main/java/net/minecraft/client/render/block/model/LayerBlockModel.java
index f6719d342..7eb176bc7 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLayer.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LayerBlockModel.java
@@ -6,8 +6,8 @@ import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelLayer<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelLayer(Block block) {
+public class LayerBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public LayerBlockModel(Block block) {
         super(block);
         withCustomItemBounds(0.0f, 0.0f, 0.0f, 1.0f, 2 / 16F, 1.0f);
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java b/src/main/java/net/minecraft/client/render/block/model/LeavesBlockModel.java
similarity index 79%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java
rename to src/main/java/net/minecraft/client/render/block/model/LeavesBlockModel.java
index bb44de04c..cccb0ff69 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LeavesBlockModel.java
@@ -1,16 +1,16 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelLeaves<T extends Block> extends BlockModelStandard<T> {
+public class LeavesBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected static boolean fancyGraphics;
     protected final IconCoordinate fancyLeavesTexture;
 
-    public BlockModelLeaves(Block block, String leavesTex) {
+    public LeavesBlockModel(Block block, String leavesTex) {
         super(block);
         withTextures(leavesTex);
         fancyLeavesTexture = TextureRegistry.getTexture(leavesTex + "_fancy");
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLeavesOverlay.java b/src/main/java/net/minecraft/client/render/block/model/LeavesOverlayBlockModel.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLeavesOverlay.java
rename to src/main/java/net/minecraft/client/render/block/model/LeavesOverlayBlockModel.java
index 6e13d8f7e..e0a07750b 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLeavesOverlay.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LeavesOverlayBlockModel.java
@@ -1,15 +1,15 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelLeavesOverlay<T extends Block> extends BlockModelLeaves<T> {
+public class LeavesOverlayBlockModel<T extends Block> extends LeavesBlockModel<T> {
     protected final IconCoordinate overlayTexture;
-    public BlockModelLeavesOverlay(Block block, String leavesTex, String overlayTex) {
+    public LeavesOverlayBlockModel(Block block, String leavesTex, String overlayTex) {
         super(block, leavesTex);
         overlayTexture = TextureRegistry.getTexture(overlayTex);
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelLever.java b/src/main/java/net/minecraft/client/render/block/model/LeverBlockModel.java
similarity index 58%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelLever.java
rename to src/main/java/net/minecraft/client/render/block/model/LeverBlockModel.java
index 3ba77f047..f66b7a892 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelLever.java
+++ b/src/main/java/net/minecraft/client/render/block/model/LeverBlockModel.java
@@ -1,15 +1,16 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
-public class BlockModelLever<T extends Block> extends BlockModelStandard<T>{
-    public BlockModelLever(Block block) {
+public class LeverBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public LeverBlockModel(Block block) {
         super(block);
     }
 
@@ -22,7 +23,7 @@ public class BlockModelLever<T extends Block> extends BlockModelStandard<T>{
         boolean flag1 = renderBlocks.overrideBlockTexture != null;
         if(!flag1)
         {
-            renderBlocks.overrideBlockTexture = BlockModelDispatcher.getInstance().getDispatch(Block.cobbleStone).getBlockTextureFromSideAndMetadata(Side.BOTTOM, l);
+            renderBlocks.overrideBlockTexture = BlockModelDispatcher.getInstance().getDispatch(Blocks.COBBLE_STONE).getBlockTextureFromSideAndMetadata(Side.BOTTOM, l);
         }
         float f = 0.25F;
         float f1 = 0.1875F;
@@ -78,73 +79,73 @@ public class BlockModelLever<T extends Block> extends BlockModelStandard<T>{
         double f5 = texture.getIconUMax();
         double f6 = texture.getIconVMin();
         double f7 = texture.getIconVMax();
-        Vec3d[] avec3d = new Vec3d[8];
+        Vec3[] avec3 = new Vec3[8];
         float f8 = 0.0625F;
         float f9 = 0.0625F;
         float f10 = 0.625F;
-        avec3d[0] = Vec3d.createVector(-f8, 0.0D, -f9);
-        avec3d[1] = Vec3d.createVector(f8, 0.0D, -f9);
-        avec3d[2] = Vec3d.createVector(f8, 0.0D, f9);
-        avec3d[3] = Vec3d.createVector(-f8, 0.0D, f9);
-        avec3d[4] = Vec3d.createVector(-f8, f10, -f9);
-        avec3d[5] = Vec3d.createVector(f8, f10, -f9);
-        avec3d[6] = Vec3d.createVector(f8, f10, f9);
-        avec3d[7] = Vec3d.createVector(-f8, f10, f9);
+        avec3[0] = Vec3.getTempVec3(-f8, 0.0D, -f9);
+        avec3[1] = Vec3.getTempVec3(f8, 0.0D, -f9);
+        avec3[2] = Vec3.getTempVec3(f8, 0.0D, f9);
+        avec3[3] = Vec3.getTempVec3(-f8, 0.0D, f9);
+        avec3[4] = Vec3.getTempVec3(-f8, f10, -f9);
+        avec3[5] = Vec3.getTempVec3(f8, f10, -f9);
+        avec3[6] = Vec3.getTempVec3(f8, f10, f9);
+        avec3[7] = Vec3.getTempVec3(-f8, f10, f9);
         for(int i2 = 0; i2 < 8; i2++)
         {
             if(flag)
             {
-                avec3d[i2].zCoord -= 0.0625D;
-                avec3d[i2].rotateAroundX(0.6981317F);
+                avec3[i2].z -= 0.0625D;
+                avec3[i2].rotateAroundX(0.6981317F);
             } else
             {
-                avec3d[i2].zCoord += 0.0625D;
-                avec3d[i2].rotateAroundX(-0.6981317F);
+                avec3[i2].z += 0.0625D;
+                avec3[i2].rotateAroundX(-0.6981317F);
             }
             if(i1 == 6 || i1 == 8)
             {
-                avec3d[i2].rotateAroundY(MathHelper.PI/2f);
+                avec3[i2].rotateAroundY(MathHelper.PI/2f);
             }
             if(i1 < 5)
             {
-                avec3d[i2].yCoord -= 0.375D;
-                avec3d[i2].rotateAroundX(MathHelper.PI/2f);
+                avec3[i2].y -= 0.375D;
+                avec3[i2].rotateAroundX(MathHelper.PI/2f);
                 if(i1 == 4)
                 {
-                    avec3d[i2].rotateAroundY(0.0F);
+                    avec3[i2].rotateAroundY(0.0F);
                 }
                 if(i1 == 3)
                 {
-                    avec3d[i2].rotateAroundY(MathHelper.PI);
+                    avec3[i2].rotateAroundY(MathHelper.PI);
                 }
                 if(i1 == 2)
                 {
-                    avec3d[i2].rotateAroundY(MathHelper.PI/2f);
+                    avec3[i2].rotateAroundY(MathHelper.PI/2f);
                 }
                 if(i1 == 1)
                 {
-                    avec3d[i2].rotateAroundY(-MathHelper.PI/2f);
+                    avec3[i2].rotateAroundY(-MathHelper.PI/2f);
                 }
-                avec3d[i2].xCoord += (double)x + 0.5D;
-                avec3d[i2].yCoord += (float)y + 0.5F;
-                avec3d[i2].zCoord += (double)z + 0.5D;
+                avec3[i2].x += (double)x + 0.5D;
+                avec3[i2].y += (float)y + 0.5F;
+                avec3[i2].z += (double)z + 0.5D;
             } else if (i1 == 5 || i1 == 6)
             {
-                avec3d[i2].xCoord += (double)x + 0.5D;
-                avec3d[i2].yCoord += (float)y + 0.125F;
-                avec3d[i2].zCoord += (double)z + 0.5D;
+                avec3[i2].x += (double)x + 0.5D;
+                avec3[i2].y += (float)y + 0.125F;
+                avec3[i2].z += (double)z + 0.5D;
             } else {
-                avec3d[i2].rotateAroundX(MathHelper.PI);
-                avec3d[i2].xCoord += (double)x + 0.5D;
-                avec3d[i2].yCoord += (float)(y + 1) - 0.125F;
-                avec3d[i2].zCoord += (double)z + 0.5D;
+                avec3[i2].rotateAroundX(MathHelper.PI);
+                avec3[i2].x += (double)x + 0.5D;
+                avec3[i2].y += (float)(y + 1) - 0.125F;
+                avec3[i2].z += (double)z + 0.5D;
             }
         }
 
-        Vec3d vec3d;
-        Vec3d vec3d1;
-        Vec3d vec3d2;
-        Vec3d vec3d3;
+        Vec3 vec3;
+        Vec3 vec31;
+        Vec3 vec32;
+        Vec3 vec3d3;
         for(int j2 = 0; j2 < 6; j2++)
         {
             if(j2 == 0)
@@ -163,48 +164,48 @@ public class BlockModelLever<T extends Block> extends BlockModelStandard<T>{
             }
             if(j2 == 0)
             {
-                vec3d = avec3d[0];
-                vec3d1 = avec3d[1];
-                vec3d2 = avec3d[2];
-                vec3d3 = avec3d[3];
+                vec3 = avec3[0];
+                vec31 = avec3[1];
+                vec32 = avec3[2];
+                vec3d3 = avec3[3];
             } else
             if(j2 == 1)
             {
-                vec3d = avec3d[7];
-                vec3d1 = avec3d[6];
-                vec3d2 = avec3d[5];
-                vec3d3 = avec3d[4];
+                vec3 = avec3[7];
+                vec31 = avec3[6];
+                vec32 = avec3[5];
+                vec3d3 = avec3[4];
             } else
             if(j2 == 2)
             {
-                vec3d = avec3d[1];
-                vec3d1 = avec3d[0];
-                vec3d2 = avec3d[4];
-                vec3d3 = avec3d[5];
+                vec3 = avec3[1];
+                vec31 = avec3[0];
+                vec32 = avec3[4];
+                vec3d3 = avec3[5];
             } else
             if(j2 == 3)
             {
-                vec3d = avec3d[2];
-                vec3d1 = avec3d[1];
-                vec3d2 = avec3d[5];
-                vec3d3 = avec3d[6];
+                vec3 = avec3[2];
+                vec31 = avec3[1];
+                vec32 = avec3[5];
+                vec3d3 = avec3[6];
             } else
             if(j2 == 4)
             {
-                vec3d = avec3d[3];
-                vec3d1 = avec3d[2];
-                vec3d2 = avec3d[6];
-                vec3d3 = avec3d[7];
+                vec3 = avec3[3];
+                vec31 = avec3[2];
+                vec32 = avec3[6];
+                vec3d3 = avec3[7];
             } else {
-                vec3d = avec3d[0];
-                vec3d1 = avec3d[3];
-                vec3d2 = avec3d[7];
-                vec3d3 = avec3d[4];
+                vec3 = avec3[0];
+                vec31 = avec3[3];
+                vec32 = avec3[7];
+                vec3d3 = avec3[4];
             }
-            tessellator.addVertexWithUV(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord, f4, f7);
-            tessellator.addVertexWithUV(vec3d1.xCoord, vec3d1.yCoord, vec3d1.zCoord, f5, f7);
-            tessellator.addVertexWithUV(vec3d2.xCoord, vec3d2.yCoord, vec3d2.zCoord, f5, f6);
-            tessellator.addVertexWithUV(vec3d3.xCoord, vec3d3.yCoord, vec3d3.zCoord, f4, f6);
+            tessellator.addVertexWithUV(vec3.x, vec3.y, vec3.z, f4, f7);
+            tessellator.addVertexWithUV(vec31.x, vec31.y, vec31.z, f5, f7);
+            tessellator.addVertexWithUV(vec32.x, vec32.y, vec32.z, f5, f6);
+            tessellator.addVertexWithUV(vec3d3.x, vec3d3.y, vec3d3.z, f4, f6);
         }
 
         return true;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelMossyStone.java b/src/main/java/net/minecraft/client/render/block/model/MossyStoneBlockModel.java
similarity index 91%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelMossyStone.java
rename to src/main/java/net/minecraft/client/render/block/model/MossyStoneBlockModel.java
index 055ae05f5..2d267ba97 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelMossyStone.java
+++ b/src/main/java/net/minecraft/client/render/block/model/MossyStoneBlockModel.java
@@ -1,16 +1,16 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.core.block.Block;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelMossyStone<T extends Block> extends BlockModelStandard<T> {
+public class MossyStoneBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate mossOverlay;
-    public BlockModelMossyStone(Block block) {
+    public MossyStoneBlockModel(Block block) {
         super(block);
         mossOverlay = TextureRegistry.getTexture("minecraft:block/moss_overlay");
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelMotionSensor.java b/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
similarity index 61%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelMotionSensor.java
rename to src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
index cb8e5820f..2401550df 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelMotionSensor.java
+++ b/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
@@ -1,14 +1,14 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockMotionSensor;
+import net.minecraft.core.block.MotionSensorBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelMotionSensor extends BlockModelHorizontalRotation<BlockMotionSensor> {
+public class MotionSensorBlockModel extends HorizontalRotationBlockModel<MotionSensorBlock> {
     protected IconCoordinate overlay = TextureRegistry.getTexture("minecraft:block/motionsensor_overlay");
-    public BlockModelMotionSensor(Block block) {
+    public MotionSensorBlockModel(Block block) {
         super(block);
     }
 
@@ -25,6 +25,6 @@ public class BlockModelMotionSensor extends BlockModelHorizontalRotation<BlockMo
     }
     @Override
     public boolean hasOverbright(){
-        return !block.isActive;
+        return block.isActive;
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/block/model/PaintedChestBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/PaintedChestBlockModel.java
new file mode 100644
index 000000000..7461e32df
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/PaintedChestBlockModel.java
@@ -0,0 +1,86 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.ChestBlock;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.WorldSource;
+
+public class PaintedChestBlockModel<T extends Block> extends ChestBlockModel<T> {
+    public static final IconCoordinate[][] texCoords = new IconCoordinate[DyeColor.COLOR_AMOUNT][];
+    public static final int TEX_SINGLE_FRONT = 0;
+    public static final int TEX_LEFT_FRONT = 1;
+    public static final int TEX_RIGHT_FRONT = 2;
+    public static final int TEX_LEFT_BACK = 3;
+    public static final int TEX_RIGHT_BACK = 4;
+    public static final int TEX_SIDE = 5;
+    public static final int TEX_TOP = 6;
+
+    static {
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            String rootKey = "minecraft:block/chest_planks_oak_painted_" + c.colorID;
+            texCoords[c.blockMeta] = new IconCoordinate[7];
+            texCoords[c.blockMeta][TEX_SINGLE_FRONT] = TextureRegistry.getTexture(rootKey + "_front");
+            texCoords[c.blockMeta][TEX_LEFT_FRONT] = TextureRegistry.getTexture(rootKey + "_left_front");
+            texCoords[c.blockMeta][TEX_RIGHT_FRONT] = TextureRegistry.getTexture(rootKey + "_right_front");
+            texCoords[c.blockMeta][TEX_LEFT_BACK] = TextureRegistry.getTexture(rootKey + "_left_back");
+            texCoords[c.blockMeta][TEX_RIGHT_BACK] = TextureRegistry.getTexture(rootKey + "_right_back");
+            texCoords[c.blockMeta][TEX_SIDE] = TextureRegistry.getTexture(rootKey + "_side");
+            texCoords[c.blockMeta][TEX_TOP] = TextureRegistry.getTexture(rootKey + "_top");
+        }
+    }
+    public PaintedChestBlockModel(Block block) {
+        super(block, "minecraft:block/chest_planks_oak");
+    }
+
+    @Override
+    public IconCoordinate getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side) {
+        int meta = blockAccess.getBlockMetadata(x, y, z);
+        int color = meta >> 4;
+
+        if(side == Side.TOP || side == Side.BOTTOM) {
+            return texCoords[color][6];
+        }
+
+        Side facing = ChestBlock.getDirectionFromMeta(meta).getSide();
+        ChestBlock.Type type = ChestBlock.getTypeFromMeta(meta);
+
+        if(type == ChestBlock.Type.SINGLE) {
+            if(side == facing) {
+                return texCoords[color][TEX_SINGLE_FRONT];
+            }
+        }
+        if(type == ChestBlock.Type.LEFT) {
+            if(side == facing) {
+                return texCoords[color][TEX_LEFT_FRONT];
+            }
+            if(side == facing.getOpposite()) {
+                return texCoords[color][TEX_RIGHT_BACK];
+            }
+        }
+        if(type == ChestBlock.Type.RIGHT) {
+            if(side == facing) {
+                return texCoords[color][TEX_RIGHT_FRONT];
+            }
+            if(side == facing.getOpposite()) {
+                return texCoords[color][TEX_LEFT_BACK];
+            }
+        }
+        if(side.getAxis() != Axis.Y) {
+            return texCoords[color][TEX_SIDE];
+        }
+
+        return texCoords[color][TEX_TOP];
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data) {
+        int color = data >> 4;
+        if (side == Side.SOUTH) return texCoords[color][TEX_SINGLE_FRONT];
+        if (side.isHorizontal()) return texCoords[color][TEX_SIDE];
+        return texCoords[color][TEX_TOP];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/PaintedDoorBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/PaintedDoorBlockModel.java
new file mode 100644
index 000000000..66ddeb97c
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/PaintedDoorBlockModel.java
@@ -0,0 +1,37 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.DoorBlock;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.Side;
+
+public class PaintedDoorBlockModel<T extends DoorBlock> extends DoorBlockModel<T> {
+    public static final IconCoordinate[] doorBottomTextures = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+    public static final IconCoordinate[] doorTopTextures = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+
+    static {
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            doorTopTextures[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/door_planks_oak_" + c.colorID + "_top");
+            doorBottomTextures[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/door_planks_oak_" + c.colorID + "_bottom");
+        }
+    }
+    private final boolean isTop;
+    public PaintedDoorBlockModel(Block block, boolean isTop) {
+        super(block);
+        this.isTop = isTop;
+    }
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        int color = (data >> 4) & DyeColor.MASK_COLOR;
+        if (side.getAxis() == Axis.Y){
+            return TrapDoorPaintedBlockModel.topTextures[color];
+        } else if (isTop){
+            return doorTopTextures[color];
+        }
+        return doorBottomTextures[color];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPebbles.java b/src/main/java/net/minecraft/client/render/block/model/PebblesBlockModel.java
similarity index 87%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelPebbles.java
rename to src/main/java/net/minecraft/client/render/block/model/PebblesBlockModel.java
index a94e90297..9df336ece 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPebbles.java
+++ b/src/main/java/net/minecraft/client/render/block/model/PebblesBlockModel.java
@@ -1,20 +1,20 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelPebbles<T extends Block> extends BlockModelStandard<T> {
+public class PebblesBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate[] pebbles = {
             TextureRegistry.getTexture("minecraft:block/pebbles0"),
             TextureRegistry.getTexture("minecraft:block/pebbles1"),
             TextureRegistry.getTexture("minecraft:block/pebbles2")
     };
-    public BlockModelPebbles(Block block) {
+    public PebblesBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPiston.java b/src/main/java/net/minecraft/client/render/block/model/PistonBlockModel.java
similarity index 91%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelPiston.java
rename to src/main/java/net/minecraft/client/render/block/model/PistonBlockModel.java
index dff191a91..0aefb478a 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPiston.java
+++ b/src/main/java/net/minecraft/client/render/block/model/PistonBlockModel.java
@@ -1,20 +1,20 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.logic.PistonDirections;
-import net.minecraft.core.block.piston.BlockPistonBase;
+import net.minecraft.core.block.piston.BasePistonBlock;
 import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 
-public class BlockModelPiston<T extends BlockPistonBase> extends BlockModelStandard<T> {
+public class PistonBlockModel<T extends BasePistonBlock> extends StandardBlockModel<T> {
     private final IconCoordinate faceTexture;
     protected IconCoordinate sideTexture = TextureRegistry.getTexture("minecraft:block/piston_side");
     protected IconCoordinate topTexture = TextureRegistry.getTexture("minecraft:block/piston_top");
     protected IconCoordinate bottomTexture = TextureRegistry.getTexture("minecraft:block/piston_bottom");
-    public BlockModelPiston(Block block, IconCoordinate faceTexture){
+    public PistonBlockModel(Block block, IconCoordinate faceTexture){
         super(block);
         this.faceTexture = faceTexture;
     }
@@ -33,7 +33,7 @@ public class BlockModelPiston<T extends BlockPistonBase> extends BlockModelStand
     protected boolean renderPistonBase(Tessellator tessellator, int i, int j, int k, boolean flag) {
         int l = renderBlocks.blockAccess.getBlockMetadata(i, j, k);
         boolean flag1 = flag || (l & 8) != 0;
-        int i1 = BlockPistonBase.getDirection(l);
+        int i1 = BasePistonBlock.getDirection(l);
         if(flag1)
         {
             switch(i1)
@@ -137,14 +137,14 @@ public class BlockModelPiston<T extends BlockPistonBase> extends BlockModelStand
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
-        int direction = BlockPistonBase.getDirection(data);
+        int direction = BasePistonBlock.getDirection(data);
         if (direction > 5)
         {
             return atlasIndices[0];
         }
         if (side.getId() == direction)
         {
-            if (BlockPistonBase.isPowered(data) || block.minX > 0.0D || block.minY > 0.0D || block.minZ > 0.0D || block.maxX < 1.0D || block.maxY < 1.0D || block.maxZ < 1.0D)
+            if (BasePistonBlock.isPowered(data) || block.minX > 0.0D || block.minY > 0.0D || block.minZ > 0.0D || block.maxX < 1.0D || block.maxY < 1.0D || block.maxZ < 1.0D)
             {
                 return topTexture;
             }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPistonHead.java b/src/main/java/net/minecraft/client/render/block/model/PistonHeadBlockModel.java
similarity index 92%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelPistonHead.java
rename to src/main/java/net/minecraft/client/render/block/model/PistonHeadBlockModel.java
index 1590095f4..cee28d051 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPistonHead.java
+++ b/src/main/java/net/minecraft/client/render/block/model/PistonHeadBlockModel.java
@@ -1,19 +1,22 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.logic.PistonDirections;
-import net.minecraft.core.block.piston.BlockPistonHead;
+import net.minecraft.core.block.piston.PistonHeadBlock;
 import net.minecraft.core.util.helper.Side;
+import org.jetbrains.annotations.Nullable;
 
-public class BlockModelPistonHead extends BlockModelStandard<BlockPistonHead> {
+public class PistonHeadBlockModel extends StandardBlockModel<PistonHeadBlock> {
     protected IconCoordinate pistonSide = TextureRegistry.getTexture("minecraft:block/piston_side");
     protected IconCoordinate pistonDry = TextureRegistry.getTexture("minecraft:block/piston_face");
     protected IconCoordinate pistonSticky = TextureRegistry.getTexture("minecraft:block/piston_face_sticky");
-    public BlockModelPistonHead(Block block) {
+    @Nullable
+    public IconCoordinate faceTextureOverride;
+    public PistonHeadBlockModel(Block block) {
         super(block);
     }
 
@@ -22,14 +25,17 @@ public class BlockModelPistonHead extends BlockModelStandard<BlockPistonHead> {
         block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
         return renderPistonHead(tessellator, block, x, y, z, true);
     }
-    public void renderPistonHeadNoCulling(Tessellator tessellator, BlockPistonHead block, int x, int y, int z, boolean flag) {
+    public void renderPistonHeadNoCulling(Tessellator tessellator, PistonHeadBlock block, int x, int y, int z, boolean flag) {
         renderBlocks.renderAllFaces = true;
         renderPistonHead(tessellator, block, x, y, z, flag);
         renderBlocks.renderAllFaces = false;
     }
-    protected boolean renderPistonHead(Tessellator tessellator, BlockPistonHead block, int x, int y, int z, boolean flag) {
+    public void setFaceTextureOverride(@Nullable IconCoordinate faceTexture){
+        faceTextureOverride = faceTexture;
+    }
+    protected boolean renderPistonHead(Tessellator tessellator, PistonHeadBlock block, int x, int y, int z, boolean flag) {
         int metadata = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        int direction = BlockPistonHead.getDirectionFromMeta(metadata);
+        int direction = PistonHeadBlock.getDirectionFromMeta(metadata);
         float brightness = 1.0f;
         if(LightmapHelper.isLightmapEnabled()) {
         	tessellator.setLightmapCoord(block.getLightmapCoord(renderBlocks.blockAccess, x, y, z));
@@ -176,12 +182,12 @@ public class BlockModelPistonHead extends BlockModelStandard<BlockPistonHead> {
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
-        int direction = BlockPistonHead.getDirectionFromMeta(data);
+        int direction = PistonHeadBlock.getDirectionFromMeta(data);
         if(side.getId() == direction)
         {
-            if(block.faceTexture != null)
+            if(faceTextureOverride != null)
             {
-                return block.faceTexture;
+                return faceTextureOverride;
             }
             if((data & 8) != 0)
             {
diff --git a/src/main/java/net/minecraft/client/render/block/model/PlanksPaintedBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/PlanksPaintedBlockModel.java
new file mode 100644
index 000000000..26c0820fc
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/PlanksPaintedBlockModel.java
@@ -0,0 +1,26 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.Side;
+
+public class PlanksPaintedBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public static final IconCoordinate[] texCoords = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+
+    static {
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            texCoords[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/planks_oak_painted_" + c.colorID);
+        }
+    }
+
+    public PlanksPaintedBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
+        return texCoords[meta & DyeColor.MASK_COLOR];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPortal.java b/src/main/java/net/minecraft/client/render/block/model/PortalBlockModel.java
similarity index 90%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelPortal.java
rename to src/main/java/net/minecraft/client/render/block/model/PortalBlockModel.java
index 103649faf..a3adb1a79 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPortal.java
+++ b/src/main/java/net/minecraft/client/render/block/model/PortalBlockModel.java
@@ -3,8 +3,8 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelPortal<T extends Block> extends BlockModelTransparent<T> {
-    public BlockModelPortal(Block block) {
+public class PortalBlockModel<T extends Block> extends TransparentBlockModel<T> {
+    public PortalBlockModel(Block block) {
         super(block, false);
     }
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java b/src/main/java/net/minecraft/client/render/block/model/PumpkinPieBlockModel.java
similarity index 89%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java
rename to src/main/java/net/minecraft/client/render/block/model/PumpkinPieBlockModel.java
index 75560dc50..82cef26e1 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java
+++ b/src/main/java/net/minecraft/client/render/block/model/PumpkinPieBlockModel.java
@@ -1,19 +1,18 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockCake;
-import net.minecraft.core.block.BlockEdible;
+import net.minecraft.core.block.EdibleBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelPumpkinPie<T extends Block> extends BlockModelStandard<T>{
+public class PumpkinPieBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate sideTexture = TextureRegistry.getTexture("minecraft:block/pumpkin_pie_side");
     protected IconCoordinate insideTexture = TextureRegistry.getTexture("minecraft:block/pumpkin_pie_inside");
     protected IconCoordinate topTexture = TextureRegistry.getTexture("minecraft:block/pumpkin_pie_top");
 
-    public BlockModelPumpkinPie(Block block) {
+    public PumpkinPieBlockModel(Block block) {
         super(block);
         float f = 0.0625F;
         float f1 = 0.375F;
@@ -48,7 +47,7 @@ public class BlockModelPumpkinPie<T extends Block> extends BlockModelStandard<T>
         boolean insideEast = sliceX == 0 ;
         boolean insideWest = sliceX == 1;
 
-        maxSlices = ((BlockEdible) block).maxBites;
+        maxSlices = ((EdibleBlock) block).maxBites;
         block.setBlockBounds(xMin + offsetXMin, 0.0F, zMin + offsetZMin, xMax - offsetXMax, 0.375F, zMax - offsetZMax);
         renderSide(tessellator, block, x, y, z, Side.TOP, 0);
         renderSide(tessellator, block, x, y, z, Side.BOTTOM, 0);
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRail.java b/src/main/java/net/minecraft/client/render/block/model/RailBlockModel.java
similarity index 90%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelRail.java
rename to src/main/java/net/minecraft/client/render/block/model/RailBlockModel.java
index 865ee6499..a53bf2c8f 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelRail.java
+++ b/src/main/java/net/minecraft/client/render/block/model/RailBlockModel.java
@@ -1,21 +1,22 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRail;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.RailBlock;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelRail<T extends BlockRail> extends BlockModelStandard<T> {
+public class RailBlockModel<T extends RailBlock> extends StandardBlockModel<T> {
     protected IconCoordinate railCurve = TextureRegistry.getTexture("minecraft:block/rail_turn");
     protected IconCoordinate powerActive = TextureRegistry.getTexture("minecraft:block/rail_powered_active");
     protected IconCoordinate powerActiveOverlay = TextureRegistry.getTexture("minecraft:block/rail_powered_overlay");
 
-    public BlockModelRail(Block block) {
+    public RailBlockModel(Block block) {
         super(block);
         this.hasOverbright = true;
     }
@@ -117,7 +118,7 @@ public class BlockModelRail<T extends BlockRail> extends BlockModelStandard<T> {
     @Override
     public IconCoordinate getBlockOverbrightTexture(WorldSource blockAccess, int x, int y, int z, int side)
     {
-        if (block.id != Block.railPowered.id || (blockAccess.getBlockMetadata(x, y, z) & 8) == 0) return null;
+        if (block.id != Blocks.RAIL_POWERED.id || (blockAccess.getBlockMetadata(x, y, z) & 8) == 0) return null;
 
         return powerActiveOverlay;
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/RedstonePumpkinBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/RedstonePumpkinBlockModel.java
new file mode 100644
index 000000000..4e0b56ceb
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/RedstonePumpkinBlockModel.java
@@ -0,0 +1,29 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RedstonePumpkinBlock;
+import net.minecraft.core.util.helper.Side;
+
+public class RedstonePumpkinBlockModel extends HorizontalRotationBlockModel<RedstonePumpkinBlock> {
+    protected IconCoordinate overlay = TextureRegistry.getTexture("minecraft:block/pumpkin_redstone_overlay");
+    public RedstonePumpkinBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockOverbrightTextureFromSideAndMeta(Side side, int data)
+    {
+        if(side.getId() == data)
+        {
+            return overlay;
+        }
+        return null;
+    }
+
+    @Override
+    public boolean hasOverbright(){
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRedstoneWire.java b/src/main/java/net/minecraft/client/render/block/model/RedstoneWireBlockModel.java
similarity index 92%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelRedstoneWire.java
rename to src/main/java/net/minecraft/client/render/block/model/RedstoneWireBlockModel.java
index 8158b9bfb..e078b6683 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelRedstoneWire.java
+++ b/src/main/java/net/minecraft/client/render/block/model/RedstoneWireBlockModel.java
@@ -1,19 +1,19 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRedstoneWire;
+import net.minecraft.core.block.RedstoneWireBlock;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.Color;
 
-public class BlockModelRedstoneWire<T extends Block> extends BlockModelStandard<T>{
+public class RedstoneWireBlockModel<T extends Block> extends StandardBlockModel<T> {
     protected IconCoordinate wireStraight = TextureRegistry.getTexture("minecraft:block/wire_redstone_straight");
     protected IconCoordinate wireCross = TextureRegistry.getTexture("minecraft:block/wire_redstone_cross");
-    public BlockModelRedstoneWire(Block block) {
+    public RedstoneWireBlockModel(Block block) {
         super(block);
         withTextures("minecraft:block/wire_redstone_cross");
     }
@@ -49,32 +49,32 @@ public class BlockModelRedstoneWire<T extends Block> extends BlockModelStandard<
         float blue = color.getBlue() / 255.0f;
 
         tessellator.setColorOpaque_F(brightness * red, brightness * green, brightness * blue);
-        boolean west = BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y, z, 1) || !renderBlocks.blockAccess.isBlockNormalCube(x - 1, y, z) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y - 1, z, -1);
-        boolean east = BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y, z, 3) || !renderBlocks.blockAccess.isBlockNormalCube(x + 1, y, z) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y - 1, z, -1);
-        boolean north = BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y, z - 1, 2) || !renderBlocks.blockAccess.isBlockNormalCube(x, y, z - 1) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y - 1, z - 1, -1);
-        boolean south = BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y, z + 1, 0) || !renderBlocks.blockAccess.isBlockNormalCube(x, y, z + 1) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y - 1, z + 1, -1);
+        boolean west = RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y, z, 1) || !renderBlocks.blockAccess.isBlockNormalCube(x - 1, y, z) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y - 1, z, -1);
+        boolean east = RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y, z, 3) || !renderBlocks.blockAccess.isBlockNormalCube(x + 1, y, z) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y - 1, z, -1);
+        boolean north = RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y, z - 1, 2) || !renderBlocks.blockAccess.isBlockNormalCube(x, y, z - 1) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y - 1, z - 1, -1);
+        boolean south = RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y, z + 1, 0) || !renderBlocks.blockAccess.isBlockNormalCube(x, y, z + 1) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y - 1, z + 1, -1);
         boolean westUp = false;
         boolean eastUp = false;
         boolean northUp = false;
         boolean southUp = false;
         if(!renderBlocks.blockAccess.isBlockOpaqueCube(x, y + 1, z))
         {
-            if(renderBlocks.blockAccess.isBlockNormalCube(x - 1, y, z) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y + 1, z, -1))
+            if(renderBlocks.blockAccess.isBlockNormalCube(x - 1, y, z) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x - 1, y + 1, z, -1))
             {
                 west = true;
                 westUp = true;
             }
-            if(renderBlocks.blockAccess.isBlockNormalCube(x + 1, y, z) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y + 1, z, -1))
+            if(renderBlocks.blockAccess.isBlockNormalCube(x + 1, y, z) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x + 1, y + 1, z, -1))
             {
                 east = true;
                 eastUp = true;
             }
-            if(renderBlocks.blockAccess.isBlockNormalCube(x, y, z - 1) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y + 1, z - 1, -1))
+            if(renderBlocks.blockAccess.isBlockNormalCube(x, y, z - 1) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y + 1, z - 1, -1))
             {
                 north = true;
                 northUp = true;
             }
-            if(renderBlocks.blockAccess.isBlockNormalCube(x, y, z + 1) && BlockRedstoneWire.isPowerProviderOrWire(renderBlocks.blockAccess, x, y + 1, z + 1, -1))
+            if(renderBlocks.blockAccess.isBlockNormalCube(x, y, z + 1) && RedstoneWireBlock.isPowerProviderOrWire(renderBlocks.blockAccess, x, y + 1, z + 1, -1))
             {
                 south = true;
                 southUp = true;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRepeater.java b/src/main/java/net/minecraft/client/render/block/model/RepeaterBlockModel.java
similarity index 76%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelRepeater.java
rename to src/main/java/net/minecraft/client/render/block/model/RepeaterBlockModel.java
index 961c61704..827541ee0 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelRepeater.java
+++ b/src/main/java/net/minecraft/client/render/block/model/RepeaterBlockModel.java
@@ -3,15 +3,16 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRedstoneRepeater;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.RepeaterBlock;
 import net.minecraft.core.world.WorldSource;
 
 @SuppressWarnings("unchecked")
-public class BlockModelRepeater extends BlockModelStandard<BlockRedstoneRepeater> {
-	private static final BlockModelTorch<Block> modelTorchActive = (BlockModelTorch<Block>) BlockModelDispatcher.getInstance().getDispatch(Block.torchRedstoneActive);
-    private static final BlockModelTorch<Block> modelTorchIdle = (BlockModelTorch<Block>) BlockModelDispatcher.getInstance().getDispatch(Block.torchRedstoneIdle);
+public class RepeaterBlockModel extends StandardBlockModel<RepeaterBlock> {
+	private static final TorchBlockModel<Block> modelTorchActive = (TorchBlockModel<Block>) BlockModelDispatcher.getInstance().getDispatch(Blocks.TORCH_REDSTONE_ACTIVE);
+    private static final TorchBlockModel<Block> modelTorchIdle = (TorchBlockModel<Block>) BlockModelDispatcher.getInstance().getDispatch(Blocks.TORCH_REDSTONE_IDLE);
 
-    public BlockModelRepeater(Block block) {
+    public RepeaterBlockModel(Block block) {
         super(block);
     }
 
@@ -65,25 +66,25 @@ public class BlockModelRepeater extends BlockModelStandard<BlockRedstoneRepeater
         {
             case 0: // '\0'
                 d4 = -0.3125D;
-                d2 = BlockRedstoneRepeater.field_22024_a[j1];
+                d2 = RepeaterBlock.torchPosOffset[j1];
                 break;
 
             case 2: // '\002'
                 d4 = 0.3125D;
-                d2 = -BlockRedstoneRepeater.field_22024_a[j1];
+                d2 = -RepeaterBlock.torchPosOffset[j1];
                 break;
 
             case 3: // '\003'
                 d3 = -0.3125D;
-                d1 = BlockRedstoneRepeater.field_22024_a[j1];
+                d1 = RepeaterBlock.torchPosOffset[j1];
                 break;
 
             case 1: // '\001'
                 d3 = 0.3125D;
-                d1 = -BlockRedstoneRepeater.field_22024_a[j1];
+                d1 = -RepeaterBlock.torchPosOffset[j1];
                 break;
         }
-        BlockModelTorch<Block> modelTorch = block.isRepeaterPowered ? modelTorchActive : modelTorchIdle;
+        TorchBlockModel<Block> modelTorch = block.isRepeaterPowered ? modelTorchActive : modelTorchIdle;
         modelTorch.renderTorchAtAngle(tessellator, (double)x + d1, (double)y + d, (double)z + d2, 0.0D, 0.0D);
         modelTorch.renderTorchAtAngle(tessellator, (double)x + d3, (double)y + d, (double)z + d4, 0.0D, 0.0D);
         return true;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java b/src/main/java/net/minecraft/client/render/block/model/RopeBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java
rename to src/main/java/net/minecraft/client/render/block/model/RopeBlockModel.java
index cd322e604..29d119625 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelRope.java
+++ b/src/main/java/net/minecraft/client/render/block/model/RopeBlockModel.java
@@ -2,15 +2,15 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLanternFirefly;
-import net.minecraft.core.block.BlockRope;
+import net.minecraft.core.block.FireflyLanternBlock;
+import net.minecraft.core.block.RopeBlock;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelRope<T extends BlockRope>
-extends BlockModelStandard<T> {
-    public BlockModelRope(Block block) {
+public class RopeBlockModel<T extends RopeBlock>
+extends StandardBlockModel<T> {
+    public RopeBlockModel(Block block) {
         super(block);
     }
 
@@ -90,7 +90,7 @@ extends BlockModelStandard<T> {
         int blockZ = z + side.getOffsetZ();
         Block _block = worldSource.getBlock(blockX, blockY, blockZ);
         if (side == Side.BOTTOM){
-            if (_block instanceof BlockLanternFirefly && (worldSource.getBlockMetadata(blockX, blockY, blockZ) & 0b1) != 0){
+            if (_block instanceof FireflyLanternBlock && (worldSource.getBlockMetadata(blockX, blockY, blockZ) & 0b1) != 0){
                 return true;
             }
         } else if (side == Side.TOP) {
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelRotatable.java b/src/main/java/net/minecraft/client/render/block/model/RotatableBlockModel.java
similarity index 68%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelRotatable.java
rename to src/main/java/net/minecraft/client/render/block/model/RotatableBlockModel.java
index cabe6281d..ea5bb32c7 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelRotatable.java
+++ b/src/main/java/net/minecraft/client/render/block/model/RotatableBlockModel.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 
-public class BlockModelRotatable<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelRotatable(Block block) {
+public class RotatableBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public RotatableBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelSeat.java b/src/main/java/net/minecraft/client/render/block/model/SeatBlockModel.java
similarity index 90%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelSeat.java
rename to src/main/java/net/minecraft/client/render/block/model/SeatBlockModel.java
index cee6a8afd..dc8996313 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelSeat.java
+++ b/src/main/java/net/minecraft/client/render/block/model/SeatBlockModel.java
@@ -4,8 +4,8 @@ import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelSeat<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelSeat(Block block) {
+public class SeatBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public SeatBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlab.java b/src/main/java/net/minecraft/client/render/block/model/SlabBlockModel.java
similarity index 74%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelSlab.java
rename to src/main/java/net/minecraft/client/render/block/model/SlabBlockModel.java
index d17f3ffdb..9612a2eff 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlab.java
+++ b/src/main/java/net/minecraft/client/render/block/model/SlabBlockModel.java
@@ -1,15 +1,15 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSlab;
+import net.minecraft.core.block.SlabBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelSlab<T extends BlockSlab> extends BlockModelStandard<T> {
-    public BlockModelSlab(Block block){
+public class SlabBlockModel<T extends SlabBlock> extends StandardBlockModel<T> {
+    public SlabBlockModel(Block block){
         super(block);
-        this.atlasIndices = ((BlockModelStandard<?>)BlockModelDispatcher.getInstance().getDispatch(this.block.modelBlock)).atlasIndices;
+        this.atlasIndices = ((StandardBlockModel<?>)BlockModelDispatcher.getInstance().getDispatch(this.block.modelBlock)).atlasIndices;
         withCustomItemBounds(0, 0, 0, 1, 0.5d, 1);
     }
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlabMarble.java b/src/main/java/net/minecraft/client/render/block/model/SlabMarbleBlockModel.java
similarity index 72%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelSlabMarble.java
rename to src/main/java/net/minecraft/client/render/block/model/SlabMarbleBlockModel.java
index 36f7f7a13..492fb67a1 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlabMarble.java
+++ b/src/main/java/net/minecraft/client/render/block/model/SlabMarbleBlockModel.java
@@ -1,16 +1,16 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSlab;
+import net.minecraft.core.block.SlabBlock;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelSlabMarble<T extends BlockSlab> extends BlockModelSlab<T> {
+public class SlabMarbleBlockModel<T extends SlabBlock> extends SlabBlockModel<T> {
     protected IconCoordinate slabSide = TextureRegistry.getTexture("minecraft:block/carved_marble");
-    public BlockModelSlabMarble(Block block) {
+    public SlabMarbleBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlabPainted.java b/src/main/java/net/minecraft/client/render/block/model/SlabPaintedBlockModel.java
similarity index 64%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelSlabPainted.java
rename to src/main/java/net/minecraft/client/render/block/model/SlabPaintedBlockModel.java
index cdf25252c..20d885587 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelSlabPainted.java
+++ b/src/main/java/net/minecraft/client/render/block/model/SlabPaintedBlockModel.java
@@ -1,20 +1,20 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSlab;
+import net.minecraft.core.block.SlabBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelSlabPainted<T extends BlockSlab> extends BlockModelSlab<T> {
-    public BlockModelSlabPainted(Block block) {
+public class SlabPaintedBlockModel<T extends SlabBlock> extends SlabBlockModel<T> {
+    public SlabPaintedBlockModel(Block block) {
         super(block);
     }
 
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
         meta = meta >> 4;
-        return BlockModelPlanksPainted.texCoords[meta & 0x0F];
+        return PlanksPaintedBlockModel.texCoords[meta & 0x0F];
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelSpikes.java b/src/main/java/net/minecraft/client/render/block/model/SpikesBlockModel.java
similarity index 95%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelSpikes.java
rename to src/main/java/net/minecraft/client/render/block/model/SpikesBlockModel.java
index 83e37bfae..5b8134fd0 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelSpikes.java
+++ b/src/main/java/net/minecraft/client/render/block/model/SpikesBlockModel.java
@@ -1,14 +1,14 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSpikes;
+import net.minecraft.core.block.SpikesBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelSpikes<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelSpikes(Block block) {
+public class SpikesBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public SpikesBlockModel(Block block) {
         super(block);
     }
 
@@ -25,7 +25,7 @@ public class BlockModelSpikes<T extends Block> extends BlockModelStandard<T> {
         block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.1875F, 1.0F);
         renderStandardBlock(tessellator, block, x, y, z);
 
-        if(BlockSpikes.isSpikesUp(metaData)) {
+        if(SpikesBlock.isSpikesUp(metaData)) {
             float brightness = 1.0f;
             if(LightmapHelper.isLightmapEnabled()) {
             	tessellator.setLightmapCoord(block.getLightmapCoord(renderBlocks.blockAccess, x, y, z));
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelStairs.java b/src/main/java/net/minecraft/client/render/block/model/StairsBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelStairs.java
rename to src/main/java/net/minecraft/client/render/block/model/StairsBlockModel.java
index ad79f2713..d920e4fc4 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelStairs.java
+++ b/src/main/java/net/minecraft/client/render/block/model/StairsBlockModel.java
@@ -1,19 +1,19 @@
 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.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockStairs;
+import net.minecraft.core.block.StairsBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelStairs<T extends BlockStairs> extends BlockModelStandard<T> {
-    public BlockModelStairs(Block block) {
+public class StairsBlockModel<T extends StairsBlock> extends StandardBlockModel<T> {
+    public StairsBlockModel(Block block) {
         super(block);
-        this.atlasIndices = ((BlockModelStandard<?>)BlockModelDispatcher.getInstance().getDispatch(this.block.modelBlock)).atlasIndices;
+        this.atlasIndices = ((StandardBlockModel<?>)BlockModelDispatcher.getInstance().getDispatch(this.block.modelBlock)).atlasIndices;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelStairsPainted.java b/src/main/java/net/minecraft/client/render/block/model/StairsPaintedBlockModel.java
similarity index 64%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelStairsPainted.java
rename to src/main/java/net/minecraft/client/render/block/model/StairsPaintedBlockModel.java
index c9be4dca7..257979d71 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelStairsPainted.java
+++ b/src/main/java/net/minecraft/client/render/block/model/StairsPaintedBlockModel.java
@@ -1,20 +1,20 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockStairs;
+import net.minecraft.core.block.StairsBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelStairsPainted<T extends BlockStairs> extends BlockModelStairs<T> {
-    public BlockModelStairsPainted(Block block) {
+public class StairsPaintedBlockModel<T extends StairsBlock> extends StairsBlockModel<T> {
+    public StairsPaintedBlockModel(Block block) {
         super(block);
     }
 
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int meta) {
         meta = meta >> 4;
-        return BlockModelPlanksPainted.texCoords[meta & 0x0F];
+        return PlanksPaintedBlockModel.texCoords[meta & 0x0F];
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java b/src/main/java/net/minecraft/client/render/block/model/StandardBlockModel.java
similarity index 94%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
rename to src/main/java/net/minecraft/client/render/block/model/StandardBlockModel.java
index d55d6fa2f..e758362a3 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
+++ b/src/main/java/net/minecraft/client/render/block/model/StandardBlockModel.java
@@ -1,8 +1,8 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.core.block.Block;
@@ -11,14 +11,14 @@ import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelStandard<T extends Block> extends BlockModel<T>{
+public class StandardBlockModel<T extends Block> extends BlockModel<T>{
     public static final IconCoordinate BLOCK_TEXTURE_MISSING = TextureRegistry.getTexture("minecraft:block/texture_missing");
     public static final IconCoordinate BLOCK_TEXTURE_UNASSIGNED = TextureRegistry.getTexture("minecraft:block/texture_unassigned");
     public IconCoordinate[] atlasIndices = new IconCoordinate[]{BLOCK_TEXTURE_UNASSIGNED, BLOCK_TEXTURE_UNASSIGNED, BLOCK_TEXTURE_UNASSIGNED, BLOCK_TEXTURE_UNASSIGNED, BLOCK_TEXTURE_UNASSIGNED, BLOCK_TEXTURE_UNASSIGNED};
     public double[] itemRenderBounds = null;
     public IconCoordinate overbrightTexture = null;
 
-    public BlockModelStandard(Block block) {
+    public StandardBlockModel(Block block) {
         super(block);
     }
 
@@ -251,26 +251,26 @@ public class BlockModelStandard<T extends Block> extends BlockModel<T>{
             itemRenderBounds[5]);
         }
     }
-    public BlockModelStandard<T> withCustomItemBounds(double minX, double minY, double minZ, double maxX, double maxY, double maxZ){
+    public StandardBlockModel<T> withCustomItemBounds(double minX, double minY, double minZ, double maxX, double maxY, double maxZ){
         this.itemRenderBounds = new double[]{minX, minY, minZ, maxX, maxY, maxZ};
         return this;
     }
-    public BlockModelStandard<T> withOverbrightTexture(String texture)
+    public StandardBlockModel<T> withOverbrightTexture(String texture)
     {
         this.hasOverbright = true;
         this.overbrightTexture = TextureRegistry.getTexture(texture);
         return this;
     }
-    public BlockModelStandard<T> withTextures(String texture){
+    public StandardBlockModel<T> withTextures(String texture){
         return withTextures(texture, texture, texture);
     }
-    public BlockModelStandard<T> withTextures(String textureTopBottom, String textureSides){
+    public StandardBlockModel<T> withTextures(String textureTopBottom, String textureSides){
         return withTextures(textureTopBottom, textureTopBottom, textureSides);
     }
-    public BlockModelStandard<T> withTextures(String textureTop, String textureBottom, String textureSides){
+    public StandardBlockModel<T> withTextures(String textureTop, String textureBottom, String textureSides){
         return withTextures(textureTop, textureBottom, textureSides, textureSides, textureSides, textureSides);
     }
-    public BlockModelStandard<T> withTextures(String textureTop, String textureBottom, String textureNorth, String textureEast, String textureSouth, String textureWest){
+    public StandardBlockModel<T> withTextures(String textureTop, String textureBottom, String textureNorth, String textureEast, String textureSouth, String textureWest){
         atlasIndices[Side.TOP.getId()] = TextureRegistry.getTexture(textureTop);
         atlasIndices[Side.BOTTOM.getId()] = TextureRegistry.getTexture(textureBottom);
         atlasIndices[Side.NORTH.getId()] = TextureRegistry.getTexture(textureNorth);
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTorch.java b/src/main/java/net/minecraft/client/render/block/model/TorchBlockModel.java
similarity index 96%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelTorch.java
rename to src/main/java/net/minecraft/client/render/block/model/TorchBlockModel.java
index b76c4bb37..9d980568d 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelTorch.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TorchBlockModel.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelTorch<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelTorch(Block block) {
+public class TorchBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public TorchBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTorchRedstone.java b/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
similarity index 61%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelTorchRedstone.java
rename to src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
index bdd35d453..7b65a424e 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelTorchRedstone.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
@@ -1,14 +1,15 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRedstoneTorch;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.RedstoneTorchBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class BlockModelTorchRedstone extends BlockModelTorch<BlockRedstoneTorch>{
-    private static final BlockModel<Block> redstoneWire = BlockModelDispatcher.getInstance().getDispatch(Block.wireRedstone);
+public class TorchRedstoneBlockModel extends TorchBlockModel<RedstoneTorchBlock> {
+    private static final BlockModel<Block> redstoneWire = BlockModelDispatcher.getInstance().getDispatch(Blocks.WIRE_REDSTONE);
 
-    public BlockModelTorchRedstone(Block block) {
+    public TorchRedstoneBlockModel(Block block) {
         super(block);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTransparent.java b/src/main/java/net/minecraft/client/render/block/model/TransparentBlockModel.java
similarity index 80%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelTransparent.java
rename to src/main/java/net/minecraft/client/render/block/model/TransparentBlockModel.java
index b0a2d9837..a84a0b405 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelTransparent.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TransparentBlockModel.java
@@ -3,9 +3,9 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockModelTransparent<T extends Block> extends BlockModelStandard<T> {
+public class TransparentBlockModel<T extends Block> extends StandardBlockModel<T> {
     private final boolean renderInside;
-    public BlockModelTransparent(Block block, boolean renderInside){
+    public TransparentBlockModel(Block block, boolean renderInside){
         super(block);
         this.renderInside = renderInside;
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoor.java b/src/main/java/net/minecraft/client/render/block/model/TrapDoorBlockModel.java
similarity index 87%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoor.java
rename to src/main/java/net/minecraft/client/render/block/model/TrapDoorBlockModel.java
index 915854edd..91d6bef12 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoor.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TrapDoorBlockModel.java
@@ -1,17 +1,17 @@
 package net.minecraft.client.render.block.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockTrapDoor;
+import net.minecraft.core.block.TrapDoorBlock;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
 
-public class BlockModelTrapDoor<T extends Block> extends BlockModelStandard<T> {
-    public BlockModelTrapDoor(Block block) {
+public class TrapDoorBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public TrapDoorBlockModel(Block block) {
         super(block);
         float offset = 0.1875F;
         withCustomItemBounds(0.0F, 0.0F, 0.0F, 1.0F, offset, 1.0F);
@@ -21,7 +21,7 @@ public class BlockModelTrapDoor<T extends Block> extends BlockModelStandard<T> {
     public boolean render(Tessellator tessellator, int x, int y, int z) {
         block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
         int metadata = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        boolean isUp = BlockTrapDoor.isTrapdoorOpen(metadata);
+        boolean isUp = TrapDoorBlock.isTrapdoorOpen(metadata);
 
         if(isUp) {
             switch (metadata & 3) {
@@ -55,7 +55,7 @@ public class BlockModelTrapDoor<T extends Block> extends BlockModelStandard<T> {
             }
         }
         else{
-            if(BlockTrapDoor.isUpperHalf(metadata)){
+            if(TrapDoorBlock.isUpperHalf(metadata)){
                 renderBlocks.uvRotateSouth = 3;
                 renderBlocks.uvRotateNorth = 3;
                 renderBlocks.uvRotateEast = 3;
@@ -75,7 +75,7 @@ public class BlockModelTrapDoor<T extends Block> extends BlockModelStandard<T> {
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
         int orientation = data & 3;
-        if(BlockTrapDoor.isTrapdoorOpen(data)) {
+        if(TrapDoorBlock.isTrapdoorOpen(data)) {
             int index = Sides.orientationLookUpTrapdoorOpen[6 * orientation + side.getId()];
             return atlasIndices[index];
         } else {
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java b/src/main/java/net/minecraft/client/render/block/model/TrapDoorPaintedBlockModel.java
similarity index 52%
rename from src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java
rename to src/main/java/net/minecraft/client/render/block/model/TrapDoorPaintedBlockModel.java
index f690e2511..69da98a57 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelTrapDoorPainted.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TrapDoorPaintedBlockModel.java
@@ -1,33 +1,33 @@
 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.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockTrapDoor;
-import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.block.TrapDoorBlock;
 import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.DyeColor;
 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];
+public class TrapDoorPaintedBlockModel<T extends Block> extends TrapDoorBlockModel<T> {
+    public static final IconCoordinate[] topTextures = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+    public static final IconCoordinate[] sideTextures = new IconCoordinate[DyeColor.COLOR_AMOUNT];
 
     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");
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            topTextures[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/trapdoor_planks_oak_" + c.colorID + "_top");
+            sideTextures[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/trapdoor_planks_oak_" + c.colorID + "_side");
         }
     }
-    public BlockModelTrapDoorPainted(Block block) {
+    public TrapDoorPaintedBlockModel(Block block) {
         super(block);
     }
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
-        int color = (data >> 4) & 0xF;
+        int color = (data >> 4) & DyeColor.MASK_COLOR;
         int orientation = data & 3;
-        if(BlockTrapDoor.isTrapdoorOpen(data)) {
+        if(TrapDoorBlock.isTrapdoorOpen(data)) {
             int index = Sides.orientationLookUpTrapdoorOpen[6 * orientation + side.getId()];
             if (index < 2) return topTextures[color];
             return sideTextures[color];
diff --git a/src/main/java/net/minecraft/client/render/block/model/WoolBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/WoolBlockModel.java
new file mode 100644
index 000000000..946b878f3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/WoolBlockModel.java
@@ -0,0 +1,25 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.Side;
+
+public class WoolBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public static final IconCoordinate[] texCoords = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+
+    static {
+        for (DyeColor c : DyeColor.blockOrderedColors()){
+            texCoords[c.blockMeta] = TextureRegistry.getTexture("minecraft:block/wool_" + c.colorID);
+        }
+    }
+    public WoolBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data) {
+        return texCoords[data & DyeColor.MASK_COLOR];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRenderer.java b/src/main/java/net/minecraft/client/render/blockentity/BlockEntityRenderer.java
similarity index 60%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRenderer.java
rename to src/main/java/net/minecraft/client/render/blockentity/BlockEntityRenderer.java
index 033d5ba10..bd9dd308a 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/BlockEntityRenderer.java
@@ -1,16 +1,16 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.TileEntityRenderDispatcher;
+import net.minecraft.client.render.BlockEntityRenderDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.world.World;
 
-public abstract class TileEntityRenderer<T extends TileEntity>
+public abstract class BlockEntityRenderer<T extends BlockEntity>
 {
 
-    public TileEntityRenderer()
+    public BlockEntityRenderer()
     {
     }
 
@@ -20,10 +20,10 @@ public abstract class TileEntityRenderer<T extends TileEntity>
     protected void loadTexture(String texturePath)
     {
         RenderEngine renderengine = renderDispatcher.renderEngine;
-        renderengine.bindTexture(renderengine.getTexture(texturePath));
+        renderengine.bindTexture(renderengine.loadTexture(texturePath));
     }
 
-    public void setRenderDispatcher(TileEntityRenderDispatcher renderDispatcher)
+    public void setRenderDispatcher(BlockEntityRenderDispatcher renderDispatcher)
     {
         this.renderDispatcher = renderDispatcher;
     }
@@ -37,5 +37,5 @@ public abstract class TileEntityRenderer<T extends TileEntity>
         return renderDispatcher.getFontRenderer();
     }
 
-    protected TileEntityRenderDispatcher renderDispatcher;
+    protected BlockEntityRenderDispatcher renderDispatcher;
 }
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java b/src/main/java/net/minecraft/client/render/blockentity/FlagBlockEntityRenderer.java
similarity index 72%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java
rename to src/main/java/net/minecraft/client/render/blockentity/FlagBlockEntityRenderer.java
index 3c473cf82..824274de5 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/FlagBlockEntityRenderer.java
@@ -1,35 +1,35 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FlagRenderer;
-import net.minecraft.client.render.model.ModelFlag;
+import net.minecraft.client.render.model.FlagModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlag;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.FlagBlockEntity;
 
 import net.minecraft.core.world.World;
-import net.minecraft.core.world.wind.WindManager;
+import net.minecraft.core.world.wind.WindProvider;
 import org.lwjgl.opengl.GL11;
 
-public class TileEntityRendererFlag extends TileEntityRenderer<TileEntityFlag>
+public class FlagBlockEntityRenderer extends BlockEntityRenderer<FlagBlockEntity>
 {
 
 	public final Minecraft mc = Minecraft.getMinecraft(this);
-    private final ModelFlag flagModel;
+    private final FlagModel flagModel;
     private FlagRenderer flagRenderer = null;
     
-    public TileEntityRendererFlag() 
+    public FlagBlockEntityRenderer()
     {
-        flagModel = new ModelFlag();
+        flagModel = new FlagModel();
     }
 
     @Override
-    public void doRender(Tessellator tessellator, TileEntityFlag tileEntity, double x, double y, double z, float partialTick) {
+    public void doRender(Tessellator tessellator, FlagBlockEntity tileEntity, double x, double y, double z, float partialTick) {
         World theWorld = Minecraft.getMinecraft(this).theWorld;
         int blockUnder = theWorld.getBlockId(tileEntity.x, tileEntity.y - 1, tileEntity.z);
-        boolean shortPole = blockUnder == Block.flag.id;
+        boolean shortPole = blockUnder == Blocks.FLAG.id;
 
-        WindManager theWind = mc.theWorld.getWorldType().getWindManager();
+        WindProvider theWind = mc.theWorld.getWorldType().getWindManager();
 
         float windDirection = theWind.getWindDirection(mc.theWorld, 0.0f, 500.0f, 0.0f) * 360f;
         float windIntensity = theWind.getWindIntensity(mc.theWorld, 0.0f, 500.0f, 0.0f);
@@ -37,7 +37,7 @@ public class TileEntityRendererFlag extends TileEntityRenderer<TileEntityFlag>
         doRender(tileEntity, x, y, z, partialTick, shortPole, windDirection, windIntensity);
     }
 
-    public void doRender(TileEntityFlag tileEntity, double x, double y, double z, float partialTick, boolean shortPole, float windDirection, float windIntensity)
+    public void doRender(FlagBlockEntity tileEntity, double x, double y, double z, float partialTick, boolean shortPole, float windDirection, float windIntensity)
     {
         if (flagRenderer == null)
         {
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java b/src/main/java/net/minecraft/client/render/blockentity/FlowerJarBlockEntityRenderer.java
similarity index 80%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
rename to src/main/java/net/minecraft/client/render/blockentity/FlowerJarBlockEntityRenderer.java
index 46cf8a00b..285508ad3 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/FlowerJarBlockEntityRenderer.java
@@ -1,20 +1,20 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlowerJar;
+import net.minecraft.core.block.entity.FlowerJarBlockEntity;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
 import org.lwjgl.opengl.GL11;
 
-public class TileEntityRendererFlowerJar extends TileEntityRenderer<TileEntityFlowerJar>{
+public class FlowerJarBlockEntityRenderer extends BlockEntityRenderer<FlowerJarBlockEntity> {
     private RenderBlocks renderBlocks;
     @Override
     public void onWorldChanged(World world)
@@ -22,12 +22,12 @@ public class TileEntityRendererFlowerJar extends TileEntityRenderer<TileEntityFl
         renderBlocks = new RenderBlocks(world);
     }
     @Override
-    public void doRender(Tessellator tessellator, TileEntityFlowerJar tileEntity, double x, double y, double z, float renderPartialTicks) {
+    public void doRender(Tessellator tessellator, FlowerJarBlockEntity tileEntity, double x, double y, double z, float renderPartialTicks) {
         GL11.glPushMatrix();
         if(tileEntity.flowerInPot > 0){
             GL11.glTranslatef((float)x, (float)y, (float)z);
             Block block = Block.getBlock(tileEntity.flowerInPot);
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             float scaleValue = 0.75F;
             GL11.glScalef(scaleValue, scaleValue, scaleValue);
             GL11.glTranslatef(0.66F, 0.75F, 0.66F);
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java b/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
similarity index 75%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
rename to src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
index f7c3f4c8a..2ce9fc9c6 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
@@ -1,5 +1,7 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
+import net.minecraft.core.block.entity.GoldMeshBlockEntity;
+import net.minecraft.core.entity.ItemEntity;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.Minecraft;
@@ -8,16 +10,15 @@ import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
-import net.minecraft.core.block.entity.TileEntityMeshGold;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.util.helper.MathHelper;
+import org.lwjgl.opengl.GL12;
 
-public class TileEntityRendererMesh extends TileEntityRenderer<TileEntityMeshGold> {
+public class MeshBlockEntityRenderer extends BlockEntityRenderer<GoldMeshBlockEntity> {
 	
-	public EntityItem renderEntity = new EntityItem(null);
+	public ItemEntity renderEntity = new ItemEntity(null);
 	
     @Override
-    public void doRender(Tessellator tessellator, TileEntityMeshGold tileEntity, double x, double y, double z, float renderPartialTicks) {
+    public void doRender(Tessellator tessellator, GoldMeshBlockEntity tileEntity, double x, double y, double z, float renderPartialTicks) {
         if(tileEntity.filterItem == null) return;
         GL11.glPushMatrix();
 
@@ -34,11 +35,11 @@ public class TileEntityRendererMesh extends TileEntityRenderer<TileEntityMeshGol
         float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
         if (Global.accessor.isFullbrightEnabled()) lightLevel = 1.0f;
         BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GL11.glEnable(GL11.GL_BLEND);
         ItemModelDispatcher.getInstance().getDispatch(tileEntity.filterItem).renderAsItemEntity(Tessellator.instance, renderEntity, tileEntity.worldObj.rand, tileEntity.filterItem, 1, f3, lightLevel, renderPartialTicks);
         GL11.glDisable(GL11.GL_BLEND);
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
         
         renderEntity.world = null;
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMobSpawner.java b/src/main/java/net/minecraft/client/render/blockentity/MobSpawnerBlockEntityRenderer.java
similarity index 77%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMobSpawner.java
rename to src/main/java/net/minecraft/client/render/blockentity/MobSpawnerBlockEntityRenderer.java
index b49ca0664..bea6ec1b3 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMobSpawner.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/MobSpawnerBlockEntityRenderer.java
@@ -1,25 +1,24 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import java.util.HashMap;
 import java.util.Map;
 
 import net.minecraft.client.render.EntityRenderDispatcher;
-import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
 import net.minecraft.core.world.World;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntitySpecialRenderer, TileEntityMobSpawner, Entity, EntityList, 
-//            RenderManager, TileEntity
+//            TileEntitySpecialRenderer, MobSpawnerBlockEntity, Entity, EntityList,
+//            RenderManager, BlockEntity
 
-public class TileEntityRendererMobSpawner extends TileEntityRenderer<TileEntityMobSpawner>
+public class MobSpawnerBlockEntityRenderer extends BlockEntityRenderer<MobSpawnerBlockEntity>
 {
 
-    public TileEntityRendererMobSpawner()
+    public MobSpawnerBlockEntityRenderer()
     {
         entityHashMap = new HashMap<>();
     }
@@ -29,7 +28,7 @@ public class TileEntityRendererMobSpawner extends TileEntityRenderer<TileEntityM
     }
 
     @Override
-	public void doRender(Tessellator tessellator, TileEntityMobSpawner mobSpawner, double x, double y, double z,
+	public void doRender(Tessellator tessellator, MobSpawnerBlockEntity mobSpawner, double x, double y, double z,
                          float partialTick)
     {
         GL11.glPushMatrix();
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererPiston.java b/src/main/java/net/minecraft/client/render/blockentity/PistonBlockEntityRenderer.java
similarity index 59%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererPiston.java
rename to src/main/java/net/minecraft/client/render/blockentity/PistonBlockEntityRenderer.java
index 4eab6bba9..b595aab41 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererPiston.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/PistonBlockEntityRenderer.java
@@ -1,33 +1,34 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.block.model.BlockModelPiston;
-import net.minecraft.client.render.block.model.BlockModelPistonHead;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.block.model.PistonBlockModel;
+import net.minecraft.client.render.block.model.PistonHeadBlockModel;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.piston.BlockPistonBase;
-import net.minecraft.core.block.piston.BlockPistonHead;
-import net.minecraft.core.block.piston.TileEntityPistonMoving;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.piston.BasePistonBlock;
+import net.minecraft.core.block.piston.MovingPistonBlockEntity;
+import net.minecraft.core.block.piston.PistonHeadBlock;
 import net.minecraft.core.world.World;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            TileEntitySpecialRenderer, Block, TileEntityPiston, Tessellator,
-//            RenderHelper, RenderBlocks, BlockPistonBase, BlockPistonExtension, 
-//            World, TileEntity
+//            RenderHelper, RenderBlocks, BasePistonBlock, BlockPistonExtension,
+//            World, BlockEntity
 
-public class TileEntityRendererPiston extends TileEntityRenderer<TileEntityPistonMoving>
+public class PistonBlockEntityRenderer extends BlockEntityRenderer<MovingPistonBlockEntity>
 {
-    private static final BlockModelPistonHead blockModelPistonHead = (BlockModelPistonHead) BlockModelDispatcher.getInstance().getDispatch(Block.pistonHead);
+    private static final PistonHeadBlockModel blockModelPistonHead = (PistonHeadBlockModel) BlockModelDispatcher.getInstance().getDispatch(Blocks.PISTON_HEAD);
     private RenderBlocks renderBlocks;
     private final Minecraft mc;
 
-    public TileEntityRendererPiston()
+    public PistonBlockEntityRenderer()
     {
         mc = Minecraft.getMinecraft(this);
     }
@@ -39,39 +40,39 @@ public class TileEntityRendererPiston extends TileEntityRenderer<TileEntityPisto
     }
 
     @Override
-	public void doRender(Tessellator tessellator, TileEntityPistonMoving tileEntity, double x, double y, double z,
+	public void doRender(Tessellator tessellator, MovingPistonBlockEntity tileEntity, double x, double y, double z,
                          float partialTick)
     {
         Block block = Block.blocksList[tileEntity.getMovedId()];
         if(block != null && tileEntity.getProgress(partialTick) < 1.0F)
         {
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             Lighting.disable();
             GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-            GL11.glEnable(3042 /*GL_BLEND*/);
-            GL11.glDisable(2884 /*GL_CULL_FACE*/);
+            GL11.glEnable(GL11.GL_BLEND);
+            GL11.glDisable(GL11.GL_CULL_FACE);
             if(mc.isAmbientOcclusionEnabled())
             {
-                GL11.glShadeModel(7425 /*GL_SMOOTH*/);
+                GL11.glShadeModel(GL11.GL_SMOOTH);
             } else
             {
-                GL11.glShadeModel(7424 /*GL_FLAT*/);
+                GL11.glShadeModel(GL11.GL_FLAT);
             }
             tessellator.startDrawingQuads();
             tessellator.setTranslation(((float)x - (float)tileEntity.x) + tileEntity.getXOff(partialTick), ((float)y - (float)tileEntity.y) + tileEntity.getYOff(partialTick), ((float)z - (float)tileEntity.z) + tileEntity.getZOff(partialTick));
             tessellator.setColorOpaque(1, 1, 1);
-            if(block == Block.pistonHead && tileEntity.getProgress(partialTick) < 0.5F)
+            if(block == Blocks.PISTON_HEAD && tileEntity.getProgress(partialTick) < 0.5F)
             {
                 BlockModel.setRenderBlocks(renderBlocks);
-                blockModelPistonHead.renderPistonHeadNoCulling(tessellator, (BlockPistonHead) block, tileEntity.x, tileEntity.y, tileEntity.z, false);
+                blockModelPistonHead.renderPistonHeadNoCulling(tessellator, (PistonHeadBlock) block, tileEntity.x, tileEntity.y, tileEntity.z, false);
             } else
             if(tileEntity.isSourcePiston() && !tileEntity.isExtending())
             {
-                BlockModelPiston<BlockPistonBase> pistonBase = (BlockModelPiston) BlockModelDispatcher.getInstance().getDispatch(block);
-                ((BlockPistonHead)Block.pistonHead).setFaceTexture(pistonBase.getFaceTexture());
+                PistonBlockModel<BasePistonBlock> pistonBase = (PistonBlockModel) BlockModelDispatcher.getInstance().getDispatch(block);
                 BlockModel.setRenderBlocks(renderBlocks);
-                blockModelPistonHead.renderPistonHeadNoCulling(tessellator, (BlockPistonHead) Block.pistonHead, tileEntity.x, tileEntity.y, tileEntity.z, tileEntity.getProgress(partialTick) < 0.5F);
-                ((BlockPistonHead)Block.pistonHead).resetFace();
+                blockModelPistonHead.setFaceTextureOverride(pistonBase.getFaceTexture());
+                blockModelPistonHead.renderPistonHeadNoCulling(tessellator, (PistonHeadBlock) Blocks.PISTON_HEAD, tileEntity.x, tileEntity.y, tileEntity.z, tileEntity.getProgress(partialTick) < 0.5F);
+                blockModelPistonHead.setFaceTextureOverride(null);
                 tessellator.setTranslation((float)x - (float)tileEntity.x, (float)y - (float)tileEntity.y, (float)z - (float)tileEntity.z);
                 pistonBase.renderNoCulling(tessellator, tileEntity.x, tileEntity.y, tileEntity.z);
             } else
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/src/main/java/net/minecraft/client/render/blockentity/SignBlockEntityRenderer.java
similarity index 58%
rename from src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
rename to src/main/java/net/minecraft/client/render/blockentity/SignBlockEntityRenderer.java
index 8cb5e9ab4..417b93bf0 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/SignBlockEntityRenderer.java
@@ -1,41 +1,46 @@
-package net.minecraft.client.render.tileentity;
+package net.minecraft.client.render.blockentity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
-import net.minecraft.client.render.model.ModelSign;
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.model.SignModel;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.client.util.helper.Colors;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntitySpecialRenderer, SignModel, TileEntitySign, Block, 
-//            ModelRenderer, FontRenderer, TileEntity
+//            TileEntitySpecialRenderer, SignModel, SignBlockEntity, Block,
+//            ModelRenderer, FontRenderer, BlockEntity
 
-public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
+public class SignBlockEntityRenderer extends BlockEntityRenderer<SignBlockEntity>
 {
 
 	private final Minecraft mc = Minecraft.getMinecraft(this);
 	
-    public TileEntityRendererSign()
+    public SignBlockEntityRenderer()
     {
-        signModel = new ModelSign();
+        signModel = new SignModel();
     }
 
-    public void renderTileEntitySignAt(TileEntitySign tileEntity, double d, double d1, double d2,
+    public void renderTileEntitySignAt(SignBlockEntity tileEntity, double d, double d1, double d2,
                                        float f)
     {
         Block block = tileEntity.getBlockType();
         GL11.glPushMatrix();
         float scale = 0.6666667F;
-        if(block == Block.signPostPlanksOak)
+        if(block == Blocks.SIGN_POST_PLANKS_OAK)
         {
             GL11.glTranslatef((float)d + 0.5F, (float)d1 + 0.75F * scale, (float)d2 + 0.5F);
             float f2 = (float)(tileEntity.getMovedData() * 360) / 16F;
             GL11.glRotatef(-f2, 0.0F, 1.0F, 0.0F);
-            signModel.signStick.showModel = true;
+            signModel.signStick.visible = true;
         }
         else
         {
@@ -59,7 +64,7 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
             GL11.glTranslatef((float)d + 0.5F, (float)d1 + 0.75F * scale, (float)d2 + 0.5F);
             GL11.glRotatef(-f3, 0.0F, 1.0F, 0.0F);
             GL11.glTranslatef(0.0F, -0.3125F, -0.4375F);
-            signModel.signStick.showModel = false;
+            signModel.signStick.visible = false;
         }
         loadTexture("/assets/minecraft/textures/entity/sign.png");
         GL11.glPushMatrix();
@@ -76,12 +81,20 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glNormal3f(0.0F, 0.0F, -1F * f4);
         GL11.glDepthMask(false);
         EnumSignPicture picture = tileEntity.getPicture();
-        renderDispatcher.renderEngine.bindTexture(renderDispatcher.renderEngine.getTexture("/assets/minecraft/textures/gui/sign_images.png"));
-        drawTexturedModalRect(-48, -24, picture.getU(), picture.getV(), 48, 24);
+        drawTexturedModalRect(-48, -24, 48, 24, TextureRegistry.getTexture(picture.getTextureKey()));
         GL11.glPopMatrix();
         
         // Render text
         float lightLevel = mc.theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
+        float lightOffset = 0f;
+        if (tileEntity.isGlowing()) {
+            lightLevel = 1f;
+            lightOffset = 96f;
+            GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+            if(LightmapHelper.isLightmapEnabled()) {
+                LightmapHelper.setLightmapCoord(LightmapHelper.getLightmapCoord(15, 15));
+            }
+        }
         
         GL11.glPushMatrix();
         f4 = 0.01666667F * scale;
@@ -90,9 +103,9 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glNormal3f(0.0F, 0.0F, -1F * f4);
         GL11.glDepthMask(false);
         int color = Colors.allSignColors[tileEntity.getColor().id].getARGB();
-        int r = (int)(((color >> 16) & 0xFF) * lightLevel);
-        int g = (int)(((color >>  8) & 0xFF) * lightLevel);
-        int b = (int)(((color >>  0) & 0xFF) * lightLevel);
+        int r = (int)MathHelper.clamp(((color >> 16) & 0xFF) * lightLevel + lightOffset, 0, 255);
+        int g = (int)MathHelper.clamp(((color >>  8) & 0xFF) * lightLevel + lightOffset, 0, 255);
+        int b = (int)MathHelper.clamp(((color >>  0) & 0xFF) * lightLevel + lightOffset, 0, 255);
         color = (r << 16) | (g << 8) | (b << 0);
         for(int line = 0; line < tileEntity.signText.length; line++)
         {
@@ -111,25 +124,24 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
     }
 
     @Override
-	public void doRender(Tessellator tessellator, TileEntitySign tileEntity, double x, double y, double z,
+	public void doRender(Tessellator tessellator, SignBlockEntity tileEntity, double x, double y, double z,
                          float partialTick)
     {
         renderTileEntitySignAt(tileEntity, x, y, z, partialTick);
     }
 
-    private void drawTexturedModalRect(int x, int y, int u, int v, int width, int height)
+    private void drawTexturedModalRect(int x, int y, int width, int height, IconCoordinate coordinate)
     {
-        float uScale = 1 / 768F;
-        float vScale = 1 / 384F;
+        coordinate.parentAtlas.bind();
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
-        tessellator.addVertexWithUV(x + 0, y + height * 2, 0, (float)(u + 0) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width * 2, y + height * 2, 0, (float)(u + width) * uScale, (float)(v + height) * vScale);
-        tessellator.addVertexWithUV(x + width * 2, y + 0, 0, (float)(u + width) * uScale, (float)(v + 0) * vScale);
-        tessellator.addVertexWithUV(x + 0, y + 0, 0, (float)(u + 0) * uScale, (float)(v + 0) * vScale);
+        tessellator.addVertexWithUV(x + 0,          y + height * 2, 0, coordinate.getIconUMin(),coordinate.getIconVMax());
+        tessellator.addVertexWithUV(x + width * 2,  y + height * 2, 0, coordinate.getIconUMax(),coordinate.getIconVMax());
+        tessellator.addVertexWithUV(x + width * 2,  y + 0,          0, coordinate.getIconUMax(),coordinate.getIconVMin());
+        tessellator.addVertexWithUV(x + 0,          y + 0,          0, coordinate.getIconUMin(),coordinate.getIconVMin());
         tessellator.draw();
     }
 
 
-    private final ModelSign signModel;
+    private final SignModel signModel;
 }
diff --git a/src/main/java/net/minecraft/client/render/camera/CameraUtil.java b/src/main/java/net/minecraft/client/render/camera/CameraUtil.java
index 8d9e41766..9c55f6705 100644
--- a/src/main/java/net/minecraft/client/render/camera/CameraUtil.java
+++ b/src/main/java/net/minecraft/client/render/camera/CameraUtil.java
@@ -1,33 +1,33 @@
 package net.minecraft.client.render.camera;
 
-import net.minecraft.core.HitResult;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
+import net.minecraft.core.block.FluidBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
 public abstract class CameraUtil
 {
     public static HitResult traceRay(ICamera camera, World world, double distance, float partialTick)
     {
-        Vec3d pos = camera.getPosition(partialTick);
-        Vec3d rot = camera.getRotationVector(partialTick);
-        Vec3d endPos = pos.addVector(rot.xCoord * distance, rot.yCoord * distance, rot.zCoord * distance);
+        Vec3 pos = camera.getPosition(partialTick);
+        Vec3 rot = camera.getRotationVector(partialTick);
+        Vec3 endPos = pos.add(rot.x * distance, rot.y * distance, rot.z * distance);
         return world.checkBlockCollisionBetweenPoints(pos, endPos);
     }
 
     public static boolean isUnderLiquid(ICamera camera, World world, Material material, float partialTick)
     {
         double cameraY = camera.getY(partialTick);
-        int x = MathHelper.floor_double(camera.getX(partialTick));
-        int y = MathHelper.floor_float(MathHelper.floor_double(cameraY));
-        int z = MathHelper.floor_double(camera.getZ(partialTick));
+        int x = MathHelper.floor(camera.getX(partialTick));
+        int y = MathHelper.floor_float(MathHelper.floor(cameraY));
+        int z = MathHelper.floor(camera.getZ(partialTick));
         int id = world.getBlockId(x, y, z);
         if(id != 0 && Block.blocksList[id].blockMaterial == material)
         {
-            float f = BlockFluid.getWaterVolume(world.getBlockMetadata(x, y, z)) - 0.2F;
+            float f = FluidBlock.getWaterVolume(world.getBlockMetadata(x, y, z)) - 0.2F;
             float f1 = (float)(y + 1) - f;
             return cameraY < (double)f1;
         }
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCamera.java b/src/main/java/net/minecraft/client/render/camera/EntityCamera.java
index fa1ec3719..ca37c06a4 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCamera.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCamera.java
@@ -2,7 +2,7 @@ package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.culling.CameraFrustum;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 
 public abstract class EntityCamera
     implements ICamera
@@ -11,12 +11,12 @@ public abstract class EntityCamera
 
     private final CameraFrustum frustum;
 
-    public final EntityLiving entity;
+    public final Mob mob;
 
-    public EntityCamera(Minecraft mc, EntityLiving entity)
+    public EntityCamera(Minecraft mc, Mob mob)
     {
         this.mc = mc;
-        this.entity = entity;
+        this.mob = mob;
         this.frustum = new CameraFrustum(this);
     }
 
@@ -37,11 +37,11 @@ public abstract class EntityCamera
     {
         if (partialTick == 1f)
         {
-            return entity.x;
+            return mob.x;
         }
         else
         {
-            return entity.xo + (entity.x - entity.xo) * partialTick;
+            return mob.xo + (mob.x - mob.xo) * partialTick;
         }
     }
 
@@ -50,11 +50,11 @@ public abstract class EntityCamera
     {
         if (partialTick == 1f)
         {
-            return entity.y;
+            return mob.y;
         }
         else
         {
-            return (entity.yo + (entity.y - entity.yo) * partialTick);
+            return (mob.yo + (mob.y - mob.yo) * partialTick);
         }
     }
 
@@ -63,11 +63,11 @@ public abstract class EntityCamera
     {
         if (partialTick == 1f)
         {
-            return entity.z;
+            return mob.z;
         }
         else
         {
-            return entity.zo + (entity.z - entity.zo) * partialTick;
+            return mob.zo + (mob.z - mob.zo) * partialTick;
         }
 
     }
@@ -77,11 +77,11 @@ public abstract class EntityCamera
     {
         if (partialTick == 1f)
         {
-            return entity.xRot;
+            return mob.xRot;
         }
         else
         {
-            return entity.xRotO + (entity.xRot - entity.xRotO) * partialTick;
+            return mob.xRotO + (mob.xRot - mob.xRotO) * partialTick;
         }
 
     }
@@ -91,11 +91,11 @@ public abstract class EntityCamera
     {
         if (partialTick == 1f)
         {
-            return entity.yRot;
+            return mob.yRot;
         }
         else
         {
-            return entity.yRotO + (entity.yRot - entity.yRotO) * partialTick;
+            return mob.yRotO + (mob.yRot - mob.yRotO) * partialTick;
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraFirstPerson.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraFirstPerson.java
index 9cdbb50bb..bdd478b5f 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraFirstPerson.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraFirstPerson.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 
 public class EntityCameraFirstPerson
     extends EntityCamera
 {
-    public EntityCameraFirstPerson(Minecraft mc, EntityLiving entity)
+    public EntityCameraFirstPerson(Minecraft mc, Mob entity)
     {
         super(mc, entity);
     }
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraIsometric.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraIsometric.java
index 4a387ffb8..59fb70b86 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraIsometric.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraIsometric.java
@@ -2,12 +2,12 @@ package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiPhotoMode;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 
 public class EntityCameraIsometric
     extends EntityCamera
 {
-    public EntityCameraIsometric(Minecraft mc, EntityLiving entity) {
+    public EntityCameraIsometric(Minecraft mc, Mob entity) {
         super(mc, entity);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
index 594485e7a..bd201d098 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
@@ -1,8 +1,7 @@
 package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.culling.CameraFrustum;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 
 public class EntityCameraSleeping
     extends EntityCamera
@@ -31,7 +30,7 @@ public class EntityCameraSleeping
     private final double xRotS;
     private final double xRotT;
 
-    public EntityCameraSleeping(Minecraft mc, EntityLiving entity, int xb, int yb, int zb, double xs, double ys, double zs, double yRotS, double xRotS)
+    public EntityCameraSleeping(Minecraft mc, Mob entity, int xb, int yb, int zb, double xs, double ys, double zs, double yRotS, double xRotS)
     {
         super(mc, entity);
         int metadata = mc.theWorld.getBlockMetadata(xb, yb, zb) & 3;
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonFront.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonFront.java
index 9b6a1952c..dd9a71cd2 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonFront.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonFront.java
@@ -1,15 +1,12 @@
 package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.entity.Mob;
 
 public class EntityCameraThirdPersonFront
         extends EntityCameraThirdPersonRear
 {
-    public EntityCameraThirdPersonFront(Minecraft mc, EntityLiving entity)
+    public EntityCameraThirdPersonFront(Minecraft mc, Mob entity)
     {
         super(mc, entity);
     }
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
index 22016f636..bb648f71e 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
@@ -1,10 +1,10 @@
 package net.minecraft.client.render.camera;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public class EntityCameraThirdPersonRear
     extends EntityCamera
@@ -12,7 +12,7 @@ public class EntityCameraThirdPersonRear
     protected float lastpartialTick = 0f;
     protected double lastCameraDistance = 0d;
 
-    public EntityCameraThirdPersonRear(Minecraft mc, EntityLiving entity)
+    public EntityCameraThirdPersonRear(Minecraft mc, Mob entity)
     {
         super(mc, entity);
     }
@@ -44,19 +44,19 @@ public class EntityCameraThirdPersonRear
         double dz = (MathHelper.cos((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI));
         double dy = (-MathHelper.sin((xRot / 180F) * MathHelper.PI));
 
-        double cameraDistance = Vec3d.createVector(x, y, z).distanceTo(Vec3d.createVector(x - numSteps * dx, y - numSteps * dy, z - numSteps * dz)) - offset;
+        double cameraDistance = Vec3.getTempVec3(x, y, z).distanceTo(Vec3.getTempVec3(x - numSteps * dx, y - numSteps * dy, z - numSteps * dz)) - offset;
 
         for(int i = 0; i <= numSteps; i++)
         {
             HitResult hitResult = mc.theWorld.checkBlockCollisionBetweenPoints(
-                    Vec3d.createVector(x, y, z),
-                    Vec3d.createVector(x - i * dx, y - i * dy, z - i * dz),
+                    Vec3.getTempVec3(x, y, z),
+                    Vec3.getTempVec3(x - i * dx, y - i * dy, z - i * dz),
                     false,
                     true
             );
             if(hitResult != null)
             {
-                double distance = hitResult.location.distanceTo(Vec3d.createVector(x, y, z)) - offset;
+                double distance = hitResult.location.distanceTo(Vec3.getTempVec3(x, y, z)) - offset;
                 if (distance < 0) distance = 0;
                 cameraDistance = distance;
                 break;
diff --git a/src/main/java/net/minecraft/client/render/camera/ICamera.java b/src/main/java/net/minecraft/client/render/camera/ICamera.java
index 4b90aa004..f401c44f1 100644
--- a/src/main/java/net/minecraft/client/render/camera/ICamera.java
+++ b/src/main/java/net/minecraft/client/render/camera/ICamera.java
@@ -3,7 +3,7 @@ package net.minecraft.client.render.camera;
 import net.minecraft.client.render.culling.CameraFrustum;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public interface ICamera
 {
@@ -34,12 +34,12 @@ public interface ICamera
         return getZ(1f);
     }
 
-    default Vec3d getPosition(float partialTick)
+    default Vec3 getPosition(float partialTick)
     {
-        return Vec3d.createVector(getX(partialTick), getY(partialTick), getZ(partialTick));
+        return Vec3.getTempVec3(getX(partialTick), getY(partialTick), getZ(partialTick));
     }
 
-    default Vec3d getPosition()
+    default Vec3 getPosition()
     {
         return getPosition(1f);
     }
@@ -58,7 +58,7 @@ public interface ICamera
         return getYRot(1f);
     }
 
-    default Vec3d getViewVector(float partialTick)
+    default Vec3 getViewVector(float partialTick)
     {
         float xRot = (float) getXRot(partialTick);
         float yRot = (float) getYRot(partialTick);
@@ -66,10 +66,10 @@ public interface ICamera
         float x = MathHelper.sin(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
         float y = MathHelper.sin(-xRot * (MathHelper.PI / 180f));
         float z = MathHelper.cos(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
-        return Vec3d.createVector(x * xzLen, y, z * xzLen);
+        return Vec3.getTempVec3(x * xzLen, y, z * xzLen);
     }
 
-    default Vec3d getRotationVector(float partialTick)
+    default Vec3 getRotationVector(float partialTick)
     {
         double pitch = getXRot(partialTick);
         double yaw = getYRot(partialTick);
@@ -80,10 +80,10 @@ public interface ICamera
         float x = MathHelper.sin((float) (-yaw * toRads - Math.PI));
         float y = MathHelper.sin((float) (-pitch * toRads));
         float z = MathHelper.cos((float) (-yaw * toRads - Math.PI));
-        return Vec3d.createVector(x * xzLen, y, z * xzLen);
+        return Vec3.getTempVec3(x * xzLen, y, z * xzLen);
     }
 
-    default Vec3d getRotationVector()
+    default Vec3 getRotationVector()
     {
         return getRotationVector(1f);
     }
@@ -117,7 +117,7 @@ public interface ICamera
 
     default double distanceTo(double x, double y, double z, float partialTick)
     {
-        return MathHelper.sqrt_double(distanceToSqr(x, y, z, partialTick));
+        return MathHelper.sqrt(distanceToSqr(x, y, z, partialTick));
     }
 
     default double distanceTo(double x, double y, double z)
diff --git a/src/main/java/net/minecraft/client/render/canvas/CanvasMojangLogo.java b/src/main/java/net/minecraft/client/render/canvas/CanvasMojangLogo.java
index 05aee87a8..f0ffac4a2 100644
--- a/src/main/java/net/minecraft/client/render/canvas/CanvasMojangLogo.java
+++ b/src/main/java/net/minecraft/client/render/canvas/CanvasMojangLogo.java
@@ -17,7 +17,7 @@ public class CanvasMojangLogo extends Canvas
     {
         try
         {
-            logo = ImageIO.read((PanelCrashReport.class).getResource("/assets/minecraft/textures/gui/logo.png"));
+            logo = ImageIO.read((PanelCrashReport.class).getResource("/assets/minecraft/textures/gui/title/mclogo.png"));
         }
         catch(IOException ioexception) { }
         byte byte0 = 100;
diff --git a/src/main/java/net/minecraft/client/render/culling/Frustum.java b/src/main/java/net/minecraft/client/render/culling/Frustum.java
index c22033521..31d990abb 100644
--- a/src/main/java/net/minecraft/client/render/culling/Frustum.java
+++ b/src/main/java/net/minecraft/client/render/culling/Frustum.java
@@ -43,8 +43,8 @@ public class Frustum extends FrustumData
         _proj.clear();
         _modl.clear();
         _clip.clear();
-        GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, _proj);
-        GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, _modl);
+        GL11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, _proj);
+        GL11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, _modl);
         _proj.flip().limit(16);
         _proj.get(projectionMatrix);
         _modl.flip().limit(16);
diff --git a/src/main/java/net/minecraft/client/render/customatlas/Atlas.java b/src/main/java/net/minecraft/client/render/customatlas/Atlas.java
new file mode 100644
index 000000000..3334d6485
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/customatlas/Atlas.java
@@ -0,0 +1,117 @@
+package net.minecraft.client.render.customatlas;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Atlas {
+	
+	public final List<AtlasTile> tileList = new ArrayList<>();
+	
+	public int width;
+	public int height;
+	
+	public Atlas() {
+		
+	}
+	
+	public int size() {
+		return tileList.size();
+	}
+	
+	public void setSizeAuto() {
+		width = 1;
+		height = 1;
+		
+		for(int i=0; i < tileList.size(); i++) {
+			AtlasTile tile = tileList.get(i);
+			
+			width = Math.max(width, tile.x + 1);
+			height = Math.max(height, tile.y + 1);
+		}
+	}
+	
+	@Override
+	public String toString() {
+		return "Atlas[" + tileList.size() + " tiles, " + width + "x" + height + "]";
+	}
+	
+	public static Atlas read(InputStream in) {
+		Atlas atlas = new Atlas();
+		
+		Map<Integer, AtlasTile> map = new HashMap<>();
+		
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new InputStreamReader(in));
+			
+			while(true) {
+				String line = br.readLine();
+				if(line == null) {
+					break;
+				}
+				
+				line = line.trim();
+				if(line.length() == 0 || line.startsWith("#")) {
+					continue;
+				}
+				
+				try {
+					int seperatorIndex = line.indexOf('=');
+					if(seperatorIndex < 0) {
+						throw new RuntimeException("No separator! Expected '='!");
+					}
+					
+					String key = line.substring(0, seperatorIndex);
+					String value = line.substring(seperatorIndex + 1);
+					
+					if(key.equals("size")) {
+						String[] size = value.split("x");
+						if(size.length != 2) {
+							throw new RuntimeException("Invalid size '" + size + "'! Expected <width>x<height>!");
+						}
+						
+						atlas.width = Integer.parseInt(size[0]);
+						atlas.height = Integer.parseInt(size[1]);
+					}else {
+						String[] pos = line.substring(0, seperatorIndex).split(",");
+						if(pos.length != 2) {
+							throw new RuntimeException("Invalid position '" + key + "'! Expected <x>,<y>!");
+						}
+						
+						int x = Integer.parseInt(pos[0]);
+						int y = Integer.parseInt(pos[1]);
+						
+						map.put(AtlasTile.getIndex(x, y), new AtlasTile(value, x, y));
+					}
+				}catch (Exception e) {
+					throw new RuntimeException("Reading line '" + line + "'", e);
+				}
+			}
+		}catch (Exception e) {
+			throw new RuntimeException("Loading atlas tiles", e);
+		}finally {
+			try {
+				br.close();
+			}catch (Exception e) {}
+			try {
+				in.close();
+			}catch (Exception e) {}
+		}
+		
+		atlas.tileList.addAll(map.values());
+		atlas.tileList.sort(AtlasTile.sorter);
+		
+		if(atlas.width <= 0 || atlas.height <= 0) {
+			atlas.setSizeAuto();
+		}
+		
+		
+		return atlas;
+	}
+
+}
diff --git a/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java b/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java
new file mode 100644
index 000000000..a4d76908f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java
@@ -0,0 +1,30 @@
+package net.minecraft.client.render.customatlas;
+
+import java.util.Comparator;
+
+public class AtlasTile {
+	
+	public static final Comparator<AtlasTile> sorter = (o1, o2) -> o1.x == o2.x ? o1.y - o2.y : o1.x - o2.x;
+	
+	public final String name;
+	public final int x;
+	public final int y;
+	
+	public AtlasTile(String name, int x, int y) {
+		if(x < 0 || x > 0xFFFF) {
+			throw new RuntimeException("x out of bounds: " + x);
+		}
+		if(y < 0 || y > 0xFFFF) {
+			throw new RuntimeException("y out of bounds: " + y);
+		}
+		
+		this.name = name;
+		this.x = x;
+		this.y = y;
+	}
+	
+	public static int getIndex(int x, int y) {
+		return (x & 0xFFFF) << 16 | (y & 0xFFFF);
+	}
+	
+}
diff --git a/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java b/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java
new file mode 100644
index 000000000..b1f3c7740
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java
@@ -0,0 +1,216 @@
+package net.minecraft.client.render.customatlas;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texturepack.TexturePack;
+import net.minecraft.client.render.texturepack.TexturePackCustom;
+import net.minecraft.client.render.texturepack.TexturePackList;
+import net.minecraft.client.util.helper.Textures;
+
+public class CustomAtlasHandler {
+
+	private static Atlas legacyTerrainAtlas = null;
+	private static Atlas legacyItemsAtlas = null;
+	
+	public static Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
+	
+	private static Map<String, BufferedImage> textureOverrides = new HashMap<>();
+	
+	private static void loadLegacyTiles() {
+		if(legacyTerrainAtlas != null && legacyItemsAtlas != null) {
+			return;
+		}
+		
+		log("Loading legacy tiles");
+
+		legacyTerrainAtlas = Atlas.read(CustomAtlasHandler.class.getResourceAsStream("/terrain.tiles"));
+		legacyItemsAtlas = Atlas.read(CustomAtlasHandler.class.getResourceAsStream("/items.tiles"));
+		
+		log(legacyTerrainAtlas.size() + " terrain tiles, " + legacyItemsAtlas.size() + " item tiles");
+	}
+	
+	public static void beforeRefreshTextures() {
+		textureOverrides.clear();
+		
+		List<TexturePack> texturePacks = mc.texturePackList.selectedPacks;
+		List<String> overrides = new ArrayList<>();
+		
+		log("Active Texture Packs: ");
+		for(int texturePackIndex=0; texturePackIndex < texturePacks.size(); texturePackIndex++) {
+			TexturePack texturePack = texturePacks.get(texturePackIndex);
+			log("  " + texturePack.manifest.getName());
+
+			if(texturePack.hasFile("/terrain.png")) {
+				log("    has terrain.png");
+				loadLegacyTiles();
+				loadAtlas(texturePack, legacyTerrainAtlas, "/terrain.png", "/assets/minecraft/textures/block/");
+			}
+			
+			if(texturePack.hasFile("/gui/items.png")) {
+				log("    has items.png");
+				loadLegacyTiles();
+				loadAtlas(texturePack, legacyItemsAtlas, "/gui/items.png", "/assets/minecraft/textures/item/");
+			}
+			
+			List<String> namespaces = findEntries(texturePack, "/assets/", (s) -> s.endsWith("/"));
+			if(namespaces != null) {
+				for(int namespaceIndex=0; namespaceIndex < namespaces.size(); namespaceIndex++) {
+					String namespace = namespaces.get(namespaceIndex);
+					
+					log("    namespace: " + namespace);
+					
+					List<String> customBlockAtlases = findEntries(texturePack, namespace + "textures/block/", (s) -> s.endsWith(".tiles"));
+					if(customBlockAtlases != null) {
+						for(int i=0; i < customBlockAtlases.size(); i++) {
+							String customAtlasPath = customBlockAtlases.get(i);
+							log("      found custom atlas: " + customAtlasPath);
+							loadAtlas(texturePack, Atlas.read(texturePack.getResourceAsStream(customAtlasPath)), customAtlasPath.replace(".tiles", ".png"), namespace + "textures/block/");
+						}
+					}
+					
+					List<String> customItemAtlases = findEntries(texturePack, namespace + "textures/item/", (s) -> s.endsWith(".tiles"));
+					if(customItemAtlases != null) {
+						for(int i=0; i < customItemAtlases.size(); i++) {
+							String customAtlasPath = customItemAtlases.get(i);
+							log("      found custom atlas: " + customAtlasPath);
+							loadAtlas(texturePack, Atlas.read(texturePack.getResourceAsStream(customAtlasPath)), customAtlasPath.replace(".tiles", ".png"), namespace + "textures/item/");
+						}
+					}
+
+				}
+			}
+			
+			overrides.clear();
+			overrides.addAll(textureOverrides.keySet());
+			for(int i=0; i < overrides.size(); i++) {
+				String override = overrides.get(i);
+				if(texturePack.hasFile(override)) {
+					textureOverrides.remove(override);
+				}
+			}
+		}
+	}
+	
+	public static void loadAtlas(TexturePack texturePack, Atlas atlas, String atlasTexturePath, String pathPrefix) {
+		if(atlas.width <= 0 || atlas.height <= 0) {
+			throw new IllegalArgumentException("Invalid atlas size: " + atlas.width + "x" + atlas.height);
+		}
+		
+		BufferedImage image = Textures.readImage(texturePack.getResourceAsStream(atlasTexturePath));
+		if(image == null) {
+			throw new RuntimeException("Atlas image does not exist: " + atlasTexturePath);
+		}
+		
+		int tileWidth = image.getWidth() / atlas.width;
+		int tileHeight = image.getHeight() / atlas.height;
+		
+		List<AtlasTile> atlasTiles = atlas.tileList;
+		for(int tileIndex = 0; tileIndex < atlasTiles.size(); tileIndex++) {
+			AtlasTile atlasTile = atlasTiles.get(tileIndex);
+			
+			BufferedImage tileImage = image.getSubimage(tileWidth * atlasTile.x, tileHeight * atlasTile.y, tileWidth, tileHeight);
+			
+			String path = pathPrefix + atlasTile.name + ".png";
+			textureOverrides.put(path, tileImage);
+		}
+	}
+	
+	public static List<String> findEntries(TexturePack texturePack, String path, Filter filter) {
+		if(!path.startsWith("/")) {
+			throw new IllegalArgumentException(path);
+		}
+		
+		if(texturePack instanceof TexturePackCustom) {
+			TexturePackCustom texturePackCustom = (TexturePackCustom) texturePack;
+			
+			if(texturePackCustom.file.isDirectory()) {
+				List<String> result = new ArrayList<>();
+				
+				File searchDirectory = new File(texturePackCustom.file, path.substring(1));
+				File[] files = searchDirectory.listFiles();
+				if(files == null) {
+					return null;
+				}
+				
+				for(int i=0; i < files.length; i++) {
+					File file = files[i];
+					String relativePath = files[i].getAbsolutePath().substring(texturePackCustom.file.getAbsolutePath().length());
+					relativePath = relativePath.replace('\\', '/');
+					if(file.isDirectory()) {
+						relativePath = relativePath + "/";
+					}
+					if(filter == null || filter.accept(relativePath)) {
+						result.add(relativePath);
+					}
+				}
+				return result;
+			}
+			if(texturePackCustom.file.isFile()) {
+				path = path.substring(1);
+				
+				List<String> result = new ArrayList<>();
+				
+				ZipFile zipFile = null;
+				try {
+					zipFile = new ZipFile(texturePackCustom.file);
+					
+					Enumeration<? extends ZipEntry> entries = zipFile.entries();
+					while(entries.hasMoreElements()) {
+						String entry = entries.nextElement().toString();
+						if(!entry.startsWith(path)) {
+							continue;
+						}
+						
+						entry = entry.substring(path.length());
+						if(entry.length() == 0) {
+							continue;
+						}
+						
+						// Only find entries in the given directory, no subdirectories
+						if(entry.indexOf('/') != entry.lastIndexOf('/')) {
+							continue;
+						}
+						
+						entry = "/" + path + entry;
+						if(filter == null || filter.accept(entry)) {
+							result.add(entry);
+						}
+					}
+				}catch (Exception e) {
+					throw new RuntimeException(e);
+				}finally {
+					try {
+						zipFile.close();
+					}catch (Exception e) {}
+				}
+				return result;
+			}
+		}
+		
+		return null;
+	}
+	
+	public static BufferedImage getTextureOverride(TexturePackList texturePackList, String path) {
+		return textureOverrides.get(path);
+	}
+	
+	public static void log(String str) {
+		System.out.println(str);
+	}
+	
+	static interface Filter {
+		
+		public boolean accept(String string);
+		
+	}
+	
+}
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexture.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexture.java
index ed38f663a..05e8758cf 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexture.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexture.java
@@ -1,25 +1,30 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import org.jetbrains.annotations.NotNull;
 
 public abstract class DynamicTexture {
 
 	public Minecraft mc = Minecraft.getMinecraft(this);
-	public IconCoordinate texture;
+	@NotNull
+	public final IconCoordinate targetTexture;
 	public byte[] imageData;
-	
+
+	public DynamicTexture(@NotNull IconCoordinate targetTexture) {
+		this.targetTexture = targetTexture;
+	}
+
 	public abstract void postInit();
 	
 	public abstract void update();
 
-	public boolean runUpdates() {
-		return mc.gameSettings.animations.value != 0;
+	public boolean runUpdates(boolean isPaused) {
+		return mc.gameSettings.animations.value != 0 && !isPaused;
 	}
 	
-	public void setTexture(IconCoordinate texture) {
-		this.texture = texture;
-		this.imageData = new byte[texture.width * texture.height * 4];
+	public void initTexture() {
+		this.imageData = new byte[targetTexture.width * targetTexture.height * 4];
 	}
 	
 	public static int pmod(int a, int b) {
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureAbstractClock.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureAbstractClock.java
index c9f4618d1..77be01d24 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureAbstractClock.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureAbstractClock.java
@@ -3,8 +3,7 @@ package net.minecraft.client.render.dynamictexture;
 import java.awt.image.BufferedImage;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.AtlasStitcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.util.helper.Textures;
 
 public abstract class DynamicTextureAbstractClock extends DynamicTextureRotating{
@@ -28,7 +27,7 @@ public abstract class DynamicTextureAbstractClock extends DynamicTextureRotating
 			}
 		}
 	}
-	public boolean runUpdates() {
-		return true;
+	public boolean runUpdates(boolean isPaused) {
+		return !isPaused;
 	}
 }
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
index f31003ef1..415522e9a 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
@@ -1,15 +1,13 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.core.item.Item;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.world.season.SeasonManagerCycle;
 
 public class DynamicTextureCalendar extends DynamicTextureAbstractClock {
 
 	public DynamicTextureCalendar(Minecraft minecraft) {
-		super(minecraft, "/misc/dialseason.png", TextureRegistry.getTexture("minecraft:item/tool_calendar"));
+		super(minecraft, "/assets/minecraft/textures/misc/dialseason.png", TextureRegistry.getTexture("minecraft:item/tool_calendar"));
 	}
 
 	@Override
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
index dd23db0e3..657670f90 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
@@ -1,15 +1,13 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.item.Item;
 
 public class DynamicTextureClock extends DynamicTextureAbstractClock{
 
 	public DynamicTextureClock(Minecraft minecraft) {
-		super(minecraft, "/misc/dial.png", TextureRegistry.getTexture("minecraft:item/tool_clock"));
+		super(minecraft, "/assets/minecraft/textures/misc/dial.png", TextureRegistry.getTexture("minecraft:item/tool_clock"));
 	}
 
 	@Override
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
index 9603c1257..48c85a82f 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
@@ -5,7 +5,7 @@ import static java.lang.Math.*;
 import java.awt.image.BufferedImage;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.core.world.Dimension;
 
@@ -20,36 +20,37 @@ public class DynamicTextureCompass extends DynamicTexture {
 	
 	private double scaleFactor;
 	
-	public DynamicTextureCompass(Minecraft minecraft) {
+	public DynamicTextureCompass(Minecraft minecraft, IconCoordinate iconCoordinate) {
+		super(iconCoordinate);
 		this.mc = minecraft;
 	}
 
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:item/tool_compass"));
+		initTexture();
 		
-		BufferedImage atlas = texture.parentAtlas.atlas;
-		compassImageData = new byte[texture.getArea() * 4];
+		BufferedImage atlas = targetTexture.parentAtlas.atlas;
+		compassImageData = new byte[targetTexture.getArea() * 4];
 
-		for(int x = 0; x < texture.width; x++) {
-			for(int y = 0; y < texture.height; y++) {
-				putPixel(compassImageData, y * texture.width + x, atlas.getRGB(texture.iconX + x, texture.iconY + y));
+		for(int x = 0; x < targetTexture.width; x++) {
+			for(int y = 0; y < targetTexture.height; y++) {
+				putPixel(compassImageData, y * targetTexture.width + x, atlas.getRGB(targetTexture.iconX + x, targetTexture.iconY + y));
 			}
 		}
 		
-		scaleFactor = texture.width / 16.0;
+		scaleFactor = targetTexture.width / 16.0;
 	}
 	@Override
-	public boolean runUpdates() {
-		return true;
+	public boolean runUpdates(boolean isPaused) {
+		return !isPaused;
 	}
 
 	@Override
 	public void update() {
 
-		for (int _x = 0; _x < texture.width; _x++) {
-			for(int _y = 0; _y < texture.height; _y++) {
-				int i = _y * texture.width + _x;
+		for (int _x = 0; _x < targetTexture.width; _x++) {
+			for(int _y = 0; _y < targetTexture.height; _y++) {
+				int i = _y * targetTexture.width + _x;
 
 				int a = this.compassImageData[i * 4 + 3] & 0xFF;
 				int r = this.compassImageData[i * 4 + 0] & 0xFF;
@@ -107,13 +108,13 @@ public class DynamicTextureCompass extends DynamicTexture {
 		int b;
 		int a;
 
-        double xs = (texture.width / 2.0) + 0.5;
-		double ys = (texture.height / 2.0) - 0.5;
+        double xs = (targetTexture.width / 2.0) + 0.5;
+		double ys = (targetTexture.height / 2.0) - 0.5;
 		
 		for(int i = (int)(-4 * scaleFactor); i <= (int)(4 * scaleFactor); ++i) {
 			x2 = (int)(xs + y * (double)i * 0.3D);
 			y2 = (int)(ys - x * (double)i * 0.3D * 0.5D);
-			j = y2 * texture.width + x2;
+			j = y2 * targetTexture.width + x2;
 			r = 100;
 			g = 100;
 			b = 100;
@@ -128,7 +129,7 @@ public class DynamicTextureCompass extends DynamicTexture {
 		for(int i = (int)(-8 * scaleFactor); i <= (int)(16 * scaleFactor); ++i) {
 			x2 = (int)(xs + x * (double)i * 0.3D);
 			y2 = (int)(ys + y * (double)i * 0.3D * 0.5D);
-			j = y2 * texture.width + x2;
+			j = y2 * targetTexture.width + x2;
 			r = i >= 0 ? 255 : 100;
 			g = i >= 0 ? 20 : 100;
 			b = i >= 0 ? 20 : 100;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCustom.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCustom.java
index 4c9c09f0e..f473eab84 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCustom.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCustom.java
@@ -3,37 +3,35 @@ package net.minecraft.client.render.dynamictexture;
 import java.awt.image.BufferedImage;
 import java.util.Random;
 
-import com.b100.json.element.JsonObject;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.texturepack.TexturePack;
+import net.minecraft.client.render.texture.meta.AnimationProperties;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texturepack.TexturePackException;
-import net.minecraft.client.util.helper.TexturePackJsonHelper;
-import net.minecraft.client.util.helper.Textures;
 
 public class DynamicTextureCustom extends DynamicTexture {
 	
-	private static Random rand = new Random();
-	
-	private int frameCount;
-	private byte[] frameData;
-	
-	private int[] frames;
-	private int frametime = 1;
-	private boolean random = false;
-	private boolean interpolate = false;
-	private boolean tile2x2 = false;
+	private static final Random rand = new Random();
 	
+	private final int frameCount;
+	private final byte[] frameData;
+
+	private final AnimationProperties properties;
+
+	private int currentIndex = 0;
+	private final int indices;
+
 	private int currentFrame = -1;
 	private int previousFrame = -1;
-	private int nextFrameDelay = 0;
+	private int delayUntilNextFrame = 0;
+	private int frameLength = 0;
+
+	private boolean tickWhenPaused = false;
 	
-	public DynamicTextureCustom(Minecraft mc, TexturePack texturePack, String animationSource, String texturePath, boolean shouldBeTiled) {
-		IconCoordinate texture = TextureRegistry.getTexture(texturePath);
-		
-		BufferedImage image = Textures.readImage(texturePack.getResourceAsStream(animationSource));
+	public DynamicTextureCustom(IconCoordinate texture, AnimationProperties animationProperties) {
+		super(texture);
+
+		this.properties = animationProperties;
+
+		BufferedImage image = texture.getImageStorage();
 		try {
 			if(image == null) {
 				throw new TexturePackException("Could not load image!");
@@ -42,91 +40,62 @@ public class DynamicTextureCustom extends DynamicTexture {
 				throw new TexturePackException("Height is smaller than width!");
 			}
 		}catch (TexturePackException e) {
-			throw new TexturePackException("Error in animation " + animationSource, e);
+			throw new TexturePackException("Error in animation " + texture.namespaceId, e);
 		}
 
-		frameCount = image.getHeight() / image.getWidth();
-		
-		String jsonFilePath = animationSource.replace(".png", ".json");
-		if(texturePack.hasFile(jsonFilePath)) {
-			try {
-				JsonObject rootObject = TexturePackJsonHelper.readJsonObject(texturePack, jsonFilePath);
-				
-				if(rootObject.has("frametime")) {
-					this.frametime = TexturePackJsonHelper.getInteger(rootObject, "frametime");
-				}
-				if(rootObject.has("random")) {
-					this.random = TexturePackJsonHelper.getBoolean(rootObject, "random");
-				}
-				if(rootObject.has("interpolate")) {
-					this.interpolate = TexturePackJsonHelper.getBoolean(rootObject, "interpolate");
-				}
-				if(rootObject.has("frames")) {
-					this.frames = TexturePackJsonHelper.getIntArray(rootObject, "frames");
-
-					for(int i=0; i < frames.length; i++) {
-						if(frames[i] >= frameCount) {
-							throw new TexturePackException("Invalid frame number: " + frames[i]);
-						}
-					}
-				}
-				if(rootObject.has("tile2x2")) {
-					this.tile2x2 = TexturePackJsonHelper.getBoolean(rootObject, "tile2x2");
+		int width = image.getWidth();
+		int height = image.getHeight();
+
+		int tileWidth = width;
+		int tileHeight = (animationProperties.height * width) / animationProperties.width ;
+
+		texture.setDimension(tileWidth, tileHeight);
+
+		this.frameCount = height / tileHeight;
+
+		if (animationProperties.frames != null) {
+			indices = animationProperties.frames.size();
+			for (AnimationProperties.Frame f : animationProperties.frames) {
+				if (f.index >= frameCount) {
+					throw new TexturePackException("Animation in '" + texture.namespaceId + "' illegally attempts to reference index '" + f.index + "' when theres only '" + frameCount + "' possible frames!");
 				}
-			}catch (Exception e) {
-				throw new TexturePackException("Error in " + jsonFilePath, e);
 			}
+		} else {
+			indices = frameCount;
 		}
-		
-		int tileCount = 1;
-		if(tile2x2) {
-			tileCount = 2;
-		}
-		
-		int res = image.getWidth();
-		int tiledRes = res * tileCount;
-		
-		texture.setDimension(tiledRes, tiledRes);
-		texture.parentAtlas.dontSetSize.add(texture);
-		setTexture(texture);
-		
-		frameData = new byte[tiledRes * tiledRes * 4 * frameCount];
+
+
+		frameData = new byte[tileWidth * tileHeight * 4 * frameCount];
 		for(int frame=0; frame < frameCount; frame++) {
-			for(int x=0; x < res; x++) {
-				for(int y=0; y < res; y++) {
-					int c = image.getRGB(x, frame * res + y);
-					for(int tileX = 0; tileX < tileCount; tileX++) {
-						for(int tileY = 0; tileY < tileCount; tileY++) {
-							int x1 = tileX * res + x;
-							int y1 = tileY * res + y;
-							int i = frame * tiledRes * tiledRes + y1 * tiledRes + x1;
-							putPixel(frameData, i, c);
-						}
-					}
+			for(int x=0; x < tileWidth; x++) {
+				for(int y=0; y < tileHeight; y++) {
+					int c = image.getRGB(x, frame * tileHeight + y);
+					int i = frame * tileWidth * tileHeight + y * tileWidth + x;
+					putPixel(frameData, i, c);
 				}
 			}
 		}
+
+		tickWhenPaused = texture.parentAtlas.tickWhenPaused();
 	}
 
 	@Override
 	public void postInit() {
-		
+		initTexture();
 	}
 	
 	@Override
 	public void update() {
-		if(interpolate) {
-			if(nextFrameDelay > 0) {
-				nextFrameDelay--;
+		if(properties.interpolate) {
+			if(delayUntilNextFrame > 0) {
+				delayUntilNextFrame--;
 			}
 			
-			if(nextFrameDelay <= 0) {
-				nextFrameDelay = frametime;
-				previousFrame = currentFrame;
-				currentFrame = getNextFrame();
+			if(delayUntilNextFrame <= 0) {
+				progressFrame();
 			}
 
-			float blendFactor = 1.0f - nextFrameDelay / (float) frametime;
+			float blendFactor = 1.0f - delayUntilNextFrame / (float) frameLength;
 			
 			if(previousFrame == -1) {
 				transferFrame(currentFrame);
@@ -137,51 +106,54 @@ public class DynamicTextureCustom extends DynamicTexture {
 			return;
 		}
 		
-		if(nextFrameDelay > 0) {
-			nextFrameDelay--;
-			if(nextFrameDelay > 0) {
+		if(delayUntilNextFrame > 0) {
+			delayUntilNextFrame--;
+			if(delayUntilNextFrame > 0) {
 				return;
 			}
 		}
 		
-		nextFrameDelay = frametime;
-		previousFrame = currentFrame;
-		currentFrame = getNextFrame();
-		
+		progressFrame();
+
 		if(currentFrame != previousFrame) {
 			transferFrame(currentFrame);
 		}
 	}
+	private void progressFrame() {
+		frameLength = delayUntilNextFrame = getNextFrameDelay();
+		if (properties.random) {
+			currentIndex = rand.nextInt(indices);
+		} else {
+			currentIndex = (currentIndex + 1) % indices;
+		}
+		previousFrame = currentFrame;
+		currentFrame = getNextFrame();
+	}
 	
 	private int getNextFrame() {
-		int max = frameCount;
-		
-		if(frames != null) {
-			max = frames.length;
-		}
-		
-		if(random) {
-			return rand.nextInt(max);
-		}else {
-			return (currentFrame + 1) % max;
-		}
+		return properties.frames == null ? currentIndex : properties.frames.get(currentIndex).index;
+	}
+
+	private int getNextFrameDelay() {
+		if (properties.frames == null) return properties.frametime;
+		return properties.frames.get(currentIndex).time;
 	}
 	
 	private void transferFrame(int frame) {
-		if(frames != null) {
-			frame = frames[frame];
-		}
-		
-		for(int x0 = 0; x0 < texture.width; x0++) {
-			for(int y0 = 0; y0 < texture.height; y0++) {
-				int i = (frame * texture.getArea() + y0 * texture.width + x0) << 2;
-				int j = (y0 * texture.height + x0) << 2;
-				
-				imageData[j + 0] = frameData[i + 0];
-				imageData[j + 1] = frameData[i + 1];
-				imageData[j + 2] = frameData[i + 2];
-				imageData[j + 3] = frameData[i + 3];
+		try {
+			for(int x0 = 0; x0 < targetTexture.width; x0++) {
+				for(int y0 = 0; y0 < targetTexture.height; y0++) {
+					int i = (frame * targetTexture.getArea() + y0 * targetTexture.width + x0) << 2;
+					int j = (y0 * targetTexture.width + x0) << 2;
+
+					imageData[j + 0] = frameData[i + 0];
+					imageData[j + 1] = frameData[i + 1];
+					imageData[j + 2] = frameData[i + 2];
+					imageData[j + 3] = frameData[i + 3];
+				}
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
 		}
 	}
 	
@@ -191,16 +163,11 @@ public class DynamicTextureCustom extends DynamicTexture {
 		}else if(blendFactor >= 1.0f) {
 			transferFrame(frame2);
 		}else {
-			if(frames != null) {
-				frame1 = frames[frame1];
-				frame2 = frames[frame2];
-			}
-			
-			for(int x0 = 0; x0 < texture.width; x0++) {
-				for(int y0 = 0; y0 < texture.height; y0++) {
-					int i = (frame1 * texture.getArea() + y0 * texture.width + x0) << 2;
-					int j = (frame2 * texture.getArea() + y0 * texture.width + x0) << 2;
-					int k = (y0 * texture.width + x0) << 2;
+			for(int x0 = 0; x0 < targetTexture.width; x0++) {
+				for(int y0 = 0; y0 < targetTexture.height; y0++) {
+					int i = (frame1 * targetTexture.getArea() + y0 * targetTexture.width + x0) << 2;
+					int j = (frame2 * targetTexture.getArea() + y0 * targetTexture.width + x0) << 2;
+					int k = (y0 * targetTexture.width + x0) << 2;
 
 					imageData[k + 0] = blend(frameData[i + 0], frameData[j + 0], blendFactor);
 					imageData[k + 1] = blend(frameData[i + 1], frameData[j + 1], blendFactor);
@@ -215,4 +182,8 @@ public class DynamicTextureCustom extends DynamicTexture {
 		int c = (int) ((a & 0xFF) * (1.0f - factor) + (b & 0xFF) * factor);
 		return (byte) c;
 	}
+	@Override
+	public boolean runUpdates(boolean isPaused) {
+		return (!isPaused || tickWhenPaused);
+	}
 }
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFire.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFire.java
index 84c9e5f2a..651969e94 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFire.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFire.java
@@ -1,6 +1,8 @@
 package net.minecraft.client.render.dynamictexture;
 
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import org.jetbrains.annotations.NotNull;
 
 public class DynamicTextureFire extends DynamicTexture{
 	
@@ -9,38 +11,42 @@ public class DynamicTextureFire extends DynamicTexture{
 
 	private int height;
 	private float scaleFactor;
-	
+
+	public DynamicTextureFire(@NotNull IconCoordinate targetTexture) {
+		super(targetTexture);
+	}
+
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/fire"));
-		scaleFactor = texture.height / 16.0f;
+		initTexture();
+		scaleFactor = targetTexture.height / 16.0f;
 		
 		height = (int) (20 * scaleFactor);
-		this.arr1 = new float[texture.width * (height + 4)];
-		this.arr2 = new float[texture.width * (height + 4)];
+		this.arr1 = new float[targetTexture.width * (height + 4)];
+		this.arr2 = new float[targetTexture.width * (height + 4)];
 	}
 
 	@Override
 	public void update() {
-		for(int x = 0; x < texture.width; x++) {
+		for(int x = 0; x < targetTexture.width; x++) {
 			for(int y = 0; y < height; y++) {
 				int var3 = (int) (15 * scaleFactor);
 				
-				float bright = this.arr1[x + (y + 1) % height * texture.width] * (float)var3;
+				float bright = this.arr1[x + (y + 1) % height * targetTexture.width] * (float)var3;
 
 				for(int k = x - 1; k <= x + 1; ++k) {
 					for(int l = y; l <= y + 1; ++l) {
-						if(k >= 0 && l >= 0 && k < texture.width && l < height) {
-							bright += this.arr1[k + l * texture.width];
+						if(k >= 0 && l >= 0 && k < targetTexture.width && l < height) {
+							bright += this.arr1[k + l * targetTexture.width];
 						}
 
 						++var3;
 					}
 				}
 
-				this.arr2[x + y * texture.width] = bright / ((float)var3 * (1.0f + (0.06f / scaleFactor)));
+				this.arr2[x + y * targetTexture.width] = bright / ((float)var3 * (1.0f + (0.06f / scaleFactor)));
 				if(y >= 17 * scaleFactor) {
-					this.arr2[x + y * texture.width] = (float)(Math.random() * Math.random() * Math.random() * 4.0D + Math.random() * 0.1 + 0.2);
+					this.arr2[x + y * targetTexture.width] = (float)(Math.random() * Math.random() * Math.random() * 4.0D + Math.random() * 0.1 + 0.2);
 				}
 			}
 		}
@@ -49,7 +55,7 @@ public class DynamicTextureFire extends DynamicTexture{
 		this.arr2 = this.arr1;
 		this.arr1 = _arr2;
 
-		for(int i = 0; i < texture.width * texture.height; ++i) {
+		for(int i = 0; i < targetTexture.width * targetTexture.height; ++i) {
 			float l = this.arr1[i] * 1.8F;
 			if(l > 1.0F) {
 				l = 1.0F;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFireflyJar.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFireflyJar.java
index c14c68d6b..2244aeaab 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFireflyJar.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureFireflyJar.java
@@ -1,8 +1,6 @@
 package net.minecraft.client.render.dynamictexture;
 
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texturepack.TexturePackException;
 import net.minecraft.client.util.helper.Textures;
 import net.minecraft.core.util.helper.MathHelper;
@@ -13,18 +11,14 @@ public class DynamicTextureFireflyJar extends DynamicTexture {
     private final byte[] originalData;
     private long ticks = 0;
 
-	public DynamicTextureFireflyJar(Minecraft mc, String animationSource, String texturePath) {
-		BufferedImage image = Textures.readImage(mc.texturePackList.getResourceAsStream(animationSource));
+	public DynamicTextureFireflyJar(IconCoordinate texture) {
+        super(texture);
+		BufferedImage image = Textures.readImage(mc.texturePackList.getResourceAsStream(texture.getImageSource()));
 		if(image == null) {
 			throw new TexturePackException("Could not load image!");
 		}
 		this.originalData = new byte[image.getWidth() * image.getHeight() * 4];
 
-		IconCoordinate texture = TextureRegistry.getTexture(texturePath);
-		texture.setDimension(image.getWidth(), image.getHeight());
-		texture.parentAtlas.dontSetSize.add(texture);
-		setTexture(texture);
-		
 		for(int x = 0; x < texture.width; x++) {
 			for(int y = 0; y < texture.height; y++) {
 				putPixel(originalData, y * texture.width + x, image.getRGB(x, y));
@@ -34,7 +28,7 @@ public class DynamicTextureFireflyJar extends DynamicTexture {
 
 	@Override
 	public void postInit() {
-		
+        initTexture();
 	}
 
     private float getInternalBrightness()
@@ -53,16 +47,16 @@ public class DynamicTextureFireflyJar extends DynamicTexture {
         ticks++;
         float br = getInternalBrightness();
 
-        for (int x = 0; x < texture.width; x++){
-            for (int y = 0; y < texture.height; y++)
+        for (int x = 0; x < targetTexture.width; x++){
+            for (int y = 0; y < targetTexture.height; y++)
             {
-                int i = y * texture.width + x;
+                int i = y * targetTexture.width + x;
                 int a = this.originalData[i * 4 + 3] & 0xFF;
                 int r = this.originalData[i * 4 + 0] & 0xFF;
                 int g = this.originalData[i * 4 + 1] & 0xFF;
                 int b = this.originalData[i * 4 + 2] & 0xFF;
 
-                if (x >= texture.width * (6 / 16f) && x < texture.width * (10 / 16f) && y >= texture.height * (6 / 16f) && y < texture.height)
+                if (x >= targetTexture.width * (6 / 16f) && x < targetTexture.width * (10 / 16f) && y >= targetTexture.height * (6 / 16f) && y < targetTexture.height)
                 {
 
                     float rf = r / 255f;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaFlowing.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaFlowing.java
index fd6c73dda..1070dc1d8 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaFlowing.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaFlowing.java
@@ -1,7 +1,9 @@
 package net.minecraft.client.render.dynamictexture;
 
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
 
 public class DynamicTextureLavaFlowing extends DynamicTexture {
 
@@ -11,14 +13,18 @@ public class DynamicTextureLavaFlowing extends DynamicTexture {
 	private float[] arr4;
 	private int ticks = 0;
 
+	public DynamicTextureLavaFlowing(@NotNull IconCoordinate targetTexture) {
+		super(targetTexture);
+	}
+
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/lava_flowing"));
+		initTexture();
 		
-		arr1 = new float[texture.getArea()];
-		arr2 = new float[texture.getArea()];
-		arr3 = new float[texture.getArea()];
-		arr4 = new float[texture.getArea()];
+		arr1 = new float[targetTexture.getArea()];
+		arr2 = new float[targetTexture.getArea()];
+		arr3 = new float[targetTexture.getArea()];
+		arr4 = new float[targetTexture.getArea()];
 	}
 
 	@Override
@@ -32,37 +38,37 @@ public class DynamicTextureLavaFlowing extends DynamicTexture {
 		int _y;
 		int var8;
 		int var9;
-		for (int x = 0; x < texture.width; ++x) {
-			for (y = 0; y < texture.height; ++y) {
+		for (int x = 0; x < targetTexture.width; ++x) {
+			for (y = 0; y < targetTexture.height; ++y) {
 				var3 = 0.0F;
-				int var4 = (int) (MathHelper.sin((float) y * MathHelper.PI * 2.0F / texture.height) * 1.2F);
-				var5 = (int) (MathHelper.sin((float) x * MathHelper.PI * 2.0F / texture.width) * 1.2F);
+				int var4 = (int) (MathHelper.sin((float) y * MathHelper.PI * 2.0F / targetTexture.height) * 1.2F);
+				var5 = (int) (MathHelper.sin((float) x * MathHelper.PI * 2.0F / targetTexture.width) * 1.2F);
 
 				for (_x = x - 1; _x <= x + 1; ++_x) {
 					for (_y = y - 1; _y <= y + 1; ++_y) {
-						var8 = pmod(_x + var4, texture.width);
-						var9 = pmod(_y + var5, texture.height);
-						var3 += this.arr1[var8 + var9 * texture.width];
+						var8 = pmod(_x + var4, targetTexture.width);
+						var9 = pmod(_y + var5, targetTexture.height);
+						var3 += this.arr1[var8 + var9 * targetTexture.width];
 					}
 				}
 
-				this.arr2[x + y * texture.width] = var3 / 10.0F
-						+ (this.arr3[(pmod(x + 0, texture.width))
-						+ (pmod(y + 0, texture.height)) * texture.width]
-						+ this.arr3[(pmod(x + 1, texture.width))
-						+ (pmod(y + 0, texture.height)) * texture.width]
-						+ this.arr3[(pmod(x + 1, texture.width))
-						+ (pmod(y + 1, texture.height)) * texture.width]
-						+ this.arr3[(pmod(x + 0, texture.width))
-						+ (pmod(y + 1, texture.height)) * texture.width]) / 4.0F * 0.8F;
-				this.arr3[x + y * texture.width] += this.arr4[x + y * texture.width] * 0.01F;
-				if (this.arr3[x + y * texture.width] < 0.0F) {
-					this.arr3[x + y * texture.width] = 0.0F;
+				this.arr2[x + y * targetTexture.width] = var3 / 10.0F
+						+ (this.arr3[(pmod(x + 0, targetTexture.width))
+						+ (pmod(y + 0, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(x + 1, targetTexture.width))
+						+ (pmod(y + 0, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(x + 1, targetTexture.width))
+						+ (pmod(y + 1, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(x + 0, targetTexture.width))
+						+ (pmod(y + 1, targetTexture.height)) * targetTexture.width]) / 4.0F * 0.8F;
+				this.arr3[x + y * targetTexture.width] += this.arr4[x + y * targetTexture.width] * 0.01F;
+				if (this.arr3[x + y * targetTexture.width] < 0.0F) {
+					this.arr3[x + y * targetTexture.width] = 0.0F;
 				}
 
-				this.arr4[x + y * texture.width] -= 0.06F;
+				this.arr4[x + y * targetTexture.width] -= 0.06F;
 				if (java.lang.Math.random() < 0.005D) {
-					this.arr4[x + y * texture.width] = 1.5F;
+					this.arr4[x + y * targetTexture.width] = 1.5F;
 				}
 			}
 		}
@@ -71,8 +77,8 @@ public class DynamicTextureLavaFlowing extends DynamicTexture {
 		this.arr2 = this.arr1;
 		this.arr1 = var11;
 
-		for (int i = 0; i < texture.getArea(); ++i) {
-			var3 = this.arr1[pmod(i - this.ticks / 3 * texture.width, texture.getArea())] * 2.0F;
+		for (int i = 0; i < targetTexture.getArea(); ++i) {
+			var3 = this.arr1[pmod(i - this.ticks / 3 * targetTexture.width, targetTexture.getArea())] * 2.0F;
 			if (var3 > 1.0F) {
 				var3 = 1.0F;
 			}
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaStill.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaStill.java
index fd28296fe..04eb555ca 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaStill.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureLavaStill.java
@@ -1,7 +1,9 @@
 package net.minecraft.client.render.dynamictexture;
 
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
 
 public class DynamicTextureLavaStill extends DynamicTexture {
 
@@ -10,14 +12,18 @@ public class DynamicTextureLavaStill extends DynamicTexture {
 	private float[] arr3;
 	private float[] arr4;
 
+	public DynamicTextureLavaStill(@NotNull IconCoordinate targetTexture) {
+		super(targetTexture);
+	}
+
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/lava_still"));
+		initTexture();
 		
-		arr1 = new float[texture.getArea()];
-		arr2 = new float[texture.getArea()];
-		arr3 = new float[texture.getArea()];
-		arr4 = new float[texture.getArea()];
+		arr1 = new float[targetTexture.getArea()];
+		arr2 = new float[targetTexture.getArea()];
+		arr3 = new float[targetTexture.getArea()];
+		arr4 = new float[targetTexture.getArea()];
 	}
 
 	@Override
@@ -27,38 +33,38 @@ public class DynamicTextureLavaStill extends DynamicTexture {
 		int b;
 		int var8;
 		int var9;
-		for (int i = 0; i < texture.width; ++i) {
-			for (int j = 0; j < texture.height; ++j) {
+		for (int i = 0; i < targetTexture.width; ++i) {
+			for (int j = 0; j < targetTexture.height; ++j) {
 				var3 = 0.0F;
-				int x2 = (int) (MathHelper.sin((float) j * MathHelper.PI * 2.0F / texture.width) * 1.2F);
-				int y2 = (int) (MathHelper.sin((float) i * MathHelper.PI * 2.0F / texture.height) * 1.2F);
+				int x2 = (int) (MathHelper.sin((float) j * MathHelper.PI * 2.0F / targetTexture.width) * 1.2F);
+				int y2 = (int) (MathHelper.sin((float) i * MathHelper.PI * 2.0F / targetTexture.height) * 1.2F);
 
 				for (g = i - 1; g <= i + 1; ++g) {
 					for (b = j - 1; b <= j + 1; ++b) {
-						var8 = pmod(g + x2, texture.width);
-						var9 = pmod(b + y2, texture.height);
-						var3 += this.arr1[var8 + var9 * texture.width];
+						var8 = pmod(g + x2, targetTexture.width);
+						var9 = pmod(b + y2, targetTexture.height);
+						var3 += this.arr1[var8 + var9 * targetTexture.width];
 					}
 				}
 
-				this.arr2[i + j * texture.width] = var3 / 10.0F
-						+ (this.arr3[(pmod(i + 0, texture.width))
-						+ (pmod(j + 0, texture.height)) * texture.width]
-						+ this.arr3[(pmod(i + 1, texture.width))
-						+ (pmod(j + 0, texture.height)) * texture.width]
-						+ this.arr3[(pmod(i + 1, texture.width))
-						+ (pmod(j + 1, texture.height)) * texture.width]
-						+ this.arr3[(pmod(i + 0, texture.width))
-						+ (pmod(j + 1, texture.height)) * texture.width]) / 4.0F * 0.8F;
+				this.arr2[i + j * targetTexture.width] = var3 / 10.0F
+						+ (this.arr3[(pmod(i + 0, targetTexture.width))
+						+ (pmod(j + 0, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(i + 1, targetTexture.width))
+						+ (pmod(j + 0, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(i + 1, targetTexture.width))
+						+ (pmod(j + 1, targetTexture.height)) * targetTexture.width]
+						+ this.arr3[(pmod(i + 0, targetTexture.width))
+						+ (pmod(j + 1, targetTexture.height)) * targetTexture.width]) / 4.0F * 0.8F;
 				
-				this.arr3[i + j * texture.width] += this.arr4[i + j * texture.width] * 0.01F;
-				if (this.arr3[i + j * texture.width] < 0.0F) {
-					this.arr3[i + j * texture.width] = 0.0F;
+				this.arr3[i + j * targetTexture.width] += this.arr4[i + j * targetTexture.width] * 0.01F;
+				if (this.arr3[i + j * targetTexture.width] < 0.0F) {
+					this.arr3[i + j * targetTexture.width] = 0.0F;
 				}
 
-				this.arr4[i + j * texture.width] -= 0.06F;
+				this.arr4[i + j * targetTexture.width] -= 0.06F;
 				if (java.lang.Math.random() < 0.005D) {
-					this.arr4[i + j * texture.width] = 1.5F;
+					this.arr4[i + j * targetTexture.width] = 1.5F;
 				}
 			}
 		}
@@ -70,7 +76,7 @@ public class DynamicTextureLavaStill extends DynamicTexture {
 		this.arr2 = this.arr1;
 		this.arr1 = var11;
 
-		for (i = 0; i < texture.getArea(); ++i) {
+		for (i = 0; i < targetTexture.getArea(); ++i) {
 			var3 = this.arr1[i] * 2.0F;
 			if (var3 > 1.0F) {
 				var3 = 1.0F;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexturePortal.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexturePortal.java
index 1fa41e4e5..170bc5cb5 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexturePortal.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTexturePortal.java
@@ -2,7 +2,8 @@ package net.minecraft.client.render.dynamictexture;
 
 import java.util.Random;
 
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.MathHelper;
 
 public class DynamicTexturePortal extends DynamicTexture{
@@ -11,20 +12,21 @@ public class DynamicTexturePortal extends DynamicTexture{
 	private int portalTickCounter = 0;
 	private byte[][] portalTextureData;
 	
-	public DynamicTexturePortal(boolean altTexture) {
-		this.altTexture = altTexture;
+	public DynamicTexturePortal(IconCoordinate texture, boolean altTexture) {
+        super(texture);
+        this.altTexture = altTexture;
 	}
 
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/portal_nether"));
+		initTexture();
 		Random var1 = new Random(100L);
 		
-		portalTextureData = new byte[32][texture.getArea() * 4];
+		portalTextureData = new byte[32][targetTexture.getArea() * 4];
 		
 		for(int i = 0; i < 32; ++i) {
-			for(int x = 0; x < texture.width; ++x) {
-				for(int y = 0; y < texture.height; ++y) {
+			for(int x = 0; x < targetTexture.width; ++x) {
+				for(int y = 0; y < targetTexture.height; ++y) {
 					float f = 0.0F;
 
 					int b;
@@ -35,11 +37,11 @@ public class DynamicTexturePortal extends DynamicTexture{
 							swirlX = 0;
 							swirlY = 0;
 						}else {
-							swirlX = (float)(b * (texture.width / 2));
-							swirlY = (float)(b * (texture.height / 2));
+							swirlX = (float)(b * (targetTexture.width / 2));
+							swirlY = (float)(b * (targetTexture.height / 2));
 						}
-						float var9 = ((float)x - swirlX) / texture.width * 2.0F;
-						float var10 = ((float)y - swirlY) / texture.height * 2.0F;
+						float var9 = ((float)x - swirlX) / targetTexture.width * 2.0F;
+						float var10 = ((float)y - swirlY) / targetTexture.height * 2.0F;
 						if(var9 < -1.0F) {
 							var9 += 2.0F;
 						}
@@ -68,7 +70,7 @@ public class DynamicTexturePortal extends DynamicTexture{
 					int r = (int)(f * f * 200.0F + 55.0F);
 					int g = (int)(f * f * f * f * 255.0F);
 					int a = (int)(f * 100.0F + 155.0F);
-					int l = y * texture.width + x;
+					int l = y * targetTexture.width + x;
 					
 					this.portalTextureData[i][l * 4 + 0] = (byte)r;
 					this.portalTextureData[i][l * 4 + 1] = (byte)g;
@@ -85,7 +87,7 @@ public class DynamicTexturePortal extends DynamicTexture{
 		
 		byte[] var1 = this.portalTextureData[this.portalTickCounter & 31];
 
-		for(int i = 0; i < texture.getArea(); ++i) {
+		for(int i = 0; i < targetTexture.getArea(); ++i) {
 			int r = var1[i * 4 + 0] & 255;
 			int g = var1[i * 4 + 1] & 255;
 			int b = var1[i * 4 + 2] & 255;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureRotating.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureRotating.java
index ca3dd61b4..fff2e2380 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureRotating.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureRotating.java
@@ -5,7 +5,7 @@ import static net.minecraft.core.util.helper.MathHelper.*;
 import java.awt.image.BufferedImage;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.util.helper.MathHelper;
 
 public abstract class DynamicTextureRotating extends DynamicTexture {
@@ -21,19 +21,19 @@ public abstract class DynamicTextureRotating extends DynamicTexture {
 	protected double delta;
 
 	public DynamicTextureRotating(Minecraft minecraft, IconCoordinate texture) {
+		super(texture);
 		this.mc = minecraft;
-		this.texture = texture;
 	}
 	
 	@Override
 	public void postInit() {
-		setTexture(texture);
+		initTexture();
 
-		BufferedImage atlas = texture.parentAtlas.atlas;
-		clockImageData = new byte[texture.getArea() * 4];
-		for (int x = 0; x < texture.width; x++) {
-			for (int y = 0; y < texture.height; y++) {
-				putPixel(clockImageData, y * texture.width + x, atlas.getRGB(texture.iconX + x, texture.iconY + y));
+		BufferedImage atlas = targetTexture.parentAtlas.atlas;
+		clockImageData = new byte[targetTexture.getArea() * 4];
+		for (int x = 0; x < targetTexture.width; x++) {
+			for (int y = 0; y < targetTexture.height; y++) {
+				putPixel(clockImageData, y * targetTexture.width + x, atlas.getRGB(targetTexture.iconX + x, targetTexture.iconY + y));
 			}
 		}
 	}
@@ -67,9 +67,9 @@ public abstract class DynamicTextureRotating extends DynamicTexture {
 		double x = Math.sin(this.angleFinal);
 		double y = Math.cos(this.angleFinal);
 
-		for (int _x = 0; _x < texture.width; _x++) {
-			for (int _y = 0; _y < texture.height; _y++) {
-				int i = _y * texture.width + _x;
+		for (int _x = 0; _x < targetTexture.width; _x++) {
+			for (int _y = 0; _y < targetTexture.height; _y++) {
+				int i = _y * targetTexture.width + _x;
 				int a = this.clockImageData[i * 4 + 3] & 0xFF;
 				int r = this.clockImageData[i * 4 + 0] & 0xFF;
 				int g = this.clockImageData[i * 4 + 1] & 0xFF;
@@ -80,8 +80,8 @@ public abstract class DynamicTextureRotating extends DynamicTexture {
 				if (r == b && g == 0 && b > 0) {
 					double pixelBrightness = r / 256.0;
 
-					double x2 = -((double) (_x) / (texture.width-1) - 0.5D);
-					double y2 =   (double) (_y) / (texture.height-1) - 0.5D;
+					double x2 = -((double) (_x) / (targetTexture.width-1) - 0.5D);
+					double y2 =   (double) (_y) / (targetTexture.height-1) - 0.5D;
 
 					int x3 = (int) ((x2 * y + y2 * x + 0.5D) * dialTexRes);
 					int y3 = (int) ((y2 * y - x2 * x + 0.5D) * dialTexRes);
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureTrommel.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureTrommel.java
index be379116b..a4caede0c 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureTrommel.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureTrommel.java
@@ -3,8 +3,8 @@ package net.minecraft.client.render.dynamictexture;
 import java.awt.image.BufferedImage;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 
 public class DynamicTextureTrommel extends DynamicTextureRotating {
 	
@@ -21,9 +21,9 @@ public class DynamicTextureTrommel extends DynamicTextureRotating {
 	
 	@Override
 	public void postInit() {
-		setTexture(texture);
+		initTexture();
 		
-		BufferedImage atlasImage = texture.parentAtlas.atlas;
+		BufferedImage atlasImage = targetTexture.parentAtlas.atlas;
 		
 		IconCoordinate foreground = TextureRegistry.getTexture("minecraft:block/trommel_active_front_foreground");
 		dialImageData = new byte[foreground.getArea() * 4];
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
index 6f60365cd..55d1922e9 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
@@ -1,7 +1,9 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import org.jetbrains.annotations.NotNull;
 
 public class DynamicTextureWaterFlow extends DynamicTexture {
 	
@@ -13,14 +15,18 @@ public class DynamicTextureWaterFlow extends DynamicTexture {
 	private float[] arr4;
 	private int ticks = 0;
 
+	public DynamicTextureWaterFlow(@NotNull IconCoordinate targetTexture) {
+		super(targetTexture);
+	}
+
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/water_flowing"));
+		initTexture();
 		
-		arr1 = new float[texture.getArea()];
-		arr2 = new float[texture.getArea()];
-		arr3 = new float[texture.getArea()];
-		arr4 = new float[texture.getArea()];
+		arr1 = new float[targetTexture.getArea()];
+		arr2 = new float[targetTexture.getArea()];
+		arr3 = new float[targetTexture.getArea()];
+		arr4 = new float[targetTexture.getArea()];
 	}
 
 	@Override
@@ -28,30 +34,30 @@ public class DynamicTextureWaterFlow extends DynamicTexture {
 		this.ticks++;
 
 		float bright;
-		for (int x = 0; x < texture.width; ++x) {
-			for (int y = 0; y < texture.height; ++y) {
+		for (int x = 0; x < targetTexture.width; ++x) {
+			for (int y = 0; y < targetTexture.height; ++y) {
 				bright = 0.0F;
 
 				for (int k = y - 2; k <= y; ++k) {
-					int r = pmod(x, texture.width);
-					int g = pmod(k, texture.height);
-					bright += this.arr1[r + g * texture.width];
+					int r = pmod(x, targetTexture.width);
+					int g = pmod(k, targetTexture.height);
+					bright += this.arr1[r + g * targetTexture.width];
 				}
 
-				this.arr2[x + y * texture.width] = bright / 3.2F + this.arr3[x + y * texture.width] * 0.8F;
+				this.arr2[x + y * targetTexture.width] = bright / 3.2F + this.arr3[x + y * targetTexture.width] * 0.8F;
 			}
 		}
 
-		for (int x = 0; x < texture.width; ++x) {
-			for (int y = 0; y < texture.height; ++y) {
-				this.arr3[x + y * texture.width] += this.arr4[x + y * texture.width] * 0.05F;
-				if (this.arr3[x + y * texture.width] < 0.0F) {
-					this.arr3[x + y * texture.width] = 0.0F;
+		for (int x = 0; x < targetTexture.width; ++x) {
+			for (int y = 0; y < targetTexture.height; ++y) {
+				this.arr3[x + y * targetTexture.width] += this.arr4[x + y * targetTexture.width] * 0.05F;
+				if (this.arr3[x + y * targetTexture.width] < 0.0F) {
+					this.arr3[x + y * targetTexture.width] = 0.0F;
 				}
 
-				this.arr4[x + y * texture.width] -= 0.3F;
+				this.arr4[x + y * targetTexture.width] -= 0.3F;
 				if (Math.random() < 0.2D) {
-					this.arr4[x + y * texture.width] = 0.5F;
+					this.arr4[x + y * targetTexture.width] = 0.5F;
 				}
 			}
 		}
@@ -60,8 +66,8 @@ public class DynamicTextureWaterFlow extends DynamicTexture {
 		this.arr2 = this.arr1;
 		this.arr1 = var12;
 
-		for (int i = 0; i < texture.getArea(); ++i) {
-			bright = this.arr1[pmod(i - this.ticks * texture.width, texture.getArea())];
+		for (int i = 0; i < targetTexture.getArea(); ++i) {
+			bright = this.arr1[pmod(i - this.ticks * targetTexture.width, targetTexture.getArea())];
 			if (bright > 1.0F) {
 				bright = 1.0F;
 			}
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
index 1cf3862ec..08ea118e0 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
@@ -1,7 +1,8 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 
 public class DynamicTextureWaterStill extends DynamicTexture {
 	
@@ -12,14 +13,18 @@ public class DynamicTextureWaterStill extends DynamicTexture {
 	private float[] arr3;
 	private float[] arr4;
 
+	public DynamicTextureWaterStill(IconCoordinate targetTexture) {
+		super(targetTexture);
+	}
+
 	@Override
 	public void postInit() {
-		setTexture(TextureRegistry.getTexture("minecraft:block/water_still"));
+		initTexture();
 
-		arr1 = new float[texture.getArea()];
-		arr2 = new float[texture.getArea()];
-		arr3 = new float[texture.getArea()];
-		arr4 = new float[texture.getArea()];
+		arr1 = new float[targetTexture.getArea()];
+		arr2 = new float[targetTexture.getArea()];
+		arr3 = new float[targetTexture.getArea()];
+		arr4 = new float[targetTexture.getArea()];
 	}
 
 	@Override
@@ -28,30 +33,30 @@ public class DynamicTextureWaterStill extends DynamicTexture {
 		float bright;
 		int a_;
 		int b_;
-		for (int x = 0; x < texture.width; ++x) {
-			for (y = 0; y < texture.height; ++y) {
+		for (int x = 0; x < targetTexture.width; ++x) {
+			for (y = 0; y < targetTexture.height; ++y) {
 				bright = 0.0F;
 
 				for (int k = x - 1; k <= x + 1; ++k) {
-					a_ = pmod(k, texture.width);
-					b_ = pmod(y, texture.height);
-					bright += this.arr1[a_ + b_ * texture.width];
+					a_ = pmod(k, targetTexture.width);
+					b_ = pmod(y, targetTexture.height);
+					bright += this.arr1[a_ + b_ * targetTexture.width];
 				}
 
-				this.arr2[x + y * texture.width] = bright / 3.3F + this.arr3[x + y * texture.width] * 0.8F;
+				this.arr2[x + y * targetTexture.width] = bright / 3.3F + this.arr3[x + y * targetTexture.width] * 0.8F;
 			}
 		}
 
-		for (int x = 0; x < texture.width; ++x) {
-			for (y = 0; y < texture.height; ++y) {
-				this.arr3[x + y * texture.width] += this.arr4[x + y * texture.width] * 0.05F;
-				if (this.arr3[x + y * texture.width] < 0.0F) {
-					this.arr3[x + y * texture.width] = 0.0F;
+		for (int x = 0; x < targetTexture.width; ++x) {
+			for (y = 0; y < targetTexture.height; ++y) {
+				this.arr3[x + y * targetTexture.width] += this.arr4[x + y * targetTexture.width] * 0.05F;
+				if (this.arr3[x + y * targetTexture.width] < 0.0F) {
+					this.arr3[x + y * targetTexture.width] = 0.0F;
 				}
 
-				this.arr4[x + y * texture.width] -= 0.1F;
+				this.arr4[x + y * targetTexture.width] -= 0.1F;
 				if (Math.random() < 0.05D) {
-					this.arr4[x + y * texture.width] = 0.5F;
+					this.arr4[x + y * targetTexture.width] = 0.5F;
 				}
 			}
 		}
@@ -60,7 +65,7 @@ public class DynamicTextureWaterStill extends DynamicTexture {
 		this.arr2 = this.arr1;
 		this.arr1 = var12;
 
-		for (int i = 0; i < texture.getArea(); ++i) {
+		for (int i = 0; i < targetTexture.getArea(); ++i) {
 			bright = this.arr1[i];
 			if (bright > 1.0F) {
 				bright = 1.0F;
diff --git a/src/main/java/net/minecraft/client/render/entity/ArmoredZombieRenderer.java b/src/main/java/net/minecraft/client/render/entity/ArmoredZombieRenderer.java
index 8f2757d95..dac770d19 100644
--- a/src/main/java/net/minecraft/client/render/entity/ArmoredZombieRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ArmoredZombieRenderer.java
@@ -1,33 +1,33 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelZombie;
-import net.minecraft.core.entity.monster.EntityArmoredZombie;
+import net.minecraft.client.render.model.ZombieModel;
+import net.minecraft.core.entity.monster.ZombieArmoredMob;
 
-public class ArmoredZombieRenderer extends MobRenderer<EntityArmoredZombie>
+public class ArmoredZombieRenderer extends BipedRenderer<ZombieArmoredMob>
 {
 
-    private final ModelZombie modelArmorChestplate;
-    private final ModelZombie modelArmor;
+    private final ZombieModel modelArmorChestplate;
+    private final ZombieModel modelArmor;
 
-    public ArmoredZombieRenderer(ModelZombie model, float shadowSize)
+    public ArmoredZombieRenderer(ZombieModel model, float shadowSize)
     {
         super(model, shadowSize);
         modelBipedMain = model;
-        modelArmorChestplate = new ModelZombie(1.0F);
-        modelArmor = new ModelZombie(0.5F);
+        modelArmorChestplate = new ZombieModel(1.0F);
+        modelArmor = new ZombieModel(0.5F);
     }
 
-    protected boolean setArmorModel(EntityArmoredZombie zombie, int renderPass, float partialTick)
+    protected boolean setArmorModel(ZombieArmoredMob zombie, int renderPass, float partialTick)
     {
-        loadTexture("/assets/minecraft/textures/armor/chain" + "_" + (renderPass != 2 ? 1 : 2) + ".png");
-        ModelZombie model = renderPass != 2 ? modelArmorChestplate : modelArmor;
-        model.bipedHead.showModel = renderPass == 0;
-        model.bipedHeadOverlay.showModel = renderPass == 0;
-        model.bipedBody.showModel = renderPass == 1 || renderPass == 2;
-        model.bipedRightArm.showModel = renderPass == 1;
-        model.bipedLeftArm.showModel = renderPass == 1;
-        model.bipedRightLeg.showModel = renderPass == 2 || renderPass == 3;
-        model.bipedLeftLeg.showModel = renderPass == 2 || renderPass == 3;
+        bindTexture("/assets/minecraft/textures/armor/chain" + "_" + (renderPass != 2 ? 1 : 2) + ".png");
+        ZombieModel model = renderPass != 2 ? modelArmorChestplate : modelArmor;
+        model.head.visible = renderPass == 0;
+        model.hair.visible = renderPass == 0;
+        model.body.visible = renderPass == 1 || renderPass == 2;
+        model.arm0.visible = renderPass == 1;
+        model.arm1.visible = renderPass == 1;
+        model.leg0.visible = renderPass == 2 || renderPass == 3;
+        model.leg1.visible = renderPass == 2 || renderPass == 3;
 
         // Disable armor pieces depending on health
         int[] armorBreakPoints = zombie.getArmorBreakPoints();
@@ -40,12 +40,12 @@ public class ArmoredZombieRenderer extends MobRenderer<EntityArmoredZombie>
             }
         }
 
-        setRenderPassModel(model);
+        setArmorModel(model);
         return true;
     }
 
     @Override
-    protected boolean shouldRenderPass(EntityArmoredZombie zombie, int renderPass, float partialTick)
+    protected boolean prepareArmor(ZombieArmoredMob zombie, int renderPass, float partialTick)
     {
         return setArmorModel(zombie, renderPass, partialTick);
     }
@@ -54,25 +54,25 @@ public class ArmoredZombieRenderer extends MobRenderer<EntityArmoredZombie>
     {
         if (piece == 0)
         {
-            modelArmorChestplate.bipedHead.showModel = false;
-            modelArmorChestplate.bipedHeadOverlay.showModel = false;
+            modelArmorChestplate.head.visible = false;
+            modelArmorChestplate.hair.visible = false;
         }
         else if (piece == 1)
         {
-            modelArmorChestplate.bipedBody.showModel = false;
-            modelArmorChestplate.bipedLeftArm.showModel = false;
-            modelArmorChestplate.bipedRightArm.showModel = false;
+            modelArmorChestplate.body.visible = false;
+            modelArmorChestplate.arm1.visible = false;
+            modelArmorChestplate.arm0.visible = false;
         }
         else if (piece == 2)
         {
-            modelArmor.bipedBody.showModel = false;
-            modelArmor.bipedLeftLeg.showModel = false;
-            modelArmor.bipedRightLeg.showModel = false;
+            modelArmor.body.visible = false;
+            modelArmor.leg1.visible = false;
+            modelArmor.leg0.visible = false;
         }
         else if (piece == 3)
         {
-            modelArmorChestplate.bipedLeftLeg.showModel = false;
-            modelArmorChestplate.bipedRightLeg.showModel = false;
+            modelArmorChestplate.leg1.visible = false;
+            modelArmorChestplate.leg0.visible = false;
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/entity/ArrowRenderer.java b/src/main/java/net/minecraft/client/render/entity/ArrowRenderer.java
index 954d1491d..b85f5fa39 100644
--- a/src/main/java/net/minecraft/client/render/entity/ArrowRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ArrowRenderer.java
@@ -1,36 +1,23 @@
 package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.projectile.EntityArrow;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL12;
 
-public class ArrowRenderer extends EntityRenderer<EntityArrow>
+public class ArrowRenderer extends EntityRenderer<ArrowProjectile>
 {
-    public void renderArrow(EntityArrow arrow, double x, double y, double z,
-                            float yaw, float partialTick)
-    {
-        loadTexture("/assets/minecraft/textures/entity/arrows.png");
+    @Override
+    public void render(Tessellator tessellator, ArrowProjectile arrow, double x, double y, double z,
+                       float yaw, float partialTick) {
+        bindTexture("/assets/minecraft/textures/entity/arrows.png");
         GL11.glPushMatrix();
         GL11.glTranslatef((float)x, (float)y, (float)z);
         GL11.glRotatef((arrow.yRotO + (arrow.yRot - arrow.yRotO) * partialTick) - 90F, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(arrow.xRotO + (arrow.xRot - arrow.xRotO) * partialTick, 0.0F, 0.0F, 1.0F);
-        Tessellator tessellator = Tessellator.instance;
 
-        int arrowType;
-        if (arrow.getArrowType() == 2)
-        {
-        	arrowType = 2;
-        }
-        else if (arrow.getArrowType() == 1)
-        {
-        	arrowType = 1;
-        }
-        else
-        {
-        	arrowType = 0;
-        }
+        int arrowType = arrow.getArrowType();
 
         float bodyMinU = 0F / 32F;
         float bodyMaxU = 16F / 32F;
@@ -87,11 +74,4 @@ public class ArrowRenderer extends EntityRenderer<EntityArrow>
         GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
     }
-
-    @Override
-    public void doRender(Tessellator tessellator, EntityArrow entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        renderArrow(entity, x, y, z, yaw, partialTick);
-    }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/BipedRenderer.java b/src/main/java/net/minecraft/client/render/entity/BipedRenderer.java
new file mode 100644
index 000000000..590cfab6e
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/entity/BipedRenderer.java
@@ -0,0 +1,36 @@
+package net.minecraft.client.render.entity;
+
+import net.minecraft.client.render.item.model.ItemModelDispatcher;
+import net.minecraft.client.render.model.BipedModel;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.item.ItemStack;
+import org.lwjgl.opengl.GL11;
+
+// Referenced classes of package net.minecraft.src:
+//            RenderLiving, Mob, BipedModel, ModelRenderer,
+//            ItemStack, Block, RenderBlocks, Item, 
+//            RenderManager, ItemRenderer
+
+public class BipedRenderer<T extends Mob> extends MobRenderer<T>
+{
+
+    public BipedRenderer(BipedModel model, float shadowSize)
+    {
+        super(model, shadowSize);
+        modelBipedMain = model;
+    }
+
+	@Override
+	protected void renderAdditional(T entity, float f) {
+		ItemStack itemstack = entity.getHeldItem();
+		if(itemstack != null) {
+			GL11.glPushMatrix();
+			modelBipedMain.arm0.translateTo(0.0625F);
+			ItemModelDispatcher.getInstance().getDispatch(itemstack.getItem()).renderItemThirdPerson(Tessellator.instance, renderDispatcher.itemRenderer, entity, itemstack, true);
+			GL11.glPopMatrix();
+		}
+	}
+
+    protected BipedModel modelBipedMain;
+}
diff --git a/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java b/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
index 30c469ce7..ec4bf0bfd 100644
--- a/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
@@ -1,23 +1,23 @@
 package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.TileEntityRenderDispatcher;
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.model.ModelBoat;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.BlockEntityRenderDispatcher;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.client.render.model.BoatModel;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.client.render.tileentity.TileEntityRendererFlag;
-import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.client.render.blockentity.FlagBlockEntityRenderer;
+import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
-import net.minecraft.core.world.wind.WindManager;
+import net.minecraft.core.world.wind.WindProvider;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            Render, ModelBoat, EntityBoat, MathHelper, 
-//            ModelBase, Entity
+//            Render, BoatModel, BoatEntity, MathHelper,
+//            BaseModel, Entity
 
-public class BoatRenderer extends EntityRenderer<EntityBoat>
+public class BoatRenderer extends EntityRenderer<BoatEntity>
 {
 	
 	private final Minecraft mc = Minecraft.getMinecraft(this);
@@ -25,30 +25,31 @@ public class BoatRenderer extends EntityRenderer<EntityBoat>
     public BoatRenderer()
     {
         shadowSize = 0.5F;
-        modelBoat = new ModelBoat();
-        flagRenderer.setRenderDispatcher(TileEntityRenderDispatcher.instance);
+        modelBoat = new BoatModel();
+        flagRenderer.setRenderDispatcher(BlockEntityRenderDispatcher.instance);
     }
 
-    public void func_157_a(EntityBoat entity, double x, double y, double z,
-                           float yaw, float partialTick)
+    @Override
+    public void render(Tessellator tessellator, BoatEntity entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         GL11.glPushMatrix();
         GL11.glTranslatef((float)x, (float)y, (float)z);
         GL11.glRotatef(180F - yaw, 0.0F, 1.0F, 0.0F);
-        float f2 = (float)entity.boatTimeSinceHit - partialTick;
-        float f3 = (float)entity.boatCurrentDamage - partialTick;
-        if(f3 < 0.0F)
+        float hurt = (float)entity.boatTimeSinceHit - partialTick;
+        float dmg = (float)entity.boatCurrentDamage - partialTick;
+        if(dmg < 0.0F)
         {
-            f3 = 0.0F;
+            dmg = 0.0F;
         }
-        if(f2 > 0.0F)
+        if(hurt > 0.0F)
         {
-            GL11.glRotatef(((MathHelper.sin(f2) * f2 * f3) / 10F) * (float)entity.boatRockDirection, 1.0F, 0.0F, 0.0F);
+            GL11.glRotatef(((MathHelper.sin(hurt) * hurt * dmg) / 10F) * (float)entity.boatRockDirection, 1.0F, 0.0F, 0.0F);
         }
         if (entity.tileEntityFlag != null)
         {
             World theWorld = mc.theWorld;
-            WindManager theWind = theWorld.getWorldType().getWindManager();
+            WindProvider theWind = theWorld.getWorldType().getWindManager();
 
             float windAngle = theWind.getWindDirection(theWorld, (float) x, (float) y, (float) z) * 360f + (180 - yaw);
             float boatAngle = 180;
@@ -60,23 +61,16 @@ public class BoatRenderer extends EntityRenderer<EntityBoat>
 
             flagRenderer.doRender(entity.tileEntityFlag, -1.19, 0.187, -0.5, partialTick, false, angle, 1.0f);
         }
-        TextureRegistry.blockAtlas.bindTexture();
+        TextureRegistry.blockAtlas.bind();
         float f4 = 0.75F;
         GL11.glScalef(f4, f4, f4);
         GL11.glScalef(1.0F / f4, 1.0F / f4, 1.0F / f4);
-        loadTexture("/assets/minecraft/textures/entity/boat.png");
+        bindTexture("/assets/minecraft/textures/entity/boat.png");
         GL11.glScalef(-1F, -1F, 1.0F);
         modelBoat.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
         GL11.glPopMatrix();
     }
 
-    @Override
-    public void doRender(Tessellator tessellator, EntityBoat entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        func_157_a(entity, x, y, z, yaw, partialTick);
-    }
-
-    protected ModelBase modelBoat;
-    private TileEntityRendererFlag flagRenderer = new TileEntityRendererFlag();
+    protected BaseModel modelBoat;
+    private FlagBlockEntityRenderer flagRenderer = new FlagBlockEntityRenderer();
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java b/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java
deleted file mode 100644
index 6907c70c0..000000000
--- a/src/main/java/net/minecraft/client/render/entity/BobberRenderer.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package net.minecraft.client.render.entity;
-
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityBobber;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
-import org.lwjgl.opengl.GL11;
-
-// Referenced classes of package net.minecraft.src:
-//            Render, Tessellator, RenderManager, EntityFish,
-//            EntityPlayer, MathHelper, Vec3D, GameSettings, 
-//            Entity
-
-public class BobberRenderer extends EntityRenderer<EntityBobber>
-{
-
-    public BobberRenderer()
-    {
-    }
-
-    public void func_4011_a(EntityBobber entity, double d, double d1, double d2,
-                            float f, float f1)
-    {
-        GL11.glPushMatrix();
-        GL11.glTranslatef((float)d, (float)d1, (float)d2);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glScalef(0.5F, 0.5F, 0.5F);
-        TextureRegistry.particleAtlas.bindTexture();
-        IconCoordinate bobber = TextureRegistry.getTexture("minecraft:particle/bobber");
-        Tessellator tessellator = Tessellator.instance;
-        float f2 = (float) bobber.getIconUMin();
-        float f3 = (float) bobber.getIconUMax();
-        float f4 = (float) bobber.getIconVMin();
-        float f5 = (float) bobber.getIconVMax();
-        float f6 = 1.0F;
-        float f7 = 0.5F;
-        float f8 = 0.5F;
-        GL11.glRotatef(180F - renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
-        GL11.glRotatef(-renderDispatcher.viewLerpPitch, 1.0F, 0.0F, 0.0F);
-        tessellator.startDrawingQuads();
-        tessellator.setNormal(0.0F, 1.0F, 0.0F);
-        tessellator.addVertexWithUV(0.0F - f7, 0.0F - f8, 0.0D, f2, f5);
-        tessellator.addVertexWithUV(f6 - f7, 0.0F - f8, 0.0D, f3, f5);
-        tessellator.addVertexWithUV(f6 - f7, 1.0F - f8, 0.0D, f3, f4);
-        tessellator.addVertexWithUV(0.0F - f7, 1.0F - f8, 0.0D, f2, f4);
-        tessellator.draw();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glPopMatrix();
-        if(entity.player != null)
-        {
-            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.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.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.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.player.prevRenderYawOffset + (entity.player.renderYawOffset - entity.player.prevRenderYawOffset) * f1) * MathHelper.PI) / 180F;
-                double d4 = MathHelper.sin(f10);
-                double d6 = MathHelper.cos(f10);
-                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;
-            double d12 = entity.zo + (entity.z - entity.zo) * (double)f1;
-            double d13 = (float)(d7 - d10);
-            double d14 = (float)(d8 - d11);
-            double d15 = (float)(d9 - d12);
-            GL11.glDisable(GL11.GL_TEXTURE_2D);
-            GL11.glDisable(GL11.GL_LIGHTING);
-            tessellator.startDrawing(3);
-            tessellator.setColorOpaque_I(0);
-            int j = 16;
-            for(int k = 0; k <= j; k++)
-            {
-                float f13 = (float)k / (float)j;
-                tessellator.addVertex(d + d13 * (double)f13, d1 + d14 * (double)(f13 * f13 + f13) * 0.5D + 0.25D, d2 + d15 * (double)f13);
-            }
-
-            tessellator.draw();
-            GL11.glEnable(GL11.GL_LIGHTING);
-            GL11.glEnable(GL11.GL_TEXTURE_2D);
-        }
-    }
-
-    @Override
-    public void doRender(Tessellator tessellator, EntityBobber entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        func_4011_a(entity, x, y, z, yaw, partialTick);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/entity/CannonballRenderer.java b/src/main/java/net/minecraft/client/render/entity/CannonballRenderer.java
index 5a0b70832..1e54c9272 100644
--- a/src/main/java/net/minecraft/client/render/entity/CannonballRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/CannonballRenderer.java
@@ -1,41 +1,41 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.model.ModelCannonball;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.client.render.model.CannonballModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.projectile.EntityCannonball;
+import net.minecraft.core.entity.projectile.CannonballProjectile;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            Render, Tessellator, MathHelper,
 //            Entity
 
-public class CannonballRenderer extends EntityRenderer<EntityCannonball>
+public class CannonballRenderer extends EntityRenderer<CannonballProjectile>
 {
 
     public CannonballRenderer()
     {
-        modelCannonball = new ModelCannonball();
+        modelCannonball = new CannonballModel();
     }
 
-    public void RenderCannonball(EntityCannonball entity, double d, double d1, double d2,
+    public void RenderCannonball(CannonballProjectile entity, double d, double d1, double d2,
                                  float f)
     {
         GL11.glPushMatrix();
         GL11.glTranslatef((float)d, (float)d1, (float)d2);
         GL11.glRotatef(180F - f, 0.0F, 1.0F, 0.0F);
-        loadTexture("/assets/minecraft/textures/entity/cannonball.png");
+        bindTexture("/assets/minecraft/textures/entity/cannonball.png");
         GL11.glScalef(-1F, -1F, 1.0F);
         modelCannonball.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.03125F);
         GL11.glPopMatrix();
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityCannonball entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, CannonballProjectile entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         RenderCannonball(entity, x, y, z, yaw);
     }
 
-    protected ModelBase modelCannonball;
+    protected BaseModel modelCannonball;
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/entity/ChickenRenderer.java b/src/main/java/net/minecraft/client/render/entity/ChickenRenderer.java
index ec72acb65..f55022f8a 100644
--- a/src/main/java/net/minecraft/client/render/entity/ChickenRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ChickenRenderer.java
@@ -2,52 +2,23 @@ package net.minecraft.client.render.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntityChicken, MathHelper, ModelBase, 
-//            EntityLiving, Entity
+//            RenderLiving, ChickenMob, MathHelper, BaseModel,
+//            Mob, Entity
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.animal.EntityChicken;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.core.entity.animal.ChickenMob;
 import net.minecraft.core.util.helper.MathHelper;
 
-public class ChickenRenderer extends LivingRenderer<EntityChicken>
-{
-
-    public ChickenRenderer(ModelBase modelbase, float f)
+public class ChickenRenderer extends MobRenderer<ChickenMob> {
+    public ChickenRenderer(BaseModel modelbase, float f)
     {
         super(modelbase, f);
     }
-
-    private void renderChicken(EntityChicken entity, double d, double d1, double d2,
-                              float f, float f1)
-    {
-        super.render(entity, d, d1, d2, f, f1);
-    }
-
-    protected float getWingRotation(EntityChicken entity, float f)
-    {
-        float f1 = entity.field_756_e + (entity.field_752_b - entity.field_756_e) * f;
-        float f2 = entity.field_757_d + (entity.destPos - entity.field_757_d) * f;
-        return (MathHelper.sin(f1) + 1.0F) * f2;
-    }
-
-    @Override
-    protected float ticksExisted(EntityChicken entity, float partialTick)
-    {
-        return getWingRotation(entity, partialTick);
-    }
-
     @Override
-    public void render(EntityChicken entity, double x, double y, double z,
-                       float yaw, float partialTick)
-    {
-        renderChicken(entity, x, y, z, yaw, partialTick);
+    protected float limbSway(ChickenMob entity, float partialTick) {
+        float flap = entity.oFlap + (entity.flap - entity.oFlap) * partialTick;
+        float flapSpeed = entity.oFlapSpeed + (entity.flapSpeed - entity.oFlapSpeed) * partialTick;
+        return (MathHelper.sin(flap) + 1.0F) * flapSpeed;
     }
 
-    @Override
-    public void doRender(Tessellator tessellator, EntityChicken entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        renderChicken(entity, x, y, z, yaw, partialTick);
-    }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/CowRenderer.java b/src/main/java/net/minecraft/client/render/entity/CowRenderer.java
index 038036d44..1d8075b3a 100644
--- a/src/main/java/net/minecraft/client/render/entity/CowRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/CowRenderer.java
@@ -1,39 +1,13 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.core.entity.animal.CowMob;
 
-// Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntityCow, ModelBase, EntityLiving, 
-//            Entity
-
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.animal.EntityCow;
-
-public class CowRenderer extends LivingRenderer<EntityCow>
+public class CowRenderer extends MobRenderer<CowMob>
 {
-
-    public CowRenderer(ModelBase modelbase, float f)
+    public CowRenderer(BaseModel modelbase, float f)
     {
         super(modelbase, f);
     }
 
-    public void renderCow(EntityCow entitycow, double d, double d1, double d2,
-                          float f, float f1)
-    {
-        super.render(entitycow, d, d1, d2, f, f1);
-    }
-
-    @Override
-    public void render(EntityCow entity, double x, double y, double z,
-                       float yaw, float partialTick)
-    {
-        renderCow(entity, x, y, z, yaw, partialTick);
-    }
-
-    @Override
-    public void doRender(Tessellator tessellator, EntityCow entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        renderCow(entity, x, y, z, yaw, partialTick);
-    }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/CreeperRenderer.java b/src/main/java/net/minecraft/client/render/entity/CreeperRenderer.java
index 01baf081e..c13444668 100644
--- a/src/main/java/net/minecraft/client/render/entity/CreeperRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/CreeperRenderer.java
@@ -1,128 +1,93 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.model.ModelCreeper;
-import net.minecraft.core.entity.monster.EntityCreeper;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.client.render.model.CreeperModel;
+import net.minecraft.core.entity.monster.CreeperMob;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, ModelCreeper, EntityCreeper, MathHelper, 
-//            ModelBase, EntityLiving
+//            RenderLiving, CreeperModel, CreeperMob, MathHelper,
+//            BaseModel, Mob
 
-public class CreeperRenderer extends LivingRenderer<EntityCreeper>
+public class CreeperRenderer extends MobRenderer<CreeperMob>
 {
-
     public CreeperRenderer()
     {
-        super(new ModelCreeper(), 0.5F);
-        field_27008_a = new ModelCreeper(2.0F);
+        super(new CreeperModel(), 0.5F);
+        chargedModel = new CreeperModel(2.0F);
     }
 
-    protected void updateCreeperScale(EntityCreeper entity, float f)
-    {
-        float f1 = entity.setCreeperFlashTime(f);
-        float f2 = 1.0F + MathHelper.sin(f1 * 100F) * f1 * 0.01F;
-        if(f1 < 0.0F)
-        {
-            f1 = 0.0F;
+    @Override
+    protected void setupScale(CreeperMob creeper, float partialTick) {
+        float g = creeper.getSwelling(partialTick);
+        final float wobble = 1.0f + MathHelper.sin(g * 100.0f) * g * 0.01f;
+        if (g < 0.0f) {
+            g = 0.0f;
         }
-        if(f1 > 1.0F)
-        {
-            f1 = 1.0F;
+        if (g > 1.0f) {
+            g = 1.0f;
         }
-        f1 *= f1;
-        f1 *= f1;
-        float f3 = (1.0F + f1 * 0.4F) * f2;
-        float f4 = (1.0F + f1 * 0.1F) / f2;
-        GL11.glScalef(f3, f4, f3);
+        g *= g;
+        g *= g;
+        final float s = (1.0f + g * 0.4f) * wobble;
+        final float hs = (1.0f + g * 0.1f) / wobble;
+        GL11.glScalef(s, hs, s);
     }
 
-    protected int updateCreeperColorMultiplier(EntityCreeper entity, float f, float f1)
-    {
-        float f2 = entity.setCreeperFlashTime(f1);
-        if((int)(f2 * 10F) % 2 == 0)
-        {
+    @Override
+    protected int getOverlayColor(CreeperMob creeper, float brightness, float partialTick) {
+        final float step = creeper.getSwelling(partialTick);
+        if ((int)(step * 10.0f) % 2 == 0) {
             return 0;
         }
-        int i = (int)(f2 * 0.2F * 255F);
-        if(i < 0)
-        {
-            i = 0;
+        int _a = (int)(step * 0.2f * 255.0f);
+        if (_a < 0) {
+            _a = 0;
         }
-        if(i > 255)
-        {
-            i = 255;
+        if (_a > 255) {
+            _a = 255;
         }
-        char c = '\377';
-        char c1 = '\377';
-        char c2 = '\377';
-        return i << 24 | c << 16 | c1 << 8 | c2;
+        final int r = 255;
+        final int g = 255;
+        final int b = 255;
+        return _a << 24 | r << 16 | g << 8 | b;
     }
 
-    protected boolean func_27006_a(EntityCreeper entity, int i, float f)
-    {
+    @Override
+    protected boolean prepareArmor(CreeperMob entity, int layer, float partialTick) {
         if(entity.getPowered())
         {
-            if(i == 1)
+            if(layer == 1)
             {
-                float f1 = (float)entity.tickCount + f;
-                loadTexture("/armor/power.png");
-                GL11.glMatrixMode(5890 /*GL_TEXTURE*/);
+                float f1 = (float)entity.tickCount + partialTick;
+                bindTexture("/armor/power.png");
+                GL11.glMatrixMode(GL11.GL_TEXTURE);
                 GL11.glLoadIdentity();
                 float f2 = f1 * 0.01F;
                 float f3 = f1 * 0.01F;
                 GL11.glTranslatef(f2, f3, 0.0F);
-                setRenderPassModel(field_27008_a);
-                GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
-                GL11.glEnable(3042 /*GL_BLEND*/);
-                float f4 = 0.5F;
-                GL11.glColor4f(f4, f4, f4, 1.0F);
-                GL11.glDisable(2896 /*GL_LIGHTING*/);
+                setArmorModel(chargedModel);
+                GL11.glMatrixMode(GL11.GL_MODELVIEW);
+                GL11.glEnable(GL11.GL_BLEND);
+                float brightness = 0.5F;
+                GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+                GL11.glDisable(GL11.GL_LIGHTING);
                 GL11.glBlendFunc(1, 1);
                 return true;
             }
-            if(i == 2)
+            if(layer == 2)
             {
-                GL11.glMatrixMode(5890 /*GL_TEXTURE*/);
+                GL11.glMatrixMode(GL11.GL_TEXTURE);
                 GL11.glLoadIdentity();
-                GL11.glMatrixMode(5888 /*GL_MODELVIEW0_ARB*/);
-                GL11.glEnable(2896 /*GL_LIGHTING*/);
-                GL11.glDisable(3042 /*GL_BLEND*/);
+                GL11.glMatrixMode(GL11.GL_MODELVIEW);
+                GL11.glEnable(GL11.GL_LIGHTING);
+                GL11.glDisable(GL11.GL_BLEND);
             }
         }
         return false;
     }
 
-    protected boolean func_27007_b(EntityCreeper entity, int i, float f)
-    {
-        return false;
-    }
-
-    @Override
-    protected void preRenderCallback(EntityCreeper entity, float f)
-    {
-
-        updateCreeperScale(entity, f);
-    }
-
-    @Override
-    protected int getColorMultiplier(EntityCreeper entity, float f, float f1)
-    {
-        return updateCreeperColorMultiplier(entity, f, f1);
-    }
-
-    @Override
-    protected boolean shouldRenderPass(EntityCreeper entity, int renderPass, float partialTick)
-    {
-        return func_27006_a(entity, renderPass, partialTick);
-    }
-
-    @Override
-    protected boolean shouldRenderPassB(EntityCreeper entity, int renderPass, float partialTick)
-    {
-        return func_27007_b(entity, renderPass, partialTick);
-    }
 
-    private ModelBase field_27008_a;
+    private BaseModel chargedModel;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/DefaultRenderer.java b/src/main/java/net/minecraft/client/render/entity/DefaultRenderer.java
index a1e3f81f6..0c1c7ef60 100644
--- a/src/main/java/net/minecraft/client/render/entity/DefaultRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/DefaultRenderer.java
@@ -10,8 +10,8 @@ import org.lwjgl.opengl.GL11;
 public class DefaultRenderer extends EntityRenderer<Entity>
 {
     @Override
-    public void doRender(Tessellator tessellator, Entity entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, Entity entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         GL11.glPushMatrix();
         renderOffsetAABB(tessellator, entity.bb, x - entity.xo, y - entity.yo, z - entity.zo);
diff --git a/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java b/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
index 18da082d4..01ee41827 100644
--- a/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
@@ -7,8 +7,8 @@ import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ImageParser;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
@@ -19,6 +19,9 @@ import net.minecraft.core.world.World;
 
 public abstract class EntityRenderer<T extends Entity>
 {
+    protected EntityRenderDispatcher renderDispatcher;
+    protected float shadowSize;
+    protected float shadowOpacity;
 
     public EntityRenderer()
     {
@@ -26,24 +29,27 @@ public abstract class EntityRenderer<T extends Entity>
         shadowOpacity = 1.0F;
     }
 
-    public abstract void doRender(Tessellator tessellator, T entity, double x, double y, double z,
-                                  float yaw, float partialTick);
+    public abstract void render(Tessellator tessellator, T entity, double x, double y, double z,
+                                float yaw, float partialTick);
 
-    public void doRenderPreview(Tessellator tessellator, T entity, double x, double y, double z, float yaw, float partialTick) {
-        doRender(tessellator, entity, x, y, z, yaw, partialTick);
+    public void renderPreview(Tessellator tessellator, T entity, double x, double y, double z, float yaw, float partialTick) {
+        render(tessellator, entity, x, y, z, yaw, partialTick);
     }
 
-    protected void loadTexture(String texturePath)
+    protected void bindTexture(String texturePath)
     {
         RenderEngine renderEngine = renderDispatcher.renderEngine;
-        renderEngine.bindTexture(renderEngine.getTexture(texturePath));
+        renderEngine.bindTexture(renderEngine.loadTexture(texturePath));
+    }
+    public boolean bindDownloadableTexture(String urlTexture, String backupTexture, ImageParser imageParser) {
+        return renderDispatcher.renderEngine.bindDownloadableTexture(urlTexture, backupTexture, imageParser);
     }
     
     private void renderFire(Tessellator tessellator, T entity, double x, double y, double z, float partialTick)
     {
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
+        GL11.glDisable(GL11.GL_LIGHTING);
         IconCoordinate texture = TextureRegistry.getTexture("minecraft:block/fire");
-        texture.parentAtlas.bindTexture();
+        texture.parentAtlas.bind();
         GL11.glPushMatrix();
         GL11.glTranslatef((float)x, (float)y, (float)z);
         float f9 = entity.bbWidth * 1.4F;
@@ -87,7 +93,7 @@ public abstract class EntityRenderer<T extends Entity>
         }
         tessellator.draw();
         GL11.glPopMatrix();
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
+        GL11.glEnable(GL11.GL_LIGHTING);
     }
 
     private void renderShadow(Tessellator tessellator, T entity, double posX, double posY, double posZ,
@@ -96,18 +102,18 @@ public abstract class EntityRenderer<T extends Entity>
         GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
         RenderEngine renderengine = renderDispatcher.renderEngine;
-        renderengine.bindTexture(renderengine.getTexture("%clamp%/misc/shadow.png"));
+        renderengine.bindTexture(renderengine.loadTexture("/assets/minecraft/textures/misc/shadow.png"));
         World world = getWorld();
         GL11.glDepthMask(false);
         double lerpX = entity.xo + (entity.x - entity.xo) * (double)partialTick;
         double lerpY = entity.yo + (entity.y - entity.yo) * (double)partialTick + (double)entity.getShadowHeightOffs();
         double lerpZ = entity.zo + (entity.z - entity.zo) * (double)partialTick;
-        int minX = MathHelper.floor_double(lerpX - (double)shadowSize);
-        int maxX = MathHelper.floor_double(lerpX + (double)shadowSize);
-        int minY = MathHelper.floor_double(lerpY - (double)shadowSize);
-        int maxY = MathHelper.floor_double(lerpY);
-        int minZ = MathHelper.floor_double(lerpZ - (double)shadowSize);
-        int maxZ = MathHelper.floor_double(lerpZ + (double)shadowSize);
+        int minX = MathHelper.floor(lerpX - (double)shadowSize);
+        int maxX = MathHelper.floor(lerpX + (double)shadowSize);
+        int minY = MathHelper.floor(lerpY - (double)shadowSize);
+        int maxY = MathHelper.floor(lerpY);
+        int minZ = MathHelper.floor(lerpZ - (double)shadowSize);
+        int maxZ = MathHelper.floor(lerpZ + (double)shadowSize);
         double dxLerp = posX - lerpX;
         double dyLerp = posY - lerpY;
         double dzLerp = posZ - lerpZ;
@@ -141,16 +147,16 @@ public abstract class EntityRenderer<T extends Entity>
     }
 
     private void renderShadowOnBlock(Tessellator tessellator, T entity, Block block, double d, double d1, double d2,
-                                     int x, int y, int z, float opacity, float size, double d3,
-                                     double d4, double d5)
+                                     int x, int y, int z, float opacity, float size, double xo,
+                                     double yo, double zo)
     {
-        if(!block.renderAsNormalBlock())
+        if(!block.isCubeShaped())
         {
             return;
         }
         double brightness = getWorld().getLightBrightness(x, y, z);
         if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
-        double alpha = ((double)opacity - (d1 - ((double)(y + 1) + d4)) / 2D) * 0.5D * brightness;
+        double alpha = ((double)opacity - (d1 - ((double)(y + 1) + yo)) / 2D) * 0.5D * brightness;
         if(alpha < 0.0D)
         {
             return;
@@ -162,11 +168,11 @@ public abstract class EntityRenderer<T extends Entity>
         tessellator.setColorRGBA_F(1.0F, 1.0F, 1.0F, (float)alpha);
         AABB aabb = block.getCollisionBoundingBoxFromPool(getWorld(), x, y, z);
 
-        double xMin = aabb.minX + d3;
-        double xMax = aabb.maxX + d3;
-        double yMin = aabb.maxY + d4 + 0.015625D - 1;
-        double zMin = aabb.minZ + d5;
-        double zMax = aabb.maxZ + d5;
+        double xMin = aabb.minX + xo;
+        double xMax = aabb.maxX + xo;
+        double yMin = aabb.maxY + yo + 0.015625D - 1;
+        double zMin = aabb.minZ + zo;
+        double zMax = aabb.maxZ + zo;
         float f2 = (float)((d - xMin) / 2D / (double)size + 0.5D);
         float f3 = (float)((d - xMax) / 2D / (double)size + 0.5D);
         float f4 = (float)((d2 - zMin) / 2D / (double)size + 0.5D);
@@ -179,7 +185,7 @@ public abstract class EntityRenderer<T extends Entity>
 
     public static void renderOffsetAABB(Tessellator tessellator, AABB axisalignedbb, double d, double d1, double d2)
     {
-        GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glDisable(GL11.GL_TEXTURE_2D);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         tessellator.startDrawingQuads();
         tessellator.setTranslation(d, d1, d2);
@@ -215,10 +221,10 @@ public abstract class EntityRenderer<T extends Entity>
         tessellator.addVertex(axisalignedbb.maxX, axisalignedbb.minY, axisalignedbb.maxZ);
         tessellator.setTranslation(0.0D, 0.0D, 0.0D);
         tessellator.draw();
-        GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
     }
 
-    public static void renderAABB(AABB axisalignedbb)
+    public static void renderFlatAABB(AABB axisalignedbb)
     {
         Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
@@ -249,7 +255,7 @@ public abstract class EntityRenderer<T extends Entity>
         tessellator.draw();
     }
 
-    public void setRenderDispatcher(EntityRenderDispatcher dispatcher)
+    public void init(EntityRenderDispatcher dispatcher)
     {
         this.renderDispatcher = dispatcher;
     }
@@ -258,8 +264,7 @@ public abstract class EntityRenderer<T extends Entity>
 
     }
 
-    public void doRenderShadowAndFire(Tessellator tessellator, T entity, double x, double y, double z,
-                                      float f, float partialTick)
+    public void postRender(Tessellator tessellator, T entity, double x, double y, double z, float yaw, float partialTick)
     {
         if(renderDispatcher.gameSettings != null && (renderDispatcher.gameSettings.fancyGraphics.value == 1 && shadowSize > 0.0F))
         {
@@ -280,12 +285,4 @@ public abstract class EntityRenderer<T extends Entity>
     {
         return renderDispatcher.getFontRenderer();
     }
-    
-    public boolean loadDownloadableTexture(String url, String localTexture, ImageParser imageParser) {
-    	return renderDispatcher.renderEngine.loadDownloadableTexture(url, localTexture, imageParser);
-    }
-
-    protected EntityRenderDispatcher renderDispatcher;
-    protected float shadowSize;
-    protected float shadowOpacity;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/FallingSandRenderer.java b/src/main/java/net/minecraft/client/render/entity/FallingBlockRenderer.java
similarity index 52%
rename from src/main/java/net/minecraft/client/render/entity/FallingSandRenderer.java
rename to src/main/java/net/minecraft/client/render/entity/FallingBlockRenderer.java
index a52429354..2d33d7b7d 100644
--- a/src/main/java/net/minecraft/client/render/entity/FallingSandRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/FallingBlockRenderer.java
@@ -2,39 +2,37 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityFallingSand;
+import net.minecraft.core.entity.FallingBlockEntity;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            Render, RenderBlocks, Block, EntityFallingSand, 
+//            Render, RenderBlocks, Block, FallingBlockEntity,
 //            MathHelper, Entity
 
-public class FallingSandRenderer extends EntityRenderer<EntityFallingSand>
+public class FallingBlockRenderer extends EntityRenderer<FallingBlockEntity>
 {
 
-    public FallingSandRenderer()
+    public FallingBlockRenderer()
     {
         blockRenderer = new RenderBlocks();
         shadowSize = 0.5F;
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityFallingSand entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
+    public void render(Tessellator tessellator, FallingBlockEntity fallingBlock, double x, double y, double z, float yaw, float partialTick) {
         GL11.glPushMatrix();
         GL11.glTranslatef((float)x, (float)y, (float)z);
-        TextureRegistry.blockAtlas.bindTexture();
-        Block block = Block.blocksList[entity.blockID];
-        World world = entity.getWorld();
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        blockRenderer.renderBlockFallingSand(tessellator, BlockModelDispatcher.getInstance().getDispatch(block), block, world, MathHelper.floor_double(entity.x), MathHelper.floor_double(entity.y), MathHelper.floor_double(entity.z));
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
+        TextureRegistry.blockAtlas.bind();
+        Block block = Block.blocksList[fallingBlock.blockID];
+        World world = fallingBlock.getWorld();
+        GL11.glDisable(GL11.GL_LIGHTING);
+        blockRenderer.renderBlockFallingSand(tessellator, BlockModelDispatcher.getInstance().getDispatch(block), block, world, MathHelper.floor(fallingBlock.x), MathHelper.floor(fallingBlock.y), MathHelper.floor(fallingBlock.z));
+        GL11.glEnable(GL11.GL_LIGHTING);
         GL11.glPopMatrix();
     }
 
diff --git a/src/main/java/net/minecraft/client/render/entity/FireballRenderer.java b/src/main/java/net/minecraft/client/render/entity/FireballRenderer.java
index 8f306a11f..4161af8a7 100644
--- a/src/main/java/net/minecraft/client/render/entity/FireballRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/FireballRenderer.java
@@ -1,35 +1,33 @@
 package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.projectile.EntityFireball;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.projectile.FireballProjectile;
+
+import net.minecraft.core.item.Items;
 import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
 
-// Referenced classes of package net.minecraft.src:
-//            Render, Item, Tessellator, RenderManager,
-//            EntityFireball, Entity
 
-public class FireballRenderer extends EntityRenderer<EntityFireball>
-{
+public class FireballRenderer extends EntityRenderer<FireballProjectile> {
 
     public FireballRenderer()
     {
     }
 
-    public void renderFireball(EntityFireball entity, double d, double d1, double d2,
+    public void renderFireball(FireballProjectile entity, double d, double d1, double d2,
                                float f, float f1)
     {
 
         GL11.glPushMatrix();
         GL11.glTranslatef((float)d, (float)d1, (float)d2);
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         final float scalar = 2.0F;
         GL11.glScalef(scalar, scalar, scalar);
-        IconCoordinate i = ItemModelDispatcher.getInstance().getDispatch(Item.ammoFireball).getIcon(null, Item.ammoFireball.getDefaultStack());
-        i.parentAtlas.bindTexture();
+        IconCoordinate i = ItemModelDispatcher.getInstance().getDispatch(Items.AMMO_FIREBALL).getIcon(null, Items.AMMO_FIREBALL.getDefaultStack());
+        i.parentAtlas.bind();
         Tessellator tessellator = Tessellator.instance;
         float f3 = (float) i.getIconUMin();
         float f4 = (float) i.getIconUMax();
@@ -48,14 +46,14 @@ public class FireballRenderer extends EntityRenderer<EntityFireball>
         tessellator.addVertexWithUV(f7 - f8, 1.0F - f9, 0.0D, f4, f5);
         tessellator.addVertexWithUV(0.0F - f8, 1.0F - f9, 0.0D, f3, f5);
         tessellator.draw();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
+        GL11.glEnable(GL11.GL_LIGHTING);
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityFireball entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, FireballProjectile entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         renderFireball(entity, x, y, z, yaw, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/FireflyRenderer.java b/src/main/java/net/minecraft/client/render/entity/FireflyRenderer.java
index 1e8982f78..36a52ed5e 100644
--- a/src/main/java/net/minecraft/client/render/entity/FireflyRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/FireflyRenderer.java
@@ -2,27 +2,27 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Lighting;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.client.entity.fx.EntityFireflyFX;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.client.entity.particle.FireflyParticle;
 import org.lwjgl.opengl.GL11;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-public class FireflyRenderer extends EntityRenderer<EntityFireflyCluster> {
-	private final List<EntityFireflyFX> fireflies = new ArrayList<>();
+public class FireflyRenderer extends EntityRenderer<FireflyClusterMob> {
+	private final List<FireflyParticle> fireflies = new ArrayList<>();
 	private final Minecraft mc;
 	private final Random rand = new Random(0);
 	private long lastTick;
 
 	public FireflyRenderer() {
 		for (int i = 0; i < 20; i++) {
-			EntityFireflyFX fx = new EntityFireflyFX(null, rand.nextFloat() - 0.5f, rand.nextFloat() - 0.5f, 0, 0, 0, 0, 0);
+			FireflyParticle fx = new FireflyParticle(null, rand.nextFloat() - 0.5f, rand.nextFloat() - 0.5f, 0, 0, 0, 0, 0);
 			fx.noPhysics = true;
-			fx.setParticleAge(rand.nextInt(20));
+			fx.setAge(rand.nextInt(20));
 			fireflies.add(fx);
 		}
 		mc = Minecraft.getMinecraft(this);
@@ -30,13 +30,13 @@ public class FireflyRenderer extends EntityRenderer<EntityFireflyCluster> {
 	}
 
 	@Override
-	public void doRender(Tessellator tessellator, EntityFireflyCluster parent, double x, double y, double z, float yaw, float partialTick) {
+	public void render(Tessellator tessellator, FireflyClusterMob parent, double x, double y, double z, float yaw, float partialTick) {
 		// Fireflies are rendered as particles which are spawned in the entity class
 	}
 
 	@Override
-	public void doRenderPreview(Tessellator tessellator, EntityFireflyCluster entity, double x, double y, double z, float yaw, float partialTick) {
-		super.doRenderPreview(tessellator, entity, x, y, z, yaw, partialTick);
+	public void renderPreview(Tessellator tessellator, FireflyClusterMob entity, double x, double y, double z, float yaw, float partialTick) {
+		super.renderPreview(tessellator, entity, x, y, z, yaw, partialTick);
 
 		long currentTick = System.currentTimeMillis();
 		int storedTicks = (int) ((currentTick - lastTick) / 50.0f);
@@ -46,15 +46,15 @@ public class FireflyRenderer extends EntityRenderer<EntityFireflyCluster> {
 		GL11.glDisable(GL11.GL_CULL_FACE);
 		GL11.glEnable(GL11.GL_TEXTURE_2D);
 		Lighting.disable();
-		TextureRegistry.particleAtlas.bindTexture();
+		TextureRegistry.particleAtlas.bind();
 		for (int i = 0; i < fireflies.size(); i++) {
-			EntityFireflyFX firefly = fireflies.get(i);
+			FireflyParticle firefly = fireflies.get(i);
 			Tessellator t = Tessellator.instance;
 			t.startDrawingQuads();
-			firefly.renderParticleInGUI(t, partialTick);
+			firefly.renderParticleInGui(t, partialTick);
 			t.draw();
 			for (int j = 0; j < storedTicks; j++) {
-				firefly.tickGUI();
+				firefly.tickGui();
 				lastTick = currentTick;
 			}
 			if (firefly.removed) {
@@ -68,9 +68,9 @@ public class FireflyRenderer extends EntityRenderer<EntityFireflyCluster> {
 		if (fireflies.size() < 20) {
 			for (int i = fireflies.size(); i < 20; i++) {
 				if (rand.nextInt(4) == 0) continue;
-				EntityFireflyFX fx = new EntityFireflyFX(null, rand.nextFloat() - 0.5f, rand.nextFloat() - 0.5f, 0, 0, 0, 0, entity.getColor().getId());
+				FireflyParticle fx = new FireflyParticle(null, rand.nextFloat() - 0.5f, rand.nextFloat() - 0.5f, 0, 0, 0, 0, entity.getColor().getId());
 				fx.noPhysics = true;
-				fx.setParticleAge(rand.nextInt(20));
+				fx.setAge(rand.nextInt(20));
 				fireflies.add(fx);
 			}
 		}
diff --git a/src/main/java/net/minecraft/client/render/entity/FishingBobberRenderer.java b/src/main/java/net/minecraft/client/render/entity/FishingBobberRenderer.java
new file mode 100644
index 000000000..08b23d203
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/entity/FishingBobberRenderer.java
@@ -0,0 +1,61 @@
+package net.minecraft.client.render.entity;
+
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.entity.FishingBobberEntity;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import org.lwjgl.opengl.GL11;
+public class FishingBobberRenderer extends SpriteRenderer<FishingBobberEntity>
+{
+
+    public FishingBobberRenderer() {
+        super(TextureRegistry.getTexture("minecraft:particle/bobber"));
+    }
+
+    @Override
+    public void render(Tessellator tessellator, FishingBobberEntity entity, double x, double y, double z, float yaw, float partialTick) {
+        super.render(tessellator, entity, x, y, z, yaw, partialTick);
+        if(entity.owner != null)
+        {
+            float f11 = entity.owner.getSwingProgress(partialTick);
+            float f12 = MathHelper.sin(MathHelper.sqrt_float(f11) * MathHelper.PI);
+            Vec3 vec3 = Vec3.getTempVec3(-0.5D, 0.03D, 0.8D);
+            vec3.rotateAroundX((-(entity.owner.xRotO + (entity.owner.xRot - entity.owner.xRotO) * partialTick) * MathHelper.PI) / 180F);
+            vec3.rotateAroundY((-(entity.owner.yRotO + (entity.owner.yRot - entity.owner.yRotO) * partialTick) * MathHelper.PI) / 180F);
+            vec3.rotateAroundY(f12 * 0.5F);
+            vec3.rotateAroundX(-f12 * 0.7F);
+            double xp = entity.owner.xo + (entity.owner.x - entity.owner.xo) * (double)partialTick + vec3.x;
+            double yp = entity.owner.yo + (entity.owner.y - entity.owner.yo) * (double)partialTick + vec3.y;
+            double zp = entity.owner.zo + (entity.owner.z - entity.owner.zo) * (double)partialTick + vec3.z;
+            if(renderDispatcher.gameSettings.thirdPersonView.value > 0)
+            {
+                float rr = ((entity.owner.yBodyRotO + (entity.owner.yBodyRot - entity.owner.yBodyRotO) * partialTick) * MathHelper.PI) / 180F;
+                double ss = MathHelper.sin(rr);
+                double cc = MathHelper.cos(rr);
+                xp = (entity.owner.xo + (entity.owner.x - entity.owner.xo) * (double)partialTick) - cc * 0.35D - ss * 0.85D;
+                yp = (entity.owner.yo + (entity.owner.y - entity.owner.yo) * (double)partialTick) - 0.45D;
+                zp = ((entity.owner.zo + (entity.owner.z - entity.owner.zo) * (double)partialTick) - ss * 0.35D) + cc * 0.85D;
+            }
+            double xh = entity.xo + (entity.x - entity.xo) * (double)partialTick;
+            double yh = entity.yo + (entity.y - entity.yo) * (double)partialTick + 0.25D;
+            double zh = entity.zo + (entity.z - entity.zo) * (double)partialTick;
+            double xa = (float)(xp - xh);
+            double ya = (float)(yp - yh);
+            double za = (float)(zp - zh);
+            GL11.glDisable(GL11.GL_TEXTURE_2D);
+            GL11.glDisable(GL11.GL_LIGHTING);
+            tessellator.startDrawing(3);
+            tessellator.setColorOpaque_I(0);
+            for(int i = 0, steps = 16; i <= steps; i++)
+            {
+                final float aa = (float)i / (float)steps;
+                tessellator.addVertex(x + xa * (double)aa, y + ya * (double)(aa * aa + aa) * 0.5D + 0.25D, z + za * (double)aa);
+            }
+
+            tessellator.draw();
+            GL11.glEnable(GL11.GL_LIGHTING);
+            GL11.glEnable(GL11.GL_TEXTURE_2D);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/entity/GhastRenderer.java b/src/main/java/net/minecraft/client/render/entity/GhastRenderer.java
index 5eb2356eb..0b90373dc 100644
--- a/src/main/java/net/minecraft/client/render/entity/GhastRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/GhastRenderer.java
@@ -1,46 +1,37 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelGhast;
+import net.minecraft.client.render.model.GhastModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.monster.EntityGhast;
+import net.minecraft.core.entity.monster.GhastMob;
 import org.lwjgl.opengl.GL11;
 
-// Referenced classes of package net.minecraft.src:
-//            RenderLiving, ModelGhast, EntityGhast, EntityLiving
-
-public class GhastRenderer extends LivingRenderer<EntityGhast>
+public class GhastRenderer extends MobRenderer<GhastMob>
 {
 
     public GhastRenderer()
     {
-        super(new ModelGhast(), 0.5F);
-    }
-
-    protected void func_4014_a(EntityGhast entity, float f)
-    {
-        float f1 = ((float) entity.prevAttackCounter + (float)(entity.attackCounter - entity.prevAttackCounter) * f) / 20F;
-        if(f1 < 0.0F)
-        {
-            f1 = 0.0F;
-        }
-        f1 = 1.0F / (f1 * f1 * f1 * f1 * f1 * 2.0F + 1.0F);
-        float f2 = (8F + f1) / 2.0F;
-        float f3 = (8F + 1.0F / f1) / 2.0F;
-        GL11.glScalef(f3, f2, f3);
-        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        super(new GhastModel(), 0.5F);
     }
 
     @Override
-    public void doRenderPreview(Tessellator tessellator, EntityGhast entity, double x, double y, double z, float yaw, float partialTick) {
+    public void renderPreview(Tessellator tessellator, GhastMob ghastMob, double x, double y, double z, float yaw, float partialTick) {
         GL11.glPushMatrix();
         GL11.glScalef(0.25f, 0.25f, 0.25f);
-        super.doRenderPreview(tessellator, entity, x, y, z, yaw, partialTick);
+        super.renderPreview(tessellator, ghastMob, x, y, z, yaw, partialTick);
         GL11.glPopMatrix();
     }
 
     @Override
-    protected void preRenderCallback(EntityGhast entity, float f)
-    {
-        func_4014_a(entity, f);
+    protected void setupScale(GhastMob ghastMob, float partialTick) {
+        float charge = ((float) ghastMob.attackChargeO + (float)(ghastMob.attackCharge - ghastMob.attackChargeO) * partialTick) / 20F;
+        if(charge < 0.0F)
+        {
+            charge = 0.0F;
+        }
+        charge = 1.0F / (charge * charge * charge * charge * charge * 2.0F + 1.0F);
+        float f2 = (8F + charge) / 2.0F;
+        float f3 = (8F + 1.0F / charge) / 2.0F;
+        GL11.glScalef(f3, f2, f3);
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/GiantRenderer.java b/src/main/java/net/minecraft/client/render/entity/GiantRenderer.java
index 93469c8f9..ccc2841cc 100644
--- a/src/main/java/net/minecraft/client/render/entity/GiantRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/GiantRenderer.java
@@ -1,30 +1,30 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.core.entity.monster.EntityGiant;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.core.entity.monster.GiantMob;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntityGiantZombie, ModelBase, EntityLiving
+//            RenderLiving, EntityGiantZombie, BaseModel, Mob
 
-public class GiantRenderer extends LivingRenderer<EntityGiant>
+public class GiantRenderer extends MobRenderer<GiantMob>
 {
 
-    public GiantRenderer(ModelBase modelbase, float f, float f1)
+    public GiantRenderer(BaseModel modelbase, float f, float f1)
     {
         super(modelbase, f * f1);
         scale = f1;
     }
 
-    protected void preRenderScale(EntityGiant entity, float f)
+    protected void preRenderScale(GiantMob entity, float f)
     {
         GL11.glScalef(scale, scale, scale);
     }
 
     @Override
-    protected void preRenderCallback(EntityGiant entity, float f)
+    protected void setupScale(GiantMob entity, float partialTick)
     {
-        preRenderScale(entity, f);
+        preRenderScale(entity, partialTick);
     }
 
     private float scale;
diff --git a/src/main/java/net/minecraft/client/render/entity/HumanRenderer.java b/src/main/java/net/minecraft/client/render/entity/HumanRenderer.java
new file mode 100644
index 000000000..3649fb627
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/entity/HumanRenderer.java
@@ -0,0 +1,59 @@
+package net.minecraft.client.render.entity;
+
+import net.minecraft.client.render.PlayerSkinParser;
+import net.minecraft.client.render.model.BipedModel;
+import net.minecraft.client.render.model.PlayerModel;
+import net.minecraft.client.render.model.PlayerSlimModel;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.entity.monster.HumanMob;
+import org.lwjgl.opengl.GL11;
+
+public class HumanRenderer extends MobRenderer<HumanMob>
+{
+    public HumanRenderer()
+    {
+        super(new PlayerModel(0.0F), 0.5F);
+        modelBipedMain = (BipedModel)mainModel;
+//        modelArmorChestplate = new BipedModel(1.0F);
+//        modelArmor = new BipedModel(0.5F);
+        modelThick = new PlayerModel(0.0f);
+        modelSlim = new PlayerSlimModel(0.0f);
+    }
+    @Override
+    public void render(Tessellator tessellator, HumanMob entity, double x, double y, double z, float yaw, float partialTick) {
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        mainModel = entity.slimModel ? modelSlim : modelThick;
+
+//        ItemStack itemstack = entity.getHeldItem();
+//        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = itemstack != null;
+//        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = entity.isSneaking();
+//        modelArmorChestplate.isRiding = modelArmor.isRiding = modelBipedMain.isRiding = entity.isPassenger();
+        double yRender = y - (double)entity.heightOffset;
+        if(entity.isSneaking())
+        {
+            yRender -= 0.125D;
+        }
+        super.render(tessellator, entity, x, yRender, z, yaw, partialTick);
+//        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = false;
+//        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = false;
+        GL11.glDisable(GL11.GL_BLEND);
+    }
+    @Override
+    protected void setupScale(HumanMob entity, float partialTick)
+    {
+        float scale = 0.9375F;
+        GL11.glScalef(scale, scale, scale);
+    }
+
+    @Override
+    public void loadEntityTexture(HumanMob entity)
+    {
+        bindDownloadableTexture(entity.skinUrl, entity.getEntityTexture(), PlayerSkinParser.instance);
+    }
+    private final BipedModel modelBipedMain;
+    private final PlayerModel modelThick;
+    private final PlayerModel modelSlim;
+//    private final BipedModel modelArmorChestplate;
+//    private final BipedModel modelArmor;
+}
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 fc9f9db3f..9dc7e64e9 100644
--- a/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
@@ -1,10 +1,10 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.Minecraft;
 import java.util.Random;
 
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
-import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.item.block.BlockItem;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.core.block.Block;
@@ -13,19 +13,19 @@ 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.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
+import org.lwjgl.opengl.GL12;
 
 import static org.lwjgl.opengl.GL11.glPushMatrix;
 
 // Referenced classes of package net.minecraft.src:
-//            Render, RenderBlocks, EntityItem, MathHelper,
+//            Render, RenderBlocks, ItemEntity, MathHelper,
 //            ItemStack, Block, Tessellator, Item,
 //            RenderManager, RenderEngine, FontRenderer, Entity
 
-public class ItemEntityRenderer extends EntityRenderer<EntityItem>
+public class ItemEntityRenderer extends EntityRenderer<ItemEntity>
 {
 	public final RenderBlocks renderBlocks;
 	private final Random random;
@@ -40,14 +40,14 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 	}
 
 	public int getItemColorFromMetadata(Item item, int metadata) {
-		if (item instanceof ItemBlock) {
-			Block block = ((ItemBlock)item).getBlock();
+		if (item instanceof BlockItem) {
+			Block block = ((BlockItem)item).getBlock();
 			return BlockColorDispatcher.getInstance().getDispatch(block).getFallbackColor(metadata);
 		}
 		return 0xFFFFFF;
 	}
 
-	public void doRender(Tessellator tessellator, final EntityItem entity, final double x, final double y, final double z, final float yaw, final float partialTick) {
+	public void render(Tessellator tessellator, final ItemEntity entity, final double x, final double y, final double z, final float yaw, final float partialTick) {
 		float brightness = 1.0f;
 		if(!LightmapHelper.isLightmapEnabled()) {
 			brightness = entity.getBrightness(partialTick);
@@ -62,8 +62,8 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 			return;
 		}
 		glPushMatrix();
-		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));
+		final float bobbingOffset = MathHelper.sin((entity.age + partialTick) / 10F + entity.bobOffset) * 0.1F + 0.1F;
+		final float f3 = (float) Math.toDegrees(((entity.age + partialTick) / 20F + entity.bobOffset));
 		byte renderCount = 1;
 		if (entity.item.stackSize > 1) {
 			renderCount = 2;
@@ -75,12 +75,12 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 			renderCount = 4;
 		}
 		GL11.glTranslatef((float) x, (float) y + bobbingOffset, (float) z);
-		GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+		GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 		GL11.glEnable(GL11.GL_BLEND);
 		BlockModel.setRenderBlocks(renderBlocks);
 		ItemModelDispatcher.getInstance().getDispatch(item).renderAsItemEntity(Tessellator.instance, entity, random, itemstack, renderCount, f3, brightness, partialTick);
 		GL11.glDisable(GL11.GL_BLEND);
-		GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+		GL11.glDisable(GL12.GL_RESCALE_NORMAL);
 		GL11.glPopMatrix();
 	}
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/LightningBoltRenderer.java b/src/main/java/net/minecraft/client/render/entity/LightningBoltRenderer.java
index bc92080ec..a90031aa6 100644
--- a/src/main/java/net/minecraft/client/render/entity/LightningBoltRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/LightningBoltRenderer.java
@@ -3,26 +3,26 @@ package net.minecraft.client.render.entity;
 import java.util.Random;
 
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityLightningBolt;
+import net.minecraft.core.entity.LightningEntity;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            Render, Tessellator, EntityLightningBolt, Entity
+//            Render, Tessellator, LightningEntity, Entity
 
-public class LightningBoltRenderer extends EntityRenderer<EntityLightningBolt>
+public class LightningBoltRenderer extends EntityRenderer<LightningEntity>
 {
 
     public LightningBoltRenderer()
     {
     }
 
-    public void func_27002_a(EntityLightningBolt lightningBolt, double d, double d1, double d2,
+    public void func_27002_a(LightningEntity lightningBolt, double d, double d1, double d2,
                              float f, float f1)
     {
         Tessellator tessellator = Tessellator.instance;
-        GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
-        GL11.glDisable(2896 /*GL_LIGHTING*/);
-        GL11.glEnable(3042 /*GL_BLEND*/);
+        GL11.glDisable(GL11.GL_TEXTURE_2D);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(770, 1);
         double ad[] = new double[8];
         double ad1[] = new double[8];
@@ -113,14 +113,14 @@ public class LightningBoltRenderer extends EntityRenderer<EntityLightningBolt>
 
         }
 
-        GL11.glDisable(3042 /*GL_BLEND*/);
-        GL11.glEnable(2896 /*GL_LIGHTING*/);
-        GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
+        GL11.glDisable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_LIGHTING);
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityLightningBolt entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, LightningEntity entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         func_27002_a(entity, x, y, z, yaw, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java b/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java
deleted file mode 100644
index 516c13c48..000000000
--- a/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package net.minecraft.client.render.entity;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.FontRenderer;
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.Global;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.util.helper.MathHelper;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
-
-// Referenced classes of package net.minecraft.src:
-//            Render, ModelBase, EntityLiving, MathHelper, 
-//            RenderManager, Tessellator, FontRenderer, Entity
-
-public class LivingRenderer<T extends EntityLiving> extends EntityRenderer<T>
-{
-    protected ModelBase mainModel;
-    protected ModelBase renderPassModel;
-    protected ModelBase overlayModel;
-    protected String overlayTexture;
-    private final Minecraft mc;
-
-    public LivingRenderer(ModelBase model, float shadowSize)
-    {
-        this.mainModel = model;
-        this.shadowSize = shadowSize;
-        this.mc = Minecraft.getMinecraft(this);
-    }
-
-    public void setRenderPassModel(ModelBase modelbase)
-    {
-        renderPassModel = modelbase;
-    }
-
-    public void setOverlayModel(ModelBase modelbase, String texture)
-    {
-        overlayModel = modelbase;
-        overlayTexture = texture;
-    }
-
-    public void render(T entity, double x, double y, double z,
-                       float yaw, float partialTick)
-    {
-        GL11.glPushMatrix();
-        GL11.glDisable(GL11.GL_CULL_FACE);
-        mainModel.onGround = getSwingProgress(entity, partialTick);
-        if (renderPassModel != null) renderPassModel.onGround = mainModel.onGround;
-        if (overlayModel != null) overlayModel.onGround = mainModel.onGround;
-        mainModel.isRiding = entity.isPassenger();
-        if (renderPassModel != null) renderPassModel.isRiding = mainModel.isRiding;
-        if (overlayModel != null) overlayModel.isRiding = mainModel.isRiding;
-        try
-        {
-            float headYawOffset = entity.prevRenderYawOffset + (entity.renderYawOffset - entity.prevRenderYawOffset) * partialTick;
-            float headYaw = entity.yRotO + (entity.yRot - entity.yRotO) * partialTick;
-            float headPitch = entity.xRotO + (entity.xRot - entity.xRotO) * partialTick;
-            translateModel(entity, x, y, z);
-            float ticksExisted = ticksExisted(entity, partialTick);
-            rotateModel(entity, ticksExisted, headYawOffset, partialTick);
-            float scale = 0.0625F;
-            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-            GL11.glScalef(-1F, -1F, 1.0F);
-            preRenderCallback(entity, partialTick);
-            GL11.glTranslatef(0.0F, -24F * scale - 0.0078125F, 0.0F);
-            float limbYaw = entity.prevLimbYaw + (entity.limbYaw - entity.prevLimbYaw) * partialTick;
-            float limbSwing = entity.limbSwing - entity.limbYaw * (1.0F - partialTick);
-            if(limbYaw > 1.0F)
-            {
-                limbYaw = 1.0F;
-            }
-            loadEntityTexture(entity);
-            GL11.glEnable(GL11.GL_ALPHA_TEST);
-            mainModel.setLivingAnimations(entity, limbSwing, limbYaw, partialTick);
-            mainModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-            if (overlayModel != null)
-            {
-                overlayModel.setLivingAnimations(entity, limbSwing, limbYaw, partialTick);
-                loadTexture(overlayTexture);
-                overlayModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-            }
-            if (renderPassModel != null) renderPassModel.setLivingAnimations(entity, limbSwing, limbYaw, partialTick);
-            for(int renderPass = 0; renderPass < 4; renderPass++)
-            {
-                if(shouldRenderPass(entity, renderPass, partialTick))
-                {
-                    renderPassModel.setLivingAnimations(entity, limbSwing, limbYaw, partialTick);
-                    renderPassModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                    GL11.glDisable(GL11.GL_BLEND);
-                    GL11.glEnable(GL11.GL_ALPHA_TEST);
-                }
-            }
-
-            renderEquippedItems(entity, partialTick);
-            float f9 = entity.getBrightness(partialTick);
-            if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) f9 = 1.0f;
-            int j = getColorMultiplier(entity, f9, partialTick);
-            if((j >> 24 & 0xff) > 0 || entity.hurtTime > 0 || entity.deathTime > 0)
-            {
-                GL11.glDisable(GL11.GL_TEXTURE_2D);
-                GL11.glDisable(GL11.GL_ALPHA_TEST);
-                GL11.glEnable(GL11.GL_BLEND);
-                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-                GL11.glDepthFunc(514);
-                if(entity.hurtTime > 0 || entity.deathTime > 0)
-                {
-                    GL11.glColor4f(f9, 0.0F, 0.0F, 0.4F);
-                    mainModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                    if (overlayModel != null) overlayModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                    for(int k = 0; k < 4; k++)
-                    {
-                        if(shouldRenderPassB(entity, k, partialTick))
-                        {
-                            GL11.glColor4f(f9, 0.0F, 0.0F, 0.4F);
-                            renderPassModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                        }
-                    }
-
-                }
-                if((j >> 24 & 0xff) > 0)
-                {
-                    float f10 = (float)(j >> 16 & 0xff) / 255F;
-                    float f11 = (float)(j >> 8 & 0xff) / 255F;
-                    float f12 = (float)(j & 0xff) / 255F;
-                    float f13 = (float)(j >> 24 & 0xff) / 255F;
-                    GL11.glColor4f(f10, f11, f12, f13);
-                    mainModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                    if (overlayModel != null) overlayModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                    for(int l = 0; l < 4; l++)
-                    {
-                        if(shouldRenderPassB(entity, l, partialTick))
-                        {
-                            GL11.glColor4f(f10, f11, f12, f13);
-                            renderPassModel.render(limbSwing, limbYaw, ticksExisted, headYaw - headYawOffset, headPitch, scale);
-                        }
-                    }
-
-                }
-                GL11.glDepthFunc(GL11.GL_LEQUAL);
-                GL11.glDisable(GL11.GL_BLEND);
-                GL11.glEnable(GL11.GL_ALPHA_TEST);
-                GL11.glEnable(GL11.GL_TEXTURE_2D);
-            }
-            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
-        }
-        catch(Exception exception)
-        {
-            exception.printStackTrace();
-        }
-        GL11.glEnable(GL11.GL_CULL_FACE);
-        GL11.glPopMatrix();
-        passSpecialRender(entity, x, y, z);
-    }
-
-    protected void translateModel(T entity, double x, double y, double z)
-    {
-        GL11.glTranslatef((float)x, (float)y, (float)z);
-    }
-
-    protected void rotateModel(T entity, float ticksExisted, float headYawOffset, float partialTick)
-    {
-        GL11.glRotatef(180F - headYawOffset, 0.0F, 1.0F, 0.0F);
-        if(entity.deathTime > 0)
-        {
-            float f3 = ((((float)entity.deathTime + partialTick) - 1.0F) / 20F) * 1.6F;
-            f3 = MathHelper.sqrt_float(f3);
-            if(f3 > 1.0F)
-            {
-                f3 = 1.0F;
-            }
-            GL11.glRotatef(f3 * getDeathMaxRotation(entity), 0.0F, 0.0F, 1.0F);
-        }
-    }
-
-    protected float getSwingProgress(T entity, float partialTick)
-    {
-        return entity.getSwingProgress(partialTick);
-    }
-
-    protected float ticksExisted(T entity, float partialTick)
-    {
-        return (float)entity.tickCount + partialTick;
-    }
-
-    protected void renderEquippedItems(T entity, float f)
-    {
-    }
-
-    protected boolean shouldRenderPassB(T entity, int renderPass, float partialTick)
-    {
-        return shouldRenderPass(entity, renderPass, partialTick);
-    }
-
-    protected boolean shouldRenderPass(T entity, int renderPass, float partialTick)
-    {
-        return false;
-    }
-
-    protected float getDeathMaxRotation(T entity)
-    {
-        return 90F;
-    }
-
-    protected int getColorMultiplier(T entity, float f, float f1)
-    {
-        return 0;
-    }
-
-    protected void preRenderCallback(T entity, float f)
-    {
-    }
-
-    protected void passSpecialRender(T entity, double d, double d1, double d2)
-    {
-        if(mc.canRenderEntityLabel())
-        {
-            renderLivingLabel(entity, Integer.toString(entity.id), d, d1, d2, 64, false);
-        }
-        else if (!entity.nickname.isEmpty())
-        {
-            renderLivingLabel(entity, entity.getDisplayName(), d, d1, d2, 64, true);
-        }
-    }
-
-    protected void renderLivingLabel(T entity, String s, double d, double d1, double d2, int maxDistance, boolean depthTest)
-    {
-        final float f = (float) renderDispatcher.camera.distanceTo(entity);
-        if (f > maxDistance)
-        {
-            return;
-        }
-        final FontRenderer fontrenderer = getFontRenderer();
-        final float f1 = 1.6F;
-        final float f2 = 0.01666667F * f1;
-        GL11.glPushMatrix();
-        GL11.glTranslatef((float) d + 0.0F, (float) d1 + 2.3F, (float) d2);
-        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
-        GL11.glRotatef(-renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
-        GL11.glRotatef(renderDispatcher.viewLerpPitch, 1.0F, 0.0F, 0.0F);
-        GL11.glScalef(-f2, -f2, f2);
-        GL11.glDisable(2896 /* GL_LIGHTING */);
-        GL11.glDepthMask(false);
-        if (!depthTest) GL11.glDisable(2929 /* GL_DEPTH_TEST */);
-        GL11.glEnable(3042 /* GL_BLEND */);
-        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        final Tessellator tessellator = Tessellator.instance;
-        byte byte0 = 0;
-        GL11.glDisable(3553 /* GL_TEXTURE_2D */);
-        tessellator.startDrawingQuads();
-        final int j = fontrenderer.getStringWidth(s) / 2;
-        tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
-        tessellator.addVertex(-j - 1, -1 + byte0, 0.0D);
-        tessellator.addVertex(-j - 1, 8 + byte0, 0.0D);
-        tessellator.addVertex(j + 1, 8 + byte0, 0.0D);
-        tessellator.addVertex(j + 1, -1 + byte0, 0.0D);
-        tessellator.draw();
-        GL11.glEnable(3553 /* GL_TEXTURE_2D */);
-        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, byte0, 0x20ffffff);
-        if (!depthTest) GL11.glEnable(2929 /* GL_DEPTH_TEST */);
-        GL11.glDepthMask(true);
-        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, byte0, 0xFFFFFF);
-        GL11.glEnable(2896 /* GL_LIGHTING */);
-        GL11.glDisable(3042 /* GL_BLEND */);
-        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GL11.glPopMatrix();
-    }
-
-    @Override
-    public void doRender(Tessellator tessellator, T entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        render(entity, x, y, z, yaw, partialTick);
-    }
-    
-    public void loadEntityTexture(T entity)
-    {
-        if (!Minecraft.getMinecraft(this).gameSettings.mobVariants.value)
-        {
-            loadTexture(entity.getDefaultEntityTexture());
-        }
-        else
-        {
-            loadTexture(entity.getEntityTexture());
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java b/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
index 1e97d4b8f..46e873873 100644
--- a/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
@@ -2,125 +2,136 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.client.render.model.ModelMinecart;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.client.render.model.MinecartModel;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.Global;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.opengl.GL11;
 
-// Referenced classes of package net.minecraft.src:
-//            Render, ModelMinecart, EntityMinecart, Vec3D, 
-//            MathHelper, RenderBlocks, Block, ModelBase, 
-//            Entity
-
-public class MinecartRenderer extends EntityRenderer<EntityMinecart>
-{
-
-    public MinecartRenderer()
-    {
+public class MinecartRenderer extends EntityRenderer<MinecartEntity> {
+    public MinecartRenderer() {
         shadowSize = 0.5F;
-        modelMinecart = new ModelMinecart();
+        modelMinecart = new MinecartModel();
     }
 
-    public void renderMinecart(EntityMinecart minecart, double d, double d1, double d2,
-                               float f, float f1)
-    {
+    @Override
+    public void render(Tessellator tessellator, MinecartEntity minecart, final double x, final double y, final double z, final float yaw, final float partialTick) {
         GL11.glPushMatrix();
+        
+        double lerpX = MathHelper.lerp(minecart.xo, minecart.x, partialTick);
+        double lerpY = MathHelper.lerp(minecart.yo, minecart.y, partialTick);
+        double lerpZ = MathHelper.lerp(minecart.zo, minecart.z, partialTick);
+        Vec3 vec3 = minecart.getPos(lerpX, lerpY, lerpZ); // Opposite of velocity vector?
+        double lerpXRot = MathHelper.lerp(minecart.xRotO, minecart.xRot, partialTick);
 
-        Tessellator tessellator = Tessellator.instance;
-        double d3 = minecart.xo + (minecart.x - minecart.xo) * (double)f1;
-        double d4 = minecart.yo + (minecart.y - minecart.yo) * (double)f1;
-        double d5 = minecart.zo + (minecart.z - minecart.zo) * (double)f1;
-        double d6 = 0.30000001192092896D;
-        Vec3d vec3d = minecart.func_514_g(d3, d4, d5);
-        float f2 = minecart.xRotO + (minecart.xRot - minecart.xRotO) * f1;
-        if(vec3d != null)
-        {
-            Vec3d vec3d1 = minecart.func_515_a(d3, d4, d5, d6);
-            Vec3d vec3d2 = minecart.func_515_a(d3, d4, d5, -d6);
-            if(vec3d1 == null)
-            {
-                vec3d1 = vec3d;
+        double renderX = x;
+        double renderY = y;
+        double renderZ = z;
+        double renderYaw = yaw;
+        boolean doAFlip = false;
+        if(vec3 != null) {
+//            drawDebugVec(tessellator, Vec3.getTempVec3(x, y + 1.5, z), Vec3.getTempVec3(-(vec3.x - lerpX), -(vec3.y - lerpY), -(vec3.z - lerpZ)), 1.5, 1, 0, 0, 1);
+            final double scalar = 0.3D;
+            Vec3 forVec = minecart.getPosOffs(lerpX, lerpY, lerpZ, scalar);
+            Vec3 backVec = minecart.getPosOffs(lerpX, lerpY, lerpZ, -scalar);
+            if(forVec == null) {
+                forVec = vec3;
             }
-            if(vec3d2 == null)
-            {
-                vec3d2 = vec3d;
+            if(backVec == null) {
+                backVec = vec3;
             }
-            d += vec3d.xCoord - d3;
-            d1 += (vec3d1.yCoord + vec3d2.yCoord) / 2D - d4;
-            d2 += vec3d.zCoord - d5;
-            Vec3d vec3d3 = vec3d2.addVector(-vec3d1.xCoord, -vec3d1.yCoord, -vec3d1.zCoord);
-            if(vec3d3.lengthVector() != 0.0D)
-            {
-                vec3d3 = vec3d3.normalize();
-                f = (float)((java.lang.Math.atan2(vec3d3.zCoord, vec3d3.xCoord) * 180D) / 3.1415926535897931D);
-                f2 = (float)(java.lang.Math.atan(vec3d3.yCoord) * 73D);
+
+//            drawDebugVec(tessellator, Vec3.getTempVec3(x, y + 1.6, z), Vec3.getTempVec3(forVec.x - lerpX, forVec.y - lerpY, forVec.z - lerpZ), 1.5, 0, 1, 0, 1);
+//            drawDebugVec(tessellator, Vec3.getTempVec3(x, y + 1.7, z), Vec3.getTempVec3(backVec.x - lerpX, backVec.y - lerpY, backVec.z - lerpZ), 1.5, 0, 0, 1, 1);
+
+            renderX += vec3.x - lerpX;
+            renderY += (forVec.y + backVec.y) / 2D - lerpY;
+            renderZ += vec3.z - lerpZ;
+            Vec3 velVec = backVec.add(-forVec.x, -forVec.y, -forVec.z);
+            if(velVec.length() != 0.0D) {
+                velVec = velVec.normalize();
+                renderYaw = Math.toDegrees(Math.atan2(velVec.z, velVec.x));
+                lerpXRot = Math.atan(velVec.y) * 73D;
             }
+
+            Vec3 realVecVec = Vec3.getTempVec3(minecart.xd, minecart.yd, minecart.zd);
+
+            doAFlip = velVec.dotProduct(realVecVec) < 0;
+
+//            drawDebugVec(tessellator, Vec3.getTempVec3(x, y + 1.8, z), Vec3.getTempVec3(velVec.x, velVec.y, velVec.z), 1.5, 0, 1, 1, 1);
         }
-        GL11.glTranslatef((float)d, (float)d1, (float)d2);
-        GL11.glRotatef(180F - f, 0.0F, 1.0F, 0.0F);
-        GL11.glRotatef(-f2, 0.0F, 0.0F, 1.0F);
-        float f3 = (float)minecart.minecartTimeSinceHit - f1;
-        float f4 = (float)minecart.minecartCurrentDamage - f1;
-        if(f4 < 0.0F)
-        {
-            f4 = 0.0F;
+        GL11.glTranslated(renderX, renderY, renderZ);
+        GL11.glRotated(180F - renderYaw, 0.0F, 1.0F, 0.0F);
+        GL11.glRotated(-lerpXRot, 0.0F, 0.0F, 1.0F);
+        double hurtAngle = minecart.timeSinceHit - partialTick;
+        double currentDamage = minecart.currentDamage - partialTick;
+        if(currentDamage < 0.0F) {
+            currentDamage = 0.0F;
         }
-        if(f3 > 0.0F)
-        {
-            GL11.glRotatef(((MathHelper.sin(f3) * f3 * f4) / 10F) * (float)minecart.minecartRockDirection, 1.0F, 0.0F, 0.0F);
+        if(hurtAngle > 0.0F) {
+            GL11.glRotated(((Math.sin(hurtAngle) * hurtAngle * currentDamage) / 10F) * (float)minecart.hurtDirection, 1.0F, 0.0F, 0.0F);
         }
-        if(minecart.minecartType != 0)
-        {
-            TextureRegistry.blockAtlas.bindTexture();
-            float f5 = 0.75F;
-            GL11.glScalef(f5, f5, f5);
+        // Render block in cart
+        if(minecart.type != MinecartEntity.PASSENGER_CART) {
+            TextureRegistry.blockAtlas.bind();
+            final float scale = 0.75F;
+            GL11.glScalef(scale, scale, scale);
             GL11.glTranslatef(0.0F, 0.3125F, 0.0F);
             GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F);
             float brightness = 1.0f;
             if(LightmapHelper.isLightmapEnabled()) {
-            	LightmapHelper.setLightmapCoord(minecart.getLightmapCoord(f1));
-            }else if(Global.accessor.isFullbrightEnabled()) {
-            	
-            }else {
-            	brightness = minecart.getBrightness(f1);
+                LightmapHelper.setLightmapCoord(minecart.getLightmapCoord(partialTick));
+            } else if(!Global.accessor.isFullbrightEnabled()) {
+                brightness = minecart.getBrightness(partialTick);
+            }
+
+            GL11.glPushMatrix();
+            if (doAFlip){
+                GL11.glRotatef(180, 0, 1, 0);
             }
-            if(minecart.minecartType == 1)
-            {
-                BlockModelDispatcher.getInstance().getDispatch(Block.chestPlanksOak).renderBlockOnInventory(tessellator, 0, brightness, null);
-            } else
-            if(minecart.minecartType == 2)
-            {
-                if (minecart.fuel > 0)
-                {
-                    BlockModelDispatcher.getInstance().getDispatch(Block.furnaceStoneActive).renderBlockOnInventory(tessellator, 0, brightness, null);
-                }
-                else
-                {
-                    BlockModelDispatcher.getInstance().getDispatch(Block.furnaceStoneIdle).renderBlockOnInventory(tessellator, 0, brightness, null);
-                }
+            switch (minecart.type){
+                case MinecartEntity.CHEST_CART:
+                    BlockModelDispatcher.getInstance().getDispatch(Blocks.CHEST_PLANKS_OAK).renderBlockOnInventory(tessellator, 0, brightness, null);
+                    break;
+                case MinecartEntity.FURNACE_CART:
+                    if (minecart.fuel > 0) {
+                        BlockModelDispatcher.getInstance().getDispatch(Blocks.FURNACE_STONE_ACTIVE).renderBlockOnInventory(tessellator, 0, brightness, null);
+                    } else {
+                        BlockModelDispatcher.getInstance().getDispatch(Blocks.FURNACE_STONE_IDLE).renderBlockOnInventory(tessellator, 0, brightness, null);
+                    }
+                    break;
             }
+            GL11.glPopMatrix();
             GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F);
             GL11.glTranslatef(0.0F, -0.3125F, 0.0F);
-            GL11.glScalef(1.0F / f5, 1.0F / f5, 1.0F / f5);
+            GL11.glScalef(1.0F / scale, 1.0F / scale, 1.0F / scale);
         }
-        loadTexture("/assets/minecraft/textures/entity/cart.png");
+        bindTexture("/assets/minecraft/textures/entity/cart.png");
         GL11.glScalef(-1F, -1F, 1.0F);
         modelMinecart.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
         GL11.glPopMatrix();
     }
 
-    @Override
-    public void doRender(Tessellator tessellator, EntityMinecart entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        renderMinecart(entity, x, y, z, yaw, partialTick);
+    private void drawDebugVec(Tessellator tessellator, Vec3 pos, Vec3 vec, double scale, float r, float g, float b, float a){
+        if (pos == null || vec == null) return;
+        GL11.glLineWidth(10);
+        GL11.glDisable(GL11.GL_LIGHTING);
+        GL11.glDisable(GL11.GL_TEXTURE_2D);
+        tessellator.startDrawing(GL11.GL_LINES);
+        tessellator.setColorRGBA_F(r, g, b, a);
+        tessellator.addVertex(pos.x, pos.y, pos.z);
+        tessellator.addVertex(
+            pos.x + vec.x * scale,
+            pos.y + vec.y * scale,
+            pos.z + vec.z * scale);
+        tessellator.draw();
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+        GL11.glEnable(GL11.GL_LIGHTING);
     }
-
-    protected ModelBase modelMinecart;
+    protected BaseModel modelMinecart;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/MobRenderer.java b/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
index 160f35626..cb82b49ef 100644
--- a/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
@@ -1,37 +1,277 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.model.ModelBiped;
+import net.minecraft.client.render.model.BaseModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.Global;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntityLiving, ModelBiped, ModelRenderer, 
-//            ItemStack, Block, RenderBlocks, Item, 
-//            RenderManager, ItemRenderer
+//            Render, BaseModel, Mob, MathHelper,
+//            RenderManager, Tessellator, FontRenderer, Entity
 
-public class MobRenderer<T extends EntityLiving> extends LivingRenderer<T>
+public class MobRenderer<T extends Mob> extends EntityRenderer<T>
 {
+    public static final int MAX_ARMOR_LAYERS = 4;
+    protected BaseModel mainModel;
+    protected BaseModel armorModel;
+    protected BaseModel overlayModel;
+    protected String overlayTexture;
+    private final Minecraft mc;
 
-    public MobRenderer(ModelBiped model, float shadowSize)
+    public MobRenderer(BaseModel model, float shadowSize)
     {
-        super(model, shadowSize);
-        modelBipedMain = model;
+        this.mainModel = model;
+        this.shadowSize = shadowSize;
+        this.mc = Minecraft.getMinecraft(this);
     }
 
-	@Override
-	protected void renderEquippedItems(T entity, float f) {
-		ItemStack itemstack = entity.getHeldItem();
-		if(itemstack != null) {
-			GL11.glPushMatrix();
-			modelBipedMain.bipedRightArm.postRender(0.0625F);
-			ItemModelDispatcher.getInstance().getDispatch(itemstack.getItem()).renderItemThirdPerson(Tessellator.instance, renderDispatcher.itemRenderer, entity, itemstack, true);
-			GL11.glPopMatrix();
-		}
-	}
 
-    protected ModelBiped modelBipedMain;
+    public void setArmorModel(BaseModel armor)
+    {
+        armorModel = armor;
+    }
+    public void setOverlayModel(BaseModel modelbase, String texture)
+    {
+        overlayModel = modelbase;
+        overlayTexture = texture;
+    }
+
+    public void render(Tessellator tessellator, T entity, double x, double y, double z,
+                       float yaw, float partialTick)
+    {
+        GL11.glPushMatrix();
+        GL11.glDisable(GL11.GL_CULL_FACE);
+        mainModel.onGround = getSwingProgress(entity, partialTick);
+        if (armorModel != null) armorModel.onGround = mainModel.onGround;
+        if (overlayModel != null) overlayModel.onGround = mainModel.onGround;
+        mainModel.isRiding = entity.isPassenger();
+        if (armorModel != null) armorModel.isRiding = mainModel.isRiding;
+        if (overlayModel != null) overlayModel.isRiding = mainModel.isRiding;
+        try
+        {
+            float bodyYaw = entity.yBodyRotO + (entity.yBodyRot - entity.yBodyRotO) * partialTick;
+            float headYaw = entity.yRotO + (entity.yRot - entity.yRotO) * partialTick;
+            float headPitch = entity.xRotO + (entity.xRot - entity.xRotO) * partialTick;
+            translateModel(entity, x, y, z);
+            float limbSway = limbSway(entity, partialTick);
+            setupRotations(entity, limbSway, bodyYaw, partialTick);
+            float scale = 0.0625F;
+            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+            GL11.glScalef(-1F, -1F, 1.0F);
+            setupScale(entity, partialTick);
+            GL11.glTranslatef(0.0F, -24F * scale - 0.0078125F, 0.0F);
+            float walkSpeed = entity.walkAnimSpeedO + (entity.walkAnimSpeed - entity.walkAnimSpeedO) * partialTick;
+            float walkProgress = entity.walkAnimPos - entity.walkAnimSpeed * (1.0F - partialTick);
+            if(walkSpeed > 1.0F)
+            {
+                walkSpeed = 1.0F;
+            }
+            loadEntityTexture(entity);
+            GL11.glEnable(GL11.GL_ALPHA_TEST);
+            mainModel.setLivingAnimations(entity, walkProgress, walkSpeed, partialTick);
+            mainModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+            if (overlayModel != null)
+            {
+                overlayModel.setLivingAnimations(entity, walkProgress, walkSpeed, partialTick);
+                bindTexture(overlayTexture);
+                overlayModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+            }
+            if (armorModel != null) armorModel.setLivingAnimations(entity, walkProgress, walkSpeed, partialTick);
+            for(int renderPass = 0; renderPass < MAX_ARMOR_LAYERS; renderPass++)
+            {
+                if(prepareArmor(entity, renderPass, partialTick))
+                {
+                    armorModel.setLivingAnimations(entity, walkProgress, walkSpeed, partialTick);
+                    armorModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                    GL11.glDisable(GL11.GL_BLEND);
+                    GL11.glEnable(GL11.GL_ALPHA_TEST);
+                }
+            }
+
+            renderAdditional(entity, partialTick);
+            float f9 = entity.getBrightness(partialTick);
+            if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) f9 = 1.0f;
+            int j = getOverlayColor(entity, f9, partialTick);
+            if((j >> 24 & 0xff) > 0 || entity.hurtTime > 0 || entity.deathTime > 0)
+            {
+                GL11.glDisable(GL11.GL_TEXTURE_2D);
+                GL11.glDisable(GL11.GL_ALPHA_TEST);
+                GL11.glEnable(GL11.GL_BLEND);
+                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+                GL11.glDepthFunc(514);
+                if(entity.hurtTime > 0 || entity.deathTime > 0)
+                {
+                    GL11.glColor4f(f9, 0.0F, 0.0F, 0.4F);
+                    mainModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                    if (overlayModel != null) overlayModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                    for(int k = 0; k < MAX_ARMOR_LAYERS; k++)
+                    {
+                        if(prepareArmor(entity, k, partialTick))
+                        {
+                            GL11.glColor4f(f9, 0.0F, 0.0F, 0.4F);
+                            armorModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                        }
+                    }
+
+                }
+                if((j >> 24 & 0xff) > 0)
+                {
+                    float f10 = (float)(j >> 16 & 0xff) / 255F;
+                    float f11 = (float)(j >> 8 & 0xff) / 255F;
+                    float f12 = (float)(j & 0xff) / 255F;
+                    float f13 = (float)(j >> 24 & 0xff) / 255F;
+                    GL11.glColor4f(f10, f11, f12, f13);
+                    mainModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                    if (overlayModel != null) overlayModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                    for(int l = 0; l < MAX_ARMOR_LAYERS; l++)
+                    {
+                        if(prepareArmor(entity, l, partialTick))
+                        {
+                            GL11.glColor4f(f10, f11, f12, f13);
+                            armorModel.render(walkProgress, walkSpeed, limbSway, headYaw - bodyYaw, headPitch, scale);
+                        }
+                    }
+
+                }
+                GL11.glDepthFunc(GL11.GL_LEQUAL);
+                GL11.glDisable(GL11.GL_BLEND);
+                GL11.glEnable(GL11.GL_ALPHA_TEST);
+                GL11.glEnable(GL11.GL_TEXTURE_2D);
+            }
+            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+        }
+        catch(Exception exception)
+        {
+            exception.printStackTrace();
+        }
+        GL11.glEnable(GL11.GL_CULL_FACE);
+        GL11.glPopMatrix();
+        renderSpecials(tessellator, entity, x, y, z);
+    }
+
+    protected void translateModel(T entity, double x, double y, double z)
+    {
+        GL11.glTranslatef((float)x, (float)y, (float)z);
+    }
+
+    protected void setupRotations(T entity, float ticksExisted, float bodyYaw, float partialTick)
+    {
+        GL11.glRotatef(180F - bodyYaw, 0.0F, 1.0F, 0.0F);
+        if(entity.deathTime > 0)
+        {
+            float rotationProgress = ((((float)entity.deathTime + partialTick) - 1.0F) / 20F) * 1.6F;
+            rotationProgress = MathHelper.sqrt_float(rotationProgress);
+            if(rotationProgress > 1.0F)
+            {
+                rotationProgress = 1.0F;
+            }
+            GL11.glRotatef(rotationProgress * getMaxDeathRotation(entity), 0.0F, 0.0F, 1.0F);
+        }
+    }
+
+    protected float getSwingProgress(T entity, float partialTick)
+    {
+        return entity.getSwingProgress(partialTick);
+    }
+
+    protected float limbSway(T entity, float partialTick)
+    {
+        return (float)entity.tickCount + partialTick;
+    }
+
+    protected void renderAdditional(T entity, float f)
+    {
+    }
+
+    protected boolean prepareArmor(T entity, int layer, float partialTick)
+    {
+        return false;
+    }
+
+    protected float getMaxDeathRotation(T entity)
+    {
+        return 90F;
+    }
+
+    protected int getOverlayColor(T entity, float brightness, float partialTick)
+    {
+        return 0;
+    }
+
+    protected void setupScale(T entity, float partialTick)
+    {
+    }
+
+    protected void renderSpecials(Tessellator tessellator, T entity, double d, double d1, double d2)
+    {
+        if(mc.canRenderEntityLabel())
+        {
+            renderLivingLabel(tessellator, entity, Integer.toString(entity.id), d, d1, d2, 64, false);
+        }
+        else if (!entity.nickname.isEmpty())
+        {
+            renderLivingLabel(tessellator, entity, entity.getDisplayName(), d, d1, d2, 64, true);
+        }
+    }
+
+    protected void renderLivingLabel(Tessellator tessellator, T entity, String s, double d, double d1, double d2, int maxDistance, boolean depthTest)
+    {
+        final float f = (float) renderDispatcher.camera.distanceTo(entity);
+        if (f > maxDistance)
+        {
+            return;
+        }
+        final FontRenderer fontrenderer = getFontRenderer();
+        final float f1 = 1.6F;
+        final float f2 = 0.01666667F * f1;
+        GL11.glPushMatrix();
+        GL11.glTranslatef((float) d + 0.0F, (float) d1 + 2.3F, (float) d2);
+        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
+        GL11.glRotatef(-renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
+        GL11.glRotatef(renderDispatcher.viewLerpPitch, 1.0F, 0.0F, 0.0F);
+        GL11.glScalef(-f2, -f2, f2);
+        GL11.glDisable(2896 /* GL_LIGHTING */);
+        GL11.glDepthMask(false);
+        if (!depthTest) GL11.glDisable(2929 /* GL_DEPTH_TEST */);
+        GL11.glEnable(3042 /* GL_BLEND */);
+        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        byte byte0 = 0;
+        GL11.glDisable(3553 /* GL_TEXTURE_2D */);
+        tessellator.startDrawingQuads();
+        final int j = fontrenderer.getStringWidth(s) / 2;
+        tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
+        tessellator.addVertex(-j - 1, -1 + byte0, 0.0D);
+        tessellator.addVertex(-j - 1, 8 + byte0, 0.0D);
+        tessellator.addVertex(j + 1, 8 + byte0, 0.0D);
+        tessellator.addVertex(j + 1, -1 + byte0, 0.0D);
+        tessellator.draw();
+        GL11.glEnable(3553 /* GL_TEXTURE_2D */);
+        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, byte0, 0x20ffffff);
+        if (!depthTest) GL11.glEnable(2929 /* GL_DEPTH_TEST */);
+        GL11.glDepthMask(true);
+        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, byte0, 0xFFFFFF);
+        GL11.glEnable(2896 /* GL_LIGHTING */);
+        GL11.glDisable(3042 /* GL_BLEND */);
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        GL11.glPopMatrix();
+    }
+    public void loadEntityTexture(T entity)
+    {
+        if (!Minecraft.getMinecraft(this).gameSettings.mobVariants.value)
+        {
+            bindTexture(entity.getDefaultEntityTexture());
+        }
+        else
+        {
+            bindTexture(entity.getEntityTexture());
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/MonsterRenderer.java b/src/main/java/net/minecraft/client/render/entity/MonsterRenderer.java
deleted file mode 100644
index d69bb96c2..000000000
--- a/src/main/java/net/minecraft/client/render/entity/MonsterRenderer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.client.render.entity;
-
-import net.minecraft.client.render.PlayerSkinParser;
-import net.minecraft.client.render.model.ModelBiped;
-import net.minecraft.client.render.model.ModelPlayer;
-import net.minecraft.client.render.model.ModelPlayerSlim;
-import net.minecraft.client.render.model.ModelSign;
-import net.minecraft.core.entity.monster.EntityHuman;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import org.lwjgl.opengl.GL11;
-
-public class MonsterRenderer extends LivingRenderer<EntityHuman>
-{
-    public MonsterRenderer()
-    {
-        super(new ModelPlayer(0.0F), 0.5F);
-        modelBipedMain = (ModelBiped)mainModel;
-//        modelArmorChestplate = new ModelBiped(1.0F);
-//        modelArmor = new ModelBiped(0.5F);
-        modelThick = new ModelPlayer(0.0f);
-        modelSlim = new ModelPlayerSlim(0.0f);
-    }
-    @Override
-    public void render(EntityHuman entity, double x, double y, double z, float yaw, float partialTick) {
-        GL11.glEnable(GL11.GL_BLEND);
-        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        mainModel = entity.slimModel ? modelSlim : modelThick;
-
-//        ItemStack itemstack = entity.getHeldItem();
-//        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = itemstack != null;
-//        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = entity.isSneaking();
-//        modelArmorChestplate.isRiding = modelArmor.isRiding = modelBipedMain.isRiding = entity.isPassenger();
-        double yRender = y - (double)entity.heightOffset;
-        if(entity.isSneaking())
-        {
-            yRender -= 0.125D;
-        }
-        super.render(entity, x, yRender, z, yaw, partialTick);
-//        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = false;
-//        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = false;
-        GL11.glDisable(GL11.GL_BLEND);
-    }
-    @Override
-    protected void preRenderCallback(EntityHuman entity, float f)
-    {
-        float scale = 0.9375F;
-        GL11.glScalef(scale, scale, scale);
-    }
-
-    @Override
-    public void loadEntityTexture(EntityHuman entity)
-    {
-        loadDownloadableTexture(entity.skinUrl, entity.getEntityTexture(), PlayerSkinParser.instance);
-    }
-    private final ModelBiped modelBipedMain;
-    private final ModelPlayer modelThick;
-    private final ModelPlayer modelSlim;
-//    private final ModelBiped modelArmorChestplate;
-//    private final ModelBiped modelArmor;
-}
diff --git a/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java b/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
index cc305742a..c71b15909 100644
--- a/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
@@ -1,11 +1,11 @@
 package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
-import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.entity.PaintingEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.collection.NamespaceID;
@@ -15,7 +15,7 @@ import org.lwjgl.opengl.GL12;
 
 import java.util.Random;
 
-public class PaintingRenderer extends EntityRenderer<EntityPainting>
+public class PaintingRenderer extends EntityRenderer<PaintingEntity>
 {
     private static final IconCoordinate paintingBack = TextureRegistry.getTexture("minecraft:art/backing");
     public PaintingRenderer()
@@ -23,8 +23,8 @@ public class PaintingRenderer extends EntityRenderer<EntityPainting>
         rand = new Random();
     }
 
-    private void renderArt(Tessellator tessellator, EntityPainting entity, int sizeX, int sizeY, IconCoordinate iconCoordinate) {
-        iconCoordinate.parentAtlas.bindTexture();
+    private void renderArt(Tessellator tessellator, PaintingEntity entity, int sizeX, int sizeY, IconCoordinate iconCoordinate) {
+        iconCoordinate.parentAtlas.bind();
         float negCenterX = (float)(-sizeX) / 2.0F;
         float negCenterY = (float)(-sizeY) / 2.0F;
         float minZ = -0.5F;
@@ -104,26 +104,26 @@ public class PaintingRenderer extends EntityRenderer<EntityPainting>
 
     }
 
-    private void setupPaintingBrightness(EntityPainting entity, float centerX, float centerY)
+    private void setupPaintingBrightness(PaintingEntity entity, float centerX, float centerY)
     {
-        int worldX = MathHelper.floor_double(entity.x);
-        int worldY = MathHelper.floor_double(entity.y + (double)(centerY / 16F));
-        int worldZ = MathHelper.floor_double(entity.z);
+        int worldX = MathHelper.floor(entity.x);
+        int worldY = MathHelper.floor(entity.y + (double)(centerY / 16F));
+        int worldZ = MathHelper.floor(entity.z);
         if(entity.direction == 0)
         {
-            worldX = MathHelper.floor_double(entity.x + (double)(centerX / 16F));
+            worldX = MathHelper.floor(entity.x + (double)(centerX / 16F));
         }
         if(entity.direction == 1)
         {
-            worldZ = MathHelper.floor_double(entity.z - (double)(centerX / 16F));
+            worldZ = MathHelper.floor(entity.z - (double)(centerX / 16F));
         }
         if(entity.direction == 2)
         {
-            worldX = MathHelper.floor_double(entity.x - (double)(centerX / 16F));
+            worldX = MathHelper.floor(entity.x - (double)(centerX / 16F));
         }
         if(entity.direction == 3)
         {
-            worldZ = MathHelper.floor_double(entity.z + (double)(centerX / 16F));
+            worldZ = MathHelper.floor(entity.z + (double)(centerX / 16F));
         }
         float brightness = renderDispatcher.world.getLightBrightness(worldX, worldY, worldZ);
         if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) {
@@ -134,7 +134,7 @@ public class PaintingRenderer extends EntityRenderer<EntityPainting>
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityPainting entity, double x, double y, double z, float yaw, float partialTick) {
+    public void render(Tessellator tessellator, PaintingEntity entity, double x, double y, double z, float yaw, float partialTick) {
         rand.setSeed(187L);
         GL11.glPushMatrix();
         GL11.glTranslatef((float)x, (float)y, (float)z);
@@ -149,15 +149,15 @@ public class PaintingRenderer extends EntityRenderer<EntityPainting>
             GL11.glEnable(GL11.GL_BLEND);
             GL11.glBlendFunc(770, 771);
             GL11.glColor4f(1f, 1f, 1f, 1f);
-            NamespaceID id = EntityPainting.getBorder(borderStack);
-            loadTexture(String.format("/assets/%s/textures/art/borders/%s.png", id.namespace, id.value));
+            NamespaceID id = PaintingEntity.getBorder(borderStack);
+            bindTexture(String.format("/assets/%s/textures/art/borders/%s.png", id.namespace, id.value));
             renderBorder(entity, entity.art.sizeX, entity.art.sizeY);
             GL11.glDisable(GL11.GL_BLEND);
         }
         GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
     }
-    private void renderBorder(EntityPainting entity, int sizeX, int sizeY) {
+    private void renderBorder(PaintingEntity entity, int sizeX, int sizeY) {
         float negCenterX = (float)(-sizeX) / 2.0f;
         float negCenterY = (float)(-sizeY) / 2.0f;
         float minZ = -0.6f;
diff --git a/src/main/java/net/minecraft/client/render/entity/PigRenderer.java b/src/main/java/net/minecraft/client/render/entity/PigRenderer.java
index 1006165b7..ed42e66d3 100644
--- a/src/main/java/net/minecraft/client/render/entity/PigRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/PigRenderer.java
@@ -2,28 +2,28 @@ package net.minecraft.client.render.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntityPig, ModelBase, EntityLiving
+//            RenderLiving, PigMob, BaseModel, Mob
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.core.entity.animal.EntityPig;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.core.entity.animal.PigMob;
 
-public class PigRenderer extends LivingRenderer<EntityPig>
+public class PigRenderer extends MobRenderer<PigMob>
 {
 
-    public PigRenderer(ModelBase modelbase, ModelBase modelbase1, float f)
+    public PigRenderer(BaseModel modelbase, BaseModel modelbase1, float f)
     {
         super(modelbase, f);
-        setRenderPassModel(modelbase1);
+        setArmorModel(modelbase1);
     }
 
-    protected boolean renderSaddledPig(EntityPig entity, int i, float f)
+    protected boolean renderSaddledPig(PigMob entity, int i, float f)
     {
-        loadTexture("/assets/minecraft/textures/entity/saddle.png");
+        bindTexture("/assets/minecraft/textures/entity/saddle.png");
         return i == 0 && entity != null && entity.getSaddled();
     }
 
     @Override
-    protected boolean shouldRenderPass(EntityPig entity, int renderPass, float partialTick)
+    protected boolean prepareArmor(PigMob entity, int renderPass, float partialTick)
     {
         return renderSaddledPig(entity, renderPass, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/PlayerRenderer.java b/src/main/java/net/minecraft/client/render/entity/PlayerRenderer.java
index 8f398c0fe..659b8a848 100644
--- a/src/main/java/net/minecraft/client/render/entity/PlayerRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/PlayerRenderer.java
@@ -2,168 +2,42 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
 
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.PlayerSkinParser;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.camera.EntityCamera;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.model.ModelBiped;
-import net.minecraft.client.render.model.ModelPlayer;
-import net.minecraft.client.render.model.ModelPlayerSlim;
-import net.minecraft.client.render.model.ModelSign;
+import net.minecraft.client.render.model.BipedModel;
+import net.minecraft.client.render.model.PlayerModel;
+import net.minecraft.client.render.model.PlayerSlimModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.*;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
-// Referenced classes of package net.minecraft.src:
-//            RenderLiving, ModelBiped, EntityPlayer, InventoryPlayer, 
-//            ItemStack, ItemArmor, ModelRenderer, EntityPlayerSP, 
-//            RenderManager, Tessellator, FontRenderer, Item,
-//            Block, RenderBlocks, ItemRenderer, MathHelper, 
-//            EntityLiving, Entity
-
-public class PlayerRenderer extends LivingRenderer<EntityPlayer>
+public class PlayerRenderer extends MobRenderer<Player>
 {
+    private BipedModel modelBipedMain;
+    private final PlayerModel modelThick;
+    private final PlayerModel modelSlim;
+    private final BipedModel modelArmorChestplate;
+    private final BipedModel modelArmor;
 
     public PlayerRenderer()
     {
-        super(new ModelPlayer(0.0F), 0.5F);
-        modelBipedMain = (ModelBiped)mainModel;
-        modelArmorChestplate = new ModelBiped(1.0F);
-        modelArmor = new ModelBiped(0.5F);
-        modelSign = new ModelSign();
-        modelThick = new ModelPlayer(0.0f);
-        modelSlim = new ModelPlayerSlim(0.0f);
+        super(new PlayerModel(0.0F), 0.5F);
+        modelBipedMain = (BipedModel)mainModel;
+        modelArmorChestplate = new BipedModel(1.0F);
+        modelArmor = new BipedModel(0.5F);
+        modelThick = new PlayerModel(0.0f);
+        modelSlim = new PlayerSlimModel(0.0f);
     }
-
-    protected boolean setArmorModel(EntityPlayer entity, int renderPass, float partialTick)
-    {
-        ItemStack itemstack = entity.inventory.armorItemInSlot(3 - renderPass);
-        if(itemstack != null)
-        {
-            Item item = itemstack.getItem();
-            if(item instanceof ItemQuiver)
-            {
-                loadTexture("/assets/minecraft/textures/armor/quiver.png");
-                ModelBiped modelbiped = modelArmorChestplate;
-                modelbiped.bipedBody.showModel = renderPass == 1 || renderPass == 2;
-                setRenderPassModel(modelbiped);
-                return true;
-            }
-            if(item instanceof ItemQuiverEndless)
-            {
-                loadTexture("/assets/minecraft/textures/armor/quiver_golden.png");
-                ModelBiped modelbiped = modelArmorChestplate;
-                modelbiped.bipedBody.showModel = renderPass == 1 || renderPass == 2;
-                setRenderPassModel(modelbiped);
-                return true;
-            }
-            if(item == Item.armorBootsIceskates)
-            {
-                loadTexture("/assets/minecraft/textures/armor/skates.png");
-                ModelBiped modelbiped = modelArmorChestplate;
-                modelbiped.bipedRightLeg.showModel = renderPass == 2 || renderPass == 3;
-                modelbiped.bipedLeftLeg.showModel = renderPass == 2 || renderPass == 3;
-                setRenderPassModel(modelbiped);
-                return true;
-            }
-            if(item instanceof ItemArmor)
-            {
-                ItemArmor itemarmor = (ItemArmor)item;
-                loadTexture(String.format("/assets/%s/textures/armor/%s_%d.png", itemarmor.material.identifier.namespace, itemarmor.material.identifier.value, (renderPass != 2 ? 1 : 2)));
-                ModelBiped modelbiped = renderPass != 2 ? modelArmorChestplate : modelArmor;
-                modelbiped.bipedHead.showModel = renderPass == 0;
-                modelbiped.bipedHeadOverlay.showModel = renderPass == 0;
-                modelbiped.bipedBody.showModel = renderPass == 1 || renderPass == 2;
-                modelbiped.bipedRightArm.showModel = renderPass == 1;
-                modelbiped.bipedLeftArm.showModel = renderPass == 1;
-                modelbiped.bipedRightLeg.showModel = renderPass == 2 || renderPass == 3;
-                modelbiped.bipedLeftLeg.showModel = renderPass == 2 || renderPass == 3;
-                setRenderPassModel(modelbiped);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void renderPlayer(EntityPlayer entity, double d, double d1, double d2,
-            float yaw, float partialTick)
-    {
-    	GL11.glEnable(GL11.GL_BLEND);
-    	GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-        mainModel = entity.slimModel ? modelSlim : modelThick;
-        modelBipedMain = entity.slimModel ? modelSlim : modelThick;
-    }
-
-    protected void renderName(EntityPlayer entity, double d, double d1, double d2)
-    {
-        if (Minecraft.getMinecraft(this).thePlayer.getGamemode() != Gamemode.spectator && entity.getGamemode() == Gamemode.spectator) {
-            return;
-        }
-        if(Minecraft.getMinecraft(this).gameSettings.immersiveMode.drawNames() && renderDispatcher.camera != null)
-        {
-            if (renderDispatcher.camera instanceof EntityCamera && ((EntityCamera)renderDispatcher.camera).entity == entity)
-            {
-                return;
-            }
-            float f = 1.6F;
-            float f1 = 0.01666667F * f;
-            float f2 = (float) renderDispatcher.camera.distanceTo(entity); //getting lost on renderManager.livingPlayer
-            float f3 = entity.isSneaking() ? 32F : 64F;
-            if(f2 < f3)
-            {
-                String s = entity.getDisplayName();
-                if(!entity.isSneaking())
-                {
-                    if(entity.isPlayerSleeping())
-                    {
-                        renderLivingLabel(entity, s, d, d1 - 1.5D, d2, 64, false);
-                    } else
-                    {
-                        renderLivingLabel(entity, s, d, d1, d2, 64, false);
-                    }
-                } else
-                {
-                    FontRenderer fontrenderer = getFontRenderer();
-                    GL11.glPushMatrix();
-                    GL11.glTranslatef((float)d + 0.0F, (float)d1 + 2.3F, (float)d2);
-                    GL11.glNormal3f(0.0F, 1.0F, 0.0F);
-                    GL11.glRotatef(-renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
-                    GL11.glRotatef(renderDispatcher.viewLerpPitch, 1.0F, 0.0F, 0.0F);
-                    GL11.glScalef(-f1, -f1, f1);
-                    GL11.glDisable(2896 /*GL_LIGHTING*/);
-                    GL11.glTranslatef(0.0F, 0.25F / f1, 0.0F);
-                    GL11.glDepthMask(false);
-                    GL11.glEnable(3042 /*GL_BLEND*/);
-                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
-                    Tessellator tessellator = Tessellator.instance;
-                    GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
-                    tessellator.startDrawingQuads();
-                    int i = fontrenderer.getStringWidth(s) / 2;
-                    tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
-                    tessellator.addVertex(-i - 1, -1D, 0.0D);
-                    tessellator.addVertex(-i - 1, 8D, 0.0D);
-                    tessellator.addVertex(i + 1, 8D, 0.0D);
-                    tessellator.addVertex(i + 1, -1D, 0.0D);
-                    tessellator.draw();
-                    GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
-                    GL11.glDepthMask(true);
-                    fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, 0, 0x20ffffff);
-                    GL11.glEnable(2896 /*GL_LIGHTING*/);
-                    GL11.glDisable(3042 /*GL_BLEND*/);
-                    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-                    GL11.glPopMatrix();
-                }
-            }
-        }
-    }
-    protected void renderSpecials(EntityPlayer entity, float partialTick)
+    protected void renderSpecials(Player entity, float partialTick)
     {
         if (Minecraft.getMinecraft(this).thePlayer.getGamemode() == Gamemode.spectator && entity.getGamemode() == Gamemode.spectator){
             GL11.glColor4f(1f, 1f, 1f, 0.25f);
@@ -174,7 +48,7 @@ public class PlayerRenderer extends LivingRenderer<EntityPlayer>
         if(itemstack != null && itemstack.getItem().id < Block.blocksList.length)
         {
             GL11.glPushMatrix();
-            modelBipedMain.bipedHead.postRender(0.0625F);
+            modelBipedMain.head.translateTo(0.0625F);
             if(BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).shouldItemRender3d())
             {
                 float f1 = 0.625F;
@@ -186,16 +60,17 @@ public class PlayerRenderer extends LivingRenderer<EntityPlayer>
             GL11.glPopMatrix();
         }
 
-        boolean renderCape = loadDownloadableTexture("https://api.betterthanadventure.net/capes?username=" + entity.username, null, null);
+        boolean renderCape = bindDownloadableTexture("https://api.betterthanadventure.net/capes?username=" + entity.username, null, null);
         if (!renderCape)
         {
-            renderCape = loadDownloadableTexture(entity.capeURL, null, null);
+            renderCape = bindDownloadableTexture(entity.capeURL, null, null);
         }
     	
     	if(renderCape) {
             GL11.glPushMatrix();
+            GL11.glColor4f(1f, 1f, 1f, 1f);
             GL11.glTranslatef(0.0F, 0.0F, 0.125F);
-            float yawOff = entity.prevRenderYawOffset + (entity.renderYawOffset - entity.prevRenderYawOffset) * partialTick;
+            float yawOff = entity.yBodyRotO + (entity.yBodyRot - entity.yBodyRotO) * partialTick;
             float bodyAngle = 5;
             if(entity.isSneaking())
             {
@@ -222,112 +97,198 @@ public class PlayerRenderer extends LivingRenderer<EntityPlayer>
 		ItemStack itemstack1 = entity.inventory.getCurrentItem();
 		if(itemstack1 != null) {
             GL11.glPushMatrix();
-            modelBipedMain.bipedRightArm.postRender(0.0625F);
+            modelBipedMain.arm0.translateTo(0.0625F);
             BlockModel.setRenderBlocks(renderDispatcher.itemRenderer.renderBlocksInstance);
             ItemModelDispatcher.getInstance().getDispatch(itemstack1).renderItemThirdPerson(Tessellator.instance, renderDispatcher.itemRenderer, entity, itemstack1, true);
             GL11.glPopMatrix();
 		}
 	}
-
-    protected void func_186_b(EntityPlayer entity, float f)
-    {
-        float f1 = 0.9375F;
-        GL11.glScalef(f1, f1, f1);
-    }
-
-    public void drawFirstPersonHand(EntityPlayer player, boolean isLeft)
+    public void drawFirstPersonHand(Player player, boolean isLeft)
     {
         mainModel = player.slimModel ? modelSlim : modelThick;
         modelBipedMain = player.slimModel ? modelSlim : modelThick;
 
         modelBipedMain.onGround = 0.0F;
         modelBipedMain.isRiding = false;
-        modelBipedMain.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
+        modelBipedMain.setupAnimation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
         if (isLeft){
-            modelBipedMain.bipedLeftArm.render(0.0625F);
+            modelBipedMain.arm1.render(0.0625F);
         } else {
-            modelBipedMain.bipedRightArm.render(0.0625F);
+            modelBipedMain.arm0.render(0.0625F);
         }
-        if (modelBipedMain instanceof ModelPlayer)
+        if (modelBipedMain instanceof PlayerModel)
         {
             if (isLeft){
-                ((ModelPlayer)modelBipedMain).bipedLeftArmOverlay.render(0.0625F);
+                ((PlayerModel)modelBipedMain).bipedLeftArmOverlay.render(0.0625F);
             } else {
-                ((ModelPlayer)modelBipedMain).bipedRightArmOverlay.render(0.0625F);
+                ((PlayerModel)modelBipedMain).bipedRightArmOverlay.render(0.0625F);
             }
         }
     }
-
-    protected void func_22016_b(EntityPlayer entity, double d, double d1, double d2)
+    @Override
+    protected void renderSpecials(Tessellator tessellator, Player entity, double d, double d1, double d2)
     {
-        if(entity.isAlive() && entity.isPlayerSleeping())
-        {
-            super.translateModel(entity, d + (double)entity.field_22063_x, d1 + (double)entity.field_22062_y, d2 + (double)entity.field_22061_z);
-        } else
-        {
-            super.translateModel(entity, d, d1, d2);
+        if (Minecraft.getMinecraft(this).thePlayer.getGamemode() != Gamemode.spectator && entity.getGamemode() == Gamemode.spectator) {
+            return;
         }
-    }
-
-    protected void func_22017_a(EntityPlayer entity, float f, float f1, float f2)
-    {
-        if(entity.isAlive() && entity.isPlayerSleeping())
-        {
-            GL11.glRotatef(entity.getBedOrientationInDegrees(), 0.0F, 1.0F, 0.0F);
-            GL11.glRotatef(getDeathMaxRotation(entity), 0.0F, 0.0F, 1.0F);
-            GL11.glRotatef(270F, 0.0F, 1.0F, 0.0F);
-        } else
+        if(Minecraft.getMinecraft(this).gameSettings.immersiveMode.drawNames() && renderDispatcher.camera != null) // Render name
         {
-            super.rotateModel(entity, f, f1, f2);
+            if (renderDispatcher.camera instanceof EntityCamera && ((EntityCamera)renderDispatcher.camera).mob == entity)
+            {
+                return;
+            }
+            float f = 1.6F;
+            float f1 = 0.01666667F * f;
+            float f2 = (float) renderDispatcher.camera.distanceTo(entity); //getting lost on renderManager.livingPlayer
+            float f3 = entity.isSneaking() ? 32F : 64F;
+            if(f2 < f3)
+            {
+                String s = entity.getDisplayName();
+                if(!entity.isSneaking())
+                {
+                    if(entity.isPlayerSleeping())
+                    {
+                        renderLivingLabel(tessellator, entity, s, d, d1 - 1.5D, d2, 64, false);
+                    } else
+                    {
+                        renderLivingLabel(tessellator, entity, s, d, d1, d2, 64, false);
+                    }
+                } else
+                {
+                    FontRenderer fontrenderer = getFontRenderer();
+                    GL11.glPushMatrix();
+                    GL11.glTranslatef((float)d + 0.0F, (float)d1 + 2.3F, (float)d2);
+                    GL11.glNormal3f(0.0F, 1.0F, 0.0F);
+                    GL11.glRotatef(-renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
+                    GL11.glRotatef(renderDispatcher.viewLerpPitch, 1.0F, 0.0F, 0.0F);
+                    GL11.glScalef(-f1, -f1, f1);
+                    GL11.glDisable(GL11.GL_LIGHTING);
+                    GL11.glTranslatef(0.0F, 0.25F / f1, 0.0F);
+                    GL11.glDepthMask(false);
+                    GL11.glEnable(GL11.GL_BLEND);
+                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+                    GL11.glDisable(GL11.GL_TEXTURE_2D);
+                    tessellator.startDrawingQuads();
+                    int i = fontrenderer.getStringWidth(s) / 2;
+                    tessellator.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
+                    tessellator.addVertex(-i - 1, -1D, 0.0D);
+                    tessellator.addVertex(-i - 1, 8D, 0.0D);
+                    tessellator.addVertex(i + 1, 8D, 0.0D);
+                    tessellator.addVertex(i + 1, -1D, 0.0D);
+                    tessellator.draw();
+                    GL11.glEnable(GL11.GL_TEXTURE_2D);
+                    GL11.glDepthMask(true);
+                    fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, 0, 0x20ffffff);
+                    GL11.glEnable(GL11.GL_LIGHTING);
+                    GL11.glDisable(GL11.GL_BLEND);
+                    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+                    GL11.glPopMatrix();
+                }
+            }
         }
     }
 
     @Override
-    protected void passSpecialRender(EntityPlayer entity, double d, double d1, double d2)
-    {
-        renderName(entity, d, d1, d2);
-    }
-
-    @Override
-    protected void preRenderCallback(EntityPlayer entity, float f)
+    protected void setupScale(Player entity, float partialTick)
     {
         if (Minecraft.getMinecraft(this).thePlayer.getGamemode() == Gamemode.spectator && entity.getGamemode() == Gamemode.spectator){
             GL11.glColor4f(1f, 1f, 1f, 0.25f);
         } else if (entity.getGamemode() == Gamemode.spectator) {
             GL11.glColor4f(1f, 1f, 1f, 0.0f);
         }
-        func_186_b(entity, f);
+
+        float scale = 0.9375F;
+        GL11.glScalef(scale, scale, scale);
+
         if (entity.isDwarf()) {
             GL11.glScalef(0.6f, 0.5f, 0.6f);
         }
     }
 
     @Override
-    protected boolean shouldRenderPass(EntityPlayer entity, int renderPass, float partialTick)
-    {
-        return setArmorModel(entity, renderPass, partialTick);
+    protected boolean prepareArmor(Player entity, int layer, float partialTick) {
+        ItemStack itemstack = entity.inventory.armorItemInSlot(3 - layer);
+        if(itemstack != null)
+        {
+            Item item = itemstack.getItem();
+            if(item instanceof QuiverItem)
+            {
+                bindTexture("/assets/minecraft/textures/armor/quiver.png");
+                BipedModel bipedModel = modelArmorChestplate;
+                bipedModel.body.visible = layer == 1 || layer == 2;
+                setArmorModel(bipedModel);
+                return true;
+            }
+            if(item instanceof EndlessQuiverItem)
+            {
+                bindTexture("/assets/minecraft/textures/armor/quiver_golden.png");
+                BipedModel bipedModel = modelArmorChestplate;
+                bipedModel.body.visible = layer == 1 || layer == 2;
+                setArmorModel(bipedModel);
+                return true;
+            }
+            if(item == Items.ARMOR_BOOTS_ICESKATES)
+            {
+                bindTexture("/assets/minecraft/textures/armor/skates.png");
+                BipedModel bipedModel = modelArmorChestplate;
+                bipedModel.leg0.visible = layer == 2 || layer == 3;
+                bipedModel.leg1.visible = layer == 2 || layer == 3;
+                setArmorModel(bipedModel);
+                return true;
+            }
+            if(item instanceof IArmorItem && ((IArmorItem) item).getArmorMaterial() != null)
+            {
+                IArmorItem armorItem = (IArmorItem)item;
+                bindTexture(String.format("/assets/%s/textures/armor/%s_%d.png", armorItem.getArmorMaterial().identifier.namespace, armorItem.getArmorMaterial().identifier.value, (layer != 2 ? 1 : 2)));
+                BipedModel bipedModel = layer != 2 ? modelArmorChestplate : modelArmor;
+                bipedModel.head.visible = layer == 0;
+                bipedModel.hair.visible = layer == 0;
+                bipedModel.body.visible = layer == 1 || layer == 2;
+                bipedModel.arm0.visible = layer == 1;
+                bipedModel.arm1.visible = layer == 1;
+                bipedModel.leg0.visible = layer == 2 || layer == 3;
+                bipedModel.leg1.visible = layer == 2 || layer == 3;
+                setArmorModel(bipedModel);
+                return true;
+            }
+        }
+        return false;
     }
 
     @Override
-    protected void renderEquippedItems(EntityPlayer entity, float partialTick)
+    protected void renderAdditional(Player entity, float partialTick)
     {
         renderSpecials(entity, partialTick);
     }
 
     @Override
-    protected void rotateModel(EntityPlayer entity, float ticksExisted, float headYawOffset, float partialTick)
+    protected void setupRotations(Player entity, float ticksExisted, float bodyYaw, float partialTick)
     {
-        func_22017_a(entity, ticksExisted, headYawOffset, partialTick);
+        if(entity.isAlive() && entity.isPlayerSleeping())
+        {
+            GL11.glRotatef(entity.getBedOrientationInDegrees(), 0.0F, 1.0F, 0.0F);
+            GL11.glRotatef(getMaxDeathRotation(entity), 0.0F, 0.0F, 1.0F);
+            GL11.glRotatef(270F, 0.0F, 1.0F, 0.0F);
+        } else
+        {
+            super.setupRotations(entity, ticksExisted, bodyYaw, partialTick);
+        }
     }
 
     @Override
-    protected void translateModel(EntityPlayer entity, double x, double y, double z)
+    protected void translateModel(Player entity, double x, double y, double z)
     {
-        func_22016_b(entity, x, y, z);
+        if(entity.isAlive() && entity.isPlayerSleeping())
+        {
+            super.translateModel(entity, x + (double)entity.sleepOffX, y + (double)entity.sleepOffY, z + (double)entity.sleepOffZ);
+        } else
+        {
+            super.translateModel(entity, x, y, z);
+        }
     }
 
     @Override
-    public void render(EntityPlayer entity, double x, double y, double z,
+    public void render(Tessellator tessellator, Player entity, double x, double y, double z,
                        float yaw, float partialTick)
     {
         GL11.glEnable(GL11.GL_BLEND);
@@ -336,30 +297,22 @@ public class PlayerRenderer extends LivingRenderer<EntityPlayer>
         modelBipedMain = entity.slimModel ? modelSlim : modelThick;
 
         ItemStack itemstack = entity.inventory.getCurrentItem();
-        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = itemstack != null;
-        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = entity.isSneaking();
+        modelArmorChestplate.holdingRightHand = modelArmor.holdingRightHand = modelBipedMain.holdingRightHand = itemstack != null;
+        modelArmorChestplate.sneaking = modelArmor.sneaking = modelBipedMain.sneaking = entity.isSneaking();
         modelArmorChestplate.isRiding = modelArmor.isRiding = modelBipedMain.isRiding = entity.isPassenger();
         double d3 = y - (double)entity.heightOffset;
-        if(entity.isSneaking() && !(entity instanceof EntityPlayerSP))
+        if(entity.isSneaking() && !(entity instanceof LocalPlayer))
         {
             d3 -= 0.125D;
         }
-        super.render(entity, x, d3, z, yaw, partialTick);
-        modelArmorChestplate.isSneak = modelArmor.isSneak = modelBipedMain.isSneak = false;
-        modelArmorChestplate.field_1278_i = modelArmor.field_1278_i = modelBipedMain.field_1278_i = false;
+        super.render(tessellator, entity, x, d3, z, yaw, partialTick);
+        modelArmorChestplate.sneaking = modelArmor.sneaking = modelBipedMain.sneaking = false;
+        modelArmorChestplate.holdingRightHand = modelArmor.holdingRightHand = modelBipedMain.holdingRightHand = false;
         GL11.glDisable(GL11.GL_BLEND);
     }
 
     @Override
-    public void loadEntityTexture(EntityPlayer entity)
-    {
-        loadDownloadableTexture(entity.skinURL, entity.getEntityTexture(), PlayerSkinParser.instance);
+    public void loadEntityTexture(Player entity) {
+        bindDownloadableTexture(entity.skinURL, entity.getEntityTexture(), PlayerSkinParser.instance);
     }
-
-    private ModelBiped modelBipedMain;
-    private final ModelPlayer modelThick;
-    private final ModelPlayer modelSlim;
-    private final ModelBiped modelArmorChestplate;
-    private final ModelBiped modelArmor;
-    private final ModelSign modelSign;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/ScorpionRenderer.java b/src/main/java/net/minecraft/client/render/entity/ScorpionRenderer.java
index 84d4df4cc..50b5de73b 100644
--- a/src/main/java/net/minecraft/client/render/entity/ScorpionRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ScorpionRenderer.java
@@ -1,35 +1,29 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelScorpion;
-import net.minecraft.core.entity.monster.EntityScorpion;
+import net.minecraft.client.render.model.ScorpionModel;
+import net.minecraft.core.entity.monster.ScorpionMob;
 
-public class ScorpionRenderer extends LivingRenderer<EntityScorpion>
+public class ScorpionRenderer extends MobRenderer<ScorpionMob>
 {
 
     public ScorpionRenderer()
     {
-        super(new ModelScorpion(), 0.5F);
-        setRenderPassModel(new ModelScorpion());
+        super(new ScorpionModel(), 0.5F);
+        setArmorModel(new ScorpionModel());
     }
-
-    protected float setMaxDeathRotation(EntityScorpion scorpion)
-    {
-        return 180F;
-    }
-
-    protected boolean doRenderPass(EntityScorpion scorpion, int i, float f)
+    protected boolean doRenderPass(ScorpionMob scorpion, int i, float f)
     {
         return i == 0;
     }
 
     @Override
-    protected float getDeathMaxRotation(EntityScorpion entity)
+    protected float getMaxDeathRotation(ScorpionMob entity)
     {
-        return setMaxDeathRotation(entity);
+        return 180F;
     }
 
     @Override
-    protected boolean shouldRenderPass(EntityScorpion entity, int renderPass, float partialTick)
+    protected boolean prepareArmor(ScorpionMob entity, int renderPass, float partialTick)
     {
         return doRenderPass(entity, renderPass, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java b/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
index 495bcad9f..bbb21fe02 100644
--- a/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
@@ -1,37 +1,37 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.render.model.BaseModel;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.model.ModelBase;
 import net.minecraft.core.Global;
-import net.minecraft.core.entity.animal.EntitySheep;
+import net.minecraft.core.entity.animal.SheepMob;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntitySheep, ModelBase, EntityLiving
+//            RenderLiving, SheepMob, BaseModel, Mob
 
-public class SheepRenderer extends LivingRenderer<EntitySheep>
+public class SheepRenderer extends MobRenderer<SheepMob>
 {
-    public SheepRenderer(ModelBase body, ModelBase wool, ModelBase overlay, float f)
+    public SheepRenderer(BaseModel body, BaseModel wool, BaseModel overlay, float f)
     {
         super(body, f);
-        setRenderPassModel(wool);
+        setArmorModel(wool);
         setOverlayModel(overlay, "/assets/minecraft/textures/entity/sheep_overlay.png");
     }
 
-    protected boolean setWoolColorAndRender(EntitySheep entitysheep, int i, float f)
+    protected boolean setWoolColorAndRender(SheepMob entitysheep, int i, float f)
     {
         if(i == 0 && !entitysheep.getSheared())
         {
-            loadTexture("/assets/minecraft/textures/entity/sheep_fur.png");
+            bindTexture("/assets/minecraft/textures/entity/sheep_fur.png");
             float brightness = 1.0f;
             if(LightmapHelper.isLightmapEnabled() || Global.accessor.isFullbrightEnabled()) {
             	
             }else {
             	brightness = entitysheep.getBrightness(f);
             }
-            int j = entitysheep.getFleeceColor();
-            GL11.glColor3f(brightness * EntitySheep.fleeceColorTable[j][0], brightness * EntitySheep.fleeceColorTable[j][1], brightness * EntitySheep.fleeceColorTable[j][2]);
+            int j = entitysheep.getFleeceColor().blockMeta;
+            GL11.glColor3f(brightness * SheepMob.FLEECE_COLOR_TABLE[j][0], brightness * SheepMob.FLEECE_COLOR_TABLE[j][1], brightness * SheepMob.FLEECE_COLOR_TABLE[j][2]);
             return true;
         } else
         {
@@ -45,7 +45,7 @@ public class SheepRenderer extends LivingRenderer<EntitySheep>
     }
 
     @Override
-    protected boolean shouldRenderPass(EntitySheep entity, int renderPass, float partialTick)
+    protected boolean prepareArmor(SheepMob entity, int renderPass, float partialTick)
     {
         return setWoolColorAndRender(entity, renderPass, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/SlimeRenderer.java b/src/main/java/net/minecraft/client/render/entity/SlimeRenderer.java
index b94a0c816..a84f6942e 100644
--- a/src/main/java/net/minecraft/client/render/entity/SlimeRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SlimeRenderer.java
@@ -1,59 +1,59 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelBase;
-import net.minecraft.core.entity.monster.EntitySlime;
+import net.minecraft.client.render.model.BaseModel;
+import net.minecraft.core.entity.monster.SlimeMob;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntitySlime, ModelBase, EntityLiving
+//            RenderLiving, SlimeMob, BaseModel, Mob
 
-public class SlimeRenderer extends LivingRenderer<EntitySlime>
+public class SlimeRenderer extends MobRenderer<SlimeMob>
 {
 
-    public SlimeRenderer(ModelBase modelbase, ModelBase modelbase1, float f)
+    public SlimeRenderer(BaseModel modelbase, BaseModel modelbase1, float f)
     {
         super(modelbase, f);
         scaleAmount = modelbase1;
     }
 
-    protected boolean renderSlimePassModel(EntitySlime entity, int i, float f)
+    protected boolean renderSlimePassModel(SlimeMob entity, int i, float f)
     {
         if(i == 0)
         {
-            setRenderPassModel(scaleAmount);
+            setArmorModel(scaleAmount);
             GL11.glEnable(2977 /*GL_NORMALIZE*/);
-            GL11.glEnable(3042 /*GL_BLEND*/);
+            GL11.glEnable(GL11.GL_BLEND);
             GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
             return true;
         }
         if(i == 1)
         {
-            GL11.glDisable(3042 /*GL_BLEND*/);
+            GL11.glDisable(GL11.GL_BLEND);
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         }
         return false;
     }
 
-    protected void scaleSlime(EntitySlime entityslime, float f)
+    protected void scaleSlime(SlimeMob entityslime, float f)
     {
         int i = entityslime.getSlimeSize();
-        float f1 = (entityslime.field_767_b + (entityslime.field_768_a - entityslime.field_767_b) * f) / ((float)i * 0.5F + 1.0F);
+        float f1 = (entityslime.oSquish + (entityslime.squish - entityslime.oSquish) * f) / ((float)i * 0.5F + 1.0F);
         float f2 = 1.0F / (f1 + 1.0F);
         float f3 = i;
         GL11.glScalef(f2 * f3, (1.0F / f2) * f3, f2 * f3);
     }
 
     @Override
-    protected void preRenderCallback(EntitySlime entity, float f)
+    protected void setupScale(SlimeMob entity, float partialTick)
     {
-        scaleSlime(entity, f);
+        scaleSlime(entity, partialTick);
     }
 
     @Override
-    protected boolean shouldRenderPass(EntitySlime entity, int renderPass, float partialTick)
+    protected boolean prepareArmor(SlimeMob entity, int renderPass, float partialTick)
     {
         return renderSlimePassModel(entity, renderPass, partialTick);
     }
 
-    private final ModelBase scaleAmount;
+    private final BaseModel scaleAmount;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java b/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
index a00bd7d1b..490ea3388 100644
--- a/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
@@ -2,41 +2,33 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.model.ModelSpider;
-import net.minecraft.core.Global;
-import net.minecraft.core.entity.monster.EntitySpider;
+import net.minecraft.client.render.model.SpiderModel;
+import net.minecraft.core.entity.monster.SpiderMob;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, ModelSpider, EntitySpider, EntityLiving
+//            RenderLiving, SpiderModel, SpiderMob, Mob
 
-public class SpiderRenderer extends LivingRenderer<EntitySpider>
+public class SpiderRenderer extends MobRenderer<SpiderMob>
 {
 
     public SpiderRenderer()
     {
-        super(new ModelSpider(0), 1.0F);
-        setRenderPassModel(new ModelSpider(0.01f));
+        super(new SpiderModel(0), 1.0F);
+        setArmorModel(new SpiderModel(0.01f));
     }
-
-    protected float setSpiderDeathMaxRotation(EntitySpider spider)
-    {
-        return 180F;
-    }
-
-    protected boolean setSpiderEyeBrightness(EntitySpider spider, int renderPass, float partialTick)
+    protected boolean setSpiderEyeBrightness(SpiderMob spider, int renderPass, float partialTick)
     {
         if(renderPass == 0)
         {
-            boolean useVariants = Minecraft.getMinecraft(this).gameSettings.mobVariants.value;
-            loadTexture("/assets/minecraft/textures/entity/spider/eyes/" + (useVariants ? spider.getSkinVariant() : 0) + ".png");
+            bindTexture("/assets/minecraft/textures/entity/spider/eyes/" + spider.getTextureReference() + ".png");
             float brightness = spider.getBrightness(1.0f);
             if(LightmapHelper.isLightmapEnabled()) {
                 LightmapHelper.setLightmapCoord(LightmapHelper.getLightmapCoord(15, 15));
             }
             float f1 = (1.0F - brightness) * 0.5F;
-            GL11.glEnable(3042 /*GL_BLEND*/);
-            GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
+            GL11.glEnable(GL11.GL_BLEND);
+            GL11.glDisable(GL11.GL_ALPHA_TEST);
             GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
             GL11.glColor4f(1.0F, 1.0F, 1.0F, f1);
             return true;
@@ -46,13 +38,13 @@ public class SpiderRenderer extends LivingRenderer<EntitySpider>
     }
 
     @Override
-    protected float getDeathMaxRotation(EntitySpider entity)
+    protected float getMaxDeathRotation(SpiderMob entity)
     {
-        return setSpiderDeathMaxRotation(entity);
+        return 180f;
     }
 
     @Override
-    protected boolean shouldRenderPass(EntitySpider entity, int renderPass, float partialTick) {
+    protected boolean prepareArmor(SpiderMob entity, int renderPass, float partialTick) {
         return setSpiderEyeBrightness(entity, renderPass, partialTick);
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/SnowballRenderer.java b/src/main/java/net/minecraft/client/render/entity/SpriteRenderer.java
similarity index 55%
rename from src/main/java/net/minecraft/client/render/entity/SnowballRenderer.java
rename to src/main/java/net/minecraft/client/render/entity/SpriteRenderer.java
index 2c5b5dd67..d97d28e2a 100644
--- a/src/main/java/net/minecraft/client/render/entity/SnowballRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SpriteRenderer.java
@@ -1,35 +1,56 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.item.Item;
 import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
 
 // Referenced classes of package net.minecraft.src:
 //            Render, Tessellator, RenderManager, Entity
 
-public class SnowballRenderer extends EntityRenderer<Entity>
+public class SpriteRenderer<T extends Entity> extends EntityRenderer<T>
 {
-    public SnowballRenderer(Item item){
+    private IconCoordinate itemIconIndex;
+    private float scale = 1;
+    private boolean fullBright = false;
+
+    public SpriteRenderer(Item item){
         this(ItemModelDispatcher.getInstance().getDispatch(item).getIcon(null, item.getDefaultStack()));
     }
-
-    public SnowballRenderer(IconCoordinate i)
+    public SpriteRenderer(IconCoordinate i)
     {
         itemIconIndex = i;
     }
 
+    public SpriteRenderer setFullBright(){
+        fullBright = true;
+        return this;
+    }
+    public SpriteRenderer setScale(float scale){
+        this.scale = scale;
+        return this;
+    }
+
     @Override
-    public void doRender(Tessellator tessellator, Entity entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, T entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         GL11.glPushMatrix();
         GL11.glTranslatef((float) x, (float) y, (float) z);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
-        GL11.glScalef(0.5F, 0.5F, 0.5F);
-        itemIconIndex.parentAtlas.bindTexture();
+        if (fullBright){
+            GL11.glDisable(GL11.GL_LIGHTING);
+            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+            if (LightmapHelper.isLightmapEnabled()){
+                LightmapHelper.setLightmapCoord(LightmapHelper.getLightmapCoord(15, 15));
+            }
+        }
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+        GL11.glScalef(0.5F * scale, 0.5F * scale, 0.5F * scale);
+        itemIconIndex.parentAtlas.bind();
         float f2 = (float) itemIconIndex.getIconUMin();
         float f3 = (float) itemIconIndex.getIconUMax();
         float f4 = (float) itemIconIndex.getIconVMin();
@@ -46,9 +67,10 @@ public class SnowballRenderer extends EntityRenderer<Entity>
         tessellator.addVertexWithUV(f6 - f7, 1.0F - f8, 0.0D, f3, f4);
         tessellator.addVertexWithUV(0.0F - f7, 1.0F - f8, 0.0D, f2, f4);
         tessellator.draw();
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
+        if (fullBright){
+            GL11.glEnable(GL11.GL_LIGHTING);
+        }
     }
-
-    private IconCoordinate itemIconIndex;
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/SquidRenderer.java b/src/main/java/net/minecraft/client/render/entity/SquidRenderer.java
index f3ffe3d29..1818c6beb 100644
--- a/src/main/java/net/minecraft/client/render/entity/SquidRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SquidRenderer.java
@@ -1,43 +1,43 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.render.model.ModelBase;
+import net.minecraft.client.render.model.BaseModel;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.animal.EntitySquid;
+import net.minecraft.core.entity.animal.SquidMob;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            RenderLiving, EntitySquid, ModelBase, EntityLiving, 
+//            RenderLiving, SquidMob, BaseModel, Mob,
 //            Entity
 
-public class SquidRenderer extends LivingRenderer<EntitySquid>
+public class SquidRenderer extends MobRenderer<SquidMob>
 {
-    public SquidRenderer(ModelBase modelbase, float f)
+    public SquidRenderer(BaseModel modelbase, float f)
     {
         super(modelbase, f);
     }
     @Override
-    protected float ticksExisted(EntitySquid squid, float partialTick)
+    protected float limbSway(SquidMob squid, float partialTick)
     {
-        return squid.limbAnglePrev + (squid.newLimbAngle - squid.limbAnglePrev) * partialTick;
+        return squid.oldTentacleAngle + (squid.tentacleAngle - squid.oldTentacleAngle) * partialTick;
     }
 
     @Override
-    protected void rotateModel(EntitySquid squid, float ticksExisted, float headYawOffset, float partialTick)
+    protected void setupRotations(SquidMob squid, float ticksExisted, float bodyYaw, float partialTick)
     {
-        float pitch = squid.prevPitch + (squid.newPitch - squid.prevPitch) * partialTick;
-        float yaw = squid.prevYaw + (squid.newYaw - squid.prevYaw) * partialTick;
+        float pitch = squid.xBodyRotO + (squid.xBodyRot - squid.xBodyRotO) * partialTick;
+        float yaw = squid.zBodyRotO + (squid.zBodyRot - squid.zBodyRotO) * partialTick;
         GL11.glTranslatef(0.0F, 0.5F, 0.0F);
-        GL11.glRotatef(180F - headYawOffset, 0.0F, 1.0F, 0.0F);
+        GL11.glRotatef(180F - bodyYaw, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(pitch, 1.0F, 0.0F, 0.0F);
         GL11.glRotatef(yaw, 0.0F, 1.0F, 0.0F);
         GL11.glTranslatef(0.0F, -1.2F, 0.0F);
     }
 
     @Override
-    public void doRenderPreview(Tessellator tessellator, EntitySquid squid, double x, double y, double z, float yaw, float partialTick) {
+    public void renderPreview(Tessellator tessellator, SquidMob squid, double x, double y, double z, float yaw, float partialTick) {
         GL11.glPushMatrix();
         GL11.glTranslatef(0.0f, 1.25f, 0.0f);
-        super.doRenderPreview(tessellator,squid, x, y, z, yaw, partialTick);
+        super.renderPreview(tessellator,squid, x, y, z, yaw, partialTick);
         GL11.glPopMatrix();
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java b/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
index 4503ceba7..8db933283 100644
--- a/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
@@ -3,18 +3,19 @@ package net.minecraft.client.render.entity;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.entity.TNTPrimedEntity;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            Render, RenderBlocks, EntityTNTPrimed, Block, 
 //            Entity
 
-public class TNTRenderer extends EntityRenderer<EntityTNT>
+public class TNTRenderer extends EntityRenderer<TNTPrimedEntity>
 {
 
     public TNTRenderer()
@@ -23,7 +24,7 @@ public class TNTRenderer extends EntityRenderer<EntityTNT>
         shadowSize = 0.5F;
     }
 
-    public void renderTNT(EntityTNT tnt, double d, double d1, double d2,
+    public void renderTNT(TNTPrimedEntity tnt, double d, double d1, double d2,
                           float f, float f1)
     {
         Tessellator tessellator = Tessellator.instance;
@@ -46,30 +47,30 @@ public class TNTRenderer extends EntityRenderer<EntityTNT>
             GL11.glScalef(f4, f4, f4);
         }
         float f3 = (1.0F - (((float)tnt.fuse - f1) + 1.0F) / 100F) * 0.8F;
-        TextureRegistry.blockAtlas.bindTexture();
+        TextureRegistry.blockAtlas.bind();
         float brightness = tnt.getBrightness(f1);
         if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
-        BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(Block.tnt);
+        BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(Blocks.TNT);
         model.renderBlockOnInventory(tessellator, 0, brightness, null);
         if((tnt.fuse / 5) % 2 == 0)
         {
-            GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
-            GL11.glDisable(2896 /*GL_LIGHTING*/);
-            GL11.glEnable(3042 /*GL_BLEND*/);
+            GL11.glDisable(GL11.GL_TEXTURE_2D);
+            GL11.glDisable(GL11.GL_LIGHTING);
+            GL11.glEnable(GL11.GL_BLEND);
             GL11.glBlendFunc(770, 772);
             GL11.glColor4f(1.0F, 1.0F, 1.0F, f3);
             model.renderBlockOnInventory(tessellator, 0, 1.0F, null);
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-            GL11.glDisable(3042 /*GL_BLEND*/);
-            GL11.glEnable(2896 /*GL_LIGHTING*/);
-            GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
+            GL11.glDisable(GL11.GL_BLEND);
+            GL11.glEnable(GL11.GL_LIGHTING);
+            GL11.glEnable(GL11.GL_TEXTURE_2D);
         }
         GL11.glPopMatrix();
     }
 
     @Override
-    public void doRender(Tessellator tessellator, EntityTNT entity, double x, double y, double z,
-                         float yaw, float partialTick)
+    public void render(Tessellator tessellator, TNTPrimedEntity entity, double x, double y, double z,
+                       float yaw, float partialTick)
     {
         renderTNT(entity, x, y, z, yaw, partialTick);
     }
diff --git a/src/main/java/net/minecraft/client/render/entity/WolfRenderer.java b/src/main/java/net/minecraft/client/render/entity/WolfRenderer.java
index 219de8364..3cde6fbb5 100644
--- a/src/main/java/net/minecraft/client/render/entity/WolfRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/WolfRenderer.java
@@ -2,79 +2,62 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
-import net.minecraft.client.render.model.ModelWolf;
+import net.minecraft.client.render.model.WolfModel;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
+
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ArmorMaterial;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
-public class WolfRenderer extends LivingRenderer<EntityWolf>
+public class WolfRenderer extends MobRenderer<WolfMob>
 {
-    private final ModelWolf modelArmor;
-    protected ModelWolf modelWolfMain;
+    private final WolfModel modelArmor;
+    protected WolfModel modelWolfMain;
 
-    public WolfRenderer(ModelWolf modelWolf, float shadowSize)
+    public WolfRenderer(WolfModel modelWolf, float shadowSize)
     {
         super(modelWolf, shadowSize);
         modelWolfMain = modelWolf;
-        modelArmor = new ModelWolf(0.25f);
+        modelArmor = new WolfModel(0.25f);
     }
 
-    protected boolean setArmorModel(EntityWolf wolf, int renderPass, float renderPartialTicks) {
+    @Override
+    protected boolean prepareArmor(WolfMob wolf, int layer, float partialTick) {
         ArmorMaterial material = wolf.getArmorMaterial();
         if (material == null) {
             return false;
         }
-        loadTexture(String.format("/assets/%s/textures/armor/wolf/%s.png", material.identifier.namespace, material.identifier.value));
-        setRenderPassModel(modelArmor);
+        bindTexture(String.format("/assets/%s/textures/armor/wolf/%s.png", material.identifier.namespace, material.identifier.value));
+        setArmorModel(modelArmor);
         return true;
     }
-
-    @Override
-    protected boolean shouldRenderPass(EntityWolf entity, int renderPass, float renderPartialTicks) {
-        return setArmorModel(entity, renderPass, renderPartialTicks);
-    }
-
-    public void renderWolf(EntityWolf wolf, double x, double y, double z,
-                           float yaw, float partialTicks)
-    {
-        super.render(wolf, x, y, z, yaw, partialTicks);
-    }
-
-    protected float getTailRotation(EntityWolf wolf, float partialTicks)
-    {
-        return wolf.getTailRotation();
-    }
-
     @Override
-    protected float ticksExisted(EntityWolf entity, float partialTick)
+    protected float limbSway(WolfMob wolf, float partialTick)
     {
-        return getTailRotation(entity, partialTick);
-    }
-
-    @Override
-    public void render(EntityWolf entity, double x, double y, double z,
-                       float yaw, float partialTick)
-    {
-        renderWolf(entity, x, y, z, yaw, partialTick);
-    }
-
-    @Override
-    public void doRender(Tessellator tessellator, EntityWolf entity, double x, double y, double z,
-                         float yaw, float partialTick)
-    {
-        renderWolf(entity, x, y, z, yaw, partialTick);
+        if(wolf.isWolfAngry())
+        {
+            return 88 * (MathHelper.PI / 180F);
+        }
+        else if(wolf.isWolfTamed())
+        {
+            return (0.55F - (float)(wolf.getMaxHealth() - wolf.getHealth()) * 0.02F) * MathHelper.PI;
+        }
+        else
+        {
+            return 36 * (MathHelper.PI / 180F);
+        }
     }
 
     @Override
-    protected void renderEquippedItems(EntityWolf entity, float f){
+    protected void renderAdditional(WolfMob entity, float f){
         ItemStack itemstack = entity.getWolfHeldItem();
 
         if(itemstack != null && itemstack.getItem() != null) {
             GL11.glPushMatrix();
-            modelWolfMain.wolfHeadMain.postRender(0.0625F);
+            modelWolfMain.wolfHeadMain.translateTo(0.0625F);
             GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
             float scale;
             if (itemstack.itemID > 0 && itemstack.itemID < Block.blocksList.length && BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).shouldItemRender3d()) {
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java b/src/main/java/net/minecraft/client/render/item/model/BlockItemModel.java
similarity index 93%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
rename to src/main/java/net/minecraft/client/render/item/model/BlockItemModel.java
index dd0d26edd..9f16c0e72 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
+++ b/src/main/java/net/minecraft/client/render/item/model/BlockItemModel.java
@@ -8,34 +8,35 @@ import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.item.block.BlockItem;
 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 org.lwjgl.opengl.GL12;
 
 import java.util.Random;
 
 import static org.lwjgl.opengl.GL11.*;
 
-public class ItemModelBlock extends ItemModelStandard {
+public class BlockItemModel extends StandardItemModel {
     private Block block;
     private BlockModel<Block> blockModel;
-    public ItemModelBlock(ItemBlock itemBlock){
-        super(itemBlock, null);
-        this.block = itemBlock.getBlock();
+    public BlockItemModel(BlockItem blockItem){
+        super(blockItem, null);
+        this.block = blockItem.getBlock();
         this.blockModel = BlockModelDispatcher.getInstance().getDispatch(block);
         icon = blockModel.getBlockTextureFromSideAndMetadata(Side.NORTH, 0);
     }
     @Override
-    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
+    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, Player player, ItemStack stack, float partialTick) {
         final Minecraft mc = Minecraft.getMinecraft(this);
         float brightness = 1.0f;
         if(LightmapHelper.isLightmapEnabled()) {
@@ -58,7 +59,7 @@ public class ItemModelBlock extends ItemModelStandard {
         GL11.glTranslatef(-animationProgress * 0.4F, MathHelper.sin(MathHelper.sqrt_float(swingProgress) * MathHelper.PI * 2.0F) * 0.2F, -animationProgress2 * 0.2F); // Makes swing travel in an arc
         GL11.glTranslatef(0.7F * distanceScale, -0.65F * distanceScale - (1.0F - renderer.getEquippedProgress(partialTick)) * 0.6F, -0.9F * distanceScale); // Positions hand in correct place on right side of screen
         GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F); // 45 degrees tilt, makes it face more towards the camera
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         float animationProgress3 = MathHelper.sin(swingProgress * swingProgress * MathHelper.PI);
         GL11.glRotatef(-animationProgress3 * 20F, 0.0F, 1.0F, 0.0F);
@@ -80,7 +81,7 @@ public class ItemModelBlock extends ItemModelStandard {
         {
             GL11.glEnable(GL_BLEND);
             GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-            TextureRegistry.blockAtlas.bindTexture();
+            TextureRegistry.blockAtlas.bind();
             BlockModelDispatcher.getInstance().getDispatch(Block.blocksList[itemstack.itemID]).renderBlockOnInventory(tessellator, itemstack.getMetadata(), brightness, null);
             GL11.glDisable(GL_BLEND);
         } else {
@@ -107,7 +108,7 @@ public class ItemModelBlock extends ItemModelStandard {
         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();
+            TextureRegistry.blockAtlas.bind();
             GL11.glPushMatrix();
             GL11.glTranslatef(x - 2, y + 3, -3F);
             GL11.glScalef(10F, 10F, 10F);
@@ -140,7 +141,7 @@ public class ItemModelBlock extends ItemModelStandard {
     public void renderAsItemEntity(Tessellator tessellator, 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();
+            TextureRegistry.blockAtlas.bind();
             final float itemSize = blockModel.getItemRenderScale();
             GL11.glScalef(itemSize, itemSize, itemSize);
             for (int i = 0; i < renderCount; i++) {
@@ -174,7 +175,7 @@ public class ItemModelBlock extends ItemModelStandard {
         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();
+            TextureRegistry.blockAtlas.bind();
             if (useColor) {
                 final int color = getColor(itemStack);
                 final float r = (color >> 16 & 0xff) / 255F;
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java b/src/main/java/net/minecraft/client/render/item/model/BowItemModel.java
similarity index 62%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java
rename to src/main/java/net/minecraft/client/render/item/model/BowItemModel.java
index 96c130303..3ba604844 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelBow.java
+++ b/src/main/java/net/minecraft/client/render/item/model/BowItemModel.java
@@ -1,21 +1,18 @@
 package net.minecraft.client.render.item.model;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.player.EntityOtherPlayerMP;
+import net.minecraft.client.entity.player.RemotePlayer;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.monster.EntitySkeleton;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityArrowPurple;
+import net.minecraft.core.entity.monster.SkeletonMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.core.item.Items;
 import org.lwjgl.opengl.GL11;
 
 import static org.lwjgl.opengl.GL11.GL_BLEND;
@@ -25,8 +22,8 @@ import static org.lwjgl.opengl.GL11.glBlendFunc;
 import static org.lwjgl.opengl.GL11.glDisable;
 import static org.lwjgl.opengl.GL11.glEnable;
 
-public class ItemModelBow extends ItemModelStandard {
-    public ItemModelBow(Item item, String namespace) {
+public class BowItemModel extends StandardItemModel {
+    public BowItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
@@ -34,13 +31,13 @@ public class ItemModelBow extends ItemModelStandard {
     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;
+        if (entity instanceof Player){
+            Player entityplayer = (Player)entity;
             nextArrow = getNextArrow(entityplayer);
         }
-        if (entity instanceof EntitySkeleton){
-            if (((EntitySkeleton) entity).attackTime < 5){
-                nextArrow = Item.ammoArrow;
+        if (entity instanceof SkeletonMob){
+            if (((SkeletonMob) entity).attackTime < 5){
+                nextArrow = Items.AMMO_ARROW;
             }
         }
         if (nextArrow != null){
@@ -57,30 +54,28 @@ public class ItemModelBow extends ItemModelStandard {
             glEnable(GL_BLEND);
             glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
             glEnable(GL_CULL_FACE);
-            ItemModelStandard arrowModel = (ItemModelStandard) ItemModelDispatcher.getInstance().getDispatch(nextArrow);
+            StandardItemModel arrowModel = (StandardItemModel) ItemModelDispatcher.getInstance().getDispatch(nextArrow);
             IconCoordinate textureIndex = arrowModel.getIcon(mc.thePlayer, nextArrow.getDefaultStack());
-            if (textureIndex != null) {
-                GL11.glDisable(GL_LIGHTING);
-                textureIndex.parentAtlas.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);
-                }
-                renderTexturedQuad(tessellator, x, y, textureIndex, true, false);
-                glEnable(GL_LIGHTING);
+            GL11.glDisable(GL_LIGHTING);
+            textureIndex.parentAtlas.bind();
+            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);
             }
+            renderTexturedQuad(tessellator, x, y, textureIndex, true, false);
+            glEnable(GL_LIGHTING);
             glEnable(GL_CULL_FACE);
             glDisable(GL11.GL_BLEND);
         }
         super.renderItemIntoGui(tessellator, fontrenderer, renderengine, itemStack, x, y, brightness, alpha);
     }
-    public Item getNextArrow(EntityPlayer player){
-        if (player instanceof EntityOtherPlayerMP){
+    public Item getNextArrow(Player player){
+        if (player instanceof RemotePlayer){
             int id = player.getArrowId();
             if (id < 0 || id >= Item.itemsList.length) return null;
             return Item.itemsList[id];
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java b/src/main/java/net/minecraft/client/render/item/model/CoalItemModel.java
similarity index 71%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java
rename to src/main/java/net/minecraft/client/render/item/model/CoalItemModel.java
index 3d454edaa..63e5fe4a5 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelCoal.java
+++ b/src/main/java/net/minecraft/client/render/item/model/CoalItemModel.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.render.item.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.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{
+public class CoalItemModel extends StandardItemModel {
     protected IconCoordinate charcoal = TextureRegistry.getTexture("minecraft:item/charcoal");
-    public ItemModelCoal(Item item, String namespace) {
+    public CoalItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/item/model/DoorPaintedItemModel.java b/src/main/java/net/minecraft/client/render/item/model/DoorPaintedItemModel.java
new file mode 100644
index 000000000..8cb52f0af
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/item/model/DoorPaintedItemModel.java
@@ -0,0 +1,25 @@
+package net.minecraft.client.render.item.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
+import org.jetbrains.annotations.NotNull;
+
+public class DoorPaintedItemModel extends StandardItemModel {
+    public static IconCoordinate[] doorIcons = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+    static {
+        for (DyeColor c : DyeColor.itemOrderedColors()){
+            doorIcons[c.itemMeta] = TextureRegistry.getTexture("minecraft:item/door_" + c.colorID);
+        }
+    }
+    public DoorPaintedItemModel(Item item) {
+        super(item, null);
+    }
+    public @NotNull IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+        int meta = itemStack.getMetadata();
+        return doorIcons[meta & DyeColor.MASK_COLOR];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java b/src/main/java/net/minecraft/client/render/item/model/DyeItemModel.java
similarity index 50%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java
rename to src/main/java/net/minecraft/client/render/item/model/DyeItemModel.java
index c11055ee5..fde28dfa1 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDye.java
+++ b/src/main/java/net/minecraft/client/render/item/model/DyeItemModel.java
@@ -1,28 +1,27 @@
 package net.minecraft.client.render.item.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.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;
+import net.minecraft.core.util.helper.DyeColor;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public class ItemModelDye extends ItemModelStandard{
-    public static IconCoordinate[] dyeIcons = new IconCoordinate[16];
+public class DyeItemModel extends StandardItemModel {
+    public static IconCoordinate[] dyeIcons = new IconCoordinate[DyeColor.COLOR_AMOUNT];
     static {
-        for (int i = 0; i < 16; i++) {
-            dyeIcons[i] = TextureRegistry.getTexture("minecraft:item/dye_" + ItemDye.dyeColors[i]);
+        for (DyeColor c : DyeColor.itemOrderedColors()){
+            dyeIcons[c.itemMeta] = TextureRegistry.getTexture("minecraft:item/dye_" + c.colorID);
         }
     }
-    public ItemModelDye(Item item) {
+    public DyeItemModel(Item item) {
         super(item, null);
     }
 
     public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
         int meta = itemStack.getMetadata();
-        return dyeIcons[MathHelper.clamp(meta, 0, 15)];
+        return dyeIcons[meta & DyeColor.MASK_COLOR];
     }
 }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java b/src/main/java/net/minecraft/client/render/item/model/FishingRodItemModel.java
similarity index 60%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java
rename to src/main/java/net/minecraft/client/render/item/model/FishingRodItemModel.java
index 8a779de23..28da971ef 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelFishingRod.java
+++ b/src/main/java/net/minecraft/client/render/item/model/FishingRodItemModel.java
@@ -1,25 +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.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 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 {
+public class FishingRodItemModel extends StandardItemModel {
     protected IconCoordinate rodCast = TextureRegistry.getTexture("minecraft:item/tool_fishingrod_cast");
-    public ItemModelFishingRod(Item item, String namespace) {
+    public FishingRodItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
     @Override
     public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
-        if (entity instanceof EntityPlayer){
+        if (entity instanceof Player){
             // Use the cast fishing rod texture when holding a cast rod
-            if(itemStack == ((EntityPlayer) entity).getHeldItem() && ((EntityPlayer) entity).bobberEntity != null)
+            if(itemStack == ((Player) entity).getHeldItem() && ((Player) entity).bobberEntity != null)
             {
                 return rodCast;
             }
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 650fbe71f..65013fe00 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
@@ -4,11 +4,11 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import org.jetbrains.annotations.Nullable;
@@ -20,8 +20,8 @@ public abstract class ItemModel {
     public ItemModel(Item item){
         this.item = item;
     }
-    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){
+    public abstract void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, Player player, ItemStack stack, float partialTick);
+    public void renderItem(Tessellator tessellator, ItemRenderer renderer, Mob entityLiving, ItemStack itemStack){
         final Minecraft mc = Minecraft.getMinecraft(this);
         float brightness = entityLiving.getBrightness(1.0f);
         renderItem(tessellator, renderer, itemStack, entityLiving, brightness, true);
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 1775c1072..c22357a62 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
@@ -2,9 +2,11 @@ package net.minecraft.client.render.item.model;
 
 import net.minecraft.client.util.dispatch.Dispatcher;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.item.block.BlockItem;
 
 public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
     private static final ItemModelDispatcher instance = new ItemModelDispatcher();
@@ -30,208 +32,208 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
     }
 
     private ItemModelDispatcher() {
-        addDispatch(new ItemModelStandard(Item.toolShovelIron, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeIron, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeIron, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolFirestriker, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.foodApple, "minecraft"));
-        addDispatch(new ItemModelBow(Item.toolBow, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoArrow, "minecraft"));
-        addDispatch(new ItemModelCoal(Item.coal, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.diamond, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ingotIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ingotGold, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.toolSwordIron, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolSwordWood, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolShovelWood, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeWood, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeWood, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolSwordStone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolShovelStone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeStone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeStone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolSwordDiamond, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolShovelDiamond, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeDiamond, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeDiamond, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.stick, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.bowl, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodStewMushroom, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.toolSwordGold, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolShovelGold, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeGold, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeGold, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.string, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.featherChicken, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.sulphur, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.toolHoeWood, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolHoeStone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolHoeIron, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolHoeDiamond, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolHoeGold, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.seedsWheat, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.wheat, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodBread, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetLeather, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateLeather, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsLeather, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsLeather, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetChainmail, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateChainmail, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsChainmail, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsChainmail, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsIron, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetDiamond, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateDiamond, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsDiamond, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsDiamond, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetGold, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateGold, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsGold, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsGold, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.flint, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodPorkchopRaw, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodPorkchopCooked, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.painting, "minecraft"));
-        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());
-        addDispatch(new ItemModelStandard(Item.minecart, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.saddle, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.doorIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.dustRedstone, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoSnowball, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.boat, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.leather, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.bucketMilk, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.brickClay, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.clay, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.sugarcane, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.paper, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.book, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.slimeball, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.minecartChest, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.minecartFurnace, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.eggChicken, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.toolCompass, "minecraft"));
-        addDispatch(new ItemModelFishingRod(Item.toolFishingrod, "minecraft").setFull3D().setRotateWhenRendering());
-        addDispatch(new ItemModelStandard(Item.toolClock, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.dustGlowstone, "minecraft").setFullBright());
-        addDispatch(new ItemModelStandard(Item.foodFishRaw, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodFishCooked, "minecraft"));
-        addDispatch(new ItemModelDye(Item.dye));
-        addDispatch(new ItemModelStandard(Item.bone, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.dustSugar, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodCake, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodPumpkinPie, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.bed, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.repeater, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodCookie, "minecraft"));
-        addDispatch(new ItemModelMap(Item.map, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.toolShears, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.nethercoal, "minecraft").setFullBright());
-
-        addDispatch(new ItemModelStandard(Item.armorHelmetSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorChestplateSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorLeggingsSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.armorBootsSteel, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.toolSwordSteel, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolShovelSteel, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolPickaxeSteel, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolAxeSteel, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.toolHoeSteel, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.ingotSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ingotSteelCrude, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoFireball, "minecraft").setFullBright());
-        addDispatch(new ItemModelStandard(Item.armorQuiverGold, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.handcannonUnloaded, "minecraft").setFull3D());
-        addDispatch(new ItemModelStandard(Item.chainlink, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.cloth, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoChargeExplosive, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.handcannonLoaded, "minecraft").setFull3D().setFullBright());
-        addDispatch(new ItemModelStandard(Item.ammoArrowGold, "minecraft"));
-        addDispatch(new ItemModelQuiver(Item.armorQuiver, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.toolCalendar, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.oreRawGold, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.oreRawIron, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.quartz, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.olivine, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoPebble, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.foodCherry, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.bucketIcecream, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.ammoArrowPurple, "minecraft"));
-        addDispatch(new ItemModelLabel(Item.label, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.jar, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.lanternFireflyGreen, "minecraft").setFullBright());
-        addDispatch(new ItemModelStandard(Item.lanternFireflyBlue, "minecraft").setFullBright());
-        addDispatch(new ItemModelStandard(Item.lanternFireflyOrange, "minecraft").setFullBright());
-        addDispatch(new ItemModelStandard(Item.lanternFireflyRed, "minecraft").setFullBright());
-
-        addDispatch(new ItemModelStandard(Item.basket, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.flag, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.armorBootsIceskates, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.toolShearsSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.toolFirestrikerSteel, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.seedsPumpkin, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.seat, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.rope, "minecraft"));
-
-        addDispatch(new ItemModelStandard(Item.wandMonsterSpawner, "minecraft").setFull3D());
-
-        addDispatch(new ItemModelStandard(Item.record13, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordCat, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordBlocks, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordChirp, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordFar, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordMall, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordMellohi, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordStal, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordStrad, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordWard, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordWait, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.recordDog, "minecraft"));
-
-        addDispatch(new ItemModelBlock((ItemBlock) Block.torchCoal.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.torchRedstoneActive.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.glowstone.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.pumpkinCarvedActive.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.lampActive.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.portalParadise.asItem()).setFullBright());
-        addDispatch(new ItemModelBlock((ItemBlock) Block.portalNether.asItem()).setFullBright());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_IRON, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_IRON, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_IRON, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_FIRESTRIKER_IRON, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.FOOD_APPLE, "minecraft"));
+        addDispatch(new BowItemModel(Items.TOOL_BOW, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_ARROW, "minecraft"));
+        addDispatch(new CoalItemModel(Items.COAL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DIAMOND, "minecraft"));
+        addDispatch(new StandardItemModel(Items.INGOT_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.INGOT_GOLD, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_IRON, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_WOOD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_WOOD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_WOOD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_WOOD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_STONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_STONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_STONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_STONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_DIAMOND, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_DIAMOND, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_DIAMOND, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_DIAMOND, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.STICK, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.BOWL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_STEW_MUSHROOM, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_GOLD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_GOLD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_GOLD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_GOLD, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.STRING, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FEATHER_CHICKEN, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SULPHUR, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_WOOD, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_STONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_IRON, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_DIAMOND, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_GOLD, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.SEEDS_WHEAT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.WHEAT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_BREAD, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_LEATHER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_LEATHER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_LEATHER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_LEATHER, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_CHAINMAIL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_CHAINMAIL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_CHAINMAIL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_CHAINMAIL, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_IRON, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_DIAMOND, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_DIAMOND, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_DIAMOND, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_DIAMOND, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_GOLD, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.FLINT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_PORKCHOP_RAW, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_PORKCHOP_COOKED, "minecraft"));
+        addDispatch(new StandardItemModel(Items.PAINTING, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_APPLE_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SIGN, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DOOR_OAK, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DOOR_GLASS, "minecraft"));
+        addDispatch(new DoorPaintedItemModel(Items.DOOR_OAK_PAINTED));
+        addDispatch(new StandardItemModel(Items.BUCKET, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BUCKET_WATER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BUCKET_LAVA, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.MINECART, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SADDLE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DOOR_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DUST_REDSTONE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_SNOWBALL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BOAT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.LEATHER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BUCKET_MILK, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BRICK_CLAY, "minecraft"));
+        addDispatch(new StandardItemModel(Items.CLAY, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SUGARCANE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.PAPER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BOOK, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SLIMEBALL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.MINECART_CHEST, "minecraft"));
+        addDispatch(new StandardItemModel(Items.MINECART_FURNACE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.EGG_CHICKEN, "minecraft"));
+        addDispatch(new StandardItemModel(Items.TOOL_COMPASS, "minecraft"));
+        addDispatch(new FishingRodItemModel(Items.TOOL_FISHINGROD, "minecraft").setFull3D().setRotateWhenRendering());
+        addDispatch(new StandardItemModel(Items.TOOL_CLOCK, "minecraft"));
+        addDispatch(new StandardItemModel(Items.DUST_GLOWSTONE, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.FOOD_FISH_RAW, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_FISH_COOKED, "minecraft"));
+        addDispatch(new DyeItemModel(Items.DYE));
+        addDispatch(new StandardItemModel(Items.BONE, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.DUST_SUGAR, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_CAKE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_PUMPKIN_PIE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BED, "minecraft"));
+        addDispatch(new StandardItemModel(Items.REPEATER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_COOKIE, "minecraft"));
+        addDispatch(new MapItemModel(Items.MAP, "minecraft"));
+        addDispatch(new StandardItemModel(Items.TOOL_SHEARS, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.NETHERCOAL, "minecraft").setFullBright());
+
+        addDispatch(new StandardItemModel(Items.ARMOR_HELMET_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_CHESTPLATE_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_LEGGINGS_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_STEEL, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.TOOL_SWORD_STEEL, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_SHOVEL_STEEL, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_PICKAXE_STEEL, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_AXE_STEEL, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.TOOL_HOE_STEEL, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.INGOT_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.INGOT_STEEL_CRUDE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_FIREBALL, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.ARMOR_QUIVER_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.HANDCANNON_UNLOADED, "minecraft").setFull3D());
+        addDispatch(new StandardItemModel(Items.CHAINLINK, "minecraft"));
+        addDispatch(new StandardItemModel(Items.CLOTH, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_CHARGE_EXPLOSIVE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.HANDCANNON_LOADED, "minecraft").setFull3D().setFullBright());
+        addDispatch(new StandardItemModel(Items.AMMO_ARROW_GOLD, "minecraft"));
+        addDispatch(new QuiverItemModel(Items.ARMOR_QUIVER, "minecraft"));
+        addDispatch(new StandardItemModel(Items.TOOL_CALENDAR, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ORE_RAW_GOLD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.ORE_RAW_IRON, "minecraft"));
+        addDispatch(new StandardItemModel(Items.QUARTZ, "minecraft"));
+        addDispatch(new StandardItemModel(Items.OLIVINE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_PEBBLE, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FOOD_CHERRY, "minecraft"));
+        addDispatch(new StandardItemModel(Items.BUCKET_ICECREAM, "minecraft"));
+        addDispatch(new StandardItemModel(Items.AMMO_ARROW_PURPLE, "minecraft"));
+        addDispatch(new LabelItemModel(Items.LABEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.JAR, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.LANTERN_FIREFLY_GREEN, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.LANTERN_FIREFLY_BLUE, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.LANTERN_FIREFLY_ORANGE, "minecraft").setFullBright());
+        addDispatch(new StandardItemModel(Items.LANTERN_FIREFLY_RED, "minecraft").setFullBright());
+
+        addDispatch(new StandardItemModel(Items.BASKET, "minecraft"));
+        addDispatch(new StandardItemModel(Items.FLAG, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.ARMOR_BOOTS_ICESKATES, "minecraft"));
+        addDispatch(new StandardItemModel(Items.TOOL_SHEARS_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.TOOL_FIRESTRIKER_STEEL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SEEDS_PUMPKIN, "minecraft"));
+        addDispatch(new StandardItemModel(Items.SEAT, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.ROPE, "minecraft"));
+
+        addDispatch(new StandardItemModel(Items.WAND_MONSTER_SPAWNER, "minecraft").setFull3D());
+
+        addDispatch(new StandardItemModel(Items.RECORD_13, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_CAT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_BLOCKS, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_CHIRP, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_FAR, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_MALL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_MELLOHI, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_STAL, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_STRAD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_WARD, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_WAIT, "minecraft"));
+        addDispatch(new StandardItemModel(Items.RECORD_DOG, "minecraft"));
+
+        addDispatch(new BlockItemModel((BlockItem) Blocks.TORCH_COAL.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.TORCH_REDSTONE_ACTIVE.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.GLOWSTONE.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.PUMPKIN_CARVED_ACTIVE.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.LAMP_ACTIVE.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.PORTAL_PARADISE.asItem()).setFullBright());
+        addDispatch(new BlockItemModel((BlockItem) Blocks.PORTAL_NETHER.asItem()).setFullBright());
 
         for (int i = 0; i < Block.blocksList.length; i++) {
             if (Block.blocksList[i] == null) continue;
             Item item = Block.blocksList[i].asItem();
             if (dispatches.containsKey(item)) continue;
-            if (!(item instanceof ItemBlock)) continue;
-            addDispatch(new ItemModelBlock((ItemBlock) item));
+            if (!(item instanceof BlockItem)) continue;
+            addDispatch(new BlockItemModel((BlockItem) item));
         }
     }
 }
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
deleted file mode 100644
index 0152599b4..000000000
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDoorPainted.java
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-import org.jetbrains.annotations.NotNull;
-
-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 @NotNull 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/ItemModelNone.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelNone.java
index fcd3087d8..47b371ccb 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
@@ -3,10 +3,10 @@ package net.minecraft.client.render.item.model;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import org.jetbrains.annotations.Nullable;
 
@@ -18,7 +18,7 @@ public class ItemModelNone extends ItemModel{
     }
 
     @Override
-    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
+    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, Player player, ItemStack stack, float partialTick) {
 
     }
 
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java b/src/main/java/net/minecraft/client/render/item/model/LabelItemModel.java
similarity index 72%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java
rename to src/main/java/net/minecraft/client/render/item/model/LabelItemModel.java
index 6d0bfc378..4a68592b6 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelLabel.java
+++ b/src/main/java/net/minecraft/client/render/item/model/LabelItemModel.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.render.item.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.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{
+public class LabelItemModel extends StandardItemModel {
     protected IconCoordinate writtenLabel = TextureRegistry.getTexture("minecraft:item/label_written");
-    public ItemModelLabel(Item item, String namespace) {
+    public LabelItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java b/src/main/java/net/minecraft/client/render/item/model/MapItemModel.java
similarity index 78%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
rename to src/main/java/net/minecraft/client/render/item/model/MapItemModel.java
index 810d2da78..b2b99f46b 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
+++ b/src/main/java/net/minecraft/client/render/item/model/MapItemModel.java
@@ -9,27 +9,34 @@ import net.minecraft.client.render.PlayerSkinParser;
 import net.minecraft.client.render.entity.EntityRenderer;
 import net.minecraft.client.render.entity.PlayerRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.MapItem;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.saveddata.maps.ItemMapSavedData;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
 
-public class ItemModelMap extends ItemModelStandard {
+public class MapItemModel extends StandardItemModel {
     private final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
     private final MapItemRenderer renderMapInstance = new MapItemRenderer(mc.fontRenderer, mc.gameSettings, mc.renderEngine);
 
-    public ItemModelMap(Item item, String namespace) {
+    public MapItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
     @Override
-    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
-    	int blockX = MathHelper.floor_double(player.x);
-    	int blockY = MathHelper.floor_double(player.y);
-    	int blockZ = MathHelper.floor_double(player.z);
+    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, Player player, ItemStack stack, float partialTick) {
+    	int blockX = MathHelper.floor(player.x);
+    	int blockY = MathHelper.floor(player.y);
+    	int blockZ = MathHelper.floor(player.z);
     	
         // Apply appropriate brightness
         float brightness = 1.0f;
@@ -54,10 +61,10 @@ public class ItemModelMap extends ItemModelStandard {
         GL11.glTranslatef(0.0F, (-(1.0F - renderer.getEquippedProgress(partialTick)) * 1.2F - f_val * 0.5F) + 0.04F, zOff); // Place map at right distance from camera
         GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F);
         GL11.glRotatef(f_val * -85F, 0.0F, 0.0F, 1.0F);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         // Render both player arms
-        mc.renderEngine.loadDownloadableTexture(mc.thePlayer.skinURL, mc.thePlayer.getEntityTexture(), PlayerSkinParser.instance);
+        mc.renderEngine.bindDownloadableTexture(mc.thePlayer.skinURL, mc.thePlayer.getEntityTexture(), PlayerSkinParser.instance);
         PlayerRenderer playerRenderer = (PlayerRenderer) (EntityRenderer<? extends Entity>) EntityRenderDispatcher.instance.getRenderer(mc.thePlayer);
 
         GL11.glPushMatrix();
@@ -95,7 +102,7 @@ public class ItemModelMap extends ItemModelStandard {
         GL11.glNormal3f(0.0F, 0.0F, -1F);
 
         // Render paper background of map
-        mc.renderEngine.bindTexture(mc.renderEngine.getTexture("/misc/mapbg.png"));
+        mc.renderEngine.bindTexture(mc.renderEngine.loadTexture("/assets/minecraft/textures/misc/mapbg.png"));
         tessellator.startDrawingQuads();
         final byte expansion = 7; // makes the edges extend around the actual map data by a bit
         tessellator.addVertexWithUV(-expansion,     128 + expansion, 0.0D, 0.0D, 1.0D);
@@ -104,7 +111,15 @@ public class ItemModelMap extends ItemModelStandard {
         tessellator.addVertexWithUV(-expansion,     -expansion,      0.0D, 0.0D, 0.0D);
         tessellator.draw();
 
-        ItemMapSavedData mapData = Item.map.getOrCreateSavedData(stack, mc.theWorld);
+        ItemMapSavedData mapData = Items.MAP.getOrCreateSavedData(stack, mc.theWorld);
+        if (mapData == null) return;
         renderMapInstance.renderMap(mc.renderEngine, mapData, brightness);
     }
+    @Override
+    public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack){
+        if (!MapItem.hasInitialized(itemStack)){
+            return TextureRegistry.getTexture("minecraft:item/map_blank");
+        }
+        return super.getIcon(entity, itemStack);
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java b/src/main/java/net/minecraft/client/render/item/model/QuiverItemModel.java
similarity index 73%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
rename to src/main/java/net/minecraft/client/render/item/model/QuiverItemModel.java
index 78b1418d1..6567638d5 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelQuiver.java
+++ b/src/main/java/net/minecraft/client/render/item/model/QuiverItemModel.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.render.item.model;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.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{
+public class QuiverItemModel extends StandardItemModel {
     protected IconCoordinate quiverFull = TextureRegistry.getTexture("minecraft:item/armor_quiver_empty");
-    public ItemModelQuiver(Item item, String namespace) {
+    public QuiverItemModel(Item item, String namespace) {
         super(item, namespace);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java b/src/main/java/net/minecraft/client/render/item/model/StandardItemModel.java
similarity index 95%
rename from src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
rename to src/main/java/net/minecraft/client/render/item/model/StandardItemModel.java
index b14ac8af0..56d46e723 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
+++ b/src/main/java/net/minecraft/client/render/item/model/StandardItemModel.java
@@ -6,17 +6,18 @@ import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderEngine;
-import net.minecraft.client.render.stitcher.IconCoordinate;
-import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 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 org.lwjgl.opengl.GL12;
 
 import java.awt.*;
 import java.util.Random;
@@ -37,7 +38,7 @@ import static org.lwjgl.opengl.GL11.glRotated;
 import static org.lwjgl.opengl.GL11.glScaled;
 import static org.lwjgl.opengl.GL11.glTranslated;
 
-public class ItemModelStandard extends ItemModel{
+public class StandardItemModel extends ItemModel{
     final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
     public static final IconCoordinate ITEM_TEXTURE_MISSING = TextureRegistry.getTexture("minecraft:item/texture_missing");
     public static final IconCoordinate ITEM_TEXTURE_UNASSIGNED = TextureRegistry.getTexture("minecraft:item/texture_unassigned");
@@ -48,7 +49,7 @@ public class ItemModelStandard extends ItemModel{
     protected boolean pointInfrontOfPlayer = false;
     protected boolean itemfullBright = false;
 
-    public ItemModelStandard(Item item, String namespace) {
+    public StandardItemModel(Item item, String namespace) {
         super(item);
         if (namespace != null){
             icon = TextureRegistry.getTexture(namespace + ":item/" + item.getKey().substring("item.".length()).replace(".", "_"));
@@ -56,7 +57,7 @@ public class ItemModelStandard extends ItemModel{
     }
 
     @Override
-    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
+    public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, Player player, ItemStack stack, float partialTick) {
         float brightness = 1.0f;
         if(mc.fullbright || itemfullBright || LightmapHelper.isLightmapEnabled()) {
         	if(LightmapHelper.isLightmapEnabled()) {
@@ -78,7 +79,7 @@ public class ItemModelStandard extends ItemModel{
         GL11.glTranslatef(-animationProgress * 0.4F, MathHelper.sin(MathHelper.sqrt_float(swingProgress) * MathHelper.PI * 2.0F) * 0.2F, -animationProgress2 * 0.2F); // Makes swing travel in an arc
         GL11.glTranslatef(0.7F * distanceScale, -0.65F * distanceScale - (1.0F - renderer.getEquippedProgress(partialTick)) * 0.6F, -0.9F * distanceScale); // Positions hand in correct place on right side of screen
         GL11.glRotatef(45F, 0.0F, 1.0F, 0.0F); // 45 degrees tilt, makes it face more towards the camera
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         float animationProgress3 = MathHelper.sin(swingProgress * swingProgress * MathHelper.PI);
         GL11.glRotatef(-animationProgress3 * 20F, 0.0F, 1.0F, 0.0F);
@@ -140,7 +141,7 @@ public class ItemModelStandard extends ItemModel{
         glEnable(GL_CULL_FACE);
         IconCoordinate textureIndex = getIcon(mc.thePlayer, itemStack);
         GL11.glDisable(GL_LIGHTING);
-        textureIndex.parentAtlas.bindTexture();
+        textureIndex.parentAtlas.bind();
         if (useColor) {
             final int color = getColor(itemStack);
             final float r = (color >> 16 & 0xff) / 255F;
@@ -199,7 +200,7 @@ public class ItemModelStandard extends ItemModel{
         EntityRenderDispatcher renderDispatcher = EntityRenderDispatcher.instance;
         GL11.glScalef(0.5F, 0.5F, 0.5F);
         final IconCoordinate tex = getIcon(entity, itemstack);
-        tex.parentAtlas.bindTexture();
+        tex.parentAtlas.bind();
         if (useColor) {
             final int color = getColor(itemstack);
             final float r = (color >> 16 & 0xff) / 255F;
@@ -256,7 +257,7 @@ public class ItemModelStandard extends ItemModel{
         }
 
         IconCoordinate tex = getIcon(entity, itemStack);
-        tex.parentAtlas.bindTexture();
+        tex.parentAtlas.bind();
         int tileWidth = tex.width;
 
         float uMin = (float) tex.getIconUMin();
@@ -269,7 +270,7 @@ public class ItemModelStandard extends ItemModel{
 
         final float foon = (0.5f / 512);
         final float goon = 0.0625f * (16.0f / tileWidth);
-        GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         final float thickness = 0.0625f;
         final float pixelWidth = 1f/tileWidth;
 
@@ -355,7 +356,7 @@ public class ItemModelStandard extends ItemModel{
         }
         tessellator.draw();
 
-        GL11.glDisable(32826 /*GL_RESCALE_NORMAL_EXT*/);
+        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glDisable(GL_BLEND);
     }
 
@@ -458,22 +459,22 @@ public class ItemModelStandard extends ItemModel{
 
     }
 
-    public ItemModelStandard setFull3D()
+    public StandardItemModel setFull3D()
     {
         bFull3D = true;
         return this;
     }
-    public ItemModelStandard setRotateWhenRendering()
+    public StandardItemModel setRotateWhenRendering()
     {
         rotateWhenRendering = true;
         return this;
     }
-    public ItemModelStandard setPointInfrontOfPlayer()
+    public StandardItemModel setPointInfrontOfPlayer()
     {
         pointInfrontOfPlayer = true;
         return this;
     }
-    public ItemModelStandard setFullBright()
+    public StandardItemModel setFullBright()
     {
         itemfullBright = true;
         return this;
diff --git a/src/main/java/net/minecraft/client/render/model/ModelFlagBase.java b/src/main/java/net/minecraft/client/render/model/BaseFlagModel.java
similarity index 81%
rename from src/main/java/net/minecraft/client/render/model/ModelFlagBase.java
rename to src/main/java/net/minecraft/client/render/model/BaseFlagModel.java
index 7b5a5d2d4..61108cea2 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelFlagBase.java
+++ b/src/main/java/net/minecraft/client/render/model/BaseFlagModel.java
@@ -1,9 +1,9 @@
 package net.minecraft.client.render.model;
 
-public class ModelFlagBase {
+public class BaseFlagModel {
     public Cube flagBase;
 
-    public ModelFlagBase()
+    public BaseFlagModel()
     {
         flagBase = new Cube(0, 0);
         flagBase.addBox(-2F, 10F, -2F, 4, 2, 4, 0.0F);
diff --git a/src/main/java/net/minecraft/client/render/model/BaseModel.java b/src/main/java/net/minecraft/client/render/model/BaseModel.java
new file mode 100644
index 000000000..fa5a0c5a3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/BaseModel.java
@@ -0,0 +1,31 @@
+package net.minecraft.client.render.model;
+
+import net.minecraft.core.entity.Mob;
+
+public abstract class BaseModel
+{
+
+    public BaseModel()
+    {
+        isRiding = false;
+    }
+
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+    }
+
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+    }
+
+    public void setLivingAnimations(Mob mob, float limbSwing, float limbYaw, float partialTick)
+    {
+    }
+
+    public void onUnload(){
+
+    }
+
+    public float onGround;
+    public boolean isRiding;
+}
diff --git a/src/main/java/net/minecraft/client/render/model/BipedModel.java b/src/main/java/net/minecraft/client/render/model/BipedModel.java
new file mode 100644
index 000000000..94b0b9fec
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/BipedModel.java
@@ -0,0 +1,170 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BaseModel, ModelRenderer, MathHelper
+
+import net.minecraft.core.util.helper.MathHelper;
+
+public class BipedModel extends BaseModel
+{
+    public Cube head;
+    public Cube hair;
+    public Cube body;
+    public Cube arm0;
+    public Cube arm1;
+    public Cube leg0;
+    public Cube leg1;
+    public Cube ear;
+    public Cube cloak;
+    public boolean holdingLeftHand;
+    public boolean holdingRightHand;
+    public boolean sneaking;
+
+
+    public BipedModel()
+    {
+        this(0.0F);
+    }
+
+    public BipedModel(float expansion)
+    {
+        this(expansion, 0.0F);
+    }
+
+    public BipedModel(float expansion, float yRotOffset)
+    {
+        holdingLeftHand = false;
+        holdingRightHand = false;
+        sneaking = false;
+        cloak = new Cube(0, 0);
+        cloak.addBox(-5F, 0.0F, -1F, 10, 16, 1, expansion);
+        ear = new Cube(24, 0);
+        ear.addBox(-3F, -6F, -1F, 6, 6, 1, expansion);
+        head = new Cube(0, 0);
+        head.addBox(-4F, -8F, -4F, 8, 8, 8, expansion);
+        head.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        hair = new Cube(32, 0);
+        hair.addBox(-4F, -8F, -4F, 8, 8, 8, expansion + 0.5F);
+        hair.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        body = new Cube(16, 16);
+        body.addBox(-4F, 0.0F, -2F, 8, 12, 4, expansion);
+        body.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        arm0 = new Cube(40, 16);
+        arm0.addBox(-3F, -2F, -2F, 4, 12, 4, expansion);
+        arm0.setRotationPoint(-5F, 2.0F + yRotOffset, 0.0F);
+        arm1 = new Cube(40, 16);
+        arm1.mirror = true;
+        arm1.addBox(-1F, -2F, -2F, 4, 12, 4, expansion);
+        arm1.setRotationPoint(5F, 2.0F + yRotOffset, 0.0F);
+        leg0 = new Cube(0, 16);
+        leg0.addBox(-2F, 0.0F, -2F, 4, 12, 4, expansion);
+        leg0.setRotationPoint(-2F, 12F + yRotOffset, 0.0F);
+        leg1 = new Cube(0, 16);
+        leg1.mirror = true;
+        leg1.addBox(-2F, 0.0F, -2F, 4, 12, 4, expansion);
+        leg1.setRotationPoint(2.0F, 12F + yRotOffset, 0.0F);
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        head.render(scale);
+        body.render(scale);
+        arm0.render(scale);
+        arm1.render(scale);
+        leg0.render(scale);
+        leg1.render(scale);
+        hair.render(scale);
+    }
+
+    @Override
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        head.yRot = headYaw / 57.29578F;
+        head.xRot = headPitch / 57.29578F;
+        hair.yRot = head.yRot;
+        hair.xRot = head.xRot;
+        arm0.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 2.0F * limbYaw * 0.5F;
+        arm1.xRot = MathHelper.cos(limbSwing * 0.6662F) * 2.0F * limbYaw * 0.5F;
+        arm0.zRot = 0.0F;
+        arm1.zRot = 0.0F;
+        leg0.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+        leg1.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        leg0.yRot = 0.0F;
+        leg1.yRot = 0.0F;
+        if(isRiding)
+        {
+            arm0.xRot += -0.6283185F;
+            arm1.xRot += -0.6283185F;
+            leg0.xRot = -1.256637F;
+            leg1.xRot = -1.256637F;
+            leg0.yRot = 0.3141593F;
+            leg1.yRot = -0.3141593F;
+        }
+        if(holdingLeftHand)
+        {
+            arm1.xRot = arm1.xRot * 0.5F - 0.3141593F;
+        }
+        if(holdingRightHand)
+        {
+            arm0.xRot = arm0.xRot * 0.5F - 0.3141593F;
+        }
+        arm0.yRot = 0.0F;
+        arm1.yRot = 0.0F;
+        if(onGround > -9990F)
+        {
+            float f6 = onGround;
+            body.yRot = MathHelper.sin(MathHelper.sqrt_float(f6) * MathHelper.PI * 2.0F) * 0.2F;
+            arm0.z = MathHelper.sin(body.yRot) * 5F;
+            arm0.x = -MathHelper.cos(body.yRot) * 5F;
+            arm1.z = -MathHelper.sin(body.yRot) * 5F;
+            arm1.x = MathHelper.cos(body.yRot) * 5F;
+            arm0.yRot += body.yRot;
+            arm1.yRot += body.yRot;
+            arm1.xRot += body.yRot;
+            f6 = 1.0F - onGround;
+            f6 *= f6;
+            f6 *= f6;
+            f6 = 1.0F - f6;
+            float f7 = MathHelper.sin(f6 * MathHelper.PI);
+            float f8 = MathHelper.sin(onGround * MathHelper.PI) * -(head.xRot - 0.7F) * 0.75F;
+            arm0.xRot -= (double)f7 * 1.2D + (double)f8;
+            arm0.yRot += body.yRot * 2.0F;
+            arm0.zRot = MathHelper.sin(onGround * MathHelper.PI) * -0.4F;
+        }
+        if(sneaking)
+        {
+            body.xRot = 0.5F;
+            leg0.xRot -= 0.0F;
+            leg1.xRot -= 0.0F;
+            arm0.xRot += 0.4F;
+            arm1.xRot += 0.4F;
+            leg0.z = 4F;
+            leg1.z = 4F;
+            leg0.y = 9F;
+            leg1.y = 9F;
+            head.y = 1.0F;
+            hair.y = 1.0F;
+        } else
+        {
+            body.xRot = 0.0F;
+            leg0.z = 0.0F;
+            leg1.z = 0.0F;
+            leg0.y = 12F;
+            leg1.y = 12F;
+            head.y = 0.0F;
+            hair.y = 0.0F;
+        }
+        arm0.zRot += MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
+        arm1.zRot -= MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
+        arm0.xRot += MathHelper.sin(limbPitch * 0.067F) * 0.05F;
+        arm1.xRot -= MathHelper.sin(limbPitch * 0.067F) * 0.05F;
+    }
+
+    public void renderCloak(float scale)
+    {
+        cloak.render(scale);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/model/BoatModel.java b/src/main/java/net/minecraft/client/render/model/BoatModel.java
new file mode 100644
index 000000000..a2f287f7f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/BoatModel.java
@@ -0,0 +1,51 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BaseModel, ModelRenderer
+
+import net.minecraft.core.util.helper.MathHelper;
+
+public class BoatModel extends BaseModel
+{
+    public Cube[] boatSides;
+    public BoatModel()
+    {
+        boatSides = new Cube[5];
+        boatSides[0] = new Cube(0, 8);
+        boatSides[1] = new Cube(0, 0);
+        boatSides[2] = new Cube(0, 0);
+        boatSides[3] = new Cube(0, 0);
+        boatSides[4] = new Cube(0, 0);
+        byte w = 24;
+        byte d = 6;
+        byte h = 20;
+        byte yOff = 4;
+        boatSides[0].addBox(-w / 2, -h / 2 + 2, -3F, w, h - 4, 4, 0.0F);
+        boatSides[0].setRotationPoint(0.0F, 0 + yOff, 0.0F);
+        boatSides[1].addBox(-w / 2 + 2, -d - 1, -1F, w - 4, d, 2, 0.0F);
+        boatSides[1].setRotationPoint(-w / 2 + 1, 0 + yOff, 0.0F);
+        boatSides[2].addBox(-w / 2 + 2, -d - 1, -1F, w - 4, d, 2, 0.0F);
+        boatSides[2].setRotationPoint(w / 2 - 1, 0 + yOff, 0.0F);
+        boatSides[3].addBox(-w / 2 + 2, -d - 1, -1F, w - 4, d, 2, 0.0F);
+        boatSides[3].setRotationPoint(0.0F, 0 + yOff, -h / 2 + 1);
+        boatSides[4].addBox(-w / 2 + 2, -d - 1, -1F, w - 4, d, 2, 0.0F);
+        boatSides[4].setRotationPoint(0.0F, 0 + yOff, h / 2 - 1);
+        boatSides[0].xRot = MathHelper.PI / 2F;
+        boatSides[1].yRot = MathHelper.PI * 1.5F;
+        boatSides[2].yRot = MathHelper.PI / 2F;
+        boatSides[3].yRot = MathHelper.PI;
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        for(int i = 0; i < 5; i++)
+        {
+            boatSides[i].render(scale);
+        }
+
+    }
+
+
+}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelCannonball.java b/src/main/java/net/minecraft/client/render/model/CannonballModel.java
similarity index 65%
rename from src/main/java/net/minecraft/client/render/model/ModelCannonball.java
rename to src/main/java/net/minecraft/client/render/model/CannonballModel.java
index 2d2c54c90..9e2da7dce 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelCannonball.java
+++ b/src/main/java/net/minecraft/client/render/model/CannonballModel.java
@@ -2,12 +2,12 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer
+//            BaseModel, ModelRenderer
 
-public class ModelCannonball extends ModelBase
+public class CannonballModel extends BaseModel
 {
 
-    public ModelCannonball()
+    public CannonballModel()
     {
         ball = new Cube(0, 0);
         ball.addBox(0F, 0F, 0F, 8, 8, 8);
@@ -22,7 +22,7 @@ public class ModelCannonball extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
     }
 
diff --git a/src/main/java/net/minecraft/client/render/model/ModelChicken.java b/src/main/java/net/minecraft/client/render/model/ChickenModel.java
similarity index 50%
rename from src/main/java/net/minecraft/client/render/model/ModelChicken.java
rename to src/main/java/net/minecraft/client/render/model/ChickenModel.java
index 508702eea..58046c1b0 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelChicken.java
+++ b/src/main/java/net/minecraft/client/render/model/ChickenModel.java
@@ -2,46 +2,55 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
+//            BaseModel, ModelRenderer, MathHelper
 
 import net.minecraft.core.util.helper.MathHelper;
 
-public class ModelChicken extends ModelBase
+public class ChickenModel extends BaseModel
 {
+    public Cube head;
+    public Cube body;
+    public Cube rightLeg;
+    public Cube leftLeg;
+    public Cube rightWing;
+    public Cube leftWing;
+    public Cube bill;
+    public Cube chin;
+
 
-    public ModelChicken()
+    public ChickenModel()
     {
-        byte byte0 = 16;
+        byte yOff = 16;
         head = new Cube(0, 0);
         head.addBox(-2F, -6F, -2F, 4, 6, 3, 0.0F);
-        head.setRotationPoint(0.0F, -1 + byte0, -4F);
+        head.setRotationPoint(0.0F, -1 + yOff, -4F);
         bill = new Cube(14, 0);
         bill.addBox(-2F, -4F, -4F, 4, 2, 2, 0.0F);
-        bill.setRotationPoint(0.0F, -1 + byte0, -4F);
+        bill.setRotationPoint(0.0F, -1 + yOff, -4F);
         chin = new Cube(14, 4);
         chin.addBox(-1F, -2F, -3F, 2, 2, 2, 0.0F);
-        chin.setRotationPoint(0.0F, -1 + byte0, -4F);
+        chin.setRotationPoint(0.0F, -1 + yOff, -4F);
         body = new Cube(0, 9);
         body.addBox(-3F, -4F, -3F, 6, 8, 6, 0.0F);
-        body.setRotationPoint(0.0F, 0 + byte0, 0.0F);
+        body.setRotationPoint(0.0F, 0 + yOff, 0.0F);
         rightLeg = new Cube(26, 0);
         rightLeg.addBox(-1F, 0.0F, -3F, 3, 5, 3);
-        rightLeg.setRotationPoint(-2F, 3 + byte0, 1.0F);
+        rightLeg.setRotationPoint(-2F, 3 + yOff, 1.0F);
         leftLeg = new Cube(26, 0);
         leftLeg.addBox(-1F, 0.0F, -3F, 3, 5, 3);
-        leftLeg.setRotationPoint(1.0F, 3 + byte0, 1.0F);
+        leftLeg.setRotationPoint(1.0F, 3 + yOff, 1.0F);
         rightWing = new Cube(24, 13);
         rightWing.addBox(0.0F, 0.0F, -3F, 1, 4, 6);
-        rightWing.setRotationPoint(-4F, -3 + byte0, 0.0F);
+        rightWing.setRotationPoint(-4F, -3 + yOff, 0.0F);
         leftWing = new Cube(24, 13);
         leftWing.addBox(-1F, 0.0F, -3F, 1, 4, 6);
-        leftWing.setRotationPoint(4F, -3 + byte0, 0.0F);
+        leftWing.setRotationPoint(4F, -3 + yOff, 0.0F);
     }
 
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         head.render(scale);
         bill.render(scale);
         chin.render(scale);
@@ -53,27 +62,18 @@ public class ModelChicken extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        head.rotateAngleX = headPitch / 57.29578F;
-        head.rotateAngleY = headYaw / 57.29578F;
-        bill.rotateAngleX = head.rotateAngleX;
-        bill.rotateAngleY = head.rotateAngleY;
-        chin.rotateAngleX = head.rotateAngleX;
-        chin.rotateAngleY = head.rotateAngleY;
-        body.rotateAngleX = 1.570796F;
-        rightLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-        leftLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        rightWing.rotateAngleZ = limbPitch;
-        leftWing.rotateAngleZ = -limbPitch;
+        head.xRot = headPitch / 57.29578F;
+        head.yRot = headYaw / 57.29578F;
+        bill.xRot = head.xRot;
+        bill.yRot = head.yRot;
+        chin.xRot = head.xRot;
+        chin.yRot = head.yRot;
+        body.xRot = MathHelper.PI / 2F;
+        rightLeg.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+        leftLeg.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        rightWing.zRot = limbPitch;
+        leftWing.zRot = -limbPitch;
     }
-
-    public Cube head;
-    public Cube body;
-    public Cube rightLeg;
-    public Cube leftLeg;
-    public Cube rightWing;
-    public Cube leftWing;
-    public Cube bill;
-    public Cube chin;
 }
diff --git a/src/main/java/net/minecraft/client/render/model/ModelCow.java b/src/main/java/net/minecraft/client/render/model/CowModel.java
similarity index 59%
rename from src/main/java/net/minecraft/client/render/model/ModelCow.java
rename to src/main/java/net/minecraft/client/render/model/CowModel.java
index 71d092f5d..c591dd67e 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelCow.java
+++ b/src/main/java/net/minecraft/client/render/model/CowModel.java
@@ -2,12 +2,18 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelQuadruped, ModelRenderer
+//            QuadrupedModel, ModelRenderer
 
-public class ModelCow extends ModelQuadruped
+import net.minecraft.core.util.helper.MathHelper;
+
+public class CowModel extends QuadrupedModel
 {
+    Cube udders;
+    Cube horn1;
+    Cube horn2;
+
 
-    public ModelCow()
+    public CowModel()
     {
         super(12, 0.0F);
         head = new Cube(0, 0);
@@ -22,18 +28,18 @@ public class ModelCow extends ModelQuadruped
         udders = new Cube(52, 0);
         udders.addBox(-2F, -3F, 0.0F, 4, 6, 2, 0.0F);
         udders.setRotationPoint(0.0F, 14F, 6F);
-        udders.rotateAngleX = 1.570796F;
+        udders.xRot = MathHelper.PI / 2F;
         body = new Cube(18, 4);
         body.addBox(-6F, -10F, -7F, 12, 18, 10, 0.0F);
         body.setRotationPoint(0.0F, 5F, 2.0F);
-        leg1.rotationPointX--;
-        leg2.rotationPointX++;
-        leg1.rotationPointZ += 0.0F;
-        leg2.rotationPointZ += 0.0F;
-        leg3.rotationPointX--;
-        leg4.rotationPointX++;
-        leg3.rotationPointZ--;
-        leg4.rotationPointZ--;
+        leg1.x--;
+        leg2.x++;
+        leg1.z += 0.0F;
+        leg2.z += 0.0F;
+        leg3.x--;
+        leg4.x++;
+        leg3.z--;
+        leg4.z--;
     }
 
     @Override
@@ -46,16 +52,12 @@ public class ModelCow extends ModelQuadruped
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        super.setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        horn1.rotateAngleY = head.rotateAngleY;
-        horn1.rotateAngleX = head.rotateAngleX;
-        horn2.rotateAngleY = head.rotateAngleY;
-        horn2.rotateAngleX = head.rotateAngleX;
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        horn1.yRot = head.yRot;
+        horn1.xRot = head.xRot;
+        horn2.yRot = head.yRot;
+        horn2.xRot = head.xRot;
     }
-
-    Cube udders;
-    Cube horn1;
-    Cube horn2;
 }
diff --git a/src/main/java/net/minecraft/client/render/model/CreeperModel.java b/src/main/java/net/minecraft/client/render/model/CreeperModel.java
new file mode 100644
index 000000000..de86dc9be
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/CreeperModel.java
@@ -0,0 +1,73 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BaseModel, ModelRenderer, MathHelper
+
+import net.minecraft.core.util.helper.MathHelper;
+
+public class CreeperModel extends BaseModel
+{
+    public Cube head;
+    public Cube hair;
+    public Cube body;
+    public Cube leg1;
+    public Cube leg2;
+    public Cube leg3;
+    public Cube leg4;
+
+
+    public CreeperModel()
+    {
+        this(0.0F);
+    }
+
+    public CreeperModel(float expansion)
+    {
+        int yOff = 4;
+        head = new Cube(0, 0);
+        head.addBox(-4F, -6F, -4F, 8, 8, 8, expansion);
+        head.setRotationPoint(0.0F, yOff, 0.0F);
+        hair = new Cube(32, 0);
+        hair.addBox(-4F, -6F, -4F, 8, 8, 8, expansion + 0.5F);
+        hair.setRotationPoint(0.0F, yOff, 0.0F);
+        body = new Cube(16, 16);
+        body.addBox(-4F, 2.0F, -2F, 8, 12, 4, expansion);
+        body.setRotationPoint(0.0F, yOff, 0.0F);
+        leg1 = new Cube(0, 16);
+        leg1.addBox(-2F, 2.0F, -2F, 4, 6, 4, expansion);
+        leg1.setRotationPoint(-2F, 12 + yOff, 4F);
+        leg2 = new Cube(0, 16);
+        leg2.addBox(-2F, 2.0F, -2F, 4, 6, 4, expansion);
+        leg2.setRotationPoint(2.0F, 12 + yOff, 4F);
+        leg3 = new Cube(0, 16);
+        leg3.addBox(-2F, 2.0F, -2F, 4, 6, 4, expansion);
+        leg3.setRotationPoint(-2F, 12 + yOff, -4F);
+        leg4 = new Cube(0, 16);
+        leg4.addBox(-2F, 2.0F, -2F, 4, 6, 4, expansion);
+        leg4.setRotationPoint(2.0F, 12 + yOff, -4F);
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        head.render(scale);
+        body.render(scale);
+        leg1.render(scale);
+        leg2.render(scale);
+        leg3.render(scale);
+        leg4.render(scale);
+    }
+
+    @Override
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        head.yRot = headYaw / 57.29578F;
+        head.xRot = headPitch / 57.29578F;
+        leg1.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+        leg2.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        leg3.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        leg4.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/model/Cube.java b/src/main/java/net/minecraft/client/render/model/Cube.java
index 2ec5d7c8d..fc6be338a 100644
--- a/src/main/java/net/minecraft/client/render/model/Cube.java
+++ b/src/main/java/net/minecraft/client/render/model/Cube.java
@@ -11,20 +11,37 @@ import org.lwjgl.opengl.GL11;
 
 public class Cube
 {
+    private Vertex[] vertices;
+    private Polygon[] polygons;
+    private final int textureU;
+    private final int textureV;
+    private final int texWidth;
+    private final int texHeight;
+    public float x;
+    public float y;
+    public float z;
+    public float xRot;
+    public float yRot;
+    public float zRot;
+    private boolean compiled;
+    private int displayList;
+    public boolean mirror;
+    public boolean visible;
+    public boolean neverRender;
+
 
     public Cube(int u, int v, int texWidth, int texHeight)
     {
         compiled = false;
         displayList = 0;
         mirror = false;
-        showModel = true;
-        field_1402_i = false;
+        visible = true;
+        neverRender = false;
         textureU = u;
         textureV = v;
         this.texWidth = texWidth;
         this.texHeight = texHeight;
     }
-
     public Cube(int u, int v)
     {
         this(u, v, 64, 32);
@@ -42,8 +59,8 @@ public class Cube
 
     public void addBox(float minX, float minY, float minZ, int sizeX, int sizeY, int sizeZ, float expandAmount, boolean flipBottomUV)
     {
-        corners = new Vertex[8];
-        faces = new Polygon[6];
+        vertices = new Vertex[8];
+        polygons = new Polygon[6];
         float maxX = minX + (float)sizeX;
         float maxY = minY + (float)sizeY;
         float maxZ = minZ + (float)sizeZ;
@@ -67,55 +84,55 @@ public class Cube
         Vertex ptvMaxXMinYMaxZ = new Vertex(maxX, minY, maxZ, 0.0F, 8F);
         Vertex ptvMaxXMaxYMaxZ = new Vertex(maxX, maxY, maxZ, 8F, 8F);
         Vertex ptvMinXMaxYMaxZ = new Vertex(minX, maxY, maxZ, 8F, 0.0F);
-        corners[0] = ptvMinXMinYMinZ;
-        corners[1] = ptvMaxXMinYMinZ;
-        corners[2] = ptvMaxXMaxYMinZ;
-        corners[3] = ptvMinXMaxYMinZ;
-        corners[4] = ptvMinXMinYMaxZ;
-        corners[5] = ptvMaxXMinYMaxZ;
-        corners[6] = ptvMaxXMaxYMaxZ;
-        corners[7] = ptvMinXMaxYMaxZ;
-        faces[0] = new Polygon(
+        vertices[0] = ptvMinXMinYMinZ;
+        vertices[1] = ptvMaxXMinYMinZ;
+        vertices[2] = ptvMaxXMaxYMinZ;
+        vertices[3] = ptvMinXMaxYMinZ;
+        vertices[4] = ptvMinXMinYMaxZ;
+        vertices[5] = ptvMaxXMinYMaxZ;
+        vertices[6] = ptvMaxXMaxYMaxZ;
+        vertices[7] = ptvMinXMaxYMaxZ;
+        polygons[0] = new Polygon(
                 new Vertex[] { ptvMaxXMinYMaxZ, ptvMaxXMinYMinZ, ptvMaxXMaxYMinZ, ptvMaxXMaxYMaxZ },
                 textureU + sizeZ + sizeX, textureV + sizeZ,
                 textureU + sizeZ + sizeX + sizeZ, textureV + sizeZ + sizeY,
                 texWidth, texHeight
         );
-        faces[1] = new Polygon(
+        polygons[1] = new Polygon(
                 new Vertex[] { ptvMinXMinYMinZ, ptvMinXMinYMaxZ, ptvMinXMaxYMaxZ, ptvMinXMaxYMinZ },
                 textureU, textureV + sizeZ,
                 textureU + sizeZ, textureV + sizeZ + sizeY,
                 texWidth, texHeight
         );
-        faces[2] = new Polygon(
+        polygons[2] = new Polygon(
                 new Vertex[] { ptvMaxXMinYMaxZ, ptvMinXMinYMaxZ, ptvMinXMinYMinZ, ptvMaxXMinYMinZ },
                 textureU + sizeZ, textureV,
                 textureU + sizeZ + sizeX, textureV + sizeZ,
                 texWidth, texHeight
         );
         if(flipBottomUV) {
-            faces[3] = new Polygon(
+            polygons[3] = new Polygon(
                     new Vertex[] { ptvMaxXMaxYMaxZ, ptvMinXMaxYMaxZ, ptvMinXMaxYMinZ, ptvMaxXMaxYMinZ },
                     textureU + sizeZ + sizeX, textureV,
                     textureU + sizeZ + sizeX + sizeX, textureV + sizeZ,
                     texWidth, texHeight
             );
-            faces[3].invertNormal = true;
+            polygons[3].flipNormal = true;
         }else {
-            faces[3] = new Polygon(
+            polygons[3] = new Polygon(
                     new Vertex[] { ptvMaxXMaxYMinZ, ptvMinXMaxYMinZ, ptvMinXMaxYMaxZ, ptvMaxXMaxYMaxZ },
                     textureU + sizeZ + sizeX, textureV,
                     textureU + sizeZ + sizeX + sizeX, textureV + sizeZ,
                     texWidth, texHeight
             );
         }
-        faces[4] = new Polygon(
+        polygons[4] = new Polygon(
                 new Vertex[] { ptvMaxXMinYMinZ, ptvMinXMinYMinZ, ptvMinXMaxYMinZ, ptvMaxXMaxYMinZ },
                 textureU + sizeZ, textureV + sizeZ,
                 textureU + sizeZ + sizeX, textureV + sizeZ + sizeY,
                 texWidth, texHeight
         );
-        faces[5] = new Polygon(
+        polygons[5] = new Polygon(
                 new Vertex[] { ptvMinXMinYMaxZ, ptvMaxXMinYMaxZ, ptvMaxXMaxYMaxZ, ptvMinXMaxYMaxZ },
                 textureU + sizeZ + sizeX + sizeZ,
                 textureV + sizeZ, textureU + sizeZ + sizeX + sizeZ + sizeX,
@@ -123,167 +140,147 @@ public class Cube
         );
         if(mirror)
         {
-            for (Polygon face : faces) {
-                face.flipFace();
+            for (Polygon face : polygons) {
+                face.mirror();
             }
         }
     }
 
     public void setRotationPoint(float x, float y, float z)
     {
-        rotationPointX = x;
-        rotationPointY = y;
-        rotationPointZ = z;
+        this.x = x;
+        this.y = y;
+        this.z = z;
     }
 
     public void setRotationAngle(float x, float y, float z)
     {
-        rotateAngleX = x;
-        rotateAngleY = y;
-        rotateAngleZ = z;
+        xRot = x;
+        yRot = y;
+        zRot = z;
     }
 
     public void render(float scale)
     {
-        if(field_1402_i)
+        if(neverRender)
         {
             return;
         }
-        if(!showModel)
+        if(!visible)
         {
             return;
         }
         if(!compiled)
         {
-            compileDisplayList(scale);
+            compile(scale);
         }
-        if(rotateAngleX != 0.0F || rotateAngleY != 0.0F || rotateAngleZ != 0.0F)
+        if(xRot != 0.0F || yRot != 0.0F || zRot != 0.0F)
         {
             GL11.glPushMatrix();
-            GL11.glTranslatef(rotationPointX * scale, rotationPointY * scale, rotationPointZ * scale);
-            if(rotateAngleZ != 0.0F)
+            GL11.glTranslatef(x * scale, y * scale, z * scale);
+            if(zRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F);
+                GL11.glRotatef(zRot * 57.29578F, 0.0F, 0.0F, 1.0F);
             }
-            if(rotateAngleY != 0.0F)
+            if(yRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F);
+                GL11.glRotatef(yRot * 57.29578F, 0.0F, 1.0F, 0.0F);
             }
-            if(rotateAngleX != 0.0F)
+            if(xRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F);
+                GL11.glRotatef(xRot * 57.29578F, 1.0F, 0.0F, 0.0F);
             }
             GL11.glCallList(displayList);
             GL11.glPopMatrix();
         } else
-        if(rotationPointX != 0.0F || rotationPointY != 0.0F || rotationPointZ != 0.0F)
+        if(x != 0.0F || y != 0.0F || z != 0.0F)
         {
-            GL11.glTranslatef(rotationPointX * scale, rotationPointY * scale, rotationPointZ * scale);
+            GL11.glTranslatef(x * scale, y * scale, z * scale);
             GL11.glCallList(displayList);
-            GL11.glTranslatef(-rotationPointX * scale, -rotationPointY * scale, -rotationPointZ * scale);
+            GL11.glTranslatef(-x * scale, -y * scale, -z * scale);
         } else
         {
             GL11.glCallList(displayList);
         }
     }
 
-    public void renderWithRotation(float f)
+    public void renderWithRotation(float scale)
     {
-        if(field_1402_i)
+        if(neverRender)
         {
             return;
         }
-        if(!showModel)
+        if(!visible)
         {
             return;
         }
         if(!compiled)
         {
-            compileDisplayList(f);
+            compile(scale);
         }
         GL11.glPushMatrix();
-        GL11.glTranslatef(rotationPointX * f, rotationPointY * f, rotationPointZ * f);
-        if(rotateAngleY != 0.0F)
+        GL11.glTranslatef(x * scale, y * scale, z * scale);
+        if(yRot != 0.0F)
         {
-            GL11.glRotatef(rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F);
+            GL11.glRotatef(yRot * 57.29578F, 0.0F, 1.0F, 0.0F);
         }
-        if(rotateAngleX != 0.0F)
+        if(xRot != 0.0F)
         {
-            GL11.glRotatef(rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F);
+            GL11.glRotatef(xRot * 57.29578F, 1.0F, 0.0F, 0.0F);
         }
-        if(rotateAngleZ != 0.0F)
+        if(zRot != 0.0F)
         {
-            GL11.glRotatef(rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F);
+            GL11.glRotatef(zRot * 57.29578F, 0.0F, 0.0F, 1.0F);
         }
         GL11.glCallList(displayList);
         GL11.glPopMatrix();
     }
 
-    public void postRender(float f)
+    public void translateTo(float scale)
     {
-        if(field_1402_i)
+        if(neverRender)
         {
             return;
         }
-        if(!showModel)
+        if(!visible)
         {
             return;
         }
         if(!compiled)
         {
-            compileDisplayList(f);
+            compile(scale);
         }
-        if(rotateAngleX != 0.0F || rotateAngleY != 0.0F || rotateAngleZ != 0.0F)
+        if(xRot != 0.0F || yRot != 0.0F || zRot != 0.0F)
         {
-            GL11.glTranslatef(rotationPointX * f, rotationPointY * f, rotationPointZ * f);
-            if(rotateAngleZ != 0.0F)
+            GL11.glTranslatef(x * scale, y * scale, z * scale);
+            if(zRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F);
+                GL11.glRotatef(zRot * 57.29578F, 0.0F, 0.0F, 1.0F);
             }
-            if(rotateAngleY != 0.0F)
+            if(yRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F);
+                GL11.glRotatef(yRot * 57.29578F, 0.0F, 1.0F, 0.0F);
             }
-            if(rotateAngleX != 0.0F)
+            if(xRot != 0.0F)
             {
-                GL11.glRotatef(rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F);
+                GL11.glRotatef(xRot * 57.29578F, 1.0F, 0.0F, 0.0F);
             }
         } else
-        if(rotationPointX != 0.0F || rotationPointY != 0.0F || rotationPointZ != 0.0F)
+        if(x != 0.0F || y != 0.0F || z != 0.0F)
         {
-            GL11.glTranslatef(rotationPointX * f, rotationPointY * f, rotationPointZ * f);
+            GL11.glTranslatef(x * scale, y * scale, z * scale);
         }
     }
 
-    private void compileDisplayList(float f)
+    private void compile(float scale)
     {
         displayList = GLAllocation.generateDisplayLists(1);
-        GL11.glNewList(displayList, 4864 /*GL_COMPILE*/);
+        GL11.glNewList(displayList, GL11.GL_COMPILE);
         Tessellator tessellator = Tessellator.instance;
-        for(int i = 0; i < faces.length; i++)
-        {
-            faces[i].draw(tessellator, f);
+        for (Polygon polygon : polygons) {
+            polygon.render(tessellator, scale);
         }
-
         GL11.glEndList();
         compiled = true;
     }
-
-    private Vertex[] corners;
-    private Polygon[] faces;
-    private final int textureU;
-    private final int textureV;
-    private final int texWidth;
-    private final int texHeight;
-    public float rotationPointX;
-    public float rotationPointY;
-    public float rotationPointZ;
-    public float rotateAngleX;
-    public float rotateAngleY;
-    public float rotateAngleZ;
-    private boolean compiled;
-    private int displayList;
-    public boolean mirror;
-    public boolean showModel;
-    public boolean field_1402_i;
 }
diff --git a/src/main/java/net/minecraft/client/render/model/ModelFlag.java b/src/main/java/net/minecraft/client/render/model/FlagModel.java
similarity index 95%
rename from src/main/java/net/minecraft/client/render/model/ModelFlag.java
rename to src/main/java/net/minecraft/client/render/model/FlagModel.java
index 21b558cda..dfe5e5634 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelFlag.java
+++ b/src/main/java/net/minecraft/client/render/model/FlagModel.java
@@ -1,13 +1,13 @@
 package net.minecraft.client.render.model;
 
-public class ModelFlag {
+public class FlagModel {
     public Cube flagPole;
     public Cube flagPoleShort;
     public Cube flag;
     public Cube flagOverlay;
     public Cube flagBase;
 
-    public ModelFlag()
+    public FlagModel()
     {
         flagPole = new Cube(0, 0, 64, 48);
         flagPole.addBox(-1F, -22F, -1F, 2, 33, 2, 0.0F);
diff --git a/src/main/java/net/minecraft/client/render/model/GhastModel.java b/src/main/java/net/minecraft/client/render/model/GhastModel.java
new file mode 100644
index 000000000..e133d69be
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/GhastModel.java
@@ -0,0 +1,58 @@
+package net.minecraft.client.render.model;
+
+import net.minecraft.core.util.helper.MathHelper;
+
+import java.util.Random;
+
+// Referenced classes of package net.minecraft.src:
+//            BaseModel, ModelRenderer, MathHelper
+
+public class GhastModel extends BaseModel
+{
+
+    Cube body;
+    Cube[] tentacles;
+
+    public GhastModel()
+    {
+        tentacles = new Cube[9];
+        byte yOff = -16;
+        body = new Cube(0, 0);
+        body.addBox(-8F, -8F, -8F, 16, 16, 16);
+        body.y += 24 + yOff;
+        Random random = new Random(1660L);
+        for(int i = 0; i < tentacles.length; i++)
+        {
+            tentacles[i] = new Cube(0, 0);
+            float xo = (((((float)(i % 3) - (float)((i / 3) % 2) * 0.5F) + 0.25F) / 2.0F) * 2.0F - 1.0F) * 5F;
+            float yo = (((float)(i / 3) / 2.0F) * 2.0F - 1.0F) * 5F;
+            int len = random.nextInt(7) + 8;
+            tentacles[i].addBox(-1F, 0.0F, -1F, 2, len, 2);
+            tentacles[i].x = xo;
+            tentacles[i].z = yo;
+            tentacles[i].y = 31 + yOff;
+        }
+
+    }
+
+    @Override
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        for(int i = 0; i < tentacles.length; i++)
+        {
+            tentacles[i].xRot = 0.2F * MathHelper.sin(limbPitch * 0.3F + (float)i) + 0.4F;
+        }
+
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        body.render(scale);
+        for (Cube tentacle : tentacles) {
+            tentacle.render(scale);
+        }
+
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelMinecart.java b/src/main/java/net/minecraft/client/render/model/MinecartModel.java
similarity index 75%
rename from src/main/java/net/minecraft/client/render/model/ModelMinecart.java
rename to src/main/java/net/minecraft/client/render/model/MinecartModel.java
index 6297a3b58..f18602867 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelMinecart.java
+++ b/src/main/java/net/minecraft/client/render/model/MinecartModel.java
@@ -2,12 +2,14 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer
+//            BaseModel, ModelRenderer
 
-public class ModelMinecart extends ModelBase
+import net.minecraft.core.util.helper.MathHelper;
+
+public class MinecartModel extends BaseModel
 {
 
-    public ModelMinecart()
+    public MinecartModel()
     {
         sideModels = new Cube[7];
         sideModels[0] = new Cube(0, 10);
@@ -32,17 +34,17 @@ public class ModelMinecart extends ModelBase
         sideModels[3].setRotationPoint(0.0F, 0 + byte3, -byte2 / 2 + 1);
         sideModels[4].addBox(-byte0 / 2 + 2, -byte1 - 1, -1F, byte0 - 4, byte1, 2, 0.0F);
         sideModels[4].setRotationPoint(0.0F, 0 + byte3, byte2 / 2 - 1);
-        sideModels[0].rotateAngleX = 1.570796F;
-        sideModels[1].rotateAngleY = 4.712389F;
-        sideModels[2].rotateAngleY = 1.570796F;
-        sideModels[3].rotateAngleY = 3.141593F;
-        sideModels[5].rotateAngleX = -1.570796F;
+        sideModels[0].xRot = MathHelper.PI / 2F;
+        sideModels[1].yRot = MathHelper.PI * 1.5F;
+        sideModels[2].yRot = MathHelper.PI / 2F;
+        sideModels[3].yRot = MathHelper.PI;
+        sideModels[5].xRot = -MathHelper.PI / 2F;
     }
 
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        sideModels[5].rotationPointY = 4F - limbPitch;
+        sideModels[5].y = 4F - limbPitch;
         for(int i = 0; i < 6; i++)
         {
             sideModels[i].render(scale);
@@ -51,7 +53,7 @@ public class ModelMinecart extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
     }
 
diff --git a/src/main/java/net/minecraft/client/render/model/ModelBase.java b/src/main/java/net/minecraft/client/render/model/ModelBase.java
deleted file mode 100644
index 25d5d66f0..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelBase.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package net.minecraft.client.render.model;
-
-import net.minecraft.core.entity.EntityLiving;
-
-public abstract class ModelBase
-{
-
-    public ModelBase()
-    {
-        isRiding = false;
-    }
-
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-    }
-
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-    }
-
-    public void setLivingAnimations(EntityLiving entityliving, float limbSwing, float limbYaw, float partialTick)
-    {
-    }
-
-    public void onUnload(){
-
-    }
-
-    public float onGround;
-    public boolean isRiding;
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelBiped.java b/src/main/java/net/minecraft/client/render/model/ModelBiped.java
deleted file mode 100644
index 687aecd20..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelBiped.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
-
-import net.minecraft.core.util.helper.MathHelper;
-
-public class ModelBiped extends ModelBase
-{
-
-    public ModelBiped()
-    {
-        this(0.0F);
-    }
-
-    public ModelBiped(float f)
-    {
-        this(f, 0.0F);
-    }
-
-    public ModelBiped(float f, float f1)
-    {
-        field_1279_h = false;
-        field_1278_i = false;
-        isSneak = false;
-        bipedCloak = new Cube(0, 0);
-        bipedCloak.addBox(-5F, 0.0F, -1F, 10, 16, 1, f);
-        bipedEars = new Cube(24, 0);
-        bipedEars.addBox(-3F, -6F, -1F, 6, 6, 1, f);
-        bipedHead = new Cube(0, 0);
-        bipedHead.addBox(-4F, -8F, -4F, 8, 8, 8, f);
-        bipedHead.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedHeadOverlay = new Cube(32, 0);
-        bipedHeadOverlay.addBox(-4F, -8F, -4F, 8, 8, 8, f + 0.5F);
-        bipedHeadOverlay.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedBody = new Cube(16, 16);
-        bipedBody.addBox(-4F, 0.0F, -2F, 8, 12, 4, f);
-        bipedBody.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedRightArm = new Cube(40, 16);
-        bipedRightArm.addBox(-3F, -2F, -2F, 4, 12, 4, f);
-        bipedRightArm.setRotationPoint(-5F, 2.0F + f1, 0.0F);
-        bipedLeftArm = new Cube(40, 16);
-        bipedLeftArm.mirror = true;
-        bipedLeftArm.addBox(-1F, -2F, -2F, 4, 12, 4, f);
-        bipedLeftArm.setRotationPoint(5F, 2.0F + f1, 0.0F);
-        bipedRightLeg = new Cube(0, 16);
-        bipedRightLeg.addBox(-2F, 0.0F, -2F, 4, 12, 4, f);
-        bipedRightLeg.setRotationPoint(-2F, 12F + f1, 0.0F);
-        bipedLeftLeg = new Cube(0, 16);
-        bipedLeftLeg.mirror = true;
-        bipedLeftLeg.addBox(-2F, 0.0F, -2F, 4, 12, 4, f);
-        bipedLeftLeg.setRotationPoint(2.0F, 12F + f1, 0.0F);
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        bipedHead.render(scale);
-        bipedBody.render(scale);
-        bipedRightArm.render(scale);
-        bipedLeftArm.render(scale);
-        bipedRightLeg.render(scale);
-        bipedLeftLeg.render(scale);
-        bipedHeadOverlay.render(scale);
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        bipedHead.rotateAngleY = headYaw / 57.29578F;
-        bipedHead.rotateAngleX = headPitch / 57.29578F;
-        bipedHeadOverlay.rotateAngleY = bipedHead.rotateAngleY;
-        bipedHeadOverlay.rotateAngleX = bipedHead.rotateAngleX;
-        bipedRightArm.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 2.0F * limbYaw * 0.5F;
-        bipedLeftArm.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 2.0F * limbYaw * 0.5F;
-        bipedRightArm.rotateAngleZ = 0.0F;
-        bipedLeftArm.rotateAngleZ = 0.0F;
-        bipedRightLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-        bipedLeftLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        bipedRightLeg.rotateAngleY = 0.0F;
-        bipedLeftLeg.rotateAngleY = 0.0F;
-        if(isRiding)
-        {
-            bipedRightArm.rotateAngleX += -0.6283185F;
-            bipedLeftArm.rotateAngleX += -0.6283185F;
-            bipedRightLeg.rotateAngleX = -1.256637F;
-            bipedLeftLeg.rotateAngleX = -1.256637F;
-            bipedRightLeg.rotateAngleY = 0.3141593F;
-            bipedLeftLeg.rotateAngleY = -0.3141593F;
-        }
-        if(field_1279_h)
-        {
-            bipedLeftArm.rotateAngleX = bipedLeftArm.rotateAngleX * 0.5F - 0.3141593F;
-        }
-        if(field_1278_i)
-        {
-            bipedRightArm.rotateAngleX = bipedRightArm.rotateAngleX * 0.5F - 0.3141593F;
-        }
-        bipedRightArm.rotateAngleY = 0.0F;
-        bipedLeftArm.rotateAngleY = 0.0F;
-        if(onGround > -9990F)
-        {
-            float f6 = onGround;
-            bipedBody.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * 3.141593F * 2.0F) * 0.2F;
-            bipedRightArm.rotationPointZ = MathHelper.sin(bipedBody.rotateAngleY) * 5F;
-            bipedRightArm.rotationPointX = -MathHelper.cos(bipedBody.rotateAngleY) * 5F;
-            bipedLeftArm.rotationPointZ = -MathHelper.sin(bipedBody.rotateAngleY) * 5F;
-            bipedLeftArm.rotationPointX = MathHelper.cos(bipedBody.rotateAngleY) * 5F;
-            bipedRightArm.rotateAngleY += bipedBody.rotateAngleY;
-            bipedLeftArm.rotateAngleY += bipedBody.rotateAngleY;
-            bipedLeftArm.rotateAngleX += bipedBody.rotateAngleY;
-            f6 = 1.0F - onGround;
-            f6 *= f6;
-            f6 *= f6;
-            f6 = 1.0F - f6;
-            float f7 = MathHelper.sin(f6 * 3.141593F);
-            float f8 = MathHelper.sin(onGround * 3.141593F) * -(bipedHead.rotateAngleX - 0.7F) * 0.75F;
-            bipedRightArm.rotateAngleX -= (double)f7 * 1.2D + (double)f8;
-            bipedRightArm.rotateAngleY += bipedBody.rotateAngleY * 2.0F;
-            bipedRightArm.rotateAngleZ = MathHelper.sin(onGround * 3.141593F) * -0.4F;
-        }
-        if(isSneak)
-        {
-            bipedBody.rotateAngleX = 0.5F;
-            bipedRightLeg.rotateAngleX -= 0.0F;
-            bipedLeftLeg.rotateAngleX -= 0.0F;
-            bipedRightArm.rotateAngleX += 0.4F;
-            bipedLeftArm.rotateAngleX += 0.4F;
-            bipedRightLeg.rotationPointZ = 4F;
-            bipedLeftLeg.rotationPointZ = 4F;
-            bipedRightLeg.rotationPointY = 9F;
-            bipedLeftLeg.rotationPointY = 9F;
-            bipedHead.rotationPointY = 1.0F;
-            bipedHeadOverlay.rotationPointY = 1.0F;
-        } else
-        {
-            bipedBody.rotateAngleX = 0.0F;
-            bipedRightLeg.rotationPointZ = 0.0F;
-            bipedLeftLeg.rotationPointZ = 0.0F;
-            bipedRightLeg.rotationPointY = 12F;
-            bipedLeftLeg.rotationPointY = 12F;
-            bipedHead.rotationPointY = 0.0F;
-            bipedHeadOverlay.rotationPointY = 0.0F;
-        }
-        bipedRightArm.rotateAngleZ += MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
-        bipedLeftArm.rotateAngleZ -= MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
-        bipedRightArm.rotateAngleX += MathHelper.sin(limbPitch * 0.067F) * 0.05F;
-        bipedLeftArm.rotateAngleX -= MathHelper.sin(limbPitch * 0.067F) * 0.05F;
-    }
-
-    public void renderCloak(float f)
-    {
-        bipedCloak.render(f);
-    }
-
-    public Cube bipedHead;
-    public Cube bipedHeadOverlay;
-    public Cube bipedBody;
-    public Cube bipedRightArm;
-    public Cube bipedLeftArm;
-    public Cube bipedRightLeg;
-    public Cube bipedLeftLeg;
-    public Cube bipedEars;
-    public Cube bipedCloak;
-    public boolean field_1279_h;
-    public boolean field_1278_i;
-    public boolean isSneak;
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelBoat.java b/src/main/java/net/minecraft/client/render/model/ModelBoat.java
deleted file mode 100644
index 6547a243e..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelBoat.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer
-
-public class ModelBoat extends ModelBase
-{
-
-    public ModelBoat()
-    {
-        boatSides = new Cube[5];
-        boatSides[0] = new Cube(0, 8);
-        boatSides[1] = new Cube(0, 0);
-        boatSides[2] = new Cube(0, 0);
-        boatSides[3] = new Cube(0, 0);
-        boatSides[4] = new Cube(0, 0);
-        byte byte0 = 24;
-        byte byte1 = 6;
-        byte byte2 = 20;
-        byte byte3 = 4;
-        boatSides[0].addBox(-byte0 / 2, -byte2 / 2 + 2, -3F, byte0, byte2 - 4, 4, 0.0F);
-        boatSides[0].setRotationPoint(0.0F, 0 + byte3, 0.0F);
-        boatSides[1].addBox(-byte0 / 2 + 2, -byte1 - 1, -1F, byte0 - 4, byte1, 2, 0.0F);
-        boatSides[1].setRotationPoint(-byte0 / 2 + 1, 0 + byte3, 0.0F);
-        boatSides[2].addBox(-byte0 / 2 + 2, -byte1 - 1, -1F, byte0 - 4, byte1, 2, 0.0F);
-        boatSides[2].setRotationPoint(byte0 / 2 - 1, 0 + byte3, 0.0F);
-        boatSides[3].addBox(-byte0 / 2 + 2, -byte1 - 1, -1F, byte0 - 4, byte1, 2, 0.0F);
-        boatSides[3].setRotationPoint(0.0F, 0 + byte3, -byte2 / 2 + 1);
-        boatSides[4].addBox(-byte0 / 2 + 2, -byte1 - 1, -1F, byte0 - 4, byte1, 2, 0.0F);
-        boatSides[4].setRotationPoint(0.0F, 0 + byte3, byte2 / 2 - 1);
-        boatSides[0].rotateAngleX = 1.570796F;
-        boatSides[1].rotateAngleY = 4.712389F;
-        boatSides[2].rotateAngleY = 1.570796F;
-        boatSides[3].rotateAngleY = 3.141593F;
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        for(int i = 0; i < 5; i++)
-        {
-            boatSides[i].render(scale);
-        }
-
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-    }
-
-    public Cube boatSides[];
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelCreeper.java b/src/main/java/net/minecraft/client/render/model/ModelCreeper.java
deleted file mode 100644
index 74aed1023..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelCreeper.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
-
-import net.minecraft.core.util.helper.MathHelper;
-
-public class ModelCreeper extends ModelBase
-{
-
-    public ModelCreeper()
-    {
-        this(0.0F);
-    }
-
-    public ModelCreeper(float f)
-    {
-        int i = 4;
-        head = new Cube(0, 0);
-        head.addBox(-4F, -6F, -4F, 8, 8, 8, f);
-        head.setRotationPoint(0.0F, i, 0.0F);
-        field_1270_b = new Cube(32, 0);
-        field_1270_b.addBox(-4F, -6F, -4F, 8, 8, 8, f + 0.5F);
-        field_1270_b.setRotationPoint(0.0F, i, 0.0F);
-        body = new Cube(16, 16);
-        body.addBox(-4F, 2.0F, -2F, 8, 12, 4, f);
-        body.setRotationPoint(0.0F, i, 0.0F);
-        leg1 = new Cube(0, 16);
-        leg1.addBox(-2F, 2.0F, -2F, 4, 6, 4, f);
-        leg1.setRotationPoint(-2F, 12 + i, 4F);
-        leg2 = new Cube(0, 16);
-        leg2.addBox(-2F, 2.0F, -2F, 4, 6, 4, f);
-        leg2.setRotationPoint(2.0F, 12 + i, 4F);
-        leg3 = new Cube(0, 16);
-        leg3.addBox(-2F, 2.0F, -2F, 4, 6, 4, f);
-        leg3.setRotationPoint(-2F, 12 + i, -4F);
-        leg4 = new Cube(0, 16);
-        leg4.addBox(-2F, 2.0F, -2F, 4, 6, 4, f);
-        leg4.setRotationPoint(2.0F, 12 + i, -4F);
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        head.render(scale);
-        body.render(scale);
-        leg1.render(scale);
-        leg2.render(scale);
-        leg3.render(scale);
-        leg4.render(scale);
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        head.rotateAngleY = headYaw / 57.29578F;
-        head.rotateAngleX = headPitch / 57.29578F;
-        leg1.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-        leg2.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        leg3.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        leg4.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-    }
-
-    public Cube head;
-    public Cube field_1270_b;
-    public Cube body;
-    public Cube leg1;
-    public Cube leg2;
-    public Cube leg3;
-    public Cube leg4;
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelGhast.java b/src/main/java/net/minecraft/client/render/model/ModelGhast.java
deleted file mode 100644
index fdcff916a..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelGhast.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package net.minecraft.client.render.model;
-
-import net.minecraft.core.util.helper.MathHelper;
-
-import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
-
-public class ModelGhast extends ModelBase
-{
-
-    public ModelGhast()
-    {
-        tentacles = new Cube[9];
-        byte byte0 = -16;
-        body = new Cube(0, 0);
-        body.addBox(-8F, -8F, -8F, 16, 16, 16);
-        body.rotationPointY += 24 + byte0;
-        Random random = new Random(1660L);
-        for(int i = 0; i < tentacles.length; i++)
-        {
-            tentacles[i] = new Cube(0, 0);
-            float f = (((((float)(i % 3) - (float)((i / 3) % 2) * 0.5F) + 0.25F) / 2.0F) * 2.0F - 1.0F) * 5F;
-            float f1 = (((float)(i / 3) / 2.0F) * 2.0F - 1.0F) * 5F;
-            int j = random.nextInt(7) + 8;
-            tentacles[i].addBox(-1F, 0.0F, -1F, 2, j, 2);
-            tentacles[i].rotationPointX = f;
-            tentacles[i].rotationPointZ = f1;
-            tentacles[i].rotationPointY = 31 + byte0;
-        }
-
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        for(int i = 0; i < tentacles.length; i++)
-        {
-            tentacles[i].rotateAngleX = 0.2F * MathHelper.sin(limbPitch * 0.3F + (float)i) + 0.4F;
-        }
-
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        body.render(scale);
-        for(int i = 0; i < tentacles.length; i++)
-        {
-            tentacles[i].render(scale);
-        }
-
-    }
-
-    Cube body;
-    Cube tentacles[];
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelPlayer.java b/src/main/java/net/minecraft/client/render/model/ModelPlayer.java
deleted file mode 100644
index a03ffa5e6..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelPlayer.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package net.minecraft.client.render.model;
-
-import org.lwjgl.opengl.GL11;
-
-public class ModelPlayer extends ModelBiped {
-
-    public ModelPlayer(float f){
-        this(f, 0.0F);
-    }
-
-    public ModelPlayer(float f, float f1){
-        field_1279_h = false;
-        field_1278_i = false;
-        isSneak = false;
-        bipedCloak = new Cube(0, 0, 64, 32);
-        bipedCloak.addBox(-5F, 0.0F, -1F, 10, 16, 1, f, true);
-        bipedEars = new Cube(24, 0, 64, 64);
-        bipedEars.addBox(-3F, -6F, -1F, 6, 6, 1, f, true);
-        bipedLeftArmOverlay = new Cube(48, 48, 64, 64);
-        bipedLeftArmOverlay.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, f + 0.25F, true);
-        bipedLeftArmOverlay.setRotationPoint(5.0F, 2.0F, 0.0F);
-        bipedRightArmOverlay = new Cube(40, 32, 64, 64);
-        bipedRightArmOverlay.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, f + 0.25F, true);
-        bipedRightArmOverlay.setRotationPoint(-5.0F, 2.0F, 10.0F);
-        bipedLeftLegOverlay = new Cube(0, 48, 64, 64);
-        bipedLeftLegOverlay.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, f + 0.25F, true);
-        bipedLeftLegOverlay.setRotationPoint(1.9F, 12.0F, 0.0F);
-        bipedRightLegOverlay = new Cube(0, 32, 64, 64);
-        bipedRightLegOverlay.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, f + 0.25F, true);
-        bipedRightLegOverlay.setRotationPoint(-1.9F, 12.0F, 0.0F);
-        bipedBodyOverlay = new Cube(16, 32, 64, 64);
-        bipedBodyOverlay.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, f + 0.25F, true);
-        bipedBodyOverlay.setRotationPoint(0.0F, 0.0F, 0.0F);
-        this.bipedLeftArm = new Cube(32, 48, 64, 64);
-        this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, f, true);
-        this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F);
-        this.bipedLeftLeg = new Cube(16, 48, 64, 64);
-        this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, f, true);
-        this.bipedLeftLeg.setRotationPoint(1.9F, 12.0F, 0.0F);
-        bipedHead = new Cube(0, 0, 64, 64);
-        bipedHead.addBox(-4F, -8F, -4F, 8, 8, 8, f, true);
-        bipedHead.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedHeadOverlay = new Cube(32, 0, 64, 64);
-        bipedHeadOverlay.addBox(-4F, -8F, -4F, 8, 8, 8, f + 0.5F, true);
-        bipedHeadOverlay.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedBody = new Cube(16, 16, 64, 64);
-        bipedBody.addBox(-4F, 0.0F, -2F, 8, 12, 4, f, true);
-        bipedBody.setRotationPoint(0.0F, 0.0F + f1, 0.0F);
-        bipedRightArm = new Cube(40, 16, 64, 64);
-        bipedRightArm.addBox(-3F, -2F, -2F, 4, 12, 4, f, true);
-        bipedRightArm.setRotationPoint(-5F, 2.0F + f1, 0.0F);
-        bipedRightLeg = new Cube(0, 16, 64, 64);
-        bipedRightLeg.addBox(-2F, 0.0F, -2F, 4, 12, 4, f, true);
-        bipedRightLeg.setRotationPoint(-2F, 12F + f1, 0.0F);
-    }
-
-    @Override
-	public void render(float f, float f1, float limbPitch, float f3, float f4, float f5){
-        super.render(f, f1, limbPitch, f3, f4, f5);
-        GL11.glPushMatrix();
-        bipedLeftArmOverlay.render(f5);
-        bipedRightArmOverlay.render(f5);
-        bipedLeftLegOverlay.render(f5);
-        bipedRightLegOverlay.render(f5);
-        bipedBodyOverlay.render(f5);
-        GL11.glPopMatrix();
-    }
-
-    @Override
-	public void setRotationAngles(float f, float f1, float limbPitch, float f3,
-                                  float f4, float f5){
-        super.setRotationAngles(f, f1, limbPitch, f3, f4, f5);
-        func_178685_a(this.bipedLeftLeg, this.bipedLeftLegOverlay);
-        func_178685_a(this.bipedRightLeg, this.bipedRightLegOverlay);
-        func_178685_a(this.bipedLeftArm, this.bipedLeftArmOverlay);
-        func_178685_a(this.bipedRightArm, this.bipedRightArmOverlay);
-        func_178685_a(this.bipedBody, this.bipedBodyOverlay);
-    }
-
-    public static void func_178685_a(Cube p_178685_0_, Cube p_178685_1_)
-    {
-        p_178685_1_.rotateAngleX = p_178685_0_.rotateAngleX;
-        p_178685_1_.rotateAngleY = p_178685_0_.rotateAngleY;
-        p_178685_1_.rotateAngleZ = p_178685_0_.rotateAngleZ;
-        p_178685_1_.rotationPointX = p_178685_0_.rotationPointX;
-        p_178685_1_.rotationPointY = p_178685_0_.rotationPointY;
-        p_178685_1_.rotationPointZ = p_178685_0_.rotationPointZ;
-    }
-
-    @Override
-	public void renderCloak(float f)
-    {
-        this.bipedCloak.render(f);
-    }
-
-    public Cube bipedLeftArmOverlay;
-    public Cube bipedRightArmOverlay;
-    public Cube bipedLeftLegOverlay;
-    public Cube bipedRightLegOverlay;
-    public Cube bipedBodyOverlay;
-
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/ModelPlayerSlim.java b/src/main/java/net/minecraft/client/render/model/ModelPlayerSlim.java
deleted file mode 100644
index 224c172c8..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelPlayerSlim.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package net.minecraft.client.render.model;
-
-public class ModelPlayerSlim extends ModelPlayer {
-
-    public ModelPlayerSlim(float f) {
-        this(f, 0f);
-    }
-
-    public ModelPlayerSlim(float f, float f1){
-        super(f, f1);
-        bipedLeftArmOverlay = new Cube(48, 48, 64, 64);
-        bipedLeftArmOverlay.addBox(-1.0F, -2.0F, -2.0F, 3, 12, 4, f + 0.25F);
-        bipedLeftArmOverlay.setRotationPoint(5.0F, 2.5F, 0.0F);
-        bipedRightArmOverlay = new Cube(40, 32, 64, 64);
-        bipedRightArmOverlay.addBox(-2.0F, -2.0F, -2.0F, 3, 12, 4, f + 0.25F);
-        bipedRightArmOverlay.setRotationPoint(-5.0F, 2.5F, 10.0F);
-        bipedLeftArm = new Cube(32, 48, 64, 64);
-        bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 3, 12, 4, f);
-        bipedLeftArm.setRotationPoint(5.0F, 2.5F, 0.0F);
-        bipedRightArm = new Cube(40, 16, 64, 64);
-        bipedRightArm.addBox(-2F, -2F, -2F, 3, 12, 4, f);
-        bipedRightArm.setRotationPoint(-5F, 2.5F + f1, 0.0F);
-
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java b/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java
deleted file mode 100644
index 67dcf5de7..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelQuadruped, ModelRenderer
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.core.Global;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntitySheep;
-import org.lwjgl.opengl.GL11;
-
-public class ModelSheepOverlay extends ModelSheep
-{
-    EntityLiving sheep;
-
-    public ModelSheepOverlay()
-    {
-        super();
-    }
-
-    @Override
-    public void setLivingAnimations(EntityLiving entityliving, float limbSwing, float limbYaw, float partialTick)
-    {
-        super.setLivingAnimations(entityliving, limbSwing, limbYaw, partialTick);
-        this.sheep = entityliving;
-        float brightness = sheep.getBrightness(limbSwing);
-        if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) brightness = 1.0f;
-        int j = ((EntitySheep)sheep).getFleeceColor();
-        GL11.glColor3f(brightness * EntitySheep.fleeceColorTable[j][0], brightness * EntitySheep.fleeceColorTable[j][1], brightness * EntitySheep.fleeceColorTable[j][2]);
-
-    }
-
-    @Override
-    public void onUnload(){
-        sheep = null;
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float ticksExisted, float headYaw, float headPitch, float scale)
-    {
-        super.render(limbSwing, limbYaw, ticksExisted, headYaw, headPitch, scale);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSkeleton.java b/src/main/java/net/minecraft/client/render/model/ModelSkeleton.java
deleted file mode 100644
index 89037b966..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelSkeleton.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelZombie, ModelRenderer
-
-public class ModelSkeleton extends ModelZombie
-{
-
-    public ModelSkeleton()
-    {
-        float f = 0.0F;
-        bipedRightArm = new Cube(40, 16);
-        bipedRightArm.addBox(-1F, -2F, -1F, 2, 12, 2, f);
-        bipedRightArm.setRotationPoint(-5F, 2.0F, 0.0F);
-        bipedLeftArm = new Cube(40, 16);
-        bipedLeftArm.mirror = true;
-        bipedLeftArm.addBox(-1F, -2F, -1F, 2, 12, 2, f);
-        bipedLeftArm.setRotationPoint(5F, 2.0F, 0.0F);
-        bipedRightLeg = new Cube(0, 16);
-        bipedRightLeg.addBox(-1F, 0.0F, -1F, 2, 12, 2, f);
-        bipedRightLeg.setRotationPoint(-2F, 12F, 0.0F);
-        bipedLeftLeg = new Cube(0, 16);
-        bipedLeftLeg.mirror = true;
-        bipedLeftLeg.addBox(-1F, 0.0F, -1F, 2, 12, 2, f);
-        bipedLeftLeg.setRotationPoint(2.0F, 12F, 0.0F);
-    }
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSquid.java b/src/main/java/net/minecraft/client/render/model/ModelSquid.java
deleted file mode 100644
index 8b1404e3f..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelSquid.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer
-
-public class ModelSquid extends ModelBase
-{
-
-    public ModelSquid()
-    {
-        squidTentacles = new Cube[8];
-        byte byte0 = -16;
-        squidBody = new Cube(0, 0);
-        squidBody.addBox(-6F, -8F, -6F, 12, 16, 12);
-        squidBody.rotationPointY += 24 + byte0;
-        for(int i = 0; i < squidTentacles.length; i++)
-        {
-            squidTentacles[i] = new Cube(48, 0);
-            double d = ((double)i * 3.1415926535897931D * 2D) / (double)squidTentacles.length;
-            float f = (float)Math.cos(d) * 5F;
-            float f1 = (float)Math.sin(d) * 5F;
-            squidTentacles[i].addBox(-1F, 0.0F, -1F, 2, 18, 2);
-            squidTentacles[i].rotationPointX = f;
-            squidTentacles[i].rotationPointZ = f1;
-            squidTentacles[i].rotationPointY = 31 + byte0;
-            d = ((double)i * 3.1415926535897931D * -2D) / (double)squidTentacles.length + 1.5707963267948966D;
-            squidTentacles[i].rotateAngleY = (float)d;
-        }
-
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        for(int i = 0; i < squidTentacles.length; i++)
-        {
-            squidTentacles[i].rotateAngleX = limbPitch;
-        }
-
-    }
-
-    @Override
-    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
-    {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        squidBody.render(scale);
-        for(int i = 0; i < squidTentacles.length; i++)
-        {
-            squidTentacles[i].render(scale);
-        }
-
-    }
-
-    Cube squidBody;
-    Cube squidTentacles[];
-}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelZombie.java b/src/main/java/net/minecraft/client/render/model/ModelZombie.java
deleted file mode 100644
index bcc3b24e1..000000000
--- a/src/main/java/net/minecraft/client/render/model/ModelZombie.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package net.minecraft.client.render.model;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ModelBiped, MathHelper, ModelRenderer
-
-import net.minecraft.core.util.helper.MathHelper;
-
-public class ModelZombie extends ModelBiped {
-    public ModelZombie() {
-        this(0.0F);
-    }
-
-    public ModelZombie(float var1) {
-        this.parts(var1, 0.0F);
-    }
-
-    public void parts(float var1, float var2) {
-        this.field_1279_h = false;
-        this.field_1278_i = false;
-        this.isSneak = false;
-        this.bipedCloak = new Cube(0, 0);
-        this.bipedCloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, var1);
-        this.bipedEars = new Cube(24, 0);
-        this.bipedEars.addBox(-4.0F, -7.0F, -1.0F, 7, 7, 1, var1);
-        this.bipedHead = new Cube(0, 0);
-        this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1);
-        this.bipedHead.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
-        this.bipedHeadOverlay = new Cube(32, 0);
-        this.bipedHeadOverlay.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F);
-        this.bipedHeadOverlay.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
-        this.bipedBody = new Cube(16, 16);
-        this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1);
-        this.bipedBody.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
-        this.bipedRightArm = new Cube(40, 16);
-        this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, var1);
-        this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + var2, 0.0F);
-        this.bipedLeftArm = new Cube(40, 16);
-        this.bipedLeftArm.mirror = true;
-        this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, var1);
-        this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + var2, 0.0F);
-        this.bipedRightLeg = new Cube(0, 16);
-        this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
-        this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F + var2, 0.0F);
-        this.bipedLeftLeg = new Cube(0, 16);
-        this.bipedLeftLeg.mirror = true;
-        this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
-        this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F + var2, 0.0F);
-    }
-
-    @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale) {
-        super.setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        float var7 = MathHelper.sin(this.onGround * 3.1415927F);
-        float var8 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * 3.1415927F);
-        this.bipedRightArm.rotateAngleZ = 0.0F;
-        this.bipedLeftArm.rotateAngleZ = 0.0F;
-        this.bipedRightArm.rotateAngleY = -(0.1F - var7 * 0.6F);
-        this.bipedLeftArm.rotateAngleY = 0.1F - var7 * 0.6F;
-        this.bipedRightArm.rotateAngleX = -1.5707964F;
-        this.bipedLeftArm.rotateAngleX = -1.5707964F;
-        Cube var10000 = this.bipedRightArm;
-        var10000.rotateAngleX -= var7 * 1.2F - var8 * 0.4F;
-        var10000 = this.bipedLeftArm;
-        var10000.rotateAngleX -= var7 * 1.2F - var8 * 0.4F;
-        var10000 = this.bipedRightArm;
-        var10000.rotateAngleZ += MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
-        var10000 = this.bipedLeftArm;
-        var10000.rotateAngleZ -= MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
-        var10000 = this.bipedRightArm;
-        var10000.rotateAngleX += MathHelper.sin(limbPitch * 0.067F) * 0.05F;
-        var10000 = this.bipedLeftArm;
-        var10000.rotateAngleX -= MathHelper.sin(limbPitch * 0.067F) * 0.05F;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/ModelPig.java b/src/main/java/net/minecraft/client/render/model/PigModel.java
similarity index 56%
rename from src/main/java/net/minecraft/client/render/model/ModelPig.java
rename to src/main/java/net/minecraft/client/render/model/PigModel.java
index 98c9b662e..c0098cf0a 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelPig.java
+++ b/src/main/java/net/minecraft/client/render/model/PigModel.java
@@ -2,17 +2,17 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelQuadruped
+//            QuadrupedModel
 
-public class ModelPig extends ModelQuadruped
+public class PigModel extends QuadrupedModel
 {
 
-    public ModelPig()
+    public PigModel()
     {
         this(0.0F);
     }
 
-    public ModelPig(float f)
+    public PigModel(float f)
     {
         super(6, f);
         nose = new Cube(16, 16);
@@ -27,10 +27,10 @@ public class ModelPig extends ModelQuadruped
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale) {
-        super.setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        nose.rotateAngleX = headPitch / 57.29578F;
-        nose.rotateAngleY = headYaw / 57.29578F;
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale) {
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        nose.xRot = headPitch / 57.29578F;
+        nose.yRot = headYaw / 57.29578F;
     }
 
     public Cube nose;
diff --git a/src/main/java/net/minecraft/client/render/model/PlayerModel.java b/src/main/java/net/minecraft/client/render/model/PlayerModel.java
new file mode 100644
index 000000000..da3e632f2
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/PlayerModel.java
@@ -0,0 +1,95 @@
+package net.minecraft.client.render.model;
+
+import org.lwjgl.opengl.GL11;
+
+public class PlayerModel extends BipedModel {
+
+    public Cube bipedLeftArmOverlay;
+    public Cube bipedRightArmOverlay;
+    public Cube bipedLeftLegOverlay;
+    public Cube bipedRightLegOverlay;
+    public Cube bipedBodyOverlay;
+
+    public PlayerModel(float expansion){
+        this(expansion, 0.0F);
+    }
+
+    public PlayerModel(float expansion, float yRotOffset){
+        holdingLeftHand = false;
+        holdingRightHand = false;
+        sneaking = false;
+        cloak = new Cube(0, 0, 64, 32);
+        cloak.addBox(-5F, 0.0F, -1F, 10, 16, 1, expansion, true);
+        ear = new Cube(24, 0, 64, 64);
+        ear.addBox(-3F, -6F, -1F, 6, 6, 1, expansion, true);
+        bipedLeftArmOverlay = new Cube(48, 48, 64, 64);
+        bipedLeftArmOverlay.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, expansion + 0.25F, true);
+        bipedLeftArmOverlay.setRotationPoint(5.0F, 2.0F, 0.0F);
+        bipedRightArmOverlay = new Cube(40, 32, 64, 64);
+        bipedRightArmOverlay.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, expansion + 0.25F, true);
+        bipedRightArmOverlay.setRotationPoint(-5.0F, 2.0F, 10.0F);
+        bipedLeftLegOverlay = new Cube(0, 48, 64, 64);
+        bipedLeftLegOverlay.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, expansion + 0.25F, true);
+        bipedLeftLegOverlay.setRotationPoint(1.9F, 12.0F, 0.0F);
+        bipedRightLegOverlay = new Cube(0, 32, 64, 64);
+        bipedRightLegOverlay.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, expansion + 0.25F, true);
+        bipedRightLegOverlay.setRotationPoint(-1.9F, 12.0F, 0.0F);
+        bipedBodyOverlay = new Cube(16, 32, 64, 64);
+        bipedBodyOverlay.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, expansion + 0.25F, true);
+        bipedBodyOverlay.setRotationPoint(0.0F, 0.0F, 0.0F);
+        this.arm1 = new Cube(32, 48, 64, 64);
+        this.arm1.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, expansion, true);
+        this.arm1.setRotationPoint(5.0F, 2.0F, 0.0F);
+        this.leg1 = new Cube(16, 48, 64, 64);
+        this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, expansion, true);
+        this.leg1.setRotationPoint(1.9F, 12.0F, 0.0F);
+        head = new Cube(0, 0, 64, 64);
+        head.addBox(-4F, -8F, -4F, 8, 8, 8, expansion, true);
+        head.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        hair = new Cube(32, 0, 64, 64);
+        hair.addBox(-4F, -8F, -4F, 8, 8, 8, expansion + 0.5F, true);
+        hair.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        body = new Cube(16, 16, 64, 64);
+        body.addBox(-4F, 0.0F, -2F, 8, 12, 4, expansion, true);
+        body.setRotationPoint(0.0F, 0.0F + yRotOffset, 0.0F);
+        arm0 = new Cube(40, 16, 64, 64);
+        arm0.addBox(-3F, -2F, -2F, 4, 12, 4, expansion, true);
+        arm0.setRotationPoint(-5F, 2.0F + yRotOffset, 0.0F);
+        leg0 = new Cube(0, 16, 64, 64);
+        leg0.addBox(-2F, 0.0F, -2F, 4, 12, 4, expansion, true);
+        leg0.setRotationPoint(-2F, 12F + yRotOffset, 0.0F);
+    }
+
+    @Override
+	public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale){
+        super.render(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        GL11.glPushMatrix();
+        bipedLeftArmOverlay.render(scale);
+        bipedRightArmOverlay.render(scale);
+        bipedLeftLegOverlay.render(scale);
+        bipedRightLegOverlay.render(scale);
+        bipedBodyOverlay.render(scale);
+        GL11.glPopMatrix();
+    }
+
+    @Override
+	public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale){
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        copyTranslation(this.leg1, this.bipedLeftLegOverlay);
+        copyTranslation(this.leg0, this.bipedRightLegOverlay);
+        copyTranslation(this.arm1, this.bipedLeftArmOverlay);
+        copyTranslation(this.arm0, this.bipedRightArmOverlay);
+        copyTranslation(this.body, this.bipedBodyOverlay);
+    }
+
+    public static void copyTranslation(Cube sourceCube, Cube destinationCube)
+    {
+        destinationCube.xRot = sourceCube.xRot;
+        destinationCube.yRot = sourceCube.yRot;
+        destinationCube.zRot = sourceCube.zRot;
+        destinationCube.x = sourceCube.x;
+        destinationCube.y = sourceCube.y;
+        destinationCube.z = sourceCube.z;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/PlayerSlimModel.java b/src/main/java/net/minecraft/client/render/model/PlayerSlimModel.java
new file mode 100644
index 000000000..3e6238cc8
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/PlayerSlimModel.java
@@ -0,0 +1,26 @@
+package net.minecraft.client.render.model;
+
+public class PlayerSlimModel extends PlayerModel {
+
+    public PlayerSlimModel(float f) {
+        this(f, 0f);
+    }
+
+    public PlayerSlimModel(float expansion, float yRotOffset){
+        super(expansion, yRotOffset);
+        bipedLeftArmOverlay = new Cube(48, 48, 64, 64);
+        bipedLeftArmOverlay.addBox(-1.0F, -2.0F, -2.0F, 3, 12, 4, expansion + 0.25F);
+        bipedLeftArmOverlay.setRotationPoint(5.0F, 2.5F, 0.0F);
+        bipedRightArmOverlay = new Cube(40, 32, 64, 64);
+        bipedRightArmOverlay.addBox(-2.0F, -2.0F, -2.0F, 3, 12, 4, expansion + 0.25F);
+        bipedRightArmOverlay.setRotationPoint(-5.0F, 2.5F, 10.0F);
+        arm1 = new Cube(32, 48, 64, 64);
+        arm1.addBox(-1.0F, -2.0F, -2.0F, 3, 12, 4, expansion);
+        arm1.setRotationPoint(5.0F, 2.5F, 0.0F);
+        arm0 = new Cube(40, 16, 64, 64);
+        arm0.addBox(-2F, -2F, -2F, 3, 12, 4, expansion);
+        arm0.setRotationPoint(-5F, 2.5F + yRotOffset, 0.0F);
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/ModelQuadruped.java b/src/main/java/net/minecraft/client/render/model/QuadrupedModel.java
similarity index 62%
rename from src/main/java/net/minecraft/client/render/model/ModelQuadruped.java
rename to src/main/java/net/minecraft/client/render/model/QuadrupedModel.java
index 245959bc2..d089d3f13 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelQuadruped.java
+++ b/src/main/java/net/minecraft/client/render/model/QuadrupedModel.java
@@ -2,14 +2,14 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
+//            BaseModel, ModelRenderer, MathHelper
 
 import net.minecraft.core.util.helper.MathHelper;
 
-public class ModelQuadruped extends ModelBase
+public class QuadrupedModel extends BaseModel
 {
 
-    public ModelQuadruped(int i, float f)
+    public QuadrupedModel(int i, float f)
     {
         head = new Cube(0, 0);
         head.addBox(-4F, -4F, -8F, 8, 8, 8, f);
@@ -34,7 +34,7 @@ public class ModelQuadruped extends ModelBase
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         head.render(scale);
         body.render(scale);
         leg1.render(scale);
@@ -44,15 +44,15 @@ public class ModelQuadruped extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        head.rotateAngleX = headPitch / 57.29578F;
-        head.rotateAngleY = headYaw / 57.29578F;
-        body.rotateAngleX = 1.570796F;
-        leg1.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-        leg2.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        leg3.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-        leg4.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+        head.xRot = headPitch / 57.29578F;
+        head.yRot = headYaw / 57.29578F;
+        body.xRot = MathHelper.PI / 2F;
+        leg1.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+        leg2.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        leg3.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+        leg4.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
     }
 
     public Cube head;
diff --git a/src/main/java/net/minecraft/client/render/model/ModelScorpion.java b/src/main/java/net/minecraft/client/render/model/ScorpionModel.java
similarity index 87%
rename from src/main/java/net/minecraft/client/render/model/ModelScorpion.java
rename to src/main/java/net/minecraft/client/render/model/ScorpionModel.java
index 20c14579e..285c2405d 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelScorpion.java
+++ b/src/main/java/net/minecraft/client/render/model/ScorpionModel.java
@@ -3,7 +3,7 @@ package net.minecraft.client.render.model;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
-public class ModelScorpion extends ModelBase
+public class ScorpionModel extends BaseModel
 {
     private final Cube body;
     private final Cube clawLeft;
@@ -19,7 +19,7 @@ public class ModelScorpion extends ModelBase
     private final Cube tail2;
 
 
-    public ModelScorpion()
+    public ScorpionModel()
     {
         body = new Cube(0, 0);
         body.addBox(-2.5F, -4.0F, -5.0F, 5, 3, 10);
@@ -84,7 +84,7 @@ public class ModelScorpion extends ModelBase
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
 
         GL11.glPushMatrix();
         GL11.glTranslatef(0, 1.4F, 0);
@@ -105,7 +105,7 @@ public class ModelScorpion extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
         legLFront.setRotationAngle(0.0F, -2.618F, 0.3927F);
         legLMid.setRotationAngle(0.0F, 3.1416F, 0.3927F);
@@ -115,16 +115,16 @@ public class ModelScorpion extends ModelBase
         legRBack.setRotationAngle(0.0F, 0.5236F, -0.3927F);
 
         float pair1Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbYaw;
-        float pair2Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 3.141593F) * 0.4F) * limbYaw;
-        float pair3Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 1.570796F) * 0.4F) * limbYaw;
+        float pair2Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + MathHelper.PI) * 0.4F) * limbYaw;
+        float pair3Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + MathHelper.PI / 2F) * 0.4F) * limbYaw;
 
-        legLFront.rotateAngleY += pair1Y;
-        legLBack.rotateAngleY -= pair1Y;
+        legLFront.yRot += pair1Y;
+        legLBack.yRot -= pair1Y;
 
-        legRFront.rotateAngleY -= pair2Y;
-        legRBack.rotateAngleY += pair2Y;
+        legRFront.yRot -= pair2Y;
+        legRBack.yRot += pair2Y;
 
-        legLMid.rotateAngleY += pair3Y;
-        legRMid.rotateAngleY -= pair3Y;
+        legLMid.yRot += pair3Y;
+        legRMid.yRot -= pair3Y;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSheep.java b/src/main/java/net/minecraft/client/render/model/SheepModel.java
similarity index 56%
rename from src/main/java/net/minecraft/client/render/model/ModelSheep.java
rename to src/main/java/net/minecraft/client/render/model/SheepModel.java
index 257d10bb9..3d8acb520 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSheep.java
+++ b/src/main/java/net/minecraft/client/render/model/SheepModel.java
@@ -2,16 +2,16 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelQuadruped, ModelRenderer
+//            QuadrupedModel, ModelRenderer
 
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntitySheep;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.SheepMob;
 import net.minecraft.core.util.helper.MathHelper;
 
-public class ModelSheep extends ModelQuadruped
+public class SheepModel extends QuadrupedModel
 {
 
-    public ModelSheep()
+    public SheepModel()
     {
         super(12, 0.0F);
         head = new Cube(0, 0);
@@ -23,9 +23,9 @@ public class ModelSheep extends ModelQuadruped
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        super.setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         float desiredRotateAngleX = headPitch / 57.29578F;
         float desiredRotateAngleY = headYaw / 57.29578F;
         // handles head rotation
@@ -35,36 +35,36 @@ public class ModelSheep extends ModelQuadruped
             if (headBobTime < 5)
             {
                 float partPercentage = headBobTime / 5;
-                head.rotateAngleX = (desiredRotateAngleX * (1 - partPercentage)) + (1.0472f * partPercentage);
-                head.rotateAngleY = (desiredRotateAngleY * (1 - partPercentage));
+                head.xRot = (desiredRotateAngleX * (1 - partPercentage)) + (1.0472f * partPercentage);
+                head.yRot = (desiredRotateAngleY * (1 - partPercentage));
             }
             //hold head in tilted position
             else if (headBobTime < 35)
             {
-                head.rotateAngleX = 1.0472f;
-                head.rotateAngleY = 0;
+                head.xRot = 1.0472f;
+                head.yRot = 0;
             }
             // bring head up to normal rotation again
             else if (headBobTime < 40)
             {
                 float partPercentage = (headBobTime - 35) / 5;
-                head.rotateAngleX = (desiredRotateAngleX * partPercentage) + (1.0472f * (1 - partPercentage));
-                head.rotateAngleY = desiredRotateAngleY * partPercentage;
+                head.xRot = (desiredRotateAngleX * partPercentage) + (1.0472f * (1 - partPercentage));
+                head.yRot = desiredRotateAngleY * partPercentage;
             }
         }
         else
         {
             // normal head rotations
-            head.rotateAngleX = desiredRotateAngleX;
-            head.rotateAngleY = desiredRotateAngleY;
+            head.xRot = desiredRotateAngleX;
+            head.yRot = desiredRotateAngleY;
         }
     }
 
     @Override
-    public void setLivingAnimations(EntityLiving entityliving, float limbSwing, float limbYaw, float partialTick)
+    public void setLivingAnimations(Mob mob, float limbSwing, float limbYaw, float partialTick)
     {
-        EntitySheep entitySheep = (EntitySheep) entityliving;
-        head.rotationPointY = 6F;
+        SheepMob entitySheep = (SheepMob) mob;
+        head.y = 6F;
         isEatingAnimPlaying = false;
         if(entitySheep.getIsSheepEating())
         {
@@ -74,17 +74,17 @@ public class ModelSheep extends ModelQuadruped
             // Move head down
             if (headBobTime < 5)
             {
-                head.rotationPointY = 6 + (10 / 5f) * (headBobTime + 1);
+                head.y = 6 + (10 / 5f) * (headBobTime + 1);
             }
             // Hold head down and bob
             else if (headBobTime < 35)
             {
-                head.rotationPointY = 16 + MathHelper.sin((headBobTime * 0.05f) * 30.5f) / 3f;
+                head.y = 16 + MathHelper.sin((headBobTime * 0.05f) * 30.5f) / 3f;
             }
             // Bring head back up
             else if (headBobTime < 40)
             {
-                head.rotationPointY = 16f - ((10 / 5f) * (headBobTime - 34));
+                head.y = 16f - ((10 / 5f) * (headBobTime - 34));
             }
         }
         else
diff --git a/src/main/java/net/minecraft/client/render/model/SheepOverlayModel.java b/src/main/java/net/minecraft/client/render/model/SheepOverlayModel.java
new file mode 100644
index 000000000..5c3034c99
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/SheepOverlayModel.java
@@ -0,0 +1,44 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            QuadrupedModel, ModelRenderer
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.core.Global;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.SheepMob;
+import org.lwjgl.opengl.GL11;
+
+public class SheepOverlayModel extends SheepModel
+{
+    Mob sheep;
+
+    public SheepOverlayModel()
+    {
+        super();
+    }
+
+    @Override
+    public void setLivingAnimations(Mob mob, float limbSwing, float limbYaw, float partialTick)
+    {
+        super.setLivingAnimations(mob, limbSwing, limbYaw, partialTick);
+        this.sheep = mob;
+        float brightness = sheep.getBrightness(limbSwing);
+        if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) brightness = 1.0f;
+        int j = ((SheepMob)sheep).getFleeceColor().blockMeta;
+        GL11.glColor3f(brightness * SheepMob.FLEECE_COLOR_TABLE[j][0], brightness * SheepMob.FLEECE_COLOR_TABLE[j][1], brightness * SheepMob.FLEECE_COLOR_TABLE[j][2]);
+
+    }
+
+    @Override
+    public void onUnload(){
+        sheep = null;
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float ticksExisted, float headYaw, float headPitch, float scale)
+    {
+        super.render(limbSwing, limbYaw, ticksExisted, headYaw, headPitch, scale);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSheepWool.java b/src/main/java/net/minecraft/client/render/model/SheepWoolModel.java
similarity index 88%
rename from src/main/java/net/minecraft/client/render/model/ModelSheepWool.java
rename to src/main/java/net/minecraft/client/render/model/SheepWoolModel.java
index f71921810..de73c81e2 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSheepWool.java
+++ b/src/main/java/net/minecraft/client/render/model/SheepWoolModel.java
@@ -2,12 +2,12 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelQuadruped, ModelRenderer
+//            QuadrupedModel, ModelRenderer
 
-public class ModelSheepWool extends ModelSheep
+public class SheepWoolModel extends SheepModel
 {
 
-    public ModelSheepWool()
+    public SheepWoolModel()
     {
         head = new Cube(0, 0);
         head.addBox(-3F, -4F, -4F, 6, 6, 6, 0.6F);
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSign.java b/src/main/java/net/minecraft/client/render/model/SignModel.java
similarity index 91%
rename from src/main/java/net/minecraft/client/render/model/ModelSign.java
rename to src/main/java/net/minecraft/client/render/model/SignModel.java
index cdfb93dfa..bacc3e4d8 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSign.java
+++ b/src/main/java/net/minecraft/client/render/model/SignModel.java
@@ -4,10 +4,10 @@ package net.minecraft.client.render.model;
 // Referenced classes of package net.minecraft.src:
 //            ModelRenderer
 
-public class ModelSign
+public class SignModel
 {
 
-    public ModelSign()
+    public SignModel()
     {
         signBoard = new Cube(0, 0);
         signBoard.addBox(-12F, -14F, -1F, 24, 12, 2, 0.0F);
diff --git a/src/main/java/net/minecraft/client/render/model/SkeletonModel.java b/src/main/java/net/minecraft/client/render/model/SkeletonModel.java
new file mode 100644
index 000000000..c32dd8f07
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/SkeletonModel.java
@@ -0,0 +1,28 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            ZombieModel, ModelRenderer
+
+public class SkeletonModel extends ZombieModel
+{
+
+    public SkeletonModel()
+    {
+        float f = 0.0F;
+        arm0 = new Cube(40, 16);
+        arm0.addBox(-1F, -2F, -1F, 2, 12, 2, f);
+        arm0.setRotationPoint(-5F, 2.0F, 0.0F);
+        arm1 = new Cube(40, 16);
+        arm1.mirror = true;
+        arm1.addBox(-1F, -2F, -1F, 2, 12, 2, f);
+        arm1.setRotationPoint(5F, 2.0F, 0.0F);
+        leg0 = new Cube(0, 16);
+        leg0.addBox(-1F, 0.0F, -1F, 2, 12, 2, f);
+        leg0.setRotationPoint(-2F, 12F, 0.0F);
+        leg1 = new Cube(0, 16);
+        leg1.mirror = true;
+        leg1.addBox(-1F, 0.0F, -1F, 2, 12, 2, f);
+        leg1.setRotationPoint(2.0F, 12F, 0.0F);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSlime.java b/src/main/java/net/minecraft/client/render/model/SlimeModel.java
similarity index 77%
rename from src/main/java/net/minecraft/client/render/model/ModelSlime.java
rename to src/main/java/net/minecraft/client/render/model/SlimeModel.java
index 69fa83c0d..f025a7e14 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSlime.java
+++ b/src/main/java/net/minecraft/client/render/model/SlimeModel.java
@@ -2,12 +2,12 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer
+//            BaseModel, ModelRenderer
 
-public class ModelSlime extends ModelBase
+public class SlimeModel extends BaseModel
 {
 
-    public ModelSlime(int i)
+    public SlimeModel(int i)
     {
         slimeBodies = new Cube(0, i);
         slimeBodies.addBox(-4F, 16F, -4F, 8, 8, 8);
@@ -25,14 +25,14 @@ public class ModelSlime extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
     }
 
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         slimeBodies.render(scale);
         if(slimeRightEye != null)
         {
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSpider.java b/src/main/java/net/minecraft/client/render/model/SpiderModel.java
similarity index 50%
rename from src/main/java/net/minecraft/client/render/model/ModelSpider.java
rename to src/main/java/net/minecraft/client/render/model/SpiderModel.java
index c685d7ca3..833a973bc 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSpider.java
+++ b/src/main/java/net/minecraft/client/render/model/SpiderModel.java
@@ -2,55 +2,67 @@ package net.minecraft.client.render.model;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, MathHelper
+//            BaseModel, ModelRenderer, MathHelper
 
 import net.minecraft.core.util.helper.MathHelper;
 
-public class ModelSpider extends ModelBase
+public class SpiderModel extends BaseModel
 {
+    public Cube spiderHead;
+    public Cube spiderNeck;
+    public Cube spiderBody;
+    public Cube spiderLeg1;
+    public Cube spiderLeg2;
+    public Cube spiderLeg3;
+    public Cube spiderLeg4;
+    public Cube spiderLeg5;
+    public Cube spiderLeg6;
+    public Cube spiderLeg7;
+    public Cube spiderLeg8;
+
 
-    public ModelSpider(float expandAmount)
+    public SpiderModel(float expandAmount)
     {
-        int i = 15;
+        int yOff = 15;
         spiderHead = new Cube(32, 4);
         spiderHead.addBox(-4F, -4F, -8F, 8, 8, 8, expandAmount);
-        spiderHead.setRotationPoint(0.0F, 0 + i, -3F);
+        spiderHead.setRotationPoint(0.0F, yOff, -3F);
         spiderNeck = new Cube(0, 0);
         spiderNeck.addBox(-3F, -3F, -3F, 6, 6, 6, expandAmount);
-        spiderNeck.setRotationPoint(0.0F, i, 0.0F);
+        spiderNeck.setRotationPoint(0.0F, yOff, 0.0F);
         spiderBody = new Cube(0, 12);
         spiderBody.addBox(-5F, -4F, -6F, 10, 8, 12, expandAmount);
-        spiderBody.setRotationPoint(0.0F, 0 + i, 9F);
+        spiderBody.setRotationPoint(0.0F, yOff, 9F);
         spiderLeg1 = new Cube(18, 0);
         spiderLeg1.addBox(-15F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg1.setRotationPoint(-4F, 0 + i, 2.0F);
+        spiderLeg1.setRotationPoint(-4F, yOff, 2.0F);
         spiderLeg2 = new Cube(18, 0);
         spiderLeg2.addBox(-1F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg2.setRotationPoint(4F, 0 + i, 2.0F);
+        spiderLeg2.setRotationPoint(4F, yOff, 2.0F);
         spiderLeg3 = new Cube(18, 0);
         spiderLeg3.addBox(-15F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg3.setRotationPoint(-4F, 0 + i, 1.0F);
+        spiderLeg3.setRotationPoint(-4F, yOff, 1.0F);
         spiderLeg4 = new Cube(18, 0);
         spiderLeg4.addBox(-1F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg4.setRotationPoint(4F, 0 + i, 1.0F);
+        spiderLeg4.setRotationPoint(4F, yOff, 1.0F);
         spiderLeg5 = new Cube(18, 0);
         spiderLeg5.addBox(-15F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg5.setRotationPoint(-4F, 0 + i, 0.0F);
+        spiderLeg5.setRotationPoint(-4F, yOff, 0.0F);
         spiderLeg6 = new Cube(18, 0);
         spiderLeg6.addBox(-1F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg6.setRotationPoint(4F, 0 + i, 0.0F);
+        spiderLeg6.setRotationPoint(4F, yOff, 0.0F);
         spiderLeg7 = new Cube(18, 0);
         spiderLeg7.addBox(-15F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg7.setRotationPoint(-4F, 0 + i, -1F);
+        spiderLeg7.setRotationPoint(-4F, yOff, -1F);
         spiderLeg8 = new Cube(18, 0);
         spiderLeg8.addBox(-1F, -1F, -1F, 16, 2, 2, expandAmount);
-        spiderLeg8.setRotationPoint(4F, 0 + i, -1F);
+        spiderLeg8.setRotationPoint(4F, yOff, -1F);
     }
 
     @Override
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         spiderHead.render(scale);
         spiderNeck.render(scale);
         spiderBody.render(scale);
@@ -65,64 +77,52 @@ public class ModelSpider extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        spiderHead.rotateAngleY = headYaw / 57.29578F;
-        spiderHead.rotateAngleX = headPitch / 57.29578F;
+        spiderHead.yRot = headYaw / 57.29578F;
+        spiderHead.xRot = headPitch / 57.29578F;
         float f6 = 0.7853982F;
-        spiderLeg1.rotateAngleZ = -f6;
-        spiderLeg2.rotateAngleZ = f6;
-        spiderLeg3.rotateAngleZ = -f6 * 0.74F;
-        spiderLeg4.rotateAngleZ = f6 * 0.74F;
-        spiderLeg5.rotateAngleZ = -f6 * 0.74F;
-        spiderLeg6.rotateAngleZ = f6 * 0.74F;
-        spiderLeg7.rotateAngleZ = -f6;
-        spiderLeg8.rotateAngleZ = f6;
+        spiderLeg1.zRot = -f6;
+        spiderLeg2.zRot = f6;
+        spiderLeg3.zRot = -f6 * 0.74F;
+        spiderLeg4.zRot = f6 * 0.74F;
+        spiderLeg5.zRot = -f6 * 0.74F;
+        spiderLeg6.zRot = f6 * 0.74F;
+        spiderLeg7.zRot = -f6;
+        spiderLeg8.zRot = f6;
         float f7 = -0F;
         float f8 = 0.3926991F;
-        spiderLeg1.rotateAngleY = f8 * 2.0F + f7;
-        spiderLeg2.rotateAngleY = -f8 * 2.0F - f7;
-        spiderLeg3.rotateAngleY = f8 * 1.0F + f7;
-        spiderLeg4.rotateAngleY = -f8 * 1.0F - f7;
-        spiderLeg5.rotateAngleY = -f8 * 1.0F + f7;
-        spiderLeg6.rotateAngleY = f8 * 1.0F - f7;
-        spiderLeg7.rotateAngleY = -f8 * 2.0F + f7;
-        spiderLeg8.rotateAngleY = f8 * 2.0F - f7;
+        spiderLeg1.yRot = f8 * 2.0F + f7;
+        spiderLeg2.yRot = -f8 * 2.0F - f7;
+        spiderLeg3.yRot = f8 + f7;
+        spiderLeg4.yRot = -f8 - f7;
+        spiderLeg5.yRot = -f8 + f7;
+        spiderLeg6.yRot = f8 - f7;
+        spiderLeg7.yRot = -f8 * 2.0F + f7;
+        spiderLeg8.yRot = f8 * 2.0F - f7;
         float pair1Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbYaw;
-        float pair2Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 3.141593F) * 0.4F) * limbYaw;
-        float pair3Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 1.570796F) * 0.4F) * limbYaw;
-        float pair4Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 4.712389F) * 0.4F) * limbYaw;
+        float pair2Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + MathHelper.PI) * 0.4F) * limbYaw;
+        float pair3Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + MathHelper.PI / 2F) * 0.4F) * limbYaw;
+        float pair4Y = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + MathHelper.PI * 1.5F) * 0.4F) * limbYaw;
         float pair1Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbYaw;
-        float pair2Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 3.141593F) * 0.4F) * limbYaw;
-        float pair3Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 1.570796F) * 0.4F) * limbYaw;
-        float pair4Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 4.712389F) * 0.4F) * limbYaw;
-        spiderLeg1.rotateAngleY += pair1Y;
-        spiderLeg2.rotateAngleY += -pair1Y;
-        spiderLeg3.rotateAngleY += pair2Y;
-        spiderLeg4.rotateAngleY += -pair2Y;
-        spiderLeg5.rotateAngleY += pair3Y;
-        spiderLeg6.rotateAngleY += -pair3Y;
-        spiderLeg7.rotateAngleY += pair4Y;
-        spiderLeg8.rotateAngleY += -pair4Y;
-        spiderLeg1.rotateAngleZ += pair1Z;
-        spiderLeg2.rotateAngleZ += -pair1Z;
-        spiderLeg3.rotateAngleZ += pair2Z;
-        spiderLeg4.rotateAngleZ += -pair2Z;
-        spiderLeg5.rotateAngleZ += pair3Z;
-        spiderLeg6.rotateAngleZ += -pair3Z;
-        spiderLeg7.rotateAngleZ += pair4Z;
-        spiderLeg8.rotateAngleZ += -pair4Z;
+        float pair2Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + MathHelper.PI) * 0.4F) * limbYaw;
+        float pair3Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + MathHelper.PI / 2F) * 0.4F) * limbYaw;
+        float pair4Z = Math.abs(MathHelper.sin(limbSwing * 0.6662F + MathHelper.PI * 1.5F) * 0.4F) * limbYaw;
+        spiderLeg1.yRot += pair1Y;
+        spiderLeg2.yRot += -pair1Y;
+        spiderLeg3.yRot += pair2Y;
+        spiderLeg4.yRot += -pair2Y;
+        spiderLeg5.yRot += pair3Y;
+        spiderLeg6.yRot += -pair3Y;
+        spiderLeg7.yRot += pair4Y;
+        spiderLeg8.yRot += -pair4Y;
+        spiderLeg1.zRot += pair1Z;
+        spiderLeg2.zRot += -pair1Z;
+        spiderLeg3.zRot += pair2Z;
+        spiderLeg4.zRot += -pair2Z;
+        spiderLeg5.zRot += pair3Z;
+        spiderLeg6.zRot += -pair3Z;
+        spiderLeg7.zRot += pair4Z;
+        spiderLeg8.zRot += -pair4Z;
     }
-
-    public Cube spiderHead;
-    public Cube spiderNeck;
-    public Cube spiderBody;
-    public Cube spiderLeg1;
-    public Cube spiderLeg2;
-    public Cube spiderLeg3;
-    public Cube spiderLeg4;
-    public Cube spiderLeg5;
-    public Cube spiderLeg6;
-    public Cube spiderLeg7;
-    public Cube spiderLeg8;
 }
diff --git a/src/main/java/net/minecraft/client/render/model/SquidModel.java b/src/main/java/net/minecraft/client/render/model/SquidModel.java
new file mode 100644
index 000000000..0e65edec1
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/SquidModel.java
@@ -0,0 +1,57 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BaseModel, ModelRenderer
+
+public class SquidModel extends BaseModel
+{
+
+    public SquidModel()
+    {
+        squidTentacles = new Cube[8];
+        byte yOffs = -16;
+        squidBody = new Cube(0, 0);
+        squidBody.addBox(-6F, -8F, -6F, 12, 16, 12);
+        squidBody.y += 24 + yOffs;
+        for(int i = 0; i < squidTentacles.length; i++)
+        {
+            squidTentacles[i] = new Cube(48, 0);
+            double angle = ((double)i * Math.PI * 2D) / (double)squidTentacles.length;
+            float xo = (float)Math.cos(angle) * 5F;
+            float yo = (float)Math.sin(angle) * 5F;
+            squidTentacles[i].addBox(-1F, 0.0F, -1F, 2, 18, 2);
+            squidTentacles[i].x = xo;
+            squidTentacles[i].z = yo;
+            squidTentacles[i].y = 31 + yOffs;
+            angle = ((double)i * Math.PI * -2D) / (double)squidTentacles.length + (Math.PI/2);
+            squidTentacles[i].yRot = (float)angle;
+        }
+
+    }
+
+    @Override
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        for(int i = 0; i < squidTentacles.length; i++)
+        {
+            squidTentacles[i].xRot = limbPitch;
+        }
+
+    }
+
+    @Override
+    public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    {
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        squidBody.render(scale);
+        for(int i = 0; i < squidTentacles.length; i++)
+        {
+            squidTentacles[i].render(scale);
+        }
+
+    }
+
+    Cube squidBody;
+    Cube squidTentacles[];
+}
diff --git a/src/main/java/net/minecraft/client/render/model/ModelWolf.java b/src/main/java/net/minecraft/client/render/model/WolfModel.java
similarity index 63%
rename from src/main/java/net/minecraft/client/render/model/ModelWolf.java
rename to src/main/java/net/minecraft/client/render/model/WolfModel.java
index 1e0ac5784..d2898284a 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelWolf.java
+++ b/src/main/java/net/minecraft/client/render/model/WolfModel.java
@@ -1,21 +1,20 @@
 package net.minecraft.client.render.model;
 
-import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.Global;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            ModelBase, ModelRenderer, EntityWolf, MathHelper, 
-//            EntityLiving
+//            BaseModel, ModelRenderer, WolfMob, MathHelper,
+//            Mob
 
-public class ModelWolf extends ModelBase
+public class WolfModel extends BaseModel
 {
 
-    public ModelWolf(float expandAmount)
+    public WolfModel(float expandAmount)
     {
         float f1 = 13.5F;
         wolfHeadMain = new Cube(0, 0);
@@ -57,7 +56,7 @@ public class ModelWolf extends ModelBase
     public void render(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
         super.render(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
         wolfHeadMain.renderWithRotation(scale);
         wolfBody.render(scale);
         wolfLeg1.render(scale);
@@ -72,56 +71,56 @@ public class ModelWolf extends ModelBase
     }
 
     @Override
-    public void setLivingAnimations(EntityLiving entityliving, float limbSwing, float limbYaw, float partialTick)
+    public void setLivingAnimations(Mob mob, float limbSwing, float limbYaw, float partialTick)
     {
-        EntityWolf entitywolf = (EntityWolf)entityliving;
+        WolfMob entitywolf = (WolfMob) mob;
         if(entitywolf.isWolfAngry())
         {
-            wolfTail.rotateAngleY = 0.0F;
+            wolfTail.yRot = 0.0F;
         } else
         {
-            wolfTail.rotateAngleY = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+            wolfTail.yRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
         }
         if(entitywolf.isWolfSitting())
         {
             wolfMane.setRotationPoint(-1F, 16F, -3F);
-            wolfMane.rotateAngleX = 1.256637F;
-            wolfMane.rotateAngleY = 0.0F;
+            wolfMane.xRot = 1.256637F;
+            wolfMane.yRot = 0.0F;
             wolfBody.setRotationPoint(0.0F, 18F, 0.0F);
-            wolfBody.rotateAngleX = 0.7853982F;
+            wolfBody.xRot = 0.7853982F;
             wolfTail.setRotationPoint(-1F, 21F, 6F);
             wolfLeg1.setRotationPoint(-2.5F, 22F, 2.0F);
-            wolfLeg1.rotateAngleX = 4.712389F;
+            wolfLeg1.xRot = MathHelper.PI * 1.5F;
             wolfLeg2.setRotationPoint(0.5F, 22F, 2.0F);
-            wolfLeg2.rotateAngleX = 4.712389F;
-            wolfLeg3.rotateAngleX = 5.811947F;
+            wolfLeg2.xRot = MathHelper.PI * 1.5F;
+            wolfLeg3.xRot = 5.811947F;
             wolfLeg3.setRotationPoint(-2.49F, 17F, -4F);
-            wolfLeg4.rotateAngleX = 5.811947F;
+            wolfLeg4.xRot = 5.811947F;
             wolfLeg4.setRotationPoint(0.51F, 17F, -4F);
         } else
         {
             wolfBody.setRotationPoint(0.0F, 14F, 2.0F);
-            wolfBody.rotateAngleX = 1.570796F;
+            wolfBody.xRot = MathHelper.PI / 2F;
             wolfMane.setRotationPoint(-1F, 14F, -3F);
-            wolfMane.rotateAngleX = wolfBody.rotateAngleX;
+            wolfMane.xRot = wolfBody.xRot;
             wolfTail.setRotationPoint(-1F, 12F, 8F);
             wolfLeg1.setRotationPoint(-2.5F, 16F, 7F);
             wolfLeg2.setRotationPoint(0.5F, 16F, 7F);
             wolfLeg3.setRotationPoint(-2.5F, 16F, -4F);
             wolfLeg4.setRotationPoint(0.5F, 16F, -4F);
-            wolfLeg1.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
-            wolfLeg2.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-            wolfLeg3.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbYaw;
-            wolfLeg4.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+            wolfLeg1.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
+            wolfLeg2.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+            wolfLeg3.xRot = MathHelper.cos(limbSwing * 0.6662F + MathHelper.PI) * 1.4F * limbYaw;
+            wolfLeg4.xRot = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbYaw;
         }
         float f3 = entitywolf.getInterestedAngle(partialTick) + entitywolf.getShakeAngle(partialTick, 0.0F);
-        wolfHeadMain.rotateAngleZ = f3;
-        wolfRightEar.rotateAngleZ = f3;
-        wolfLeftEar.rotateAngleZ = f3;
-        wolfSnout.rotateAngleZ = f3;
-        wolfMane.rotateAngleZ = entitywolf.getShakeAngle(partialTick, -0.08F);
-        wolfBody.rotateAngleZ = entitywolf.getShakeAngle(partialTick, -0.16F);
-        wolfTail.rotateAngleZ = entitywolf.getShakeAngle(partialTick, -0.2F);
+        wolfHeadMain.zRot = f3;
+        wolfRightEar.zRot = f3;
+        wolfLeftEar.zRot = f3;
+        wolfSnout.zRot = f3;
+        wolfMane.zRot = entitywolf.getShakeAngle(partialTick, -0.08F);
+        wolfBody.zRot = entitywolf.getShakeAngle(partialTick, -0.16F);
+        wolfTail.zRot = entitywolf.getShakeAngle(partialTick, -0.2F);
 
         if(entitywolf.getWolfShaking())
         {
@@ -139,18 +138,18 @@ public class ModelWolf extends ModelBase
     }
 
     @Override
-    public void setRotationAngles(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale)
     {
-        super.setRotationAngles(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
-        wolfHeadMain.rotateAngleX = headPitch / 57.29578F;
-        wolfHeadMain.rotateAngleY = headYaw / 57.29578F;
-        wolfRightEar.rotateAngleY = wolfHeadMain.rotateAngleY;
-        wolfRightEar.rotateAngleX = wolfHeadMain.rotateAngleX;
-        wolfLeftEar.rotateAngleY = wolfHeadMain.rotateAngleY;
-        wolfLeftEar.rotateAngleX = wolfHeadMain.rotateAngleX;
-        wolfSnout.rotateAngleY = wolfHeadMain.rotateAngleY;
-        wolfSnout.rotateAngleX = wolfHeadMain.rotateAngleX;
-        wolfTail.rotateAngleX = limbPitch;
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        wolfHeadMain.xRot = headPitch / 57.29578F;
+        wolfHeadMain.yRot = headYaw / 57.29578F;
+        wolfRightEar.yRot = wolfHeadMain.yRot;
+        wolfRightEar.xRot = wolfHeadMain.xRot;
+        wolfLeftEar.yRot = wolfHeadMain.yRot;
+        wolfLeftEar.xRot = wolfHeadMain.xRot;
+        wolfSnout.yRot = wolfHeadMain.yRot;
+        wolfSnout.xRot = wolfHeadMain.xRot;
+        wolfTail.xRot = limbPitch;
     }
 
     public Cube wolfHeadMain;
diff --git a/src/main/java/net/minecraft/client/render/model/ZombieModel.java b/src/main/java/net/minecraft/client/render/model/ZombieModel.java
new file mode 100644
index 000000000..279401957
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/model/ZombieModel.java
@@ -0,0 +1,75 @@
+package net.minecraft.client.render.model;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BipedModel, MathHelper, ModelRenderer
+
+import net.minecraft.core.util.helper.MathHelper;
+
+public class ZombieModel extends BipedModel {
+    public ZombieModel() {
+        this(0.0F);
+    }
+
+    public ZombieModel(float var1) {
+        this.parts(var1, 0.0F);
+    }
+
+    public void parts(float var1, float var2) {
+        this.holdingLeftHand = false;
+        this.holdingRightHand = false;
+        this.sneaking = false;
+        this.cloak = new Cube(0, 0);
+        this.cloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, var1);
+        this.ear = new Cube(24, 0);
+        this.ear.addBox(-4.0F, -7.0F, -1.0F, 7, 7, 1, var1);
+        this.head = new Cube(0, 0);
+        this.head.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1);
+        this.head.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
+        this.hair = new Cube(32, 0);
+        this.hair.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F);
+        this.hair.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
+        this.body = new Cube(16, 16);
+        this.body.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1);
+        this.body.setRotationPoint(0.0F, 0.0F + var2, 0.0F);
+        this.arm0 = new Cube(40, 16);
+        this.arm0.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, var1);
+        this.arm0.setRotationPoint(-5.0F, 2.0F + var2, 0.0F);
+        this.arm1 = new Cube(40, 16);
+        this.arm1.mirror = true;
+        this.arm1.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, var1);
+        this.arm1.setRotationPoint(5.0F, 2.0F + var2, 0.0F);
+        this.leg0 = new Cube(0, 16);
+        this.leg0.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
+        this.leg0.setRotationPoint(-2.0F, 12.0F + var2, 0.0F);
+        this.leg1 = new Cube(0, 16);
+        this.leg1.mirror = true;
+        this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
+        this.leg1.setRotationPoint(2.0F, 12.0F + var2, 0.0F);
+    }
+
+    @Override
+    public void setupAnimation(float limbSwing, float limbYaw, float limbPitch, float headYaw, float headPitch, float scale) {
+        super.setupAnimation(limbSwing, limbYaw, limbPitch, headYaw, headPitch, scale);
+        float var7 = MathHelper.sin(this.onGround * 3.1415927F);
+        float var8 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * 3.1415927F);
+        this.arm0.zRot = 0.0F;
+        this.arm1.zRot = 0.0F;
+        this.arm0.yRot = -(0.1F - var7 * 0.6F);
+        this.arm1.yRot = 0.1F - var7 * 0.6F;
+        this.arm0.xRot = -1.5707964F;
+        this.arm1.xRot = -1.5707964F;
+        Cube var10000 = this.arm0;
+        var10000.xRot -= var7 * 1.2F - var8 * 0.4F;
+        var10000 = this.arm1;
+        var10000.xRot -= var7 * 1.2F - var8 * 0.4F;
+        var10000 = this.arm0;
+        var10000.zRot += MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
+        var10000 = this.arm1;
+        var10000.zRot -= MathHelper.cos(limbPitch * 0.09F) * 0.05F + 0.05F;
+        var10000 = this.arm0;
+        var10000.xRot += MathHelper.sin(limbPitch * 0.067F) * 0.05F;
+        var10000 = this.arm1;
+        var10000.xRot -= MathHelper.sin(limbPitch * 0.067F) * 0.05F;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
index 7f67c2414..8f1773f20 100644
--- a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
+++ b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
@@ -16,7 +16,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Framebuffer;
 import net.minecraft.client.render.OpenGLHelper;
 import net.minecraft.client.render.Renderer;
-import net.minecraft.client.render.Texture;
+import net.minecraft.client.render.texture.Texture;
 import net.minecraft.client.render.camera.CameraUtil;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.material.Material;
@@ -119,7 +119,7 @@ public class ShadersRenderer implements Renderer {
 			
 			// Read projection matrix, invert it, and send it to the shader
 			matrixBuffer.clear();
-			glGetFloat(GL_PROJECTION_MATRIX, matrixBuffer);
+			glGetFloatv(GL_PROJECTION_MATRIX, matrixBuffer);
 			
 			matrixBuffer.position(0);
 			matrix.load(matrixBuffer);
@@ -131,7 +131,7 @@ public class ShadersRenderer implements Renderer {
 			
 			matrixBuffer.position(0);
 			matrixBuffer.limit(16);
-			glUniformMatrix4(cloudsShader.getUniform("gbufferProjectionInverse"), false, matrixBuffer);
+			glUniformMatrix4fv(cloudsShader.getUniform("gbufferProjectionInverse"), false, matrixBuffer);
 			
 			int isEyeInLiquid;
 			if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.lava, partialTicks)) {
@@ -196,7 +196,7 @@ public class ShadersRenderer implements Renderer {
 
 	public void setupFramebuffer() {
 		double renderScale = (float) mc.gameSettings.renderScale.value.scale;
-		
+
 		int scaledWidth = (int) (renderScale * mc.resolution.width);
 		int scaledHeight = (int) (renderScale * mc.resolution.height);
 		
diff --git a/src/main/java/net/minecraft/client/render/tessellator/TessellatorStandard.java b/src/main/java/net/minecraft/client/render/tessellator/TessellatorStandard.java
index 958b64dd7..1110cca62 100644
--- a/src/main/java/net/minecraft/client/render/tessellator/TessellatorStandard.java
+++ b/src/main/java/net/minecraft/client/render/tessellator/TessellatorStandard.java
@@ -7,6 +7,7 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
 import net.minecraft.core.util.helper.MathHelper;
+import org.lwjgl.opengl.GL11;
 
 public class TessellatorStandard extends TessellatorBase {
 
@@ -85,7 +86,7 @@ public class TessellatorStandard extends TessellatorBase {
 		if(hasColor) {
 			glEnableClientState(GL_COLOR_ARRAY);
 			buffer.position(offset);
-			glColorPointer(4, true, vertexSize, buffer);
+			glColorPointer(4, GL_UNSIGNED_BYTE, vertexSize, buffer);
 			offset += 4;
 		}else {
 			glDisableClientState(GL_COLOR_ARRAY);
diff --git a/src/main/java/net/minecraft/client/render/texture/BufferedTexture.java b/src/main/java/net/minecraft/client/render/texture/BufferedTexture.java
new file mode 100644
index 000000000..260a00a17
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/BufferedTexture.java
@@ -0,0 +1,29 @@
+package net.minecraft.client.render.texture;
+
+import java.awt.image.BufferedImage;
+
+public class BufferedTexture extends FileTexture{
+    protected BufferedImage image;
+
+    protected boolean blur;
+    protected boolean clamp;
+    protected boolean mipmap;
+
+    public BufferedTexture(BufferedImage image, boolean blur, boolean clamp, boolean mipmap) {
+        generate();
+        this.blur = blur;
+        this.clamp = clamp;
+        this.mipmap = mipmap;
+        this.image = image;
+        init();
+    }
+
+    @Override
+    public void init() {
+        setupTexture(image, blur, clamp, mipmap);
+    }
+
+    public BufferedImage getBufferedImage() {
+        return image;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/DownloadedTexture.java b/src/main/java/net/minecraft/client/render/texture/DownloadedTexture.java
new file mode 100644
index 000000000..61895d88f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/DownloadedTexture.java
@@ -0,0 +1,18 @@
+package net.minecraft.client.render.texture;
+
+import net.minecraft.client.net.thread.ThreadDownloadImage;
+import net.minecraft.client.render.ImageParser;
+
+import java.awt.image.BufferedImage;
+
+public class DownloadedTexture extends FileTexture {
+
+	public BufferedImage image;
+	public int referenceCount;
+
+	public DownloadedTexture(String url, ImageParser imageParser) {
+		referenceCount = 1;
+		
+		new ThreadDownloadImage(this, url, imageParser).start();
+	}
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/FileTexture.java b/src/main/java/net/minecraft/client/render/texture/FileTexture.java
new file mode 100644
index 000000000..4922c53e3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/FileTexture.java
@@ -0,0 +1,85 @@
+package net.minecraft.client.render.texture;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texture.meta.TextureMetaHandler;
+import net.minecraft.client.render.texturepack.TexturePack;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import static net.minecraft.client.util.helper.Textures.missingTexture;
+import static net.minecraft.client.util.helper.Textures.readImage;
+
+public class FileTexture extends Texture{
+
+    protected final String sourcePath;
+
+    protected TextureMetaHandler metaHandler = new TextureMetaHandler();
+
+    public FileTexture() {
+        this.sourcePath = null;
+    }
+
+    public FileTexture(String path) {
+        generate();
+        this.sourcePath = path;
+        init();
+    }
+
+    @Override
+    public boolean hasMeta(String key) {
+        return metaHandler.has(key);
+    }
+
+    @Override
+    public @Nullable <T> T getMeta(String key, Class<T> aClass) {
+        return metaHandler.get(key, aClass);
+    }
+
+    @Override
+    public <T> T getOrDefaultMeta(String key, T metaDefault, Class<T> aClass) {
+        return metaHandler.getOrDefault(key, metaDefault, aClass);
+    }
+
+    @Override
+    public void init() {
+        metaHandler.reset();
+
+        if (sourcePath != null) {
+            Minecraft mc = Minecraft.getMinecraft(this);
+            TexturePack pack = mc.texturePackList.getHighestPriorityTexturePackWithFile(sourcePath);
+            if (pack == null) {
+                setupTexture(missingTexture);
+                return;
+            }
+
+            try (InputStream stream = pack.getResourceAsStream(sourcePath + ".mcmeta")) {
+                if (stream != null) {
+                    metaHandler.loadFromStream(stream);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            try (InputStream imageStream = pack.getResourceAsStream(sourcePath)) {
+                if (imageStream == null) {
+                    setupTexture(missingTexture);
+                    return;
+                }
+                setupTexture(readImage(imageStream));
+            } catch (IOException e) {
+                setupTexture(missingTexture);
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("Source: ").append(sourcePath).append("\n");
+        builder.append("Meta: \n").append(metaHandler);
+        return builder.toString();
+    }
+
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/Texture.java b/src/main/java/net/minecraft/client/render/texture/Texture.java
new file mode 100644
index 000000000..86b753d83
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/Texture.java
@@ -0,0 +1,298 @@
+package net.minecraft.client.render.texture;
+
+import static net.minecraft.core.util.helper.Buffer.buffer;
+import static org.lwjgl.opengl.GL11.*;
+import static org.lwjgl.opengl.GL12.GL_TEXTURE_MAX_LEVEL;
+
+import net.minecraft.client.GLAllocation;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.option.enums.MipmapType;
+import net.minecraft.client.render.texture.meta.TextureProperties;
+import net.minecraft.core.util.helper.Buffer;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.image.BufferedImage;
+import java.nio.ByteBuffer;
+
+public class Texture {
+	public static boolean debugMipmap = false;
+	protected static final boolean fixArtifacts = true;
+	
+	protected int id;
+
+	public void init() {
+
+	}
+
+	public boolean hasMeta(String key) {
+		return false;
+	}
+
+	public @Nullable <T> T getMeta(String key, Class<T> aClass) {
+		return null;
+	}
+
+	public <T> T getOrDefaultMeta(String key, T metaDefault, Class<T> aClass) {
+		return metaDefault;
+	}
+
+	public boolean generate() {
+		if(isGenerated()) {
+			return false;
+		}
+		
+		id = GLAllocation.generateTexture();
+		if(!isGenerated()) {
+			throw new RuntimeException("Texture not created!");
+		}
+		
+		return true;
+	}
+	
+	public boolean delete() {
+		if(!isGenerated()) {
+			return false;
+		}
+		GLAllocation.deleteTexture(id);
+		id = 0;
+		return true;
+	}
+	
+	public boolean bind() {
+		if(!isGenerated()) {
+			return false;
+		}
+		
+		glBindTexture(GL_TEXTURE_2D, id);
+		return true;
+	}
+
+	public void unbind() {
+		glBindTexture(GL_TEXTURE_2D, 0);
+	}
+
+	@Override
+	protected void finalize() throws Throwable {
+		super.finalize();
+		delete();
+	}
+
+	public boolean isGenerated() {
+		return id != 0;
+	}
+	
+	public int getWidth() {
+		return glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH);
+	}
+	
+	public int getHeight() {
+		return glGetTexLevelParameteri(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT);
+	}
+	
+	public int id() {
+		return id;
+	}
+
+
+	public void setupTexture(BufferedImage image) {
+		boolean blurTexture = false;
+		boolean clampTexture = false;
+		boolean mipmap = false;
+		if (hasMeta("texture")) {
+			TextureProperties properties = getMeta("texture", TextureProperties.class);
+			blurTexture = properties.blur;
+			clampTexture = properties.clamp;
+			mipmap = properties.mipmap;
+		}
+		setupTexture(image, blurTexture, clampTexture, mipmap);
+	}
+
+	public void setupTexture(BufferedImage img, boolean blurTexture, boolean clampTexture, boolean mipmap) {
+		bind();
+
+
+
+		if(blurTexture) {
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+		}else {
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+		}
+
+		if(clampTexture) {
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+		}else {
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+		}
+
+		int w = img.getWidth();
+		int h = img.getHeight();
+
+		Buffer.put(img);
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+
+		if(mipmap) {
+			Minecraft mc = Minecraft.getMinecraft(this);
+			generateMipmaps(buffer, img, mc.gameSettings.mipmapLevels.value, mc.gameSettings.mipmapType.value == MipmapType.SMOOTH);
+		}
+	}
+
+	protected void generateMipmaps(ByteBuffer buffer, BufferedImage image, int levels, boolean smooth) {
+		System.out.println("Generating Mipmaps...");
+
+		final int width = image.getWidth();
+		final int height = image.getHeight();
+
+		int[] data = new int[width * height];
+		int[] newData = null;
+
+		for(int x=0; x < width; x++) {
+			for(int y=0; y < height; y++) {
+				data[width * y + x] = image.getRGB(x, y);
+			}
+		}
+
+		if(fixArtifacts) {
+			for(int level = levels; level > 0; level--) {
+				int lod = (int) Math.pow(2, level);
+
+				int tilesX = width / lod;
+				int tilesY = height / lod;
+
+				for(int x = 0; x < tilesX; x++) {
+					for(int y = 0; y < tilesY; y++) {
+
+						Integer nonTransparentColor = null;
+
+						getColor: for(int i=0; i < lod; i++) {
+							for(int j=0; j < lod; j++) {
+								int x0 = x * lod + i;
+								int y0 = y * lod + j;
+
+								int color = data[width * y0 + x0];
+
+								if(((color >> 24) & 0xFF) > 0) {
+									nonTransparentColor = color;
+									break getColor;
+								}
+							}
+						}
+
+						if(nonTransparentColor != null) {
+							nonTransparentColor &= 0x00FFFFFF;
+
+							for(int i=0; i < lod; i++) {
+								for(int j=0; j < lod; j++) {
+									int x0 = x * lod + i;
+									int y0 = y * lod + j;
+
+									int color = data[width * y0 + x0];
+
+									if(((color >> 24) & 0xFF) == 0) {
+										data[width * y0 + x0] = nonTransparentColor;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		int previousWidth = width;
+		int newWidth = width;
+		int newHeight = height;
+
+		for(int level = 0; level <= levels; level++) {
+			newData = new int[newWidth * newHeight];
+
+			for(int y = 0; y < newHeight; y++) {
+				for(int x = 0; x < newWidth; x++) {
+					int color;
+
+					if(level == 0) {
+						color = data[width * y + x];
+					}else {
+						int x1 = x << 1;
+						int y1 = y << 1;
+
+						if(smooth) {
+							int color0 = data[previousWidth * (y1 + 0) + (x1 + 0)];
+							int color1 = data[previousWidth * (y1 + 0) + (x1 + 1)];
+							int color2 = data[previousWidth * (y1 + 1) + (x1 + 0)];
+							int color3 = data[previousWidth * (y1 + 1) + (x1 + 1)];
+
+							color = blendColor(blendColor(color0, color1), blendColor(color2, color3));
+						}else {
+							color = data[previousWidth * y1 + x1];
+						}
+					}
+
+					newData[y * newWidth + x] = color;
+				}
+			}
+
+			buffer.position(0).limit(buffer.capacity());
+
+			for(int i=0; i < newData.length; i++) {
+				int color = newData[i];
+
+				buffer.put((byte) ((color >> 16) & 0xFF));
+				buffer.put((byte) ((color >>  8) & 0xFF));
+				buffer.put((byte) ((color >>  0) & 0xFF));
+				buffer.put((byte) ((color >> 24) & 0xFF));
+			}
+
+			buffer.limit(buffer.position()).flip();
+
+			glTexImage2D(GL_TEXTURE_2D, debugMipmap ? 0 : level, GL_RGBA, newWidth, newHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+			if(!debugMipmap) {
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
+				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
+			}
+
+			data = newData;
+			previousWidth = newWidth;
+
+			newWidth /= 2;
+			newHeight /= 2;
+		}
+	}
+	protected int blendColor(int color0, int color1) {
+		int alpha0 = (color0 >> 24) & 0xFF;
+		int alpha1 = (color1 >> 24) & 0xFF;
+
+		int alphaAvg = (alpha0 + alpha1) / 2;
+
+		if(alpha0 == 0 && alpha1 == 0) {
+			alpha0 = 1;
+			alpha1 = 1;
+		}else {
+			if(alpha0 == 0) {
+				color0 = color1;
+				alphaAvg /= 2;
+			}
+			if(alpha1 == 0) {
+				color1 = color0;
+				alphaAvg /= 2;
+			}
+		}
+
+		int r0 = (color0 >> 16 & 0xFF) * alpha0;
+		int g0 = (color0 >>  8 & 0xFF) * alpha0;
+		int b0 = (color0 >>  0 & 0xFF) * alpha0;
+
+		int r1 = (color1 >> 16 & 0xFF) * alpha1;
+		int g1 = (color1 >>  8 & 0xFF) * alpha1;
+		int b1 = (color1 >>  0 & 0xFF) * alpha1;
+
+		int rAvg = (r0 + r1) / (alpha0 + alpha1);
+		int gAvg = (g0 + g1) / (alpha0 + alpha1);
+		int bAvg = (b0 + b1) / (alpha0 + alpha1);
+
+		return alphaAvg << 24 | rAvg << 16 | gAvg << 8 | bAvg;
+	}
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/AnimationProperties.java b/src/main/java/net/minecraft/client/render/texture/meta/AnimationProperties.java
new file mode 100644
index 000000000..6b7a68fea
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/AnimationProperties.java
@@ -0,0 +1,32 @@
+package net.minecraft.client.render.texture.meta;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+public class AnimationProperties {
+    public final boolean interpolate;
+    public final boolean random;
+    public final int width;
+    public final int height;
+    public final int frametime;
+    public final @Nullable List<Frame> frames;
+    public AnimationProperties(boolean interpolate, boolean random, int width, int height, int frametime, @Nullable List<Frame> frames) {
+        this.interpolate = interpolate;
+        this.random = random;
+        this.width = width;
+        this.height = height;
+        this.frametime = frametime;
+        this.frames = frames;
+    }
+
+    public static class Frame {
+        public final int index;
+        public final int time;
+
+        public Frame(int index, int time) {
+            this.index = index;
+            this.time = time;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/AnimationPropertiesAdapter.java b/src/main/java/net/minecraft/client/render/texture/meta/AnimationPropertiesAdapter.java
new file mode 100644
index 000000000..1a744c5af
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/AnimationPropertiesAdapter.java
@@ -0,0 +1,72 @@
+package net.minecraft.client.render.texture.meta;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AnimationPropertiesAdapter implements JsonDeserializer<AnimationProperties>, JsonSerializer<AnimationProperties> {
+    @Override
+    public AnimationProperties deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject obj = json.getAsJsonObject();
+        boolean interpolate = false;
+        boolean random = false;
+        int width = 1;
+        int height = 1;
+        int frametime = 1;
+        List< AnimationProperties.Frame > frames = null;
+
+        if (obj.has("interpolate")) {
+            interpolate = obj.get("interpolate").getAsBoolean();
+        }
+
+        if (obj.has("random")) {
+            random = obj.get("random").getAsBoolean();
+        }
+
+        if (obj.has("width")) {
+            width = obj.get("width").getAsInt();
+        }
+
+        if (obj.has("height")) {
+            height = obj.get("height").getAsInt();
+        }
+
+        if (obj.has("frametime")) {
+            frametime = obj.get("frametime").getAsInt();
+        }
+
+        if (obj.has("frames")) {
+            JsonArray array = obj.getAsJsonArray("frames");
+            frames = new ArrayList<>();
+            for (JsonElement e : array) {
+                if (e.isJsonPrimitive()) {
+                    frames.add(new AnimationProperties.Frame(e.getAsInt(), frametime));
+                    continue;
+                }
+                JsonObject frameObject = e.getAsJsonObject();
+                int index = frameObject.get("index").getAsInt();
+                int time = frametime;
+                if (frameObject.has("time")) {
+                    time = frameObject.get("time").getAsInt();
+                }
+                frames.add(new AnimationProperties.Frame(index, time));
+            }
+        }
+
+        return new AnimationProperties(interpolate, random, width, height, frametime, frames);
+    }
+
+    @Override
+    public JsonElement serialize(AnimationProperties src, Type typeOfSrc, JsonSerializationContext context) {
+        return null;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/TextureMetaHandler.java b/src/main/java/net/minecraft/client/render/texture/meta/TextureMetaHandler.java
new file mode 100644
index 000000000..a679a2b34
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/TextureMetaHandler.java
@@ -0,0 +1,94 @@
+package net.minecraft.client.render.texture.meta;
+
+import com.b100.utils.StringUtils;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonParser;
+import net.minecraft.client.render.texture.meta.gui.GuiTextureProperties;
+import net.minecraft.client.render.texture.meta.gui.GuiTexturePropertiesAdapter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TextureMetaHandler {
+    private static final Gson GSON;
+    static {
+        GsonBuilder builder = new GsonBuilder();
+        builder.setPrettyPrinting();
+        builder.registerTypeAdapter(TextureProperties.class, new TexturePropertiesAdapter());
+        builder.registerTypeAdapter(AnimationProperties.class, new AnimationPropertiesAdapter());
+        builder.registerTypeAdapter(GuiTextureProperties.class, new GuiTexturePropertiesAdapter());
+        GSON = builder.create();
+    }
+    @Nullable
+    private JsonObject metaJson = null;
+    @NotNull
+    private final Map<String, Object> cachedData = new HashMap<>();
+
+    public void reset() {
+        metaJson = null;
+        cachedData.clear();
+    }
+
+    public void loadFromStream(InputStream stream) {
+        String jsonString;
+        try {
+            jsonString = StringUtils.readInputString(stream);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return;
+        }
+        try {
+            metaJson = JsonParser.parseString(jsonString).getAsJsonObject();
+        } catch (JsonParseException e) { // TODO, replace with proper non-fatal error logging
+            e.printStackTrace();
+        }
+    }
+
+    public boolean has(String key) {
+        return cachedData.containsKey(key) || (metaJson != null && metaJson.has(key));
+    }
+
+    @SuppressWarnings("unchecked") // I'm literally checking
+    public @Nullable <T> T get(String key, Class<T> aClass) {
+        if (cachedData.containsKey(key)) {
+            Object o = cachedData.get(key);
+            if (o.getClass().isAssignableFrom(aClass)) {
+                return (T) cachedData.get(key);
+            }
+        }
+        if (metaJson != null && metaJson.has(key)) {
+            T obj = GSON.fromJson(metaJson.get(key), aClass);
+            cachedData.put(key, obj);
+            return obj;
+        }
+        return null;
+    }
+
+    @SuppressWarnings("unchecked") // I'm literally checking
+    public <T> T getOrDefault(String key, T metaDefault, Class<T> aClass) {
+        if (cachedData.containsKey(key)) {
+            Object o = cachedData.get(key);
+            if (o.getClass().isAssignableFrom(aClass)) {
+                return (T) cachedData.get(key);
+            }
+        }
+        if (metaJson != null && metaJson.has(key)) {
+            T obj = GSON.fromJson(metaJson.get(key), aClass);
+            cachedData.put(key, obj);
+            return obj;
+        }
+        return metaDefault;
+    }
+
+    @Override
+    public String toString(){
+        if (metaJson == null) return null;
+        return GSON.toJson(metaJson);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/TextureProperties.java b/src/main/java/net/minecraft/client/render/texture/meta/TextureProperties.java
new file mode 100644
index 000000000..aa20211c4
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/TextureProperties.java
@@ -0,0 +1,26 @@
+package net.minecraft.client.render.texture.meta;
+
+public class TextureProperties {
+    public final boolean blur;
+    public final boolean clamp;
+    public final boolean mipmap;
+    public TextureProperties(Boolean blur, Boolean clamp, Boolean mipmap) {
+        if (blur == null) {
+            this.blur = false;
+        } else {
+            this.blur = blur;
+        }
+
+        if (clamp == null) {
+            this.clamp = false;
+        } else {
+            this.clamp = clamp;
+        }
+
+        if (mipmap == null) {
+            this.mipmap = false;
+        } else {
+            this.mipmap = mipmap;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/TexturePropertiesAdapter.java b/src/main/java/net/minecraft/client/render/texture/meta/TexturePropertiesAdapter.java
new file mode 100644
index 000000000..68a6ba04a
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/TexturePropertiesAdapter.java
@@ -0,0 +1,40 @@
+package net.minecraft.client.render.texture.meta;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+
+public class TexturePropertiesAdapter implements JsonDeserializer<TextureProperties>, JsonSerializer<TextureProperties> {
+    @Override
+    public TextureProperties deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject jObject = json.getAsJsonObject();
+        Boolean blur = null;
+        Boolean clamp = null;
+        Boolean mip = null;
+        if (jObject.has("blur")) {
+            blur = jObject.get("blur").getAsBoolean();
+        }
+        if (jObject.has("clamp")) {
+            clamp = jObject.get("clamp").getAsBoolean();
+        }
+        if (jObject.has("mipmaps")) {
+            mip = jObject.get("mipmaps").getAsBoolean();
+        }
+        return new TextureProperties(blur, clamp, mip);
+    }
+
+    @Override
+    public JsonElement serialize(TextureProperties src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject obj = new JsonObject();
+        obj.addProperty("blur",     src.blur);
+        obj.addProperty("clamp",    src.clamp);
+        obj.addProperty("mipmaps",  src.mipmap);
+        return obj;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTextureProperties.java b/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTextureProperties.java
new file mode 100644
index 000000000..9cf491e4d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTextureProperties.java
@@ -0,0 +1,37 @@
+package net.minecraft.client.render.texture.meta.gui;
+
+public class GuiTextureProperties {
+    public static final String TYPE_STRETCH = "stretch";
+    public static final String TYPE_TILE = "tile";
+    public static final String TYPE_NINE_SLICE = "nine_slice";
+
+    public final String type;
+    public final int width;
+    public final int height;
+    public final Border border;
+
+    public GuiTextureProperties(String type, int width, int height, Border border) {
+        this.type = type;
+        this.width = width;
+        this.height = height;
+        this.border = border;
+    }
+
+    public static class Border {
+        public final int left;
+        public final int top;
+        public final int right;
+        public final int bottom;
+
+        public Border(int size) {
+            left = top = right = bottom = size;
+        }
+
+        public Border(int left, int top, int right, int bottom) {
+            this.left = left;
+            this.top = top;
+            this.right = right;
+            this.bottom = bottom;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTexturePropertiesAdapter.java b/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTexturePropertiesAdapter.java
new file mode 100644
index 000000000..08c7e3292
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/texture/meta/gui/GuiTexturePropertiesAdapter.java
@@ -0,0 +1,62 @@
+package net.minecraft.client.render.texture.meta.gui;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+
+public class GuiTexturePropertiesAdapter implements JsonDeserializer<GuiTextureProperties>, JsonSerializer<GuiTextureProperties> {
+    @Override
+    public GuiTextureProperties deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+        JsonObject jo = json.getAsJsonObject();
+        String type = GuiTextureProperties.TYPE_STRETCH;
+        int width = jo.get("width").getAsInt();
+        int height = jo.get("height").getAsInt();
+        GuiTextureProperties.Border border = new GuiTextureProperties.Border(0);
+
+        if (jo.has("type")) {
+            type = jo.get("type").getAsString();
+        }
+
+        if (jo.has("border")) {
+            JsonElement be = jo.get("border");
+            if (be.isJsonPrimitive()) {
+                border = new GuiTextureProperties.Border(be.getAsInt());
+            } else if (be.isJsonObject()) {
+                JsonObject borderObj = be.getAsJsonObject();
+                border = new GuiTextureProperties.Border(
+                    borderObj.get("left").getAsInt(),
+                    borderObj.get("top").getAsInt(),
+                    borderObj.get("right").getAsInt(),
+                    borderObj.get("bottom").getAsInt());
+            }
+        }
+
+        return new GuiTextureProperties(type, width, height, border);
+    }
+
+    @Override
+    public JsonElement serialize(GuiTextureProperties src, Type typeOfSrc, JsonSerializationContext context) {
+        JsonObject element = new JsonObject();
+        element.addProperty("type", src.type);
+        element.addProperty("width", src.width);
+        element.addProperty("height", src.height);
+        if (src.border.left == src.border.right && src.border.left == src.border.top && src.border.left == src.border.bottom) {
+            element.addProperty("border", src.border.left);
+        } else {
+            JsonObject border = new JsonObject();
+            border.addProperty("left", src.border.left);
+            border.addProperty("top", src.border.top);
+            border.addProperty("right", src.border.right);
+            border.addProperty("bottom", src.border.bottom);
+            element.add("border", border);
+        }
+
+        return element;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java b/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
similarity index 51%
rename from src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java
rename to src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
index 6b6d901a9..681dc91be 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/AtlasStitcher.java
+++ b/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
@@ -1,30 +1,33 @@
-package net.minecraft.client.render.stitcher;
+package net.minecraft.client.render.texture.stitcher;
 
 import java.awt.AlphaComposite;
 import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
-import net.minecraft.core.Global;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texture.Texture;
+import net.minecraft.client.render.texturepack.TexturePack;
 import net.minecraft.core.util.collection.NamespaceID;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import net.minecraft.client.GLAllocation;
-import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.customatlas.CustomAtlasHandler;
 import net.minecraft.client.util.helper.Textures;
 
-public class AtlasStitcher {
-    private static final Minecraft mc = Minecraft.getMinecraft(AtlasStitcher.class);
+public class AtlasStitcher extends Texture {
     public static final String rootAssetPath = "/assets";
     public Map<NamespaceID, IconCoordinate> textureMap = new HashMap<>();
-    public Set<IconCoordinate> dontSetSize = new HashSet<>();
     public BufferedImage atlas;
     public final String directoryPath;
     @Nullable
@@ -33,11 +36,11 @@ public class AtlasStitcher {
     private int atlasHeight;
     private double invWidth;
     private double invHeight;
-    private final int textureId;
     private final boolean mipmap;
-    public AtlasStitcher(String directoryPath, boolean mipmap, @Nullable String defaultTexture){
+    private final boolean tickPaused;
+    public AtlasStitcher(String directoryPath, boolean tickWhenPaused, boolean mipmap, @Nullable String defaultTexture){
         this.directoryPath = directoryPath;
-        this.textureId = Global.isServer ? -1 : GLAllocation.generateTexture();
+        this.tickPaused = tickWhenPaused;
         this.mipmap = mipmap;
         this.defaultTexture = defaultTexture;
     }
@@ -52,31 +55,44 @@ public class AtlasStitcher {
     public String getSourceImagePath(@NotNull NamespaceID id){
         return String.format("%s/%s/%s/%s.png", rootAssetPath, id.namespace, directoryPath, id.value);
     }
-    public void generateAtlas(){
+
+    public void preinit() {
+        generate();
+        long startTime = System.nanoTime();
+        Minecraft mc = Minecraft.getMinecraft(this);
+        List<IconCoordinate> coordinateList = new ArrayList<>(textureMap.values());
+        List<Future<?>> futures = new ArrayList<>();
+        ExecutorService service = Executors.newFixedThreadPool(32);
+        for (IconCoordinate coordinate : coordinateList){
+            futures.add(service.submit(new SetupTexture(mc, coordinate, defaultTexture)));
+        }
+        for (Future<?> f : futures) {
+            try {
+                f.get();
+            } catch (InterruptedException | ExecutionException e) {
+                e.printStackTrace();
+            }
+        }
+        service.shutdown();
+        System.out.println("Took '" + (System.nanoTime() - startTime)/1_000_000_000d + "' seconds to load images.");
+    }
+
+    @Override
+    public void init(){
         // Load all individual textures and the store the widths
         int area = 0;
         int maxWidth = 0;
         List<IconCoordinate> coordinateList = new ArrayList<>(textureMap.values());
         for (IconCoordinate coordinate : coordinateList){
-        	if(dontSetSize.contains(coordinate)) {
-        		continue;
-        	}
-            BufferedImage image = Textures.readImage(mc.texturePackList.getResourceAsStream(coordinate.sourceImage));
-            if (image == null || image == Textures.missingTexture){
-                System.out.println(coordinate.sourceImage + " could not be found!");
-                if (defaultTexture != null){
-                    image = Textures.readImage(mc.texturePackList.getResourceAsStream(defaultTexture));
-                }
-                if (image == null) image = Textures.missingTexture; // If this ever happens I'll be very sad
+            if (coordinate.needsDimensions()) {
+                BufferedImage image = coordinate.getImageStorage();
+                coordinate.setDimension(image.getWidth(), image.getHeight());
             }
-            coordinate.setImage(image);
-            coordinate.setDimension(image.getWidth(), image.getHeight());
             area += coordinate.getArea();
             if (coordinate.width > maxWidth) maxWidth = coordinate.width;
         }
-        dontSetSize.clear();
         // Calculate an okay atlas width to keep the aspect ratio of the final atlas mostly 1:1
-        int targetWidth = (int) (Math.max(Math.ceil(Math.sqrt(area)), maxWidth));
+        int targetWidth = Integer.highestOneBit((int) Math.max(Math.ceil(Math.sqrt(area)), maxWidth)) << 1;
         Collections.sort(coordinateList);
 
         // Find positions for each texture on the atlas
@@ -95,11 +111,8 @@ public class AtlasStitcher {
             if (nextX > maxRealWidth) maxRealWidth = nextX;
         }
 
-        // Needs to be square or mipmaps die
-        int length = Math.max(maxRealWidth, nextY);
-
         // Generate and then copy the data to a new image with the dimensions needed
-        BufferedImage generatedAtlas = new BufferedImage(length, length, BufferedImage.TYPE_INT_ARGB);
+        BufferedImage generatedAtlas = new BufferedImage(targetWidth, Integer.highestOneBit(nextY) << 1, BufferedImage.TYPE_INT_ARGB);
         Graphics2D atlas = generatedAtlas.createGraphics();
         atlas.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
         for (IconCoordinate coordinate : coordinateList){
@@ -114,21 +127,9 @@ public class AtlasStitcher {
         invHeight = 1d/atlasHeight;
         this.atlas = generatedAtlas;
 
-//        File folder = new File(Global.accessor.getMinecraftDir(), "testDumps");
-//        folder.mkdirs();
-//        Textures.saveImage(new File(folder, "atlasTest.png"), generatedAtlas);
-//        for (IconCoordinate c : coordinateList){
-//            System.out.println(c);
-//        }
-
-        mc.renderEngine.setupTexture(this.atlas, textureId, mipmap);
-    }
-    public void bindTexture(){
-        mc.renderEngine.bindTexture(textureId);
-    }
-    public int getTextureId(){
-        return textureId;
+        setupTexture(this.atlas, false, false, mipmap);
     }
+
     public int getAtlasWidth(){
         return atlasWidth;
     }
@@ -141,4 +142,46 @@ public class AtlasStitcher {
     public double getInverseHeight(){
         return invHeight;
     }
+    public boolean tickWhenPaused() {return tickPaused;}
+    public boolean hasMipmaps() {return mipmap;}
+
+    public static class SetupTexture implements Callable<IconCoordinate> {
+        private final Minecraft mc;
+        private final IconCoordinate coordinate;
+        private final String defaultTexture;
+        public SetupTexture(Minecraft mc, IconCoordinate coordinate, String defaultTexture) {
+            this.mc = mc;
+            this.coordinate = coordinate;
+            this.defaultTexture = defaultTexture;
+        }
+        @Override
+        public IconCoordinate call() throws Exception {
+            coordinate.resetMetadata();
+            BufferedImage image = CustomAtlasHandler.getTextureOverride(mc.texturePackList, coordinate.sourceImage);
+            if(image == null) {
+                TexturePack pack = mc.texturePackList.getHighestPriorityTexturePackWithFile(coordinate.sourceImage);
+                if (pack != null) {
+                    image = Textures.readImage(pack.getResourceAsStream(coordinate.sourceImage));
+                    String metaPath = coordinate.sourceImage + ".mcmeta";
+                    if (pack.hasFile(metaPath)) {
+                        try (InputStream stream = pack.getResourceAsStream(metaPath)){
+                            coordinate.initMetadata(stream);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+
+            }
+            if (image == null || image == Textures.missingTexture){
+                System.out.println(coordinate.sourceImage + " could not be found!");
+                if (defaultTexture != null){
+                    image = Textures.readImage(mc.texturePackList.getResourceAsStream(defaultTexture));
+                }
+                if (image == null) image = Textures.missingTexture; // If this ever happens I'll be very sad
+            }
+            coordinate.setImage(image);
+            return coordinate;
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/stitcher/IconCoordinate.java b/src/main/java/net/minecraft/client/render/texture/stitcher/IconCoordinate.java
similarity index 63%
rename from src/main/java/net/minecraft/client/render/stitcher/IconCoordinate.java
rename to src/main/java/net/minecraft/client/render/texture/stitcher/IconCoordinate.java
index 6557c41c8..f8029c1ca 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/IconCoordinate.java
+++ b/src/main/java/net/minecraft/client/render/texture/stitcher/IconCoordinate.java
@@ -1,17 +1,22 @@
-package net.minecraft.client.render.stitcher;
+package net.minecraft.client.render.texture.stitcher;
 
+import net.minecraft.client.render.texture.meta.TextureMetaHandler;
 import net.minecraft.core.util.collection.NamespaceID;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.awt.*;
 import java.awt.image.BufferedImage;
+import java.io.InputStream;
 
 public class IconCoordinate implements Comparable<IconCoordinate> {
     public int iconX;
     public int iconY;
     public int width;
     public int height;
+    private boolean pendingDimensions;
     protected final String sourceImage;
+    protected final TextureMetaHandler metaHandler = new TextureMetaHandler();
     public final NamespaceID namespaceId;
     public final AtlasStitcher parentAtlas;
     private BufferedImage _imageStorage;
@@ -21,14 +26,27 @@ public class IconCoordinate implements Comparable<IconCoordinate> {
         this.sourceImage = sourceImage;
     }
     protected void setImage(BufferedImage image){
+        this.pendingDimensions = true;
         this._imageStorage = image;
     }
+
+    // This will only ever return the actual image when used during a very narrow period of time
+    // Its very much for use with the atlas stitching process and dynamic textures
+    public BufferedImage getImageStorage() {
+        return _imageStorage;
+    }
+
     protected void discardImage(){
         this._imageStorage = null;
     }
+
+    public boolean needsDimensions() {
+        return pendingDimensions;
+    }
     public void setDimension(int width, int height){
         this.width = width;
         this.height = height;
+        pendingDimensions = false;
     }
     public void setPosition(int x, int y){
         this.iconX = x;
@@ -62,10 +80,34 @@ public class IconCoordinate implements Comparable<IconCoordinate> {
         return String.format("W:%d, H:%d, X:%d, Y:%d | ID:%s, Source:%s", width, height, iconX, iconY, namespaceId, sourceImage);
     }
 
+    public String getImageSource() {
+        return sourceImage;
+    }
+
     @Override
     public int compareTo(@NotNull IconCoordinate o) {
         int res = o.height - height;
         if (res != 0) return res;
         return namespaceId.compareTo(o.namespaceId);
     }
+
+    protected void resetMetadata() {
+        metaHandler.reset();
+    }
+
+    protected void initMetadata(InputStream stream) {
+        metaHandler.loadFromStream(stream);
+    }
+
+    public boolean hasMeta(String key) {
+        return metaHandler.has(key);
+    }
+
+    public @Nullable <T> T getMeta(String key, Class<T> aClass) {
+        return metaHandler.get(key, aClass);
+    }
+
+    public <T> T getOrDefaultMeta(String key, T metaDefault, Class<T> aClass) {
+        return metaHandler.getOrDefault(key, metaDefault, aClass);
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java b/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
similarity index 82%
rename from src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
rename to src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
index 011fb256b..070eee5f0 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
+++ b/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
@@ -1,9 +1,11 @@
-package net.minecraft.client.render.stitcher;
+package net.minecraft.client.render.texture.stitcher;
 
+
+
+import net.minecraft.core.util.HardIllegalArgumentException;
 import net.minecraft.core.util.collection.NamespaceID;
 import org.jetbrains.annotations.NotNull;
 
-import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -13,30 +15,34 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 import java.util.stream.Stream;
 
 public class TextureRegistry {
     public static HashMap<String, AtlasStitcher> stitcherMap = new HashMap<>();
     @SuppressWarnings("unused")
-    public static AtlasStitcher blockAtlas = register("block", new AtlasStitcher("textures/block", true, "/assets/minecraft/textures/block/texture_missing.png"));
+    public static AtlasStitcher blockAtlas = register("block", new AtlasStitcher("textures/block", false, true, "/assets/minecraft/textures/block/texture_missing.png"));
+    @SuppressWarnings("unused")
+    public static AtlasStitcher itemAtlas =  register("item", new AtlasStitcher("textures/item", false, true, "/assets/minecraft/textures/item/texture_missing.png"));
+    @SuppressWarnings("unused")
+    public static AtlasStitcher particleAtlas = register("particle", new AtlasStitcher("textures/particle", false, true, null));
     @SuppressWarnings("unused")
-    public static AtlasStitcher itemAtlas =  register("item", new AtlasStitcher("textures/item", true, "/assets/minecraft/textures/item/texture_missing.png"));
+    public static AtlasStitcher artAtlas = register("art", new AtlasStitcher("textures/art", false, true, null));
     @SuppressWarnings("unused")
-    public static AtlasStitcher particleAtlas = register("particle", new AtlasStitcher("textures/particle", false, null));
+    public static AtlasStitcher guiSpriteAtlas = register("gui", new AtlasStitcher("textures/gui/sprites", true, false, null));
     @SuppressWarnings("unused")
-    public static AtlasStitcher artAtlas = register("art", new AtlasStitcher("textures/art", false, null));
+    public static AtlasStitcher signAtlas = register("sign", new AtlasStitcher("textures/gui/sign", false, false, null));
 
     public static @NotNull IconCoordinate getTexture(@NotNull String key){
-        return getTexture(new NamespaceID(key));
+        try {
+            return getTexture(new NamespaceID(key));
+        } catch (HardIllegalArgumentException e) {
+            throw new RuntimeException(e);
+        }
     }
     public static @NotNull IconCoordinate getTexture(@NotNull NamespaceID id){
         String[] split2 = id.value.split("/");
@@ -51,7 +57,11 @@ public class TextureRegistry {
         return atlas.getTexture(new NamespaceID(id.namespace, target.toString()));
     }
     public static boolean hasTexture(@NotNull String key) {
-        return hasTexture(new NamespaceID(key));
+        try {
+            return hasTexture(new NamespaceID(key));
+        } catch (HardIllegalArgumentException e) {
+            throw new RuntimeException(e);
+        }
     }
     public static boolean hasTexture(@NotNull NamespaceID id){
         String[] split2 = id.value.split("/");
@@ -89,7 +99,7 @@ public class TextureRegistry {
 //        System.out.println("Printing " + path);
         for (String s : files) {
 //            System.out.println(s);
-            atlas.getTexture(new NamespaceID(namespace, s.replace(".png", "")));
+            atlas.getTexture(new NamespaceID(namespace, s.replace(".png", "").replace("//", "/")));
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/texturepack/TexturePackCustom.java b/src/main/java/net/minecraft/client/render/texturepack/TexturePackCustom.java
index 1a3774c65..6fe225e61 100644
--- a/src/main/java/net/minecraft/client/render/texturepack/TexturePackCustom.java
+++ b/src/main/java/net/minecraft/client/render/texturepack/TexturePackCustom.java
@@ -14,23 +14,22 @@ import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import org.lwjgl.opengl.GL11;
-
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texture.BufferedTexture;
 import net.minecraft.client.render.texturepack.Manifest.ManifestException;
 
 import javax.imageio.ImageIO;
 
 public class TexturePackCustom extends TexturePack
 {
-	private int thumbnailImage;
+	private BufferedTexture thumbnailImage;
 	private BufferedImage thumbnailBuffer;
-	private final File file;
+	public final File file;
 	private ZipFile zipFile;
 
     public TexturePackCustom(File file)
     {
-        thumbnailImage = -1;
+        thumbnailImage = null;
         fileName = file.getName();
         this.file = file;
     }
@@ -173,7 +172,8 @@ public class TexturePackCustom extends TexturePack
     {
         if(thumbnailBuffer != null)
         {
-            minecraft.renderEngine.deleteTexture(thumbnailImage);
+			thumbnailImage.delete();
+			thumbnailImage = null;
         }
         closeTexturePackFile();
     }
@@ -181,16 +181,16 @@ public class TexturePackCustom extends TexturePack
     @Override
 	public void bindThumbnailTexture(Minecraft minecraft)
     {
-        if(thumbnailBuffer != null && thumbnailImage < 0)
+        if(thumbnailBuffer != null && thumbnailImage == null)
         {
-            thumbnailImage = minecraft.renderEngine.allocateAndSetupTexture(thumbnailBuffer);
+            thumbnailImage = minecraft.renderEngine.loadBufferedTexture(thumbnailBuffer);
         }
         if(thumbnailBuffer != null)
         {
             minecraft.renderEngine.bindTexture(thumbnailImage);
         } else
         {
-            GL11.glBindTexture(GL11.GL_TEXTURE_2D, minecraft.renderEngine.getTexture("/assets/minecraft/textures/gui/unknown_pack.png"));
+			minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/unknown_pack.png").bind();
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/texturepack/TexturePackDefault.java b/src/main/java/net/minecraft/client/render/texturepack/TexturePackDefault.java
index 58749dd1f..8954c1e4a 100644
--- a/src/main/java/net/minecraft/client/render/texturepack/TexturePackDefault.java
+++ b/src/main/java/net/minecraft/client/render/texturepack/TexturePackDefault.java
@@ -6,18 +6,17 @@ import java.io.InputStream;
 
 import javax.imageio.ImageIO;
 
-import org.lwjgl.opengl.GL11;
-
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.texture.BufferedTexture;
 
 public class TexturePackDefault extends TexturePack
 {
-    private int texturePackThumbnailTexture;
+    private BufferedTexture texturePackThumbnailTexture;
     private BufferedImage texturePackThumbnail;
 
     public TexturePackDefault()
     {
-        texturePackThumbnailTexture = -1;
+        texturePackThumbnailTexture = null;
         fileName = "Default";
         manifest = new Manifest(null, TexturePackDefault.class.getResourceAsStream("/manifest.json"));
         try
@@ -33,18 +32,18 @@ public class TexturePackDefault extends TexturePack
     @Override
     public void disposeOfTexturePack(Minecraft minecraft)
     {
-        if(texturePackThumbnail != null)
-        {
-            minecraft.renderEngine.deleteTexture(texturePackThumbnailTexture);
+        if(texturePackThumbnail != null) {
+            texturePackThumbnailTexture.delete();
+            texturePackThumbnailTexture = null;
         }
     }
 
     @Override
     public void bindThumbnailTexture(Minecraft minecraft)
     {
-        if(texturePackThumbnail != null && texturePackThumbnailTexture < 0)
+        if(texturePackThumbnail != null && texturePackThumbnailTexture == null)
         {
-            texturePackThumbnailTexture = minecraft.renderEngine.allocateAndSetupTexture(texturePackThumbnail);
+            texturePackThumbnailTexture = minecraft.renderEngine.loadBufferedTexture(texturePackThumbnail);
         }
         if(texturePackThumbnail != null)
         {
@@ -52,7 +51,7 @@ public class TexturePackDefault extends TexturePack
         }
         else
         {
-            GL11.glBindTexture(GL11.GL_TEXTURE_2D, minecraft.renderEngine.getTexture("/assets/minecraft/textures/gui/unknown_pack.png"));
+            minecraft.renderEngine.loadTexture("/assets/minecraft/textures/gui/unknown_pack.png").bind();
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java b/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
index 0cbc89bf7..3ad526b0c 100644
--- a/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
+++ b/src/main/java/net/minecraft/client/render/texturepack/TexturePackList.java
@@ -2,6 +2,8 @@ package net.minecraft.client.render.texturepack;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
+import net.minecraft.core.Global;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.io.IOException;
@@ -86,7 +88,7 @@ public class TexturePackList
 		mc.fontRenderer = new FontRenderer(mc, mc.gameSettings, "/font/default.png", mc.renderEngine);
 		mc.renderGlobal.loadRenderers();
 		mc.currentScreen.refreshFontRenderer();
-		mc.renderEngine.updateDynamicTextures();
+		mc.renderEngine.updateDynamicTextures(false);
 	}
 
 	public boolean updateAvailableTexturePacks() {
@@ -98,18 +100,19 @@ public class TexturePackList
 			File[] filesInDir = texturePackDir.listFiles();
 			
 			if(filesInDir != null) {
-//				 remove this before releasing any live builds, this is explicitly so I can refresh the resources ingame without recompiling
-//				File[] tempList = new File[filesInDir.length + 1];
-//				for (int i = 0; i < tempList.length; i++) {
-//					if (i < tempList.length - 1){
-//						tempList[i] = filesInDir[i];
-//					} else {
-//						File local = new File("./src/main/resources");
-//						System.out.println(local.getAbsoluteFile());
-//						tempList[i] = local;
-//					}
-//				}
-//				filesInDir = tempList;
+				if (Global.BUILD_CHANNEL.isUnstableBuild()) { // Load project resources as an available texture pack
+					File[] tempList = new File[filesInDir.length + 1];
+					for (int i = 0; i < tempList.length; i++) {
+						if (i < tempList.length - 1){
+							tempList[i] = filesInDir[i];
+						} else {
+							File local = new File("./src/main/resources");
+							System.out.println(local.getAbsoluteFile());
+							tempList[i] = local;
+						}
+					}
+					filesInDir = tempList;
+				}
 
 				for(File file : filesInDir) {
 					if(!isTexturePack(file)) {
@@ -208,7 +211,7 @@ public class TexturePackList
 		return selectedPacks.get(selectedPacks.size()-1);
 	}
 	
-	public TexturePack getHighestPriorityTexturePackWithFile(String path) {
+	public @Nullable TexturePack getHighestPriorityTexturePackWithFile(String path) {
 		for(int i = selectedPacks.size() - 1; i >= 0; i--) {
 			TexturePack texturePack = selectedPacks.get(i);
 			if(texturePack.hasFile(path)) {
diff --git a/src/main/java/net/minecraft/client/render/window/GameWindowLWJGL2.java b/src/main/java/net/minecraft/client/render/window/GameWindowLWJGL2.java
index de85a957e..778539a67 100644
--- a/src/main/java/net/minecraft/client/render/window/GameWindowLWJGL2.java
+++ b/src/main/java/net/minecraft/client/render/window/GameWindowLWJGL2.java
@@ -57,7 +57,7 @@ public class GameWindowLWJGL2 implements GameWindow {
                 Thread.sleep(1000L);
             }
             catch(InterruptedException ignored) { }
-            Display.create();
+            Display.create(new PixelFormat());
         }
 	}
 
diff --git a/src/main/java/net/minecraft/client/sound/CodecMus.java b/src/main/java/net/minecraft/client/sound/CodecMus.java
index 00402653e..66b9cd587 100644
--- a/src/main/java/net/minecraft/client/sound/CodecMus.java
+++ b/src/main/java/net/minecraft/client/sound/CodecMus.java
@@ -2,24 +2,70 @@ package net.minecraft.client.sound;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URL;
 
+import org.jetbrains.annotations.NotNull;
 import paulscode.sound.codecs.CodecJOrbis;
 
 // Referenced classes of package net.minecraft.src:
-//            MusInputStream
+//            DecoderInputStream
 
 public class CodecMus extends CodecJOrbis {
 
-    public CodecMus() {
-    }
-
     @Override
 	protected InputStream openInputStream() {
         try {
-            return new MusInputStream(this, url, urlConnection.getInputStream());
+            return new DecoderInputStream(url, urlConnection.getInputStream());
         } catch (IOException e) {
             e.printStackTrace();
             return null;
         }
     }
+    private static class DecoderInputStream extends InputStream
+    {
+
+        private int hash;
+        private final InputStream inputStream;
+        byte[] buffer;
+
+        public DecoderInputStream(URL url, InputStream inputstream)
+        {
+            buffer = new byte[1];
+            inputStream = inputstream;
+            String s = url.getPath();
+            s = s.substring(s.lastIndexOf("/") + 1);
+            hash = s.hashCode();
+        }
+
+        @Override
+        public int read()
+        {
+            int i = read(buffer, 0, 1);
+            if(i < 0)
+            {
+                return i;
+            } else
+            {
+                return buffer[0];
+            }
+        }
+
+        @Override
+        public int read(byte abyte0[], int i, int j)
+        {
+            try {
+                j = inputStream.read(abyte0, i, j);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return 0;
+            }
+            for(int k = 0; k < j; k++)
+            {
+                byte byte0 = abyte0[i + k] ^= hash >> 8;
+                hash = hash * 0x1dba038f + 0x14ee3 * byte0;
+            }
+
+            return j;
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/client/sound/MusInputStream.java b/src/main/java/net/minecraft/client/sound/MusInputStream.java
deleted file mode 100644
index ef00b94a7..000000000
--- a/src/main/java/net/minecraft/client/sound/MusInputStream.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package net.minecraft.client.sound;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-// Referenced classes of package net.minecraft.src:
-//            CodecMus
-
-class MusInputStream extends InputStream
-{
-
-    public MusInputStream(CodecMus codecmus, URL url, InputStream inputstream)
-    {
-//        super();
-        codec = codecmus;
-        buffer = new byte[1];
-        inputStream = inputstream;
-        String s = url.getPath();
-        s = s.substring(s.lastIndexOf("/") + 1);
-        hash = s.hashCode();
-    }
-
-    @Override
-	public int read()
-    {
-        int i = read(buffer, 0, 1);
-        if(i < 0)
-        {
-            return i;
-        } else
-        {
-            return buffer[0];
-        }
-    }
-
-    @Override
-	public int read(byte abyte0[], int i, int j)
-    {
-        try {
-            j = inputStream.read(abyte0, i, j);
-        } catch (IOException e) {
-            e.printStackTrace();
-            return 0;
-        }
-        for(int k = 0; k < j; k++)
-        {
-            byte byte0 = abyte0[i + k] ^= hash >> 8;
-            hash = hash * 0x1dba038f + 0x14ee3 * byte0;
-        }
-
-        return j;
-    }
-
-    private int hash;
-    private InputStream inputStream;
-    byte buffer[];
-    final CodecMus codec; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/client/sound/SoundEngine.java b/src/main/java/net/minecraft/client/sound/SoundEngine.java
new file mode 100644
index 000000000..7278b5158
--- /dev/null
+++ b/src/main/java/net/minecraft/client/sound/SoundEngine.java
@@ -0,0 +1,314 @@
+package net.minecraft.client.sound;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Random;
+
+import net.betterthanadventure.sound.LibraryLWJGL3OpenAL;
+import net.minecraft.client.Minecraft;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.client.option.GameSettings;
+import paulscode.sound.SoundSystem;
+import paulscode.sound.SoundSystemConfig;
+import paulscode.sound.codecs.CodecJOrbis;
+import paulscode.sound.codecs.CodecWav;
+import paulscode.sound.libraries.LibraryLWJGLOpenAL;
+
+// Referenced classes of package net.minecraft.src:
+//            SoundRepository, GameSettings, CodecMus, LocalPlayer,
+//            MathHelper, World, SoundEntry, Mob
+
+public class SoundEngine
+{
+	private static final int SOUND_DISTANCE = 16;
+	public static final int MUSIC_INTERVAL = 6000;
+	private static SoundSystem soundSystem;
+	private static boolean loaded = false;
+
+	public final SoundRepository soundRepo;
+	public final SoundRepository streamingRepo;
+	public final SoundRepository musicRepo;
+	public final SoundRepository caveRepo;
+	private int idCounter;
+	private GameSettings options;
+	private final Random random;
+	private Minecraft mc;
+	public int ticksBeforeMusic;
+	private boolean muted = false;
+
+	private static void loadModAudio(final String directory, final SoundRepository targetRepo)
+	{
+		final File file = Minecraft.getAppDir(directory);
+		try {
+			walkFolder(file, file, targetRepo);
+		} catch (final IOException ioexception) {
+			ioexception.printStackTrace();
+		}
+	}
+
+	private static void loadDevAudio(final String directory, final SoundRepository targetRepo)
+	{
+		final File file = new File(directory);
+		try {
+			walkFolder(file, file, targetRepo);
+		} catch (final IOException ioexception) {
+			ioexception.printStackTrace();
+		}
+	}
+
+    private static void walkFolder(final File baseFile, final File currentFile, final SoundRepository targetRepo) throws IOException {
+        if (currentFile.exists() || currentFile.mkdirs()) {
+            final File[] filesInCurrentDir = currentFile.listFiles();
+            if (filesInCurrentDir != null) {
+                for (File file : filesInCurrentDir) {
+                    if (!file.getName().startsWith(".")) {
+                        if (file.isDirectory()) {
+                            walkFolder(baseFile, file, targetRepo);
+                        } else if (file.isFile()) {
+                            final String name = file.getPath().substring(baseFile.getPath().length() + 1).replace('\\', '/');
+                            targetRepo.addSound(name, file);
+                        }
+                    }
+                }
+
+            }
+        }
+    }
+
+	public SoundEngine() {
+        soundRepo = new SoundRepository();
+        streamingRepo = new SoundRepository();
+        musicRepo = new SoundRepository();
+        caveRepo = new SoundRepository();
+        idCounter = 0;
+        random = new Random();
+        ticksBeforeMusic = random.nextInt(MUSIC_INTERVAL);
+    }
+
+    public void addMusic(final String name, final File file) {
+        musicRepo.addSound(name, file);
+    }
+
+    public void addSound(final String name, final File file) {
+        soundRepo.addSound(name, file);
+    }
+
+    public void addStreaming(final String name, final File file) {
+        streamingRepo.addSound(name, file);
+    }
+
+	public void destroy() {
+		if (loaded) {
+			soundSystem.cleanup();
+		}
+	}
+	
+	public void setMuted(boolean muted)
+	{
+		if (soundSystem == null) return;
+		this.muted = muted;
+		if (this.muted) {
+			soundSystem.setVolume("BgMusic", 0.0f);
+		} else {
+			soundSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
+		}
+	}
+
+	public void updateListener(final Mob player, final float partialTick)
+	{
+		if (!loaded || muted || soundSystem == null || !SoundCategoryHelper.isAnyEnabled(options)) {
+			return;
+		}
+		if (player != null) {
+			final float yRot = MathHelper.lerp(player.yRotO, player.yRot, partialTick);
+			final double playerX = MathHelper.lerp(player.xo, player.x, partialTick);
+			final double playerY = MathHelper.lerp(player.yo, player.y, partialTick);
+			final double playerZ = MathHelper.lerp(player.zo, player.z, partialTick);
+			final float yCos = MathHelper.cos(MathHelper.toRadians(-yRot - 180));
+			final float ySin = MathHelper.sin(MathHelper.toRadians(-yRot - 180));
+			final float xa = -ySin;
+			final float ya = 0.0F;
+			final float za = -yCos;
+			final float xa2 = 0.0F;
+			final float ya2 = 1.0F;
+			final float za2 = 0.0F;
+			soundSystem.setListenerPosition((float) playerX, (float) playerY, (float) playerZ);
+			soundSystem.setListenerOrientation(xa, ya, za, xa2, ya2, za2);
+		}
+    }
+
+    public void init(final GameSettings gamesettings) {
+        streamingRepo.trimDigits = false;
+        options = gamesettings;
+        if (!loaded && (gamesettings != null && SoundCategoryHelper.isAnyEnabled(gamesettings))) {
+            loadLibrary();
+        }
+		loadDevAudio("devResources/sound", soundRepo);
+		loadDevAudio("devResources/streaming", streamingRepo);
+		loadDevAudio("devResources/music", musicRepo);
+		loadDevAudio("devResources/cavemusic", caveRepo);
+        loadModAudio("minecraft-bta/resources/mod/sound", soundRepo);
+        loadModAudio("minecraft-bta/resources/mod/streaming", streamingRepo);
+        loadModAudio("minecraft-bta/resources/mod/music", musicRepo);
+        loadModAudio("minecraft-bta/resources/mod/cavemusic", caveRepo);
+		mc = Minecraft.getMinecraft(this);
+    }
+
+    public void updateOptions() {
+        if (!loaded && SoundCategoryHelper.isAnyEnabled(options)) {
+            loadLibrary();
+        }
+        if (soundSystem != null && loaded) {
+            if (SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options) == 0.0F) {
+                soundSystem.stop("BgMusic");
+            } else {
+                soundSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
+            }
+        }
+    }
+
+    public void tick() {
+        if (!loaded || soundSystem == null || SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options) == 0.0F) {
+            return;
+        }
+
+        if (!soundSystem.playing("BgMusic") && !soundSystem.playing("streaming")) {
+            if (ticksBeforeMusic > 0) {
+                ticksBeforeMusic--;
+                return;
+            }
+            SoundEntry entry;
+            if (mc != null && mc.thePlayer != null && !mc.thePlayer.world.canBlockSeeTheSky(MathHelper.floor(mc.thePlayer.x), MathHelper.floor(mc.thePlayer.y), MathHelper.floor(mc.thePlayer.z))) {
+                entry = caveRepo.getAnyEntry();
+            } else {
+                entry = musicRepo.getAnyEntry();
+            }
+            if (entry != null) {
+                ticksBeforeMusic = random.nextInt(MUSIC_INTERVAL) + MUSIC_INTERVAL;
+                soundSystem.backgroundMusic("BgMusic", entry.url, entry.name, false);
+                soundSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
+                soundSystem.play("BgMusic");
+            }
+        }
+    }
+
+	public void playSoundAt(final String soundPath, SoundCategory category, final float x, final float y, final float z, float volume, final float pitch)
+	{
+		if (!loaded || soundSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
+		{
+			return;
+		}
+		final SoundEntry soundEntry = soundRepo.getEntry(soundPath);
+		if (soundEntry != null && volume > 0.0F)
+		{
+			idCounter = (idCounter + 1) % 256;
+			final String soundIdName = "sound_" + idCounter;
+			float f5 = 16F;
+			if (volume > 1.0F)
+			{
+				f5 *= volume;
+			}
+			soundSystem.newSource(volume > 1.0F, soundIdName, soundEntry.url, soundEntry.name, false, x, y, z, 2, f5);
+			soundSystem.setPitch(soundIdName, pitch);
+			if (volume > 1.0F)
+			{
+				volume = 1.0F;
+			}
+			soundSystem.setVolume(soundIdName, volume * SoundCategoryHelper.getEffectiveVolume(category, options));
+			soundSystem.play(soundIdName);
+		}
+	}
+
+	public void playSound(final String soundPath, SoundCategory category, float volume, final float pitch)
+	{
+		if (!loaded || soundSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
+		{
+			return;
+		}
+		final SoundEntry soundEntry = soundRepo.getEntry(soundPath);
+		idCounter = (idCounter + 1) % 256;
+		final String soundName = "sound_" + idCounter;
+		playSoundEntry(soundEntry, soundName, category, volume, pitch);
+	}
+	public void playSoundEntry(SoundEntry entry, String soundSourceID, SoundCategory category, float volume, final float pitch) {
+		if (entry != null) {
+			soundSystem.newSource(false, soundSourceID, entry.url, entry.name, false, 0.0F, 0.0F, 0.0F, 0, 0.0F);
+			if (volume > 1.0F)
+			{
+				volume = 1.0F;
+			}
+			volume *= 0.25F;
+			soundSystem.setPitch(soundSourceID, pitch);
+			soundSystem.setVolume(soundSourceID, volume * SoundCategoryHelper.getEffectiveVolume(category, options));
+			soundSystem.play(soundSourceID);
+		}
+	}
+	public void playSoundId(final String soundPath, SoundCategory category, float volume, final float pitch, String soundID){
+		if (!loaded || soundSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
+		{
+			return;
+		}
+		final SoundEntry soundEntry = soundRepo.getEntry(soundPath);
+		playSoundEntry(soundEntry, soundID, category, volume, pitch);
+	}
+
+	public void playStreaming(final String soundPath, final float x, final float y, final float z, final float volume, final float pitch)
+	{
+		if (!loaded || soundSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
+		{
+			return;
+		}
+		final String streaming = "streaming";
+		if (soundSystem.playing("streaming"))
+		{
+			soundSystem.stop("streaming");
+		}
+		if (soundPath == null)
+		{
+			return;
+		}
+		final SoundEntry soundEntry = streamingRepo.getEntry(soundPath);
+		if (soundEntry != null && volume > 0.0F)
+		{
+			if (soundSystem.playing("BgMusic"))
+			{
+				soundSystem.stop("BgMusic");
+			}
+			final float streamingVolume = 16F;
+			soundSystem.newStreamingSource(true, streaming, soundEntry.url, soundEntry.name, false, x, y, z, 2, streamingVolume * 4F);
+			soundSystem.setVolume(streaming, 0.5F * options.masterVolume.value);
+			soundSystem.play(streaming);
+		}
+	}
+
+    private void loadLibrary() {
+        try {
+			float[] volumeStore = new float[SoundCategory.values().length];
+			for (int i = 0; i < SoundCategory.values().length; i++)
+			{
+				volumeStore[i] = SoundCategoryHelper.getVolume(SoundCategory.values()[i], options);
+			}
+            options.saveOptions();
+            SoundSystemConfig.addLibrary(LibraryLWJGL3OpenAL.class);
+            SoundSystemConfig.setCodec("ogg", CodecJOrbis.class);
+            SoundSystemConfig.setCodec("mus", CodecMus.class);
+            SoundSystemConfig.setCodec("wav", CodecWav.class);
+            soundSystem = new SoundSystem();
+			for (int i = 0; i < SoundCategory.values().length; i++)
+			{
+				SoundCategoryHelper.setVolume(SoundCategory.values()[i], options, volumeStore[i]);
+			}
+			options.saveOptions();
+        } catch (final Throwable throwable) {
+            throwable.printStackTrace();
+            System.err.println("error linking with the LibraryJavaSound plug-in");
+        }
+        loaded = true;
+    }
+	public static SoundSystem getSoundSystem(){
+		return soundSystem;
+	}
+
+}
diff --git a/src/main/java/net/minecraft/client/sound/SoundEntry.java b/src/main/java/net/minecraft/client/sound/SoundEntry.java
new file mode 100644
index 000000000..8aa1b1c94
--- /dev/null
+++ b/src/main/java/net/minecraft/client/sound/SoundEntry.java
@@ -0,0 +1,17 @@
+package net.minecraft.client.sound;
+
+import java.net.URL;
+
+public class SoundEntry
+{
+
+    public String soundID;
+    public String name;
+    public URL url;
+
+    public SoundEntry(String soundID, String name, URL url) {
+        this.soundID = soundID;
+        this.name = name;
+        this.url = url;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/sound/SoundManager.java b/src/main/java/net/minecraft/client/sound/SoundManager.java
deleted file mode 100644
index a4ab409e5..000000000
--- a/src/main/java/net/minecraft/client/sound/SoundManager.java
+++ /dev/null
@@ -1,321 +0,0 @@
-package net.minecraft.client.sound;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Random;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.sound.SoundCategory;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.client.option.GameSettings;
-import paulscode.sound.SoundSystem;
-import paulscode.sound.SoundSystemConfig;
-
-// Referenced classes of package net.minecraft.src:
-//            SoundPool, GameSettings, CodecMus, EntityPlayerSP,
-//            MathHelper, World, SoundPoolEntry, EntityLiving
-
-public class SoundManager
-{
-	private static SoundSystem sndSystem;
-	private static boolean loaded = false;
-	private static final int MUSINTERVAL = 6000;
-	
-	private static void loadModAudio(final String s, final SoundPool soundpool)
-	{
-		final File file = Minecraft.getAppDir(s);
-		try
-		{
-			walkFolder(file, file, soundpool);
-		}
-		catch (final IOException ioexception)
-		{
-			ioexception.printStackTrace();
-		}
-	}
-
-    private static void walkFolder(final File file, final File file1, final SoundPool soundpool) throws IOException {
-        if (file1.exists() || file1.mkdirs()) {
-            final File afile[] = file1.listFiles();
-            if (afile != null && afile.length > 0) {
-                for (int i = 0; i < afile.length; i++) {
-                    if (!afile[i].getName().startsWith(".")) {
-                        if (afile[i].isDirectory()) {
-                            walkFolder(file, afile[i], soundpool);
-                        } else if (afile[i].isFile()) {
-                            final String s = afile[i].getPath().substring(file.getPath().length() + 1).replace('\\', '/');
-                            soundpool.addSound(s, afile[i]);
-                        }
-                    }
-                }
-
-            }
-        }
-    }
-
-	private final SoundPool soundPoolSounds;
-	private final SoundPool soundPoolStreaming;
-	private final SoundPool soundPoolMusic;
-	private final SoundPool cave;
-	private int soundId;
-	private GameSettings options;
-	private final Random rand;
-	private Minecraft mc;
-	private int ticksBeforeMusic;
-	private boolean muted = false;
-
-	public SoundManager() {
-        soundPoolSounds = new SoundPool();
-        soundPoolStreaming = new SoundPool();
-        soundPoolMusic = new SoundPool();
-        cave = new SoundPool();
-        soundId = 0;
-        rand = new Random();
-        ticksBeforeMusic = rand.nextInt(6000);
-    }
-
-    public void addMusic(final String s, final File file) {
-        soundPoolMusic.addSound(s, file);
-    }
-
-    public void addSound(final String s, final File file) {
-        soundPoolSounds.addSound(s, file);
-    }
-
-    public void addStreaming(final String s, final File file) {
-        soundPoolStreaming.addSound(s, file);
-    }
-
-	public void closeMinecraft()
-	{
-		if (loaded)
-		{
-			sndSystem.cleanup();
-		}
-	}
-	
-	public void setMuted(boolean muted)
-	{
-		if (sndSystem == null) return;
-		this.muted = muted;
-		if (this.muted)
-		{
-			sndSystem.setVolume("BgMusic", 0.0f);
-		}
-		else
-		{
-			sndSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
-		}
-	}
-
-	public void updateListenerPosition(final EntityLiving listeningEntity, final float partialTick)
-	{
-		if (!loaded || muted || sndSystem == null || !SoundCategoryHelper.isAnyEnabled(options))
-		{
-			return;
-		}
-		if (listeningEntity != null)
-		{
-			final float f1 = listeningEntity.yRotO + (listeningEntity.yRot - listeningEntity.yRotO) * partialTick;
-			final double playerX = listeningEntity.xo + (listeningEntity.x - listeningEntity.xo) * partialTick;
-			final double playerY = listeningEntity.yo + (listeningEntity.y - listeningEntity.yo) * partialTick;
-			final double playerZ = listeningEntity.zo + (listeningEntity.z - listeningEntity.zo) * partialTick;
-			final float f2 = MathHelper.cos(-f1 * 0.01745329F - 3.141593F);
-			final float f3 = MathHelper.sin(-f1 * 0.01745329F - 3.141593F);
-			final float f4 = -f3;
-			final float f5 = 0.0F;
-			final float f6 = -f2;
-			final float f7 = 0.0F;
-			final float f8 = 1.0F;
-			final float f9 = 0.0F;
-			sndSystem.setListenerPosition((float) playerX, (float) playerY, (float) playerZ);
-			sndSystem.setListenerOrientation(f4, f5, f6, f7, f8, f9);
-		}
-		return;
-	}
-
-    public void loadSoundSettings(final GameSettings gamesettings) {
-        soundPoolStreaming.field_1657_b = false;
-        options = gamesettings;
-        if (!loaded && (gamesettings != null && SoundCategoryHelper.isAnyEnabled(gamesettings)))
-		{
-            tryToSetLibraryAndCodecs();
-        }
-        loadModAudio("minecraft-bta/resources/mod/sound", soundPoolSounds);
-        loadModAudio("minecraft-bta/resources/mod/streaming", soundPoolStreaming);
-        loadModAudio("minecraft-bta/resources/mod/music", soundPoolMusic);
-        loadModAudio("minecraft-bta/resources/mod/cavemusic", cave);
-        try {
-            final Field field = (Minecraft.class).getDeclaredFields()[1];
-            field.setAccessible(true);
-            mc = (Minecraft) field.get(null);
-        } catch (final Throwable throwable) {
-        }
-    }
-
-    public void onSoundOptionsChanged() {
-        if (!loaded && SoundCategoryHelper.isAnyEnabled(options)) {
-            tryToSetLibraryAndCodecs();
-        }
-        if (sndSystem != null && loaded) {
-            if (SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options) == 0.0F) {
-                sndSystem.stop("BgMusic");
-            } else {
-                sndSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
-            }
-        }
-    }
-
-    public void playRandomMusicIfReady() {
-        if (!loaded || sndSystem == null || SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options) == 0.0F) {
-            return;
-        }
-        if (!sndSystem.playing("BgMusic") && !sndSystem.playing("streaming")) {
-            if (ticksBeforeMusic > 0) {
-                ticksBeforeMusic--;
-                return;
-            }
-            SoundPoolEntry soundpoolentry;
-            if (mc != null && mc.thePlayer != null && !mc.thePlayer.world.canBlockSeeTheSky(MathHelper.floor_double(mc.thePlayer.x), MathHelper.floor_double(mc.thePlayer.y), MathHelper.floor_double(mc.thePlayer.z))) {
-                soundpoolentry = cave.getRandomSound();
-            } else {
-                soundpoolentry = soundPoolMusic.getRandomSound();
-            }
-            if (soundpoolentry != null) {
-                ticksBeforeMusic = rand.nextInt(6000) + 6000;
-                sndSystem.backgroundMusic("BgMusic", soundpoolentry.soundUrl, soundpoolentry.soundName, false);
-                sndSystem.setVolume("BgMusic", SoundCategoryHelper.getEffectiveVolume(SoundCategory.MUSIC, options));
-                sndSystem.play("BgMusic");
-            }
-        }
-    }
-
-	public void playSound(final String soundPath, SoundCategory category, final float x, final float y, final float z, float volume, final float pitch)
-	{
-		if (!loaded || sndSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
-		{
-			return;
-		}
-		final SoundPoolEntry soundpoolentry = soundPoolSounds.getRandomSoundFromSoundPool(soundPath);
-		if (soundpoolentry != null && volume > 0.0F)
-		{
-			soundId = (soundId + 1) % 256;
-			final String soundIdName = "sound_" + soundId;
-			float f5 = 16F;
-			if (volume > 1.0F)
-			{
-				f5 *= volume;
-			}
-			sndSystem.newSource(volume > 1.0F, soundIdName, soundpoolentry.soundUrl, soundpoolentry.soundName, false, x, y, z, 2, f5);
-			sndSystem.setPitch(soundIdName, pitch);
-			if (volume > 1.0F)
-			{
-				volume = 1.0F;
-			}
-			sndSystem.setVolume(soundIdName, volume * SoundCategoryHelper.getEffectiveVolume(category, options));
-			sndSystem.play(soundIdName);
-		}
-	}
-
-	public void playSound(final String soundPath, SoundCategory category, float volume, final float pitch)
-	{
-		if (!loaded || sndSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
-		{
-			return;
-		}
-		final SoundPoolEntry soundpoolentry = soundPoolSounds.getRandomSoundFromSoundPool(soundPath);
-		if (soundpoolentry != null)
-		{
-			soundId = (soundId + 1) % 256;
-			final String soundName = "sound_" + soundId;
-			sndSystem.newSource(false, soundName, soundpoolentry.soundUrl, soundpoolentry.soundName, false, 0.0F, 0.0F, 0.0F, 0, 0.0F);
-			if (volume > 1.0F)
-			{
-				volume = 1.0F;
-			}
-			volume *= 0.25F;
-			sndSystem.setPitch(soundName, pitch);
-			sndSystem.setVolume(soundName, volume * SoundCategoryHelper.getEffectiveVolume(category, options));
-			sndSystem.play(soundName);
-		}
-	}
-	public void playSound(final String soundPath, SoundCategory category, float volume, final float pitch, String soundID){
-		if (!loaded || sndSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
-		{
-			return;
-		}
-		final SoundPoolEntry soundpoolentry = soundPoolSounds.getRandomSoundFromSoundPool(soundPath);
-		if (soundpoolentry != null)
-		{
-			sndSystem.newSource(false, soundID, soundpoolentry.soundUrl, soundpoolentry.soundName, false, 0.0F, 0.0F, 0.0F, 0, 0.0F);
-			if (volume > 1.0F)
-			{
-				volume = 1.0F;
-			}
-			volume *= 0.25F;
-			sndSystem.setPitch(soundID, pitch);
-			sndSystem.setVolume(soundID, volume * SoundCategoryHelper.getEffectiveVolume(category, options));
-			sndSystem.play(soundID);
-		}
-	}
-
-	public void playStreaming(final String soundPath, final float x, final float y, final float z, final float volume, final float pitch)
-	{
-		if (!loaded || sndSystem == null || muted || !SoundCategoryHelper.isAnyEnabled(options))
-		{
-			return;
-		}
-		final String streaming = "streaming";
-		if (sndSystem.playing("streaming"))
-		{
-			sndSystem.stop("streaming");
-		}
-		if (soundPath == null)
-		{
-			return;
-		}
-		final SoundPoolEntry soundpoolentry = soundPoolStreaming.getRandomSoundFromSoundPool(soundPath);
-		if (soundpoolentry != null && volume > 0.0F)
-		{
-			if (sndSystem.playing("BgMusic"))
-			{
-				sndSystem.stop("BgMusic");
-			}
-			final float streamingVolume = 16F;
-			sndSystem.newStreamingSource(true, streaming, soundpoolentry.soundUrl, soundpoolentry.soundName, false, x, y, z, 2, streamingVolume * 4F);
-			sndSystem.setVolume(streaming, 0.5F * options.masterVolume.value);
-			sndSystem.play(streaming);
-		}
-	}
-
-    private void tryToSetLibraryAndCodecs() {
-        try {
-			float[] volumeStore = new float[SoundCategory.values().length];
-			for (int i = 0; i < SoundCategory.values().length; i++)
-			{
-				volumeStore[i] = SoundCategoryHelper.getVolume(SoundCategory.values()[i], options);
-			}
-            options.saveOptions();
-            SoundSystemConfig.addLibrary(paulscode.sound.libraries.LibraryLWJGLOpenAL.class);
-            SoundSystemConfig.setCodec("ogg", paulscode.sound.codecs.CodecJOrbis.class);
-            SoundSystemConfig.setCodec("mus", CodecMus.class);
-            SoundSystemConfig.setCodec("wav", paulscode.sound.codecs.CodecWav.class);
-            sndSystem = new SoundSystem();
-			for (int i = 0; i < SoundCategory.values().length; i++)
-			{
-				SoundCategoryHelper.setVolume(SoundCategory.values()[i], options, volumeStore[i]);
-			}
-			options.saveOptions();
-        } catch (final Throwable throwable) {
-            throwable.printStackTrace();
-            System.err.println("error linking with the LibraryJavaSound plug-in");
-        }
-        loaded = true;
-    }
-	public static SoundSystem getSoundSystem(){
-		return sndSystem;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/client/sound/SoundPool.java b/src/main/java/net/minecraft/client/sound/SoundPool.java
deleted file mode 100644
index a59d8ff5d..000000000
--- a/src/main/java/net/minecraft/client/sound/SoundPool.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package net.minecraft.client.sound;
-
-import java.io.File;
-import java.util.*;
-
-// Referenced classes of package net.minecraft.src:
-//            SoundPoolEntry
-
-public class SoundPool
-{
-
-    public SoundPool()
-    {
-        rand = new Random();
-        nameToSoundPoolEntriesMapping = new HashMap();
-        allSoundPoolEntries = new ArrayList();
-        numberOfSoundPoolEntries = 0;
-        field_1657_b = true;
-    }
-
-    public SoundPoolEntry addSound(String s, File file)
-    {
-        try
-        {
-            String s1 = s;
-            s = s.substring(0, s.indexOf("."));
-            if(field_1657_b)
-            {
-                for(; Character.isDigit(s.charAt(s.length() - 1)); s = s.substring(0, s.length() - 1)) { }
-            }
-            s = s.replaceAll("/", ".");
-            if(!nameToSoundPoolEntriesMapping.containsKey(s))
-            {
-                nameToSoundPoolEntriesMapping.put(s, new ArrayList());
-            }
-            SoundPoolEntry soundpoolentry = new SoundPoolEntry(s1, file.toURI().toURL());
-            ((List)nameToSoundPoolEntriesMapping.get(s)).add(soundpoolentry);
-            allSoundPoolEntries.add(soundpoolentry);
-            numberOfSoundPoolEntries++;
-            return soundpoolentry;
-        }
-        catch(Exception e)
-        {
-        	throw new RuntimeException("Adding Sound: "+s+" ("+file.getAbsolutePath()+")", e);
-        }
-    }
-
-    public SoundPoolEntry getRandomSoundFromSoundPool(String s)
-    {
-        List list = (List)nameToSoundPoolEntriesMapping.get(s);
-        if(list == null)
-        {
-            return null;
-        } else
-        {
-            return (SoundPoolEntry)list.get(rand.nextInt(list.size()));
-        }
-    }
-
-    public SoundPoolEntry getRandomSound()
-    {
-        if(allSoundPoolEntries.size() == 0)
-        {
-            return null;
-        } else
-        {
-            return (SoundPoolEntry)allSoundPoolEntries.get(rand.nextInt(allSoundPoolEntries.size()));
-        }
-    }
-
-    private Random rand;
-    private Map nameToSoundPoolEntriesMapping;
-    private List allSoundPoolEntries;
-    public int numberOfSoundPoolEntries;
-    public boolean field_1657_b;
-}
diff --git a/src/main/java/net/minecraft/client/sound/SoundPoolEntry.java b/src/main/java/net/minecraft/client/sound/SoundPoolEntry.java
deleted file mode 100644
index fb0f5842c..000000000
--- a/src/main/java/net/minecraft/client/sound/SoundPoolEntry.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.minecraft.client.sound;
-
-import java.net.URL;
-
-public class SoundPoolEntry
-{
-
-    public SoundPoolEntry(String s, URL url)
-    {
-        soundName = s;
-        soundUrl = url;
-    }
-
-    public String soundName;
-    public URL soundUrl;
-}
diff --git a/src/main/java/net/minecraft/client/sound/SoundRepository.java b/src/main/java/net/minecraft/client/sound/SoundRepository.java
new file mode 100644
index 000000000..46f49d1ff
--- /dev/null
+++ b/src/main/java/net/minecraft/client/sound/SoundRepository.java
@@ -0,0 +1,83 @@
+package net.minecraft.client.sound;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.*;
+
+// Referenced classes of package net.minecraft.src:
+//            SoundEntry
+
+public class SoundRepository
+{
+    private final Random random;
+    private final Map<String, List<SoundEntry>> urls;
+    private final List<SoundEntry> allEntries;
+    public int entryCount;
+    public boolean trimDigits;
+
+
+    public SoundRepository()
+    {
+        random = new Random();
+        urls = new HashMap<>();
+        allEntries = new ArrayList<>();
+        entryCount = 0;
+        trimDigits = true;
+    }
+
+    public SoundEntry addSound(String fileName, File file)
+    {
+        String id = fileName;
+        try
+        {
+            id = id.substring(0, id.indexOf("."));
+            if(trimDigits)
+            {
+                while (Character.isDigit(id.charAt(id.length() - 1))) {
+                    id = id.substring(0, id.length() - 1);
+                }
+            }
+            id = id.replaceAll("/", ".");
+            if(!urls.containsKey(id))
+            {
+                urls.put(id, new ArrayList<>());
+            }
+            SoundEntry soundEntry = new SoundEntry(id, fileName, file.toURI().toURL());
+            urls.get(id).add(soundEntry);
+            allEntries.add(soundEntry);
+            entryCount++;
+            return soundEntry;
+        }
+        catch(MalformedURLException e)
+        {
+        	throw new RuntimeException("Adding Sound: " + id + " ("+file.getAbsolutePath()+")", e);
+        }
+    }
+
+    public SoundEntry getEntry(String name)
+    {
+        List<SoundEntry> values = urls.get(name);
+        if(values == null)
+        {
+            return null;
+        } else
+        {
+            return values.get(random.nextInt(values.size()));
+        }
+    }
+
+    public SoundEntry getAnyEntry()
+    {
+        if(allEntries.isEmpty())
+        {
+            return null;
+        } else
+        {
+            return allEntries.get(random.nextInt(allEntries.size()));
+        }
+    }
+
+    public List<SoundEntry> getAllEntries() {
+        return allEntries;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/util/helper/Colors.java b/src/main/java/net/minecraft/client/util/helper/Colors.java
index 7260ea416..39a9cf811 100644
--- a/src/main/java/net/minecraft/client/util/helper/Colors.java
+++ b/src/main/java/net/minecraft/client/util/helper/Colors.java
@@ -21,12 +21,12 @@ public abstract class Colors {
 	public static final Color[] allRedstoneColors = new Color[16];
 	
 	public static void loadColors() {
-		fillColorArray("/misc/colors_chat.png", allChatColors);
-		fillColorArray("/misc/colors_planks.png", allPlankColors);
-		fillColorArray("/misc/colors_signs.png", allSignColors);
-		fillColorArray("/misc/colors_lamps.png", allLampColors);
-		fillColorArray("/misc/colors_flag.png", allFlagColors);
-		fillColorArray("/misc/colors_redstone.png", allRedstoneColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_chat.png", allChatColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_planks.png", allPlankColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_signs.png", allSignColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_lamps.png", allLampColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_flag.png", allFlagColors);
+		fillColorArray("/assets/minecraft/textures/misc/colors_redstone.png", allRedstoneColors);
 	}
 	
 	public static void fillColorArray(String path, Color[] colors) {
diff --git a/src/main/java/net/minecraft/client/util/helper/GuiItemDragHandler.java b/src/main/java/net/minecraft/client/util/helper/GuiItemDragHandler.java
index de6936659..4f2d26f4c 100644
--- a/src/main/java/net/minecraft/client/util/helper/GuiItemDragHandler.java
+++ b/src/main/java/net/minecraft/client/util/helper/GuiItemDragHandler.java
@@ -95,8 +95,8 @@ public class GuiItemDragHandler extends Gui {
 			return;
 		}
 		
-		if(slot.canPutStackInSlot(draggingItemStack) && slot.enableDragAndPickup()) {
-			if(slot.getStack() == null || slot.getStack().canStackWith(draggingItemStack)) {
+		if(slot.mayPlace(draggingItemStack) && slot.enableDragAndPickup()) {
+			if(slot.getItem() == null || slot.getItem().canStackWith(draggingItemStack)) {
 				if(!draggedSlots.contains(slot)) {
 					draggedSlots.add(slot);
 				}
@@ -108,13 +108,13 @@ public class GuiItemDragHandler extends Gui {
 		if(slot == null) throw new NullPointerException("Slot is null");
 		if(draggingItemStack == null) throw new NullPointerException("Stack is null!");
 
-		ItemStack stack = slot.getStack();
+		ItemStack stack = slot.getItem();
 		
 		glDisable(GL_TEXTURE_2D);
 		glEnable(GL_BLEND);
 		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 		
-		drawRectWidthHeight(renderOffsetX + slot.xDisplayPosition, renderOffsetY + slot.yDisplayPosition, 16, 16, 0x80ffffff);
+		drawRectWidthHeight(renderOffsetX + slot.x, renderOffsetY + slot.y, 16, 16, 0x80ffffff);
 		
 		glDisable(GL_BLEND);
 		glEnable(GL_TEXTURE_2D);
@@ -123,7 +123,7 @@ public class GuiItemDragHandler extends Gui {
 		if(stack != null) {
 			renderItemStack.stackSize = Math.min(renderItemStack.getMaxStackSize(), renderItemStack.stackSize + stack.stackSize);
 		}
-		guiRenderItem.render(renderItemStack, slot.xDisplayPosition, slot.yDisplayPosition);
+		guiRenderItem.render(renderItemStack, slot.x, slot.y);
 	}
 	
 	public void mouseEvent(final int x, final int y, int button, boolean pressed) {
@@ -154,7 +154,7 @@ public class GuiItemDragHandler extends Gui {
 	}
 	
 	public void click(InventoryAction action, int[] args) {
-		mc.playerController.handleInventoryMouseClick(container.inventorySlots.windowId, action, args, mc.thePlayer);
+		mc.playerController.handleInventoryMouseClick(container.inventorySlots.containerId, action, args, mc.thePlayer);
 	}
 	
 	private void mousePressed(final int x, final int y, final Slot slot, int button) {
@@ -252,10 +252,10 @@ public class GuiItemDragHandler extends Gui {
 		
 		int[] slots = new int[draggedSlots.size()];
 		for(int i=0; i < slots.length; i++) {
-			slots[i] = draggedSlots.get(i).id;
+			slots[i] = draggedSlots.get(i).index;
 		}
 		
-		mc.playerController.handleInventoryMouseClick(container.inventorySlots.windowId, action, slots, mc.thePlayer);
+		mc.playerController.handleInventoryMouseClick(container.inventorySlots.containerId, action, slots, mc.thePlayer);
 		
 	}
 	
@@ -264,7 +264,7 @@ public class GuiItemDragHandler extends Gui {
 			return;
 		}
 		
-		mc.playerController.handleInventoryMouseClick(container.inventorySlots.windowId, InventoryAction.PICKUP_SIMILAR, null, mc.thePlayer);
+		mc.playerController.handleInventoryMouseClick(container.inventorySlots.containerId, InventoryAction.PICKUP_SIMILAR, null, mc.thePlayer);
 	}
 	
 	public boolean isDragging() {
diff --git a/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java b/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
index e3a18994c..e51b1a1f6 100644
--- a/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
+++ b/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
@@ -14,7 +14,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FallbackRenderer;
 import net.minecraft.client.render.Framebuffer;
 import net.minecraft.client.render.Renderer;
-import net.minecraft.client.render.Texture;
+import net.minecraft.client.render.texture.Texture;
 import net.minecraft.core.Global;
 import net.minecraft.core.util.helper.Buffer;
 
diff --git a/src/main/java/net/minecraft/client/world/WorldClient.java b/src/main/java/net/minecraft/client/world/WorldClient.java
index ca6cd0d75..8b8c932a3 100644
--- a/src/main/java/net/minecraft/client/world/WorldClient.java
+++ b/src/main/java/net/minecraft/client/world/WorldClient.java
@@ -1,16 +1,16 @@
 package net.minecraft.client.world;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.net.handler.NetClientHandler;
+import net.minecraft.client.net.handler.ClientPacketHandler;
 import net.minecraft.client.world.chunk.provider.ChunkProviderClient;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.packet.Packet255KickDisconnect;
+import net.minecraft.core.net.packet.DisconnectPacket;
+import net.minecraft.core.util.collection.IntHashMap;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
-import net.minecraft.core.world.pathfinder.IdHashMap;
 import net.minecraft.core.world.save.SaveHandlerClientMP;
 
 import java.util.HashSet;
@@ -19,26 +19,27 @@ import java.util.Set;
 
 // Referenced classes of package net.minecraft.src:
 //            World, SaveHandlerMP, WorldProvider, MCHash, 
-//            ChunkCoordinates, NetClientHandler, IWorldAccess, Entity, 
-//            WorldBlockPositionType, ChunkProviderClient, Packet255KickDisconnect, WorldInfo, 
+//            ChunkCoordinates, ClientPacketHandler, IWorldAccess, Entity,
+//            WorldBlockPositionType, ChunkProviderClient, DisconnectPacket, WorldInfo,
 //            IChunkProvider
 
 public class WorldClient extends World {
     private final Minecraft mc;
     private final LinkedList<WorldBlockPositionType> positionTypesList;
-    private final NetClientHandler sendQueue;
-    private ChunkProviderClient field_20915_C;
-    private final IdHashMap<Entity> entityMap;
-    private final Set<Entity> field_20914_E;
-    private final Set<Entity> field_1053_F;
-    public WorldClient(Minecraft minecraft, NetClientHandler netclienthandler, long seed, int dimensionId, int worldTypeId)
+    private final ClientPacketHandler sendQueue;
+    private ChunkProviderClient chunkCache;
+    private final IntHashMap<Entity> entitiesById;
+    private final Set<Entity> forced;
+    private final Set<Entity> reEntries;
+
+    public WorldClient(Minecraft minecraft, ClientPacketHandler netclienthandler, long seed, int dimensionId, int worldTypeId)
     {
         super(new SaveHandlerClientMP(), "MpServer", Dimension.getDimensionList().get(dimensionId), Registries.WORLD_TYPES.getItemByNumericId(worldTypeId), seed);
         this.mc = minecraft;
         positionTypesList = new LinkedList<>();
-        entityMap = new IdHashMap<>();
-        field_20914_E = new HashSet<>();
-        field_1053_F = new HashSet<>();
+        entitiesById = new IntHashMap<>();
+        forced = new HashSet<>();
+        reEntries = new HashSet<>();
         sendQueue = netclienthandler;
         setSpawnPoint(new ChunkCoordinates(8, 64, 8));
         savedDataStorage = netclienthandler.savedDataStorage;
@@ -47,9 +48,9 @@ public class WorldClient extends World {
     @Override
 	public void tick()
     {
-        for(int k = 0; k < 10 && !field_1053_F.isEmpty(); k++)
+        for(int k = 0; k < 10 && !reEntries.isEmpty(); k++)
         {
-            Entity entity = field_1053_F.iterator().next();
+            Entity entity = reEntries.iterator().next();
             if(!loadedEntityList.contains(entity))
             {
                 entityJoinedWorld(entity);
@@ -71,7 +72,7 @@ public class WorldClient extends World {
     }
 
     public void processPackets() {
-        sendQueue.processReadPackets();
+        sendQueue.tick();
     }
 
     public void func_711_c(int i, int j, int k, int l, int i1, int j1)
@@ -90,8 +91,8 @@ public class WorldClient extends World {
     @Override
 	protected IChunkProvider createChunkProvider()
     {
-        field_20915_C = new ChunkProviderClient(this);
-        return field_20915_C;
+        chunkCache = new ChunkProviderClient(this);
+        return chunkCache;
     }
 
     @Override
@@ -120,10 +121,10 @@ public class WorldClient extends World {
     {
         if(flag)
         {
-            field_20915_C.prepareChunk(i, j);
+            chunkCache.prepareChunk(i, j);
         } else
         {
-            field_20915_C.func_539_c(i, j);
+            chunkCache.func_539_c(i, j);
         }
         if(!flag)
         {
@@ -135,10 +136,10 @@ public class WorldClient extends World {
 	public boolean entityJoinedWorld(Entity entity)
     {
         boolean flag = super.entityJoinedWorld(entity);
-        field_20914_E.add(entity);
+        forced.add(entity);
         if(!flag)
         {
-            field_1053_F.add(entity);
+            reEntries.add(entity);
         }
         return flag;
     }
@@ -147,23 +148,23 @@ public class WorldClient extends World {
 	public void setEntityDead(Entity entity)
     {
         super.setEntityDead(entity);
-        field_20914_E.remove(entity);
+        forced.remove(entity);
     }
 
     @Override
 	protected void obtainEntitySkin(Entity entity)
     {
         super.obtainEntitySkin(entity);
-        field_1053_F.remove(entity);
+        reEntries.remove(entity);
     }
 
     @Override
 	protected void releaseEntitySkin(Entity entity)
     {
         super.releaseEntitySkin(entity);
-        if(field_20914_E.contains(entity))
+        if(forced.contains(entity))
         {
-            field_1053_F.add(entity);
+            reEntries.add(entity);
         }
     }
 
@@ -174,26 +175,26 @@ public class WorldClient extends World {
         {
             setEntityDead(entity1);
         }
-        field_20914_E.add(entity);
+        forced.add(entity);
         entity.id = i;
         if(!entityJoinedWorld(entity))
         {
-            field_1053_F.add(entity);
+            reEntries.add(entity);
         }
-        entityMap.add(i, entity);
+        entitiesById.put(i, entity);
     }
 
     public Entity getEntityFromId(int i)
     {
-        return entityMap.get(i);
+        return entitiesById.get(i);
     }
 
     public Entity removeEntityFromWorld(int i)
     {
-        Entity entity = entityMap.remove(i);
+        Entity entity = entitiesById.remove(i);
         if(entity != null)
         {
-            field_20914_E.remove(entity);
+            forced.remove(entity);
             setEntityDead(entity);
         }
         return entity;
@@ -260,7 +261,7 @@ public class WorldClient extends World {
     @Override
 	public void sendQuittingDisconnectingPacket()
     {
-        sendQueue.func_28117_a(new Packet255KickDisconnect("Quitting"));
+        sendQueue.func_28117_a(new DisconnectPacket("Quitting"));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/Global.java b/src/main/java/net/minecraft/core/Global.java
index 6016c6a89..0acd8a3fc 100644
--- a/src/main/java/net/minecraft/core/Global.java
+++ b/src/main/java/net/minecraft/core/Global.java
@@ -2,6 +2,7 @@ package net.minecraft.core;
 
 public class Global
 {
+	public static final int TICKS_PER_SECOND = 20;
 	public static final int DAY_LENGTH_TICKS = 24000;
 	public static final String VERSION = Version.BUILD_CHANNEL.modifyVersionString(Version.VERSION);
 	public static final String BUILD_TIME = Version.BUILD_TIME;
diff --git a/src/main/java/net/minecraft/core/HitResult.java b/src/main/java/net/minecraft/core/HitResult.java
deleted file mode 100644
index f394c6f2d..000000000
--- a/src/main/java/net/minecraft/core/HitResult.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package net.minecraft.core;
-
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
-
-public class HitResult
-{
-
-    public HitResult(int x, int y, int z, Side side, Vec3d vec3d)
-    {
-        hitType = HitType.TILE;
-        this.x = x;
-        this.y = y;
-        this.z = z;
-        this.side = side;
-        location = Vec3d.createVector(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord);
-        entity = null;
-    }
-
-    public HitResult(Entity entity)
-    {
-        x = 0;
-        y = 0;
-        z = 0;
-        side = null;
-        hitType = HitType.ENTITY;
-        this.entity = entity;
-        location = Vec3d.createVector(entity.x, entity.y, entity.z);
-    }
-
-    public final HitType hitType;
-    public final int x;
-    public final int y;
-    public final int z;
-    public final Side side;
-    public final Vec3d location;
-    public final Entity entity;
-
-    public enum HitType
-    {
-        TILE,
-        ENTITY
-    }
-}
diff --git a/src/main/java/net/minecraft/core/NextTickListEntry.java b/src/main/java/net/minecraft/core/NextTickListEntry.java
index e3745eab1..997d58af5 100644
--- a/src/main/java/net/minecraft/core/NextTickListEntry.java
+++ b/src/main/java/net/minecraft/core/NextTickListEntry.java
@@ -47,26 +47,20 @@ public class NextTickListEntry
         return this;
     }
 
-    public int comparer(NextTickListEntry entry)
-    {
-        if(delay < entry.delay)
+    @Override
+	public int compareTo(NextTickListEntry other) {
+        if(delay < other.delay)
         {
             return -1;
         }
-        if(delay > entry.delay)
+        if(delay > other.delay)
         {
             return 1;
         }
-        if(c < entry.c)
+        if(c < other.c)
         {
             return -1;
         }
-        return c <= entry.c ? 0 : 1;
-    }
-
-    @Override
-	public int compareTo(NextTickListEntry that)
-    {
-        return comparer(that);
+        return c <= other.c ? 0 : 1;
     }
 }
diff --git a/src/main/java/net/minecraft/core/WeightedRandomBag.java b/src/main/java/net/minecraft/core/WeightedRandomBag.java
index ce9a5eb3a..d0e1c8195 100644
--- a/src/main/java/net/minecraft/core/WeightedRandomBag.java
+++ b/src/main/java/net/minecraft/core/WeightedRandomBag.java
@@ -73,4 +73,9 @@ public class WeightedRandomBag<T> {
         }
         return (weight / accumulatedWeight) * 100;
     }
+
+    public void clear(){
+        entries.clear();
+        accumulatedWeight = 0;
+    }
 }
diff --git a/src/main/java/net/minecraft/core/WeightedRandomLootObject.java b/src/main/java/net/minecraft/core/WeightedRandomLootObject.java
index 222a7a6e1..27161f55f 100644
--- a/src/main/java/net/minecraft/core/WeightedRandomLootObject.java
+++ b/src/main/java/net/minecraft/core/WeightedRandomLootObject.java
@@ -1,21 +1,23 @@
 package net.minecraft.core;
 
 import net.minecraft.core.item.ItemStack;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
 public class WeightedRandomLootObject {
-    private ItemStack itemStack;
+    @Nullable
+    private final ItemStack itemStack;
     private int yieldMin;
     private int yieldMax;
     private int yieldFixed;
-    private boolean isRandomYield;
+    private final boolean isRandomYield;
     private int metaMin;
     private int metaMax;
     private boolean isRandomMeta;
     private final Random random = new Random();
 
-    public WeightedRandomLootObject(ItemStack itemStack, int yieldMin, int yieldMax){
+    public WeightedRandomLootObject(@Nullable ItemStack itemStack, int yieldMin, int yieldMax){
         this.itemStack = itemStack;
         this.yieldMin = yieldMin;
         this.yieldMax = yieldMax;
@@ -23,14 +25,14 @@ public class WeightedRandomLootObject {
         this.isRandomMeta = false;
     }
 
-    public WeightedRandomLootObject(ItemStack itemStack, int yieldFixed){
+    public WeightedRandomLootObject(@Nullable ItemStack itemStack, int yieldFixed){
         this.itemStack = itemStack;
         this.yieldFixed = yieldFixed;
         this.isRandomYield = false;
         this.isRandomMeta = false;
     }
 
-    public WeightedRandomLootObject(ItemStack itemStack){
+    public WeightedRandomLootObject(@Nullable ItemStack itemStack){
         this.itemStack = itemStack;
         this.yieldFixed = 1;
         this.isRandomYield = false;
@@ -77,10 +79,12 @@ public class WeightedRandomLootObject {
     public boolean isRandomMeta(){
         return isRandomMeta;
     }
+    @Nullable
     public ItemStack getItemStack(){
         return getItemStack(random);
     }
 
+    @Nullable
     public ItemStack getItemStack(Random random){
         if (itemStack == null) return null;
         int amount;
diff --git a/src/main/java/net/minecraft/core/achievement/Achievement.java b/src/main/java/net/minecraft/core/achievement/Achievement.java
index f16aa54d6..2324e211c 100644
--- a/src/main/java/net/minecraft/core/achievement/Achievement.java
+++ b/src/main/java/net/minecraft/core/achievement/Achievement.java
@@ -1,74 +1,66 @@
 package net.minecraft.core.achievement;
 
-import net.minecraft.core.achievement.stat.IStatStringFormat;
+import net.minecraft.client.gui.achievements.data.AchievementPage;
+import net.minecraft.core.achievement.stat.StatDescFormatter;
 import net.minecraft.core.achievement.stat.Stat;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.IItemConvertible;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.collection.NamespaceID;
 
 public class Achievement extends Stat
 {
+    public static final Type TYPE_NORMAL = new Type("minecraft:gui/achievement/achievement", 0xffffffff, 0xff808080, false);
+    public static final Type TYPE_SPECIAL = new Type("minecraft:gui/achievement/achievement_special", 0xffffff80, 0xff808040, false);
+    public static final Type TYPE_SECRET = new Type("minecraft:gui/achievement/achievement_secret", 0xff8080ff, 0xff404080, true);
 
     public final int x;
     public final int y;
     public final Achievement parent;
     private final String description;
-    private IStatStringFormat statStringFormatter;
-    public final int itemId;
-    private boolean isSpecial;
+    private StatDescFormatter statStringFormatter;
+    public final int iconItemId;
+    private Type type = TYPE_NORMAL;
 
-    public Achievement(int id, String name, int x, int y, Item item, Achievement parent)
+    public Achievement(NamespaceID id, String name, int x, int y, IItemConvertible icon, Achievement parent)
     {
-        this(id, name, x, y, item.id, parent);
+        this(id, name, x, y, icon.asItem().id, parent);
     }
 
-    public Achievement(int i, String name, int x, int y, Block block, Achievement parent)
+    public Achievement(NamespaceID id, String name, int x, int y, int iconItemId, Achievement parent)
     {
-        this(i, name, x, y, block.id, parent);
-    }
-
-    public Achievement(int id, String name, int x, int y, int itemId, Achievement parent)
-    {
-        super(0x500000 + id, "achievement." + name);
-        this.itemId = itemId;
+        super(new NamespaceID(id.namespace, "achievement/" + id.value), "achievement." + name);
+        this.iconItemId = iconItemId;
         this.description = "achievement." + name;
         this.x = x;
         this.y = y;
-        if(x < AchievementList.minX)
-        {
-            AchievementList.minX = x;
-        }
-        if(y < AchievementList.minY)
-        {
-            AchievementList.minY = y;
-        }
-        if(x > AchievementList.maxX)
-        {
-            AchievementList.maxX = x;
-        }
-        if(y > AchievementList.maxY)
-        {
-            AchievementList.maxY = y;
-        }
+
+        Achievements.minX = Math.min(Achievements.minX, x);
+        Achievements.maxX = Math.max(Achievements.maxX, x);
+        Achievements.minY = Math.min(Achievements.minY, y);
+        Achievements.maxY = Math.max(Achievements.maxY, y);
+
         this.parent = parent;
     }
 
-    public Achievement setClientsideAchievement()
-    {
+    public Achievement setClientsideAchievement() {
         clientside = true;
         return this;
     }
 
-    public Achievement setSpecial()
-    {
-        isSpecial = true;
+    public Achievement setType(Type type) {
+        this.type = type;
         return this;
     }
 
-    public Achievement registerAchievement()
-    {
+    public Achievement registerAchievement() {
         super.registerStat();
-        AchievementList.achievementList.add(this);
+        Achievements.achievementList.add(this);
+        return this;
+    }
+    public Achievement addToPage(AchievementPage ... pages){
+        for (AchievementPage page : pages){
+            page.addAchievement(this);
+        }
         return this;
     }
 
@@ -89,15 +81,13 @@ public class Achievement extends Stat
         }
     }
 
-    public Achievement setStatStringFormatter(IStatStringFormat istatstringformat)
-    {
-        statStringFormatter = istatstringformat;
+    public Achievement setDescriptionFormatter(StatDescFormatter descFormatter) {
+        statStringFormatter = descFormatter;
         return this;
     }
 
-    public boolean getSpecial()
-    {
-        return isSpecial;
+    public Type getType() {
+        return type;
     }
 
     @Override
@@ -111,4 +101,17 @@ public class Achievement extends Stat
     {
         return setClientsideAchievement();
     }
+
+    public static class Type {
+        public final String texture;
+        public final int colorName;
+        public final int colorNameLocked;
+        public final boolean hidden;
+        public Type(String texture, int colorName, int colorNameLocked, boolean hidden){
+            this.texture = texture;
+            this.colorName = colorName;
+            this.colorNameLocked = colorNameLocked;
+            this.hidden = hidden;
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/achievement/AchievementList.java b/src/main/java/net/minecraft/core/achievement/AchievementList.java
deleted file mode 100644
index a2797e951..000000000
--- a/src/main/java/net/minecraft/core/achievement/AchievementList.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.minecraft.core.achievement;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public abstract class AchievementList
-{
-    
-    public static List<Achievement> achievementList = new ArrayList<>();
-    public static int minX;
-    public static int minY;
-    public static int maxX;
-    public static int maxY;
-    public static Achievement OPEN_INVENTORY = (new Achievement(0, "openInventory", 0, 0, Item.book, null)).setClientsideAchievement().registerAchievement();
-    public static Achievement MINE_WOOD = (new Achievement(1, "mineWood", 2, 1, Block.logOak, OPEN_INVENTORY)).registerAchievement();
-    public static Achievement BUILD_WORKBENCH = (new Achievement(2, "buildWorkBench", 4, -1, Block.workbench, MINE_WOOD)).registerAchievement();
-    public static Achievement BUILD_PICKAXE = (new Achievement(3, "buildPickaxe", 4, 2, Item.toolPickaxeWood, BUILD_WORKBENCH)).registerAchievement();
-    public static Achievement BUILD_FURNACE = (new Achievement(4, "buildFurnace", 3, 4, Block.furnaceStoneActive, BUILD_PICKAXE)).registerAchievement();
-    public static Achievement ACQUIRE_IRON = (new Achievement(5, "acquireIron", 1, 4, Item.ingotIron, BUILD_FURNACE)).registerAchievement();
-    public static Achievement BUILD_HOE = (new Achievement(6, "buildHoe", 2, -3, Item.toolHoeWood, BUILD_WORKBENCH)).registerAchievement();
-    public static Achievement MAKE_BREAD = (new Achievement(7, "makeBread", -1, -3, Item.foodBread, BUILD_HOE)).registerAchievement();
-    public static Achievement BAKE_CAKE = (new Achievement(8, "bakeCake", 0, -5, Item.foodCake, BUILD_HOE)).registerAchievement();
-    public static Achievement BUILD_BETTER_PICKAXE = (new Achievement(9, "buildBetterPickaxe", 6, 2, Item.toolPickaxeStone, BUILD_PICKAXE)).registerAchievement();
-    public static Achievement COOK_FISH = (new Achievement(10, "cookFish", 2, 6, Item.foodFishCooked, BUILD_FURNACE)).registerAchievement();
-    public static Achievement ON_A_RAIL = (new Achievement(11, "onARail", 2, 3, Block.rail, ACQUIRE_IRON)).setSpecial().registerAchievement();
-    public static Achievement BUILD_SWORD = (new Achievement(12, "buildSword", 6, -1, Item.toolSwordWood, BUILD_WORKBENCH)).registerAchievement();
-    public static Achievement KILL_ENEMY = (new Achievement(13, "killEnemy", 8, -1, Item.bone, BUILD_SWORD)).registerAchievement();
-    public static Achievement KILL_COW = (new Achievement(14, "killCow", 7, -3, Item.leather, BUILD_SWORD)).registerAchievement();
-    public static Achievement FLY_PIG = (new Achievement(15, "flyPig", 8, -4, Item.saddle, KILL_COW)).setSpecial().registerAchievement();
-    public static Achievement GET_SENSED = (new Achievement(16, "getSensed", 10, -1, Block.motionsensorActive, KILL_ENEMY)).registerAchievement();
-    public static Achievement CRAFT_HANDCANNON = (new Achievement(17, "craftHandCannon", 8, 2, Item.handcannonUnloaded, BUILD_BETTER_PICKAXE)).registerAchievement();
-    public static Achievement COLLECT_STONE = (new Achievement(18, "collectStone", 5, 4, Block.cobbleLimestone, BUILD_PICKAXE)).setSpecial().registerAchievement();
-    public static Achievement CRUSH_BLOCKS = (new Achievement(19, "crushBlocks", 7, 4, Block.ice, BUILD_BETTER_PICKAXE)).registerAchievement();
-    public static Achievement REPAIR_ARMOR = (new Achievement(20, "repairArmor", 12, -1, Item.chainlink, GET_SENSED)).registerAchievement();
-    public static Achievement GET_CHAINMAIL = (new Achievement(21, "getChainmail", 14, -1, Item.armorHelmetChainmail, REPAIR_ARMOR)).setSpecial().registerAchievement();
-    public static Achievement OPEN_GUIDEBOOK = (new Achievement(22, "openGuidebook", 0, 2, Block.bookshelfPlanksOak, OPEN_INVENTORY)).setClientsideAchievement().registerAchievement();
-    public static Achievement CAUGHT_EM_ALL = (new Achievement(23, "caughtEmAll", 4, -4, Item.lanternFireflyGreen, BUILD_WORKBENCH)).setSpecial().registerAchievement();
-
-
-    public static void init()
-    {
-        System.out.println(achievementList.size() + " Achievements");
-    }
-}
diff --git a/src/main/java/net/minecraft/core/achievement/AchievementMap.java b/src/main/java/net/minecraft/core/achievement/AchievementMap.java
deleted file mode 100644
index 5ee654378..000000000
--- a/src/main/java/net/minecraft/core/achievement/AchievementMap.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package net.minecraft.core.achievement;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.b100.utils.StreamUtils;
-
-public class AchievementMap
-{
-
-    public static AchievementMap instance = new AchievementMap();
-    private Map<Integer, String> guidMap;
-
-    private AchievementMap()
-    {
-        BufferedReader bufferedreader = null;
-        InputStream stream = null;
-        guidMap = new HashMap<>();
-        try
-        {
-            stream = this.getClass().getResourceAsStream("/achievement/map.txt");
-            bufferedreader = new BufferedReader(new InputStreamReader(stream));
-            String line;
-            while((line = bufferedreader.readLine()) != null)
-            {
-                String ls[] = line.split(",");
-                int i = Integer.parseInt(ls[0]);
-                guidMap.put(i, ls[1]);
-            }
-            bufferedreader.close();
-        } catch (Exception exception)
-        {
-            exception.printStackTrace();
-        } finally
-        {
-            StreamUtils.close(stream, bufferedreader);
-        }
-    }
-
-    public static String getGuid(int i)
-    {
-        return instance.guidMap.get(i);
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/achievement/Achievements.java b/src/main/java/net/minecraft/core/achievement/Achievements.java
new file mode 100644
index 000000000..cc6c6de70
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/Achievements.java
@@ -0,0 +1,129 @@
+package net.minecraft.core.achievement;
+
+import net.minecraft.client.gui.achievements.data.AchievementPages;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.collection.NamespaceID;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class Achievements
+{
+    
+    public static List<Achievement> achievementList = new ArrayList<>();
+    public static int minX;
+    public static int minY;
+    public static int maxX;
+    public static int maxY;
+    public static Achievement OPEN_INVENTORY =
+        new Achievement(new NamespaceID("minecraft", "open_inventory"), "openInventory", 0, 0, Items.BOOK, null)
+        .setClientsideAchievement().registerAchievement()
+        .addToPage(AchievementPages.overworldPage);
+    public static Achievement MINE_WOOD =
+        new Achievement(new NamespaceID("minecraft", "mine_wood"), "mineWood", 2, 1, Blocks.LOG_OAK, OPEN_INVENTORY)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage, AchievementPages.netherPage);
+    public static Achievement BUILD_WORKBENCH =
+        new Achievement(new NamespaceID("minecraft", "build_workbench"), "buildWorkBench", 4, -1, Blocks.WORKBENCH, MINE_WOOD)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage, AchievementPages.netherPage);
+    public static Achievement BUILD_PICKAXE =
+        new Achievement(new NamespaceID("minecraft", "build_pickaxe"), "buildPickaxe", 4, 2, Items.TOOL_PICKAXE_WOOD, BUILD_WORKBENCH)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage, AchievementPages.netherPage);
+    public static Achievement BUILD_FURNACE =
+        new Achievement(new NamespaceID("minecraft", "build_furnace"), "buildFurnace", 3, 4, Blocks.FURNACE_STONE_ACTIVE, BUILD_PICKAXE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement ACQUIRE_IRON =
+        new Achievement(new NamespaceID("minecraft", "acquire_iron"), "acquireIron", 1, 4, Items.INGOT_IRON, BUILD_FURNACE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement BUILD_HOE =
+        new Achievement(new NamespaceID("minecraft", "build_hoe"), "buildHoe", 2, -3, Items.TOOL_HOE_WOOD, BUILD_WORKBENCH)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement MAKE_BREAD =
+        new Achievement(new NamespaceID("minecraft", "make_bread"), "makeBread", -1, -3, Items.FOOD_BREAD, BUILD_HOE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement BAKE_CAKE =
+        new Achievement(new NamespaceID("minecraft", "bake_cake"), "bakeCake", 0, -5, Items.FOOD_CAKE, BUILD_HOE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement BUILD_BETTER_PICKAXE =
+        new Achievement(new NamespaceID("minecraft", "build_better_pickaxe"), "buildBetterPickaxe", 6, 2, Items.TOOL_PICKAXE_STONE, BUILD_PICKAXE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement COOK_FISH =
+        new Achievement(new NamespaceID("minecraft", "cook_fish"), "cookFish", 2, 6, Items.FOOD_FISH_COOKED, BUILD_FURNACE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement ON_A_RAIL =
+        new Achievement(new NamespaceID("minecraft", "on_a_rail"), "onARail", 2, 3, Blocks.RAIL, ACQUIRE_IRON)
+            .setType(Achievement.TYPE_SPECIAL)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement BUILD_SWORD =
+        new Achievement(new NamespaceID("minecraft", "build_sword"), "buildSword", 6, -1, Items.TOOL_SWORD_WOOD, BUILD_WORKBENCH)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement KILL_ENEMY =
+        new Achievement(new NamespaceID("minecraft", "kill_enemy"), "killEnemy", 8, -1, Items.BONE, BUILD_SWORD)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement KILL_COW =
+        new Achievement(new NamespaceID("minecraft", "kill_cow"), "killCow", 7, -3, Items.LEATHER, BUILD_SWORD)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement FLY_PIG =
+        new Achievement(new NamespaceID("minecraft", "fly_pig"), "flyPig", 8, -4, Items.SADDLE, KILL_COW)
+            .setType(Achievement.TYPE_SPECIAL)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement GET_SENSED =
+        new Achievement(new NamespaceID("minecraft", "get_sensed"), "getSensed", 10, -1, Blocks.MOTION_SENSOR_ACTIVE, KILL_ENEMY)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement CRAFT_HANDCANNON =
+        new Achievement(new NamespaceID("minecraft", "craft_hand_cannon"), "craftHandCannon", 8, 2, Items.HANDCANNON_UNLOADED, BUILD_BETTER_PICKAXE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement COLLECT_STONE =
+        new Achievement(new NamespaceID("minecraft", "collect_stone"), "collectStone", 5, 4, Blocks.COBBLE_LIMESTONE, BUILD_PICKAXE)
+            .setType(Achievement.TYPE_SPECIAL)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement CRUSH_BLOCKS =
+        new Achievement(new NamespaceID("minecraft", "crush_blocks"), "crushBlocks", 7, 4, Blocks.ICE, BUILD_BETTER_PICKAXE)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement REPAIR_ARMOR =
+        new Achievement(new NamespaceID("minecraft", "repair_armor"), "repairArmor", 12, -1, Items.CHAINLINK, GET_SENSED)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement GET_CHAINMAIL =
+        new Achievement(new NamespaceID("minecraft", "get_chainmail"), "getChainmail", 14, -1, Items.ARMOR_HELMET_CHAINMAIL, REPAIR_ARMOR)
+            .setType(Achievement.TYPE_SPECIAL)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement OPEN_GUIDEBOOK =
+        new Achievement(new NamespaceID("minecraft", "open_guidebook"), "openGuidebook", 0, 2, Blocks.BOOKSHELF_PLANKS_OAK, OPEN_INVENTORY)
+            .setClientsideAchievement()
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+    public static Achievement CAUGHT_EM_ALL =
+        new Achievement(new NamespaceID("minecraft", "caught_em_all"), "caughtEmAll", 4, -4, Items.LANTERN_FIREFLY_GREEN, BUILD_WORKBENCH)
+            .setType(Achievement.TYPE_SPECIAL)
+            .registerAchievement()
+            .addToPage(AchievementPages.overworldPage);
+
+    private static boolean hasInit = false;
+    public static void init() {
+        if (hasInit) return;
+        hasInit = true;
+        AchievementPages.init();
+        System.out.println(achievementList.size() + " Achievements");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/DistanceValueFormatter.java b/src/main/java/net/minecraft/core/achievement/stat/DistanceValueFormatter.java
new file mode 100644
index 000000000..a3b2418b5
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/stat/DistanceValueFormatter.java
@@ -0,0 +1,24 @@
+package net.minecraft.core.achievement.stat;
+
+// Referenced classes of package net.minecraft.src:
+//            StatValueFormatter, StatBase
+
+final class DistanceValueFormatter implements StatValueFormatter {
+    public static double UNIT_CENTIMETER_TO_METER = 1d/100;
+    public static double UNIT_METER_TO_KILOMETER = 1d/1000;
+
+    @Override
+	public String formatValue(int value)
+    {
+        double meters = value * UNIT_CENTIMETER_TO_METER;
+        double kilometers = meters * UNIT_METER_TO_KILOMETER;
+        if(kilometers > 0.5D) {
+            return Stat.getDecimalFormat().format(kilometers) + " km";
+        }
+        if(meters > 0.5D) {
+            return Stat.getDecimalFormat().format(meters) + " m";
+        } else {
+            return value + " cm";
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/IStatStringFormat.java b/src/main/java/net/minecraft/core/achievement/stat/IStatStringFormat.java
deleted file mode 100644
index 5e78b6894..000000000
--- a/src/main/java/net/minecraft/core/achievement/stat/IStatStringFormat.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.minecraft.core.achievement.stat;
-
-
-public interface IStatStringFormat
-{
-
-    public abstract String formatString(String s);
-}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/IStatType.java b/src/main/java/net/minecraft/core/achievement/stat/IStatType.java
deleted file mode 100644
index b505a9bf4..000000000
--- a/src/main/java/net/minecraft/core/achievement/stat/IStatType.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.minecraft.core.achievement.stat;
-
-
-public interface IStatType
-{
-
-    public abstract String makeString(int i);
-}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/SimpleValueFormatter.java b/src/main/java/net/minecraft/core/achievement/stat/SimpleValueFormatter.java
new file mode 100644
index 000000000..73bd925dd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/stat/SimpleValueFormatter.java
@@ -0,0 +1,13 @@
+package net.minecraft.core.achievement.stat;
+
+// Referenced classes of package net.minecraft.src:
+//            StatValueFormatter, StatBase
+
+final class SimpleValueFormatter implements StatValueFormatter {
+
+    @Override
+	public String formatValue(int value)
+    {
+        return Stat.getNumberFormat().format(value);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/Stat.java b/src/main/java/net/minecraft/core/achievement/stat/Stat.java
index f1ca08bc0..0b4e4f960 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/Stat.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/Stat.java
@@ -1,8 +1,12 @@
 package net.minecraft.core.achievement.stat;
 
-import net.minecraft.core.achievement.AchievementMap;
+import com.b100.utils.StreamUtils;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.collection.NamespaceID;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.*;
@@ -10,33 +14,34 @@ import java.util.*;
 public class Stat
 {
 
-    public final int statId;
-    final String statName;
+    private static final NumberFormat numberFormat = NumberFormat.getIntegerInstance(Locale.US);
+    public static StatValueFormatter statTypeSimple = new SimpleValueFormatter();
+    private static final DecimalFormat decimalFormat = new DecimalFormat("########0.00");
+    public static StatValueFormatter statTypeTime = new TimeValueFormatter();
+    public static StatValueFormatter statTypeDistance = new DistanceValueFormatter();
+
+    public final NamespaceID statId;
+    final String statKey;
     public boolean clientside;
-    public String statGuid;
-    private final IStatType statType;
-    private static NumberFormat numberFormat = NumberFormat.getIntegerInstance(Locale.US);
-    public static IStatType statTypeSimple = new StatTypeSimple();
-    private static DecimalFormat decimalFormat = new DecimalFormat("########0.00");
-    public static IStatType statTypeTime = new StatTypeTime();
-    public static IStatType statTypeDistance = new StatTypeDistance();
-
-    public Stat(int id, String name, IStatType statType)
+//    public String UUID;
+    private final StatValueFormatter statType;
+
+    public Stat(NamespaceID id, String key, StatValueFormatter statType)
     {
         clientside = false;
         statId = id;
-        statName = name;
+        statKey = key;
         this.statType = statType;
     }
 
-    public Stat(int id, String name)
+    public Stat(NamespaceID id, String key)
     {
-        this(id, name, statTypeSimple);
+        this(id, key, statTypeSimple);
     }
 
     public String getStatName()
     {
-        return I18n.getInstance().translateKey(statName);
+        return I18n.getInstance().translateKey(statKey);
     }
 
     public Stat setClientside()
@@ -47,14 +52,14 @@ public class Stat
 
     public Stat registerStat()
     {
-        if (StatList.statMap.containsKey(Integer.valueOf(statId)))
+        if (StatList.statMap.containsKey(statId))
         {
-            throw new RuntimeException((new StringBuilder()).append("Duplicate stat id: \"").append(((Stat) StatList.statMap.get(Integer.valueOf(statId))).getStatName()).append("\" and \"").append(statName).append("\" at id ").append(statId).toString());
+            throw new RuntimeException("Duplicate stat id: \"" + StatList.statMap.get(statId).getStatName() + "\" and \"" + statKey + "\" at id " + statId);
         } else
         {
-            StatList.statList1.add(this);
-            StatList.statMap.put(Integer.valueOf(statId), this);
-            statGuid = AchievementMap.getGuid(statId);
+            StatList.registeredStats.add(this);
+            StatList.statMap.put(statId, this);
+//            UUID = UUIDs.get(statId);
             return this;
         }
     }
@@ -64,15 +69,15 @@ public class Stat
         return false;
     }
 
-    public String makeString(int i)
+    public String getFormattedValue(int value)
     {
-        return statType.makeString(i);
+        return statType.formatValue(value);
     }
 
     @Override
 	public String toString()
     {
-        return statName;
+        return statKey;
     }
 
     static NumberFormat getNumberFormat()
@@ -85,4 +90,44 @@ public class Stat
         return decimalFormat;
     }
 
+//    public static class UUIDs
+//    {
+//
+//        private static final UUIDs instance = new UUIDs();
+//        private final Map<NamespaceID, String> ID_TO_UUID_MAP;
+//
+//        private UUIDs()
+//        {
+//            BufferedReader bufferedreader = null;
+//            InputStream stream = null;
+//            ID_TO_UUID_MAP = new HashMap<>();
+//            try
+//            {
+//                stream = this.getClass().getResourceAsStream("/achievement/map.txt");
+//                bufferedreader = new BufferedReader(new InputStreamReader(stream));
+//                String line;
+//                while((line = bufferedreader.readLine()) != null)
+//                {
+//                    String[] ls = line.split(",");
+//                    try {
+//                        ID_TO_UUID_MAP.put(new NamespaceID(ls[0]), ls[1]);
+//                    } catch (IllegalArgumentException illegalArgumentException){
+//                        illegalArgumentException.printStackTrace();
+//                    }
+//                }
+//                bufferedreader.close();
+//            } catch (Exception exception)
+//            {
+//                exception.printStackTrace();
+//            } finally
+//            {
+//                StreamUtils.close(stream, bufferedreader);
+//            }
+//        }
+//
+//        public static String get(NamespaceID statID)
+//        {
+//            return instance.ID_TO_UUID_MAP.get(statID);
+//        }
+//    }
 }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatBasic.java b/src/main/java/net/minecraft/core/achievement/stat/StatBasic.java
index 7fa14fdad..bdf809cfa 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatBasic.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatBasic.java
@@ -1,23 +1,25 @@
 package net.minecraft.core.achievement.stat;
 
+import net.minecraft.core.util.collection.NamespaceID;
+
 public class StatBasic extends Stat
 {
 
-    public StatBasic(int i, String s, IStatType istattype)
+    public StatBasic(NamespaceID id, String name, StatValueFormatter type)
     {
-        super(i, s, istattype);
+        super(id, name, type);
     }
 
-    public StatBasic(int i, String s)
+    public StatBasic(NamespaceID id, String name)
     {
-        super(i, s);
+        super(id, name);
     }
 
     @Override
 	public Stat registerStat()
     {
         super.registerStat();
-        StatList.statList2.add(this);
+        StatList.basicStats.add(this);
         return this;
     }
 }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatDescFormatter.java b/src/main/java/net/minecraft/core/achievement/stat/StatDescFormatter.java
new file mode 100644
index 000000000..d08501030
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatDescFormatter.java
@@ -0,0 +1,8 @@
+package net.minecraft.core.achievement.stat;
+
+
+public interface StatDescFormatter
+{
+
+    String formatString(String description);
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatItem.java b/src/main/java/net/minecraft/core/achievement/stat/StatItem.java
index a4ec4cf97..1613a36c1 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatItem.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatItem.java
@@ -2,13 +2,14 @@ package net.minecraft.core.achievement.stat;
 
 import net.minecraft.core.item.Item;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.collection.NamespaceID;
 
 public class StatItem extends Stat
 {
 
-    public StatItem(int id, String name, int itemId)
+    public StatItem(NamespaceID id, String key, int itemId)
     {
-        super(id, name);
+        super(id, key);
         itemID = itemId;
     }
 
@@ -16,11 +17,14 @@ public class StatItem extends Stat
     {
         return itemID;
     }
+    public Item getItem(){
+        return Item.getItem(itemID);
+    }
 
     @Override
     public String getStatName()
     {
-        return I18n.getInstance().translateKeyAndFormat(statName, Item.itemsList[itemID].getStatName());
+        return I18n.getInstance().translateKeyAndFormat(statKey, Item.itemsList[itemID].getStatName());
     }
 
     private final int itemID;
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 b2f7dbda2..4d9fb95d8 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatList.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatList.java
@@ -1,225 +1,312 @@
 package net.minecraft.core.achievement.stat;
 
-import net.minecraft.core.Global;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.WeightedRandomBag;
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.achievement.Achievement;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryBlastFurnace;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCrafting;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryFurnace;
+import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
+import net.minecraft.core.item.IItemConvertible;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.crafting.legacy.recipe.RecipesFurnace;
+import net.minecraft.core.util.collection.NamespaceID;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.Unmodifiable;
 
 import java.util.*;
 
 public abstract class StatList
 {
 
-    protected static Map<Integer, Stat> statMap = new HashMap<>();
-    public static List<Stat> statList1 = new ArrayList<>();
-    public static List<Stat> statList2 = new ArrayList<>();
-    public static List<Stat> usedItemStatsList = new ArrayList<>();
-    public static List<Stat> statList3 = new ArrayList<>();
-    public static Stat startGameStat = (new StatBasic(1000, "stat.startGame")).setClientside().registerStat();
-    public static Stat createWorldStat = (new StatBasic(1001, "stat.createWorld")).setClientside().registerStat();
-    public static Stat loadWorldStat = (new StatBasic(1002, "stat.loadWorld")).setClientside().registerStat();
-    public static Stat joinMultiplayerStat = (new StatBasic(1003, "stat.joinMultiplayer")).setClientside().registerStat();
-    public static Stat leaveGameStat = (new StatBasic(1004, "stat.leaveGame")).setClientside().registerStat();
-    public static Stat minutesPlayedStat = (new StatBasic(1100, "stat.playOneMinute", Stat.statTypeTime)).setClientside().registerStat();
-    public static Stat distanceWalkedStat = (new StatBasic(2000, "stat.walkOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceSwumStat = (new StatBasic(2001, "stat.swimOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceFallenStat = (new StatBasic(2002, "stat.fallOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceClimbedStat = (new StatBasic(2003, "stat.climbOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceFlownStat = (new StatBasic(2004, "stat.flyOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceDoveStat = (new StatBasic(2005, "stat.diveOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceByMinecartStat = (new StatBasic(2006, "stat.minecartOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceByBoatStat = (new StatBasic(2007, "stat.boatOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat distanceByPigStat = (new StatBasic(2008, "stat.pigOneCm", Stat.statTypeDistance)).setClientside().registerStat();
-    public static Stat jumpStat = (new StatBasic(2010, "stat.jump")).setClientside().registerStat();
-    public static Stat dropStat = (new StatBasic(2011, "stat.drop")).setClientside().registerStat();
-    public static Stat damageDealtStat = (new StatBasic(2020, "stat.damageDealt")).registerStat();
-    public static Stat damageTakenStat = (new StatBasic(2021, "stat.damageTaken")).registerStat();
-    public static Stat deathsStat = (new StatBasic(2022, "stat.deaths")).registerStat();
-    public static Stat mobKillsStat = (new StatBasic(2023, "stat.mobKills")).registerStat();
-    public static Stat playerKillsStat = (new StatBasic(2024, "stat.playerKills")).registerStat();
-    public static Stat fishCaughtStat = (new StatBasic(2025, "stat.fishCaught")).registerStat();
-    public static Stat[] mineBlockStatArray = func_25153_a("stat.mineBlock", 0x1000000);
-    public static Stat[] craftedItemStats;
-    public static Stat[] usedItemStats;
-    public static Stat[] breakItemStats;
-    public static Stat[] pickUpItemStats;
+    protected static Map<NamespaceID, Stat> statMap = new HashMap<>();
+    public static List<Stat> registeredStats = new ArrayList<>();
+    public static List<Stat> basicStats = new ArrayList<>();
+    public static List<Stat> usedItemStats = new ArrayList<>();
+
+    public static final String STAT_USED = "stat_used";
+    public static final String STAT_DEPLETED = "stat_broken";
+    public static final String STAT_CRAFTED = "stat_crafted";
+    public static final String STAT_PICKED_UP = "stat_picked_up";
+    public static final String STAT_MINED = "stat_mined";
+
+    public static Stat startGameStat =
+        new StatBasic(new NamespaceID("minecraft", "start_game"), "stat.startGame").setClientside().registerStat();
+    public static Stat createWorldStat =
+        new StatBasic(new NamespaceID("minecraft", "create_world"), "stat.createWorld").setClientside().registerStat();
+    public static Stat loadWorldStat =
+        new StatBasic(new NamespaceID("minecraft", "load_world"), "stat.loadWorld").setClientside().registerStat();
+    public static Stat joinMultiplayerStat =
+        new StatBasic(new NamespaceID("minecraft", "join_multiplayer"), "stat.joinMultiplayer").setClientside().registerStat();
+    public static Stat leaveGameStat =
+        new StatBasic(new NamespaceID("minecraft", "leave_game"), "stat.leaveGame").setClientside().registerStat();
+    public static Stat minutesPlayedStat =
+        new StatBasic(new NamespaceID("minecraft", "playtime"), "stat.playOneMinute", Stat.statTypeTime).setClientside().registerStat();
+    public static Stat distanceWalkedStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_walk"), "stat.walkOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceSwumStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_swim"), "stat.swimOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceFallenStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_fall"), "stat.fallOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceClimbedStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_climb"), "stat.climbOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceFlownStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_fly"), "stat.flyOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceDoveStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_dive"), "stat.diveOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceByMinecartStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_minecart"), "stat.minecartOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceByBoatStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_boat"), "stat.boatOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat distanceByPigStat =
+        new StatBasic(new NamespaceID("minecraft", "travel_pig"), "stat.pigOneCm", Stat.statTypeDistance).setClientside().registerStat();
+    public static Stat jumpStat =
+        new StatBasic(new NamespaceID("minecraft", "jump"), "stat.jump").setClientside().registerStat();
+    public static Stat dropStat =
+        new StatBasic(new NamespaceID("minecraft", "drop"), "stat.drop").setClientside().registerStat();
+    public static Stat damageDealtStat =
+        new StatBasic(new NamespaceID("minecraft", "damage_dealt"), "stat.damageDealt").registerStat();
+    public static Stat damageTakenStat =
+        new StatBasic(new NamespaceID("minecraft", "damage_taken"), "stat.damageTaken").registerStat();
+    public static Stat deathsStat =
+        new StatBasic(new NamespaceID("minecraft", "deaths"), "stat.deaths").registerStat();
+    public static Stat mobKillsStat =
+        new StatBasic(new NamespaceID("minecraft", "kills_mob"), "stat.mobKills").registerStat();
+    public static Stat playerKillsStat =
+        new StatBasic(new NamespaceID("minecraft", "kills_player"), "stat.playerKills").registerStat();
+    public static Stat fishCaughtStat =
+        new StatBasic(new NamespaceID("minecraft", "caught_fish"), "stat.fishCaught").registerStat();
+
     public static Map<String, Stat> mobEncounterStats;
-    private static boolean blocksInitialized = false;
-    private static boolean itemsInitialized = false;
 
-    static
-    {
-        AchievementList.init();
-    }
+    public static Map<Integer, Integer> replacementMap = new HashMap<>();
 
     public StatList()
     {
     }
 
-    public static void init()
-    {
-    }
+    public static void initReplaceMap() {
+        for (Item item : Item.itemsList){
+            if (item == null) continue;
+            Item parent = item.getStatParent();
+            if (parent == null) continue;
 
-    public static void onBlockInit()
-    {
-        usedItemStats = initUsedItemStats(usedItemStats, "stat.useItem", 0x1020000, 0, Block.blocksList.length);
-        breakItemStats = initBreakItemStats(breakItemStats, "stat.breakItem", 0x1030000, 0, Block.blocksList.length);
-        blocksInitialized = true;
-        blocksAndItemsInitialized();
+            if (item.id == parent.id){
+                throw new RuntimeException("Attempted to set '" + item.namespaceID + "' parent to itself!");
+            }
+            replacementMap.put(item.id, parent.id);
+        }
     }
 
-    public static void onItemInit()
+    public static void init()
     {
-        usedItemStats = initUsedItemStats(usedItemStats, "stat.useItem", 0x1020000, Block.blocksList.length, Item.itemsList.length);
-        breakItemStats = initBreakItemStats(breakItemStats, "stat.breakItem", 0x1030000, Block.blocksList.length, Item.itemsList.length);
-        itemsInitialized = true;
-        blocksAndItemsInitialized();
-    }
+        initReplaceMap();
+        Achievements.init();
 
-    public static void blocksAndItemsInitialized()
-    {
-        if(!blocksInitialized || !itemsInitialized)
-        {
-            return;
-        }
-        HashSet hashset = new HashSet();
-        IRecipe irecipe;
-        for (Iterator iterator = CraftingManager.getInstance().getRecipeList().iterator(); iterator.hasNext(); hashset.add(Integer.valueOf(irecipe.getRecipeOutput().itemID)))
-        {
-            irecipe = (IRecipe)iterator.next();
+        HashSet<Integer> craftable = new HashSet<>();
+        for (RecipeEntryCrafting<?,?> r : Registries.RECIPES.getAllCraftingRecipes()){
+            if (r.getOutput() instanceof ItemStack){
+                craftable.add(((ItemStack) r.getOutput()).itemID);
+            } else if (r.getOutput() instanceof IItemConvertible) {
+                craftable.add((((Item) r.getOutput()).asItem()).id);
+            }
         }
-
-        ItemStack itemstack;
-        for (Iterator iterator1 = RecipesFurnace.getInstance().getSmeltingList().values().iterator(); iterator1.hasNext(); hashset.add(Integer.valueOf(itemstack.itemID)))
-        {
-            itemstack = (ItemStack)iterator1.next();
+        for (RecipeEntryFurnace r : Registries.RECIPES.getAllFurnaceRecipes()){
+            if (r.getOutput() != null){
+                craftable.add(r.getOutput().itemID);
+            }
         }
-
-        craftedItemStats = new Stat[Item.itemsList.length];
-        Iterator iterator2 = hashset.iterator();
-        do
-        {
-            if(!iterator2.hasNext())
-            {
-                break;
+        for (RecipeEntryBlastFurnace r : Registries.RECIPES.getAllBlastFurnaceRecipes()){
+            if (r.getOutput() != null){
+                craftable.add(r.getOutput().itemID);
             }
-            Integer integer = (Integer)iterator2.next();
-            if(Item.itemsList[integer.intValue()] != null)
-            {
-                craftedItemStats[integer.intValue()] = (new StatItem(0x1010000 + integer.intValue(), "stat.craftItem", integer.intValue())).registerStat();
+        }
+        for (RecipeEntryTrommel r : Registries.RECIPES.getAllTrommelRecipes()){
+            if (r.getOutput() != null) {
+                WeightedRandomBag<WeightedRandomLootObject> bag = r.getOutput();
+                for (WeightedRandomLootObject o : bag.getEntries()){
+                    ItemStack stack = o.getItemStack();
+                    if (stack != null){
+                        craftable.add(stack.itemID);
+                    }
+                }
             }
-        } while(true);
-
-        pickUpItemStats = new Stat[Item.itemsList.length];
-        for (int i = 0; i < Item.itemsList.length; i++)
-        {
-            pickUpItemStats[i] = (new StatItem(0x1040000 + i, "", i)).registerStat().setClientside();
+        }
+        for (Integer i : craftable){
+            Item.itemsList[i].createStat(STAT_CRAFTED, "stat.craftItem");;
         }
 
         mobEncounterStats = new HashMap<>();
         for (Map.Entry<String, Class<? extends Entity>> entry : EntityDispatcher.keyToClassMap.entrySet())
         {
-            mobEncounterStats.put(entry.getKey(), new StatMob(0x1050000 + EntityDispatcher.getEntityID(entry.getValue()), "stat.encounterMob", entry.getKey()).registerStat());
+            mobEncounterStats.put(entry.getKey(), new StatMob(new NamespaceID("minecraft", "encounter_" + entry.getKey()), "stat.encounterMob", entry.getKey()).registerStat());
         }
+    }
 
-        replaceAllSimilarBlocks(craftedItemStats);
+    @Nullable
+    public static Stat getStat(NamespaceID id) {
+        return statMap.get(id);
     }
 
-    private static Stat[] func_25153_a(String s, int i)
-    {
-        Stat astatbase[] = new Stat[Block.blocksList.length];
-        for (int j = 0; j < Block.blocksList.length; j++)
-        {
-            if(Block.blocksList[j] != null && Block.blocksList[j].getEnableStats())
-            {
-                astatbase[j] = (new StatItem(i + j, s, j)).registerStat();
-                statList3.add((StatItem)astatbase[j]);
+    @Unmodifiable
+    public static Collection<Stat> getAllStats(){
+        return Collections.unmodifiableCollection(statMap.values());
+    }
+
+    public static class StatConverter {
+        public static final int OFFSET_OFFSET =      0x001_0000;
+        public static final int OFFSET_MINED =       0x100_0000;
+        public static final int OFFSET_CRAFTED =     0x101_0000;
+        public static final int OFFSET_USED =        0x102_0000;
+        public static final int OFFSET_DEPLETED =    0x103_0000;
+        public static final int OFFSET_PICKED_UP =   0x104_0000;
+        public static final int OFFSET_MOB =         0x105_0000;
+        public static final int OFFSET_ACHIEVEMENT = 0x050_0000;
+
+        /**
+         * @param id Stat ID from BTA version before 7.3
+         * @return Equivalent current Stat object or null if no corresponding stat could be found
+         */
+        public static @Nullable Stat getStatFromDeprecatedID(int id) {
+            switch (id) {
+                case 1000:
+                    return startGameStat;
+                case 1001:
+                    return createWorldStat;
+                case 1002:
+                    return loadWorldStat;
+                case 1003:
+                    return joinMultiplayerStat;
+                case 1004:
+                    return leaveGameStat;
+                case 1100:
+                    return minutesPlayedStat;
+                case 2000:
+                    return distanceWalkedStat;
+                case 2001:
+                    return distanceSwumStat;
+                case 2002:
+                    return distanceFallenStat;
+                case 2003:
+                    return distanceClimbedStat;
+                case 2004:
+                    return distanceFlownStat;
+                case 2005:
+                    return distanceDoveStat;
+                case 2006:
+                    return distanceByMinecartStat;
+                case 2007:
+                    return distanceByBoatStat;
+                case 2008:
+                    return distanceByPigStat;
+                case 2010:
+                    return jumpStat;
+                case 2011:
+                    return dropStat;
+                case 2020:
+                    return damageDealtStat;
+                case 2021:
+                    return damageTakenStat;
+                case 2022:
+                    return deathsStat;
+                case 2023:
+                    return mobKillsStat;
+                case 2024:
+                    return playerKillsStat;
+                case 2025:
+                    return fishCaughtStat;
             }
-        }
 
-        replaceAllSimilarBlocks(astatbase);
-        return astatbase;
-    }
+            if (OFFSET_MINED <= id && id < OFFSET_MINED + OFFSET_OFFSET) {
+                Item i = Item.getItem(id - OFFSET_MINED);
+                return i == null ? null : i.getStat(STAT_MINED);
+            }
 
-    private static Stat[] initUsedItemStats(Stat astatbase[], String s, int i, int j, int k)
-    {
-        if(astatbase == null)
-        {
-            astatbase = new Stat[Item.itemsList.length];
-        }
-        for (int l = j; l < k; l++)
-        {
-            if(Item.itemsList[l] == null)
-            {
-                continue;
+            if (OFFSET_CRAFTED <= id && id < OFFSET_CRAFTED + OFFSET_OFFSET) {
+                Item i = Item.getItem(id - OFFSET_CRAFTED);
+                return i == null ? null : i.getStat(STAT_CRAFTED);
             }
-            astatbase[l] = (new StatItem(i + l, s, l)).registerStat();
-            if(l >= Block.blocksList.length)
-            {
-                usedItemStatsList.add((StatItem)astatbase[l]);
+
+            if (OFFSET_USED <= id && id < OFFSET_USED + OFFSET_OFFSET) {
+                Item i = Item.getItem(id - OFFSET_USED);
+                return i == null ? null : i.getStat(STAT_USED);
             }
-        }
 
-        replaceAllSimilarBlocks(astatbase);
-        return astatbase;
-    }
+            if (OFFSET_DEPLETED <= id && id < OFFSET_DEPLETED + OFFSET_OFFSET) {
+                Item i = Item.getItem(id - OFFSET_DEPLETED);
+                return i == null ? null : i.getStat(STAT_DEPLETED);
+            }
 
-    private static Stat[] initBreakItemStats(Stat astatbase[], String s, int i, int j, int k)
-    {
-        if(astatbase == null)
-        {
-            astatbase = new Stat[Item.itemsList.length];
-        }
-        for (int l = j; l < k; l++)
-        {
-            if(Item.itemsList[l] != null && Item.itemsList[l].isDamagable())
-            {
-                astatbase[l] = (new StatItem(i + l, s, l)).registerStat();
+            if (OFFSET_PICKED_UP <= id && id < OFFSET_PICKED_UP + OFFSET_OFFSET) {
+                Item i = Item.getItem(id - OFFSET_PICKED_UP);
+                return i == null ? null : i.getStat(STAT_PICKED_UP);
             }
-        }
 
-        replaceAllSimilarBlocks(astatbase);
-        return astatbase;
-    }
+            if (OFFSET_MOB <= id && id < OFFSET_MOB + OFFSET_OFFSET) {
+                Class<? extends Entity> c = EntityDispatcher.getClassFromID(id - OFFSET_MOB);
+                String entityID = EntityDispatcher.getEncodeId(c);
+                return mobEncounterStats.get(entityID);
+            }
 
-    private static void replaceAllSimilarBlocks(Stat astatbase[])
-    {
-        replaceSimilarBlocks(astatbase, Block.fluidWaterStill.id, Block.fluidWaterFlowing.id);
-        replaceSimilarBlocks(astatbase, Block.fluidLavaStill.id, Block.fluidLavaStill.id);
-        replaceSimilarBlocks(astatbase, Block.pumpkinCarvedActive.id, Block.pumpkinCarvedIdle.id);
-        replaceSimilarBlocks(astatbase, Block.furnaceStoneActive.id, Block.furnaceStoneIdle.id);
-        replaceSimilarBlocks(astatbase, Block.oreRedstoneGlowingStone.id, Block.oreRedstoneStone.id);
-        replaceSimilarBlocks(astatbase, Block.repeaterActive.id, Block.repeaterIdle.id);
-        replaceSimilarBlocks(astatbase, Block.torchRedstoneActive.id, Block.torchRedstoneIdle.id);
-        replaceSimilarBlocks(astatbase, Block.mushroomRed.id, Block.mushroomBrown.id);
-        replaceSimilarBlocks(astatbase, Block.grass.id, Block.dirt.id);
-        replaceSimilarBlocks(astatbase, Block.farmlandDirt.id, Block.dirt.id);
-    }
+            if (OFFSET_ACHIEVEMENT <= id && id < OFFSET_MINED) {
+                int achievementID = id - OFFSET_ACHIEVEMENT;
+                switch (achievementID) {
+                    case 0:
+                        return Achievements.OPEN_INVENTORY;
+                    case 1:
+                        return Achievements.MINE_WOOD;
+                    case 2:
+                        return Achievements.BUILD_WORKBENCH;
+                    case 3:
+                        return Achievements.BUILD_PICKAXE;
+                    case 4:
+                        return Achievements.BUILD_FURNACE;
+                    case 5:
+                        return Achievements.ACQUIRE_IRON;
+                    case 6:
+                        return Achievements.BUILD_HOE;
+                    case 7:
+                        return Achievements.MAKE_BREAD;
+                    case 8:
+                        return Achievements.BAKE_CAKE;
+                    case 9:
+                        return Achievements.BUILD_BETTER_PICKAXE;
+                    case 10:
+                        return Achievements.COOK_FISH;
+                    case 11:
+                        return Achievements.ON_A_RAIL;
+                    case 12:
+                        return Achievements.BUILD_SWORD;
+                    case 13:
+                        return Achievements.KILL_ENEMY;
+                    case 14:
+                        return Achievements.KILL_COW;
+                    case 15:
+                        return Achievements.FLY_PIG;
+                    case 16:
+                        return Achievements.GET_SENSED;
+                    case 17:
+                        return Achievements.CRAFT_HANDCANNON;
+                    case 18:
+                        return Achievements.COLLECT_STONE;
+                    case 19:
+                        return Achievements.CRUSH_BLOCKS;
+                    case 20:
+                        return Achievements.REPAIR_ARMOR;
+                    case 21:
+                        return Achievements.GET_CHAINMAIL;
+                    case 22:
+                        return Achievements.OPEN_GUIDEBOOK;
+                    case 23:
+                        return Achievements.CAUGHT_EM_ALL;
+                }
+            }
 
-    private static void replaceSimilarBlocks(Stat astatbase[], int i, int j)
-    {
-        if(astatbase[i] != null && astatbase[j] == null)
-        {
-            astatbase[j] = astatbase[i];
-            return;
-        } else
-        {
-            statList1.remove(astatbase[i]);
-            statList3.remove(astatbase[i]);
-            statList2.remove(astatbase[i]);
-            astatbase[i] = astatbase[j];
-            return;
+            return null;
         }
     }
-
-    public static Stat getStat(int i)
-    {
-        return statMap.get(i);
-    }
 }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatMob.java b/src/main/java/net/minecraft/core/achievement/stat/StatMob.java
index 567bcd8e1..b7624def4 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatMob.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatMob.java
@@ -1,9 +1,11 @@
 package net.minecraft.core.achievement.stat;
 
+import net.minecraft.core.util.collection.NamespaceID;
+
 public class StatMob extends Stat {
     private final String mobId;
 
-    public StatMob(int id, String name, String mobId) {
+    public StatMob(NamespaceID id, String name, String mobId) {
         super(id, name);
         this.mobId = mobId;
     }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatTypeDistance.java b/src/main/java/net/minecraft/core/achievement/stat/StatTypeDistance.java
deleted file mode 100644
index 40e0d1012..000000000
--- a/src/main/java/net/minecraft/core/achievement/stat/StatTypeDistance.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package net.minecraft.core.achievement.stat;
-
-// Referenced classes of package net.minecraft.src:
-//            IStatType, StatBase
-
-final class StatTypeDistance
-    implements IStatType
-{
-
-    StatTypeDistance()
-    {
-    }
-
-    @Override
-	public String makeString(int i)
-    {
-        int j = i;
-        double d = (double)j / 100D;
-        double d1 = d / 1000D;
-        if(d1 > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d1)).append(" km").toString();
-        }
-        if(d > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d)).append(" m").toString();
-        } else
-        {
-            return (new StringBuilder()).append(i).append(" cm").toString();
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatTypeSimple.java b/src/main/java/net/minecraft/core/achievement/stat/StatTypeSimple.java
deleted file mode 100644
index b6b49bd53..000000000
--- a/src/main/java/net/minecraft/core/achievement/stat/StatTypeSimple.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.minecraft.core.achievement.stat;
-
-// Referenced classes of package net.minecraft.src:
-//            IStatType, StatBase
-
-final class StatTypeSimple
-    implements IStatType
-{
-
-    StatTypeSimple()
-    {
-    }
-
-    @Override
-	public String makeString(int i)
-    {
-        return Stat.getNumberFormat().format(i);
-    }
-}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatTypeTime.java b/src/main/java/net/minecraft/core/achievement/stat/StatTypeTime.java
deleted file mode 100644
index 8e9e53844..000000000
--- a/src/main/java/net/minecraft/core/achievement/stat/StatTypeTime.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package net.minecraft.core.achievement.stat;
-
-// Referenced classes of package net.minecraft.src:
-//            IStatType, StatBase
-
-final class StatTypeTime
-    implements IStatType
-{
-
-    StatTypeTime()
-    {
-    }
-
-    @Override
-	public String makeString(int i)
-    {
-        double d = (double)i / 20D;
-        double d1 = d / 60D;
-        double d2 = d1 / 60D;
-        double d3 = d2 / 24D;
-        double d4 = d3 / 365D;
-        if(d4 > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d4)).append(" y").toString();
-        }
-        if(d3 > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d3)).append(" d").toString();
-        }
-        if(d2 > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d2)).append(" h").toString();
-        }
-        if(d1 > 0.5D)
-        {
-            return (new StringBuilder()).append(Stat.getDecimalFormat().format(d1)).append(" m").toString();
-        } else
-        {
-            return (new StringBuilder()).append(d).append(" s").toString();
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatValueFormatter.java b/src/main/java/net/minecraft/core/achievement/stat/StatValueFormatter.java
new file mode 100644
index 000000000..f1263ab9d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatValueFormatter.java
@@ -0,0 +1,6 @@
+package net.minecraft.core.achievement.stat;
+
+
+public interface StatValueFormatter {
+    String formatValue(int value);
+}
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java b/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
index 8d90c292e..7508c0be3 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
@@ -1,7 +1,9 @@
 package net.minecraft.core.achievement.stat;
 
 import java.io.File;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import com.b100.json.JsonParser;
@@ -13,17 +15,20 @@ import com.b100.utils.FileUtils;
 import net.minecraft.core.MD5String;
 import net.minecraft.core.achievement.Achievement;
 import net.minecraft.core.player.Session;
+import net.minecraft.core.util.HardIllegalArgumentException;
+import net.minecraft.core.util.collection.NamespaceID;
+import org.jetbrains.annotations.Unmodifiable;
 
 public class StatsCounter {
 
-	private final Map<Stat, Integer> statMap1;
-	private final Map<Stat, Integer> statMap2;
+	private final Map<Stat, Integer> sessionStats; // Local copy of stats used by the client
+	private final Map<Stat, Integer> savedStats;
 	private boolean modified;
 	private final StatsSyncher statsSyncher;
 
 	public StatsCounter(Session session, File mcDir) {
-		statMap1 = new HashMap<>();
-		statMap2 = new HashMap<>();
+		sessionStats = new HashMap<>();
+		savedStats = new HashMap<>();
 		modified = false;
 		
 		File statsFolder = new File(mcDir, "stats");
@@ -34,77 +39,139 @@ public class StatsCounter {
 		statsSyncher = new StatsSyncher(session, this, statsFolder);
 	}
 
-	public void addValueToStat(Stat stat, int value) {
-		addValueToStatMap(statMap2, stat, value);
-		addValueToStatMap(statMap1, stat, value);
+	public void add(Stat stat, int amount) {
+		addToMap(savedStats, stat, amount);
+		addToMap(sessionStats, stat, amount);
 		modified = true;
 	}
 
-	private void addValueToStatMap(Map<Stat, Integer> map, Stat stat, int value) {
-		Integer integer = map.get(stat);
-		int currentValue = integer != null ? integer : 0;
-
-		map.put(stat, currentValue + value);
+	private void addToMap(Map<Stat, Integer> map, Stat stat, int amount) {
+		int currentValue = map.getOrDefault(stat, 0);
+		map.put(stat, currentValue + amount);
 	}
 
-	public Map<Stat, Integer> cloneMap() {
-		return new HashMap<>(statMap2);
+	@Unmodifiable
+	public Map<Stat, Integer> getSavedStats() {
+		return Collections.unmodifiableMap(savedStats);
 	}
 
-	public void func_27179_a(Map<Stat, Integer> map) {
-		if(map == null) {
+	public void addToBoth(Map<Stat, Integer> changes) {
+		if(changes == null) {
 			return;
 		}
 		modified = true;
-		for (Stat stat : map.keySet()) {
-			addValueToStatMap(statMap2, stat, map.get(stat));
-			addValueToStatMap(statMap1, stat, map.get(stat));
+		for (Stat stat : changes.keySet()) {
+			addToMap(savedStats, stat, changes.get(stat));
+			addToMap(sessionStats, stat, changes.get(stat));
 		}
 
 	}
 
-	public void func_27180_b(Map<Stat, Integer> map) {
-		if(map == null) {
+	public void addToLocal(Map<Stat, Integer> changes) {
+		if(changes == null) {
 			return;
 		}
-		for (Stat stat : map.keySet()) {
-			Integer integer = statMap2.get(stat);
-			int value = integer != null ? integer : 0;
-			statMap1.put(stat, map.get(stat) + value);
+		for (Stat stat : changes.keySet()) {
+			int currentValue = savedStats.getOrDefault(stat, 0);
+			sessionStats.put(stat, currentValue + changes.get(stat));
 		}
 
 	}
 
-	public void func_27187_c(Map<Stat, Integer> map) {
+	public void addToSaved(Map<Stat, Integer> map) {
 		if(map == null) {
 			return;
 		}
 		modified = true;
 		for (Stat stat : map.keySet()) {
-			addValueToStatMap(statMap2, stat, map.get(stat));
+			addToMap(savedStats, stat, map.get(stat));
+		}
+	}
+
+	public boolean isUnlocked(Achievement achievement) {
+		return sessionStats.containsKey(achievement);
+	}
+
+	public boolean canUnlock(Achievement achievement) {
+		return achievement.parent == null || isUnlocked(achievement.parent);
+	}
+
+	public int readStat(Stat stat) {
+		return sessionStats.getOrDefault(stat, 0);
+	}
+
+	public void fetchStats() {
+		// Another guess but my assumption is that this method was meant to be called by the game to fetch stats from the server
+		// while the player was paused or before the game saved stats to disk
+	}
+
+	public void saveStats() {
+		statsSyncher.saveStatsToDisk(getSavedStats());
+	}
+
+	public void tick() {
+		if(modified && statsSyncher.pendingSave()) {
+			statsSyncher.startSavingThread(getSavedStats());
+		}
+		statsSyncher.tick();
+	}
+
+	public void wipe(String stupidityCheck){
+		if (!stupidityCheck.toLowerCase(Locale.ROOT).equals("I want to delete all the saved stats".toLowerCase(Locale.ROOT))){
+			throw new RuntimeException("Did not properly confirm desire to delete saved stats");
 		}
+		sessionStats.clear();
+		savedStats.clear();
 	}
 
-	public static Map<Stat, Integer> func_27177_a(String s) {
+	public static void relocateStatFiles(File minecraftFolder, File statsFolder) {
+		//Move stat files from .minecraft to stats
+		File[] files = minecraftFolder.listFiles();
+        if (files != null){
+			for (File file : files) {
+				if (file.getName().startsWith("stats_") && file.getName().endsWith(".dat")) {
+					File destination = new File(statsFolder, file.getName());
+					if (!destination.exists()) {
+						System.out.println("Relocating " + file.getName());
+						file.renameTo(destination);
+					}
+				}
+			}
+		}
+	}
+
+	public static Map<Stat, Integer> readStatsFromString(String jsonString) {
 		Map<Stat, Integer> map = new HashMap<>();
 		try {
-			JsonParser jsonParser = new JsonParser();
-			JsonObject rootObject = jsonParser.parseString(s);
+			JsonParser parser = new JsonParser();
+			JsonObject rootObject = parser.parseString(jsonString);
 			JsonArray array = rootObject.getArray("stats-change");
-			
+
 			for(JsonElement element : array) {
 				JsonObject object = element.getAsObject();
 				JsonEntry entry = object.entryList().get(0);
-				
-				int i = Integer.parseInt(entry.name);
-				int j = entry.value.getAsNumber().getInteger();
-				
-				Stat stat = StatList.getStat(i);
+
+				String statId = entry.name;
+				int value = entry.value.getAsNumber().getInteger();
+
+				Stat stat;
+				try {
+					if (statId.contains(":")) {
+						stat = StatList.getStat(new NamespaceID(statId));
+					} else {
+						stat = StatList.StatConverter.getStatFromDeprecatedID(Integer.parseInt(statId));
+					}
+				} catch (HardIllegalArgumentException | NumberFormatException e){
+					e.printStackTrace();
+					continue;
+				}
+
+
 				if(stat == null) {
-					System.out.println(i + " is not a valid stat");
-				} else {
-					map.put(stat, j);
+					System.out.println(statId + " is not a valid stat");
+					continue;
 				}
+				map.put(stat, value);
 			}
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -112,80 +179,39 @@ public class StatsCounter {
 		return map;
 	}
 
-	public static String getStatFileContentString(String username, String localString, Map<Stat, Integer> map) {
-		StringBuilder string1 = new StringBuilder();
-		StringBuilder string2 = new StringBuilder();
+	public static String getStatFileContentString(String username, String sessionID, Map<Stat, Integer> map) {
+		StringBuilder displayString = new StringBuilder();
+		StringBuilder checkSumString = new StringBuilder();
 		boolean flag = true;
-		string1.append("{\r\n");
-		if (username != null && localString != null) {
-			string1.append("  \"user\":{\r\n");
-			string1.append("    \"name\":\"").append(username).append("\",\r\n");
-			string1.append("    \"sessionid\":\"").append(localString).append("\"\r\n");
-			string1.append("  },\r\n");
+		displayString.append("{\r\n");
+		if (username != null && sessionID != null) {
+			displayString.append("  \"user\":{\r\n");
+			displayString.append("    \"name\":\"").append(username).append("\",\r\n");
+			displayString.append("    \"sessionid\":\"").append(sessionID).append("\"\r\n");
+			displayString.append("  },\r\n");
 		}
-		string1.append("  \"stats-change\":[");
+		displayString.append("  \"stats-change\":[");
 		Stat statbase;
 		for (Stat stat : map.keySet()) {
 			statbase = stat;
 			if (!flag) {
-				string1.append("},");
+				displayString.append("},");
 			} else {
 				flag = false;
 			}
-			string1.append("\r\n    {\"").append(statbase.statId).append("\":").append(map.get(statbase));
-			string2.append(statbase.statGuid).append(",");
-			string2.append(map.get(statbase)).append(",");
-		}
+			displayString.append("\r\n    {\"").append(statbase.statId).append("\":").append(map.get(statbase));
 
-		if (!flag) {
-			string1.append("}");
+			checkSumString.append(statbase.statId).append(","); // Used to use UUID rather than namespace
+			checkSumString.append(map.get(statbase)).append(",");
 		}
-		MD5String md5string = new MD5String(localString);
-		string1.append("\r\n  ],\r\n");
-		string1.append("  \"checksum\":\"").append(md5string.getString(string2.toString())).append("\"\r\n");
-		string1.append("}");
-		return string1.toString();
-	}
-
-	public boolean isAchievementUnlocked(Achievement achievement) {
-		return statMap1.containsKey(achievement);
-	}
 
-	public boolean isAchievementUnlockable(Achievement achievement) {
-		return achievement.parent == null || isAchievementUnlocked(achievement.parent);
-	}
-
-	public int readStat(Stat statbase) {
-		Integer integer = statMap1.get(statbase);
-		return integer != null ? integer : 0;
-	}
-
-	public void func_27175_b() {
-	}
-
-	public void syncStats() {
-		statsSyncher.syncStatsFileWithMap(cloneMap());
-	}
-
-	public void func_27178_d() {
-		if(modified && statsSyncher.func_27420_b()) {
-			statsSyncher.func_27424_a(cloneMap());
-		}
-		statsSyncher.func_27425_c();
-	}
-	
-	public static void relocateStatFiles(File minecraftFolder, File statsFolder) {
-		//Move stat files from .minecraft to stats
-		File[] files = minecraftFolder.listFiles();
-		for (int i = 0; i < files.length; i++) {
-			File file = files[i];
-			if(file.getName().startsWith("stats_") && file.getName().endsWith(".dat")) {
-				File file3 = new File(statsFolder, file.getName());
-				if(!file3.exists()) {
-					System.out.println("Relocating " + file.getName());
-					file.renameTo(file3);
-				}
-			}
+		if (!flag) {
+			displayString.append("}");
 		}
+		MD5String md5string = new MD5String(sessionID);
+		displayString.append("\r\n  ],\r\n");
+		displayString.append("  \"checksum\":\"").append(md5string.getString(checkSumString.toString())).append("\"\r\n");
+		displayString.append("}");
+		return displayString.toString();
 	}
 }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/StatsSyncher.java b/src/main/java/net/minecraft/core/achievement/stat/StatsSyncher.java
index f19a8322c..fe8535eb8 100644
--- a/src/main/java/net/minecraft/core/achievement/stat/StatsSyncher.java
+++ b/src/main/java/net/minecraft/core/achievement/stat/StatsSyncher.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.achievement.stat;
 
+import com.b100.utils.StringUtils;
 import net.minecraft.core.player.Session;
 
 import java.io.*;
@@ -8,8 +9,8 @@ import java.util.Map;
 public class StatsSyncher {
 
     private volatile boolean busy = false;
-    private volatile Map<Stat, Integer> map1;
-    private volatile Map<Stat, Integer> map2;
+    private volatile Map<Stat, Integer> queuedLocalStatsChanges;
+    private volatile Map<Stat, Integer> queuedSavedStatsChanges;
     private final StatsCounter statsCounter;
     private final File unsentStatsFile;
     private final File statsFile;
@@ -18,14 +19,14 @@ public class StatsSyncher {
     private final File unsentStatsFileOld;
     private final File statsFileOld;
     private final Session session;
-    private int int1;
-    private int int2;
+    private int saveTimer;
+    private int fetchChangesTimer; // Im making a sorta longshot guess but I think this is the remnant of an unused timer to retrieve stat changes from the server
 
     public StatsSyncher(Session session, StatsCounter statsCounter, File statsDir) {
-        map1 = null;
-        map2 = null;
-        int1 = 0;
-        int2 = 0;
+        queuedLocalStatsChanges = null;
+        queuedSavedStatsChanges = null;
+        saveTimer = 0;
+        fetchChangesTimer = 0;
         unsentStatsFile = new File(statsDir, "stats_" + session.username.toLowerCase() + "_unsent.dat");
         statsFile = new File(statsDir, "stats_" + session.username.toLowerCase() + ".dat");
         unsentStatsFileOld = new File(statsDir, "stats_" + session.username.toLowerCase() + "_unsent.old");
@@ -43,9 +44,9 @@ public class StatsSyncher {
         this.statsCounter = statsCounter;
         this.session = session;
         if (unsentStatsFile.exists()) {
-            statsCounter.func_27179_a(readStatsFromFile(unsentStatsFile, unsentStatsFileTemp, unsentStatsFileOld));
+            statsCounter.addToBoth(readStatsFromFile(unsentStatsFile, unsentStatsFileTemp, unsentStatsFileOld));
         }
-        func_27418_a();
+        startRetrievalThread();
     }
 
     private void renameFile(File file, String s, File file1) {
@@ -70,25 +71,10 @@ public class StatsSyncher {
     }
 
     private Map<Stat, Integer> readStatsFromFile(File statsFile) {
-        BufferedReader reader = null;
         try {
-            reader = new BufferedReader(new FileReader(statsFile));
-            String line;
-            StringBuilder sb = new StringBuilder();
-            while ((line = reader.readLine()) != null) {
-                sb.append(line);
-            }
-            return StatsCounter.func_27177_a(sb.toString());
+            return StatsCounter.readStatsFromString(StringUtils.getFileContentAsString(statsFile));
         } catch (Exception e) {
             e.printStackTrace();
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
         }
         return null;
     }
@@ -107,18 +93,18 @@ public class StatsSyncher {
         tempStatsFile.renameTo(statsFile);
     }
 
-    public void func_27418_a() {
+    public void startRetrievalThread() {
         if (busy) {
             throw new IllegalStateException("Can't get stats from server while StatsSyncher is busy!");
         } else {
-            int1 = 100;
+            saveTimer = 100;
             busy = true;
             new Thread(() -> {
                 try {
-                    if (map1 != null) {
-                        saveStats(map1, statsFile, statsFileTemp, statsFileOld);
+                    if (queuedLocalStatsChanges != null) {
+                        saveStats(queuedLocalStatsChanges, statsFile, statsFileTemp, statsFileOld);
                     } else if (statsFile.exists()) {
-                        map1 = readStatsFromFile(statsFile, statsFileTemp, statsFileOld);
+                        queuedLocalStatsChanges = readStatsFromFile(statsFile, statsFileTemp, statsFileOld);
                     }
                 } catch (Exception exception) {
                     exception.printStackTrace();
@@ -129,15 +115,15 @@ public class StatsSyncher {
         }
     }
 
-    public void func_27424_a(Map<Stat, Integer> map) {
+    public void startSavingThread(Map<Stat, Integer> mapToSave) {
         if (busy) {
             throw new IllegalStateException("Can't save stats while StatsSyncher is busy!");
         } else {
-            int1 = 100;
+            saveTimer = 100;
             busy = true;
             new Thread(() -> {
                 try {
-                    saveStats(map, unsentStatsFile, unsentStatsFileTemp, unsentStatsFileOld);
+                    saveStats(mapToSave, unsentStatsFile, unsentStatsFileTemp, unsentStatsFileOld);
                 } catch (Exception exception) {
                     exception.printStackTrace();
                 } finally {
@@ -148,12 +134,12 @@ public class StatsSyncher {
         }
     }
 
-    public void syncStatsFileWithMap(Map<Stat, Integer> map) {
+    public void saveStatsToDisk(Map<Stat, Integer> map) {
         for (int i = 30; busy && --i > 0; ) {
             try {
                 Thread.sleep(100L);
-            } catch (InterruptedException interruptedexception) {
-                interruptedexception.printStackTrace();
+            } catch (InterruptedException interrupt) {
+                interrupt.printStackTrace();
             }
         }
 
@@ -167,24 +153,24 @@ public class StatsSyncher {
         }
     }
 
-    public boolean func_27420_b() {
-        return int1 <= 0 && !busy && map2 == null;
+    public boolean pendingSave() {
+        return saveTimer <= 0 && !busy && queuedSavedStatsChanges == null;
     }
 
-    public void func_27425_c() {
-        if (int1 > 0) {
-            int1--;
+    public void tick() {
+        if (saveTimer > 0) {
+            saveTimer--;
         }
-        if (int2 > 0) {
-            int2--;
+        if (fetchChangesTimer > 0) {
+            fetchChangesTimer--;
         }
-        if (map2 != null) {
-            statsCounter.func_27187_c(map2);
-            map2 = null;
+        if (queuedSavedStatsChanges != null) {
+            statsCounter.addToSaved(queuedSavedStatsChanges);
+            queuedSavedStatsChanges = null;
         }
-        if (map1 != null) {
-            statsCounter.func_27180_b(map1);
-            map1 = null;
+        if (queuedLocalStatsChanges != null) {
+            statsCounter.addToLocal(queuedLocalStatsChanges);
+            queuedLocalStatsChanges = null;
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/achievement/stat/TimeValueFormatter.java b/src/main/java/net/minecraft/core/achievement/stat/TimeValueFormatter.java
new file mode 100644
index 000000000..d6b8c0bb5
--- /dev/null
+++ b/src/main/java/net/minecraft/core/achievement/stat/TimeValueFormatter.java
@@ -0,0 +1,38 @@
+package net.minecraft.core.achievement.stat;
+
+// Referenced classes of package net.minecraft.src:
+//            StatValueFormatter, StatBase
+
+import net.minecraft.core.Global;
+
+final class TimeValueFormatter implements StatValueFormatter {
+    public static double UNIT_SECONDS_TO_MINUTES = 1d/60;
+    public static double UNIT_MINUTES_TO_HOURS = 1d/60;
+    public static double UNIT_HOURS_TO_DAYS = 1d/24;
+    public static double UNIT_DAYS_TO_YEARS = 1d/365.2425;
+
+
+    @Override
+	public String formatValue(int value)
+    {
+        double seconds = (double) value / Global.TICKS_PER_SECOND;
+        double minutes = seconds * UNIT_SECONDS_TO_MINUTES;
+        double hours = minutes * UNIT_MINUTES_TO_HOURS;
+        double days = hours * UNIT_HOURS_TO_DAYS;
+        double years = days * UNIT_DAYS_TO_YEARS;
+        if(years > 0.5D) {
+            return Stat.getDecimalFormat().format(years) + " y";
+        }
+        if(days > 0.5D) {
+            return Stat.getDecimalFormat().format(days) + " d";
+        }
+        if(hours > 0.5D) {
+            return Stat.getDecimalFormat().format(hours) + " h";
+        }
+        if(minutes > 0.5D) {
+            return Stat.getDecimalFormat().format(minutes) + " m";
+        } else {
+            return seconds + " s";
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockAlgae.java b/src/main/java/net/minecraft/core/block/AlgaeBlock.java
similarity index 79%
rename from src/main/java/net/minecraft/core/block/BlockAlgae.java
rename to src/main/java/net/minecraft/core/block/AlgaeBlock.java
index 0cddb5cf9..c4eb4b712 100644
--- a/src/main/java/net/minecraft/core/block/BlockAlgae.java
+++ b/src/main/java/net/minecraft/core/block/AlgaeBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.WorldSource;
@@ -13,22 +13,22 @@ import net.minecraft.core.util.phys.AABB;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, AxisAlignedBB,
-//            IBlockAccess, Item, EntityItem, ItemStack,
-//            StatList, EntityPlayer, EnumSkyBlock
+//            IBlockAccess, Item, ItemEntity, ItemStack,
+//            StatList, Player, EnumSkyBlock
 
-public class BlockAlgae extends Block
+public class AlgaeBlock extends Block
 {
 
-    protected BlockAlgae(String key, int id, Material material)
+    protected AlgaeBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setBlockBounds(0.0F, -0.125F, 0.0F, 1.0F, 0.00625f, 1.0F);
     }
 
     @Override
     public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
     {
-        if(entity instanceof EntityBoat) {
+        if(entity instanceof BoatEntity) {
             int data = world.getBlockMetadata(x, y, z);
             world.playSoundEffect(null, 2001, x, y, z, id);
             world.setBlockWithNotify(x, y, z, 0);
@@ -64,13 +64,13 @@ public class BlockAlgae extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockAxisAligned.java b/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockAxisAligned.java
rename to src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
index d62a736d8..d53abc802 100644
--- a/src/main/java/net/minecraft/core/block/BlockAxisAligned.java
+++ b/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
@@ -1,22 +1,21 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.helper.Sides;
 import net.minecraft.core.world.World;
 
-public class BlockAxisAligned extends Block {
+public class AxisAlignedBlock extends Block {
 
-	public BlockAxisAligned(String key, int id, Material material) {
-		super(key, id, material);
+	public AxisAlignedBlock(String key, String namespaceId, int id, Material material) {
+		super(key, namespaceId, id, material);
 	}
 
 	@Override
-	public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-		Axis axis = entity.getPlacementDirection(side, PlacementMode.SIDE).getAxis();
+	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+		Axis axis = mob.getPlacementDirection(side, PlacementMode.SIDE).getAxis();
 		
 		world.setBlockMetadataWithNotify(x, y, z, axisToMeta(axis));
 	}
diff --git a/src/main/java/net/minecraft/core/block/BlockLayerBase.java b/src/main/java/net/minecraft/core/block/BaseLayerBlock.java
similarity index 66%
rename from src/main/java/net/minecraft/core/block/BlockLayerBase.java
rename to src/main/java/net/minecraft/core/block/BaseLayerBlock.java
index 1cb3d1f4d..4a08a9568 100644
--- a/src/main/java/net/minecraft/core/block/BlockLayerBase.java
+++ b/src/main/java/net/minecraft/core/block/BaseLayerBlock.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.item.block.ItemBlockLayer;
+import net.minecraft.core.item.block.LayerBlockItem;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
@@ -9,25 +9,25 @@ import java.util.function.Supplier;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, AxisAlignedBB, 
-//            IBlockAccess, Item, EntityItem, ItemStack, 
-//            StatList, EntityPlayer, EnumSkyBlock
+//            IBlockAccess, Item, ItemEntity, ItemStack,
+//            StatList, Player, EnumSkyBlock
 
-public abstract class BlockLayerBase extends Block
+public abstract class BaseLayerBlock extends Block
 {
     private Supplier<Integer> idSupplier = null;
 	public int fullBlockID = -1;
 	
-	public BlockLayerBase(String key, int id, Material material)
+	public BaseLayerBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
-        setBlockItem(() -> new ItemBlockLayer(this));
+        setBlockItem(() -> new LayerBlockItem(this));
     }
     @Override
     public void initializeBlock() {
         fullBlockID = idSupplier.get();
     }
-    public BlockLayerBase setFullBlockID(Supplier<Integer> idSupplier)
+    public BaseLayerBlock setFullBlockID(Supplier<Integer> idSupplier)
     {
     	this.idSupplier = idSupplier;
     	return this;
@@ -37,7 +37,7 @@ public abstract class BlockLayerBase extends Block
     {
         int l = world.getBlockMetadata(x, y, z) & 7;
         float f = (float)(2 * (1 + l)) / 16F;
-        return AABB.getBoundingBoxFromPool((double) x + minX, (double) y + minY, (double) z + minZ, (double) x + maxX, (float) y + f, (double) z + maxZ);
+        return AABB.getTemporaryBB((double) x + minX, (double) y + minY, (double) z + minZ, (double) x + maxX, (float) y + f, (double) z + maxZ);
     }
 
     @Override
@@ -47,7 +47,7 @@ public abstract class BlockLayerBase extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java b/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
similarity index 86%
rename from src/main/java/net/minecraft/core/block/BlockLeavesBase.java
rename to src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
index 9d9f1df12..a01d7f5e9 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
+++ b/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlockLeaves;
+import net.minecraft.core.item.block.LeavesBlockItem;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -15,14 +15,18 @@ import java.util.Random;
 // Referenced classes of package net.minecraft.src:
 //            Block, IBlockAccess, Material
 
-public abstract class BlockLeavesBase extends Block
+public abstract class BaseLeavesBlock extends Block
 {
+    public static final int MASK_DECAY_DATA = 0b0000_1111;
+    public static final int NUM_DECAY_BITS = 4;
+    public static final int DECAY_FLAG_BIT = 3;
+    public static final int PERMANENT_FLAG_BIT = 0;
 
-	public BlockLeavesBase(String key, int id, Material material)
+	public BaseLeavesBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setTicking(true);
-        setBlockItem(() -> new ItemBlockLeaves(this));
+        setBlockItem(() -> new LeavesBlockItem(this));
     }
 
     @Override
@@ -32,7 +36,7 @@ public abstract class BlockLeavesBase extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
 
         Season season = world.getSeasonManager().getCurrentSeason();
@@ -41,7 +45,7 @@ public abstract class BlockLeavesBase extends Block
 
         int numDropped = 1;
 
-        if (world.rand.nextInt(MathHelper.floor_double(dropRate)) != 0) return null;
+        if (world.rand.nextInt(MathHelper.floor(dropRate)) != 0) return null;
         
         return new ItemStack[] { new ItemStack(getSapling(), numDropped) };
     }
@@ -66,7 +70,7 @@ public abstract class BlockLeavesBase extends Block
                     for(int dz = -radius; dz <= radius; dz++)
                     {
                         int blockId = world.getBlockId(x + dx, y + dy, z + dz);
-                        if(Block.blocksList[blockId] instanceof BlockLeavesBase)
+                        if(Block.blocksList[blockId] instanceof BaseLeavesBlock)
                         {
                             int meta = world.getBlockMetadata(x + dx, y + dy, z + dz);
                             if (!isPermanent(meta))
@@ -107,12 +111,12 @@ public abstract class BlockLeavesBase extends Block
                         for(int zOffset = -byte0; zOffset <= byte0; zOffset++)
                         {
                             int k3 = world.getBlockId(x + xOffset, y + yOffset, z + zOffset);
-                            if(Block.blocksList[k3] instanceof BlockLog)
+                            if(Block.blocksList[k3] instanceof LogBlock)
                             {
                                 adjacentTreeBlocks[(xOffset + halfLength) * xSpan + (yOffset + halfLength) * ySpan + (zOffset + halfLength)] = 0;
                                 continue;
                             }
-                            if(Block.blocksList[k3] instanceof BlockLeavesBase)
+                            if(Block.blocksList[k3] instanceof BaseLeavesBlock)
                             {
                                 adjacentTreeBlocks[(xOffset + halfLength) * xSpan + (yOffset + halfLength) * ySpan + (zOffset + halfLength)] = -2;
                             } else
@@ -187,27 +191,25 @@ public abstract class BlockLeavesBase extends Block
         world.setBlockWithNotify(i, j, k, 0);
     }
 
-    public static final int MASK_PERMANENT = 0b0000_0001;
     public static boolean isPermanent(int meta) {
-    	return (meta & MASK_PERMANENT) != 0;
+    	return (meta & (0b1 << PERMANENT_FLAG_BIT)) != 0;
     }
-    public static int setPermanent(int meta, boolean flag){
-        if (flag){
-            return meta | MASK_PERMANENT;
-        } else {
-            return meta & ~MASK_PERMANENT;
+    public static int setPermanent(int meta, boolean permanent) {
+        if(permanent) {
+            return meta | (0b1 << PERMANENT_FLAG_BIT);
+        }else {
+            return meta & ~(0b1 << PERMANENT_FLAG_BIT);
         }
     }
-    
     public static boolean isDecaying(int meta) {
-    	return (meta & 8) != 0;
+    	return (meta & (0b1 << DECAY_FLAG_BIT)) != 0;
     }
     
     public static int setDecaying(int meta, boolean decaying) {
     	if(decaying) {
-    		return meta | 8;
+    		return meta | (0b1 << DECAY_FLAG_BIT);
     	}else {
-    		return meta & ~8;
+    		return meta & ~(0b1 << DECAY_FLAG_BIT);
     	}
     }
     
diff --git a/src/main/java/net/minecraft/core/block/BlockBasket.java b/src/main/java/net/minecraft/core/block/BasketBlock.java
similarity index 52%
rename from src/main/java/net/minecraft/core/block/BlockBasket.java
rename to src/main/java/net/minecraft/core/block/BasketBlock.java
index 3ad1baa15..bcd5444d5 100644
--- a/src/main/java/net/minecraft/core/block/BlockBasket.java
+++ b/src/main/java/net/minecraft/core/block/BasketBlock.java
@@ -1,26 +1,26 @@
 package net.minecraft.core.block;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityBasket;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.BasketBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 
-public class BlockBasket extends BlockTileEntity
+public class BasketBlock extends EntityBlock
 {
-    protected BlockBasket(final String blockName, int id, final Material material)
+    protected BasketBlock(final String blockName, String namespaceId, int id, final Material material)
     {
-        super(blockName, id, material);
+        super(blockName, namespaceId, id, material);
     }
 
     @Override
-    public boolean onBlockRightClicked(final World world, final int x, final int y, final int z, final EntityPlayer entityplayer, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(final World world, final int x, final int y, final int z, final Player entityplayer, Side side, double xPlaced, double yPlaced)
     {
-        final TileEntityBasket te = (TileEntityBasket) world.getBlockTileEntity(x, y, z);
+        final BasketBlockEntity te = (BasketBlockEntity) world.getBlockEntity(x, y, z);
 
         if (te.getNumUnitsInside() > 0)
         {
@@ -33,19 +33,19 @@ public class BlockBasket extends BlockTileEntity
     }
 
     @Override
-    public boolean renderAsNormalBlock() {
+    public boolean isCubeShaped() {
         return false;
     }
 
     @Override
-    protected TileEntity getNewBlockEntity()
+    protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityBasket();
+        return new BasketBlockEntity();
     }
 
     public int getFillLevel(final WorldSource world, final int x, final int y, final int z)
     {
-        final TileEntityBasket te = (TileEntityBasket) world.getBlockTileEntity(x, y, z);
+        final BasketBlockEntity te = (BasketBlockEntity) world.getBlockEntity(x, y, z);
 
         final float fill = te.getNumUnitsInside() / (float)te.getMaxUnits();
 
@@ -61,7 +61,7 @@ public class BlockBasket extends BlockTileEntity
     @Override
     public void onBlockRemoved(final World world, final int x, final int y, final int z, int data)
     {
-        final TileEntityBasket te = (TileEntityBasket) world.getBlockTileEntity(x, y, z);
+        final BasketBlockEntity te = (BasketBlockEntity) world.getBlockEntity(x, y, z);
         world.removeBlockTileEntity(x, y, z);
         if (world.isClientSide) return;
         te.dropAllItems();
@@ -69,20 +69,20 @@ public class BlockBasket extends BlockTileEntity
 
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return true;
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
-        return isPoweringTo(world, x, y, z, side);
+        return getSignal(world, x, y, z, side);
     }
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
-        TileEntityBasket basketTileEntity = (TileEntityBasket) blockAccess.getBlockTileEntity(x, y, z);
+        BasketBlockEntity basketTileEntity = (BasketBlockEntity) blockAccess.getBlockEntity(x, y, z);
         if(basketTileEntity != null){
             return basketTileEntity.getNumUnitsInside() == basketTileEntity.getMaxUnits();
         }
@@ -90,8 +90,8 @@ public class BlockBasket extends BlockTileEntity
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Item.basket) };
+        return new ItemStack[] { new ItemStack(Items.BASKET) };
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/block/BlockBed.java b/src/main/java/net/minecraft/core/block/BedBlock.java
similarity index 51%
rename from src/main/java/net/minecraft/core/block/BlockBed.java
rename to src/main/java/net/minecraft/core/block/BedBlock.java
index cbe0c92b2..93c9b0e86 100644
--- a/src/main/java/net/minecraft/core/block/BlockBed.java
+++ b/src/main/java/net/minecraft/core/block/BedBlock.java
@@ -1,26 +1,26 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.enums.EnumSleepStatus;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 
-public class BlockBed extends Block {
+public class BedBlock extends Block {
 
-	public BlockBed(String key, int id) {
-		super(key, id, Material.wood);
+	public BedBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.wood);
 		setBounds();
 	}
 
 	@Override
-	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) {
 			return true;
 		}
@@ -28,9 +28,9 @@ public class BlockBed extends Block {
 		// Offset coords to foot end of bed, leave if bed is not complete
 		int meta = world.getBlockMetadata(x, y, z);
 		if(!isBlockFootOfBed(meta)) {
-			int dir = getDirectionFromMetadata(meta);
-			x += headBlockToFootBlockMap[dir][0];
-			z += headBlockToFootBlockMap[dir][1];
+			int dir = getDirection(meta);
+			x += headBlockToFootBlockMap[dir].getOffsetX();
+			z += headBlockToFootBlockMap[dir].getOffsetZ();
 			if(world.getBlockId(x, y, z) != id) {
 				return true;
 			}
@@ -39,27 +39,21 @@ public class BlockBed extends Block {
 
 		// Explode in invalid dimensions
 		if(!world.worldType.mayRespawn()) {
-			double d = (double) x + 0.5D;
-			double d1 = (double) y + 0.5D;
-			double d2 = (double) z + 0.5D;
-			world.setBlockWithNotify(x, y, z, 0);
-			int dir = getDirectionFromMetadata(meta);
-			x += headBlockToFootBlockMap[dir][0];
-			z += headBlockToFootBlockMap[dir][1];
+            world.setBlockWithNotify(x, y, z, 0);
+			int dir = getDirection(meta);
+			x += headBlockToFootBlockMap[dir].getOffsetX();
+			z += headBlockToFootBlockMap[dir].getOffsetZ();
 			if(world.getBlockId(x, y, z) == id) {
 				world.setBlockWithNotify(x, y, z, 0);
-				d = (d + (double) x + 0.5D) / 2D;
-				d1 = (d1 + (double) y + 0.5D) / 2D;
-				d2 = (d2 + (double) z + 0.5D) / 2D;
-			}
+            }
 			world.newExplosion(null, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, 5F, true, false);
 			return true;
 		}
 		
 		//Check if bed is occupied, and set occupied
 		if(isBedOccupied(meta)) {
-			EntityPlayer player1 = null;
-			for (EntityPlayer p : world.players) {
+			Player player1 = null;
+			for (Player p : world.players) {
 				if(p.isPlayerSleeping()) {
 					ChunkCoordinates pos = p.bedChunkCoordinates;
 					if(pos.x == x && pos.y == y && pos.z == z) {
@@ -85,7 +79,7 @@ public class BlockBed extends Block {
 	}
 
 	@Override
-	public boolean renderAsNormalBlock() {
+	public boolean isCubeShaped() {
 		return false;
 	}
 
@@ -101,13 +95,13 @@ public class BlockBed extends Block {
 
 	@Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
-		int i1 = world.getBlockMetadata(x, y, z);
-		int j1 = getDirectionFromMetadata(i1);
-		if(isBlockFootOfBed(i1)) {
-			if(world.getBlockId(x - headBlockToFootBlockMap[j1][0], y, z - headBlockToFootBlockMap[j1][1]) != id) {
+		int metadata = world.getBlockMetadata(x, y, z);
+		int direction = getDirection(metadata);
+		if(isBlockFootOfBed(metadata)) {
+			if(world.getBlockId(x - headBlockToFootBlockMap[direction].getOffsetX(), y, z - headBlockToFootBlockMap[direction].getOffsetZ()) != id) {
 				world.setBlockWithNotify(x, y, z, 0);
 			}
-		} else if(world.getBlockId(x + headBlockToFootBlockMap[j1][0], y, z + headBlockToFootBlockMap[j1][1]) != id) {
+		} else if(world.getBlockId(x + headBlockToFootBlockMap[direction].getOffsetX(), y, z + headBlockToFootBlockMap[direction].getOffsetZ()) != id) {
 			world.setBlockWithNotify(x, y, z, 0);
 		}
 	}
@@ -116,45 +110,59 @@ public class BlockBed extends Block {
 		setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5625F, 1.0F);
 	}
 
-	public static int getDirectionFromMetadata(int i) {
-		return i & 3;
+	@Override
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
+	{
+		return new ItemStack[] { new ItemStack(Items.BED) };
+	}
+
+	@Override
+	public int getPistonPushReaction() {
+		return 1;
+	}
+
+	public static final int MASK_IS_FOOT = 0b0000_1000;
+	public static final int MASK_IS_OCCUPIED = 0b0000_0100;
+	public static final int MASK_DIRECTION = 0b0000_0011;
+	public static boolean isBlockFootOfBed(int meta) {
+		return (meta & MASK_IS_FOOT) != 0;
 	}
 
-	public static boolean isBlockFootOfBed(int i) {
-		return (i & 8) != 0;
+	public static boolean isBedOccupied(int meta) {
+		return (meta & MASK_IS_OCCUPIED) != 0;
 	}
 
-	public static boolean isBedOccupied(int i) {
-		return (i & 4) != 0;
+	public static int getDirection(int meta) {
+		return meta & MASK_DIRECTION;
 	}
 
 	public static void setBedOccupied(World world, int i, int j, int k, boolean flag) {
 		int l = world.getBlockMetadata(i, j, k);
 		if(flag) {
-			l |= 4;
+			l |= MASK_IS_OCCUPIED;
 		} else {
-			l &= -5;
+			l &= ~MASK_IS_OCCUPIED;
 		}
 		world.setBlockMetadataWithNotify(i, j, k, l);
 	}
 
-	public static ChunkCoordinates getNearestEmptyChunkCoordinates(World world, int i, int j, int k, int l) {
-		int i1 = world.getBlockMetadata(i, j, k);
-		int j1 = getDirectionFromMetadata(i1);
+	public static ChunkCoordinates getNearestEmptyChunkCoordinates(World world, int x, int y, int z, int l) {
+		int meta = world.getBlockMetadata(x, y, z);
+		int direction = getDirection(meta);
 		for (int k1 = 0; k1 <= 1; k1++) {
-			int l1 = i - headBlockToFootBlockMap[j1][0] * k1 - 1;
-			int i2 = k - headBlockToFootBlockMap[j1][1] * k1 - 1;
+			int l1 = x - headBlockToFootBlockMap[direction].getOffsetX() * k1 - 1;
+			int i2 = z - headBlockToFootBlockMap[direction].getOffsetZ() * k1 - 1;
 			int j2 = l1 + 2;
 			int k2 = i2 + 2;
 			for (int l2 = l1; l2 <= j2; l2++) {
 				for (int i3 = i2; i3 <= k2; i3++) {
-					if(!world.isBlockNormalCube(l2, j - 1, i3) || !world.isAirBlock(l2, j, i3) || !world.isAirBlock(l2, j + 1, i3)) {
+					if(!world.isBlockNormalCube(l2, y - 1, i3) || !world.isAirBlock(l2, y, i3) || !world.isAirBlock(l2, y + 1, i3)) {
 						continue;
 					}
 					if(l > 0) {
 						l--;
 					} else {
-						return new ChunkCoordinates(l2, j, i3);
+						return new ChunkCoordinates(l2, y, i3);
 					}
 				}
 
@@ -165,17 +173,29 @@ public class BlockBed extends Block {
 		return null;
 	}
 
-	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
-	{
-		return new ItemStack[] { new ItemStack(Item.bed) };
-	}
-
-	@Override
-	public int getPistonPushReaction() {
-		return 1;
+	public static final int[] headOfBedMap = {
+		3, 4, 2, 5
+	};
+	public static final int[] footToHeadMap = {
+		2, 3, 0, 1
+	};
+	public static final int[][] bedDirection = {
+		{
+			1, 0, 3, 2, 5, 4
+		}, {
+			1, 0, 5, 4, 2, 3
+	}, {
+		1, 0, 2, 3, 4, 5
+	}, {
+		1, 0, 4, 5, 3, 2
 	}
-
-	public static final int[][] headBlockToFootBlockMap = { { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } };
-
+	};
+
+	public static final Side[] headBlockToFootBlockMap =
+		{
+			Side.SOUTH,
+			Side.WEST,
+			Side.NORTH,
+			Side.EAST
+		};
 }
diff --git a/src/main/java/net/minecraft/core/block/BedrockBlock.java b/src/main/java/net/minecraft/core/block/BedrockBlock.java
new file mode 100644
index 000000000..7136fa1e5
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BedrockBlock.java
@@ -0,0 +1,21 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.world.World;
+
+public class BedrockBlock
+	extends Block
+{
+	public BedrockBlock(String key, String namespaceId, int id, Material material)
+    {
+		super(key, namespaceId, id, material);
+	}
+
+	@Override
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
+    {
+        if (world.getBlockId(x, y - 1, z) == Blocks.GLOWSTONE.id) {
+            ((PortalBlock) Blocks.PORTAL_PARADISE).tryToCreatePortal(world, x, y, z);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BirchLeavesBlock.java b/src/main/java/net/minecraft/core/block/BirchLeavesBlock.java
new file mode 100644
index 000000000..a56d3b60b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/BirchLeavesBlock.java
@@ -0,0 +1,24 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+
+// Referenced classes of package net.minecraft.src:
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
+//            ItemStack, Item, ItemShears, StatList, 
+//            Entity
+
+public class BirchLeavesBlock extends BaseLeavesBlock
+{
+
+	public BirchLeavesBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.leaves);
+    }
+
+    @Override
+    protected Block getSapling()
+    {
+        return Blocks.SAPLING_BIRCH;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java b/src/main/java/net/minecraft/core/block/BlastFurnaceBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockBlastFurnace.java
rename to src/main/java/net/minecraft/core/block/BlastFurnaceBlock.java
index 405ede2c7..ab6f38d49 100644
--- a/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java
+++ b/src/main/java/net/minecraft/core/block/BlastFurnaceBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.Global;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityBlastFurnace;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.BlastFurnaceBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -13,20 +13,20 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockContainer, Material, Block, World,
-//            IBlockAccess, TileEntityFurnace, EntityPlayer, TileEntity,
-//            EntityLiving, MathHelper, IInventory, ItemStack,
-//            EntityItem
+//            IBlockAccess, FurnaceBlockEntity, Player, BlockEntity,
+//            Mob, MathHelper, IInventory, ItemStack,
+//            ItemEntity
 
-public class BlockBlastFurnace extends BlockFurnace
+public class BlastFurnaceBlock extends FurnaceBlock
 {
 
-	public BlockBlastFurnace(String key, int id, boolean flag)
+	public BlastFurnaceBlock(String key, String namespaceId, int id, boolean flag)
     {
-        super(key, id, flag);
+        super(key, namespaceId, id, flag);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -34,28 +34,24 @@ public class BlockBlastFurnace extends BlockFurnace
             case EXPLOSION:
             case PROPER_TOOL:
             case SILK_TOUCH:
-                return new ItemStack[] { new ItemStack(Block.furnaceBlastIdle) };
+                return new ItemStack[] { new ItemStack(Blocks.FURNACE_BLAST_IDLE) };
             default:
                 return null;
         }
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
-        if(world.isClientSide)
-        {
-            return true;
-        } else
-        {
-            TileEntityBlastFurnace tileentityblastfurnace = (TileEntityBlastFurnace)world.getBlockTileEntity(x, y, z);
+        if (!world.isClientSide) {
+            BlastFurnaceBlockEntity tileentityblastfurnace = (BlastFurnaceBlockEntity) world.getBlockEntity(x, y, z);
             player.displayGUIFurnace(tileentityblastfurnace);
-            return true;
         }
+        return true;
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(!isActive)
         {
@@ -91,7 +87,7 @@ public class BlockBlastFurnace extends BlockFurnace
 
 	public static void updateFurnaceBlockState(boolean lit, World world, int x, int y, int z) {
 		int meta = world.getBlockMetadata(x, y, z);
-		TileEntity tileentity = world.getBlockTileEntity(x, y, z);
+		BlockEntity tileentity = world.getBlockEntity(x, y, z);
 		if(tileentity == null) {
 			String msg = "Blast Furnace is missing Tile Entity at x: "+x+" y: "+y+" z: "+z+", block will be removed!";
 			if(Global.BUILD_CHANNEL.isUnstableBuild()) {
@@ -103,9 +99,9 @@ public class BlockBlastFurnace extends BlockFurnace
 		}
 		keepFurnaceInventory = true;
 		if(lit) {
-			world.setBlockWithNotify(x, y, z, Block.furnaceBlastActive.id);
+			world.setBlockWithNotify(x, y, z, Blocks.FURNACE_BLAST_ACTIVE.id);
 		} else {
-			world.setBlockWithNotify(x, y, z, Block.furnaceBlastIdle.id);
+			world.setBlockWithNotify(x, y, z, Blocks.FURNACE_BLAST_IDLE.id);
 		}
 		keepFurnaceInventory = false;
 		world.setBlockMetadataWithNotify(x, y, z, meta);
@@ -114,9 +110,9 @@ public class BlockBlastFurnace extends BlockFurnace
 	}
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityBlastFurnace();
+        return new BlastFurnaceBlockEntity();
     }
 
 }
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index a6752ddbc..c39cf79a9 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -2,45 +2,41 @@ package net.minecraft.core.block;
 
 
 import com.b100.utils.Utils;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.block.BlockItem;
+import net.minecraft.core.sound.BlockSound;
+import net.minecraft.core.sound.BlockSounds;
+import net.minecraft.core.util.HardIllegalArgumentException;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.block.piston.BlockPistonBase;
-import net.minecraft.core.block.piston.BlockPistonHead;
-import net.minecraft.core.block.piston.BlockPistonMoving;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.tag.ITaggable;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IItemConvertible;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.ItemToolShears;
-import net.minecraft.core.item.block.ItemBlock;
-import net.minecraft.core.item.block.ItemBlockAlgae;
-import net.minecraft.core.item.block.ItemBlockLadder;
-import net.minecraft.core.item.block.ItemBlockLamp;
-import net.minecraft.core.item.block.ItemBlockLayerLeaves;
-import net.minecraft.core.item.block.ItemBlockPainted;
-import net.minecraft.core.item.block.ItemBlockSlabPainted;
-import net.minecraft.core.item.block.ItemBlockStairsPainted;
+import net.minecraft.core.item.ToolShearsItem;
+import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.BoundingVolume;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Random;
 import java.util.function.Function;
@@ -49,30 +45,76 @@ import java.util.function.Supplier;
 public class Block
     implements ITaggable<Block>, IItemConvertible
 {
-	public Block(String key, int id, Material material)
+    public static final @Nullable Block @NotNull [] blocksList = new Block[16384];
+    public static final Map<NamespaceID, Block> blockMap = new LinkedHashMap<>();
+    public static final boolean[] shouldTick = new boolean[blocksList.length];
+    public static final boolean[] solid = new boolean[blocksList.length];
+    public static final boolean[] isEntityTile = new boolean[blocksList.length];
+    public static final int[] lightBlock = new int[blocksList.length];
+    public static final boolean[] translucent = new boolean[blocksList.length];
+    public static final int[] lightEmission = new int[blocksList.length];
+    public static final boolean[] neighborNotifyOnMetadataChangeDisabled = new boolean[blocksList.length];
+    public static final Map<String, Integer> keyToIdMap = new HashMap<>();
+    public static int highestBlockId = 0;
+
+    public final int id;
+    public final NamespaceID namespaceID;
+    protected float blockHardness;
+    protected float blastResistance;
+    protected boolean blockConstructorCalled;
+    protected boolean enableStats;
+    protected boolean isLitInteriorSurface;
+    public double minX;
+    public double minY;
+    public double minZ;
+    public double maxX;
+    public double maxY;
+    public double maxZ;
+    public float blockParticleGravity;
+    public final Material blockMaterial;
+    public float friction;
+    protected String key;
+    public int dropOverride = -1;
+    public boolean immovable = false;
+    public MaterialColor overrideColor;
+    private BlockSound blockSound = BlockSounds.DEFAULT;
+
+    @Nullable
+    Supplier<@NotNull IItemConvertible> statParent = null;
+
+
+	public Block(String translationKey, String namespaceId, int id, Material material)
     {
         blockConstructorCalled = true;
         enableStats = true;
         blockParticleGravity = 1.0F;
-        movementScale = 0.6F;
+        friction = 0.6F;
         immovable = false;
         this.id = id;
-        if(blocksList[id] != null)
-        {
-            throw new IllegalArgumentException("Slot " + id + " is already occupied by " + blocksList[id] + " when adding " + this);
+        try {
+            this.namespaceID = new NamespaceID(namespaceId);
+        } catch (HardIllegalArgumentException e){
+            throw new IllegalArgumentException(e);
         }
-        else
-        {
-            blockMaterial = material;
-            blocksList[id] = this;
-            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
-            solid[id] = isSolidRender();
-            lightBlock[id] = (isSolidRender() || blocksLight()) ? 255 : 0;
-            translucent[id] = !material.blocksLight();
-            isEntityTile[id] = false;
-            setKey(key);
-            if (highestBlockId < id) highestBlockId = id;
+
+        if(blocksList[id] != null) {
+            throw new IllegalArgumentException("Block slot '" + id + "' is already occupied by '" + blocksList[id] + "' when adding " + this);
+        }
+        if (blockMap.containsKey(this.namespaceID)){
+            throw new IllegalArgumentException("Block id '" + namespaceID + "' is already used by '" + blockMap.get(this.namespaceID) + "' when adding " + this);
         }
+
+        blockMaterial = material;
+        blocksList[id] = this;
+        blockMap.put(this.namespaceID, this);
+        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+        solid[id] = isSolidRender();
+        lightBlock[id] = (isSolidRender() || blocksLight()) ? 255 : 0;
+        translucent[id] = !material.blocksLight();
+        isEntityTile[id] = false;
+        setKey(translationKey);
+
+        if (highestBlockId < id) highestBlockId = id;
     }
 
 	public Block withDisabledNeighborNotifyOnMetadataChange()
@@ -90,12 +132,12 @@ public class Block
         lightBlock[id] = blockAmount;
         return this;
     }
-
     public Block withLightEmission(float lightEmission)
     {
         Block.lightEmission[id] = (int)(15F * lightEmission);
         return this;
     }
+
     public Block withLightEmission(int lightEmission)
     {
         Block.lightEmission[id] = lightEmission & 0x0F;
@@ -114,14 +156,25 @@ public class Block
         return this;
     }
 
-    public boolean renderAsNormalBlock()
+    public Block withSound(BlockSound sound)
+    {
+        this.blockSound = sound;
+        return this;
+    }
+
+    public BlockSound getSound()
+    {
+        return blockSound;
+    }
+
+    public boolean isCubeShaped()
     {
         return true;
     }
 
     public boolean canPlaceOnSurface()
     {
-        return this.renderAsNormalBlock();
+        return this.isCubeShaped();
     }
 
     public boolean canPlaceOnSurfaceOnCondition(World world, int x, int y, int z)
@@ -131,7 +184,7 @@ public class Block
 
     public boolean renderAsNormalBlockOnCondition(World world, int x, int y, int z)
     {
-        return renderAsNormalBlock();
+        return isCubeShaped();
     }
 
     public boolean canPlaceOnSurfaceOfBlock(World world, int x, int y, int z)
@@ -148,7 +201,7 @@ public class Block
         }
         return this;
     }
-    
+
     public Block setDropOverride(int dropId)
     {
     	dropOverride = dropId;
@@ -160,7 +213,6 @@ public class Block
         isLitInteriorSurface = isLit;
         return this;
     }
-
     public Block withSetUnbreakable()
     {
         withHardness(-1F);
@@ -170,17 +222,27 @@ public class Block
         this.blockItemSupplier = itemSupplier;
         return this;
     }
+
     public Block setBlockItem(@NotNull Function<Block, Item> itemSupplier){
         this.blockItemSupplier = () -> itemSupplier.apply(this);
         return this;
     }
+    public Block withOverrideColor(MaterialColor color){
+        this.overrideColor = color;
+        return this;
+    }
+
+    public Block setStatParent(@NotNull Supplier<@NotNull IItemConvertible> icon){
+        this.statParent = icon;
+        return this;
+    }
 
     public float getHardness()
     {
         return blockHardness;
     }
 
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause != EnumDropCause.IMPROPER_TOOL)
         {
@@ -212,9 +274,9 @@ public class Block
 	public int getLightmapCoord(WorldSource blockAccess, int x, int y, int z) {
 		return blockAccess.getLightmapCoord(x, y, z, lightEmission[id]);
 	}
-	
+
 	/**
-	 * Used when fullbright or lightmap is active 
+	 * Used when fullbright or lightmap is active
 	 */
 	public float getAmbientOcclusionStrength(WorldSource blockAccess, int x, int y, int z) {
 		return isSolidRender() ? 1.0f : 0.0f;
@@ -265,7 +327,7 @@ public class Block
 
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-        return AABB.getBoundingBoxFromPool((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
+        return AABB.getTemporaryBB((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
     }
 
     public BoundingVolume getBoundingVolume(World world, int x, int y, int z)
@@ -276,12 +338,12 @@ public class Block
     public void getCollidingBoundingBoxes(World world, int x, int y, int z, AABB aabb, ArrayList<AABB> aabbList)
     {
         AABB aabbFromPool = getCollisionBoundingBoxFromPool(world, x, y, z);
-        if(aabbFromPool != null && aabb.intersectsWith(aabbFromPool))
+        if(aabbFromPool != null && aabb.intersects(aabbFromPool))
         {
             aabbList.add(aabbFromPool);
         }
     }
-    
+
     public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z)
     {
         return true;
@@ -289,7 +351,11 @@ public class Block
 
     public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-        return AABB.getBoundingBoxFromPool((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
+        return AABB.getTemporaryBB((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
+    }
+    public MaterialColor getMaterialColor(){
+        if (overrideColor != null) return overrideColor;
+        return blockMaterial.color;
     }
 
     public boolean isSolidRender()
@@ -316,7 +382,7 @@ public class Block
     {
     }
 
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+    public void animationTick(World world, int x, int y, int z, Random rand)
     {
     }
 
@@ -324,31 +390,28 @@ public class Block
     {
     }
 
-    public int tickRate()
+    public int tickDelay()
     {
         return 10;
     }
 
-    public void onBlockAdded(World world, int x, int y, int z)
+    public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
     }
 
-    public void onBlockAdded(EntityPlayer player, World world, int x, int y, int z)
-    {
-    }
 
     /**
-     * Always called when a block is removed by setBlock 
+     * Always called when a block is removed by setBlock
      */
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
     }
-    
+
     /**
      * Called when a block has been broken by a player, after {@link Block#onBlockRemoved(World, int, int, int, int)}
      */
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
-    	
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, Player player, Item item) {
+
     }
 
     public boolean renderFullbright()
@@ -356,7 +419,7 @@ public class Block
         return false;
     }
 
-    public float blockStrength(EntityPlayer player)
+    public float blockStrength(Player player)
     {
         if(blockHardness < 0.0F)
         {
@@ -381,78 +444,78 @@ public class Block
         return blastResistance / 5F;
     }
 
-    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3d start, Vec3d end)
+    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end)
     {
         setBlockBoundsBasedOnState(world, x, y, z);
-        start = start.addVector(-x, -y, -z);
-        end = end.addVector(-x, -y, -z);
-		Vec3d vec3d2 = start.getIntermediateWithXValue(end, minX);
-		Vec3d vec3d3 = start.getIntermediateWithXValue(end, maxX);
-		Vec3d vec3d4 = start.getIntermediateWithYValue(end, minY);
-		Vec3d vec3d5 = start.getIntermediateWithYValue(end, maxY);
-		Vec3d vec3d6 = start.getIntermediateWithZValue(end, minZ);
-		Vec3d vec3d7 = start.getIntermediateWithZValue(end, maxZ);
-
-		if(!isVecInsideYZBounds(vec3d2)) vec3d2 = null;
+        start = start.add(-x, -y, -z);
+        end = end.add(-x, -y, -z);
+		Vec3 vec32 = start.clipX(end, minX);
+		Vec3 vec3d3 = start.clipX(end, maxX);
+		Vec3 vec34 = start.clipY(end, minY);
+		Vec3 vec35 = start.clipY(end, maxY);
+		Vec3 vec36 = start.clipZ(end, minZ);
+		Vec3 vec37 = start.clipZ(end, maxZ);
+
+		if(!isVecInsideYZBounds(vec32)) vec32 = null;
 		if(!isVecInsideYZBounds(vec3d3)) vec3d3 = null;
-		if(!isVecInsideXZBounds(vec3d4)) vec3d4 = null;
-		if(!isVecInsideXZBounds(vec3d5)) vec3d5 = null;
-		if(!isVecInsideXYBounds(vec3d6)) vec3d6 = null;
-		if(!isVecInsideXYBounds(vec3d7)) vec3d7 = null;
-
-		Vec3d vec3d8 = null;
-		if(vec3d2 != null && (vec3d8 == null || start.squareDistanceTo(vec3d2) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d2;
-		if(vec3d3 != null && (vec3d8 == null || start.squareDistanceTo(vec3d3) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d3;
-		if(vec3d4 != null && (vec3d8 == null || start.squareDistanceTo(vec3d4) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d4;
-		if(vec3d5 != null && (vec3d8 == null || start.squareDistanceTo(vec3d5) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d5;
-		if(vec3d6 != null && (vec3d8 == null || start.squareDistanceTo(vec3d6) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d6;
-		if(vec3d7 != null && (vec3d8 == null || start.squareDistanceTo(vec3d7) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d7;
-
-		if(vec3d8 == null) return null;
+		if(!isVecInsideXZBounds(vec34)) vec34 = null;
+		if(!isVecInsideXZBounds(vec35)) vec35 = null;
+		if(!isVecInsideXYBounds(vec36)) vec36 = null;
+		if(!isVecInsideXYBounds(vec37)) vec37 = null;
+
+		Vec3 vec38 = null;
+		if(vec32 != null && (vec38 == null || start.distanceToSquared(vec32) < start.distanceToSquared(vec38))) vec38 = vec32;
+		if(vec3d3 != null && (vec38 == null || start.distanceToSquared(vec3d3) < start.distanceToSquared(vec38))) vec38 = vec3d3;
+		if(vec34 != null && (vec38 == null || start.distanceToSquared(vec34) < start.distanceToSquared(vec38))) vec38 = vec34;
+		if(vec35 != null && (vec38 == null || start.distanceToSquared(vec35) < start.distanceToSquared(vec38))) vec38 = vec35;
+		if(vec36 != null && (vec38 == null || start.distanceToSquared(vec36) < start.distanceToSquared(vec38))) vec38 = vec36;
+		if(vec37 != null && (vec38 == null || start.distanceToSquared(vec37) < start.distanceToSquared(vec38))) vec38 = vec37;
+
+		if(vec38 == null) return null;
 		Side side = Side.NONE;
-		if(vec3d8 == vec3d2) side = Side.WEST;
-		if(vec3d8 == vec3d3) side = Side.EAST;
-		if(vec3d8 == vec3d4) side = Side.BOTTOM;
-		if(vec3d8 == vec3d5) side = Side.TOP;
-		if(vec3d8 == vec3d6) side = Side.NORTH;
-		if(vec3d8 == vec3d7) side = Side.SOUTH;
+		if(vec38 == vec32) side = Side.WEST;
+		if(vec38 == vec3d3) side = Side.EAST;
+		if(vec38 == vec34) side = Side.BOTTOM;
+		if(vec38 == vec35) side = Side.TOP;
+		if(vec38 == vec36) side = Side.NORTH;
+		if(vec38 == vec37) side = Side.SOUTH;
 
-        return new HitResult(x, y, z, side, vec3d8.addVector(x, y, z));
+        return new HitResult(x, y, z, side, vec38.add(x, y, z));
     }
 
-    private boolean isVecInsideYZBounds(Vec3d vec3d)
+    private boolean isVecInsideYZBounds(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         }
         else
         {
-            return vec3d.yCoord >= minY && vec3d.yCoord <= maxY && vec3d.zCoord >= minZ && vec3d.zCoord <= maxZ;
+            return vec3.y >= minY && vec3.y <= maxY && vec3.z >= minZ && vec3.z <= maxZ;
         }
     }
 
-    private boolean isVecInsideXZBounds(Vec3d vec3d)
+    private boolean isVecInsideXZBounds(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         }
         else
         {
-            return vec3d.xCoord >= minX && vec3d.xCoord <= maxX && vec3d.zCoord >= minZ && vec3d.zCoord <= maxZ;
+            return vec3.x >= minX && vec3.x <= maxX && vec3.z >= minZ && vec3.z <= maxZ;
         }
     }
 
-    private boolean isVecInsideXYBounds(Vec3d vec3d)
+    private boolean isVecInsideXYBounds(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         }
         else
         {
-            return vec3d.xCoord >= minX && vec3d.xCoord <= maxX && vec3d.yCoord >= minY && vec3d.yCoord <= maxY;
+            return vec3.x >= minX && vec3.x <= maxX && vec3.y >= minY && vec3.y <= maxY;
         }
     }
 
@@ -460,12 +523,12 @@ public class Block
     {
     }
 
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
         return 0;
     }
 
-    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side)
     {
         return canPlaceBlockAt(world, x, y, z);
     }
@@ -475,7 +538,7 @@ public class Block
     	return world.canPlaceInsideBlock(x, y, z);
     }
 
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         return false;
     }
@@ -484,27 +547,27 @@ public class Block
     {
     }
 
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
     }
 
-    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3d entityVelocity)
+    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3 entityVelocity)
     {
     }
-
     public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
     {
     }
+
     public void setBlockBoundsBasedOnSide(WorldSource world, int x, int y, int z, Side side)
     {
     }
 
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
         return false;
     }
 
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return false;
     }
@@ -513,20 +576,15 @@ public class Block
     {
     }
 
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
         return false;
     }
 
-    //Stub
-    public void setBlockBoundsForItemRender()
+    public void harvestBlock(World world, Player entityplayer, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-    }
+		entityplayer.addStat(getStat(StatList.STAT_MINED), 1);
 
-	public void harvestBlock(World world, EntityPlayer entityplayer, int x, int y, int z, int meta, TileEntity tileEntity)
-    {
-		entityplayer.addStat(StatList.mineBlockStatArray[id], 1);
-		
 		ItemStack heldItemStack = entityplayer.inventory.getCurrentItem();
 		Item heldItem = heldItemStack != null ? Item.itemsList[heldItemStack.itemID] : null;
 
@@ -534,13 +592,13 @@ public class Block
         {
             if (heldItem.isSilkTouch() && entityplayer.canHarvestBlock(this))
             {
-                dropBlockWithCause(world, EnumDropCause.SILK_TOUCH, x, y, z, meta, tileEntity);
+                dropBlockWithCause(world, EnumDropCause.SILK_TOUCH, x, y, z, meta, blockEntity);
                 return;
             }
-            else if (heldItem instanceof ItemToolShears && (this.hasTag(BlockTags.SHEARS_DO_SILK_TOUCH) || this.hasTag(BlockTags.MINEABLE_BY_SHEARS)))
+            else if (heldItem instanceof ToolShearsItem && (this.hasTag(BlockTags.SHEARS_DO_SILK_TOUCH) || this.hasTag(BlockTags.MINEABLE_BY_SHEARS)))
             {
-                ItemToolShears heldShears = (ItemToolShears) heldItem;
-                dropBlockWithCause(world, EnumDropCause.SILK_TOUCH, x, y, z, meta, tileEntity);
+                ToolShearsItem heldShears = (ToolShearsItem) heldItem;
+                dropBlockWithCause(world, EnumDropCause.SILK_TOUCH, x, y, z, meta, blockEntity);
                 heldShears.onBlockSheared(entityplayer, heldItemStack);
                 return;
             }
@@ -548,19 +606,24 @@ public class Block
 
         if (entityplayer.canHarvestBlock(this))
         {
-            dropBlockWithCause(world, EnumDropCause.PROPER_TOOL, x, y, z, meta, tileEntity);
+            dropBlockWithCause(world, EnumDropCause.PROPER_TOOL, x, y, z, meta, blockEntity);
         }
         else
         {
-            dropBlockWithCause(world, EnumDropCause.IMPROPER_TOOL, x, y, z, meta, tileEntity);
+            dropBlockWithCause(world, EnumDropCause.IMPROPER_TOOL, x, y, z, meta, blockEntity);
         }
 	}
 
-    public void dropBlockWithCause(World world, EnumDropCause cause, int x, int y, int z, int meta, TileEntity tileEntity)
+    @Nullable
+    public Stat getStat(String statID) {
+        return asItem().getStat(statID);
+    }
+
+    public void dropBlockWithCause(World world, EnumDropCause cause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (world.isClientSide) return;
 
-        ItemStack[] drops = getBreakResult(world, cause, x, y, z, meta, tileEntity);
+        ItemStack[] drops = getBreakResult(world, cause, x, y, z, meta, blockEntity);
         if (dropOverride > 0){
             drops = new ItemStack[]{Item.itemsList[dropOverride].getDefaultStack()};
         }
@@ -570,7 +633,7 @@ public class Block
             {
                 if (drop != null)
                 {
-                	if(EntityItem.enableItemClumping)
+                	if(ItemEntity.enableItemClumping)
                 	{
                 		world.dropItem(x, y, z, drop.copy());
                 	}
@@ -581,7 +644,7 @@ public class Block
                         	ItemStack drop1 = drop.copy();
                         	drop1.stackSize = 1;
                             world.dropItem(x, y, z, drop1);
-                        }	
+                        }
                 	}
                 }
             }
@@ -592,11 +655,11 @@ public class Block
     {
         return true;
     }
-    
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	
+
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+
     }
-    
+
     public void setKey(String key)
     {
         this.key = "tile." + key;
@@ -620,7 +683,7 @@ public class Block
 
     public boolean getEnableStats()
     {
-        return enableStats;
+        return enableStats && getHardness() >= 0F;
     }
 
     public Block withDisabledStats()
@@ -681,16 +744,17 @@ public class Block
         if (block == null) return false;
         return block.hasTag(tag);
     }
-    
+
     public boolean isClimbable(World world, int x, int y, int z) {
     	return false;
     }
-    
+
+    @Nullable
     public static Block getBlock(int id)
     {
     	return blocksList[Math.max(id, 0)];
     }
-    
+
     public static Block getBlockByName(String name)
     {
     	Utils.requireNonNull(name);
@@ -710,752 +774,8 @@ public class Block
         }
     	return null;
     }
-    
-    public static final Block[] blocksList = new Block[16384];
-    public static final boolean[] shouldTick = new boolean[blocksList.length];
-    public static final boolean[] solid = new boolean[blocksList.length];
-    public static final boolean[] isEntityTile = new boolean[blocksList.length];
-    public static final int[] lightBlock = new int[blocksList.length];
-    public static final boolean[] translucent = new boolean[blocksList.length];
-    public static final int[] lightEmission = new int[blocksList.length];
-    public static final boolean[] neighborNotifyOnMetadataChangeDisabled = new boolean[blocksList.length];
-    public static final Map<String, Integer> keyToIdMap = new HashMap<>();
-    public static int highestBlockId = 0;
-
-    public static final Block stone = new BlockStone("stone", 1, () -> Block.cobbleStone).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block basalt = new BlockStone("basalt", 2, () -> Block.cobbleBasalt).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block limestone = new BlockStone("limestone", 3, () -> Block.cobbleLimestone).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block granite = new BlockStone("granite", 4, () -> Block.cobbleGranite).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block marble = new Block("marble", 5, Material.stone).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slate = new Block("slate", 6, Material.stone).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block permafrost = new BlockStone("permafrost", 7, () -> Block.cobblePermafrost).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block cobbleStone = new Block("cobble.stone", 10, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block cobbleStoneMossy = new Block("cobble.stone.mossy", 11, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block cobbleBasalt = new Block("cobble.basalt", 12, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block cobbleLimestone = new Block("cobble.limestone", 13, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block cobbleGranite = new Block("cobble.granite", 14, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block cobblePermafrost = new Block("cobble.permafrost", 15, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block stonePolished = new Block("stone.polished", 860, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block granitePolished = new Block("granite.polished", 861, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block limestonePolished = new Block("limestone.polished", 862, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block basaltPolished = new Block("basalt.polished", 863, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slatePolished = new Block("slate.polished", 864, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block permafrostPolished = new Block("permafrost.polished", 865, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block pillarMarble = new BlockAxisAligned("pillar.marble", 20, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block capstoneMarble = new Block("capstone.marble", 21, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block sandstone = new Block("sandstone", 30, Material.stone).withHardness(0.8F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block stoneCarved = new Block("stone.carved", 40, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block graniteCarved = new Block("granite.carved", 41, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block limestoneCarved = new Block("limestone.carved", 42, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block basaltCarved = new Block("basalt.carved", 43, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block permafrostCarved = new Block("permafrost.carved", 44, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block planksOak = new Block("planks.oak", 50, Material.wood).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block planksOakPainted = new BlockPlanksPainted("planks.oak.painted", 51).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockPainted(b, false))
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block torchCoal = new BlockTorch("torch.coal", 60).withHardness(0.0F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS);
-//    public static final Block candleSoulwax = new BlockCandle("candle.soulwax", 61, Material.circuits).withTexCoords(5, 7).withHardness(0.0F).withLightValue(13)
-//    .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block ladderOak = new BlockLadder("ladder.oak", 70).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockLadder((BlockLadder) b))
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block fencePlanksOak = new BlockFence("fence.planks.oak", 80).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
-    public static final Block fencePlanksOakPainted = new BlockFencePainted("fence.planks.oak.painted", 81).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockPainted(b, false))
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
-
-    public static final Block fencegatePlanksOak = new BlockFenceGate("fencegate.planks.oak", 90).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block fencegatePlanksOakPainted = new BlockFenceGatePainted("fencegate.planks.oak.painted", 91).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockPainted(b, true))
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block bookshelfPlanksOak = new Block("bookshelf.planks.oak", 100, Material.wood).withHardness(1.5F)
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block wool = new BlockWool("wool", 110).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockPainted(b, false))
-            .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, BlockTags.CAN_HANG_OFF);
-
-    public static final Block brickClay = new Block("brick.clay", 120, Material.stone).withHardness(3.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickStonePolished = new Block("brick.stone.polished", 121, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickStonePolishedMossy = new Block("brick.stone.polished.mossy", 122, Material.stone).withHardness(2F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickSandstone = new Block("brick.sandstone", 123, Material.stone).withHardness(0.8F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickGold = new Block("brick.gold", 124, Material.metal).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickLapis = new Block("brick.lapis", 125, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickBasalt = new Block("brick.basalt", 126, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickLimestone = new Block("brick.limestone", 127, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickGranite = new Block("brick.granite", 128, Material.stone).withHardness(2.0F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickMarble = new Block("brick.marble", 129, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickSlate = new Block("brick.slate", 130, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickStone = new Block("brick.stone", 131, Material.stone).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickPermafrost = new Block("brick.permafrost", 132, Material.stone).withHardness(1.0F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block brickIron = new Block("brick.iron", 133, Material.metal).withHardness(5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block slabPlanksOak = new BlockSlab(planksOak, 140).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block slabCobbleStone = new BlockSlab(cobbleStone, 141).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabSandstone = new BlockSlab(sandstone, 142).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickStonePolished = new BlockSlab(brickStonePolished, 143).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabStonePolished = new BlockSlab(stoneCarved, 144).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickMarble = new BlockSlab(brickMarble, 145).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickClay = new BlockSlab(brickClay, 146).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabCapstoneMarble = new BlockSlab(capstoneMarble, 147).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabCobbleBasalt = new BlockSlab(cobbleBasalt, 148).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabCobbleLimestone = new BlockSlab(cobbleLimestone, 149).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabCobbleGranite = new BlockSlab(cobbleGranite, 150).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickBasalt = new BlockSlab(brickBasalt, 151).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickLimestone = new BlockSlab(brickLimestone, 152).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickGranite = new BlockSlab(brickGranite, 153).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabPlanksOakPainted = new BlockSlabPainted(planksOakPainted, 154).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .setBlockItem(ItemBlockSlabPainted::new)
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block slabBrickSlate = new BlockSlab(brickSlate, 155).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickStone = new BlockSlab(brickStone, 156).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabGranitePolished = new BlockSlab(graniteCarved, 157).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabLimestonePolished = new BlockSlab(limestoneCarved, 158).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBasaltPolished = new BlockSlab(basaltCarved, 159).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block stairsPlanksOak = new BlockStairs(planksOak, 160).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block stairsCobbleStone = new BlockStairs(cobbleStone, 161).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickStonePolished = new BlockStairs(brickStonePolished, 162).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickMarble = new BlockStairs(brickMarble, 163).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsCobbleBasalt = new BlockStairs(cobbleBasalt, 164).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsCobbleLimestone = new BlockStairs(cobbleLimestone, 165).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsCobbleGranite = new BlockStairs(cobbleGranite, 166).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickBasalt = new BlockStairs(brickBasalt, 167).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickLimestone = new BlockStairs(brickLimestone, 168).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickGranite = new BlockStairs(brickGranite, 169).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickClay = new BlockStairs(brickClay, 170).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsPlanksOakPainted = new BlockStairs(planksOakPainted, 171).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .setBlockItem(ItemBlockStairsPainted::new)
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block stairsBrickSlate = new BlockStairs(brickSlate, 172).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickStone = new BlockStairs(brickStone, 173).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsSandstone = new BlockStairs(sandstone, 174).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickSandstone = new BlockStairs(brickSandstone, 175).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsCobblePermafrost = new BlockStairs(cobblePermafrost, 176).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block stairsBrickPermafrost = new BlockStairs(Block.brickPermafrost, 177).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block obsidian = new Block("obsidian", 180, Material.stone).withHardness(10F).withBlastResistance(2000F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block glass = new BlockGlass("glass", 190, Material.glass).withHardness(0.3F).withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.EXTENDS_MOTION_SENSOR_RANGE);
-    public static final Block glassTinted = new BlockGlassTinted("glass.tinted", 191).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange().withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block grass = new BlockGrass("grass", 200, Material.grass).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.CAVE_GEN_REPLACES_SURFACE);
-    public static final Block grassRetro = new BlockGrass("grass.retro", 201, Material.grass).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.CAVE_GEN_REPLACES_SURFACE);
-    public static final Block grassScorched = new BlockGrassScorched("grass.scorched", 202, Material.grass).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_CACTI, BlockTags.CAVE_GEN_REPLACES_SURFACE);
-
-    public static final Block pathDirt = new BlockDirtPath("path.dirt", 210).withHardness(0.5F).withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
-
-    public static final Block dirt = new Block("dirt", 220, Material.dirt).withHardness(0.5F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH);
-    public static final Block dirtScorched = new Block("dirt.scorched", 221, Material.dirt).withHardness(0.5F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH);
-    public static final Block dirtScorchedRich = new Block("dirt.scorched.rich", 222, Material.dirt).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.CAVES_CUT_THROUGH);
-
-    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, 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);
-    public static final Block spongeWet = new BlockSponge("sponge.wet", 231, true).withHardness(1.0F)
-            .withTags(BlockTags.MINEABLE_BY_SHEARS);
-
-    public static final Block mossStone = new BlockMoss("moss.stone", 240).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
-    public static final Block mossBasalt = new BlockMoss("moss.basalt", 241).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
-    public static final Block mossLimestone = new BlockMoss("moss.limestone", 242).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
-    public static final Block mossGranite = new BlockMoss("moss.granite", 243).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
-
-    public static final Block sand = new BlockSand("sand", 250).withHardness(0.5F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.CAVES_CUT_THROUGH, BlockTags.FIREFLIES_CAN_SPAWN);
-    public static final Block gravel = new BlockGravel("gravel", 251).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
-
-    public static final Block bedrock = new BlockBedrock("bedrock", 260, Material.stone).withSetUnbreakable().withBlastResistance(6000000F).withDisabledStats();
-
-    public static final Block fluidWaterFlowing = new BlockFluidFlowing("fluid.water.flowing", 270, Material.water).withHardness(100F).withLightBlock(3).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.IS_WATER, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block fluidWaterStill = new BlockFluidStill("fluid.water.still", 271, Material.water).withHardness(100F).withLightBlock(3).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.IS_WATER, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block fluidLavaFlowing = new BlockFluidFlowing("fluid.lava.flowing", 272, Material.lava).withHardness(0.0F).withLightEmission(1.0F).withLightBlock(255).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.IS_LAVA, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block fluidLavaStill = new BlockFluidStill("fluid.lava.still", 273, Material.lava).withHardness(100F).withLightEmission(1.0F).withLightBlock(255).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.IS_LAVA, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block logOak = new BlockLog("log.oak", 280).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logPine = new BlockLog("log.pine", 281).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logBirch = new BlockLog("log.birch", 282).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logCherry = new BlockLog("log.cherry", 283).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logEucalyptus = new BlockLog("log.eucalyptus", 284).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logOakMossy = new BlockLog("log.oak.mossy", 285).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logThorn = new BlockLog("log.thorn", 286).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block logPalm = new BlockLog("log.palm", 287).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block leavesOak = new BlockLeavesOak("leaves.oak", 290).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 leavesOakRetro = new BlockLeavesRetro("leaves.oak.retro", 291).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 leavesPine = new BlockLeavesPine("leaves.pine", 292).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 leavesBirch = new BlockLeavesBirch("leaves.birch", 293).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 leavesCherry = new BlockLeavesCherry("leaves.cherry", 294).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 leavesEucalyptus = new BlockLeavesEucalyptus("leaves.eucalyptus", 295).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 leavesShrub = new BlockLeavesShrub("leaves.shrub", 296).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 leavesCherryFlowering = new BlockLeavesCherryFlowering("leaves.cherry.flowering", 297).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 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 leavesThorn = new BlockLeavesThorn("leaves.thorn", 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 leavesPalm = new BlockLeavesPalm("leaves.palm", 300).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);
-    public static final Block saplingOakRetro = new BlockSaplingRetro("sapling.oak.retro", 311).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingPine = new BlockSaplingPine("sapling.pine", 312).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingBirch = new BlockSaplingBirch("sapling.birch", 313).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingCherry = new BlockSaplingCherry("sapling.cherry", 314).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingEucalyptus = new BlockSaplingEucalyptus("sapling.eucalyptus", 315).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingShrub = new BlockSaplingShrub("sapling.shrub", 316).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingCacao = new BlockSaplingCacao("sapling.cacao", 317).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingThorn = new BlockSaplingThorn("sapling.thorn", 318).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block saplingPalm = new BlockSaplingPalm("sapling.palm", 319).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-
-    public static final Block tallgrass = new BlockTallGrass("tallgrass", 320).setKilledByWeather().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
-    public static final Block tallgrassFern = new BlockTallGrass("tallgrass.fern", 321).setKilledByWeather().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block deadbush = new BlockDeadBush("deadbush", 322).withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block spinifex = new BlockSpinifex("spinifex", 323).withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
-    public static final Block algae = new BlockAlgae("algae", 324, Material.plant).withHardness(0.0F).withLitInteriorSurface(true)
-            .setBlockItem((b) -> new ItemBlockAlgae(b))
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
-
-    public static final Block flowerYellow = new BlockFlower("flower.yellow", 330).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerRed = new BlockFlower("flower.red", 331).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerPink = new BlockFlower("flower.pink", 332).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerPurple = new BlockFlower("flower.purple", 333).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerLightBlue = new BlockFlower("flower.lightblue", 334).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerOrange = new BlockFlower("flower.orange", 335).setKilledByWeather().setBonemealable().withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-
-    public static final Block mushroomBrown = new BlockMushroom("mushroom.brown", 340).withHardness(0.0F).withLightEmission(0.125F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block mushroomRed = new BlockMushroom("mushroom.red", 341).withHardness(0.0F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-
-    public static final Block oreCoalStone = new BlockOreCoal("ore.coal.stone", 350).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreCoalBasalt = new BlockOreCoal("ore.coal.basalt", 351).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreCoalLimestone = new BlockOreCoal("ore.coal.limestone", 352).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreCoalGranite = new BlockOreCoal("ore.coal.granite", 353).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreIronStone = new BlockOreIron("ore.iron.stone", 360, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreIronBasalt = new BlockOreIron("ore.iron.basalt", 361, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreIronLimestone = new BlockOreIron("ore.iron.limestone", 362, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreIronGranite = new BlockOreIron("ore.iron.granite", 363, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreGoldStone = new BlockOreGold("ore.gold.stone", 370, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreGoldBasalt = new BlockOreGold("ore.gold.basalt", 371, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreGoldLimestone = new BlockOreGold("ore.gold.limestone", 372, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreGoldGranite = new BlockOreGold("ore.gold.granite", 373, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreLapisStone = new BlockOreLapis("ore.lapis.stone", 380).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreLapisBasalt = new BlockOreLapis("ore.lapis.basalt", 381).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreLapisLimestone = new BlockOreLapis("ore.lapis.limestone", 382).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreLapisGranite = new BlockOreLapis("ore.lapis.granite", 383).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreRedstoneStone = new BlockOreRedstone("ore.redstone.stone", 390, false, "ore.redstone.stone", "ore.redstone.glowing.stone").withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneBasalt = new BlockOreRedstone("ore.redstone.basalt", 391, false, "ore.redstone.basalt", "ore.redstone.glowing.basalt").withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneLimestone = new BlockOreRedstone("ore.redstone.limestone", 392, false, "ore.redstone.limestone", "ore.redstone.glowing.limestone").withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneGranite = new BlockOreRedstone("ore.redstone.granite", 393, false, "ore.redstone.granite", "ore.redstone.glowing.granite").withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreRedstoneGlowingStone = new BlockOreRedstone("ore.redstone.glowing.stone", 400, true, "ore.redstone.stone", "ore.redstone.glowing.stone").withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneGlowingBasalt = new BlockOreRedstone("ore.redstone.glowing.basalt", 401, true, "ore.redstone.basalt", "ore.redstone.glowing.basalt").withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneGlowingLimestone = new BlockOreRedstone("ore.redstone.glowing.limestone", 402, true, "ore.redstone.limestone", "ore.redstone.glowing.limestone").withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreRedstoneGlowingGranite = new BlockOreRedstone("ore.redstone.glowing.granite", 403, true, "ore.redstone.granite", "ore.redstone.glowing.granite").withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreDiamondStone = new BlockOreDiamond("ore.diamond.stone", 410).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreDiamondBasalt = new BlockOreDiamond("ore.diamond.basalt", 411).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreDiamondLimestone = new BlockOreDiamond("ore.diamond.limestone", 412).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block oreDiamondGranite = new BlockOreDiamond("ore.diamond.granite", 413).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block oreNethercoalNetherrack = new BlockOreNetherCoal("ore.nethercoal.netherrack", 420).withHardness(3F).withBlastResistance(5F).withLightEmission(0.625F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block blockCoal = new Block("block.coal", 430, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockIron = new Block("block.iron", 431, Material.metal).withHardness(5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockGold = new Block("block.gold", 432, Material.metal).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockLapis = new Block("block.lapis", 433, Material.stone).withHardness(3F).withBlastResistance(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockRedstone = new BlockRedstone("block.redstone", 434, Material.stone).withHardness(5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockDiamond = new Block("block.diamond", 435, Material.stone).withHardness(5F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockNetherCoal = new Block("block.nethercoal", 436, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockSteel = new Block("block.steel", 437, Material.metal).withHardness(5F).withBlastResistance(2000F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockQuartz = new Block("block.quartz", 438, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockOlivine = new Block("block.olivine", 439, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block blockCharcoal = new Block("block.charcoal", 440, Material.stone).withHardness(3F).withBlastResistance(10F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block wireRedstone = new BlockRedstoneWire("wire.redstone", 450).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
-
-    public static final Block torchRedstoneIdle = new BlockRedstoneTorch("torch.redstone.idle", 460, false).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block torchRedstoneActive = new BlockRedstoneTorch("torch.redstone.active", 461, true).withHardness(0.0F).withLightEmission(0.5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PREVENT_MOB_SPAWNS);
-
-    public static final Block buttonStone = new BlockButton("button.stone", 470).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
-
-    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, 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, 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, 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()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block motionsensorActive = new BlockMotionSensor("motionsensor.active", 501, true).withLightEmission(0.3F).withHardness(2.0F).withBlastResistance(10F).withImmovableFlagSet()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block repeaterIdle = new BlockRedstoneRepeater("repeater.idle", 510, false).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block repeaterActive = new BlockRedstoneRepeater("repeater.active", 511, true).withHardness(0.0F).withLightEmission(0.625F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
-
-    public static final Block pistonBase = new BlockPistonBase("piston.base", 520, false).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block pistonBaseSticky = new BlockPistonBase("piston.base.sticky", 521, true).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block pistonHead = new BlockPistonHead("piston.head", 522).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block pistonMoving = new BlockPistonMoving("piston.moving", 523)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block noteblock = new BlockNote("noteblock", 530).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block rail = new BlockRail("rail", 540, false).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block railPowered = new BlockRail("rail.powered", 541, true).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
-    public static final Block railDetector = new BlockDetectorRail("rail.detector", 542).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
-
-    public static final Block spikes = new BlockSpikes("spikes", 550, Material.metal).withLightBlock(3).withHardness(2F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block dispenserCobbleStone = new BlockDispenser("dispenser.cobble.stone", 560).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);;
-
-    public static final Block trapdoorPlanksOak = new BlockTrapDoor("trapdoor.planks.oak", 570, Material.wood, false).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block trapdoorIron = new BlockTrapDoor("trapdoor.iron", 571, Material.metal, true).withHardness(5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .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()
-            .setBlockItem((b) -> new ItemBlockPainted(b, true))
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block tnt = new BlockTNT("tnt", 580).withHardness(0.0F);
-
-    public static final Block doorPlanksOakBottom = new BlockDoor("door.planks.oak.bottom", 590, Material.wood, false).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-    public static final Block doorPlanksOakTop = new BlockDoor("door.planks.oak.top", 591, Material.wood, true).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-    public static final Block doorIronBottom = new BlockDoor("door.iron.bottom", 592, Material.metal, false).withHardness(5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .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()
-            .setBlockItem((b) -> new ItemBlockPainted(b, true))
-            .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()
-            .setBlockItem((b) -> new ItemBlockPainted(b, true))
-            .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, BlockTags.CAN_HANG_OFF);
-    public static final Block meshGold = new BlockMeshGold("mesh.gold", 601).withHardness(1F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CAN_HANG_OFF);
-    
-    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()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block cobweb = new BlockCobweb("cobweb", 620, Material.web).withLightBlock(1).withHardness(4F)
-            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_SWORD);
-
-    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);
-
-    public static final Block workbench = new BlockWorkbench("workbench", 650).withHardness(2.5F)
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block furnaceStoneIdle = new BlockFurnace("furnace.stone.idle", 660, false).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block furnaceStoneActive = new BlockFurnace("furnace.stone.active", 661, true).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block furnaceBlastIdle = new BlockBlastFurnace("furnace.blast.idle", 662, false).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block furnaceBlastActive = new BlockBlastFurnace("furnace.blast.active", 663, true).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block trommelIdle = new BlockTrommel("trommel.idle", 670, Material.stone, false).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);;
-    public static final Block trommelActive = new BlockTrommel("trommel.active", 671, Material.stone, true).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block chestLegacy = new BlockChestLegacy("chest.legacy", 680, Material.wood).withHardness(2.5f).withBlastResistance(5.0f)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-    public static final Block chestLegacyPainted = new BlockChestLegacy("chest.legacy.painted", 681, Material.wood).withHardness(2.5f).withBlastResistance(5.0f)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-    public static final Block chestPlanksOak = new BlockChest("chest.planks.oak", 682, Material.wood).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-    public static final Block chestPlanksOakPainted = new BlockChestPainted("chest.planks.oak.painted", 683, Material.wood).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
-            .setBlockItem((b) -> new ItemBlockPainted(b, true))
-            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block cropsWheat = new BlockCropsWheat("crops.wheat", 690).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block cropsPumpkin = new BlockCropsPumpkin("crops.pumpkin", 691).withHardness(0.0f).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.OVERRIDE_STEPSOUND);
-
-    public static final Block farmlandDirt = new BlockFarmland("farmland.dirt", 700).withHardness(0.6F).withLitInteriorSurface(true).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
-
-    public static final Block signPostPlanksOak = new BlockSign("sign.post.planks.oak", 710, TileEntitySign.class, true).withHardness(1.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-    public static final Block signWallPlanksOak = new BlockSign("sign.wall.planks.oak", 711, TileEntitySign.class, false).withHardness(1.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block flag = new BlockFlag("flag", 712, Material.wood).withHardness(1.0F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block layerSnow = new BlockLayerSnow("layer.snow", 720, Material.topSnow).setFullBlockID(() -> Block.blockSnow.id).withHardness(0.1F).withLitInteriorSurface(true)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.OVERRIDE_STEPSOUND);
-    public static final Block layerLeavesOak = new BlockLayerLeaves("layer.leaves.oak", 721, Material.leaves).setFullBlockID(() -> Block.leavesOak.id).withLitInteriorSurface(true)
-            .setBlockItem(ItemBlockLayerLeaves::new)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE);
-    public static final Block layerSlate = new BlockLayerSlate("layer.slate", 722, Material.stone).setFullBlockID(() -> Block.slate.id).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block ice = new BlockIce("ice", 730).withHardness(0.5F).withLightBlock(3)
-            .withTags(BlockTags.SKATEABLE, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block permaice = new BlockSlippery("ice.perma", 731, Material.ice).withHardness(1.5F).withBlastResistance(10F)
-            .withTags(BlockTags.SKATEABLE, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block blockSnow = new BlockSnow("block.snow", 740).withHardness(0.2F)
-            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.FIREFLIES_CAN_SPAWN);
-
-    public static final Block cactus = new BlockCactus("cactus", 750).withHardness(0.4F)
-            .withTags(BlockTags.GROWS_CACTI, BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_HOE);
-
-    public static final Block blockClay = new BlockClay("block.clay", 760).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
-
-    public static final Block sugarcane = new BlockSugarcane("sugarcane", 770).withHardness(0.0F).withDisabledStats()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block blockSugarcane = new BlockAxisAligned("block.sugarcane", 771, Material.moss).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.FENCES_CONNECT);
-    public static final Block blockSugarcaneBaked = new BlockAxisAligned("block.sugarcane.baked", 772, Material.moss).withHardness(0.6F)
-            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.FENCES_CONNECT);
-
-    public static final Block jukebox = new BlockJukeBox("jukebox", 780).withHardness(2.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block pumpkin = new BlockPumpkin("pumpkin", 790, true).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block pumpkinCarvedIdle = new BlockPumpkin("pumpkin.carved.idle", 791, false).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-    public static final Block pumpkinCarvedActive = new BlockPumpkin("pumpkin.carved.active", 792, false).withHardness(1.0F).withLightEmission(1.0F).withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block netherrack = new Block("netherrack", 800, Material.stone).withHardness(0.4F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.INFINITE_BURN);
-    public static final Block netherrackIgneous = new Block("netherrack.igneous", 801, Material.stone).withHardness(1.25F).withBlastResistance(7F).withLightEmission(10)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block soulsand = new BlockSoulSand("soulsand", 810).withHardness(0.5F)
-            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
-
-    public static final Block glowstone = new BlockGlowStone("glowstone", 820, Material.stone).withHardness(0.3F).withLightEmission(1.0F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block portalNether = new BlockPortal("portal.nether", 830, 1, Block.obsidian.id, Block.fire.id).withHardness(-1F).withLightEmission(0.75F)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block portalParadise = new BlockPortal("portal.paradise", 831, 2, Block.glowstone.id, Block.bedrock.id).withHardness(-1F).withLightEmission(0.75f)
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block cake = new BlockCake("cake", 840).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block pumpkinPie = new BlockPumpkinPie("pumpkin_pie", 841).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block lampIdle = new BlockLamp("lamp.idle", 850, false).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .setBlockItem((b) -> new ItemBlockLamp(b))
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block lampActive = new BlockLamp("lamp.active", 851, true).withLightEmission(0.9375F).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
-
-    public static final Block lanternFireflyGreen = new BlockLanternFirefly("lantern.firefly.green", 870, EntityFireflyCluster.FireflyColor.GREEN, () -> Item.lanternFireflyGreen).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyBlue = new BlockLanternFirefly("lantern.firefly.blue", 871, EntityFireflyCluster.FireflyColor.BLUE, () -> Item.lanternFireflyBlue).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyOrange = new BlockLanternFirefly("lantern.firefly.orange", 872, EntityFireflyCluster.FireflyColor.ORANGE, () -> Item.lanternFireflyOrange).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyRed = new BlockLanternFirefly("lantern.firefly.red", 873, EntityFireflyCluster.FireflyColor.RED, () -> Item.lanternFireflyRed).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block jarGlass = new BlockJar("jar.glass", 874, () -> Item.jar).withHardness(0.1F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block overlayPebbles = new BlockOverlayPebbles("overlay.pebbles", 880, Material.decoration).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
-            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block fenceChainlink = new BlockFenceChainlink("fence.chainlink", 890, Material.metal).withHardness(5F)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.CAN_HANG_OFF);
-    public static final Block fencePaperWall = new BlockFencePaperWall("fence.paper_wall", 891, Material.cloth).withHardness(0.5F)
-            .withTags(BlockTags.MINEABLE_BY_SHEARS, BlockTags.FENCES_CONNECT, BlockTags.CAN_HANG_OFF, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block basket = new BlockBasket("basket", 900, Material.cloth).withHardness(0.5F)
-            .withTags(BlockTags.NOT_IN_CREATIVE_MENU);
-
-    public static final Block paperWall = new Block("paper_wall", 910, Material.cloth).withHardness(0.7F)
-            .withTags(BlockTags.MINEABLE_BY_SHEARS, BlockTags.FENCES_CONNECT, BlockTags.CAN_HANG_OFF, BlockTags.MINEABLE_BY_AXE);
-
-    public static final Block slabBrickSandstone = new BlockSlab(Block.brickSandstone, 1000).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabCobblePermafrost = new BlockSlab(cobblePermafrost, 1001).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabBrickPermafrost = new BlockSlab(brickPermafrost, 1002).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block slabPermafrostPolished = new BlockSlab(permafrostCarved, 1003).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
-            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-
-
-    public final int id;
-    protected float blockHardness;
-    protected float blastResistance;
-    protected boolean blockConstructorCalled;
-    protected boolean enableStats;
-    protected boolean isLitInteriorSurface;
-    public double minX;
-    public double minY;
-    public double minZ;
-    public double maxX;
-    public double maxY;
-    public double maxZ;
-    public float blockParticleGravity;
-    public final Material blockMaterial;
-    public float movementScale;
-    protected String key;
-    public int dropOverride = -1;
-    public boolean immovable = false;
     @NotNull
-    public Supplier<Item> blockItemSupplier = () -> new ItemBlock(this);
-    public static void initializeBlocks(){
-        BlockMoss.initMossMap();
-
-        for(int i = 0; i < blocksList.length; i++)
-        {
-            if(blocksList[i] != null && Item.itemsList[i] == null)
-            {
-                Block block = blocksList[i];
-                Item.itemsList[i] = block.blockItemSupplier.get();
-                blocksList[i].initializeBlock();
-            }
-        }
-
-        translucent[0] = true;
-        StatList.onBlockInit();
-    }
+    public Supplier<Item> blockItemSupplier = () -> new BlockItem(this);
 
     @Override
 	public boolean isIn(Tag<Block> tag) {
diff --git a/src/main/java/net/minecraft/core/block/BlockBedrock.java b/src/main/java/net/minecraft/core/block/BlockBedrock.java
deleted file mode 100644
index 3d5a20978..000000000
--- a/src/main/java/net/minecraft/core/block/BlockBedrock.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.world.World;
-
-public class BlockBedrock
-	extends Block
-{
-	public BlockBedrock(String key, int id, Material material)
-    {
-		super(key, id, material);
-	}
-
-	@Override
-	public void onBlockAdded(World world, int x, int y, int z)
-    {
-		if (world.getBlockId(x, y - 1, z) == Block.glowstone.id && ((BlockPortal)Block.portalParadise).tryToCreatePortal(world, x, y, z))
-        {
-        	return;
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockDetectorRail.java b/src/main/java/net/minecraft/core/block/BlockDetectorRail.java
deleted file mode 100644
index ca77a529e..000000000
--- a/src/main/java/net/minecraft/core/block/BlockDetectorRail.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.minecraft.core.block;
-
-import java.util.List;
-import java.util.Random;
-
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            BlockRail, World, IBlockAccess, EntityMinecart, 
-//            AxisAlignedBB, Entity
-
-public class BlockDetectorRail extends BlockRail
-{
-
-    public BlockDetectorRail(String key, int id)
-    {
-        super(key, id, true);
-        setTicking(true);
-    }
-
-    @Override
-    public int tickRate()
-    {
-        return 20;
-    }
-
-    @Override
-    public boolean canProvidePower()
-    {
-        return true;
-    }
-
-    @Override
-    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int l = world.getBlockMetadata(x, y, z);
-        if ((l & 8) == 0) {
-            setStateIfMinecartInteractsWithRail(world, x, y, z, l);
-        }
-    }
-
-    @Override
-	public void updateTick(World world, int x, int y, int z, Random rand)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int meta = world.getBlockMetadata(x, y, z);
-        if ((meta & 8) != 0) {
-            setStateIfMinecartInteractsWithRail(world, x, y, z, meta);
-        }
-    }
-
-    @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-        return (blockAccess.getBlockMetadata(x, y, z) & 8) != 0;
-    }
-
-    @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
-    {
-        if((world.getBlockMetadata(x, y, z) & 8) == 0)
-        {
-            return false;
-        } else
-        {
-            return side == 1;
-        }
-    }
-    private void setStateIfMinecartInteractsWithRail(World world, int x, int y, int z, int meta)
-    {
-        boolean isPowered = (meta & 8) != 0;
-        boolean isMinecart = false;
-        boolean isSlope = (meta & 4) != 0;
-        float offset = 0.125f;
-        List<Entity> list = world.getEntitiesWithinAABB(EntityMinecart.class, AABB.getBoundingBoxFromPool(x + offset, y + offset, z + offset, x + 1 - offset, y + 1 - offset, z + 1 - offset));
-        if(!list.isEmpty())
-        {
-            isMinecart = true;
-        }
-        if(isMinecart && !isPowered)
-        {
-            // Set rail to powered
-            world.setBlockMetadataWithNotify(x, y, z, meta | 8);
-            world.notifyBlocksOfNeighborChange(x, y, z, id);
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-            world.markBlocksDirty(x, y, z, x, y, z);
-        }
-        if(!isMinecart && isPowered)
-        {
-            // Set rail to unpowered
-            world.setBlockMetadataWithNotify(x, y, z, meta & 7);
-            world.notifyBlocksOfNeighborChange(x, y, z, id);
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-            world.markBlocksDirty(x, y, z, x, y, z);
-        }
-        if(isMinecart)
-        {
-            // Schedule update if minecart in rail
-            world.scheduleBlockUpdate(x, y, z, id, tickRate());
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockDoorGlass.java b/src/main/java/net/minecraft/core/block/BlockDoorGlass.java
deleted file mode 100644
index 00d806ce7..000000000
--- a/src/main/java/net/minecraft/core/block/BlockDoorGlass.java
+++ /dev/null
@@ -1,19 +0,0 @@
-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
deleted file mode 100644
index 66e934b30..000000000
--- a/src/main/java/net/minecraft/core/block/BlockDoorPainted.java
+++ /dev/null
@@ -1,19 +0,0 @@
-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/BlockFire.java b/src/main/java/net/minecraft/core/block/BlockFire.java
deleted file mode 100644
index 4b8912297..000000000
--- a/src/main/java/net/minecraft/core/block/BlockFire.java
+++ /dev/null
@@ -1,358 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.sound.SoundCategory;
-import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.World;
-
-import java.util.Random;
-
-public class BlockFire extends Block {
-
-	private static final int[] chanceToEncourageFire = new int[Block.blocksList.length];
-	private static final int[] abilityToCatchFire = new int[Block.blocksList.length];
-
-	public BlockFire(String key, int id) {
-		super(key, id, Material.fire);
-		setTicking(true);
-		setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
-	}
-
-	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
-	{
-		return null;
-	}
-
-	@Override
-	public void initializeBlock() {
-		setBurnRate(Block.planksOak.id, 5, 20);
-		setBurnRate(Block.planksOakPainted.id, 5, 20);
-		setBurnRate(Block.fencePlanksOak.id, 5, 20);
-		setBurnRate(Block.fencePlanksOakPainted.id, 5, 20);
-		setBurnRate(Block.slabPlanksOak.id, 5, 20);
-		setBurnRate(Block.slabPlanksOakPainted.id, 5, 20);
-		setBurnRate(Block.stairsPlanksOak.id, 5, 20);
-		setBurnRate(Block.logOak.id, 5, 5);
-		setBurnRate(Block.logPine.id, 5, 5);
-		setBurnRate(Block.logBirch.id, 5, 5);
-		setBurnRate(Block.logCherry.id, 5, 5);
-		setBurnRate(Block.logOakMossy.id, 5, 5);
-		setBurnRate(Block.logEucalyptus.id, 5, 5);
-		setBurnRate(Block.logPalm.id, 5, 5);
-		setBurnRate(Block.logThorn.id, 5, 5);
-		setBurnRate(Block.leavesOak.id, 30, 60);
-		setBurnRate(Block.leavesPine.id, 30, 60);
-		setBurnRate(Block.leavesBirch.id, 30, 60);
-		setBurnRate(Block.leavesCherry.id, 30, 60);
-		setBurnRate(Block.leavesCherryFlowering.id, 30, 60);
-		setBurnRate(Block.leavesOakRetro.id, 30, 60);
-		setBurnRate(Block.leavesShrub.id, 30, 60);
-		setBurnRate(Block.leavesEucalyptus.id, 30, 60);
-		setBurnRate(Block.leavesCacao.id, 30, 60);
-		setBurnRate(Block.leavesPalm.id, 30, 60);
-		setBurnRate(Block.leavesThorn.id, 30, 60);
-		setBurnRate(Block.bookshelfPlanksOak.id, 30, 20);
-		setBurnRate(Block.tnt.id, 15, 100);
-		setBurnRate(Block.wool.id, 30, 60);
-		setBurnRate(Block.mossStone.id, 100, 30);
-		setBurnRate(Block.mossBasalt.id, 100, 30);
-		setBurnRate(Block.mossLimestone.id, 100, 30);
-		setBurnRate(Block.mossGranite.id, 100, 30);
-	}
-
-	public static void setBurnRate(int id, int chanceToEncourageFire, int abilityToCatchFire) {
-		BlockFire.chanceToEncourageFire[id] = chanceToEncourageFire;
-		BlockFire.abilityToCatchFire[id] = abilityToCatchFire;
-	}
-
-	@Override
-	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z) {
-		return null;
-	}
-
-	@Override
-	public boolean isSolidRender() {
-		return false;
-	}
-
-	@Override
-	public boolean renderAsNormalBlock() {
-		return false;
-	}
-
-	@Override
-	public void onBlockRemoved(World world, int x, int y, int z, int data)
-	{
-		for (int i = 0; i < 8; i++)
-		{
-			world.spawnParticle("largesmoke", (double)x + Math.random(), (double)y + 0.5D, (double)z + Math.random(), 0.0D, 0.0D, 0.0D, 0);
-		}
-	}
-
-	@Override
-	public int tickRate() {
-		return 40;
-	}
-	
-	public void setBurnResult(World world, int x, int y, int z) {
-		world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
-	}
-
-	@Override
-	public void updateTick(World world, int x, int y, int z, Random rand) {
-		Block blockUnder = world.getBlock(x, y - 1, z);
-		boolean infiniBurn = blockUnder != null && blockUnder.hasTag(BlockTags.INFINITE_BURN);
-
-		//Extinguish fire
-		if (!canFirePersist(world, x, y, z)) {
-			setBurnResult(world, x, y, z);
-		}
-		
-		//Extinguish fire (Rain / Snow)
-		if (!infiniBurn && world.getCurrentWeather() != null && world.getCurrentWeather().isPrecipitation && (
-				   world.canBlockBeRainedOn(x, y, z)
-				|| world.canBlockBeRainedOn(x - 1, y, z)
-				|| world.canBlockBeRainedOn(x + 1, y, z)
-				|| world.canBlockBeRainedOn(x, y, z - 1)
-				|| world.canBlockBeRainedOn(x, y, z + 1))) {
-			setBurnResult(world, x, y, z);
-			return;
-		}
-		
-		int meta = world.getBlockMetadata(x, y, z);
-		if (meta < 15) {
-			world.setBlockMetadata(x, y, z, meta + rand.nextInt(3) / 2);
-		}
-		world.scheduleBlockUpdate(x, y, z, id, tickRate());
-		
-		
-		if (!infiniBurn && !canNeighborCatchFire(world, x, y, z)) {
-			if (!world.isBlockNormalCube(x, y - 1, z) || meta > 3) {
-				setBurnResult(world, x, y, z);
-			}
-			return;
-		}
-		
-		if (!infiniBurn && !canBlockCatchFire(world, x, y - 1, z) && meta == 15 && rand.nextInt(4) == 0) {
-			setBurnResult(world, x, y, z);
-			return;
-		}
-		
-		tryToCatchBlockOnFire(world, x + 1, y, z, 300, rand, meta);
-		tryToCatchBlockOnFire(world, x - 1, y, z, 300, rand, meta);
-		tryToCatchBlockOnFire(world, x, y - 1, z, 250, rand, meta);
-		tryToCatchBlockOnFire(world, x, y + 1, z, 250, rand, meta);
-		tryToCatchBlockOnFire(world, x, y, z - 1, 300, rand, meta);
-		tryToCatchBlockOnFire(world, x, y, z + 1, 300, rand, meta);
-		
-		for (int x1 = x - 1; x1 <= x + 1; x1++) {
-			for (int z1 = z - 1; z1 <= z + 1; z1++) {
-				for (int y1 = y - 1; y1 <= y + 4; y1++) {
-					if (x1 == x && y1 == y && z1 == z) {
-						continue;
-					}
-					
-					int a = 100;
-					if (y1 > y + 1) {
-						a += (y1 - (y + 1)) * 100;
-					}
-					int b = getChanceOfNeighborsEncouragingFire(world, x1, y1, z1);
-					if (b <= 0) {
-						continue;
-					}
-					
-					int c = (b + 40) / (meta + 30);
-					if (c <= 0 || rand.nextInt(a) > c || (world.getCurrentWeather() != null && world.getCurrentWeather().isPrecipitation) &&
-							   world.canBlockBeRainedOn(x1, y1, z1)
-							|| world.canBlockBeRainedOn(x1 - 1, y1, z)
-							|| world.canBlockBeRainedOn(x1 + 1, y1, z1)
-							|| world.canBlockBeRainedOn(x1, y1, z1 - 1)
-							|| world.canBlockBeRainedOn(x1, y1, z1 + 1)
-					) {
-						continue;
-					}
-					
-					if(getBurnResultId(world, x1, y1, z1) == 0 /* Fix for fire destroying moss blocks */) {
-						//Spread Fire with higher meta
-						world.setBlockAndMetadataWithNotify(x1, y1, z1, id, Math.min(meta + rand.nextInt(5) / 4, 15));
-					}
-				}
-
-			}
-
-		}
-
-	}
-
-	private void tryToCatchBlockOnFire(World world, int x, int y, int z, int chance, Random random, int meta) {
-		if (random.nextInt(chance) < abilityToCatchFire[world.getBlockId(x, y, z)]) {
-			boolean isTNT = world.getBlockId(x, y, z) == Block.tnt.id;
-			
-			if (random.nextInt(meta + 10) < 5 && !world.canBlockBeRainedOn(x, y, z)) {
-				if(getBurnResultId(world, x, y, z) == 0 /* Fix for fire destroying moss blocks */) {
-					//Spread Fire with higher meta
-					world.setBlockAndMetadataWithNotify(x, y, z, id, Math.min(meta + random.nextInt(5) / 4, 15));
-				}
-			} else {
-				setBurnResult(world, x, y, z);
-			}
-			
-			if (isTNT) {
-				BlockTNT blockTNT = (BlockTNT) Block.tnt;
-				blockTNT.ignite(world, x, y, z, true);
-			}
-		}
-	}
-
-	private boolean canNeighborCatchFire(World world, int x, int y, int z) {
-		if (canBlockCatchFire(world, x + 1, y, z)) return true;
-		if (canBlockCatchFire(world, x - 1, y, z)) return true;
-		if (canBlockCatchFire(world, x, y - 1, z)) return true;
-		if (canBlockCatchFire(world, x, y + 1, z)) return true;
-		if (canBlockCatchFire(world, x, y, z - 1)) return true;
-        return canBlockCatchFire(world, x, y, z + 1);
-    }
-
-	private int getChanceOfNeighborsEncouragingFire(World world, int i, int j, int k) {
-		int l = 0;
-		if (!world.isAirBlock(i, j, k)) {
-			return 0;
-		} else {
-			l = getChanceToEncourageFire(world, i + 1, j, k, l);
-			l = getChanceToEncourageFire(world, i - 1, j, k, l);
-			l = getChanceToEncourageFire(world, i, j - 1, k, l);
-			l = getChanceToEncourageFire(world, i, j + 1, k, l);
-			l = getChanceToEncourageFire(world, i, j, k - 1, l);
-			l = getChanceToEncourageFire(world, i, j, k + 1, l);
-			return l;
-		}
-	}
-
-//	@Override
-//	public boolean isCollidable() {
-//		return false;
-//	}
-
-	public boolean canBlockCatchFire(WorldSource iblockaccess, int i, int j, int k) {
-		return chanceToEncourageFire[iblockaccess.getBlockId(i, j, k)] > 0;
-	}
-
-	public int getChanceToEncourageFire(World world, int i, int j, int k, int l) {
-		int i1 = chanceToEncourageFire[world.getBlockId(i, j, k)];
-		if (i1 > l) {
-			return i1;
-		} else {
-			return l;
-		}
-	}
-	
-	public boolean canFirePersist(World world, int x, int y, int z) {
-		return world.isBlockNormalCube(x, y - 1, z) || canNeighborCatchFire(world, x, y, z); 
-	}
-
-	@Override
-	public boolean canPlaceBlockAt(World world, int x, int y, int z) {
-		return canFirePersist(world, x, y, z);
-	}
-
-	@Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
-		if (!world.isBlockNormalCube(x, y - 1, z) && !canNeighborCatchFire(world, x, y, z)) {
-
-			world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
-        } else {
-        }
-	}
-
-	protected int getBurnResultId(World world, int x, int y, int z) {
-		int id = world.getBlockId(x, y, z);
-		Block stoneBlock = BlockMoss.getStoneBlock(id);
-		if (stoneBlock != null) {
-			return stoneBlock.id;
-		}
-		return 0;
-	}
-
-	@Override
-	public void onBlockAdded(World world, int x, int y, int z) {
-		if (world.getBlockId(x, y - 1, z) == Block.obsidian.id
-				&& ((BlockPortal) Block.portalNether).tryToCreatePortal(world, x, y, z)) {
-			return;
-		}
-		if (!world.isBlockNormalCube(x, y - 1, z) && !canNeighborCatchFire(world, x, y, z)) {
-			world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
-		} else {
-			world.scheduleBlockUpdate(x, y, z, id, tickRate());
-		}
-	}
-
-	@Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
-		if (rand.nextInt(24) == 0) {
-			world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, "fire.fire",
-								  1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F);
-		}
-		if (world.isBlockNormalCube(x, y - 1, z) || ((BlockFire) Block.fire).canBlockCatchFire(world, x, y - 1, z)) {
-			for (int l = 0; l < 3; l++) {
-				double f = (double) x + rand.nextFloat();
-				double f6 = (double) y + rand.nextFloat() * 0.5F + 0.5F;
-				double f12 = (double) z + rand.nextFloat();
-				world.spawnParticle("largesmoke", f, f6, f12, 0.0D, 0.0D, 0.0D, 0);
-			}
-
-		} else {
-			if (((BlockFire) Block.fire).canBlockCatchFire(world, x - 1, y, z)) {
-				for (int i1 = 0; i1 < 2; i1++) {
-					double f1 = (double) x + rand.nextFloat() * 0.1F;
-					double f7 = (double) y + rand.nextFloat();
-					double f13 = (double) z + rand.nextFloat();
-					world.spawnParticle("largesmoke", f1, f7, f13, 0.0D, 0.0D, 0.0D, 0);
-				}
-
-			}
-			if (((BlockFire) Block.fire).canBlockCatchFire(world, x + 1, y, z)) {
-				for (int j1 = 0; j1 < 2; j1++) {
-					double f2 = (double) (x + 1) - rand.nextFloat() * 0.1F;
-					double f8 = (double) y + rand.nextFloat();
-					double f14 = (double) z + rand.nextFloat();
-					world.spawnParticle("largesmoke", f2, f8, f14, 0.0D, 0.0D, 0.0D, 0);
-				}
-
-			}
-			if (((BlockFire) Block.fire).canBlockCatchFire(world, x, y, z - 1)) {
-				for (int k1 = 0; k1 < 2; k1++) {
-					double f3 = (double) x + rand.nextFloat();
-					double f9 = (double) y + rand.nextFloat();
-					double f15 = (double) z + rand.nextFloat() * 0.1F;
-					world.spawnParticle("largesmoke", f3, f9, f15, 0.0D, 0.0D, 0.0D, 0);
-				}
-
-			}
-			if (((BlockFire) Block.fire).canBlockCatchFire(world, x, y, z + 1)) {
-				for (int l1 = 0; l1 < 2; l1++) {
-					double f4 = (double) x + rand.nextFloat();
-					double f10 = (double) y + rand.nextFloat();
-					double f16 = (double) (z + 1) - rand.nextFloat() * 0.1F;
-					world.spawnParticle("largesmoke", f4, f10, f16, 0.0D, 0.0D, 0.0D, 0);
-				}
-
-			}
-			if (((BlockFire) Block.fire).canBlockCatchFire(world, x, y + 1, z)) {
-				for (int i2 = 0; i2 < 2; i2++) {
-					double f5 = (double) x + rand.nextFloat();
-					double f11 = (double) (y + 1) - rand.nextFloat() * 0.1F;
-					double f17 = (double) z + rand.nextFloat();
-					world.spawnParticle("largesmoke", f5, f11, f17, 0.0D, 0.0D, 0.0D, 0);
-				}
-
-			}
-		}
-	}
-	
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesBirch.java b/src/main/java/net/minecraft/core/block/BlockLeavesBirch.java
deleted file mode 100644
index e429997eb..000000000
--- a/src/main/java/net/minecraft/core/block/BlockLeavesBirch.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-
-// Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess, 
-//            WorldChunkManager, World, Block, EntityPlayer, 
-//            ItemStack, Item, ItemShears, StatList, 
-//            Entity
-
-public class BlockLeavesBirch extends BlockLeavesBase
-{
-
-	public BlockLeavesBirch(String key, int id)
-    {
-        super(key, id, Material.leaves);
-    }
-
-    @Override
-    protected Block getSapling()
-    {
-        return Block.saplingBirch;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesPalm.java b/src/main/java/net/minecraft/core/block/BlockLeavesPalm.java
deleted file mode 100644
index 2ebaca07b..000000000
--- a/src/main/java/net/minecraft/core/block/BlockLeavesPalm.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-
-public class BlockLeavesPalm extends BlockLeavesBase {
-
-	public BlockLeavesPalm(String key, int id) {
-		super(key, id, Material.leaves);
-	}
-
-	@Override
-	protected Block getSapling() {
-		return Block.saplingPalm;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesRetro.java b/src/main/java/net/minecraft/core/block/BlockLeavesRetro.java
deleted file mode 100644
index ea0d2a983..000000000
--- a/src/main/java/net/minecraft/core/block/BlockLeavesRetro.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-
-public class BlockLeavesRetro extends BlockLeavesBase
-{
-	public BlockLeavesRetro(String key, int id)
-	{
-        super(key, id, Material.leaves);
-	}
-
-    @Override
-    protected Block getSapling()
-    {
-        return Block.saplingOakRetro;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesThorn.java b/src/main/java/net/minecraft/core/block/BlockLeavesThorn.java
deleted file mode 100644
index 2b3167339..000000000
--- a/src/main/java/net/minecraft/core/block/BlockLeavesThorn.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-
-public class BlockLeavesThorn extends BlockLeavesBase
-{
-    public BlockLeavesThorn(String key, int id)
-    {
-        super(key, id, Material.leaves);
-    }
-    @Override
-    protected Block getSapling()
-    {
-        return Block.saplingThorn;
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockLever.java b/src/main/java/net/minecraft/core/block/BlockLever.java
deleted file mode 100644
index 1cb905685..000000000
--- a/src/main/java/net/minecraft/core/block/BlockLever.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.tag.ItemTags;
-import net.minecraft.core.sound.SoundCategory;
-import net.minecraft.core.util.helper.Axis;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, World, IBlockAccess, 
-//            AxisAlignedBB, EntityPlayer
-
-public class BlockLever extends Block
-{
-
-	public BlockLever(String key, int id)
-    {
-        super(key, id, Material.decoration);
-    }
-
-    @Override
-	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
-    {
-        return null;
-    }
-
-    @Override
-	public boolean isSolidRender()
-    {
-        return false;
-    }
-
-    @Override
-	public boolean renderAsNormalBlock()
-    {
-        return false;
-    }
-
-    @Override
-    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
-    {
-        if (side == 0 && world.isBlockNormalCube(x, y + 1, z)){return true;}
-        if(side == 1 && world.canPlaceOnSurfaceOfBlock(x, y - 1, z)) {return true;}
-        if(side == 2 && world.isBlockNormalCube(x, y, z + 1)) {return true;}
-        if(side == 3 && world.isBlockNormalCube(x, y, z - 1)) {return true;}
-        if(side == 4 && world.isBlockNormalCube(x + 1, y, z)) {return true;}
-        return side == 5 && world.isBlockNormalCube(x - 1, y, z);
-    }
-
-
-    @Override
-	public boolean canPlaceBlockAt(World world, int x, int y, int z)
-    {
-        if(world.isBlockNormalCube(x - 1, y, z)) {return true;}
-        if(world.isBlockNormalCube(x + 1, y, z)) {return true;}
-        if(world.isBlockNormalCube(x, y, z - 1)) {return true;}
-        if(world.isBlockNormalCube(x, y, z + 1)) {return true;}
-        if (world.isBlockNormalCube(x, y + 1, z)) return true;
-        return world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
-    }
-    
-    @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-        int i1 = world.getBlockMetadata(x, y, z);
-        int j1 = i1 & 16;
-        i1 &= 15;
-        i1 = -1;
-        if(side == Side.BOTTOM && world.canPlaceOnSurfaceOfBlock(x, y + 1, z))
-        {
-            i1 = 7 + (entity.getHorizontalPlacementDirection(side).getAxis() == Axis.Z ? 1 : 0);
-        }
-        if(side == Side.TOP && world.canPlaceOnSurfaceOfBlock(x, y - 1, z))
-        {
-            i1 = 5 + (entity.getHorizontalPlacementDirection(side).getAxis() == Axis.Z ? 1 : 0);
-        }
-        if(side == Side.NORTH && world.isBlockNormalCube(x, y, z + 1))
-        {
-            i1 = 4;
-        }
-        if(side == Side.SOUTH && world.isBlockNormalCube(x, y, z - 1))
-        {
-            i1 = 3;
-        }
-        if(side == Side.WEST && world.isBlockNormalCube(x + 1, y, z))
-        {
-            i1 = 2;
-        }
-        if(side == Side.EAST && world.isBlockNormalCube(x - 1, y, z))
-        {
-            i1 = 1;
-        }
-        if(i1 == -1)
-        {
-            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
-            world.setBlockWithNotify(x, y, z, 0);
-        } else
-        {
-            world.setBlockMetadataWithNotify(x, y, z, i1 + j1);
-        }
-    }
-    
-    @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
-    {
-        if(checkIfAttachedToBlock(world, x, y, z))
-        {
-            int i1 = world.getBlockMetadata(x, y, z) & 15;
-            boolean flag = false;
-            if(!world.isBlockNormalCube(x - 1, y, z) && i1 == 1)
-            {
-                flag = true;
-            }
-            if(!world.isBlockNormalCube(x + 1, y, z) && i1 == 2)
-            {
-                flag = true;
-            }
-            if(!world.isBlockNormalCube(x, y, z - 1) && i1 == 3)
-            {
-                flag = true;
-            }
-            if(!world.isBlockNormalCube(x, y, z + 1) && i1 == 4)
-            {
-                flag = true;
-            }
-            if(!world.canPlaceOnSurfaceOfBlock(x, y - 1, z) && i1 == 5)
-            {
-                flag = true;
-            }
-            if(!world.canPlaceOnSurfaceOfBlock(x, y - 1, z) && i1 == 6)
-            {
-                flag = true;
-            }
-            if(!world.canPlaceOnSurfaceOfBlock(x, y + 1, z) && i1 == 7)
-            {
-                flag = true;
-            }
-            if(!world.canPlaceOnSurfaceOfBlock(x, y + 1, z) && i1 == 8)
-            {
-                flag = true;
-            }
-            if(flag)
-            {
-                dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
-                world.setBlockWithNotify(x, y, z, 0);
-            }
-        }
-    }
-
-    private boolean checkIfAttachedToBlock(World world, int i, int j, int k)
-    {
-        if(!canPlaceBlockAt(world, i, j, k))
-        {
-            dropBlockWithCause(world, EnumDropCause.WORLD, i, j, k, world.getBlockMetadata(i, j, k), null);
-            world.setBlockWithNotify(i, j, k, 0);
-            return false;
-        } else
-        {
-            return true;
-        }
-    }
-
-    @Override
-    public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
-    {
-        int l = world.getBlockMetadata(x, y, z) & 15;
-        float f = 0.1875F;
-        if(l == 1) {
-            setBlockBounds(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f);
-        } else if(l == 2) {
-            setBlockBounds(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f);
-        } else if(l == 3) {
-            setBlockBounds(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F);
-        } else if(l == 4) {
-            setBlockBounds(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F);
-        } else if (l == 5 || l == 6) {
-            float f1 = 0.25F;
-            setBlockBounds(0.5F - f1, 0.0F, 0.5F - f1, 0.5F + f1, 0.6F, 0.5F + f1);
-        } else {
-            float f1 = 0.25F;
-            setBlockBounds(0.5F - f1, 0.4, 0.5F - f1, 0.5F + f1, 1F, 0.5F + f1);
-        }
-    }
-
-    @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
-    {
-    	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
-    	}
-    }
-
-    @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
-    {
-        int l = world.getBlockMetadata(x, y, z);
-        int i1 = l & 15;
-        int j1 = 16 - (l & 16);
-        world.setBlockMetadataWithNotify(x, y, z, i1 + j1);
-        world.markBlocksDirty(x, y, z, x, y, z);
-        world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "random.click", 0.3F, j1 <= 0 ? 0.5F : 0.6F);
-        world.notifyBlocksOfNeighborChange(x, y, z, id);
-        if(i1 == 1) {
-            world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
-        } else if(i1 == 2) {
-            world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
-        } else if(i1 == 3) {
-            world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
-        } else if(i1 == 4) {
-            world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
-        } else if (i1 == 5 || i1 == 6){
-            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-        } else {
-            world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
-        }
-        return true;
-    }
-
-    @Override
-    public void onBlockRemoved(World world, int x, int y, int z, int data)
-    {
-        if((data & 16) > 0)
-        {
-            world.notifyBlocksOfNeighborChange(x, y, z, id);
-            int i1 = data & 15;
-            if(i1 == 1) {
-                world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
-            } else if(i1 == 2) {
-                world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
-            } else if(i1 == 3) {
-                world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
-            } else if(i1 == 4) {
-                world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
-            } else if (i1 == 5 || i1 == 6){
-                world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-            } else {
-                world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
-            }
-        }
-        super.onBlockRemoved(world, x, y, z, data);
-    }
-
-    @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-        return (blockAccess.getBlockMetadata(x, y, z) & 16) > 0;
-    }
-
-    @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
-    {
-        int i1 = world.getBlockMetadata(x, y, z);
-        if((i1 & 16) == 0)
-        {
-            return false;
-        }
-        int j1 = i1 & 15;
-        if(j1 == 8 && side == 0)
-        {
-            return true;
-        }
-        if(j1 == 7 && side == 0)
-        {
-            return true;
-        }
-        if(j1 == 6 && side == 1)
-        {
-            return true;
-        }
-        if(j1 == 5 && side == 1)
-        {
-            return true;
-        }
-        if(j1 == 4 && side == 2)
-        {
-            return true;
-        }
-        if(j1 == 3 && side == 3)
-        {
-            return true;
-        }
-        if(j1 == 2 && side == 4)
-        {
-            return true;
-        }
-        return j1 == 1 && side == 5;
-    }
-
-    @Override
-    public boolean canProvidePower()
-    {
-        return true;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockPumpkin.java b/src/main/java/net/minecraft/core/block/BlockPumpkin.java
deleted file mode 100644
index ba00a02a0..000000000
--- a/src/main/java/net/minecraft/core/block/BlockPumpkin.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.minecraft.core.block;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, World, EntityLiving, 
-//            MathHelper
-
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.tool.ItemToolSword;
-import net.minecraft.core.util.helper.Direction;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-public class BlockPumpkin extends BlockRotatableHorizontal
-{
-    private final boolean isCarvable;
-
-	public BlockPumpkin(String key, int id, boolean isCarvable)
-    {
-        super(key, id, Material.vegetable);
-        setTicking(true);
-        this.isCarvable = isCarvable;
-    }
-    @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
-        if (!isCarvable) return false;
-        ItemStack heldItem = player.getHeldItem();
-        if (heldItem != null && heldItem.getItem() instanceof ItemToolSword){
-            heldItem.damageItem(1,player);
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.pumpkinCarvedIdle.id, player.getHorizontalPlacementDirection(Direction.getHorizontalDirection(player).getSide()).getOpposite().getId());
-            return true;
-        }
-        return false;
-    }
-    @Override
-    public void onBlockAdded(World world, int x, int y, int z)
-    {
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockRail.java b/src/main/java/net/minecraft/core/block/BlockRail.java
deleted file mode 100644
index 94302ff9a..000000000
--- a/src/main/java/net/minecraft/core/block/BlockRail.java
+++ /dev/null
@@ -1,309 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.HitResult;
-import net.minecraft.core.block.logic.RailLogic;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.WorldSource;
-
-import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, World, Material, IBlockAccess, 
-//            RailLogic, AxisAlignedBB, Vec3D, MovingObjectPosition
-
-public class BlockRail extends Block
-{
-
-    public static final boolean isRailBlockAt(World world, int i, int j, int k)
-    {
-        int l = world.getBlockId(i, j, k);
-        return l == Block.rail.id || l == Block.railPowered.id || l == Block.railDetector.id;
-    }
-
-    public static final boolean isRailBlock(int i)
-    {
-        return i == Block.rail.id || i == Block.railPowered.id || i == Block.railDetector.id;
-    }
-
-    protected BlockRail(String key, int id, boolean isPowered)
-    {
-        super(key, id, Material.decoration);
-        this.isPowered = isPowered;
-        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
-    }
-
-    public boolean getIsPowered()
-    {
-        return isPowered;
-    }
-
-    @Override
-	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
-    {
-        return null;
-    }
-
-    @Override
-	public boolean isSolidRender()
-    {
-        return false;
-    }
-
-    @Override
-    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3d start, Vec3d end)
-    {
-        setBlockBoundsBasedOnState(world, x, y, z);
-        return super.collisionRayTrace(world, x, y, z, start, end);
-    }
-
-    @Override
-    public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
-    {
-        int l = world.getBlockMetadata(x, y, z);
-        if(l >= 2 && l <= 5)
-        {
-            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.725F, 1.0F);
-        } else
-        {
-            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
-        }
-    }
-
-    @Override
-	public boolean renderAsNormalBlock()
-    {
-        return false;
-    }
-
-    public int quantityDropped(int meta, Random rand)
-    {
-        return 1;
-    }
-
-    @Override
-	public boolean canPlaceBlockAt(World world, int x, int y, int z)
-    {
-        return world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
-    }
-
-    @Override
-	public void onBlockAdded(World world, int x, int y, int z)
-    {
-        func_4031_h(world, x, y, z, true);
-        if(this == Block.railPowered) {
-        	onNeighborBlockChange(world, x, y, z, id);
-        }
-    }
-
-    @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int i1 = world.getBlockMetadata(x, y, z);
-        int j1 = i1;
-        if(isPowered)
-        {
-            j1 &= 7;
-        }
-        boolean flag = !world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
-        if(j1 == 2 && !world.canPlaceOnSurfaceOfBlock(x + 1, y, z))
-        {
-            flag = true;
-        }
-        if(j1 == 3 && !world.canPlaceOnSurfaceOfBlock(x - 1, y, z))
-        {
-            flag = true;
-        }
-        if(j1 == 4 && !world.canPlaceOnSurfaceOfBlock(x, y, z - 1))
-        {
-            flag = true;
-        }
-        if(j1 == 5 && !world.canPlaceOnSurfaceOfBlock(x, y, z + 1))
-        {
-            flag = true;
-        }
-        if(flag)
-        {
-            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
-            world.setBlockWithNotify(x, y, z, 0);
-        } else
-        if(id == Block.railPowered.id)
-        {
-            boolean flag1 = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z);
-            flag1 = flag1 || func_27044_a(world, x, y, z, i1, true, 0) || func_27044_a(world, x, y, z, i1, false, 0);
-            boolean flag2 = false;
-            if(flag1 && (i1 & 8) == 0)
-            {
-                world.setBlockMetadataWithNotify(x, y, z, j1 | 8);
-                flag2 = true;
-            } else
-            if(!flag1 && (i1 & 8) != 0)
-            {
-                world.setBlockMetadataWithNotify(x, y, z, j1);
-                flag2 = true;
-            }
-            if(flag2)
-            {
-                world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-                if(j1 == 2 || j1 == 3 || j1 == 4 || j1 == 5)
-                {
-                    world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
-                }
-            }
-        } else
-        if(blockId > 0 && Block.blocksList[blockId].canProvidePower() && !isPowered && RailLogic.getNAdjacentTracks(new RailLogic(this, world, x, y, z)) == 3)
-        {
-            func_4031_h(world, x, y, z, false);
-        }
-    }
-
-    private void func_4031_h(World world, int i, int j, int k, boolean flag)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        } else
-        {
-            (new RailLogic(this, world, i, j, k)).func_792_a(world.isBlockIndirectlyGettingPowered(i, j, k), flag);
-            return;
-        }
-    }
-
-    private boolean func_27044_a(World world, int i, int j, int k, int l, boolean flag, int i1)
-    {
-        if(i1 >= 8)
-        {
-            return false;
-        }
-        int j1 = l & 7;
-        boolean flag1 = true;
-        switch(j1)
-        {
-        case 0: // '\0'
-            if(flag)
-            {
-                k++;
-            } else
-            {
-                k--;
-            }
-            break;
-
-        case 1: // '\001'
-            if(flag)
-            {
-                i--;
-            } else
-            {
-                i++;
-            }
-            break;
-
-        case 2: // '\002'
-            if(flag)
-            {
-                i--;
-            } else
-            {
-                i++;
-                j++;
-                flag1 = false;
-            }
-            j1 = 1;
-            break;
-
-        case 3: // '\003'
-            if(flag)
-            {
-                i--;
-                j++;
-                flag1 = false;
-            } else
-            {
-                i++;
-            }
-            j1 = 1;
-            break;
-
-        case 4: // '\004'
-            if(flag)
-            {
-                k++;
-            } else
-            {
-                k--;
-                j++;
-                flag1 = false;
-            }
-            j1 = 0;
-            break;
-
-        case 5: // '\005'
-            if(flag)
-            {
-                k++;
-                j++;
-                flag1 = false;
-            } else
-            {
-                k--;
-            }
-            j1 = 0;
-            break;
-        }
-        if(func_27043_a(world, i, j, k, flag, i1, j1))
-        {
-            return true;
-        }
-        return flag1 && func_27043_a(world, i, j - 1, k, flag, i1, j1);
-    }
-
-    private boolean func_27043_a(World world, int i, int j, int k, boolean flag, int l, int i1)
-    {
-        int j1 = world.getBlockId(i, j, k);
-        if(j1 == Block.railPowered.id)
-        {
-            int k1 = world.getBlockMetadata(i, j, k);
-            int l1 = k1 & 7;
-            if(i1 == 1 && (l1 == 0 || l1 == 4 || l1 == 5))
-            {
-                return false;
-            }
-            if(i1 == 0 && (l1 == 1 || l1 == 2 || l1 == 3))
-            {
-                return false;
-            }
-            if((k1 & 8) != 0)
-            {
-                if(world.isBlockIndirectlyGettingPowered(i, j, k) || world.isBlockIndirectlyGettingPowered(i, j + 1, k))
-                {
-                    return true;
-                } else
-                {
-                    return func_27044_a(world, i, j, k, k1, flag, l + 1);
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public int getPistonPushReaction()
-    {
-        return 0;
-    }
-
-    public static boolean isPoweredBlockRail(BlockRail blockrail)
-    {
-        return blockrail != null && blockrail.isPowered;
-    }
-
-    public final boolean isPowered;
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstone.java b/src/main/java/net/minecraft/core/block/BlockRedstone.java
deleted file mode 100644
index ee1add575..000000000
--- a/src/main/java/net/minecraft/core/block/BlockRedstone.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.util.helper.Color;
-import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.world.WorldSource;
-import net.minecraft.core.world.World;
-
-import java.util.Random;
-
-public class BlockRedstone extends Block
-{
-	public BlockRedstone(String key, int id, Material material)
-    {
-		super(key, id, material);
-	}
-
-	@Override
-    public boolean canProvidePower()
-    {
-        return true;
-    }
-	
-    @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-    	return true;
-    }
-    
-    @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
-    {
-        return isPoweringTo(world, x, y, z, side);
-    }
-    
-    @Override
-	public void onBlockAdded(World world, int x, int y, int z)
-    {
-        world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-        world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
-        world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
-        world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
-        world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
-        world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
-    }
-
-    @Override
-    public void onBlockRemoved(World world, int x, int y, int z, int data)
-    {
-        world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
-        world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
-        world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
-        world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
-        world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
-        world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
-    }
-
-    
-    @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
-    {
-        spawnParticles(world, x, y, z);
-    }
-    
-	private void spawnParticles(World world, int x, int y, int z) {
-		Random random = world.rand;
-
-        final int redstoneBrightness = 10;
-		Color color = Colors.allRedstoneColors[redstoneBrightness];
-		if(color == null) {
-			return;
-		}
-		float red = color.getRed() / 255.0f;
-		float green = color.getGreen() / 255.0f;
-		float blue = color.getBlue() / 255.0f;
-		
-		double d = 0.0625;
-		for (int i = 0; i < 3; i++) {
-			double px = (double) x + random.nextFloat();
-			double py = (double) y + random.nextFloat();
-			double pz = (double) z + random.nextFloat();
-			
-			if (i == 0 && !world.isBlockOpaqueCube(x, y + 1, z)) py = (y + 1) + d;
-			if (i == 1 && !world.isBlockOpaqueCube(x, y - 1, z)) py = (y + 0) - d;
-			if (i == 2 && !world.isBlockOpaqueCube(x, y, z + 1)) pz = (z + 1) + d;
-			if (i == 3 && !world.isBlockOpaqueCube(x, y, z - 1)) pz = (z + 0) - d;
-			if (i == 4 && !world.isBlockOpaqueCube(x + 1, y, z)) px = (x + 1) + d;
-			if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x + 0) - d;
-			
-			if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
-				world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
-			}
-		}
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockRotatableHorizontal.java b/src/main/java/net/minecraft/core/block/BlockRotatableHorizontal.java
deleted file mode 100644
index 52c7bd02e..000000000
--- a/src/main/java/net/minecraft/core/block/BlockRotatableHorizontal.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-public abstract class BlockRotatableHorizontal extends Block{
-	public BlockRotatableHorizontal(String key, int id, Material material) {
-        super(key, id, material);
-    }
-
-    public void setDefaultDirection(World world, int i, int j, int k)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int l = world.getBlockId(i, j, k - 1);
-        int i1 = world.getBlockId(i, j, k + 1);
-        int j1 = world.getBlockId(i - 1, j, k);
-        int k1 = world.getBlockId(i + 1, j, k);
-        byte byte0 = 3;
-        if(Block.solid[l] && !Block.solid[i1])
-        {
-            byte0 = 3;
-        }
-        if(Block.solid[i1] && !Block.solid[l])
-        {
-            byte0 = 2;
-        }
-        if(Block.solid[j1] && !Block.solid[k1])
-        {
-            byte0 = 5;
-        }
-        if(Block.solid[k1] && !Block.solid[j1])
-        {
-            byte0 = 4;
-        }
-        world.setBlockMetadataWithNotify(i, j, k, byte0);
-    }
-    
-    @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	world.setBlockMetadataWithNotify(x, y, z, entity.getHorizontalPlacementDirection(side).getOpposite().getId());
-    }
-
-    @Override
-	public void onBlockAdded(World world, int x, int y, int z)
-    {
-        super.onBlockAdded(world, x, y, z);
-        setDefaultDirection(world, x, y, z);
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockSand.java b/src/main/java/net/minecraft/core/block/BlockSand.java
deleted file mode 100644
index 3d6fbc879..000000000
--- a/src/main/java/net/minecraft/core/block/BlockSand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityFallingSand;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.world.World;
-
-import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, World, EntityFallingSand, 
-//            BlockFire
-
-public class BlockSand extends Block
-{
-
-    public BlockSand(String key, int id)
-    {
-        super(key, id, Material.sand);
-    }
-
-    @Override
-	public void onBlockAdded(World world, int x, int y, int z)
-    {
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
-    }
-
-    @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
-    {
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
-    }
-
-    @Override
-	public void updateTick(World world, int x, int y, int z, Random rand)
-    {
-        tryToFall(world, x, y, z);
-    }
-
-    private void tryToFall(World world, int i, int j, int k)
-    {
-        int l = i;
-        int i1 = j;
-        int j1 = k;
-        if(canFallBelow(world, l, i1 - 1, j1) && i1 >= 0)
-        {
-            byte byte0 = 32;
-            if(fallInstantly || !world.areBlocksLoaded(i - byte0, j - byte0, k - byte0, i + byte0, j + byte0, k + byte0))
-            {
-                world.setBlockWithNotify(i, j, k, 0);
-                for(; canFallBelow(world, i, j - 1, k) && j > 0; j--) { }
-                if(j > 0)
-                {
-                    world.setBlockWithNotify(i, j, k, id);
-                }
-            } else
-            {
-                EntityFallingSand entityfallingsand = new EntityFallingSand(world, (float)i + 0.5F, (float)j + 0.5F, (float)k + 0.5F, id);
-                world.entityJoinedWorld(entityfallingsand);
-            }
-        }
-    }
-
-    @Override
-    public int tickRate()
-    {
-        return 3;
-    }
-
-    public static boolean canFallBelow(World world, int i, int j, int k)
-    {
-        int blockId = world.getBlockId(i, j, k);
-        if(blockId == 0)
-        {
-            return true;
-        }
-        if(blockId == Block.fire.id)
-        {
-            return true;
-        }
-        if(Block.hasTag(blockId, BlockTags.IS_WATER))
-        {
-            return true;
-        }
-        return Block.hasTag(blockId, BlockTags.IS_LAVA);
-    }
-
-    public static boolean fallInstantly = false;
-
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingOak.java b/src/main/java/net/minecraft/core/block/BlockSaplingOak.java
deleted file mode 100644
index 3a9c981d2..000000000
--- a/src/main/java/net/minecraft/core/block/BlockSaplingOak.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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;
-import net.minecraft.core.world.generate.feature.tree.spooner.WorldFeatureSpoonerTreeRound;
-
-import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
-//            WorldGenTrees, WorldGenBigTree, WorldGenerator
-
-public class BlockSaplingOak extends BlockSaplingBase
-{
-
-	public BlockSaplingOak(String key, int id)
-    {
-        super(key, id);
-    }
-    
-    @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);
-    	world.setBlock(i, j, k, 0);
-
-        if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
-        {
-            if(!((WorldFeature) (treeBig)).generate(world, random, i, j, k)) {
-                world.setBlock(i, j, k, id);
-            }
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingPalm.java b/src/main/java/net/minecraft/core/block/BlockSaplingPalm.java
deleted file mode 100644
index 84f5e824b..000000000
--- a/src/main/java/net/minecraft/core/block/BlockSaplingPalm.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package net.minecraft.core.block;
-
-import java.util.Random;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreePalm;
-
-public class BlockSaplingPalm extends BlockSaplingBase {
-
-	public BlockSaplingPalm(String key, int id) {
-		super(key, id);
-		
-		this.canGrowOnSand = true;
-	}
-	
-	@Override
-	public void growTree(World world, int x, int y, int z, Random random) {
-    	boolean big = world.getBlockId(x, y - 1, z) != Block.sand.id;
-    	
-    	new WorldFeatureTreePalm(Block.logPalm, Block.leavesPalm, big, true).generate(world, random, x, y, z);
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockSlabPainted.java b/src/main/java/net/minecraft/core/block/BlockSlabPainted.java
deleted file mode 100644
index 01234ac43..000000000
--- a/src/main/java/net/minecraft/core/block/BlockSlabPainted.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.util.helper.Direction;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-public class BlockSlabPainted extends BlockSlab 
-{
-	public BlockSlabPainted(Block modelBlock, int id)
-	{
-		super(modelBlock, id);
-	}
-
-	public static int getMetadataForColour(int i)
-	{
-		return (~i << 4) & 0xF0;
-	}
-	
-	@Override
-	public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-		int meta = entity.getVerticalPlacementDirection(side, sideHeight) == Direction.UP ? 2 : 0;
-		world.setBlockMetadataWithNotify(x, y, z, meta | (world.getBlockMetadata(x, y, z) & 0xF0));
-	}
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockSlippery.java b/src/main/java/net/minecraft/core/block/BlockSlippery.java
deleted file mode 100644
index 3305575b7..000000000
--- a/src/main/java/net/minecraft/core/block/BlockSlippery.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.minecraft.core.block;
-
-import net.minecraft.core.block.material.Material;
-
-public class BlockSlippery extends Block {
-    public BlockSlippery(String key, int id, Material material) {
-        super(key, id, material);
-        movementScale = 0.98F;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java b/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java
deleted file mode 100644
index ca1f87515..000000000
--- a/src/main/java/net/minecraft/core/block/BlockTrapDoorPainted.java
+++ /dev/null
@@ -1,33 +0,0 @@
-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/BlockWool.java b/src/main/java/net/minecraft/core/block/BlockWool.java
deleted file mode 100644
index e47ffcb90..000000000
--- a/src/main/java/net/minecraft/core/block/BlockWool.java
+++ /dev/null
@@ -1,34 +0,0 @@
-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.ItemStack;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Material
-
-public class BlockWool extends Block
-{
-    public BlockWool(String key, int id)
-    {
-        super(key, id, Material.cloth);
-    }
-
-    @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
-    {
-        return new ItemStack[] { new ItemStack(this, 1, meta) };
-    }
-
-    public static int func_21034_c(int i)
-    {
-        return ~i & 0xf;
-    }
-
-    public static int getMetadataForColour(int i)
-    {
-        return ~i & 0xf;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/block/Blocks.java b/src/main/java/net/minecraft/core/block/Blocks.java
new file mode 100644
index 000000000..73ec8fa22
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/Blocks.java
@@ -0,0 +1,1161 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.block.piston.BasePistonBlock;
+import net.minecraft.core.block.piston.PistonHeadBlock;
+import net.minecraft.core.block.piston.MovingPistonBlock;
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.block.AlgaeBlockItem;
+import net.minecraft.core.item.block.LadderBlockItem;
+import net.minecraft.core.item.block.LeavesLayerBlockItem;
+import net.minecraft.core.item.block.PaintedBlockItem;
+import net.minecraft.core.item.block.BlockItemStairsPainted;
+import net.minecraft.core.item.block.LampBlockItem;
+import net.minecraft.core.item.block.PaintedSlabBlockItem;
+import net.minecraft.core.sound.BlockSounds;
+
+public final class Blocks {
+    public static Block STONE;
+    public static Block BASALT;
+    public static Block LIMESTONE;
+    public static Block GRANITE;
+    public static Block MARBLE;
+    public static Block SLATE;
+    public static Block PERMAFROST;
+
+    public static Block COBBLE_STONE;
+    public static Block COBBLE_STONE_MOSSY;
+    public static Block COBBLE_BASALT;
+    public static Block COBBLE_LIMESTONE;
+    public static Block COBBLE_GRANITE;
+    public static Block COBBLE_PERMAFROST;
+
+    public static Block STONE_POLISHED;
+    public static Block GRANITE_POLISHED;
+    public static Block LIMESTONE_POLISHED;
+    public static Block BASALT_POLISHED;
+    public static Block SLATE_POLISHED;
+    public static Block PERMAFROST_POLISHED;
+
+    public static Block PILLAR_MARBLE;
+    public static Block CAPSTONE_MARBLE;
+
+    public static Block SANDSTONE;
+
+    public static Block STONE_CARVED;
+    public static Block GRANITE_CARVED;
+    public static Block LIMESTONE_CARVED;
+    public static Block BASALT_CARVED;
+    public static Block PERMAFROST_CARVED;
+
+    public static Block PLANKS_OAK;
+    public static Block PLANKS_OAK_PAINTED;
+
+    public static Block TORCH_COAL;
+//    public static Block candleSoulwax;
+
+    public static Block LADDER_OAK;
+
+    public static Block FENCE_PLANKS_OAK;
+    public static Block FENCE_PLANKS_OAK_PAINTED;
+
+    public static Block FENCE_GATE_PLANKS_OAK;
+    public static Block FENCE_GATE_PLANKS_OAK_PAINTED;
+
+    public static Block BOOKSHELF_PLANKS_OAK;
+
+    public static Block WOOL;
+    public static Block ROPE;
+
+    public static Block BRICK_CLAY;
+    public static Block BRICK_STONE_POLISHED;
+    public static Block BRICK_STONE_POLISHED_MOSSY;
+    public static Block BRICK_SANDSTONE;
+    public static Block BRICK_GOLD;
+    public static Block BRICK_LAPIS;
+    public static Block BRICK_BASALT;
+    public static Block BRICK_LIMESTONE;
+    public static Block BRICK_GRANITE;
+    public static Block BRICK_MARBLE;
+    public static Block BRICK_SLATE;
+    public static Block BRICK_STONE;
+    public static Block BRICK_PERMAFROST;
+    public static Block BRICK_IRON;
+
+    public static Block SLAB_PLANKS_OAK;
+    public static Block SLAB_COBBLE_STONE;
+    public static Block SLAB_SANDSTONE;
+    public static Block SLAB_BRICK_STONE_POLISHED;
+    public static Block SLAB_STONE_POLISHED;
+    public static Block SLAB_BRICK_MARBLE;
+    public static Block SLAB_BRICK_CLAY;
+    public static Block SLAB_CAPSTONE_MARBLE;
+    public static Block SLAB_COBBLE_BASALT;
+    public static Block SLAB_COBBLE_LIMESTONE;
+    public static Block SLAB_COBBLE_GRANITE;
+    public static Block SLAB_BRICK_BASALT;
+    public static Block SLAB_BRICK_LIMESTONE;
+    public static Block SLAB_BRICK_GRANITE;
+    public static Block SLAB_PLANKS_PAINTED;
+    public static Block SLAB_BRICK_SLATE;
+    public static Block SLAB_BRICK_STONE;
+    public static Block SLAB_GRANITE_POLISHED;
+    public static Block SLAB_LIMESTONE_POLISHED;
+    public static Block SLAB_BASALT_POLISHED;
+
+    public static Block STAIRS_PLANKS_OAK;
+    public static Block STAIRS_COBBLE_STONE;
+    public static Block STAIRS_BRICK_STONE_POLISHED;
+    public static Block STAIRS_BRICK_MARBLE;
+    public static Block STAIRS_COBBLE_BASALT;
+    public static Block STAIRS_COBBLE_LIMESTONE;
+    public static Block STAIRS_COBBLE_GRANITE;
+    public static Block STAIRS_BRICK_BASALT;
+    public static Block STAIRS_BRICK_LIMESTONE;
+    public static Block STAIRS_BRICK_GRANITE;
+    public static Block STAIRS_BRICK_CLAY;
+    public static Block STAIRS_PLANKS_PAINTED;
+    public static Block STAIRS_BRICK_SLATE;
+    public static Block STAIRS_BRICK_STONE;
+    public static Block STAIRS_SANDSTONE;
+    public static Block STAIRS_BRICK_SANDSTONE;
+    public static Block STAIRS_COBBLE_PERMAFROST;
+    public static Block STAIRS_BRICK_PERMAFROST;
+
+    public static Block OBSIDIAN;
+
+    public static Block GLASS;
+    public static Block GLASS_TINTED;
+
+    public static Block GRASS;
+    public static Block GRASS_RETRO;
+    public static Block GRASS_SCORCHED;
+
+    public static Block PATH_DIRT;
+
+    public static Block DIRT;
+    public static Block DIRT_SCORCHED;
+    public static Block DIRT_SCORCHED_RICH;
+
+    public static Block MUD;
+    public static Block MUD_BAKED;
+
+    public static Block SPONGE_DRY;
+    public static Block SPONGE_WET;
+
+    public static Block MOSS_STONE;
+    public static Block MOSS_BASALT;
+    public static Block MOSS_LIMESTONE;
+    public static Block MOSS_GRANITE;
+
+    public static Block SAND;
+    public static Block GRAVEL;
+
+    public static Block BEDROCK;
+
+    public static Block FLUID_WATER_FLOWING;
+    public static Block FLUID_WATER_STILL;
+    public static Block FLUID_LAVA_FLOWING;
+    public static Block FLUID_LAVA_STILL;
+
+    public static Block LOG_OAK;
+    public static Block LOG_PINE;
+    public static Block LOG_BIRCH;
+    public static Block LOG_CHERRY;
+    public static Block LOG_EUCALYPTUS;
+    public static Block LOG_OAK_MOSSY;
+    public static Block LOG_THORN;
+    public static Block LOG_PALM;
+
+    public static Block LEAVES_OAK;
+    public static Block LEAVES_OAK_RETRO;
+    public static Block LEAVES_PINE;
+    public static Block LEAVES_BIRCH;
+    public static Block LEAVES_CHERRY;
+    public static Block LEAVES_EUCALYPTUS;
+    public static Block LEAVES_SHRUB;
+    public static Block LEAVES_CHERRY_FLOWERING;
+    public static Block LEAVES_CACAO;
+    public static Block LEAVES_THORN;
+    public static Block LEAVES_PALM;
+
+
+    public static Block SAPLING_OAK;
+    public static Block SAPLING_OAK_RETRO;
+    public static Block SAPLING_PINE;
+    public static Block SAPLING_BIRCH;
+    public static Block SAPLING_CHERRY;
+    public static Block SAPLING_EUCALYPTUS;
+    public static Block SAPLING_SHRUB;
+    public static Block SAPLING_CACAO;
+    public static Block SAPLING_THORN;
+    public static Block SAPLING_PALM;
+
+    public static Block TALLGRASS;
+    public static Block TALLGRASS_FERN;
+    public static Block DEADBUSH;
+    public static Block SPINIFEX;
+    public static Block ALGAE;
+
+    public static Block FLOWER_YELLOW;
+    public static Block FLOWER_RED;
+    public static Block FLOWER_PINK;
+    public static Block FLOWER_PURPLE;
+    public static Block FLOWER_LIGHT_BLUE;
+    public static Block FLOWER_ORANGE;
+
+    public static Block MUSHROOM_BROWN;
+    public static Block MUSHROOM_RED;
+
+    public static Block ORE_COAL_STONE;
+    public static Block ORE_COAL_BASALT;
+    public static Block ORE_COAL_LIMESTONE;
+    public static Block ORE_COAL_GRANITE;
+    public static Block ORE_COAL_PERMAFROST;
+
+    public static Block ORE_IRON_STONE;
+    public static Block ORE_IRON_BASALT;
+    public static Block ORE_IRON_LIMESTONE;
+    public static Block ORE_IRON_GRANITE;
+    public static Block ORE_IRON_PERMAFROST;
+
+    public static Block ORE_GOLD_STONE;
+    public static Block ORE_GOLD_BASALT;
+    public static Block ORE_GOLD_LIMESTONE;
+    public static Block ORE_GOLD_GRANITE;
+    public static Block ORE_GOLD_PERMAFROST;
+
+    public static Block ORE_LAPIS_STONE;
+    public static Block ORE_LAPIS_BASALT;
+    public static Block ORE_LAPIS_LIMESTONE;
+    public static Block ORE_LAPIS_GRANITE;
+    public static Block ORE_LAPIS_PERMAFROST;
+
+    public static Block ORE_REDSTONE_STONE;
+    public static Block ORE_REDSTONE_BASALT;
+    public static Block ORE_REDSTONE_LIMESTONE;
+    public static Block ORE_REDSTONE_GRANITE;
+    public static Block ORE_REDSTONE_PERMAFROST;
+
+    public static Block ORE_REDSTONE_GLOWING_STONE;
+    public static Block ORE_REDSTONE_GLOWING_BASALT;
+    public static Block ORE_REDSTONE_GLOWING_LIMESTONE;
+    public static Block ORE_REDSTONE_GLOWING_GRANITE;
+    public static Block ORE_REDSTONE_GLOWING_PERMAFROST ;
+
+    public static Block ORE_DIAMOND_STONE;
+    public static Block ORE_DIAMOND_BASALT;
+    public static Block ORE_DIAMOND_LIMESTONE;
+    public static Block ORE_DIAMOND_GRANITE;
+    public static Block ORE_DIAMOND_PERMAFROST;
+
+    public static Block ORE_NETHERCOAL_NETHERRACK;
+
+    public static Block BLOCK_COAL;
+    public static Block BLOCK_IRON;
+    public static Block BLOCK_GOLD;
+    public static Block BLOCK_LAPIS;
+    public static Block BLOCK_REDSTONE;
+    public static Block BLOCK_DIAMOND;
+    public static Block BLOCK_NETHER_COAL;
+    public static Block BLOCK_STEEL;
+    public static Block BLOCK_QUARTZ;
+    public static Block BLOCK_OLIVINE;
+    public static Block BLOCK_CHARCOAL;
+
+    public static Block WIRE_REDSTONE;
+
+    public static Block TORCH_REDSTONE_IDLE;
+    public static Block TORCH_REDSTONE_ACTIVE;
+
+    public static Block BUTTON_STONE;
+
+    public static Block LEVER_COBBLE_STONE;
+
+    public static Block PRESSURE_PLATE_STONE;
+    public static Block PRESSURE_PLATE_PLANKS_OAK;
+    public static Block PRESSURE_PLATE_COBBLE_STONE;
+
+    public static Block MOTION_SENSOR_IDLE;
+    public static Block MOTION_SENSOR_ACTIVE;
+
+    public static Block REPEATER_IDLE;
+    public static Block REPEATER_ACTIVE;
+
+    public static Block PISTON_BASE;
+    public static Block PISTON_BASE_STICKY;
+    public static Block PISTON_HEAD;
+    public static Block PISTON_MOVING;
+
+    public static Block NOTEBLOCK;
+
+    public static Block RAIL;
+    public static Block RAIL_POWERED;
+    public static Block RAIL_DETECTOR;
+
+    public static Block SPIKES;
+
+    public static Block DISPENSER_COBBLE_STONE;
+
+    public static Block TRAPDOOR_PLANKS_OAK;
+    public static Block TRAPDOOR_IRON;
+    public static Block TRAPDOOR_GLASS;
+    public static Block TRAPDOOR_PLANKS_PAINTED;
+
+    public static Block TNT;
+
+    public static Block DOOR_PLANKS_OAK_BOTTOM;
+    public static Block DOOR_PLANKS_OAK_TOP;
+    public static Block DOOR_IRON_BOTTOM;
+    public static Block DOOR_IRON_TOP;
+    public static Block DOOR_PLANKS_PAINTED_BOTTOM;
+    public static Block DOOR_PLANKS_PAINTED_TOP;
+    public static Block DOOR_GLASS_BOTTOM;
+    public static Block DOOR_GLASS_TOP;
+
+    public static Block MESH;
+    public static Block MESH_GOLD;
+
+    public static Block BED;
+    public static Block SEAT;
+
+    public static Block COBWEB;
+
+    public static Block FIRE;
+    public static Block BRAZIER_INACTIVE;
+    public static Block BRAZIER_ACTIVE;
+
+    public static Block MOBSPAWNER;
+    public static Block MOBSPAWNER_DEACTIVATED;
+
+    public static Block WORKBENCH;
+
+    public static Block FURNACE_STONE_IDLE;
+    public static Block FURNACE_STONE_ACTIVE;
+    public static Block FURNACE_BLAST_IDLE;
+    public static Block FURNACE_BLAST_ACTIVE;
+
+    public static Block TROMMEL_IDLE;
+    public static Block TROMMEL_ACTIVE;
+
+    public static Block CHEST_LEGACY;
+    public static Block CHEST_LEGACY_PAINTED;
+    public static Block CHEST_PLANKS_OAK;
+    public static Block CHEST_PLANKS_OAK_PAINTED;
+
+    public static Block CROPS_WHEAT;
+    public static Block CROPS_PUMPKIN;
+
+    public static Block FARMLAND_DIRT;
+
+    public static Block SIGN_POST_PLANKS_OAK;
+    public static Block SIGN_WALL_PLANKS_OAK;
+
+    public static Block FLAG;
+
+    public static Block LAYER_SNOW;
+    public static Block LAYER_LEAVES_OAK;
+    public static Block LAYER_SLATE;
+
+    public static Block ICE;
+    public static Block PERMAICE;
+
+    public static Block BLOCK_SNOW;
+
+    public static Block CACTUS;
+
+    public static Block BLOCK_CLAY;
+
+    public static Block SUGARCANE;
+    public static Block BLOCK_SUGARCANE;
+    public static Block BLOCK_SUGARCANE_BAKED;
+
+    public static Block JUKEBOX;
+
+    public static Block PUMPKIN;
+    public static Block PUMPKIN_CARVED_IDLE;
+    public static Block PUMPKIN_CARVED_ACTIVE;
+    public static Block PUMPKIN_REDSTONE;
+
+    public static Block NETHERRACK;
+    public static Block NETHERRACK_IGNEOUS;
+
+    public static Block SOULSAND;
+
+    public static Block GLOWSTONE;
+
+    public static Block PORTAL_NETHER;
+    public static Block PORTAL_PARADISE;
+
+    public static Block CAKE;
+    public static Block PUMPKIN_PIE;
+
+    public static Block LAMP_IDLE;
+    public static Block LAMP_ACTIVE;
+
+    public static Block LANTERN_FIREFLY_GREEN;
+    public static Block LANTERN_FIREFLY_BLUE;
+    public static Block LANTERN_FIREFLY_ORANGE;
+    public static Block LANTERN_FIREFLY_RED;
+    public static Block JAR_GLASS;
+
+    public static Block OVERLAY_PEBBLES;
+
+    public static Block FENCE_CHAINLINK;
+    public static Block FENCE_PAPER_WALL;
+
+    public static Block BASKET;
+
+    public static Block PAPER_WALL;
+
+    public static Block SLAB_BRICK_SANDSTONE;
+    public static Block SLAB_COBBLE_PERMAFROST;
+    public static Block SLAB_BRICK_PERMAFROST;
+    public static Block SLAB_PERMAFROST_POLISHED;
+
+    public static void init(){
+        setupBlocks();
+        MossBlock.initMossMap();
+
+        for(int i = 0; i < Block.blocksList.length; i++)
+        {
+            if(Block.blocksList[i] != null)
+            {
+                Block block = Block.blocksList[i];
+                if (Item.itemsList[i] == null){
+                    Item item = block.blockItemSupplier.get();
+                    if (block.statParent != null){
+                        item.setStatParent(block.statParent);
+                    }
+                    Item.itemsList[i] = item;
+                }
+                block.initializeBlock();
+            }
+        }
+
+        Block.translucent[0] = true;
+
+        MaterialColor.assignManualEntries();
+    }
+
+    public static void setupBlocks(){
+        STONE = new StoneBlock("stone", "minecraft:block/stone", 1, () -> Blocks.COBBLE_STONE, Material.stone).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+        BASALT = new StoneBlock("basalt", "minecraft:block/basalt", 2, () -> Blocks.COBBLE_BASALT, Material.basalt).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+        LIMESTONE = new StoneBlock("limestone", "minecraft:block/limestone", 3, () -> Blocks.COBBLE_LIMESTONE, Material.limestone).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+        GRANITE = new StoneBlock("granite", "minecraft:block/granite", 4, () -> Blocks.COBBLE_GRANITE, Material.granite).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+        MARBLE = new Block("marble", "minecraft:block/marble", 5, Material.marble).withSound(BlockSounds.STONE).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLATE = new Block("slate", "minecraft:block/slate", 6, Material.slate).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        PERMAFROST = new StoneBlock("permafrost", "minecraft:block/permafrost", 7, () -> Blocks.COBBLE_PERMAFROST, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+
+        COBBLE_STONE = new Block("cobble.stone", "minecraft:block/cobble_stone", 10, Material.stone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        COBBLE_STONE_MOSSY = new Block("cobble.stone.mossy", "minecraft:block/cobble_stone_mossy", 11, Material.stone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        COBBLE_BASALT = new Block("cobble.basalt", "minecraft:block/cobble_basalt", 12, Material.basalt).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        COBBLE_LIMESTONE = new Block("cobble.limestone", "minecraft:block/cobble_limestone", 13, Material.limestone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        COBBLE_GRANITE = new Block("cobble.granite", "minecraft:block/cobble_granite", 14, Material.granite).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        COBBLE_PERMAFROST = new Block("cobble.permafrost", "minecraft:block/cobble_permafrost", 15, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        STONE_POLISHED = new Block("stone.polished", "minecraft:block/stone_polished", 860, Material.stone).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        GRANITE_POLISHED = new Block("granite.polished", "minecraft:block/granite_polished", 861, Material.granite).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        LIMESTONE_POLISHED = new Block("limestone.polished", "minecraft:block/limestone_polished", 862, Material.limestone).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BASALT_POLISHED = new Block("basalt.polished", "minecraft:block/basalt_polished", 863, Material.basalt).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLATE_POLISHED = new Block("slate.polished", "minecraft:block/slate_polished", 864, Material.slate).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        PERMAFROST_POLISHED = new Block("permafrost.polished", "minecraft:block/permafrost_polished", 865, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        PILLAR_MARBLE = new AxisAlignedBlock("pillar.marble", "minecraft:block/pillar_marble", 20, Material.marble).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        CAPSTONE_MARBLE = new Block("capstone.marble", "minecraft:block/capstone_marble", 21, Material.marble).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        SANDSTONE = new Block("sandstone", "minecraft:block/sandstone", 30, Material.stone).withSound(BlockSounds.STONE).withHardness(0.8F).withOverrideColor(MaterialColor.sand)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+
+        STONE_CARVED = new Block("stone.carved", "minecraft:block/stone_carved", 40, Material.stone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        GRANITE_CARVED = new Block("granite.carved", "minecraft:block/granite_carved", 41, Material.granite).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        LIMESTONE_CARVED = new Block("limestone.carved", "minecraft:block/limestone_carved", 42, Material.limestone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        BASALT_CARVED = new Block("basalt.carved", "minecraft:block/basalt_carved", 43, Material.basalt).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        PERMAFROST_CARVED = new Block("permafrost.carved", "minecraft:block/permafrost_carved", 44, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(2.0F).withBlastResistance(10F).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        PLANKS_OAK = new Block("planks.oak", "minecraft:block/planks_oak", 50, Material.wood).withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        PLANKS_OAK_PAINTED = new PaintedPlanksBlock("planks.oak.painted", "minecraft:block/planks_oak_painted", 51).withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new PaintedBlockItem(b, false))
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        TORCH_COAL = new TorchBlock("torch.coal", "minecraft:block/torch_coal", 60).withSound(BlockSounds.WOOD).withHardness(0.0F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS);
+
+        LADDER_OAK = new LadderBlock("ladder.oak", "minecraft:block/ladder_oak", 70).withSound(BlockSounds.WOOD).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new LadderBlockItem((LadderBlock) b))
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+
+        FENCE_PLANKS_OAK = new FenceBlock("fence.planks.oak", "minecraft:block/fence_planks_oak", 80).withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
+        FENCE_PLANKS_OAK_PAINTED = new PaintedFenceBlock("fence.planks.oak.painted", "minecraft:block/fence_planks_oak_painted", 81).withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new PaintedBlockItem(b, false))
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
+
+        FENCE_GATE_PLANKS_OAK = new FenceGateBlock("fencegate.planks.oak", "minecraft:block/fence_gate_planks_oak", 90).withSound(BlockSounds.WOOD).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        FENCE_GATE_PLANKS_OAK_PAINTED = new PaintedFenceGateBlock("fencegate.planks.oak.painted", "minecraft:block/fence_gate_planks_oak_painted", 91).withSound(BlockSounds.WOOD).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new PaintedBlockItem(b, true))
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        BOOKSHELF_PLANKS_OAK = new Block("bookshelf.planks.oak", "minecraft:block/bookshelf_planks_oak", 100, Material.wood).withSound(BlockSounds.WOOD).withHardness(1.5F)
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        WOOL = new WoolBlock("wool", "minecraft:block/wool", 110).withSound(BlockSounds.CLOTH).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new PaintedBlockItem(b, false))
+            .withTags(BlockTags.MINEABLE_BY_SHEARS);
+        ROPE = new RopeBlock("rope", "minecraft:block/rope", 111).withSound(BlockSounds.CLOTH).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.ROPE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS, BlockTags.CAN_HANG_OFF);
+
+        BRICK_CLAY = new Block("brick.clay", "minecraft:block/brick_clay", 120, Material.stone).withSound(BlockSounds.STONE).withHardness(3.0F).withBlastResistance(10F).withOverrideColor(MaterialColor.brick)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_STONE_POLISHED = new Block("brick.stone.polished", "minecraft:block/brick_stone_polished", 121, Material.stone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_STONE_POLISHED_MOSSY = new Block("brick.stone.polished.mossy", "minecraft:block/brick_stone_polished_mossy", 122, Material.stone).withSound(BlockSounds.STONE).withHardness(2F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_SANDSTONE = new Block("brick.sandstone", "minecraft:block/brick_sandstone", 123, Material.stone).withSound(BlockSounds.STONE).withHardness(0.8F).withBlastResistance(10F).withOverrideColor(MaterialColor.sand)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_GOLD = new Block("brick.gold", "minecraft:block/brick_gold", 124, Material.metal).withSound(BlockSounds.METAL).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.gold)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_LAPIS = new Block("brick.lapis", "minecraft:block/brick_lapis", 125, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.lapis)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_BASALT = new Block("brick.basalt", "minecraft:block/brick_basalt", 126, Material.basalt).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_LIMESTONE = new Block("brick.limestone", "minecraft:block/brick_limestone", 127, Material.limestone).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_GRANITE = new Block("brick.granite", "minecraft:block/brick_granite", 128, Material.granite).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_MARBLE = new Block("brick.marble", "minecraft:block/brick_marble", 129, Material.marble).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_SLATE = new Block("brick.slate", "minecraft:block/brick_slate", 130, Material.slate).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_STONE = new Block("brick.stone", "minecraft:block/brick_stone", 131, Material.stone).withSound(BlockSounds.STONE).withHardness(1.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_PERMAFROST = new Block("brick.permafrost", "minecraft:block/brick_permafrost", 132, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(1.0F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRICK_IRON = new Block("brick.iron", "minecraft:block/brick_iron", 133, Material.metal).withSound(BlockSounds.METAL).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.iron)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        SLAB_PLANKS_OAK = new SlabBlock(PLANKS_OAK, "minecraft:block/slab_planks_oak", 140).withSound(BlockSounds.WOOD).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        SLAB_COBBLE_STONE = new SlabBlock(COBBLE_STONE, "minecraft:block/slab_cobble_stone", 141).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_SANDSTONE = new SlabBlock(SANDSTONE, "minecraft:block/slab_sandstone", 142).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_STONE_POLISHED = new SlabBlock(BRICK_STONE_POLISHED, "minecraft:block/slab_brick_stone_polished", 143).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_STONE_POLISHED = new SlabBlock(STONE_CARVED, "minecraft:block/slab_stone_polished", 144).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_MARBLE = new SlabBlock(BRICK_MARBLE, "minecraft:block/slab_brick_marble", 145).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_CLAY = new SlabBlock(BRICK_CLAY, "minecraft:block/slab_brick_clay", 146).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_CAPSTONE_MARBLE = new SlabBlock(CAPSTONE_MARBLE, "minecraft:block/slab_capstone_marble", 147).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_COBBLE_BASALT = new SlabBlock(COBBLE_BASALT, "minecraft:block/slab_cobble_basalt", 148).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_COBBLE_LIMESTONE = new SlabBlock(COBBLE_LIMESTONE, "minecraft:block/slab_cobble_limestone", 149).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_COBBLE_GRANITE = new SlabBlock(COBBLE_GRANITE, "minecraft:block/slab_cobble_granite", 150).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_BASALT = new SlabBlock(BRICK_BASALT, "minecraft:block/slab_brick_basalt", 151).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_LIMESTONE = new SlabBlock(BRICK_LIMESTONE, "minecraft:block/slab_brick_limestone", 152).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_GRANITE = new SlabBlock(BRICK_GRANITE, "minecraft:block/slab_brick_granite", 153).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_PLANKS_PAINTED = new PaintedSlabBlock(PLANKS_OAK_PAINTED, "minecraft:block/slab_planks_oak_painted", 154).withSound(BlockSounds.WOOD).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .setBlockItem(PaintedSlabBlockItem::new)
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        SLAB_BRICK_SLATE = new SlabBlock(BRICK_SLATE, "minecraft:block/slab_brick_slate", 155).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_STONE = new SlabBlock(BRICK_STONE, "minecraft:block/slab_brick_stone", 156).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_GRANITE_POLISHED = new SlabBlock(GRANITE_CARVED, "minecraft:block/slab_granite_carved", 157).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_LIMESTONE_POLISHED = new SlabBlock(LIMESTONE_CARVED, "minecraft:block/slab_limestone_carved", 158).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BASALT_POLISHED = new SlabBlock(BASALT_CARVED, "minecraft:block/slab_basalt_carved", 159).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        STAIRS_PLANKS_OAK = new StairsBlock(PLANKS_OAK, "minecraft:block/stairs_planks_oak", 160).withSound(BlockSounds.WOOD).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        STAIRS_COBBLE_STONE = new StairsBlock(COBBLE_STONE, "minecraft:block/stairs_cobble_stone", 161).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_STONE_POLISHED = new StairsBlock(BRICK_STONE_POLISHED, "minecraft:block/stairs_brick_stone_polished", 162).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_MARBLE = new StairsBlock(BRICK_MARBLE, "minecraft:block/stairs_brick_marble", 163).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_COBBLE_BASALT = new StairsBlock(COBBLE_BASALT, "minecraft:block/stairs_cobble_basalt", 164).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_COBBLE_LIMESTONE = new StairsBlock(COBBLE_LIMESTONE, "minecraft:block/stairs_cobble_limestone", 165).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_COBBLE_GRANITE = new StairsBlock(COBBLE_GRANITE, "minecraft:block/stairs_cobble_granite", 166).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_BASALT = new StairsBlock(BRICK_BASALT, "minecraft:block/stairs_brick_basalt", 167).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_LIMESTONE = new StairsBlock(BRICK_LIMESTONE, "minecraft:block/stairs_brick_limestone", 168).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_GRANITE = new StairsBlock(BRICK_GRANITE, "minecraft:block/stairs_brick_granite", 169).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_CLAY = new StairsBlock(BRICK_CLAY, "minecraft:block/stairs_brick_clay", 170).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_PLANKS_PAINTED = new StairsBlock(PLANKS_OAK_PAINTED, "minecraft:block/stairs_planks_oak_painted", 171).withSound(BlockSounds.WOOD).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .setBlockItem(BlockItemStairsPainted::new)
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        STAIRS_BRICK_SLATE = new StairsBlock(BRICK_SLATE, "minecraft:block/stairs_brick_slate", 172).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_STONE = new StairsBlock(BRICK_STONE, "minecraft:block/stairs_brick_stone", 173).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_SANDSTONE = new StairsBlock(SANDSTONE, "minecraft:block/stairs_sandstone", 174).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_SANDSTONE = new StairsBlock(BRICK_SANDSTONE, "minecraft:block/stairs_brick_sandstone", 175).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_COBBLE_PERMAFROST = new StairsBlock(COBBLE_PERMAFROST, "minecraft:block/stairs_cobble_permafrost", 176).withSound(BlockSounds.PERMAFROST).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        STAIRS_BRICK_PERMAFROST = new StairsBlock(BRICK_PERMAFROST, "minecraft:block/stairs_brick_permafrost", 177).withSound(BlockSounds.PERMAFROST).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        OBSIDIAN = new Block("obsidian", "minecraft:block/obsidian", 180, Material.stone).withSound(BlockSounds.STONE).withHardness(10F).withBlastResistance(2000F).withOverrideColor(MaterialColor.paintedBlack)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        GLASS = new GlassBlock("glass", "minecraft:block/glass", 190, Material.glass).withSound(BlockSounds.GLASS).withHardness(0.3F).withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.EXTENDS_MOTION_SENSOR_RANGE);
+        GLASS_TINTED = new TintedGlassBlock("glass.tinted", "minecraft:block/glass_tinted", 191).withSound(BlockSounds.GLASS).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange().withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        GRASS = new GrassBlock("grass", "minecraft:block/grass", 200, Material.grass).withSound(BlockSounds.GRASS).withHardness(0.6F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.CAVE_GEN_REPLACES_SURFACE);
+        GRASS_RETRO = new GrassBlock("grass.retro", "minecraft:block/grass_retro", 201, Material.grass).withSound(BlockSounds.GRASS).withHardness(0.6F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.CAVE_GEN_REPLACES_SURFACE);
+        GRASS_SCORCHED = new ScorchedGrassBlock("grass.scorched", "minecraft:block/grass_scorched", 202, Material.grass).withSound(BlockSounds.GRASS).withHardness(0.6F).withOverrideColor(MaterialColor.grassScorched)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.PASSIVE_MOBS_SPAWN, BlockTags.FIREFLIES_CAN_SPAWN, BlockTags.GROWS_CACTI, BlockTags.CAVE_GEN_REPLACES_SURFACE);
+
+        PATH_DIRT = new DirtPathBlock("path.dirt", "minecraft:block/path_dirt", 210).withSound(BlockSounds.GRAVEL).withHardness(0.5F).withLitInteriorSurface(true).withOverrideColor(MaterialColor.grassScorched)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
+
+        DIRT = new Block("dirt", "minecraft:block/dirt", 220, Material.dirt).withSound(BlockSounds.GRAVEL).withHardness(0.5F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH);
+        DIRT_SCORCHED = new Block("dirt.scorched", "minecraft:block/dirt_scorched", 221, Material.dirt).withSound(BlockSounds.GRAVEL).withHardness(0.5F).withOverrideColor(MaterialColor.dirtScorched)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH);
+        DIRT_SCORCHED_RICH = new Block("dirt.scorched.rich", "minecraft:block/dirt_scorched_rich", 222, Material.dirt).withSound(BlockSounds.GRAVEL).withHardness(0.6F).withOverrideColor(MaterialColor.dirtScorched)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.CAVES_CUT_THROUGH);
+
+        MUD = new MudBlock("mud", "minecraft:block/mud", 225, Material.dirt, false).withSound(BlockSounds.GRAVEL).withHardness(0.6F).withOverrideColor(MaterialColor.mud)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.GROWS_SUGAR_CANE);
+        MUD_BAKED = new MudBlock("mud.baked", "minecraft:block/mud_baked", 226, Material.stone, true).withSound(BlockSounds.STONE).withHardness(1.5F).withOverrideColor(MaterialColor.dirt)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_CACTI, BlockTags.GROWS_TREES, BlockTags.CAVES_CUT_THROUGH, BlockTags.GROWS_SUGAR_CANE);
+
+        SPONGE_DRY = new SpongeBlock("sponge.dry", "minecraft:block/sponge_dry", 230, false).withSound(BlockSounds.GRASS).withHardness(0.6F).withOverrideColor(MaterialColor.paintedYellow)
+            .withTags(BlockTags.MINEABLE_BY_SHEARS);
+        SPONGE_WET = new SpongeBlock("sponge.wet", "minecraft:block/sponge_wet", 231, true).withSound(BlockSounds.GRASS).withHardness(1.0F).withOverrideColor(MaterialColor.paintedYellow)
+            .withTags(BlockTags.MINEABLE_BY_SHEARS);
+
+        MOSS_STONE = new MossBlock("moss.stone", "minecraft:block/moss_stone", 240, STONE.id).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
+        MOSS_BASALT = new MossBlock("moss.basalt", "minecraft:block/moss_basalt", 241, BASALT.id).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
+        MOSS_LIMESTONE = new MossBlock("moss.limestone", "minecraft:block/moss_limestone", 242, LIMESTONE.id).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
+        MOSS_GRANITE = new MossBlock("moss.granite", "minecraft:block/moss_granite", 243, GRANITE.id).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.GROWS_FLOWERS, BlockTags.GROWS_SUGAR_CANE);
+
+        SAND = new SandBlock("sand", "minecraft:block/sand", 250).withSound(BlockSounds.SAND).withHardness(0.5F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.GROWS_SUGAR_CANE, BlockTags.GROWS_CACTI, BlockTags.CAVES_CUT_THROUGH, BlockTags.FIREFLIES_CAN_SPAWN);
+        GRAVEL = new GravelBlock("gravel", "minecraft:block/gravel", 251).withSound(BlockSounds.GRAVEL).withHardness(0.6F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
+
+        BEDROCK = new BedrockBlock("bedrock", "minecraft:block/bedrock", 260, Material.stone).withSound(BlockSounds.STONE).withSetUnbreakable().withBlastResistance(6000000F);
+
+        FLUID_WATER_FLOWING = new FlowingFluidBlock("fluid.water.flowing", "minecraft:block/fluid_water_flowing", 270, Material.water).withHardness(100F).withLightBlock(3).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats()
+            .withTags(BlockTags.IS_WATER, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+        FLUID_WATER_STILL = new StillFluidBlock("fluid.water.still", "minecraft:block/fluid_water_still", 271, Material.water).withHardness(100F).withLightBlock(3).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats().setStatParent(() -> FLUID_WATER_FLOWING)
+            .withTags(BlockTags.IS_WATER, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+        FLUID_LAVA_FLOWING = new FlowingFluidBlock("fluid.lava.flowing", "minecraft:block/fluid_lava_flowing", 272, Material.lava).withHardness(0.0F).withLightEmission(1.0F).withLightBlock(255).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats()
+            .withTags(BlockTags.IS_LAVA, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+        FLUID_LAVA_STILL = new StillFluidBlock("fluid.lava.still", "minecraft:block/fluid_lava_still", 273, Material.lava).withHardness(100F).withLightEmission(1.0F).withLightBlock(255).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats().setStatParent(() -> FLUID_LAVA_FLOWING)
+            .withTags(BlockTags.IS_LAVA, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+
+        LOG_OAK = new LogBlock("log.oak", "minecraft:block/log_oak", 280).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_PINE = new LogBlock("log.pine", "minecraft:block/log_pine", 281).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_BIRCH = new LogBlock("log.birch", "minecraft:block/log_birch", 282).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_CHERRY = new LogBlock("log.cherry", "minecraft:block/log_cherry", 283).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_EUCALYPTUS = new LogBlock("log.eucalyptus", "minecraft:block/log_eucalyptus", 284).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_OAK_MOSSY = new LogBlock("log.oak.mossy", "minecraft:block/log_oak_mossy", 285).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_THORN = new LogBlock("log.thorn", "minecraft:block/log_thorn", 286).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        LOG_PALM = new LogBlock("log.palm", "minecraft:block/log_palm", 287).withSound(BlockSounds.WOOD).withHardness(2.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        LEAVES_OAK = new OakLeavesBlock("leaves.oak", "minecraft:block/leaves_oak", 290).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_OAK_RETRO = new RetroLeavesBlock("leaves.oak.retro", "minecraft:block/leaves_oak_retro", 291).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_PINE = new PineLeavesBlock("leaves.pine", "minecraft:block/leaves_pine", 292).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.pineLeaves)
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_BIRCH = new BirchLeavesBlock("leaves.birch", "minecraft:block/leaves_birch", 293).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.birchLeaves)
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_CHERRY = new CherryLeavesBlock("leaves.cherry", "minecraft:block/leaves_cherry", 294).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.cherryLeaves)
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_EUCALYPTUS = new EucalyptusLeavesBlock("leaves.eucalyptus", "minecraft:block/leaves_eucalyptus", 295).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_SHRUB = new ShrubLeavesBlock("leaves.shrub", "minecraft:block/leaves_shrub", 296).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_CHERRY_FLOWERING = new FloweringCherryLeavesBlock("leaves.cherry.flowering", "minecraft:block/leaves_cherry_flowering", 297).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.cherryLeaves)
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_CACAO = new CacaoLeavesBlock("leaves.cacao", "minecraft:block/leaves_cacao", 298).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_THORN = new ThornLeavesBlock("leaves.thorn", "minecraft:block/leaves_thorn", 299).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.thornLeaves)
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+        LEAVES_PALM = new PalmLeavesBlock("leaves.palm", "minecraft:block/leaves_palm", 300).withSound(BlockSounds.GRASS).withHardness(0.2F).withLightBlock(1).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.palmLeaves)
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_SHEARS);
+
+
+        SAPLING_OAK = new SaplingOakBlock("sapling.oak", "minecraft:block/sapling_oak", 310).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_OAK_RETRO = new SaplingRetroBlock("sapling.oak.retro", "minecraft:block/sapling_oak_retro", 311).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_PINE = new SaplingPineBlock("sapling.pine", "minecraft:block/sapling_pine", 312).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_BIRCH = new SaplingBirchBlock("sapling.birch", "minecraft:block/sapling_birch", 313).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_CHERRY = new SaplingCherryBlock("sapling.cherry", "minecraft:block/sapling_cherry", 314).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_EUCALYPTUS = new SaplingEucalyptusBlock("sapling.eucalyptus", "minecraft:block/sapling_eucalyptus", 315).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_SHRUB = new SaplingShrubBlock("sapling.shrub", "minecraft:block/sapling_shrub", 316).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_CACAO = new SaplingCacaoBlock("sapling.cacao", "minecraft:block/sapling_cacao", 317).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_THORN = new SaplingThornBlock("sapling.thorn", "minecraft:block/sapling_thorn", 318).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        SAPLING_PALM = new SaplingPalmBlock("sapling.palm", "minecraft:block/sapling_palm", 319).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+
+        TALLGRASS = new TallGrassBlock("tallgrass", "minecraft:block/tallgrass", 320).setKilledByWeather().withSound(BlockSounds.GRASS).withHardness(0.0F)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
+        TALLGRASS_FERN = new TallGrassBlock("tallgrass.fern", "minecraft:block/tallgrass_fern", 321).setKilledByWeather().withSound(BlockSounds.GRASS).withHardness(0.0F)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
+        DEADBUSH = new DeadBushBlock("deadbush", "minecraft:block/deadbush", 322).withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.wood)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
+        SPINIFEX = new SpinifexBlock("spinifex", "minecraft:block/spinifex", 323).withSound(BlockSounds.GRASS).withHardness(0.0F)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
+        ALGAE = new AlgaeBlock("algae", "minecraft:block/algae", 324, Material.plant).withSound(BlockSounds.GRASS).withHardness(0.0F).withLitInteriorSurface(true)
+            .setBlockItem((b) -> new AlgaeBlockItem(b))
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
+
+        FLOWER_YELLOW = new FlowerBlock("flower.yellow", "minecraft:block/flower_yellow", 330).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedYellow)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        FLOWER_RED = new FlowerBlock("flower.red", "minecraft:block/flower_red", 331).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedRed)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        FLOWER_PINK = new FlowerBlock("flower.pink", "minecraft:block/flower_pink", 332).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedPink)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        FLOWER_PURPLE = new FlowerBlock("flower.purple", "minecraft:block/flower_purple", 333).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedPurple)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        FLOWER_LIGHT_BLUE = new FlowerBlock("flower.lightblue", "minecraft:block/flower_light_blue", 334).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedLightblue)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        FLOWER_ORANGE = new FlowerBlock("flower.orange", "minecraft:block/flower_orange", 335).setKilledByWeather().setBonemealable().withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedOrange)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+
+        MUSHROOM_BROWN = new MushroomBlock("mushroom.brown", "minecraft:block/mushroom_brown", 340).withSound(BlockSounds.GRASS).withHardness(0.0F).withLightEmission(0.125F).withOverrideColor(MaterialColor.paintedBrown)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+        MUSHROOM_RED = new MushroomBlock("mushroom.red", "minecraft:block/mushroom_red", 341).withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedRed)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
+
+
+        ORE_COAL_STONE = new CoalOreBlock("ore.coal.stone", "minecraft:block/ore_coal_stone", 350, STONE.id, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_COAL_BASALT = new CoalOreBlock("ore.coal.basalt", "minecraft:block/ore_coal_basalt", 351, BASALT.id, Material.basalt).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_COAL_LIMESTONE = new CoalOreBlock("ore.coal.limestone", "minecraft:block/ore_coal_limestone", 352, LIMESTONE.id, Material.limestone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_COAL_GRANITE = new CoalOreBlock("ore.coal.granite", "minecraft:block/ore_coal_granite", 353, GRANITE.id, Material.granite).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_COAL_PERMAFROST = new CoalOreBlock("ore.coal.permafrost", "minecraft:block/ore_coal_permafrost", 354, PERMAFROST.id, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_IRON_STONE = new IronOreBlock("ore.iron.stone", "minecraft:block/ore_iron_stone", 360, STONE.id, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_IRON_BASALT = new IronOreBlock("ore.iron.basalt", "minecraft:block/ore_iron_basalt", 361, BASALT.id, Material.basalt).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_IRON_LIMESTONE = new IronOreBlock("ore.iron.limestone", "minecraft:block/ore_iron_limestone", 362, LIMESTONE.id, Material.limestone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_IRON_GRANITE = new IronOreBlock("ore.iron.granite", "minecraft:block/ore_iron_granite", 363, GRANITE.id, Material.granite).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_IRON_PERMAFROST = new IronOreBlock("ore.iron.permafrost", "minecraft:block/ore_iron_permafrost", 364, PERMAFROST.id, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_GOLD_STONE = new GoldOreBlock("ore.gold.stone", "minecraft:block/ore_gold_stone", 370, STONE.id, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_GOLD_BASALT = new GoldOreBlock("ore.gold.basalt", "minecraft:block/ore_gold_basalt", 371, BASALT.id, Material.basalt).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_GOLD_LIMESTONE = new GoldOreBlock("ore.gold.limestone", "minecraft:block/ore_gold_limestone", 372, LIMESTONE.id, Material.limestone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_GOLD_GRANITE = new GoldOreBlock("ore.gold.granite", "minecraft:block/ore_gold_granite", 373, GRANITE.id, Material.granite).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_GOLD_PERMAFROST = new GoldOreBlock("ore.gold.permafrost", "minecraft:block/ore_gold_permafrost",374, PERMAFROST.id, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_LAPIS_STONE = new LapisOreBlock("ore.lapis.stone", "minecraft:block/ore_lapis_stone", 380, STONE.id, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_LAPIS_BASALT = new LapisOreBlock("ore.lapis.basalt", "minecraft:block/ore_lapis_basalt", 381, BASALT.id, Material.basalt).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_LAPIS_LIMESTONE = new LapisOreBlock("ore.lapis.limestone", "minecraft:block/ore_lapis_limestone", 382, LIMESTONE.id, Material.limestone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_LAPIS_GRANITE = new LapisOreBlock("ore.lapis.granite", "minecraft:block/ore_lapis_granite", 383, GRANITE.id, Material.granite).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_LAPIS_PERMAFROST = new LapisOreBlock("ore.lapis.permafrost", "minecraft:block/ore_lapis_permafrost", 384, PERMAFROST.id, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_REDSTONE_STONE = new RedstoneOreBlock("ore.redstone.stone", "minecraft:block/ore_redstone_stone", 390, STONE.id, Material.stone, false, () -> ORE_REDSTONE_STONE, () -> ORE_REDSTONE_GLOWING_STONE).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_BASALT = new RedstoneOreBlock("ore.redstone.basalt", "minecraft:block/ore_redstone_basalt", 391, BASALT.id, Material.basalt, false, () -> ORE_REDSTONE_BASALT, () -> ORE_REDSTONE_GLOWING_BASALT).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_LIMESTONE = new RedstoneOreBlock("ore.redstone.limestone", "minecraft:block/ore_redstone_limestone", 392, LIMESTONE.id, Material.limestone, false, () -> ORE_REDSTONE_LIMESTONE, () -> ORE_REDSTONE_GLOWING_LIMESTONE).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_GRANITE = new RedstoneOreBlock("ore.redstone.granite", "minecraft:block/ore_redstone_granite", 393, GRANITE.id, Material.granite, false, () -> ORE_REDSTONE_GRANITE, () -> ORE_REDSTONE_GLOWING_GRANITE).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_PERMAFROST = new RedstoneOreBlock("ore.redstone.permafrost", "minecraft:block/ore_redstone_permafrost", 394, PERMAFROST.id, Material.permafrost, false, () -> ORE_REDSTONE_PERMAFROST, () -> ORE_REDSTONE_GLOWING_PERMAFROST).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_REDSTONE_GLOWING_STONE = new RedstoneOreBlock("ore.redstone.glowing.stone", "minecraft:block/ore_redstone_glowing_stone", 400, -1, Material.stone, true, () -> ORE_REDSTONE_STONE, () -> ORE_REDSTONE_GLOWING_STONE).withSound(BlockSounds.STONE).withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> ORE_REDSTONE_STONE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_GLOWING_BASALT = new RedstoneOreBlock("ore.redstone.glowing.basalt", "minecraft:block/ore_redstone_glowing_basalt", 401, -1, Material.basalt, true, () -> ORE_REDSTONE_BASALT, () -> ORE_REDSTONE_GLOWING_BASALT).withSound(BlockSounds.STONE).withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> ORE_REDSTONE_BASALT)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_GLOWING_LIMESTONE = new RedstoneOreBlock("ore.redstone.glowing.limestone", "minecraft:block/ore_redstone_glowing_limestone", 402, -1, Material.limestone, true, () -> ORE_REDSTONE_LIMESTONE, () -> ORE_REDSTONE_GLOWING_LIMESTONE).withSound(BlockSounds.STONE).withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> ORE_REDSTONE_LIMESTONE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_GLOWING_GRANITE = new RedstoneOreBlock("ore.redstone.glowing.granite", "minecraft:block/ore_redstone_glowing_granite", 403, -1, Material.granite, true, () -> ORE_REDSTONE_GRANITE, () -> ORE_REDSTONE_GLOWING_GRANITE).withSound(BlockSounds.STONE).withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> ORE_REDSTONE_GRANITE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_REDSTONE_GLOWING_PERMAFROST = new RedstoneOreBlock("ore.redstone.glowing.permafrost", "minecraft:block/ore_redstone_glowing_permafrost", 404, -1, Material.permafrost, true, () -> ORE_REDSTONE_PERMAFROST, () -> ORE_REDSTONE_GLOWING_PERMAFROST).withSound(BlockSounds.PERMAFROST).withLightEmission(0.2F).withHardness(3F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> ORE_REDSTONE_PERMAFROST)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_DIAMOND_STONE = new DiamondOreBlock("ore.diamond.stone", "minecraft:block/ore_diamond_stone", 410, STONE.id, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_DIAMOND_BASALT = new DiamondOreBlock("ore.diamond.basalt", "minecraft:block/ore_diamond_basalt", 411, BASALT.id, Material.basalt).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_DIAMOND_LIMESTONE = new DiamondOreBlock("ore.diamond.limestone", "minecraft:block/ore_diamond_limestone", 412, LIMESTONE.id, Material.limestone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_DIAMOND_GRANITE = new DiamondOreBlock("ore.diamond.granite", "minecraft:block/ore_diamond_granite", 413, GRANITE.id, Material.granite).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ORE_DIAMOND_PERMAFROST = new DiamondOreBlock("ore.diamond.permafrost", "minecraft:block/ore_diamond_permafrost", 414, PERMAFROST.id, Material.permafrost).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ORE_NETHERCOAL_NETHERRACK = new NetherCoalOreBlock("ore.nethercoal.netherrack", "minecraft:block/ore_nethercoal_netherrack", 420).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F).withLightEmission(0.625F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        BLOCK_COAL = new Block("block.coal", "minecraft:block/block_coal", 430, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.coal)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_IRON = new Block("block.iron", "minecraft:block/block_iron", 431, Material.metal).withSound(BlockSounds.METAL).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.iron)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_GOLD = new Block("block.gold", "minecraft:block/block_gold", 432, Material.metal).withSound(BlockSounds.METAL).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.gold)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_LAPIS = new Block("block.lapis", "minecraft:block/block_lapis", 433, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(5F).withOverrideColor(MaterialColor.lapis)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_REDSTONE = new RedstoneBlock("block.redstone", "minecraft:block/block_redstone", 434, Material.stone).withSound(BlockSounds.STONE).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.redstone)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_DIAMOND = new Block("block.diamond", "minecraft:block/block_diamond", 435, Material.stone).withSound(BlockSounds.STONE).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.diamond)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_NETHER_COAL = new Block("block.nethercoal", "minecraft:block/block_nethercoal", 436, Material.netherrack).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_STEEL = new Block("block.steel", "minecraft:block/block_steel", 437, Material.metal).withSound(BlockSounds.METAL).withHardness(5F).withBlastResistance(2000F).withOverrideColor(MaterialColor.steel)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_QUARTZ = new Block("block.quartz", "minecraft:block/block_quartz", 438, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.quartz)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_OLIVINE = new Block("block.olivine", "minecraft:block/block_olivine", 439, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.olivine)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BLOCK_CHARCOAL = new Block("block.charcoal", "minecraft:block/block_charcoal", 440, Material.stone).withSound(BlockSounds.STONE).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.coal)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        WIRE_REDSTONE = new RedstoneWireBlock("wire.redstone", "minecraft:block/wire_redstone", 450).withSound(BlockSounds.STONE).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.redstone).setStatParent(() -> Items.DUST_REDSTONE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
+
+        TORCH_REDSTONE_IDLE = new RedstoneTorchBlock("torch.redstone.idle", "minecraft:block/torch_redstone_idle", 460, false).withSound(BlockSounds.WOOD).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.redstone).setStatParent(() -> TORCH_REDSTONE_ACTIVE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
+        TORCH_REDSTONE_ACTIVE = new RedstoneTorchBlock("torch.redstone.active", "minecraft:block/torch_redstone_active", 461, true).withSound(BlockSounds.WOOD).withHardness(0.0F).withLightEmission(0.5F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.redstone)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PREVENT_MOB_SPAWNS);
+
+        BUTTON_STONE = new ButtonBlock("button.stone", "minecraft:block/button_stone", 470).withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
+        LEVER_COBBLE_STONE = new LeverBlock("lever.cobble.stone", "minecraft:block/lever_cobble_stone", 480).withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
+        PRESSURE_PLATE_STONE = new PressurePlateBlock("pressureplate.stone", "minecraft:block/pressure_plate_stone", 490, Mob.class, Material.stone).withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+        PRESSURE_PLATE_PLANKS_OAK = new PressurePlateBlock("pressureplate.planks.oak", "minecraft:block/pressure_plate_planks_oak", 491, Entity.class, Material.wood).withSound(BlockSounds.WOOD).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.PREVENT_MOB_SPAWNS);
+        PRESSURE_PLATE_COBBLE_STONE = new PressurePlateBlock("pressureplate.cobble.stone", "minecraft:block/pressure_plate_cobble_stone", 492, Player.class, Material.stone).withSound(BlockSounds.STONE).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
+        MOTION_SENSOR_IDLE = new MotionSensorBlock("motionsensor.idle", "minecraft:block/motion_sensor_idle", 500, false).withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet().withOverrideColor(MaterialColor.stone)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        MOTION_SENSOR_ACTIVE = new MotionSensorBlock("motionsensor.active", "minecraft:block/motion_sensor_active", 501, true).withSound(BlockSounds.STONE).withLightEmission(0.3F).withHardness(2.0F).withBlastResistance(10F).withImmovableFlagSet().withOverrideColor(MaterialColor.stone).setStatParent(() -> MOTION_SENSOR_IDLE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        REPEATER_IDLE = new RepeaterBlock("repeater.idle", "minecraft:block/repeater_idle", 510, false).withSound(BlockSounds.STONE).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.redstone).setStatParent(() -> Items.REPEATER)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
+        REPEATER_ACTIVE = new RepeaterBlock("repeater.active", "minecraft:block/repeater_active", 511, true).withSound(BlockSounds.STONE).withHardness(0.0F).withLightEmission(0.625F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.redstone).setStatParent(() -> REPEATER_IDLE)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS);
+
+        PISTON_BASE = new BasePistonBlock("piston.base", "minecraft:block/piston_base", 520, false).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        PISTON_BASE_STICKY = new BasePistonBlock("piston.base.sticky", "minecraft:block/piston_base_sticky", 521, true).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        PISTON_HEAD = new PistonHeadBlock("piston.head", "minecraft:block/piston_head", 522).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        PISTON_MOVING = new MovingPistonBlock("piston.moving", "minecraft:block/piston_moving", 523).withSound(BlockSounds.STONE).withDisabledStats()
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU);
+
+        NOTEBLOCK = new NoteBlock("noteblock", "minecraft:block/noteblock", 530).withSound(BlockSounds.WOOD).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+
+        RAIL = new RailBlock("rail", "minecraft:block/rail", 540, false).withSound(BlockSounds.METAL).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+        RAIL_POWERED = new RailBlock("rail.powered", "minecraft:block/rail_powered", 541, true).withSound(BlockSounds.METAL).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+        RAIL_DETECTOR = new DetectorRailBlock("rail.detector", "minecraft:block/rail_detector", 542).withSound(BlockSounds.METAL).withHardness(0.7F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.PREVENT_MOB_SPAWNS);
+
+        SPIKES = new SpikesBlock("spikes", "minecraft:block/spikes", 550, Material.metal).withSound(BlockSounds.METAL).withLightBlock(3).withHardness(2F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        DISPENSER_COBBLE_STONE = new DispenserBlock("dispenser.cobble.stone", "minecraft:block/dispenser_cobble_stone", 560).withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);;
+
+        TRAPDOOR_PLANKS_OAK = new TrapDoorBlock("trapdoor.planks.oak", "minecraft:block/trapdoor_planks_oak", 570, Material.wood, false).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        TRAPDOOR_IRON = new TrapDoorBlock("trapdoor.iron", "minecraft:block/trapdoor_iron", 571, Material.metal, true).withSound(BlockSounds.METAL).withHardness(5F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.iron)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        TRAPDOOR_GLASS = new TrapDoorBlock("trapdoor.glass", "minecraft:block/trapdoor_glass", 572, Material.glass, false).withSound(BlockSounds.GLASS).withHardness(0.3F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        TRAPDOOR_PLANKS_PAINTED = new PaintedTrapDoorBlock("trapdoor.planks.oak.painted", "minecraft:block/trapdoor_planks_oak_painted", 573, Material.wood).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new PaintedBlockItem(b, true))
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+
+        TNT = new TNTBlock("tnt", "minecraft:block/tnt", 580).withSound(BlockSounds.GRASS).withHardness(0.0F);
+
+        DOOR_PLANKS_OAK_BOTTOM = new DoorBlock("door.planks.oak.bottom", "minecraft:block/door_planks_oak_bottom", 590, Material.wood, false).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.DOOR_OAK)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        DOOR_PLANKS_OAK_TOP = new DoorBlock("door.planks.oak.top", "minecraft:block/doors_planks_oak_top", 591, Material.wood, true).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> DOOR_PLANKS_OAK_BOTTOM)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        DOOR_IRON_BOTTOM = new DoorBlock("door.iron.bottom", "minecraft:block/door_iron_bottom", 592, Material.metal, false).withSound(BlockSounds.METAL).withHardness(5F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.iron).setStatParent(() -> Items.DOOR_IRON)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        DOOR_IRON_TOP = new DoorBlock("door.iron.top", "minecraft:block/door_iron_top", 593, Material.metal, true).withSound(BlockSounds.METAL).withHardness(5F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.iron).setStatParent(() -> DOOR_IRON_BOTTOM)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        DOOR_PLANKS_PAINTED_BOTTOM = new DoorPaintedBlock("door.planks.oak.painted.bottom", "minecraft:block/door_planks_oak_painted_bottom", 594, Material.wood, false).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.DOOR_OAK_PAINTED)
+            .setBlockItem((b) -> new PaintedBlockItem(b, true))
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        DOOR_PLANKS_PAINTED_TOP = new DoorPaintedBlock("door.planks.oak.painted.top", "minecraft:block/door_planks_oak_painted_top", 595, Material.wood, true).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> DOOR_PLANKS_PAINTED_BOTTOM)
+            .setBlockItem((b) -> new PaintedBlockItem(b, true))
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        DOOR_GLASS_BOTTOM = new GlassDoorBlock("door.glass.bottom", "minecraft:block/door_glass_bottom", 596, Material.glass, false).withSound(BlockSounds.GLASS).withHardness(0.3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.DOOR_GLASS)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        DOOR_GLASS_TOP = new GlassDoorBlock("door.glass.top", "minecraft:block/door_glass_top", 597, Material.glass, true).withSound(BlockSounds.GLASS).withHardness(0.3F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> DOOR_GLASS_BOTTOM)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        MESH = new MeshBlock("mesh", "minecraft:block/mesh", 600).withSound(BlockSounds.METAL).withHardness(1.5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CAN_HANG_OFF);
+        MESH_GOLD = new GoldMeshBlock("mesh.gold", "minecraft:block/mesh_gold", 601).withSound(BlockSounds.METAL).withHardness(1F).withOverrideColor(MaterialColor.gold)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CAN_HANG_OFF);
+
+        BED = new BedBlock("bed", "minecraft:block/bed", 610).withSound(BlockSounds.WOOD).withHardness(0.2F).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true).setStatParent(() -> Items.BED)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        SEAT = new SeatBlock("seat", "minecraft:block/seat", 611).withSound(BlockSounds.WOOD).withHardness(0.2F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.SEAT)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+
+        COBWEB = new CobwebBlock("cobweb", "minecraft:block/cobweb", 620, Material.web).withSound(BlockSounds.CLOTH).withLightBlock(1).withHardness(4F)
+            .withTags(BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_SWORD);
+
+        FIRE = new FireBlock("fire", "minecraft:block/fire", 630).withSound(BlockSounds.FIRE).withHardness(0.0F).withLightEmission(1.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.NOT_IN_CREATIVE_MENU);
+        BRAZIER_INACTIVE = new BrazierBlock("brazier.inactive", "minecraft:block/brazier_inactive", 631, false).withSound(BlockSounds.METAL).withHardness(1.5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        BRAZIER_ACTIVE = new BrazierBlock("brazier.active", "minecraft:block/brazier_active", 632, true).withSound(BlockSounds.FIRE).withHardness(1.5F).withLightEmission(1.0F).setStatParent(() -> BRAZIER_INACTIVE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        MOBSPAWNER = new MobSpawnerBlock("mobspawner", "minecraft:block/mobspawner", 640).withSound(BlockSounds.METAL).withHardness(5F).withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        MOBSPAWNER_DEACTIVATED = new MobSpawnerDeactivatedBlock("mobspawner.deactivated", "minecraft:block/mobspawner_deactivated", 641, Material.stone).withSound(BlockSounds.METAL).withHardness(5F).withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        WORKBENCH = new WorkbenchBlock("workbench", "minecraft:block/workbench", 650).withSound(BlockSounds.WOOD).withHardness(2.5F)
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        FURNACE_STONE_IDLE = new FurnaceBlock("furnace.stone.idle", "minecraft:block/furnace_stone_idle", 660, false).withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        FURNACE_STONE_ACTIVE = new FurnaceBlock("furnace.stone.active", "minecraft:block/furnace_stone_active", 661, true).withSound(BlockSounds.STONE).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet().setStatParent(() -> FURNACE_STONE_IDLE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+        FURNACE_BLAST_IDLE = new BlastFurnaceBlock("furnace.blast.idle", "minecraft:block/furnace_blast_idle", 662, false).withSound(BlockSounds.METAL).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet().withOverrideColor(MaterialColor.steel)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        FURNACE_BLAST_ACTIVE = new BlastFurnaceBlock("furnace.blast.active", "minecraft:block/furnace_blast_active", 663, true).withSound(BlockSounds.METAL).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet().withOverrideColor(MaterialColor.steel).setStatParent(() -> FURNACE_BLAST_IDLE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        TROMMEL_IDLE = new TrommelBlock("trommel.idle", "minecraft:block/trommel_idle", 670, Material.stone, false).withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        TROMMEL_ACTIVE = new TrommelBlock("trommel.active", "minecraft:block/trommel_active", 671, Material.stone, true).withSound(BlockSounds.STONE).withHardness(3.5F).withLightEmission(0.875F).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet().setStatParent(() -> TROMMEL_IDLE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        CHEST_LEGACY = new LegacyChestBlock("chest.legacy", "minecraft:block/chest_legacy", 680).withSound(BlockSounds.WOOD).withHardness(2.5f).withBlastResistance(5.0f).setStatParent(() -> CHEST_PLANKS_OAK)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        CHEST_LEGACY_PAINTED = new LegacyChestBlock("chest.legacy.painted", "minecraft:block/chest_legacy_painted", 681).withSound(BlockSounds.WOOD).withHardness(2.5f).withBlastResistance(5.0f).setStatParent(() -> CHEST_PLANKS_OAK_PAINTED)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        CHEST_PLANKS_OAK = new ChestBlock("chest.planks.oak", "minecraft:block/chest_planks_oak", 682, Material.wood).withSound(BlockSounds.WOOD).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+        CHEST_PLANKS_OAK_PAINTED = new ChestBlockPainted("chest.planks.oak.painted", "minecraft:block/chest_planks_oak_painted", 683, Material.wood).withSound(BlockSounds.WOOD).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .setBlockItem((b) -> new PaintedBlockItem(b, true))
+            .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
+
+        CROPS_WHEAT = new CropsWheatBlock("crops.wheat", "minecraft:block/crops_wheat", 690).withSound(BlockSounds.GRASS).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.SEEDS_WHEAT)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+        CROPS_PUMPKIN = new CropsPumpkinBlock("crops.pumpkin", "minecraft:block/crops_pumpkin", 691).withSound(BlockSounds.WOOD).withHardness(0.0f).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true).setStatParent(() -> Items.SEEDS_PUMPKIN)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.OVERRIDE_STEPSOUND);
+
+        FARMLAND_DIRT = new FarmlandBlock("farmland.dirt", "minecraft:block/farmland_dirt", 700).withSound(BlockSounds.GRAVEL).withHardness(0.6F).withLitInteriorSurface(true).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
+
+        SIGN_POST_PLANKS_OAK = new SignBlock("sign.post.planks.oak", "minecraft:block/sign_post_planks_oak", 710, true).withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.SIGN)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+        SIGN_WALL_PLANKS_OAK = new SignBlock("sign.wall.planks.oak", "minecraft:block/sign_wall_planks_oak", 711, false).withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> SIGN_POST_PLANKS_OAK)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+
+        FLAG = new FlagBlock("flag", "minecraft:block/flag", 712, Material.wood).withSound(BlockSounds.WOOD).withHardness(1.0F).setStatParent(() -> Items.FLAG)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+
+        LAYER_SNOW = new SnowLayerBlock("layer.snow", "minecraft:block/layer_snow", 720, Material.topSnow).setFullBlockID(() -> Blocks.BLOCK_SNOW.id).withSound(BlockSounds.CLOTH).withHardness(0.1F).withLitInteriorSurface(true)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.OVERRIDE_STEPSOUND);
+        LAYER_LEAVES_OAK = new LeavesLayerBlock("layer.leaves.oak", "minecraft:block/layer_leaves_oak", 721, Material.leaves).setFullBlockID(() -> LEAVES_OAK.id).withSound(BlockSounds.GRASS).withLitInteriorSurface(true)
+            .setBlockItem(LeavesLayerBlockItem::new)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE);
+        LAYER_SLATE = new SlateLayerBlock("layer.slate", "minecraft:block/layer_slate", 722, Material.slate).setFullBlockID(() -> SLATE.id).withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        ICE = new IceBlock("ice", "minecraft:block/ice", 730).withSound(BlockSounds.GLASS).withHardness(0.5F).withLightBlock(3)
+            .withTags(BlockTags.SKATEABLE, BlockTags.MINEABLE_BY_PICKAXE);
+        PERMAICE = new SlipperyBlock("ice.perma", "minecraft:block/permaice", 731, Material.ice).withSound(BlockSounds.GLASS).withHardness(1.5F).withBlastResistance(10F)
+            .withTags(BlockTags.SKATEABLE, BlockTags.MINEABLE_BY_PICKAXE);
+
+        BLOCK_SNOW = new SnowBlock("block.snow", "minecraft:block/block_snow", 740).withSound(BlockSounds.CLOTH).withHardness(0.2F)
+            .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.FIREFLIES_CAN_SPAWN);
+
+        CACTUS = new CactusBlock("cactus", "minecraft:block/cactus", 750).withSound(BlockSounds.GRASS).withHardness(0.4F)
+            .withTags(BlockTags.GROWS_CACTI, BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_HOE);
+
+        BLOCK_CLAY = new ClayBlock("block.clay", "minecraft:block/block_clay", 760).withSound(BlockSounds.GRAVEL).withHardness(0.6F)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
+
+        SUGARCANE = new SugarcaneBlock("sugarcane", "minecraft:block/sugarcane", 770).withSound(BlockSounds.GRASS).withHardness(0.0F).withOverrideColor(MaterialColor.paintedLime).setStatParent(() -> Items.SUGARCANE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+        BLOCK_SUGARCANE = new AxisAlignedBlock("block.sugarcane", "minecraft:block/block_sugarcane", 771, Material.moss).withSound(BlockSounds.GRASS).withHardness(0.6F).withOverrideColor(MaterialColor.paintedLime)
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.FENCES_CONNECT);
+        BLOCK_SUGARCANE_BAKED = new AxisAlignedBlock("block.sugarcane.baked", "minecraft:block/block_sugarcane_baked", 772, Material.moss).withSound(BlockSounds.GRASS).withHardness(0.6F).withOverrideColor(MaterialColor.wood)
+            .withTags(BlockTags.MINEABLE_BY_AXE, BlockTags.FENCES_CONNECT);
+
+        JUKEBOX = new JukeboxBlock("jukebox", "minecraft:block/jukebox", 780).withSound(BlockSounds.WOOD).withHardness(2.0F).withBlastResistance(10F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+
+        PUMPKIN = new PumpkinBlock("pumpkin", "minecraft:block/pumpkin", 790, true).withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        PUMPKIN_CARVED_IDLE = new PumpkinBlock("pumpkin.carved.idle", "minecraft:block/pumpkin_carved_idle", 791, false).withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        PUMPKIN_CARVED_ACTIVE = new PumpkinBlock("pumpkin.carved.active", "minecraft:block/pumpkin_carved_active", 792, false).withSound(BlockSounds.WOOD).withHardness(1.0F).withLightEmission(1.0F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_AXE);
+        PUMPKIN_REDSTONE = new RedstonePumpkinBlock("pumpkin.redstone", "minecraft:block/pumpkin_redstone", 793).withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange();
+
+
+        NETHERRACK = new Block("netherrack", "minecraft:block/netherrack", 800, Material.netherrack).withSound(BlockSounds.STONE).withHardness(0.4F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.INFINITE_BURN);
+        NETHERRACK_IGNEOUS = new Block("netherrack.igneous", "minecraft:block/netherrack_igneous", 801, Material.netherrack).withSound(BlockSounds.STONE).withHardness(1.25F).withBlastResistance(7F).withLightEmission(10)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        SOULSAND = new SoulSandBlock("soulsand", "minecraft:block/soulsand", 810).withSound(BlockSounds.SAND).withHardness(0.5F).withOverrideColor(MaterialColor.paintedBrown)
+            .withTags(BlockTags.MINEABLE_BY_SHOVEL);
+
+        GLOWSTONE = new GlowStoneBlock("glowstone", "minecraft:block/glowstone", 820, Material.stone).withSound(BlockSounds.GLASS).withHardness(0.3F).withLightEmission(1.0F).withOverrideColor(MaterialColor.paintedYellow)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+
+        PORTAL_NETHER = new PortalBlock("portal.nether", "minecraft:block/portal_nether", 830,1, OBSIDIAN.id, FIRE.id).withSound(BlockSounds.GLASS).withHardness(-1F).withLightEmission(0.75F).withOverrideColor(MaterialColor.paintedPurple).withDisabledStats()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+        PORTAL_PARADISE = new PortalBlock("portal.paradise", "minecraft:block/portal_paradise", 831, 2, GLOWSTONE.id, BEDROCK.id).withSound(BlockSounds.GLASS).withHardness(-1F).withLightEmission(0.75f).withOverrideColor(MaterialColor.paintedPurple).withDisabledStats()
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+
+        CAKE = new CakeBlock("cake", "minecraft:block/cake", 840).withHardness(0.5F).withSound(BlockSounds.CLOTH).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.FOOD_CAKE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+        PUMPKIN_PIE = new PumpkinPieBlock("pumpkin_pie", "minecraft:block/pumpkin_pie", 841).withSound(BlockSounds.CLOTH).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange().withOverrideColor(MaterialColor.paintedOrange).setStatParent(() -> Items.FOOD_PUMPKIN_PIE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+
+        LAMP_IDLE = new LampBlock("lamp.idle", "minecraft:block/lamp_idle", 850, false).withSound(BlockSounds.GLASS).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new LampBlockItem(b))
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        LAMP_ACTIVE = new LampBlock("lamp.active", "minecraft:block/lamp_active", 851, true).withSound(BlockSounds.GLASS).withLightEmission(0.9375F).withHardness(0.5F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> LAMP_IDLE)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
+
+        LANTERN_FIREFLY_GREEN = new FireflyLanternBlock("lantern.firefly.green", "minecraft:block/lantern_firefly_green", 870, FireflyClusterMob.FireflyColor.GREEN, () -> Items.LANTERN_FIREFLY_GREEN).withSound(BlockSounds.GLASS).withHardness(0.1F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.LANTERN_FIREFLY_GREEN)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
+        LANTERN_FIREFLY_BLUE = new FireflyLanternBlock("lantern.firefly.blue", "minecraft:block/lantern_firefly_blue", 871, FireflyClusterMob.FireflyColor.BLUE, () -> Items.LANTERN_FIREFLY_BLUE).withSound(BlockSounds.GLASS).withHardness(0.1F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.LANTERN_FIREFLY_BLUE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
+        LANTERN_FIREFLY_ORANGE = new FireflyLanternBlock("lantern.firefly.orange", "minecraft:block/lantern_firefly_orange", 872, FireflyClusterMob.FireflyColor.ORANGE, () -> Items.LANTERN_FIREFLY_ORANGE).withSound(BlockSounds.GLASS).withHardness(0.1F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.LANTERN_FIREFLY_ORANGE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
+        LANTERN_FIREFLY_RED = new FireflyLanternBlock("lantern.firefly.red", "minecraft:block/lantern_firefly_red", 873, FireflyClusterMob.FireflyColor.RED, () -> Items.LANTERN_FIREFLY_RED).withSound(BlockSounds.GLASS).withHardness(0.1F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.LANTERN_FIREFLY_RED)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
+        JAR_GLASS = new JarBlock("jar.glass", "minecraft:block/jar_glass", 874, () -> Items.JAR).withSound(BlockSounds.GLASS).withHardness(0.1F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.JAR)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
+
+        OVERLAY_PEBBLES = new OverlayPebblesBlock("overlay.pebbles", "minecraft:block/overlay_pebbles", 880, Material.decoration).withSound(BlockSounds.STONE).withHardness(0.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.AMMO_PEBBLE)
+            .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
+
+        FENCE_CHAINLINK = new ChainlinkFenceBlock("fence.chainlink", "minecraft:block/fence_chainlink", 890, Material.metal).withSound(BlockSounds.METAL).withHardness(5F)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.CAN_HANG_OFF);
+        FENCE_PAPER_WALL = new PaperWallFenceBlock("fence.paper_wall", "minecraft:block/fence_paper_wall", 891, Material.cloth).withSound(BlockSounds.CLOTH).withHardness(0.5F)
+            .withTags(BlockTags.MINEABLE_BY_SHEARS, BlockTags.FENCES_CONNECT, BlockTags.CAN_HANG_OFF, BlockTags.MINEABLE_BY_AXE);
+
+        BASKET = new BasketBlock("basket", "minecraft:block/basket", 900, Material.cloth).withSound(BlockSounds.CLOTH).withHardness(0.5F).withOverrideColor(MaterialColor.wood).setStatParent(() -> Items.BASKET)
+            .withTags(BlockTags.NOT_IN_CREATIVE_MENU);
+
+        PAPER_WALL = new Block("paper_wall", "minecraft:block/paper_wall", 910, Material.cloth).withSound(BlockSounds.CLOTH).withHardness(0.7F)
+            .withTags(BlockTags.MINEABLE_BY_SHEARS, BlockTags.FENCES_CONNECT, BlockTags.CAN_HANG_OFF, BlockTags.MINEABLE_BY_AXE);
+
+        SLAB_BRICK_SANDSTONE = new SlabBlock(BRICK_SANDSTONE, "minecraft:block/slab_brick_sandstone", 1000).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_COBBLE_PERMAFROST = new SlabBlock(COBBLE_PERMAFROST, "minecraft:block/slab_cobble_permafrost", 1001).withSound(BlockSounds.PERMAFROST).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_BRICK_PERMAFROST = new SlabBlock(BRICK_PERMAFROST, "minecraft:block/slab_brick_permafrost", 1002).withSound(BlockSounds.PERMAFROST).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        SLAB_PERMAFROST_POLISHED = new SlabBlock(PERMAFROST_CARVED, "minecraft:block/slab_permafrost_polished", 1003).withSound(BlockSounds.PERMAFROST).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockBrazier.java b/src/main/java/net/minecraft/core/block/BrazierBlock.java
similarity index 53%
rename from src/main/java/net/minecraft/core/block/BlockBrazier.java
rename to src/main/java/net/minecraft/core/block/BrazierBlock.java
index c73e3aa86..17caff351 100644
--- a/src/main/java/net/minecraft/core/block/BlockBrazier.java
+++ b/src/main/java/net/minecraft/core/block/BrazierBlock.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.ItemFirestriker;
+import net.minecraft.core.item.FireStrikerItem;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Side;
@@ -12,12 +12,12 @@ import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class BlockBrazier
+public class BrazierBlock
     extends Block {
     private final boolean burning;
 
-    public BlockBrazier(String key, int id, boolean burning) {
-        super(key, id, Material.metal);
+    public BrazierBlock(String key, String namespaceId, int id, boolean burning) {
+        super(key, namespaceId, id, Material.metal);
         this.burning = burning;
     }
 
@@ -26,7 +26,7 @@ public class BlockBrazier
     }
 
     @Override
-    public boolean renderAsNormalBlock() {
+    public boolean isCubeShaped() {
         return false;
     }
 
@@ -36,27 +36,27 @@ public class BlockBrazier
     }
 
     @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) };
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
+        return new ItemStack[] { new ItemStack(Blocks.BRAZIER_INACTIVE, 1) };
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
         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) {
+        if (heldItem != null && heldItem.getItem() instanceof FireStrikerItem && !burning) {
+            if (world.getBlock(x + 1, y, z) instanceof FluidBlock ||
+                world.getBlock(x - 1, y, z) instanceof FluidBlock ||
+                world.getBlock(x, y, z + 1) instanceof FluidBlock ||
+                world.getBlock(x, y, z - 1) instanceof FluidBlock) {
                 return false;
             }
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.brazierActive.id, 0);
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.BRAZIER_ACTIVE.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);
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.BRAZIER_INACTIVE.id, 0);
             return true;
         }
 
@@ -66,7 +66,7 @@ public class BlockBrazier
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data) {
         if (burning) {
-            Block.fire.onBlockRemoved(world, x, y, z, data);
+            Blocks.FIRE.onBlockRemoved(world, x, y, z, data);
         }
     }
 
@@ -74,15 +74,15 @@ public class BlockBrazier
     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);
+        if (block instanceof FluidBlock) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.BRAZIER_INACTIVE.id, 0);
         }
     }
 
     @Override
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+    public void animationTick(World world, int x, int y, int z, Random rand) {
         if (burning) {
-            Block.fire.randomDisplayTick(world, x, y, z, rand);
+            Blocks.FIRE.animationTick(world, x, y, z, rand);
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockButton.java b/src/main/java/net/minecraft/core/block/ButtonBlock.java
similarity index 83%
rename from src/main/java/net/minecraft/core/block/BlockButton.java
rename to src/main/java/net/minecraft/core/block/ButtonBlock.java
index 4fc0ae902..4f98b6905 100644
--- a/src/main/java/net/minecraft/core/block/BlockButton.java
+++ b/src/main/java/net/minecraft/core/block/ButtonBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
@@ -16,14 +16,14 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, IBlockAccess, 
-//            AxisAlignedBB, EntityPlayer
+//            AxisAlignedBB, Player
 
-public class BlockButton extends Block
+public class ButtonBlock extends Block
 {
 
-	public BlockButton(String key, int id)
+	public ButtonBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.decoration);
+        super(key, namespaceId, id, Material.decoration);
         setTicking(true);
     }
 
@@ -34,7 +34,7 @@ public class BlockButton extends Block
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 20;
     }
@@ -46,33 +46,15 @@ public class BlockButton extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
-    {
-        if (side == 0 && world.isBlockNormalCube(x, y + 1, z)){
-            return true;
-        }
-        else if (side == 1 && world.isBlockNormalCube(x, y - 1, z)){
-            return true;
-        }
-        else if(side == 2 && world.isBlockNormalCube(x, y, z + 1))
-        {
-            return true;
-        }
-        if(side == 3 && world.isBlockNormalCube(x, y, z - 1))
-        {
-            return true;
-        }
-        if(side == 4 && world.isBlockNormalCube(x + 1, y, z))
-        {
-            return true;
-        }
-        return side == 5 && world.isBlockNormalCube(x - 1, y, z);
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side) {
+        Side checkSide = side.getOpposite();
+        return world.isBlockNormalCube(x + checkSide.getOffsetX(), y + checkSide.getOffsetY(), z + checkSide.getOffsetZ());
     }
 
     @Override
@@ -102,7 +84,7 @@ public class BlockButton extends Block
     }
     
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
         int i1 = world.getBlockMetadata(x, y, z);
         int j1 = i1 & 8;
         i1 &= 7;
@@ -233,7 +215,7 @@ public class BlockButton extends Block
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
     		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
@@ -241,7 +223,7 @@ public class BlockButton extends Block
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = l & 7;
@@ -267,7 +249,7 @@ public class BlockButton extends Block
         } else {
             world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
         }
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
         return true;
     }
 
@@ -296,45 +278,39 @@ public class BlockButton extends Block
     }
 
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
         return (blockAccess.getBlockMetadata(x, y, z) & 8) > 0;
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
-        int i1 = world.getBlockMetadata(x, y, z);
-        if((i1 & 8) == 0)
-        {
+        int meta = world.getBlockMetadata(x, y, z);
+        if((meta & 8) == 0) {
             return false;
         }
-        int j1 = i1 & 7;
-        if(j1 == 6 && side == 1)
-        {
+        int direction = meta & 7;
+        if(direction == 6 && side == Side.TOP) {
             return true;
         }
-        if(j1 == 5 && side == 0)
-        {
+        if(direction == 5 && side == Side.BOTTOM) {
             return true;
         }
-        if(j1 == 4 && side == 2)
-        {
+        if(direction == 4 && side == Side.NORTH) {
             return true;
         }
-        if(j1 == 3 && side == 3)
-        {
+        if(direction == 3 && side == Side.SOUTH) {
             return true;
         }
-        if(j1 == 2 && side == 4)
-        {
+        if(direction == 2 && side == Side.WEST) {
             return true;
         }
-        return j1 == 1 && side == 5;
+        return direction == 1 && side == Side.EAST;
     }
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return true;
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java b/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/BlockLeavesCacao.java
rename to src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
index 0fdba8fcf..6f0b950e8 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java
+++ b/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
@@ -14,11 +14,11 @@ import net.minecraft.core.world.season.Seasons;
 
 import java.util.Random;
 
-public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
+public class CacaoLeavesBlock extends BaseLeavesBlock implements IBonemealable {
 
     static final int BEAN_GROWTH_RATE = 50;
-    public BlockLeavesCacao(String key, int id) {
-        super(key, id, Material.leaves);
+    public CacaoLeavesBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId, id, Material.leaves);
         setTicking(true);
     }
 
@@ -34,27 +34,27 @@ public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         int growthRate = (meta & 0xF0) >> 4;
         if (dropCause == EnumDropCause.PICK_BLOCK || dropCause == EnumDropCause.SILK_TOUCH) return new ItemStack[] { new ItemStack(this) };
 
         if (growthRate > 1)
         {
-            return new ItemStack[] { new ItemStack(Item.dye, MathHelper.floor_double((double) growthRate / 2), 3)};
+            return new ItemStack[] { new ItemStack(Items.DYE, MathHelper.floor((double) growthRate / 2), 3)};
         }
 
-        return super.getBreakResult(world, dropCause, x, y, z, meta,tileEntity);
+        return super.getBreakResult(world, dropCause, x, y, z, meta, blockEntity);
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         int meta = world.getBlockMetadata(x, y, z);
         int decayData = meta & 0x0F;
@@ -67,7 +67,7 @@ public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
                 dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, meta, null);
             }
             world.setBlockMetadataWithNotify(x, y, z, decayData);
-            world.scheduleBlockUpdate(x, y, z, leavesCacao.id, tickRate());
+            world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CACAO.id, tickDelay());
             return true;
         }
         return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
@@ -83,24 +83,24 @@ public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
                 if (canBeansGrow(world, x, y, z)) {
                     if ((growthRate) < 4) {
                         world.setBlockMetadataWithNotify(x, y, z, (++growthRate) << 4 | meta);
-                        world.scheduleBlockUpdate(x, y, z, leavesCacao.id, tickRate());
+                        world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CACAO.id, tickDelay());
                     }
                 }
             }
             else if(growthRate > 0){
                 world.setBlockMetadataWithNotify(x, y, z, meta & 0X0F);
-                world.scheduleBlockUpdate(x, y, z, leavesCacao.id, tickRate());
+                world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CACAO.id, tickDelay());
             }
         }
     }
 
     @Override
     protected Block getSapling() {
-        return Block.saplingCacao;
+        return Blocks.SAPLING_CACAO;
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
         if(((meta & 0xF0) >> 4) < 4)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockCactus.java b/src/main/java/net/minecraft/core/block/CactusBlock.java
similarity index 78%
rename from src/main/java/net/minecraft/core/block/BlockCactus.java
rename to src/main/java/net/minecraft/core/block/CactusBlock.java
index 76535c0ae..2e091d5ea 100644
--- a/src/main/java/net/minecraft/core/block/BlockCactus.java
+++ b/src/main/java/net/minecraft/core/block/CactusBlock.java
@@ -2,10 +2,10 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.ItemStack;
@@ -22,15 +22,15 @@ import java.util.Random;
 //            Block, Material, World, AxisAlignedBB, 
 //            Entity
 
-public class BlockCactus extends Block implements IBonemealable
+public class CactusBlock extends Block implements IBonemealable
 {
 
-	public BlockCactus(String key, int id)
+	public CactusBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.cactus);
+        super(key, namespaceId, id, Material.cactus);
         setTicking(true);
     }
-    public void onBlockAdded(World world, int x, int y, int z)
+    public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         onNeighborBlockChange(world, x, y, z, 0);
     }
@@ -73,18 +73,18 @@ public class BlockCactus extends Block implements IBonemealable
 	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
         float f = 0.0625F;
-        return AABB.getBoundingBoxFromPool((float) x + f, y, (float) z + f, (float)(x + 1) - f, (float)(y + 1) - f, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + f, y, (float) z + f, (float)(x + 1) - f, (float)(y + 1) - f, (float)(z + 1) - f);
     }
 
     @Override
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
         float f = 0.0625F;
-        return AABB.getBoundingBoxFromPool((float) x + f, y, (float) z + f, (float)(x + 1) - f, y + 1, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + f, y, (float) z + f, (float)(x + 1) - f, y + 1, (float)(z + 1) - f);
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -144,16 +144,16 @@ public class BlockCactus extends Block implements IBonemealable
     @Override
     public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
     {
-        if(entity instanceof EntityLiving || entity instanceof EntityMinecart || entity instanceof EntityBoat) {
+        if(entity instanceof Mob || entity instanceof MinecartEntity || entity instanceof BoatEntity) {
         	entity.hurt(null, 1, DamageType.COMBAT);
         }
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(!world.isClientSide)
         {
-            ((BlockCactus)Block.blocksList[id]).growCactusOnTop(world, blockX, blockY, blockZ);
+            ((CactusBlock)Block.blocksList[id]).growCactusOnTop(world, blockX, blockY, blockZ);
             if (entityplayer.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
diff --git a/src/main/java/net/minecraft/core/block/BlockCake.java b/src/main/java/net/minecraft/core/block/CakeBlock.java
similarity index 67%
rename from src/main/java/net/minecraft/core/block/BlockCake.java
rename to src/main/java/net/minecraft/core/block/CakeBlock.java
index 8dc8b2ec7..d0ac974af 100644
--- a/src/main/java/net/minecraft/core/block/BlockCake.java
+++ b/src/main/java/net/minecraft/core/block/CakeBlock.java
@@ -1,15 +1,15 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockCake extends BlockEdible
+public class CakeBlock extends EdibleBlock
 {
 
-	public BlockCake(String key, int id)
+	public CakeBlock(String key, String namespaceId, int id)
     {
-        super(key, id, 6, 3, () -> Item.foodCake);
+        super(key, namespaceId, id, 6, 3, () -> Items.FOOD_CAKE);
     }
 
     @Override
@@ -29,7 +29,7 @@ public class BlockCake extends BlockEdible
         float f = 0.0625F;
         float f1 = (float)(1 + l * 2) / 16F;
         float f2 = 0.5F;
-        return AABB.getBoundingBoxFromPool((float) x + f1, y, (float) z + f, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + f1, y, (float) z + f, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
     }
 
     @Override
@@ -39,7 +39,7 @@ public class BlockCake extends BlockEdible
         float f = 0.0625F;
         float f1 = (float)(1 + l * 2) / 16F;
         float f2 = 0.5F;
-        return AABB.getBoundingBoxFromPool((float) x + f1, y, (float) z + f, (float)(x + 1) - f, (float) y + f2, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + f1, y, (float) z + f, (float)(x + 1) - f, (float) y + f2, (float)(z + 1) - f);
     }
 
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockCandle.java b/src/main/java/net/minecraft/core/block/CandleBlock.java
similarity index 81%
rename from src/main/java/net/minecraft/core/block/BlockCandle.java
rename to src/main/java/net/minecraft/core/block/CandleBlock.java
index fe9b40831..4c5b09147 100644
--- a/src/main/java/net/minecraft/core/block/BlockCandle.java
+++ b/src/main/java/net/minecraft/core/block/CandleBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.block.material.Material;
@@ -10,11 +10,11 @@ import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
 
-public class BlockCandle extends Block
+public class CandleBlock extends Block
 {
-    public BlockCandle(String key, int id, Material material)
+    public CandleBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setTicking(true);
 
         setBlockBounds(0.5f - 1.5f/16f, 0f, 0.5f - 1.5f/16f,
@@ -34,7 +34,7 @@ public class BlockCandle extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
@@ -61,13 +61,13 @@ public class BlockCandle extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return new ItemStack[] { null };//new ItemStack(Item.candleSoulwax) };
     }
 
     @Override
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+    public void animationTick(World world, int x, int y, int z, Random rand)
     {
         double d = x + 0.5D;
         double d1 = y + 0.7D;
diff --git a/src/main/java/net/minecraft/core/block/BlockFenceChainlink.java b/src/main/java/net/minecraft/core/block/ChainlinkFenceBlock.java
similarity index 92%
rename from src/main/java/net/minecraft/core/block/BlockFenceChainlink.java
rename to src/main/java/net/minecraft/core/block/ChainlinkFenceBlock.java
index d07523b27..c6dbcab90 100644
--- a/src/main/java/net/minecraft/core/block/BlockFenceChainlink.java
+++ b/src/main/java/net/minecraft/core/block/ChainlinkFenceBlock.java
@@ -6,11 +6,11 @@ import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockFenceChainlink extends BlockFenceThin
+public class ChainlinkFenceBlock extends ThinFenceBlock
 {
-    public BlockFenceChainlink(String key, int id, Material material)
+    public ChainlinkFenceBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCherry.java b/src/main/java/net/minecraft/core/block/CherryLeavesBlock.java
similarity index 62%
rename from src/main/java/net/minecraft/core/block/BlockLeavesCherry.java
rename to src/main/java/net/minecraft/core/block/CherryLeavesBlock.java
index 5601114a8..f5b8a293a 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCherry.java
+++ b/src/main/java/net/minecraft/core/block/CherryLeavesBlock.java
@@ -7,21 +7,21 @@ import net.minecraft.core.world.season.Seasons;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess, 
-//            WorldChunkManager, World, Block, EntityPlayer, 
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
 //            ItemStack, Item, ItemShears, StatList, 
 //            Entity
 
-public class BlockLeavesCherry extends BlockLeavesBase
+public class CherryLeavesBlock extends BaseLeavesBlock
 {
 
-	public BlockLeavesCherry(String key, int id)
+	public CherryLeavesBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.leaves);
+        super(key, namespaceId, id, Material.leaves);
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if (world.getSeasonManager().getCurrentSeason() != null && world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING && rand.nextInt(40) == 0)
         {
@@ -32,6 +32,6 @@ public class BlockLeavesCherry extends BlockLeavesBase
     @Override
     protected Block getSapling()
     {
-        return Block.saplingCherry;
+        return Blocks.SAPLING_CHERRY;
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockChest.java b/src/main/java/net/minecraft/core/block/ChestBlock.java
similarity index 85%
rename from src/main/java/net/minecraft/core/block/BlockChest.java
rename to src/main/java/net/minecraft/core/block/ChestBlock.java
index 75f45cbc8..cf33e6946 100644
--- a/src/main/java/net/minecraft/core/block/BlockChest.java
+++ b/src/main/java/net/minecraft/core/block/ChestBlock.java
@@ -1,30 +1,30 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityChest;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.ChestBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
-import net.minecraft.core.player.inventory.InventoryLargeChest;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.CompoundContainer;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class BlockChest extends BlockTileEntity {
+public class ChestBlock extends EntityBlock {
 	
-	public BlockChest(String key, int id, Material material) {
-		super(key, id, material);
+	public ChestBlock(String key, String namespaceId, int id, Material material) {
+		super(key, namespaceId, id, material);
 	}
 	
 	@Override
-	public void onBlockPlaced(World world, int x, int y, int z, Side placeSide, EntityLiving entity, double sideHeight) {
-		Direction direction = entity.getHorizontalPlacementDirection(placeSide).getOpposite();
+	public void onBlockPlacedByMob(World world, int x, int y, int z, Side placeSide, Mob mob, double sideHeight) {
+		Direction direction = mob.getHorizontalPlacementDirection(placeSide).getOpposite();
 		Type type = Type.SINGLE;
 		
-		if(entity.isSneaking() && placeSide.isHorizontal() && (entity.rotationLockHorizontal == null || entity.rotationLockHorizontal == Direction.NONE)) {
+		if(mob.isSneaking() && placeSide.isHorizontal() && (mob.rotationLockHorizontal == null || mob.rotationLockHorizontal == Direction.NONE)) {
 			int placedOnX = x;
 			int placedOnZ = z;
 			if(placeSide == Side.NORTH) placedOnZ++;
@@ -83,7 +83,7 @@ public class BlockChest extends BlockTileEntity {
 					}
 				}
 			}
-		}else if(!entity.isSneaking()) {
+		}else if(!mob.isSneaking()) {
 			if(direction == Direction.NORTH) {
 				if(isSingleChestWithDirection(world, x - 1, y, z, direction) && !isSingleChestWithDirection(world, x + 1, y, z, direction)) {
 					type = Type.LEFT;
@@ -190,25 +190,25 @@ public class BlockChest extends BlockTileEntity {
 	}
 	
 	public static void dropChestContent(World world, int x, int y, int z) {
-		TileEntityChest tileEntityChest = (TileEntityChest) world.getBlockTileEntity(x, y, z);
+		ChestBlockEntity tileEntityChest = (ChestBlockEntity) world.getBlockEntity(x, y, z);
 		if(tileEntityChest == null) {
 			System.out.println("Can't drop chest items because tile entity is null at x: "+x+" y:"+y+" z: "+z);
 			return;
 		}
 		
-		for(int i=0; i < tileEntityChest.getSizeInventory(); i++) {
-			ItemStack itemStack = tileEntityChest.getStackInSlot(i);
+		for(int i = 0; i < tileEntityChest.getContainerSize(); i++) {
+			ItemStack itemStack = tileEntityChest.getItem(i);
 			if(itemStack == null) continue;
-			EntityItem item = world.dropItem(x, y, z, itemStack);
+			ItemEntity item = world.dropItem(x, y, z, itemStack);
 			item.xd *= 0.5;
 			item.yd *= 0.5;
 			item.zd *= 0.5;
-			item.delayBeforeCanPickup = 0;
+			item.pickupDelay = 0;
 		}
 	}
 	
 	public static boolean isChest(World world, int x, int y, int z) {
-		return Block.blocksList[world.getBlockId(x, y, z)] instanceof BlockChest;
+		return Block.blocksList[world.getBlockId(x, y, z)] instanceof ChestBlock;
 	}
 	
 	public static boolean isSingleChest(World world, int x, int y, int z) {
@@ -221,8 +221,8 @@ public class BlockChest extends BlockTileEntity {
 	}
 	
 	@Override
-	protected TileEntity getNewBlockEntity() {
-		return new TileEntityChest();
+	protected BlockEntity getNewBlockEntity() {
+		return new ChestBlockEntity();
 	}
 	
 	public void setDirection(World world, int x, int y, int z, Direction direction) {
@@ -245,7 +245,7 @@ public class BlockChest extends BlockTileEntity {
 	}
 	
 	@Override
-	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) return true;
 		
 		checkIfOtherHalfExists(world, x, y, z);
@@ -254,15 +254,15 @@ public class BlockChest extends BlockTileEntity {
 		return true;
 	}
 	
-	public static IInventory getInventory(World world, int x, int y, int z) {
-		IInventory inventory = (IInventory) world.getBlockTileEntity(x, y, z);
+	public static Container getInventory(World world, int x, int y, int z) {
+		Container inventory = (Container) world.getBlockEntity(x, y, z);
 		
 		int meta = world.getBlockMetadata(x, y, z);
 		meta = world.getBlockMetadata(x, y, z);
 		Type type = getTypeFromMeta(meta);
 		
 		if(type != Type.SINGLE) {
-			IInventory inv2 = null;
+			Container inv2 = null;
 			
 			Direction direction = getDirectionFromMeta(meta); 
 			
@@ -291,16 +291,16 @@ public class BlockChest extends BlockTileEntity {
 				if(getDirectionFromMeta(otherMeta) == direction) {
 					Type otherType = getTypeFromMeta(otherMeta);
 					if(type == Type.LEFT && otherType == Type.RIGHT) {
-						inv2 = (IInventory) world.getBlockTileEntity(otherChestX, y, otherChestZ);
+						inv2 = (Container) world.getBlockEntity(otherChestX, y, otherChestZ);
 					}
 					if(type == Type.RIGHT && otherType == Type.LEFT) {
 						inv2 = inventory;
-						inventory = (IInventory) world.getBlockTileEntity(otherChestX, y, otherChestZ);
+						inventory = (Container) world.getBlockEntity(otherChestX, y, otherChestZ);
 					}
 				}
 			}
 			if(inv2 != null) {
-				inventory = new InventoryLargeChest("Large Chest", inventory, inv2);
+				inventory = new CompoundContainer("Large Chest", inventory, inv2);
 			}
 		}
 		
diff --git a/src/main/java/net/minecraft/core/block/BlockChestPainted.java b/src/main/java/net/minecraft/core/block/ChestBlockPainted.java
similarity index 66%
rename from src/main/java/net/minecraft/core/block/BlockChestPainted.java
rename to src/main/java/net/minecraft/core/block/ChestBlockPainted.java
index 06095e7bb..04c02daa6 100644
--- a/src/main/java/net/minecraft/core/block/BlockChestPainted.java
+++ b/src/main/java/net/minecraft/core/block/ChestBlockPainted.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockChestPainted extends BlockChest {
+public class ChestBlockPainted extends ChestBlock {
 
-	protected BlockChestPainted(String key, int id, Material material) {
-		super(key, id, material);
+	protected ChestBlockPainted(String key, String namespaceId, int id, Material material) {
+		super(key, namespaceId, id, material);
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		return new ItemStack[] { new ItemStack(this, 1, meta & colorBits) };
 	}
diff --git a/src/main/java/net/minecraft/core/block/BlockClay.java b/src/main/java/net/minecraft/core/block/ClayBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockClay.java
rename to src/main/java/net/minecraft/core/block/ClayBlock.java
index 6a4723418..75325cf9d 100644
--- a/src/main/java/net/minecraft/core/block/BlockClay.java
+++ b/src/main/java/net/minecraft/core/block/ClayBlock.java
@@ -1,25 +1,27 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
+import java.util.HashMap;
+import java.util.Map;
+
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, Item
 
-public class BlockClay extends Block
+public class ClayBlock extends Block
 {
-
-    public BlockClay(String key, int id)
+    public ClayBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.clay);
+        super(key, namespaceId, id, Material.clay);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -27,7 +29,7 @@ public class BlockClay extends Block
             case PICK_BLOCK:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Item.clay, 4) };
+                return new ItemStack[] { new ItemStack(Items.CLAY, 4) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockOreDiamond.java b/src/main/java/net/minecraft/core/block/CoalOreBlock.java
similarity index 54%
rename from src/main/java/net/minecraft/core/block/BlockOreDiamond.java
rename to src/main/java/net/minecraft/core/block/CoalOreBlock.java
index 19d271f46..e0d3bf7d3 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreDiamond.java
+++ b/src/main/java/net/minecraft/core/block/CoalOreBlock.java
@@ -1,25 +1,29 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
+import java.util.HashMap;
+import java.util.Map;
+
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, Item
 
-public class BlockOreDiamond extends Block
+public class CoalOreBlock extends Block
 {
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
 
-    public BlockOreDiamond(String key, int id)
-    {
-        super(key, id, Material.stone);
+    public CoalOreBlock(String key, String namespaceId, int id, int parentId, Material material){
+        super(key, namespaceId, id, material);
+        variantMap.put(parentId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -28,10 +32,9 @@ public class BlockOreDiamond extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.diamond) };
+                return new ItemStack[] { new ItemStack(Items.COAL) };
             default:
                 return null;
         }
     }
-
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockCobweb.java b/src/main/java/net/minecraft/core/block/CobwebBlock.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/BlockCobweb.java
rename to src/main/java/net/minecraft/core/block/CobwebBlock.java
index 745993810..0a991ac16 100644
--- a/src/main/java/net/minecraft/core/block/BlockCobweb.java
+++ b/src/main/java/net/minecraft/core/block/CobwebBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
@@ -14,12 +14,12 @@ import net.minecraft.core.world.WorldSource;
 //            Block, Material, Entity, Item, 
 //            World, AxisAlignedBB
 
-public class BlockCobweb extends Block
+public class CobwebBlock extends Block
 {
 
-    public BlockCobweb(String key, int id, Material mat)
+    public CobwebBlock(String key, String namespaceId, int id, Material mat)
     {
-        super(key, id, mat);
+        super(key, namespaceId, id, mat);
     }
 
     @Override
@@ -30,7 +30,7 @@ public class BlockCobweb extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -39,7 +39,7 @@ public class BlockCobweb extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.string) };
+                return new ItemStack[] { new ItemStack(Items.STRING) };
             default:
                 return null;
         }
@@ -58,7 +58,7 @@ public class BlockCobweb extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockCropsPumpkin.java b/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
similarity index 78%
rename from src/main/java/net/minecraft/core/block/BlockCropsPumpkin.java
rename to src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
index f8122bf0b..1102c2373 100644
--- a/src/main/java/net/minecraft/core/block/BlockCropsPumpkin.java
+++ b/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
@@ -13,10 +13,10 @@ import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
 
-public class BlockCropsPumpkin
-    extends BlockFlower implements IBonemealable {
-    public BlockCropsPumpkin(String key, int id) {
-        super(key, id);
+public class CropsPumpkinBlock
+    extends FlowerBlock implements IBonemealable {
+    public CropsPumpkinBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId, id);
     }
 
     @Override
@@ -41,7 +41,7 @@ public class BlockCropsPumpkin
 
     @Override
     protected boolean canThisPlantGrowOnThisBlockID(int i) {
-        return i == Block.farmlandDirt.id;
+        return i == Blocks.FARMLAND_DIRT.id;
     }
 
     @Override
@@ -54,7 +54,7 @@ public class BlockCropsPumpkin
                 if (rand.nextInt((int) (100F / f)) == 0) {
                     meta++;
                     if (meta == 5) {
-                        world.setBlockAndMetadataWithNotify(x, y, z, Block.pumpkin.id, 0);
+                        world.setBlockAndMetadataWithNotify(x, y, z, Blocks.PUMPKIN.id, 0);
                     } else {
                         world.setBlockMetadataWithNotify(x, y, z, meta);
                     }
@@ -64,7 +64,7 @@ public class BlockCropsPumpkin
     }
 
     public void fertilize(World world, int x, int y, int z) {
-        world.setBlockWithNotify(x, y, z, Block.pumpkin.id);
+        world.setBlockWithNotify(x, y, z, Blocks.PUMPKIN.id);
     }
 
     private float getGrowthRate(World world, int x, int y, int z) {
@@ -84,7 +84,7 @@ public class BlockCropsPumpkin
             for(int dz = z - 1; dz <= z + 1; dz++) {
                 int id = world.getBlockId(dx, y - 1, dz);
                 float growthRateMod = 0.0F;
-                if(id == Block.farmlandDirt.id) {
+                if(id == Blocks.FARMLAND_DIRT.id) {
                     growthRateMod = 1.0F;
                     if(world.getBlockMetadata(dx, y - 1, dz) > 0) {
                         growthRateMod = 3F;
@@ -98,7 +98,7 @@ public class BlockCropsPumpkin
 
         }
 
-        boolean isFertilized = BlockFarmland.isFertilized(world.getBlockMetadata(x, y - 1, z));
+        boolean isFertilized = FarmlandBlock.isFertilized(world.getBlockMetadata(x, y - 1, z));
         if (!isFertilized) {
             if (world.getSeasonManager().getCurrentSeason() != null)
             {
@@ -111,8 +111,8 @@ public class BlockCropsPumpkin
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
-        return new ItemStack[] { new ItemStack(Item.seedsPumpkin, 1)};
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
+        return new ItemStack[] { new ItemStack(Items.SEEDS_PUMPKIN, 1)};
     }
 
     public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z) {
@@ -121,16 +121,16 @@ public class BlockCropsPumpkin
         if (meta == 0) {
             return null;
         }
-        return AABB.getBoundingBoxFromPool((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
+        return AABB.getTemporaryBB((double)x + minX, (double)y + minY, (double)z + minZ, (double)x + maxX, (double)y + maxY, (double)z + maxZ);
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if (world.getBlockMetadata(blockX, blockY, blockZ) < 5)
         {
             if (!world.isClientSide)
             {
-                ((BlockCropsPumpkin)Block.cropsPumpkin).fertilize(world, blockX, blockY, blockZ);
+                ((CropsPumpkinBlock)Blocks.CROPS_PUMPKIN).fertilize(world, blockX, blockY, blockZ);
                 if (entityplayer.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
diff --git a/src/main/java/net/minecraft/core/block/BlockCropsWheat.java b/src/main/java/net/minecraft/core/block/CropsWheatBlock.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/BlockCropsWheat.java
rename to src/main/java/net/minecraft/core/block/CropsWheatBlock.java
index decfac4ab..6fa8943f3 100644
--- a/src/main/java/net/minecraft/core/block/BlockCropsWheat.java
+++ b/src/main/java/net/minecraft/core/block/CropsWheatBlock.java
@@ -2,24 +2,25 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, Block, World, EntityItem, 
+//            FlowerBlock, Block, World, ItemEntity,
 //            ItemStack, Item
 
-public class BlockCropsWheat extends BlockFlower implements IBonemealable
+public class CropsWheatBlock extends FlowerBlock implements IBonemealable
 {
-	public BlockCropsWheat(String key, int id)
+	public CropsWheatBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         setTicking(true);
         float f = 0.5F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f);
@@ -28,7 +29,7 @@ public class BlockCropsWheat extends BlockFlower implements IBonemealable
 	@Override
 	public boolean canThisPlantGrowOnThisBlockID(int i)
     {
-        return i == Block.farmlandDirt.id;
+        return i == Blocks.FARMLAND_DIRT.id;
     }
 
     @Override
@@ -75,7 +76,7 @@ public class BlockCropsWheat extends BlockFlower implements IBonemealable
             {
                 int id = world.getBlockId(dx, y - 1, dz);
                 float growthRateMod = 0.0F;
-                if(id == Block.farmlandDirt.id)
+                if(id == Blocks.FARMLAND_DIRT.id)
                 {
                     growthRateMod = 1.0F;
                     if(world.getBlockMetadata(dx, y - 1, dz) > 0)
@@ -96,7 +97,7 @@ public class BlockCropsWheat extends BlockFlower implements IBonemealable
             growthRate /= 2.0F;
         }
 
-        boolean isFertilized = BlockFarmland.isFertilized(world.getBlockMetadata(x, y - 1, z));
+        boolean isFertilized = FarmlandBlock.isFertilized(world.getBlockMetadata(x, y - 1, z));
         if (!isFertilized) {
             if (world.getSeasonManager().getCurrentSeason() != null)
             {
@@ -109,36 +110,36 @@ public class BlockCropsWheat extends BlockFlower implements IBonemealable
     }
 
     @Override
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
-        boolean isFertilized = BlockFarmland.isFertilized(world.getBlockMetadata(x, y - 1, z));
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, Player player, Item item) {
+        boolean isFertilized = FarmlandBlock.isFertilized(world.getBlockMetadata(x, y - 1, z));
         if (isFertilized && !world.isClientSide) {
             boolean shouldDefertilize = world.rand.nextInt(3) == 2;
             if (shouldDefertilize) {
-                world.setBlockMetadata(x, y - 1, z, BlockFarmland.setFertilized(world.getBlockMetadata(x, y - 1, z), false));
+                world.setBlockMetadata(x, y - 1, z, FarmlandBlock.setFertilized(world.getBlockMetadata(x, y - 1, z), false));
             }
         }
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (meta != 7)
         {
-            return new ItemStack[] { new ItemStack(Item.seedsWheat) };
+            return new ItemStack[] { new ItemStack(Items.SEEDS_WHEAT) };
         }
         else
         {
-            return new ItemStack[] { new ItemStack(Item.seedsWheat, world.rand.nextInt(3) + 1), new ItemStack(Item.wheat) };
+            return new ItemStack[] { new ItemStack(Items.SEEDS_WHEAT, world.rand.nextInt(3) + 1), new ItemStack(Items.WHEAT) };
         }
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(world.getBlockMetadata(blockX, blockY, blockZ) < 7)
         {
             if(!world.isClientSide)
             {
-                ((BlockCropsWheat)Block.cropsWheat).fertilize(world, blockX, blockY, blockZ);
+                ((CropsWheatBlock)Blocks.CROPS_WHEAT).fertilize(world, blockX, blockY, blockZ);
                 if (entityplayer.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
diff --git a/src/main/java/net/minecraft/core/block/BlockDeadBush.java b/src/main/java/net/minecraft/core/block/DeadBushBlock.java
similarity index 61%
rename from src/main/java/net/minecraft/core/block/BlockDeadBush.java
rename to src/main/java/net/minecraft/core/block/DeadBushBlock.java
index 38bfd8924..d8d4431d9 100644
--- a/src/main/java/net/minecraft/core/block/BlockDeadBush.java
+++ b/src/main/java/net/minecraft/core/block/DeadBushBlock.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, Block
+//            FlowerBlock, Block
 
-public class BlockDeadBush extends BlockFlower
+public class DeadBushBlock extends FlowerBlock
 {
 
-	public BlockDeadBush(String key, int id)
+	public DeadBushBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         float f = 0.4F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.8F, 0.5F + f);
     }
@@ -22,11 +22,11 @@ public class BlockDeadBush extends BlockFlower
     @Override
 	public boolean canThisPlantGrowOnThisBlockID(int i)
     {
-        return i == Block.sand.id || i == Block.dirtScorched.id;
+        return i == Blocks.SAND.id || i == Blocks.DIRT_SCORCHED.id;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         int quantity = world.rand.nextInt(3);
 
@@ -37,7 +37,7 @@ public class BlockDeadBush extends BlockFlower
                 return new ItemStack[] { new ItemStack(this) };
             default:
                 if (quantity == 0) return null;
-                return new ItemStack[] { new ItemStack(Item.stick, quantity) };
+                return new ItemStack[] { new ItemStack(Items.STICK, quantity) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/DetectorRailBlock.java b/src/main/java/net/minecraft/core/block/DetectorRailBlock.java
new file mode 100644
index 000000000..974d0324e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/DetectorRailBlock.java
@@ -0,0 +1,93 @@
+package net.minecraft.core.block;
+
+import java.util.List;
+import java.util.Random;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.World;
+public class DetectorRailBlock extends RailBlock {
+    public DetectorRailBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, true);
+        setTicking(true);
+    }
+
+    @Override
+    public int tickDelay()
+    {
+        return 20;
+    }
+
+    @Override
+    public boolean isSignalSource()
+    {
+        return true;
+    }
+
+    @Override
+    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
+        if(world.isClientSide) {
+            return;
+        }
+        int meta = world.getBlockMetadata(x, y, z);
+        if ((meta & 8) == 0) { // If unpowered
+            checkForMinecart(world, x, y, z, meta);
+        }
+    }
+
+    @Override
+	public void updateTick(World world, int x, int y, int z, Random rand) {
+        if(world.isClientSide) {
+            return;
+        }
+        int meta = world.getBlockMetadata(x, y, z);
+        if ((meta & 8) != 0) { // If powered
+            checkForMinecart(world, x, y, z, meta);
+        }
+    }
+
+    @Override
+    public boolean getSignal(WorldSource worldSource, int x, int y, int z, Side side) {
+        return (worldSource.getBlockMetadata(x, y, z) & 8) != 0;
+    }
+
+    @Override
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side) {
+        if((world.getBlockMetadata(x, y, z) & 8) == 0) {
+            return false;
+        } else {
+            return side == Side.TOP;
+        }
+    }
+    private void checkForMinecart(World world, int x, int y, int z, int meta) {
+        boolean isPowered = (meta & 8) != 0;
+        boolean minecartPresent = false;
+        float offset = 0.125f;
+        List<Entity> list = world.getEntitiesWithinAABB(MinecartEntity.class, AABB.getTemporaryBB(x + offset, y + offset, z + offset, x + 1 - offset, y + 1 - offset, z + 1 - offset));
+        if(!list.isEmpty()) {
+            minecartPresent = true;
+        }
+        if(minecartPresent && !isPowered) {
+            // Set rail to powered
+            world.setBlockMetadataWithNotify(x, y, z, meta | 8);
+            world.notifyBlocksOfNeighborChange(x, y, z, id);
+            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.markBlocksDirty(x, y, z, x, y, z);
+        }
+        if(!minecartPresent && isPowered) {
+            // Set rail to unpowered
+            world.setBlockMetadataWithNotify(x, y, z, meta & 7);
+            world.notifyBlocksOfNeighborChange(x, y, z, id);
+            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.markBlocksDirty(x, y, z, x, y, z);
+        }
+        if(minecartPresent) {
+            // Schedule update if minecart in rail
+            world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockOreNetherCoal.java b/src/main/java/net/minecraft/core/block/DiamondOreBlock.java
similarity index 54%
rename from src/main/java/net/minecraft/core/block/BlockOreNetherCoal.java
rename to src/main/java/net/minecraft/core/block/DiamondOreBlock.java
index 16c3f5179..a36e0c4f4 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreNetherCoal.java
+++ b/src/main/java/net/minecraft/core/block/DiamondOreBlock.java
@@ -1,26 +1,29 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 
+import java.util.HashMap;
+import java.util.Map;
+
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, Item
 
-public class BlockOreNetherCoal extends Block
+public class DiamondOreBlock extends Block
 {
-
-    public BlockOreNetherCoal(String key, int id)
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public DiamondOreBlock(String key, String namespaceId, int id, int parentId, Material material)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, material);
+        variantMap.put(parentId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -29,9 +32,10 @@ public class BlockOreNetherCoal extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.nethercoal) };
+                return new ItemStack[] { new ItemStack(Items.DIAMOND) };
             default:
                 return null;
         }
     }
+
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockDirtPath.java b/src/main/java/net/minecraft/core/block/DirtPathBlock.java
similarity index 67%
rename from src/main/java/net/minecraft/core/block/BlockDirtPath.java
rename to src/main/java/net/minecraft/core/block/DirtPathBlock.java
index 0ac7d9545..735ee53f4 100644
--- a/src/main/java/net/minecraft/core/block/BlockDirtPath.java
+++ b/src/main/java/net/minecraft/core/block/DirtPathBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
@@ -12,11 +12,11 @@ import net.minecraft.core.world.WorldSource;
 //            Block, Material, AxisAlignedBB, World,
 //            Entity
 
-public class BlockDirtPath extends Block
+public class DirtPathBlock extends Block
 {
-	public BlockDirtPath(String key, int id)
+	public DirtPathBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.dirt);
+        super(key, namespaceId, id, Material.dirt);
         setTicking(true);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F);
         withLightBlock(255);
@@ -25,7 +25,7 @@ public class BlockDirtPath extends Block
     @Override
 	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-        return AABB.getBoundingBoxFromPool(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1);
+        return AABB.getTemporaryBB(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1);
     }
 
     @Override
@@ -35,7 +35,7 @@ public class BlockDirtPath extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -46,14 +46,14 @@ public class BlockDirtPath extends Block
         super.onNeighborBlockChange(world, x, y, z, blockId);
         Material material = world.getBlockMaterial(x, y + 1, z);
         int id = world.getBlockId(x, y + 1, z);
-        if(material.isSolid() && id != Block.fencegatePlanksOak.id && id != Block.fencegatePlanksOakPainted.id && id != Block.signWallPlanksOak.id)
+        if(material.isSolid() && id != Blocks.FENCE_GATE_PLANKS_OAK.id && id != Blocks.FENCE_GATE_PLANKS_OAK_PAINTED.id && id != Blocks.SIGN_WALL_PLANKS_OAK.id)
         {
-            world.setBlockWithNotify(x, y, z, Block.dirt.id);
+            world.setBlockWithNotify(x, y, z, Blocks.DIRT.id);
         }
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -61,7 +61,7 @@ public class BlockDirtPath extends Block
             case PICK_BLOCK:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Block.dirt) };
+                return new ItemStack[] { new ItemStack(Blocks.DIRT) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockDispenser.java b/src/main/java/net/minecraft/core/block/DispenserBlock.java
similarity index 60%
rename from src/main/java/net/minecraft/core/block/BlockDispenser.java
rename to src/main/java/net/minecraft/core/block/DispenserBlock.java
index b41656665..7a0d721cd 100644
--- a/src/main/java/net/minecraft/core/block/BlockDispenser.java
+++ b/src/main/java/net/minecraft/core/block/DispenserBlock.java
@@ -2,57 +2,60 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
 import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.entity.projectile.*;
 import net.minecraft.core.item.IDispensable;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityDispenser;
 import net.minecraft.core.block.material.Material;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockContainer, Material, Block, World, 
-//            IBlockAccess, TileEntityDispenser, EntityPlayer, ItemStack, 
-//            Item, EntityArrow, EntityEgg, EntitySnowball, 
-//            EntityItem, EntityLiving, MathHelper, IInventory, 
-//            TileEntity
+//            IBlockAccess, DispenserBlockEntity, Player, ItemStack,
+//            Item, ArrowProjectile, EggProjectile, SnowballProjectile,
+//            ItemEntity, Mob, MathHelper, IInventory,
+//            BlockEntity
 
-public class BlockDispenser extends BlockTileEntityRotatable
+public class DispenserBlock extends RotatableEntityBlock
 {
+    private Random random;
+
 
-	public BlockDispenser(String key, int id)
+	public DispenserBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, Material.stone);
         random = new Random();
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 4;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
-        setDispenserDefaultDirection(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
+        recalculateLookDirection(world, x, y, z);
     }
 
-    private void setDispenserDefaultDirection(World world, int i, int j, int k)
+    private void recalculateLookDirection(World world, int x, int y, int z)
     {
         if(world.isClientSide)
         {
             return;
         }
-        int l = world.getBlockId(i, j, k - 1);
-        int i1 = world.getBlockId(i, j, k + 1);
-        int j1 = world.getBlockId(i - 1, j, k);
-        int k1 = world.getBlockId(i + 1, j, k);
+        int l = world.getBlockId(x, y, z - 1);
+        int i1 = world.getBlockId(x, y, z + 1);
+        int j1 = world.getBlockId(x - 1, y, z);
+        int k1 = world.getBlockId(x + 1, y, z);
         byte byte0 = 3;
         if(Block.solid[l] && !Block.solid[i1])
         {
@@ -70,19 +73,19 @@ public class BlockDispenser extends BlockTileEntityRotatable
         {
             byte0 = 4;
         }
-        world.setBlockMetadataWithNotify(i, j, k, byte0);
+        world.setBlockMetadataWithNotify(x, y, z, byte0);
     }
 
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if(world.isClientSide)
         {
             return true;
         } else
         {
-            TileEntityDispenser tileentitydispenser = (TileEntityDispenser)world.getBlockTileEntity(x, y, z);
+            DispenserBlockEntity tileentitydispenser = (DispenserBlockEntity)world.getBlockEntity(x, y, z);
             player.displayGUIDispenser(tileentitydispenser);
             return true;
         }
@@ -102,14 +105,14 @@ public class BlockDispenser extends BlockTileEntityRotatable
         } else {
             xOffset = -1;
         }
-        TileEntityDispenser tileEntity = (TileEntityDispenser)world.getBlockTileEntity(x, y, z);
+        DispenserBlockEntity tileEntity = (DispenserBlockEntity)world.getBlockEntity(x, y, z);
         ItemStack itemStack = tileEntity.getRandomStackFromInventory();
         double px = (double)x + (double)xOffset * 0.6D + 0.5D;
         double py = (double)y + 0.5D;
         double pz = (double)z + (double)zOffset * 0.6D + 0.5D;
         if(itemStack == null)
         {
-            world.playSoundEffect(1001, x, y, z, 0);
+            world.playSoundEffect(LevelListener.EVENT_DISPENSER_EMPTY, x, y, z, 0);
         }
         else
         {
@@ -117,26 +120,27 @@ public class BlockDispenser extends BlockTileEntityRotatable
             {
                 IDispensable dispensable = (IDispensable) itemStack.getItem();
                 dispensable.onDispensed(itemStack, world, px, py, pz, xOffset, zOffset, random);
-                world.playSoundEffect(1002, x, y, z, 0);
+                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
-            else if (itemStack.itemID == Item.ammoArrow.id || itemStack.itemID == Item.ammoArrowGold.id)
+            else if (itemStack.itemID == Items.AMMO_ARROW.id || itemStack.itemID == Items.AMMO_ARROW_GOLD.id)
             {
-                EntityArrow arrow = itemStack.itemID == Item.ammoArrow.id ? new EntityArrow(world, px, py, pz, 0) : new EntityArrowGolden(world, px, py, pz);
+
+                ArrowProjectile arrow = itemStack.itemID == Items.AMMO_ARROW.id ? new ArrowProjectile(world, px, py, pz, 0) : new ArrowProjectileGolden(world, px, py, pz);
                 arrow.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
                 arrow.setDoesArrowBelongToPlayer(true);
                 world.entityJoinedWorld(arrow);
-                world.playSoundEffect(1002, x, y, z, 0);
+                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
-            else if (itemStack.itemID == Item.ammoChargeExplosive.id)
+            else if (itemStack.itemID == Items.AMMO_CHARGE_EXPLOSIVE.id)
             {
-                EntityCannonball cannonball = new EntityCannonball(world, px, py, pz);
-                cannonball.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
-                world.entityJoinedWorld(cannonball);
-                world.playSoundEffect(1002, x, y, z, 0);
+                CannonballProjectile cannonballProjectile = new CannonballProjectile(world, px, py, pz);
+                cannonballProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+                world.entityJoinedWorld(cannonballProjectile);
+                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
             else
             {
-                EntityItem item = new EntityItem(world, px, py - 0.3D, pz, itemStack);
+                ItemEntity item = new ItemEntity(world, px, py - 0.3D, pz, itemStack);
                 double randOffset = random.nextDouble() * 0.1D + 0.2D;
                 item.xd = (double)xOffset * randOffset;
                 item.yd = 0.2D;
@@ -145,21 +149,21 @@ public class BlockDispenser extends BlockTileEntityRotatable
                 item.yd += random.nextGaussian() * 0.0075D * 6D;
                 item.zd += random.nextGaussian() * 0.0075D * 6D;
                 world.entityJoinedWorld(item);
-                world.playSoundEffect(1000, x, y, z, 0);
+                world.playSoundEffect(LevelListener.EVENT_DISPENSER_ITEM, x, y, z, 0);
             }
-            world.playSoundEffect(2000, x, y, z, xOffset + 1 + (zOffset + 1) * 3);
+            world.playSoundEffect(LevelListener.EVENT_DISPENSER_PARTICLES, x, y, z, xOffset + 1 + (zOffset + 1) * 3);
         }
     }
 
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        if(blockId > 0 && Block.blocksList[blockId].canProvidePower())
+        if(blockId > 0 && Block.blocksList[blockId].isSignalSource())
         {
             boolean flag = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z);
             if(flag)
             {
-                world.scheduleBlockUpdate(x, y, z, id, tickRate());
+                world.scheduleBlockUpdate(x, y, z, id, tickDelay());
             }
         }
     }
@@ -174,19 +178,19 @@ public class BlockDispenser extends BlockTileEntityRotatable
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityDispenser();
+        return new DispenserBlockEntity();
     }
-    
+
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
-        if(world.getBlockTileEntity(x, y, z) != null) {
-            TileEntityDispenser tileentitydispenser = (TileEntityDispenser) world.getBlockTileEntity(x, y, z);
+        if(world.getBlockEntity(x, y, z) != null) {
+            DispenserBlockEntity tileentitydispenser = (DispenserBlockEntity) world.getBlockEntity(x, y, z);
             label0:
-            for (int l = 0; l < tileentitydispenser.getSizeInventory(); l++) {
-                ItemStack itemstack = tileentitydispenser.getStackInSlot(l);
+            for (int l = 0; l < tileentitydispenser.getContainerSize(); l++) {
+                ItemStack itemstack = tileentitydispenser.getItem(l);
                 if (itemstack == null) {
                     continue;
                 }
@@ -202,7 +206,7 @@ public class BlockDispenser extends BlockTileEntityRotatable
                         i1 = itemstack.stackSize;
                     }
                     itemstack.stackSize -= i1;
-                    EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
+                    ItemEntity entityitem = new ItemEntity(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
                     float f3 = 0.05F;
                     entityitem.xd = (float) random.nextGaussian() * f3;
                     entityitem.yd = (float) random.nextGaussian() * f3 + 0.2F;
@@ -214,6 +218,4 @@ public class BlockDispenser extends BlockTileEntityRotatable
 
         super.onBlockRemoved(world, x, y, z, data);
     }
-
-    private Random random;
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockDoor.java b/src/main/java/net/minecraft/core/block/DoorBlock.java
similarity index 81%
rename from src/main/java/net/minecraft/core/block/BlockDoor.java
rename to src/main/java/net/minecraft/core/block/DoorBlock.java
index cbfa6e537..46f984580 100644
--- a/src/main/java/net/minecraft/core/block/BlockDoor.java
+++ b/src/main/java/net/minecraft/core/block/DoorBlock.java
@@ -2,33 +2,34 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.block.entity.BlockEntity;
 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.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, IBlockAccess, World, 
-//            Item, AxisAlignedBB, EntityPlayer, Vec3D, 
+//            Item, AxisAlignedBB, Player, Vec3D,
 //            MovingObjectPosition
 
-public class BlockDoor extends Block
+public class DoorBlock extends Block
 {
 
 	public final boolean isTop; 
 	
-	public BlockDoor(String key, int id, Material material, boolean isTop)
+	public DoorBlock(String key, String namespaceId, int id, Material material, boolean isTop)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         this.isTop = isTop;
         float f = 0.5F;
         if (isTop)
@@ -48,7 +49,7 @@ public class BlockDoor extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -107,14 +108,14 @@ public class BlockDoor extends Block
     }
     
     @Override
-	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
     		onBlockRightClicked(world, x, y, z, player, side, xHit, yHit);
     	}
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if(blockMaterial == Material.metal)
         {
@@ -123,13 +124,13 @@ public class BlockDoor extends Block
         int l = world.getBlockMetadata(x, y, z);
         if(isTop)
         {
-            if(Block.blocksList[world.getBlockId(x, y - 1, z)] instanceof BlockDoor)
+            if(Block.blocksList[world.getBlockId(x, y - 1, z)] instanceof DoorBlock)
             {
             	Block.blocksList[world.getBlockId(x, y - 1, z)].onBlockRightClicked(world, x, y - 1, z, player, side, xPlaced, yPlaced);
             }
             return true;
         }
-        if(Block.blocksList[world.getBlockId(x, y + 1, z)] instanceof BlockDoor)
+        if(Block.blocksList[world.getBlockId(x, y + 1, z)] instanceof DoorBlock)
         {
             world.setBlockMetadataWithNotify(x, y + 1, z, l ^ 4);
         }
@@ -147,9 +148,9 @@ public class BlockDoor extends Block
         
         if(isTop)
         {
-            if(Block.blocksList[world.getBlockId(x, y - 1, z)] instanceof BlockDoor)
+            if(Block.blocksList[world.getBlockId(x, y - 1, z)] instanceof DoorBlock)
             {
-            	((BlockDoor)Block.blocksList[world.getBlockId(x, y - 1, z)]).onPoweredBlockChange(world, x, y - 1, z, isPowered);
+            	((DoorBlock)Block.blocksList[world.getBlockId(x, y - 1, z)]).onPoweredBlockChange(world, x, y - 1, z, isPowered);
             }
             return;
         }
@@ -158,7 +159,7 @@ public class BlockDoor extends Block
         {
             return;
         }
-        if(Block.blocksList[world.getBlockId(x, y + 1, z)] instanceof BlockDoor)
+        if(Block.blocksList[world.getBlockId(x, y + 1, z)] instanceof DoorBlock)
         {
             world.setBlockMetadataWithNotify(x, y + 1, z, l ^ 4);
         }
@@ -174,11 +175,11 @@ public class BlockDoor extends Block
         if(isTop)
         {
         	Block otherBlock = Block.blocksList[world.getBlockId(x, y - 1, z)];
-            if(!(otherBlock instanceof BlockDoor))
+            if(!(otherBlock instanceof DoorBlock))
             {
                 world.setBlockWithNotify(x, y, z, 0);
             }
-            if(blockId > 0 && Block.blocksList[blockId].canProvidePower())
+            if(blockId > 0 && Block.blocksList[blockId].isSignalSource())
             {
                 otherBlock.onNeighborBlockChange(world, x, y - 1, z, blockId);
             }
@@ -186,7 +187,7 @@ public class BlockDoor extends Block
         {
             boolean flag = false;
         	Block otherBlock = Block.blocksList[world.getBlockId(x, y + 1, z)];
-            if(!(otherBlock instanceof BlockDoor))
+            if(!(otherBlock instanceof DoorBlock))
             {
                 world.setBlockWithNotify(x, y, z, 0);
                 //dropBlockAsItem(world, i, j, k, i1);
@@ -197,7 +198,7 @@ public class BlockDoor extends Block
                 dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
                 world.setBlockWithNotify(x, y, z, 0);
                 flag = true;
-                if(otherBlock instanceof BlockDoor)
+                if(otherBlock instanceof DoorBlock)
                 {
                     world.setBlockWithNotify(x, y + 1, z, 0);
                 }
@@ -209,7 +210,7 @@ public class BlockDoor extends Block
                     //dropBlockAsItem(world, i, j, k, i1);
                 }
             } else
-            if(blockId > 0 && Block.blocksList[blockId].canProvidePower())
+            if(blockId > 0 && Block.blocksList[blockId].isSignalSource())
             {
                 boolean flag1 = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z);
                 onPoweredBlockChange(world, x, y, z, flag1);
@@ -218,39 +219,39 @@ public class BlockDoor extends Block
     }
     
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
     	int myId = world.getBlockId(x, y, z);
     	int myMetadata = world.getBlockMetadata(x, y, z);
     	int upId = world.getBlockId(x, y + 1, z);
     	
-    	if (myId == Block.doorPlanksOakBottom.id && upId == Block.doorPlanksOakBottom.id)
+    	if (myId == Blocks.DOOR_PLANKS_OAK_BOTTOM.id && upId == Blocks.DOOR_PLANKS_OAK_BOTTOM.id)
     	{
-    		world.setBlockAndMetadata(x, y + 1, z, Block.doorPlanksOakTop.id, myMetadata);
+    		world.setBlockAndMetadata(x, y + 1, z, Blocks.DOOR_PLANKS_OAK_TOP.id, myMetadata);
     	}
-    	else if (myId == Block.doorIronBottom.id && upId == Block.doorIronBottom.id)
+    	else if (myId == Blocks.DOOR_IRON_BOTTOM.id && upId == Blocks.DOOR_IRON_BOTTOM.id)
     	{
-    		world.setBlockAndMetadata(x, y + 1, z, Block.doorIronTop.id, myMetadata);
+    		world.setBlockAndMetadata(x, y + 1, z, Blocks.DOOR_IRON_TOP.id, myMetadata);
     	}
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (blockMaterial == Material.metal && dropCause != EnumDropCause.IMPROPER_TOOL)
         {
-            return new ItemStack[] { new ItemStack(Item.doorIron) };
+            return new ItemStack[] { new ItemStack(Items.DOOR_IRON) };
         }
         else if (blockMaterial == Material.wood)
         {
-            return new ItemStack[] { new ItemStack(Item.doorOak) };
+            return new ItemStack[] { new ItemStack(Items.DOOR_OAK) };
         }
 
         return null;
     }
 
     @Override
-    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3d start, Vec3d end)
+    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end)
     {
         setBlockBoundsBasedOnState(world, x, y, z);
         return super.collisionRayTrace(world, x, y, z, start, end);
diff --git a/src/main/java/net/minecraft/core/block/DoorPaintedBlock.java b/src/main/java/net/minecraft/core/block/DoorPaintedBlock.java
new file mode 100644
index 000000000..5f4710ab4
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/DoorPaintedBlock.java
@@ -0,0 +1,19 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class DoorPaintedBlock extends DoorBlock {
+    public DoorPaintedBlock(String key, String namespaceId, int id, Material material, boolean isTop) {
+        super(key, namespaceId, id, material, isTop);
+    }
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
+    {
+        return new ItemStack[] { new ItemStack(Items.DOOR_OAK_PAINTED, 1, 15 - (meta >> 4 & 0xF)) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockEdible.java b/src/main/java/net/minecraft/core/block/EdibleBlock.java
similarity index 80%
rename from src/main/java/net/minecraft/core/block/BlockEdible.java
rename to src/main/java/net/minecraft/core/block/EdibleBlock.java
index 76e6a1230..15b1d0610 100644
--- a/src/main/java/net/minecraft/core/block/BlockEdible.java
+++ b/src/main/java/net/minecraft/core/block/EdibleBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -12,16 +12,16 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.function.Supplier;
 
-public abstract class BlockEdible extends Block {
+public abstract class EdibleBlock extends Block {
     public Item item;
     @NotNull
     private final Supplier<Item> itemSupplier;
     public int maxBites;
     public int healAmount;
 
-    public BlockEdible(String key, int id, int maxBites, int healAmount, @NotNull Supplier<Item> dropItemSupplier)
+    public EdibleBlock(String key, String namespaceId, int id, int maxBites, int healAmount, @NotNull Supplier<Item> dropItemSupplier)
     {
-        super(key, id, Material.cake);
+        super(key, namespaceId, id, Material.cake);
         this.maxBites = maxBites;
         this.healAmount = healAmount;
         this.itemSupplier = dropItemSupplier;
@@ -33,7 +33,7 @@ public abstract class BlockEdible extends Block {
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause == EnumDropCause.PICK_BLOCK || meta == 0)
         {
@@ -44,7 +44,7 @@ public abstract class BlockEdible extends Block {
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
@@ -55,7 +55,7 @@ public abstract class BlockEdible extends Block {
         return false;
     }
 
-    private void eatSlice(World world, int x, int y, int z, EntityPlayer entityplayer)
+    private void eatSlice(World world, int x, int y, int z, Player entityplayer)
     {
         if(entityplayer.getHealth() < entityplayer.getMaxHealth())
         {
@@ -73,7 +73,7 @@ public abstract class BlockEdible extends Block {
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         eatSlice(world, x, y, z, player);
         return true;
diff --git a/src/main/java/net/minecraft/core/block/BlockTileEntity.java b/src/main/java/net/minecraft/core/block/EntityBlock.java
similarity index 53%
rename from src/main/java/net/minecraft/core/block/BlockTileEntity.java
rename to src/main/java/net/minecraft/core/block/EntityBlock.java
index 99dffbe15..7625c31d5 100644
--- a/src/main/java/net/minecraft/core/block/BlockTileEntity.java
+++ b/src/main/java/net/minecraft/core/block/EntityBlock.java
@@ -2,25 +2,25 @@ package net.minecraft.core.block;
 
 
 // Referenced classes of package net.minecraft.src:
-//            Block, World, Material, TileEntity
+//            Block, World, Material, BlockEntity
 
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.world.World;
 
-public abstract class BlockTileEntity extends Block
+public abstract class EntityBlock extends Block
 {
 
-	public BlockTileEntity(String key, int id, Material material)
+	public EntityBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         isEntityTile[id] = true;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         world.setBlockTileEntity(x, y, z, getNewBlockEntity());
     }
 
@@ -31,5 +31,5 @@ public abstract class BlockTileEntity extends Block
         world.removeBlockTileEntity(x, y, z);
     }
 
-    protected abstract TileEntity getNewBlockEntity();
+    protected abstract BlockEntity getNewBlockEntity();
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesEucalyptus.java b/src/main/java/net/minecraft/core/block/EucalyptusLeavesBlock.java
similarity index 59%
rename from src/main/java/net/minecraft/core/block/BlockLeavesEucalyptus.java
rename to src/main/java/net/minecraft/core/block/EucalyptusLeavesBlock.java
index a0cfebe4b..dd0e431a8 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesEucalyptus.java
+++ b/src/main/java/net/minecraft/core/block/EucalyptusLeavesBlock.java
@@ -6,27 +6,27 @@ import net.minecraft.core.block.material.Material;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess, 
-//            WorldChunkManager, World, Block, EntityPlayer, 
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
 //            ItemStack, Item, ItemShears, StatList, 
 //            Entity
 
-public class BlockLeavesEucalyptus extends BlockLeavesBase
+public class EucalyptusLeavesBlock extends BaseLeavesBlock
 {
 
-	public BlockLeavesEucalyptus(String key, int id)
+	public EucalyptusLeavesBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.leaves);
+        super(key, namespaceId, id, Material.leaves);
     }
 
     @Override
     protected Block getSapling()
     {
-        return Block.saplingEucalyptus;
+        return Blocks.SAPLING_EUCALYPTUS;
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
     	if (world.getSeasonManager().getCurrentSeason() != null && world.getSeasonManager().getCurrentSeason().hasFallingLeaves && rand.nextInt(40) == 0)
     	{
diff --git a/src/main/java/net/minecraft/core/block/BlockFarmland.java b/src/main/java/net/minecraft/core/block/FarmlandBlock.java
similarity index 74%
rename from src/main/java/net/minecraft/core/block/BlockFarmland.java
rename to src/main/java/net/minecraft/core/block/FarmlandBlock.java
index ccc8ef0fd..7f05ff384 100644
--- a/src/main/java/net/minecraft/core/block/BlockFarmland.java
+++ b/src/main/java/net/minecraft/core/block/FarmlandBlock.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
@@ -16,13 +16,11 @@ import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
 
-public class BlockFarmland
-	extends Block
-	implements IBonemealable
+public class FarmlandBlock extends Block implements IBonemealable
 {
-	public BlockFarmland(String key, int id)
+	public FarmlandBlock(String key, String namespaceId, int id)
 	{
-		super(key, id, Material.dirt);
+		super(key, namespaceId, id, Material.dirt);
 		setTicking(true);
 		setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F);
 		withLightBlock(255);
@@ -48,11 +46,11 @@ public class BlockFarmland
 	@Override
 	public AABB getCollisionBoundingBoxFromPool(final WorldSource world, final int x, final int y, final int z)
 	{
-		return AABB.getBoundingBoxFromPool(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1);
+		return AABB.getTemporaryBB(x + 0, y + 0, z + 0, x + 1, y + 1, z + 1);
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		switch (dropCause)
 		{
@@ -61,9 +59,9 @@ public class BlockFarmland
 				return new ItemStack[] { new ItemStack(this) };
 			default:
 				if(isWet(world.getBlockMetadata(x, y, z))){
-					return new ItemStack[] { new ItemStack(Block.mud) };
+					return new ItemStack[] { new ItemStack(Blocks.MUD) };
 				} else {
-					return new ItemStack[] { new ItemStack(Block.dirt) };
+					return new ItemStack[] { new ItemStack(Blocks.DIRT) };
 				}
 		}
 
@@ -75,7 +73,7 @@ public class BlockFarmland
 		{
 			for (int iz = z - radius; iz <= z + radius; iz++)
 			{
-				if (world.getBlockId(ix, y + 1, iz) == Block.cropsWheat.id)
+				if (world.getBlockId(ix, y + 1, iz) == Blocks.CROPS_WHEAT.id)
 				{
 					return true;
 				}
@@ -118,16 +116,15 @@ public class BlockFarmland
 	{
 		if (world.rand.nextInt(4) == 0)
 		{
-			if (entity instanceof EntityPlayer)
+			if (entity instanceof Player)
 			{
-				if (((EntityPlayer) entity).inventory.armorInventory[0] != null && ((EntityPlayer) entity).inventory.armorInventory[0].getItem() == Item.armorBootsLeather)
-				{
+				if (((Player) entity).inventory.armorInventory[0] != null && ((Player) entity).inventory.armorInventory[0].getItem() == Items.ARMOR_BOOTS_LEATHER) {
 					return;
 				}
 				if(isWet(world.getBlockMetadata(x, y, z)))
-					world.setBlockWithNotify(x, y, z, Block.mud.id);
+					world.setBlockWithNotify(x, y, z, Blocks.MUD.id);
 				else
-					world.setBlockWithNotify(x, y, z, Block.dirt.id);
+					world.setBlockWithNotify(x, y, z, Blocks.DIRT.id);
 
 			}
 		}
@@ -141,15 +138,15 @@ public class BlockFarmland
 		if (material.isSolid())
 		{
 			if(isWet(world.getBlockMetadata(x, y, z)))
-				world.setBlockWithNotify(x, y, z, Block.mud.id);
+				world.setBlockWithNotify(x, y, z, Blocks.MUD.id);
 			else
-				world.setBlockWithNotify(x, y, z, Block.dirt.id);
+				world.setBlockWithNotify(x, y, z, Blocks.DIRT.id);
 
 		}
 	}
 
 	@Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
 	{
 		return false;
 	}
@@ -165,14 +162,14 @@ public class BlockFarmland
 					int newData = ((data & 0x0F) - 1) | (data & 0xF0);
 					world.setBlockMetadataWithNotify(x, y, z, newData);
 				} else if (!isCropsNearby(world, x, y, z)) {
-					world.setBlockWithNotify(x, y, z, Block.dirt.id);
+					world.setBlockWithNotify(x, y, z, Blocks.DIRT.id);
 				}
 			}
 		}
 	}
 
 	@Override
-	public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		int data = world.getBlockMetadata(blockX, blockY, blockZ);
 		if (!isFertilized(data)) {
 			world.setBlockMetadataWithNotify(blockX, blockY, blockZ, setFertilized(data, true));
diff --git a/src/main/java/net/minecraft/core/block/BlockFence.java b/src/main/java/net/minecraft/core/block/FenceBlock.java
similarity index 88%
rename from src/main/java/net/minecraft/core/block/BlockFence.java
rename to src/main/java/net/minecraft/core/block/FenceBlock.java
index f8290710b..c1b5f735c 100644
--- a/src/main/java/net/minecraft/core/block/BlockFence.java
+++ b/src/main/java/net/minecraft/core/block/FenceBlock.java
@@ -10,7 +10,7 @@ import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.WorldSource;
 
 
-public class BlockFence extends Block
+public class FenceBlock extends Block
 {
 //    private static final List<BoundingVolume> selectionVolumes = new ArrayList<>();
 //
@@ -56,9 +56,9 @@ public class BlockFence extends Block
 //        selectionVolumes.add(newVolume);
 //    }
 
-    public BlockFence(String key, int id)
+    public FenceBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
@@ -74,13 +74,13 @@ public class BlockFence extends Block
     	boolean connectXNeg = canConnectTo(world, x - 1, y, z);
     	boolean connectZPos = canConnectTo(world, x, y, z + 1);
     	boolean connectZNeg = canConnectTo(world, x, y, z - 1);
-        return AABB.getBoundingBoxFromPool(x + (connectXNeg ? 0.0f : 0.375f), y, z + (connectZNeg ? 0.0f : 0.375f), x + 1 - (connectXPos ? 0.0f : 0.375f), (float) y + 1.5F, z + 1 - (connectZPos ? 0.0f : 0.375f));
+        return AABB.getTemporaryBB(x + (connectXNeg ? 0.0f : 0.375f), y, z + (connectZNeg ? 0.0f : 0.375f), x + 1 - (connectXPos ? 0.0f : 0.375f), (float) y + 1.5F, z + 1 - (connectZPos ? 0.0f : 0.375f));
     }
     
     @Override
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-    	return getCollisionBoundingBoxFromPool(world, x, y, z).expand(0, -0.25f, 0).offset(0, -0.25f, 0);
+    	return getCollisionBoundingBoxFromPool(world, x, y, z).grow(0, -0.25f, 0).move(0, -0.25f, 0);
     }
 
 //    @Override
@@ -121,7 +121,7 @@ public class BlockFence extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockFenceGate.java b/src/main/java/net/minecraft/core/block/FenceGateBlock.java
similarity index 70%
rename from src/main/java/net/minecraft/core/block/BlockFenceGate.java
rename to src/main/java/net/minecraft/core/block/FenceGateBlock.java
index 295482077..0f7dc784c 100644
--- a/src/main/java/net/minecraft/core/block/BlockFenceGate.java
+++ b/src/main/java/net/minecraft/core/block/FenceGateBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.sound.SoundCategory;
@@ -11,18 +11,12 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
-
-// updated
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, World, AxisAlignedBB,
-//            EntityLiving, MathHelper, EntityPlayer
-
-public class BlockFenceGate extends Block
+public class FenceGateBlock extends Block
 {
 
-    public BlockFenceGate(String key, int id)
+    public FenceGateBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
@@ -34,7 +28,7 @@ public class BlockFenceGate extends Block
             return null;
         } else
         {
-        	return getAABBFromMeta(l).expand(0, 0.25f, 0).offset(x, y + 0.25f, z);
+        	return getAABBFromMeta(l).grow(0, 0.25f, 0).move(x, y + 0.25f, z);
         }
     }
     
@@ -42,11 +36,11 @@ public class BlockFenceGate extends Block
     {
     	if (func_35290_f(meta) == 3 || func_35290_f(meta) == 1)
     	{
-    		return AABB.getBoundingBoxFromPool(0.375f, 0, 0, 1 - 0.375f, 1.0F, 1f);
+    		return AABB.getTemporaryBB(0.375f, 0, 0, 1 - 0.375f, 1.0F, 1f);
     	}
     	else
     	{
-    		return AABB.getBoundingBoxFromPool(0, 0, 0.375f, 1, 1.0f, 1 - 0.375f);
+    		return AABB.getTemporaryBB(0, 0, 0.375f, 1, 1.0f, 1 - 0.375f);
     	}
 
     }
@@ -54,7 +48,7 @@ public class BlockFenceGate extends Block
     @Override
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-    	return getAABBFromMeta(world.getBlockMetadata(x, y, z)).offset(x, y, z);
+    	return getAABBFromMeta(world.getBlockMetadata(x, y, z)).move(x, y, z);
     }
     
     @Override
@@ -77,27 +71,27 @@ public class BlockFenceGate extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	int directionmeta = entity.getHorizontalPlacementDirection(side).getHorizontalIndex();
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	int directionmeta = mob.getHorizontalPlacementDirection(side).getHorizontalIndex();
         int colormeta = world.getBlockMetadata(x, y, z);
         world.setBlockMetadataWithNotify(x, y, z, directionmeta | (colormeta & 0xF0));
     }
     
     @Override
-	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
     		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
     
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         if(func_35291_d(l))
@@ -105,7 +99,7 @@ public class BlockFenceGate extends Block
             world.setBlockMetadataWithNotify(x, y, z, l & -5);
         } else
         {
-            int i1 = (MathHelper.floor_double((double)((player.yRot * 4F) / 360F) + 0.5D) & 3) % 4;
+            int i1 = (MathHelper.floor((double)((player.yRot * 4F) / 360F) + 0.5D) & 3) % 4;
             int j1 = func_35290_f(l);
             if(j1 == (i1 + 2) % 4)
             {
diff --git a/src/main/java/net/minecraft/core/block/FireBlock.java b/src/main/java/net/minecraft/core/block/FireBlock.java
new file mode 100644
index 000000000..003eb7883
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/FireBlock.java
@@ -0,0 +1,390 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class FireBlock extends Block {
+	public static final int FLAME_INSTANT = 60;
+	public static final int FLAME_EASY = 30;
+	public static final int FLAME_MEDIUM = 15;
+	public static final int FLAME_HARD = 5;
+	public static final int BURN_INSTANT = 100;
+	public static final int BURN_EASY = 60;
+	public static final int BURN_MEDIUM = 20;
+	public static final int BURN_HARD = 5;
+	public static final int BURN_NEVER = 0;
+	private static final int[] flameChance = new int[Block.blocksList.length];
+	private static final int[] burnChance = new int[Block.blocksList.length];
+
+	public FireBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.fire);
+		setTicking(true);
+		setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
+	}
+
+	@Override
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
+	{
+		return null;
+	}
+
+	@Override
+	public void initializeBlock() {
+		setFlammable(Blocks.PLANKS_OAK.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.PLANKS_OAK_PAINTED.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.FENCE_PLANKS_OAK.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.FENCE_PLANKS_OAK_PAINTED.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.SLAB_PLANKS_OAK.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.SLAB_PLANKS_PAINTED.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.STAIRS_PLANKS_OAK.id, FLAME_HARD, BURN_MEDIUM);
+		setFlammable(Blocks.LOG_OAK.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LOG_PINE.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LOG_BIRCH.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LOG_CHERRY.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LOG_OAK_MOSSY.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LOG_EUCALYPTUS.id, FLAME_HARD, BURN_HARD);
+		setFlammable(Blocks.LEAVES_OAK.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_PINE.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_BIRCH.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_CHERRY.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_CHERRY_FLOWERING.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_OAK_RETRO.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_SHRUB.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_EUCALYPTUS.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.LEAVES_CACAO.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.BOOKSHELF_PLANKS_OAK.id, FLAME_EASY, BURN_MEDIUM);
+		setFlammable(Blocks.TNT.id, FLAME_MEDIUM, BURN_INSTANT);
+		setFlammable(Blocks.WOOL.id, FLAME_EASY, BURN_EASY);
+		setFlammable(Blocks.MOSS_STONE.id, 100, 30);
+		setFlammable(Blocks.MOSS_BASALT.id, 100, 30);
+		setFlammable(Blocks.MOSS_LIMESTONE.id, 100, 30);
+		setFlammable(Blocks.MOSS_GRANITE.id, 100, 30);
+	}
+
+	public static void setFlammable(int id, int flameChance, int burnChance) {
+		FireBlock.flameChance[id] = flameChance;
+		FireBlock.burnChance[id] = burnChance;
+	}
+
+	@Override
+	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z) {
+		return null;
+	}
+
+	@Override
+	public boolean isSolidRender() {
+		return false;
+	}
+
+	@Override
+	public boolean isCubeShaped() {
+		return false;
+	}
+
+	@Override
+	public void onBlockRemoved(World world, int x, int y, int z, int data)
+	{
+		for (int i = 0; i < 8; i++)
+		{
+			world.spawnParticle("largesmoke", (double)x + Math.random(), (double)y + 0.5D, (double)z + Math.random(), 0.0D, 0.0D, 0.0D, 0);
+		}
+	}
+
+	@Override
+	public int tickDelay() {
+		return 40;
+	}
+	
+	public void setBurnResult(World world, int x, int y, int z) {
+		world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
+	}
+
+	@Override
+	public void updateTick(World world, int x, int y, int z, Random rand) {
+		Block blockUnder = world.getBlock(x, y - 1, z);
+		boolean infiniBurn = blockUnder != null && blockUnder.hasTag(BlockTags.INFINITE_BURN);
+
+		//Extinguish fire
+		if (!isValidFireLocation(world, x, y, z)) {
+			setBurnResult(world, x, y, z);
+		}
+		
+		//Extinguish fire (Rain / Snow)
+		if (!infiniBurn && world.getCurrentWeather() != null && world.getCurrentWeather().isPrecipitation && (
+				   world.canBlockBeRainedOn(x, y, z)
+				|| world.canBlockBeRainedOn(x - 1, y, z)
+				|| world.canBlockBeRainedOn(x + 1, y, z)
+				|| world.canBlockBeRainedOn(x, y, z - 1)
+				|| world.canBlockBeRainedOn(x, y, z + 1))) {
+			setBurnResult(world, x, y, z);
+			return;
+		}
+		
+		int meta = world.getBlockMetadata(x, y, z);
+		if (meta < 15) {
+			world.setBlockMetadata(x, y, z, meta + rand.nextInt(3) / 2);
+		}
+		world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+		
+		
+		if (!infiniBurn && !canNeighborCatchFire(world, x, y, z)) {
+			if (!world.isBlockNormalCube(x, y - 1, z) || meta > 3) {
+				setBurnResult(world, x, y, z);
+			}
+			return;
+		}
+		
+		if (!infiniBurn && !canBurn(world, x, y - 1, z) && meta == 15 && rand.nextInt(4) == 0) {
+			setBurnResult(world, x, y, z);
+			return;
+		}
+		
+		checkBurn(world, x + 1, y, z, 300, rand, meta);
+		checkBurn(world, x - 1, y, z, 300, rand, meta);
+		checkBurn(world, x, y - 1, z, 250, rand, meta);
+		checkBurn(world, x, y + 1, z, 250, rand, meta);
+		checkBurn(world, x, y, z - 1, 300, rand, meta);
+		checkBurn(world, x, y, z + 1, 300, rand, meta);
+		
+		for (int x1 = x - 1; x1 <= x + 1; x1++) {
+			for (int z1 = z - 1; z1 <= z + 1; z1++) {
+				for (int y1 = y - 1; y1 <= y + 4; y1++) {
+					if (x1 == x && y1 == y && z1 == z) {
+						continue;
+					}
+					
+					int a = 100;
+					if (y1 > y + 1) {
+						a += (y1 - (y + 1)) * 100;
+					}
+					int b = getFireChance(world, x1, y1, z1);
+					if (b <= 0) {
+						continue;
+					}
+					
+					int c = (b + 40) / (meta + 30);
+					if (c <= 0 || rand.nextInt(a) > c || (world.getCurrentWeather() != null && world.getCurrentWeather().isPrecipitation) &&
+							   world.canBlockBeRainedOn(x1, y1, z1)
+							|| world.canBlockBeRainedOn(x1 - 1, y1, z)
+							|| world.canBlockBeRainedOn(x1 + 1, y1, z1)
+							|| world.canBlockBeRainedOn(x1, y1, z1 - 1)
+							|| world.canBlockBeRainedOn(x1, y1, z1 + 1)
+					) {
+						continue;
+					}
+					
+					if(getBurnResultId(world, x1, y1, z1) == 0 /* Fix for fire destroying moss blocks */) {
+						//Spread Fire with higher meta
+						world.setBlockAndMetadataWithNotify(x1, y1, z1, id, Math.min(meta + rand.nextInt(5) / 4, 15));
+					}
+				}
+
+			}
+
+		}
+
+	}
+
+	private void checkBurn(World world, int x, int y, int z, int chance, Random random, int meta) {
+		if (random.nextInt(chance) < burnChance[world.getBlockId(x, y, z)]) {
+			boolean isTNT = world.getBlockId(x, y, z) == Blocks.TNT.id;
+			
+			if (random.nextInt(meta + 10) < 5 && !world.canBlockBeRainedOn(x, y, z)) {
+				if(getBurnResultId(world, x, y, z) == 0 /* Fix for fire destroying moss blocks */) {
+					//Spread Fire with higher meta
+					world.setBlockAndMetadataWithNotify(x, y, z, id, Math.min(meta + random.nextInt(5) / 4, 15));
+				}
+			} else {
+				setBurnResult(world, x, y, z);
+			}
+			
+			if (isTNT) {
+				TNTBlock TNTBlock = (TNTBlock) Blocks.TNT;
+				TNTBlock.ignite(world, x, y, z, true);
+			}
+		}
+	}
+
+	private boolean canNeighborCatchFire(World world, int x, int y, int z) {
+		if (canBurn(world, x + 1, y, z)) return true;
+		if (canBurn(world, x - 1, y, z)) return true;
+		if (canBurn(world, x, y - 1, z)) return true;
+		if (canBurn(world, x, y + 1, z)) return true;
+		if (canBurn(world, x, y, z - 1)) return true;
+        return canBurn(world, x, y, z + 1);
+    }
+
+	private int getFireChance(World world, int x, int y, int z) {
+		int flammability = 0;
+		if (!world.isAirBlock(x, y, z)) {
+			return 0;
+		} else {
+			flammability = getFlammability(world, x + 1, y, z, flammability);
+			flammability = getFlammability(world, x - 1, y, z, flammability);
+			flammability = getFlammability(world, x, y - 1, z, flammability);
+			flammability = getFlammability(world, x, y + 1, z, flammability);
+			flammability = getFlammability(world, x, y, z - 1, flammability);
+			flammability = getFlammability(world, x, y, z + 1, flammability);
+			return flammability;
+		}
+	}
+
+	public static boolean canBurn(WorldSource worldSource, int x, int y, int z) {
+		return flameChance[worldSource.getBlockId(x, y, z)] > 0;
+	}
+	public static boolean canBurn(int blockId) {
+		return flameChance[blockId] > 0;
+	}
+
+	public static int getFlammability(World world, int x, int y, int z, int currentFlameChance) {
+		int blockFlameChance = flameChance[world.getBlockId(x, y, z)];
+        return Math.max(blockFlameChance, currentFlameChance);
+	}
+	
+	public boolean isValidFireLocation(World world, int x, int y, int z) {
+		return world.isBlockNormalCube(x, y - 1, z) || canNeighborCatchFire(world, x, y, z); 
+	}
+
+	@Override
+	public boolean canPlaceBlockAt(World world, int x, int y, int z) {
+		return isValidFireLocation(world, x, y, z);
+	}
+
+	@Override
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
+		if (!world.isBlockNormalCube(x, y - 1, z) && !canNeighborCatchFire(world, x, y, z)) {
+
+			world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
+        }
+	}
+
+	protected int getBurnResultId(World world, int x, int y, int z) {
+		int id = world.getBlockId(x, y, z);
+		Block stoneBlock = MossBlock.getStoneBlock(id);
+		if (stoneBlock != null) {
+			return stoneBlock.id;
+		}
+		return 0;
+	}
+
+	@Override
+	public void onBlockPlacedByWorld(World world, int x, int y, int z) {
+		if (world.getBlockId(x, y - 1, z) == Blocks.OBSIDIAN.id
+				&& ((PortalBlock) Blocks.PORTAL_NETHER).tryToCreatePortal(world, x, y, z)) {
+			return;
+		}
+		if (!world.isBlockNormalCube(x, y - 1, z) && !canNeighborCatchFire(world, x, y, z)) {
+			world.setBlockWithNotify(x, y, z, getBurnResultId(world, x, y, z));
+		} else {
+			world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+		}
+	}
+	public void ignite(final World world, final int x, final int y, final int z) {
+		boolean hasCreatedFire = false;
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x, y + 1, z);
+		}
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x - 1, y, z);
+		}
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x + 1, y, z);
+		}
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x, y, z - 1);
+		}
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x, y, z + 1);
+		}
+		if (!hasCreatedFire) {
+			hasCreatedFire = this.tryIgnite(world, x, y - 1, z);
+		}
+		if (!hasCreatedFire) {
+			world.setBlock(x, y, z, Blocks.FIRE.id);
+		}
+	}
+	private boolean tryIgnite(final World world, final int x, final int y, final int z) {
+		final int tile = world.getBlockId(x, y, z);
+		if (tile == Blocks.FIRE.id) {
+			return true;
+		}
+		if (tile == 0) {
+			world.setBlock(x, y, z, Blocks.FIRE.id);
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	public void animationTick(World world, int x, int y, int z, Random rand) {
+		if (rand.nextInt(24) == 0) {
+			world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, "fire.fire",
+								  1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F);
+		}
+		if (world.isBlockNormalCube(x, y - 1, z) || canBurn(world, x, y - 1, z)) {
+			for (int l = 0; l < 3; l++) {
+				double f = (double) x + rand.nextFloat();
+				double f6 = (double) y + rand.nextFloat() * 0.5F + 0.5F;
+				double f12 = (double) z + rand.nextFloat();
+				world.spawnParticle("largesmoke", f, f6, f12, 0.0D, 0.0D, 0.0D, 0);
+			}
+
+		} else {
+			if (canBurn(world, x - 1, y, z)) {
+				for (int i1 = 0; i1 < 2; i1++) {
+					double f1 = (double) x + rand.nextFloat() * 0.1F;
+					double f7 = (double) y + rand.nextFloat();
+					double f13 = (double) z + rand.nextFloat();
+					world.spawnParticle("largesmoke", f1, f7, f13, 0.0D, 0.0D, 0.0D, 0);
+				}
+
+			}
+			if (canBurn(world, x + 1, y, z)) {
+				for (int j1 = 0; j1 < 2; j1++) {
+					double f2 = (double) (x + 1) - rand.nextFloat() * 0.1F;
+					double f8 = (double) y + rand.nextFloat();
+					double f14 = (double) z + rand.nextFloat();
+					world.spawnParticle("largesmoke", f2, f8, f14, 0.0D, 0.0D, 0.0D, 0);
+				}
+
+			}
+			if (canBurn(world, x, y, z - 1)) {
+				for (int k1 = 0; k1 < 2; k1++) {
+					double f3 = (double) x + rand.nextFloat();
+					double f9 = (double) y + rand.nextFloat();
+					double f15 = (double) z + rand.nextFloat() * 0.1F;
+					world.spawnParticle("largesmoke", f3, f9, f15, 0.0D, 0.0D, 0.0D, 0);
+				}
+
+			}
+			if (canBurn(world, x, y, z + 1)) {
+				for (int l1 = 0; l1 < 2; l1++) {
+					double f4 = (double) x + rand.nextFloat();
+					double f10 = (double) y + rand.nextFloat();
+					double f16 = (double) (z + 1) - rand.nextFloat() * 0.1F;
+					world.spawnParticle("largesmoke", f4, f10, f16, 0.0D, 0.0D, 0.0D, 0);
+				}
+
+			}
+			if (canBurn(world, x, y + 1, z)) {
+				for (int i2 = 0; i2 < 2; i2++) {
+					double f5 = (double) x + rand.nextFloat();
+					double f11 = (double) (y + 1) - rand.nextFloat() * 0.1F;
+					double f17 = (double) z + rand.nextFloat();
+					world.spawnParticle("largesmoke", f5, f11, f17, 0.0D, 0.0D, 0.0D, 0);
+				}
+
+			}
+		}
+	}
+	
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java b/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
similarity index 81%
rename from src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
rename to src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
index 9b44e6fc9..8a5c9d853 100644
--- a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
+++ b/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -18,14 +18,14 @@ import org.jetbrains.annotations.NotNull;
 import java.util.Random;
 import java.util.function.Supplier;
 
-public class BlockLanternFirefly extends Block{
+public class FireflyLanternBlock extends Block{
 
     public Item item;
     private final Supplier<Item> itemSupplier;
-    private final EntityFireflyCluster.FireflyColor color;
+    private final FireflyClusterMob.FireflyColor color;
 
-    public BlockLanternFirefly(String key, int id, EntityFireflyCluster.FireflyColor colour, @NotNull Supplier<Item> itemSupplier) {
-        super(key, id, Material.glass);
+    public FireflyLanternBlock(String key, String namespaceId, int id, FireflyClusterMob.FireflyColor colour, @NotNull Supplier<Item> itemSupplier) {
+        super(key, namespaceId, id, Material.glass);
         this.color = colour;
         this.itemSupplier = itemSupplier;
         setBlockBounds(0.3125f, 0, 0.3125f, 1 - 0.3125f, 0.5f, 1 - 0.3125f);
@@ -42,7 +42,7 @@ public class BlockLanternFirefly extends Block{
         float offset = 0.0F;
         if (metadata == 1)
             offset = 0.3875F;
-        return AABB.getBoundingBoxFromPool(x + 0.3125f, y + offset, z + 0.3125f, x + 1 - 0.3125f, (float) y + 0.5F + offset, z + 1 - 0.3125f);
+        return AABB.getTemporaryBB(x + 0.3125f, y + offset, z + 0.3125f, x + 1 - 0.3125f, (float) y + 0.5F + offset, z + 1 - 0.3125f);
     }
 
     @Override
@@ -70,13 +70,13 @@ public class BlockLanternFirefly extends Block{
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+    public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(rand.nextInt(3)==0)
         {
@@ -85,7 +85,7 @@ public class BlockLanternFirefly extends Block{
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         world.setBlockRaw(x, y, z, 0);
         world.playSoundAtEntity(player, player, "random.pop", 0.2F, 0.5f);
@@ -97,7 +97,7 @@ public class BlockLanternFirefly extends Block{
         return true;
     }
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
         if ((side == Side.BOTTOM || (side != Side.TOP && sideHeight >= 0.5d)) && (world.isBlockNormalCube(x, y+1, z) || Block.hasTag(world.getBlockId(x, y + 1, z), BlockTags.CAN_HANG_OFF))){
             world.setBlockMetadataWithNotify(x, y, z, 1);
             return;
@@ -133,7 +133,7 @@ public class BlockLanternFirefly extends Block{
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -158,12 +158,12 @@ public class BlockLanternFirefly extends Block{
     }
     
     @Override
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, Player player, Item item) {
     	if(item != null && item.isSilkTouch()) {
     		return;
     	}
     	if(!world.isClientSide) {
-        	EntityFireflyCluster entity = new EntityFireflyCluster(world);
+        	FireflyClusterMob entity = new FireflyClusterMob(world);
         	entity.setColor(color);
         	entity.setFireflyCount(1);
         	entity.setClusterSize(0);
diff --git a/src/main/java/net/minecraft/core/block/BlockFlag.java b/src/main/java/net/minecraft/core/block/FlagBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockFlag.java
rename to src/main/java/net/minecraft/core/block/FlagBlock.java
index fcbac8b3c..42c29847b 100644
--- a/src/main/java/net/minecraft/core/block/BlockFlag.java
+++ b/src/main/java/net/minecraft/core/block/FlagBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityFlag;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.FlagBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
 
@@ -14,10 +14,10 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockFlag extends BlockTileEntity{
+public class FlagBlock extends EntityBlock {
 
-    public BlockFlag(String key, int id, Material material) {
-        super(key, id, material);
+    public FlagBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material);
         float f = 2 / 16f;
         float f1 = 1.0F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f);
@@ -29,7 +29,7 @@ public class BlockFlag extends BlockTileEntity{
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -41,27 +41,27 @@ public class BlockFlag extends BlockTileEntity{
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        ItemStack stack = new ItemStack(Item.flag);
-        if (tileEntity != null)
+        ItemStack stack = new ItemStack(Items.FLAG);
+        if (blockEntity != null)
         {
             CompoundTag compound = new CompoundTag();
-            ((TileEntityFlag) tileEntity).writeFlagNBT(compound);
+            ((FlagBlockEntity) blockEntity).writeFlagNBT(compound);
             stack.getData().putCompound("FlagData", compound);
         }
         return new ItemStack[] { stack };
     }
 
 	@Override
-	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
 		if (!world.isClientSide) {
-			TileEntityFlag flag = (TileEntityFlag) world.getBlockTileEntity(x, y, z);
+			FlagBlockEntity flag = (FlagBlockEntity) world.getBlockEntity(x, y, z);
 			if (flag.owner != null && !flag.owner.isEmpty() && !player.username.equals(flag.owner)) {
 				return false;
 			}
 			int heldItemId = player.getHeldItem() != null ? player.getHeldItem().itemID : 0;
-			if(heldItemId == Item.map.id || heldItemId == Item.flag.id) {
+			if(heldItemId == Items.MAP.id || heldItemId == Items.FLAG.id) {
 				return false;
 			}
 			player.displayGUIEditFlag(flag);
@@ -71,10 +71,10 @@ public class BlockFlag extends BlockTileEntity{
 	}
 
     @Override
-    protected TileEntity getNewBlockEntity() {
+    protected BlockEntity getNewBlockEntity() {
         try
         {
-            return new TileEntityFlag();
+            return new FlagBlockEntity();
         }
         catch(Exception exception)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockFlower.java b/src/main/java/net/minecraft/core/block/FlowerBlock.java
similarity index 84%
rename from src/main/java/net/minecraft/core/block/BlockFlower.java
rename to src/main/java/net/minecraft/core/block/FlowerBlock.java
index 13735f24d..14b31fc1d 100644
--- a/src/main/java/net/minecraft/core/block/BlockFlower.java
+++ b/src/main/java/net/minecraft/core/block/FlowerBlock.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -15,37 +15,37 @@ import net.minecraft.core.world.WorldSource;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            Block, Material, World, BlockGrass, 
+//            Block, Material, World, GrassBlock,
 //            AxisAlignedBB
 
-public class BlockFlower extends Block implements IBonemealable
+public class FlowerBlock extends Block implements IBonemealable
 {
 
 	public boolean killedByWeather = false;
 	public boolean canBeBonemealed = false;
 
-	public BlockFlower(String key, int id)
+	public FlowerBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.plant);
+        super(key, namespaceId, id, Material.plant);
         setTicking(true);
         float f = 0.2F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 3F, 0.5F + f);
     }
     
-    public BlockFlower setKilledByWeather()
+    public FlowerBlock setKilledByWeather()
     {
     	killedByWeather = true;
     	return this;
     }
-    public BlockFlower setBonemealable()
+    public FlowerBlock setBonemealable()
     {
         canBeBonemealed = true;
         return this;
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side placeSide, EntityLiving entity, double sideHeight) {
-        if (entity instanceof EntityPlayer){
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side placeSide, Mob mob, double sideHeight) {
+        if (mob instanceof Player){
             world.setBlockMetadata(x, y, z, world.getBlockMetadata(x, y, z) | 0b1000_0000); // Set persistent flag
         }
     }
@@ -107,13 +107,13 @@ public class BlockFlower extends Block implements IBonemealable
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         Random rand = world.rand;
         if(!world.isClientSide && canBeBonemealed)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java b/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
similarity index 62%
rename from src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
rename to src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
index 0b99fdac4..0eaf1dad1 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
+++ b/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
@@ -12,37 +12,38 @@ import net.minecraft.core.world.season.Seasons;
 
 import java.util.Random;
 
-public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBonemealable
+public class FloweringCherryLeavesBlock extends CherryLeavesBlock implements IBonemealable
 {
-	public BlockLeavesCherryFlowering(String key, int id) {
-        super(key, id);
+    public static final int MASK_GROWTH_DATA = 0b1111_0000;
+	public FloweringCherryLeavesBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        int growthRate = (meta & 0xF0) >> 4;
+        int growthRate = getGrowthRate(meta);
         if (dropCause == EnumDropCause.PICK_BLOCK || dropCause == EnumDropCause.SILK_TOUCH) return new ItemStack[] { new ItemStack(this) };
 
         if (growthRate == 0) return null;
         else
         {
-            return new ItemStack[] { new ItemStack(Item.foodCherry, world.rand.nextInt(2) + 1) };
+            return new ItemStack[] { new ItemStack(Items.FOOD_CHERRY, world.rand.nextInt(2) + 1) };
         }
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         int meta = world.getBlockMetadata(x, y, z);
-        int decayData = meta & 0x0F;
-        int growthRate = (meta & 0xF0) >> 4;
+        int decayData = meta & MASK_DECAY_DATA;
+        int growthRate = getGrowthRate(meta);
         if(growthRate > 0)
         {
             world.playSoundAtEntity(player, player, "random.pop", 0.2F, 0.5f);
@@ -51,7 +52,7 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
                 dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, meta, null);
             }
             world.setBlockMetadataWithNotify(x, y, z, decayData);
-            world.scheduleBlockUpdate(x, y, z, leavesCherryFlowering.id, tickRate());
+            world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CHERRY_FLOWERING.id, tickDelay());
             return true;
         }
         return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
@@ -62,24 +63,24 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
 	public void updateTick(World world, int x, int y, int z, Random rand) {
         super.updateTick(world, x, y, z, rand);
         int meta = world.getBlockMetadata(x, y, z);
-        int growthRate = (meta & 0XF0) >> 4;
+        int growthRate = getGrowthRate(meta);
 
         if (world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING) {
             if (rand.nextInt(20) == 0) {
                 if ((growthRate) == 0) {
                     world.setBlockMetadataWithNotify(x, y, z, 1 << 4 | meta);
-                    world.scheduleBlockUpdate(x, y, z, leavesCherryFlowering.id, tickRate());
+                    world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CHERRY_FLOWERING.id, tickDelay());
                 }
             }
         }
        else if(growthRate > 0){
-            world.setBlockMetadataWithNotify(x, y, z, meta & 0X0F);
-            world.scheduleBlockUpdate(x, y, z, leavesCherryFlowering.id, tickRate());
+            world.setBlockMetadataWithNotify(x, y, z, meta & MASK_DECAY_DATA);
+            world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CHERRY_FLOWERING.id, tickDelay());
         }
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
         if(((meta & 0xF0) >> 4) == 0)
         {
@@ -97,4 +98,7 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
         }
         return false;
     }
+    public static int getGrowthRate(int meta){
+        return (meta & MASK_GROWTH_DATA) >> NUM_DECAY_BITS;
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockFluidFlowing.java b/src/main/java/net/minecraft/core/block/FlowingFluidBlock.java
similarity index 67%
rename from src/main/java/net/minecraft/core/block/BlockFluidFlowing.java
rename to src/main/java/net/minecraft/core/block/FlowingFluidBlock.java
index 0e9c2729a..a1b1642c0 100644
--- a/src/main/java/net/minecraft/core/block/BlockFluidFlowing.java
+++ b/src/main/java/net/minecraft/core/block/FlowingFluidBlock.java
@@ -9,18 +9,22 @@ import net.minecraft.core.world.World;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFluid, World, Material, WorldProvider, 
+//            FluidBlock, World, Material, WorldProvider,
 //            Block
 
-public class BlockFluidFlowing extends BlockFluid
+public class FlowingFluidBlock extends FluidBlock
 {
+    int maxCount;
+    boolean[] result;
+    int[] distance;
 
-	public BlockFluidFlowing(String key, int id, Material material)
+
+	public FlowingFluidBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
-        numAdjacentSources = 0;
-        isOptimalFlowDirection = new boolean[4];
-        flowCost = new int[4];
+        super(key, namespaceId, id, material);
+        maxCount = 0;
+        result = new boolean[4];
+        distance = new int[4];
     }
 
     private void setFluidStill(World world, int x, int y, int z)
@@ -43,11 +47,11 @@ public class BlockFluidFlowing extends BlockFluid
         if(localFlowDecay > 0)
         {
             int surroundingFlowDecay = -100;
-            numAdjacentSources = 0;
-            surroundingFlowDecay = getSmallestFlowDecay(world, x - 1, y, z, surroundingFlowDecay);
-            surroundingFlowDecay = getSmallestFlowDecay(world, x + 1, y, z, surroundingFlowDecay);
-            surroundingFlowDecay = getSmallestFlowDecay(world, x, y, z - 1, surroundingFlowDecay);
-            surroundingFlowDecay = getSmallestFlowDecay(world, x, y, z + 1, surroundingFlowDecay);
+            maxCount = 0;
+            surroundingFlowDecay = getHighest(world, x - 1, y, z, surroundingFlowDecay);
+            surroundingFlowDecay = getHighest(world, x + 1, y, z, surroundingFlowDecay);
+            surroundingFlowDecay = getHighest(world, x, y, z - 1, surroundingFlowDecay);
+            surroundingFlowDecay = getHighest(world, x, y, z + 1, surroundingFlowDecay);
             int newFlowDecay = surroundingFlowDecay + flowDecayMod;
             if(newFlowDecay >= 8 || surroundingFlowDecay < 0)
             {
@@ -64,7 +68,7 @@ public class BlockFluidFlowing extends BlockFluid
                     newFlowDecay = flowDecayAbove + 8;
                 }
             }
-            if(numAdjacentSources >= 2 && blockMaterial == Material.water)
+            if(maxCount >= 2 && blockMaterial == Material.water)
             {
                 if(world.getBlockMaterial(x, y - 1, z).isSolid())
                 {
@@ -85,7 +89,7 @@ public class BlockFluidFlowing extends BlockFluid
                 else
                 {
                     world.setBlockMetadataWithNotify(x, y, z, localFlowDecay);
-                    world.scheduleBlockUpdate(x, y, z, id, tickRate());
+                    world.scheduleBlockUpdate(x, y, z, id, tickDelay());
                     world.notifyBlocksOfNeighborChange(x, y, z, id);
                 }
             }
@@ -98,7 +102,7 @@ public class BlockFluidFlowing extends BlockFluid
         {
             setFluidStill(world, x, y, z);
         }
-        if(liquidCanDisplaceBlock(world, x, y - 1, z))
+        if(canSpreadTo(world, x, y - 1, z))
         {
         	int id = world.getBlockId(x, y - 1, z);
         	int meta = world.getBlockMetadata(x, y - 1, z);
@@ -112,9 +116,9 @@ public class BlockFluidFlowing extends BlockFluid
                 world.setBlockAndMetadataWithNotify(x, y - 1, z, this.id, localFlowDecay + 8);
             }
         } else
-        if(localFlowDecay >= 0 && (localFlowDecay == 0 || blockBlocksFlow(world, x, y - 1, z)))
+        if(localFlowDecay >= 0 && (localFlowDecay == 0 || isFluidBlocking(world, x, y - 1, z)))
         {
-            boolean aflag[] = getOptimalFlowDirections(world, x, y, z);
+            boolean aflag[] = getSpread(world, x, y, z);
             int k1 = localFlowDecay + flowDecayMod;
             if(localFlowDecay >= 8)
             {
@@ -145,7 +149,7 @@ public class BlockFluidFlowing extends BlockFluid
 
     private void flowIntoBlock(World world, int i, int j, int k, int l)
     {
-        if(liquidCanDisplaceBlock(world, i, j, k))
+        if(canSpreadTo(world, i, j, k))
         {
             int i1 = world.getBlockId(i, j, k);
             if(i1 > 0)
@@ -162,7 +166,7 @@ public class BlockFluidFlowing extends BlockFluid
         }
     }
 
-    private int calculateFlowCost(World world, int i, int j, int k, int l, int i1)
+    private int getSlopeDistance(World world, int x, int y, int z, int l, int i1)
     {
         int j1 = 1000;
         for(int k1 = 0; k1 < 4; k1++)
@@ -171,30 +175,30 @@ public class BlockFluidFlowing extends BlockFluid
             {
                 continue;
             }
-            int l1 = i;
-            int i2 = j;
-            int j2 = k;
+            int x2 = x;
+            int y2 = y;
+            int z2 = z;
             if(k1 == 0)
             {
-                l1--;
+                x2--;
             }
             if(k1 == 1)
             {
-                l1++;
+                x2++;
             }
             if(k1 == 2)
             {
-                j2--;
+                z2--;
             }
             if(k1 == 3)
             {
-                j2++;
+                z2++;
             }
-            if(blockBlocksFlow(world, l1, i2, j2) || world.getBlockMaterial(l1, i2, j2) == blockMaterial && world.getBlockMetadata(l1, i2, j2) == 0)
+            if(isFluidBlocking(world, x2, y2, z2) || world.getBlockMaterial(x2, y2, z2) == blockMaterial && world.getBlockMetadata(x2, y2, z2) == 0)
             {
                 continue;
             }
-            if(!blockBlocksFlow(world, l1, i2 - 1, j2))
+            if(!isFluidBlocking(world, x2, y2 - 1, z2))
             {
                 return l;
             }
@@ -202,7 +206,7 @@ public class BlockFluidFlowing extends BlockFluid
             {
                 continue;
             }
-            int k2 = calculateFlowCost(world, l1, i2, j2, l + 1, k1);
+            int k2 = getSlopeDistance(world, x2, y2, z2, l + 1, k1);
             if(k2 < j1)
             {
                 j1 = k2;
@@ -212,68 +216,68 @@ public class BlockFluidFlowing extends BlockFluid
         return j1;
     }
 
-    private boolean[] getOptimalFlowDirections(World world, int i, int j, int k)
+    private boolean[] getSpread(World world, int x, int y, int z)
     {
         for(int l = 0; l < 4; l++)
         {
-            flowCost[l] = 1000;
-            int j1 = i;
-            int i2 = j;
-            int j2 = k;
+            distance[l] = 1000;
+            int x2 = x;
+            int y2 = y;
+            int z2 = z;
             if(l == 0)
             {
-                j1--;
+                x2--;
             }
             if(l == 1)
             {
-                j1++;
+                x2++;
             }
             if(l == 2)
             {
-                j2--;
+                z2--;
             }
             if(l == 3)
             {
-                j2++;
+                z2++;
             }
-            if(blockBlocksFlow(world, j1, i2, j2) || world.getBlockMaterial(j1, i2, j2) == blockMaterial && world.getBlockMetadata(j1, i2, j2) == 0)
+            if(isFluidBlocking(world, x2, y2, z2) || world.getBlockMaterial(x2, y2, z2) == blockMaterial && world.getBlockMetadata(x2, y2, z2) == 0)
             {
                 continue;
             }
-            if(!blockBlocksFlow(world, j1, i2 - 1, j2))
+            if(!isFluidBlocking(world, x2, y2 - 1, z2))
             {
-                flowCost[l] = 0;
+                distance[l] = 0;
             } else
             {
-                flowCost[l] = calculateFlowCost(world, j1, i2, j2, 1, l);
+                distance[l] = getSlopeDistance(world, x2, y2, z2, 1, l);
             }
         }
 
-        int i1 = flowCost[0];
+        int i1 = distance[0];
         for(int k1 = 1; k1 < 4; k1++)
         {
-            if(flowCost[k1] < i1)
+            if(distance[k1] < i1)
             {
-                i1 = flowCost[k1];
+                i1 = distance[k1];
             }
         }
 
         for(int l1 = 0; l1 < 4; l1++)
         {
-            isOptimalFlowDirection[l1] = flowCost[l1] == i1;
+            result[l1] = distance[l1] == i1;
         }
 
-        return isOptimalFlowDirection;
+        return result;
     }
 
-    private boolean blockBlocksFlow(World world, int x, int y, int z)
+    private boolean isFluidBlocking(World world, int x, int y, int z)
     {
         int id = world.getBlockId(x, y, z);
-        if (Block.blocksList[id] == null || Block.blocksList[id] instanceof BlockFluid || Block.blocksList[id].hasTag(BlockTags.BROKEN_BY_FLUIDS)) return false;
+        if (Block.blocksList[id] == null || Block.blocksList[id] instanceof FluidBlock || Block.blocksList[id].hasTag(BlockTags.BROKEN_BY_FLUIDS)) return false;
         return true;
     }
 
-    protected int getSmallestFlowDecay(World world, int x, int y, int z, int currentFlowDecay)
+    protected int getHighest(World world, int x, int y, int z, int currentFlowDecay)
     {
         int flowDecay = getDepth(world, x, y, z);
         if(flowDecay < 0)
@@ -282,7 +286,7 @@ public class BlockFluidFlowing extends BlockFluid
         }
         if(flowDecay == 0)
         {
-            numAdjacentSources++;
+            maxCount++;
         }
         if(flowDecay >= 8)
         {
@@ -291,7 +295,7 @@ public class BlockFluidFlowing extends BlockFluid
         return currentFlowDecay >= 0 && flowDecay >= currentFlowDecay ? currentFlowDecay : flowDecay;
     }
 
-    private boolean liquidCanDisplaceBlock(World world, int i, int j, int k)
+    private boolean canSpreadTo(World world, int i, int j, int k)
     {
         Material material = world.getBlockMaterial(i, j, k);
         if(material == blockMaterial)
@@ -304,21 +308,17 @@ public class BlockFluidFlowing extends BlockFluid
         }
         else
         {
-            return !blockBlocksFlow(world, i, j, k);
+            return !isFluidBlocking(world, i, j, k);
         }
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         if(world.getBlockId(x, y, z) == id)
         {
-            world.scheduleBlockUpdate(x, y, z, id, tickRate());
+            world.scheduleBlockUpdate(x, y, z, id, tickDelay());
         }
     }
-
-    int numAdjacentSources;
-    boolean isOptimalFlowDirection[];
-    int flowCost[];
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockFluid.java b/src/main/java/net/minecraft/core/block/FluidBlock.java
similarity index 80%
rename from src/main/java/net/minecraft/core/block/BlockFluid.java
rename to src/main/java/net/minecraft/core/block/FluidBlock.java
index 45cf867fc..45924b8bd 100644
--- a/src/main/java/net/minecraft/core/block/BlockFluid.java
+++ b/src/main/java/net/minecraft/core/block/FluidBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.enums.EnumDropCause;
@@ -8,18 +8,18 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
 
-public abstract class BlockFluid extends Block
+public abstract class FluidBlock extends Block
 {
 
-	public BlockFluid(String key, int id, Material material)
+	public FluidBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
         setTicking(true);
     }
@@ -61,7 +61,7 @@ public abstract class BlockFluid extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
@@ -106,9 +106,9 @@ public abstract class BlockFluid extends Block
         return null;
     }
 
-    private Vec3d getFlow(WorldSource world, int x, int y, int z)
+    private Vec3 getFlow(WorldSource world, int x, int y, int z)
     {
-        Vec3d result = Vec3d.createVector(0.0D, 0.0D, 0.0D);
+        Vec3 result = Vec3.getTempVec3(0.0D, 0.0D, 0.0D);
         int depthLocal = getRenderedDepth(world, x, y, z);
         for(int i = 0; i < 4; i++)
         {
@@ -142,14 +142,14 @@ public abstract class BlockFluid extends Block
                 if(depthCheck >= 0)
                 {
                     int mult = depthCheck - (depthLocal - 8);
-                    result = result.addVector((checkX - x) * mult, (checkY - y) * mult, (checkZ - z) * mult);
+                    result = result.add((checkX - x) * mult, (checkY - y) * mult, (checkZ - z) * mult);
                 }
                 continue;
             }
             else
             {
                 int mult = depthCheck - depthLocal;
-                result = result.addVector((checkX - x) * mult, (checkY - y) * mult, (checkZ - z) * mult);
+                result = result.add((checkX - x) * mult, (checkY - y) * mult, (checkZ - z) * mult);
             }
         }
         result = result.normalize();
@@ -157,17 +157,17 @@ public abstract class BlockFluid extends Block
     }
 
     @Override
-    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3d entityVelocity)
+    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3 entityVelocity)
     {
         if (entity.noPhysics) return;
-        Vec3d flowVector = getFlow(world, x, y, z);
-        entityVelocity.xCoord += flowVector.xCoord;
-        entityVelocity.yCoord += flowVector.yCoord;
-        entityVelocity.zCoord += flowVector.zCoord;
+        Vec3 flowVector = getFlow(world, x, y, z);
+        entityVelocity.x += flowVector.x;
+        entityVelocity.y += flowVector.y;
+        entityVelocity.z += flowVector.z;
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         if(blockMaterial == Material.water)
         {
@@ -191,13 +191,13 @@ public abstract class BlockFluid extends Block
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
         return blockMaterial != Material.water ? 0 : 1;
     }
 
     @Override
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+    public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(blockMaterial == Material.water && rand.nextInt(64) == 0)
         {
@@ -218,26 +218,26 @@ public abstract class BlockFluid extends Block
 
     public static double getSlopeAngle(WorldSource blockAccess, int x, int y, int z, Material material)
     {
-        Vec3d vec3d = null;
+        Vec3 vec3 = null;
         if(material == Material.water)
         {
-            vec3d = ((BlockFluid)Block.fluidWaterFlowing).getFlow(blockAccess, x, y, z);
+            vec3 = ((FluidBlock)Blocks.FLUID_WATER_FLOWING).getFlow(blockAccess, x, y, z);
         }
         if(material == Material.lava)
         {
-            vec3d = ((BlockFluid)Block.fluidLavaFlowing).getFlow(blockAccess, x, y, z);
+            vec3 = ((FluidBlock)Blocks.FLUID_LAVA_FLOWING).getFlow(blockAccess, x, y, z);
         }
-        if(vec3d.xCoord == 0.0D && vec3d.zCoord == 0.0D)
+        if(vec3 == null ||(vec3.x == 0.0D && vec3.z == 0.0D))
         {
             return -1000D;
         } else
         {
-            return Math.atan2(vec3d.zCoord, vec3d.xCoord) - Math.PI/2;
+            return Math.atan2(vec3.z, vec3.x) - Math.PI/2;
         }
     }
 
     @Override
-    public void onBlockAdded(World world, int x, int y, int z)
+    public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         checkForHarden(world, x, y, z);
     }
@@ -265,19 +265,19 @@ public abstract class BlockFluid extends Block
                 int data = world.getBlockMetadata(x, y, z) & 0x0F;
                 if(data == 0)
                 {
-                    world.setBlockWithNotify(x, y, z, Block.obsidian.id);
+                    world.setBlockWithNotify(x, y, z, Blocks.OBSIDIAN.id);
                 }
                 else if(data <= 2)
                 {
-                    world.setBlockWithNotify(x, y, z, Block.cobbleGranite.id);
+                    world.setBlockWithNotify(x, y, z, Blocks.COBBLE_GRANITE.id);
                 }
                 else if(data <= 4)
                 {
-                    world.setBlockWithNotify(x, y, z, Block.cobbleStone.id);
+                    world.setBlockWithNotify(x, y, z, Blocks.COBBLE_STONE.id);
                 }
                 else
                 {
-                    world.setBlockWithNotify(x, y, z, Block.cobbleBasalt.id);
+                    world.setBlockWithNotify(x, y, z, Blocks.COBBLE_BASALT.id);
                 }
                 fizz(world, x, y, z);
             }
@@ -294,7 +294,7 @@ public abstract class BlockFluid extends Block
                 int data = world.getBlockMetadata(x, y, z) & 0x0F;
                 if(data == 0)
                 {
-                    world.setBlockWithNotify(x, y, z, Block.cobbleLimestone.id);
+                    world.setBlockWithNotify(x, y, z, Blocks.COBBLE_LIMESTONE.id);
                     fizz(world, x, y, z);
                 }
             }
@@ -302,7 +302,7 @@ public abstract class BlockFluid extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return null;
     }
@@ -318,10 +318,10 @@ public abstract class BlockFluid extends Block
     @Override
     public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
     {
-        float f7 = BlockFluid.getFluidHeight(world, x, y, z, blockMaterial);
-        float f8 = BlockFluid.getFluidHeight(world, x, y, z + 1, blockMaterial);
-        float f9 = BlockFluid.getFluidHeight(world, x + 1, y, z + 1, blockMaterial);
-        float f10 = BlockFluid.getFluidHeight(world, x + 1, y, z, blockMaterial);
+        float f7 = FluidBlock.getFluidHeight(world, x, y, z, blockMaterial);
+        float f8 = FluidBlock.getFluidHeight(world, x, y, z + 1, blockMaterial);
+        float f9 = FluidBlock.getFluidHeight(world, x + 1, y, z + 1, blockMaterial);
+        float f10 = FluidBlock.getFluidHeight(world, x + 1, y, z, blockMaterial);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, Math.max((f7 + f8 + f9 + f10)/4f, 0.2), 1.0F);
     }
 
@@ -343,10 +343,10 @@ public abstract class BlockFluid extends Block
                 int i2 = worldSource.getBlockMetadata(j1, y, l1);
                 if(i2 >= 8 || i2 == 0)
                 {
-                    f += BlockFluid.getWaterVolume(i2) * 10F;
+                    f += FluidBlock.getWaterVolume(i2) * 10F;
                     l += 10;
                 }
-                f += BlockFluid.getWaterVolume(i2);
+                f += FluidBlock.getWaterVolume(i2);
                 l++;
                 continue;
             }
diff --git a/src/main/java/net/minecraft/core/block/BlockFurnace.java b/src/main/java/net/minecraft/core/block/FurnaceBlock.java
similarity index 73%
rename from src/main/java/net/minecraft/core/block/BlockFurnace.java
rename to src/main/java/net/minecraft/core/block/FurnaceBlock.java
index 3c150634e..41a1327d2 100644
--- a/src/main/java/net/minecraft/core/block/BlockFurnace.java
+++ b/src/main/java/net/minecraft/core/block/FurnaceBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.Global;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityFurnace;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -15,29 +15,29 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockContainer, Material, Block, World, 
-//            IBlockAccess, TileEntityFurnace, EntityPlayer, TileEntity, 
-//            EntityLiving, MathHelper, IInventory, ItemStack, 
-//            EntityItem
+//            IBlockAccess, FurnaceBlockEntity, Player, BlockEntity,
+//            Mob, MathHelper, IInventory, ItemStack,
+//            ItemEntity
 
-public class BlockFurnace extends BlockTileEntityRotatable
+public class FurnaceBlock extends RotatableEntityBlock
 {
 
-	public BlockFurnace(String key, int id, boolean flag)
+	public FurnaceBlock(String key, String namespaceId, int id, boolean flag)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, Material.stone);
         furnaceRand = new Random();
         isActive = flag;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         setDefaultDirection(world, x, y, z);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -45,14 +45,14 @@ public class BlockFurnace extends BlockTileEntityRotatable
             case EXPLOSION:
             case PROPER_TOOL:
             case SILK_TOUCH:
-                return new ItemStack[] { new ItemStack(Block.furnaceStoneIdle) };
+                return new ItemStack[] { new ItemStack(Blocks.FURNACE_STONE_IDLE) };
             default:
                 return null;
         }
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(!isActive)
         {
@@ -87,10 +87,10 @@ public class BlockFurnace extends BlockTileEntityRotatable
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide) {
-            TileEntityFurnace tileentityfurnace = (TileEntityFurnace) world.getBlockTileEntity(x, y, z);
+            FurnaceBlockEntity tileentityfurnace = (FurnaceBlockEntity) world.getBlockEntity(x, y, z);
             player.displayGUIFurnace(tileentityfurnace);
         }
         return true;
@@ -98,7 +98,7 @@ public class BlockFurnace extends BlockTileEntityRotatable
 
 	public static void updateFurnaceBlockState(boolean lit, World world, int x, int y, int z) {
 		int meta = world.getBlockMetadata(x, y, z);
-		TileEntity tileentity = world.getBlockTileEntity(x, y, z);
+		BlockEntity tileentity = world.getBlockEntity(x, y, z);
 		if(tileentity == null) {
 			String msg = "Furnace is missing Tile Entity at x: "+x+" y: "+y+" z: "+z+", block will be removed!";
 			if(Global.BUILD_CHANNEL.isUnstableBuild()) {
@@ -110,9 +110,9 @@ public class BlockFurnace extends BlockTileEntityRotatable
 		}
 		keepFurnaceInventory = true;
 		if(lit) {
-			world.setBlockWithNotify(x, y, z, Block.furnaceStoneActive.id);
+			world.setBlockWithNotify(x, y, z, Blocks.FURNACE_STONE_ACTIVE.id);
 		} else {
-			world.setBlockWithNotify(x, y, z, Block.furnaceStoneIdle.id);
+			world.setBlockWithNotify(x, y, z, Blocks.FURNACE_STONE_IDLE.id);
 		}
 		keepFurnaceInventory = false;
 		world.setBlockMetadataWithNotify(x, y, z, meta);
@@ -121,9 +121,9 @@ public class BlockFurnace extends BlockTileEntityRotatable
 	}
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityFurnace();
+        return new FurnaceBlockEntity();
     }
     
     @Override
@@ -131,11 +131,11 @@ public class BlockFurnace extends BlockTileEntityRotatable
     {
         if(!keepFurnaceInventory)
         {
-            TileEntityFurnace tileentityfurnace = (TileEntityFurnace)world.getBlockTileEntity(x, y, z);
+            FurnaceBlockEntity tileentityfurnace = (FurnaceBlockEntity)world.getBlockEntity(x, y, z);
 label0:
-            for(int l = 0; l < tileentityfurnace.getSizeInventory(); l++)
+            for(int l = 0; l < tileentityfurnace.getContainerSize(); l++)
             {
-                ItemStack itemstack = tileentityfurnace.getStackInSlot(l);
+                ItemStack itemstack = tileentityfurnace.getItem(l);
                 if(itemstack == null)
                 {
                     continue;
@@ -155,7 +155,7 @@ label0:
                         i1 = itemstack.stackSize;
                     }
                     itemstack.stackSize -= i1;
-                    EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
+                    ItemEntity entityitem = new ItemEntity(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
                     float f3 = 0.05F;
                     entityitem.xd = (float)furnaceRand.nextGaussian() * f3;
                     entityitem.yd = (float)furnaceRand.nextGaussian() * f3 + 0.2F;
diff --git a/src/main/java/net/minecraft/core/block/BlockGlass.java b/src/main/java/net/minecraft/core/block/GlassBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockGlass.java
rename to src/main/java/net/minecraft/core/block/GlassBlock.java
index 8cfe5523a..a141ad72f 100644
--- a/src/main/java/net/minecraft/core/block/BlockGlass.java
+++ b/src/main/java/net/minecraft/core/block/GlassBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
@@ -9,16 +9,16 @@ import net.minecraft.core.world.World;
 // Referenced classes of package net.minecraft.src:
 //            BlockBreakable, Material
 
-public class BlockGlass extends BlockTransparent
+public class GlassBlock extends TransparentBlock
 {
 
-    public BlockGlass(String key, int id, Material material)
+    public GlassBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/GlassDoorBlock.java b/src/main/java/net/minecraft/core/block/GlassDoorBlock.java
new file mode 100644
index 000000000..aba3110d3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/GlassDoorBlock.java
@@ -0,0 +1,19 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class GlassDoorBlock extends DoorBlock {
+    public GlassDoorBlock(String key, String namespaceId, int id, Material material, boolean isTop) {
+        super(key, namespaceId, id, material, isTop);
+    }
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
+    {
+        return new ItemStack[] { new ItemStack(Items.DOOR_GLASS) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockGlowStone.java b/src/main/java/net/minecraft/core/block/GlowStoneBlock.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/BlockGlowStone.java
rename to src/main/java/net/minecraft/core/block/GlowStoneBlock.java
index 09d18b186..488425e41 100644
--- a/src/main/java/net/minecraft/core/block/BlockGlowStone.java
+++ b/src/main/java/net/minecraft/core/block/GlowStoneBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
@@ -11,16 +11,16 @@ import net.minecraft.core.world.WorldSource;
 // Referenced classes of package net.minecraft.src:
 //            Block, Item, Material
 
-public class BlockGlowStone extends Block
+public class GlowStoneBlock extends Block
 {
 
-    public BlockGlowStone(String key, int id, Material material)
+    public GlowStoneBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -28,7 +28,7 @@ public class BlockGlowStone extends Block
             case SILK_TOUCH:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Item.dustGlowstone, 2 + world.rand.nextInt(2)) };
+                return new ItemStack[] { new ItemStack(Items.DUST_GLOWSTONE, 2 + world.rand.nextInt(2)) };
         }
     }
     
diff --git a/src/main/java/net/minecraft/core/block/BlockMeshGold.java b/src/main/java/net/minecraft/core/block/GoldMeshBlock.java
similarity index 54%
rename from src/main/java/net/minecraft/core/block/BlockMeshGold.java
rename to src/main/java/net/minecraft/core/block/GoldMeshBlock.java
index feac5ea56..989f44716 100644
--- a/src/main/java/net/minecraft/core/block/BlockMeshGold.java
+++ b/src/main/java/net/minecraft/core/block/GoldMeshBlock.java
@@ -1,23 +1,23 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityMeshGold;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.GoldMeshBlockEntity;
 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.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class BlockMeshGold extends BlockTileEntity{
-    public BlockMeshGold(String key, int id) {
-        super(key, id, Material.metal);
+public class GoldMeshBlock extends EntityBlock {
+    public GoldMeshBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId, id, Material.metal);
     }
 
     @Override
-    protected TileEntity getNewBlockEntity() {
-        return new TileEntityMeshGold();
+    protected BlockEntity getNewBlockEntity() {
+        return new GoldMeshBlockEntity();
     }
     @Override
     public boolean isSolidRender()
@@ -25,7 +25,7 @@ public class BlockMeshGold extends BlockTileEntity{
         return false;
     }
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
@@ -36,37 +36,37 @@ public class BlockMeshGold extends BlockTileEntity{
         return true;
     }
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
-        TileEntityMeshGold meshGold = (TileEntityMeshGold) world.getBlockTileEntity(x, y, z);
+        GoldMeshBlockEntity meshGold = (GoldMeshBlockEntity) world.getBlockEntity(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);
+            player.inventory.setItem(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);
+        GoldMeshBlockEntity mesh = (GoldMeshBlockEntity) world.getBlockEntity(x, y, z);
         if (mesh.filterItem != null){
-            EntityItem item = world.dropItem(x, y, z, mesh.filterItem);
+            ItemEntity item = world.dropItem(x, y, z, mesh.filterItem);
             item.xd *= 0.5;
             item.yd *= 0.5;
             item.zd *= 0.5;
-            item.delayBeforeCanPickup = 0;
+            item.pickupDelay = 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 (entity instanceof ItemEntity){
+            GoldMeshBlockEntity mesh = (GoldMeshBlockEntity) world.getBlockEntity(x, y, z);
             if (mesh.filterItem == null) return true;
 
-            ItemStack entityStack = ((EntityItem) entity).item;
+            ItemStack entityStack = ((ItemEntity) entity).item;
             return !entityStack.isItemEqual(mesh.filterItem);
         }
         return true;
diff --git a/src/main/java/net/minecraft/core/block/BlockOreGold.java b/src/main/java/net/minecraft/core/block/GoldOreBlock.java
similarity index 50%
rename from src/main/java/net/minecraft/core/block/BlockOreGold.java
rename to src/main/java/net/minecraft/core/block/GoldOreBlock.java
index b634fe48f..d94d39765 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreGold.java
+++ b/src/main/java/net/minecraft/core/block/GoldOreBlock.java
@@ -1,20 +1,26 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-public class BlockOreGold extends Block
-{
-    public BlockOreGold(String key, int id, Material material) {
-        super(key, id, material);
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class GoldOreBlock extends Block {
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
+
+    public GoldOreBlock(String key, String namespaceId, int id, int parentId, Material material) {
+        super(key, namespaceId, id, material);
+        variantMap.put(parentId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -23,7 +29,7 @@ public class BlockOreGold extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.oreRawGold) };
+                return new ItemStack[] { new ItemStack(Items.ORE_RAW_GOLD) };
             default:
                 return null;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockGrass.java b/src/main/java/net/minecraft/core/block/GrassBlock.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/BlockGrass.java
rename to src/main/java/net/minecraft/core/block/GrassBlock.java
index 95f121127..5eb3065f4 100644
--- a/src/main/java/net/minecraft/core/block/BlockGrass.java
+++ b/src/main/java/net/minecraft/core/block/GrassBlock.java
@@ -2,7 +2,7 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.enums.EnumDropCause;
@@ -16,13 +16,13 @@ import net.minecraft.core.world.noise.ImprovedNoise;
 //            Block, Material, IBlockAccess, WorldChunkManager, 
 //            ColorizerGrass, World
 
-public class BlockGrass extends Block
+public class GrassBlock extends Block
 {
     private static ImprovedNoise grassColorPerlin = new ImprovedNoise(new Random(0));
 
-    public BlockGrass(String key, int id, Material material)
+    public GrassBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setTicking(true);
     }
 
@@ -39,7 +39,7 @@ public class BlockGrass extends Block
             {
                 return;
             }
-            world.setBlockWithNotify(x, y, z, Block.dirt.id);
+            world.setBlockWithNotify(x, y, z, Blocks.DIRT.id);
         } else
         if(world.getBlockLightValue(x, y + 1, z) >= 9)
         {
@@ -47,7 +47,7 @@ public class BlockGrass extends Block
             int i1 = (y + rand.nextInt(5)) - 3;
             int j1 = (z + rand.nextInt(3)) - 1;
             int k1 = world.getBlockId(l, i1 + 1, j1);
-            if(world.getBlockId(l, i1, j1) == Block.dirt.id && world.getBlockLightValue(l, i1 + 1, j1) >= 4 && Block.lightBlock[k1] <= 2)
+            if(world.getBlockId(l, i1, j1) == Blocks.DIRT.id && world.getBlockLightValue(l, i1 + 1, j1) >= 4 && Block.lightBlock[k1] <= 2)
             {
                 world.setBlockWithNotify(l, i1, j1, this.id);
             }
@@ -57,23 +57,23 @@ public class BlockGrass extends Block
                 int r = rand.nextInt(400);
 
                 if (r < 26) {
-                    idToSpawn = Block.flowerRed.id;
+                    idToSpawn = Blocks.FLOWER_RED.id;
                 } else if (r < 41) {
-                    idToSpawn = Block.flowerYellow.id;
+                    idToSpawn = Blocks.FLOWER_YELLOW.id;
                 } else if (r < 60) {
                     Biome biome = world.getBlockBiome(x, y + 1, z);
                     if (biome == Biomes.OVERWORLD_BIRCH_FOREST || biome == Biomes.OVERWORLD_SEASONAL_FOREST){
-                        idToSpawn = Block.flowerPink.id;
+                        idToSpawn = Blocks.FLOWER_PINK.id;
                     } else if (biome == Biomes.OVERWORLD_MEADOW || biome == Biomes.OVERWORLD_BOREAL_FOREST || biome == Biomes.OVERWORLD_SHRUBLAND) {
-                        idToSpawn = Block.flowerPurple.id;
+                        idToSpawn = Blocks.FLOWER_PURPLE.id;
                     } else if (biome == Biomes.OVERWORLD_FOREST || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_RAINFOREST || biome == Biomes.OVERWORLD_CAATINGA) {
-                        idToSpawn = Block.flowerLightBlue.id;
+                        idToSpawn = Blocks.FLOWER_LIGHT_BLUE.id;
                     }
                 } else {
                     if(rand.nextInt(8) == 0) {
-                        idToSpawn = Block.tallgrassFern.id;
+                        idToSpawn = Blocks.TALLGRASS_FERN.id;
                     }else {
-                        idToSpawn = Block.tallgrass.id;
+                        idToSpawn = Blocks.TALLGRASS.id;
                     }
                 }
 
@@ -83,7 +83,7 @@ public class BlockGrass extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -91,7 +91,7 @@ public class BlockGrass extends Block
             case PICK_BLOCK:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Block.dirt) };
+                return new ItemStack[] { new ItemStack(Blocks.DIRT) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockGravel.java b/src/main/java/net/minecraft/core/block/GravelBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockGravel.java
rename to src/main/java/net/minecraft/core/block/GravelBlock.java
index fb7135334..03b1421f3 100644
--- a/src/main/java/net/minecraft/core/block/BlockGravel.java
+++ b/src/main/java/net/minecraft/core/block/GravelBlock.java
@@ -1,26 +1,24 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-import java.util.Random;
-
 // Referenced classes of package net.minecraft.src:
-//            BlockSand, Item
+//            SandBlock, Item
 
-public class BlockGravel extends BlockSand
+public class GravelBlock extends SandBlock
 {
 
-    public BlockGravel(String key, int id)
+    public GravelBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -28,7 +26,7 @@ public class BlockGravel extends BlockSand
             case SILK_TOUCH:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                if (world.rand.nextInt(10) == 0) return new ItemStack[] { new ItemStack(Item.flint) };
+                if (world.rand.nextInt(10) == 0) return new ItemStack[] { new ItemStack(Items.FLINT) };
                 else return new ItemStack[] { new ItemStack(this) };
         }
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockIce.java b/src/main/java/net/minecraft/core/block/IceBlock.java
similarity index 61%
rename from src/main/java/net/minecraft/core/block/BlockIce.java
rename to src/main/java/net/minecraft/core/block/IceBlock.java
index 5c0a46d18..918c89d05 100644
--- a/src/main/java/net/minecraft/core/block/BlockIce.java
+++ b/src/main/java/net/minecraft/core/block/IceBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
@@ -12,26 +12,26 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockBreakable, Material, World, Block, 
-//            EnumSkyBlock, IBlockAccess, EntityPlayer
+//            EnumSkyBlock, IBlockAccess, Player
 
-public class BlockIce extends BlockTransparent
+public class IceBlock extends TransparentBlock
 {
 
-    public BlockIce(String key, int id)
+    public IceBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.ice);
-        movementScale = 0.98F;
+        super(key, namespaceId, id, Material.ice);
+        friction = 0.98F;
         setTicking(true);
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
         return 1;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -44,13 +44,13 @@ public class BlockIce extends BlockTransparent
     }
 
     @Override
-    public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int meta, TileEntity tileEntity)
+    public void harvestBlock(World world, Player entityplayer, int i, int j, int k, int meta, BlockEntity blockEntity)
     {
-        super.harvestBlock(world, entityplayer, i, j, k, meta, tileEntity);
+        super.harvestBlock(world, entityplayer, i, j, k, meta, blockEntity);
         Material material = world.getBlockMaterial(i, j - 1, k);
         if(material.blocksMotion() || material.isLiquid())
         {
-            world.setBlockWithNotify(i, j, k, Block.fluidWaterFlowing.id);
+            world.setBlockWithNotify(i, j, k, Blocks.FLUID_WATER_FLOWING.id);
         }
     }
 
@@ -59,7 +59,7 @@ public class BlockIce extends BlockTransparent
     {
         if(world.getSavedLightValue(LightLayer.Block, x, y, z) > 11 - Block.lightBlock[id])
         {
-            world.setBlockWithNotify(x, y, z, Block.fluidWaterStill.id);
+            world.setBlockWithNotify(x, y, z, Blocks.FLUID_WATER_STILL.id);
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/block/BlockOreCoal.java b/src/main/java/net/minecraft/core/block/IronOreBlock.java
similarity index 50%
rename from src/main/java/net/minecraft/core/block/BlockOreCoal.java
rename to src/main/java/net/minecraft/core/block/IronOreBlock.java
index 14a7a3c2a..e46cadc8c 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreCoal.java
+++ b/src/main/java/net/minecraft/core/block/IronOreBlock.java
@@ -1,25 +1,25 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, Item
+import java.util.HashMap;
+import java.util.Map;
 
-public class BlockOreCoal extends Block
+public class IronOreBlock extends Block
 {
-
-    public BlockOreCoal(String key, int id)
-    {
-        super(key, id, Material.stone);
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public IronOreBlock(String key, String namespaceId, int id, int parentID, Material material) {
+        super(key, namespaceId, id, material);
+        variantMap.put(parentID, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -28,9 +28,10 @@ public class BlockOreCoal extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.coal) };
+                return new ItemStack[] { new ItemStack(Items.ORE_RAW_IRON) };
             default:
                 return null;
         }
     }
+
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockJar.java b/src/main/java/net/minecraft/core/block/JarBlock.java
similarity index 77%
rename from src/main/java/net/minecraft/core/block/BlockJar.java
rename to src/main/java/net/minecraft/core/block/JarBlock.java
index 09b8681c1..df15ce8e5 100644
--- a/src/main/java/net/minecraft/core/block/BlockJar.java
+++ b/src/main/java/net/minecraft/core/block/JarBlock.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityFlowerJar;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.FlowerJarBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.item.block.BlockItem;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
@@ -17,12 +17,12 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.function.Supplier;
 
-public class BlockJar extends BlockTileEntity{
+public class JarBlock extends EntityBlock {
 
     public Item item;
     private final Supplier<Item> itemSupplier;
-    public BlockJar(String key, int id, @NotNull Supplier<Item> itemSupplier) {
-        super(key, id, Material.glass);
+    public JarBlock(String key, String namespaceId, int id, @NotNull Supplier<Item> itemSupplier) {
+        super(key, namespaceId, id, Material.glass);
         setBlockBounds(0.3125f, 0, 0.3125f, 1 - 0.3125f, 0.375f, 1 - 0.3125f);
         this.itemSupplier = itemSupplier;
     }
@@ -47,7 +47,7 @@ public class BlockJar extends BlockTileEntity{
     public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
         float offset = 0.0F;
-        return AABB.getBoundingBoxFromPool(x + 0.3125f, y + offset, z + 0.3125f, x + 1 - 0.3125f, (float) y + 0.375f + offset, z + 1 - 0.3125f);
+        return AABB.getTemporaryBB(x + 0.3125f, y + offset, z + 0.3125f, x + 1 - 0.3125f, (float) y + 0.375f + offset, z + 1 - 0.3125f);
     }
     @Override
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
@@ -66,12 +66,12 @@ public class BlockJar extends BlockTileEntity{
         maxZ = aabb.maxZ - z;
     }
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if(player.getHeldItem() == null) {
             if (world.getBlockMetadata(x, y, z) == 0) {
@@ -81,7 +81,7 @@ public class BlockJar extends BlockTileEntity{
                     world.dropItem(x, y, z, new ItemStack(item, 1, 0));
                 }
             } else {
-                TileEntityFlowerJar tileEntity = (TileEntityFlowerJar) world.getBlockTileEntity(x, y, z);
+                FlowerJarBlockEntity tileEntity = (FlowerJarBlockEntity) world.getBlockEntity(x, y, z);
                 int flowerInPot = tileEntity.flowerInPot;
                 if (flowerInPot > 0 && hasTag(flowerInPot, BlockTags.PLANTABLE_IN_JAR)) {
                     tileEntity.flowerInPot = 0;
@@ -92,11 +92,11 @@ public class BlockJar extends BlockTileEntity{
                     }
                 }
             }
-        } else if (world.getBlockMetadata(x, y, z) == 0 && player.getHeldItem().getItem() instanceof ItemBlock) {
-            Block blockInHand = ((ItemBlock) player.getHeldItem().getItem()).getBlock();
+        } else if (world.getBlockMetadata(x, y, z) == 0 && player.getHeldItem().getItem() instanceof BlockItem) {
+            Block blockInHand = ((BlockItem) player.getHeldItem().getItem()).getBlock();
             if(hasTag(blockInHand.id, BlockTags.PLANTABLE_IN_JAR)){
                 player.getHeldItem().consumeItem(player);
-                TileEntityFlowerJar tileEntity = (TileEntityFlowerJar) world.getBlockTileEntity(x, y, z);
+                FlowerJarBlockEntity tileEntity = (FlowerJarBlockEntity) world.getBlockEntity(x, y, z);
                 world.setBlockMetadataWithNotify(x, y, z, 1);
                 tileEntity.flowerInPot = blockInHand.id;
             }
@@ -105,7 +105,7 @@ public class BlockJar extends BlockTileEntity{
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -120,7 +120,7 @@ public class BlockJar extends BlockTileEntity{
 
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data) {
-        TileEntityFlowerJar tileEntity = (TileEntityFlowerJar) world.getBlockTileEntity(x, y, z);
+        FlowerJarBlockEntity tileEntity = (FlowerJarBlockEntity) world.getBlockEntity(x, y, z);
         int flowerInPot = tileEntity.flowerInPot;
         if (flowerInPot > 0 && hasTag(flowerInPot, BlockTags.PLANTABLE_IN_JAR)) {
             tileEntity.flowerInPot = 0;
@@ -138,9 +138,9 @@ public class BlockJar extends BlockTileEntity{
     }
 
     @Override
-    protected TileEntity getNewBlockEntity()
+    protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityFlowerJar();
+        return new FlowerJarBlockEntity();
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/block/BlockJukeBox.java b/src/main/java/net/minecraft/core/block/JukeboxBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockJukeBox.java
rename to src/main/java/net/minecraft/core/block/JukeboxBlock.java
index 4d2c5b06e..6617e90d1 100644
--- a/src/main/java/net/minecraft/core/block/BlockJukeBox.java
+++ b/src/main/java/net/minecraft/core/block/JukeboxBlock.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.block;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockContainer, Material, World, TileEntityRecordPlayer, 
-//            EntityItem, ItemStack, EntityPlayer, TileEntity
+//            BlockContainer, Material, World, JukeboxBlockEntity,
+//            ItemEntity, ItemStack, Player, BlockEntity
 
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.JukeboxBlockEntity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityRecordPlayer;
 import net.minecraft.core.block.material.Material;
 
-public class BlockJukeBox extends BlockTileEntity
+public class JukeboxBlock extends EntityBlock
 {
 
-	public BlockJukeBox(String key, int id)
+	public JukeboxBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if(world.getBlockMetadata(x, y, z) == 0)
         {
@@ -37,9 +37,9 @@ public class BlockJukeBox extends BlockTileEntity
     public void playRecord(World world, int i, int j, int k, int l)
     {
         if (!world.isClientSide) {
-            TileEntityRecordPlayer tileentityrecordplayer = (TileEntityRecordPlayer) world.getBlockTileEntity(i, j, k);
+            JukeboxBlockEntity tileentityrecordplayer = (JukeboxBlockEntity) world.getBlockEntity(i, j, k);
             tileentityrecordplayer.record = l;
-            tileentityrecordplayer.onInventoryChanged();
+            tileentityrecordplayer.setChanged();
             world.setBlockMetadataWithNotify(i, j, k, 1);
         }
     }
@@ -50,21 +50,21 @@ public class BlockJukeBox extends BlockTileEntity
         {
             return;
         }
-        TileEntityRecordPlayer tileentityrecordplayer = (TileEntityRecordPlayer)world.getBlockTileEntity(i, j, k);
+        JukeboxBlockEntity tileentityrecordplayer = (JukeboxBlockEntity)world.getBlockEntity(i, j, k);
         int l = tileentityrecordplayer.record;
         if (l != 0) {
             world.playSoundEffect(1005, i, j, k, 0);
             world.playRecord(null, null, i, j, k);
             tileentityrecordplayer.record = 0;
-            tileentityrecordplayer.onInventoryChanged();
+            tileentityrecordplayer.setChanged();
             world.setBlockMetadataWithNotify(i, j, k, 0);
             int i1 = l;
             float f = 0.7F;
             double d = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
             double d1 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.2D + 0.6D;
             double d2 = (double) (world.rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
-            EntityItem entityitem = new EntityItem(world, (double) i + d, (double) j + d1, (double) k + d2, new ItemStack(i1, 1, 0));
-            entityitem.delayBeforeCanPickup = 10;
+            ItemEntity entityitem = new ItemEntity(world, (double) i + d, (double) j + d1, (double) k + d2, new ItemStack(i1, 1, 0));
+            entityitem.pickupDelay = 10;
             world.entityJoinedWorld(entityitem);
         }
     }
@@ -77,8 +77,8 @@ public class BlockJukeBox extends BlockTileEntity
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityRecordPlayer();
+        return new JukeboxBlockEntity();
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockLadder.java b/src/main/java/net/minecraft/core/block/LadderBlock.java
similarity index 92%
rename from src/main/java/net/minecraft/core/block/BlockLadder.java
rename to src/main/java/net/minecraft/core/block/LadderBlock.java
index 5bc47b755..5ee6eda1f 100644
--- a/src/main/java/net/minecraft/core/block/BlockLadder.java
+++ b/src/main/java/net/minecraft/core/block/LadderBlock.java
@@ -7,10 +7,10 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockLadder extends Block {
+public class LadderBlock extends Block {
 
-	public BlockLadder(String key, int id) {
-		super(key, id, Material.wood);
+	public LadderBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.wood);
 	}
 	
 	@Override
@@ -19,7 +19,7 @@ public class BlockLadder extends Block {
 	}
 	
 	@Override
-	public boolean renderAsNormalBlock() {
+	public boolean isCubeShaped() {
 		return false;
 	}
 
@@ -55,13 +55,13 @@ public class BlockLadder extends Block {
 	
 	@Override
 	public final boolean canPlaceBlockAt(World world, int x, int y, int z) {
-		// Unused, check ItemBlockLadder
+		// Unused, check LadderBlockItem
 		return true;
 	}
 	
 	@Override
-	public final boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) {
-		// Unused, check ItemBlockLadder
+	public final boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side) {
+		// Unused, check LadderBlockItem
 		return true;
 	}
 	
diff --git a/src/main/java/net/minecraft/core/block/BlockLamp.java b/src/main/java/net/minecraft/core/block/LampBlock.java
similarity index 55%
rename from src/main/java/net/minecraft/core/block/BlockLamp.java
rename to src/main/java/net/minecraft/core/block/LampBlock.java
index b7fafe3c4..9b5350105 100644
--- a/src/main/java/net/minecraft/core/block/BlockLamp.java
+++ b/src/main/java/net/minecraft/core/block/LampBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
@@ -8,29 +8,25 @@ import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class BlockLamp extends Block
+public class LampBlock extends Block
 {
-    public BlockLamp(String key, int id, boolean isActivated) {
-        super(key, id, Material.stone);
+    public LampBlock(String key, String namespaceId, int id, boolean isActivated) {
+        super(key, namespaceId, id, Material.stone);
         isActive = isActivated;
         setTicking(true);
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 2;
     }
     
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
-    }
-    public static int getMetadataForColour(int i)
-    {
-        return ~i & 0xf;
+        super.onBlockPlacedByWorld(world, x, y, z);
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
     }
 
     @Override
@@ -40,24 +36,24 @@ public class BlockLamp extends Block
         if(isActive)
         {
             if(!isPoweredByBlock)
-                world.setBlockAndMetadataWithNotify(x, y, z, Block.lampIdle.id, world.getBlockMetadata(x, y, z));
+                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_IDLE.id, world.getBlockMetadata(x, y, z));
         } else
         if(isPoweredByBlock)
         {
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.lampActive.id, world.getBlockMetadata(x, y, z));
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_ACTIVE.id, world.getBlockMetadata(x, y, z));
         }
     }
 
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Block.lampIdle, 1, meta) };
+        return new ItemStack[] { new ItemStack(Blocks.LAMP_IDLE, 1, meta) };
     }
 
     public boolean isActive;
diff --git a/src/main/java/net/minecraft/core/block/BlockOreLapis.java b/src/main/java/net/minecraft/core/block/LapisOreBlock.java
similarity index 50%
rename from src/main/java/net/minecraft/core/block/BlockOreLapis.java
rename to src/main/java/net/minecraft/core/block/LapisOreBlock.java
index f96f7ed3e..c02b586ab 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreLapis.java
+++ b/src/main/java/net/minecraft/core/block/LapisOreBlock.java
@@ -1,25 +1,26 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, Item
+import java.util.HashMap;
+import java.util.Map;
 
-public class BlockOreLapis extends Block
+public class LapisOreBlock extends Block
 {
-
-    public BlockOreLapis(String key, int id)
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public LapisOreBlock(String key, String namespaceId, int id, int parentId, Material material)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, material);
+        variantMap.put(parentId, id);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -28,7 +29,7 @@ public class BlockOreLapis extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.dye, 4 + world.rand.nextInt(5), 4) };
+                return new ItemStack[] { new ItemStack(Items.DYE, 4 + world.rand.nextInt(5), 4) };
             default:
                 return null;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockLayerLeaves.java b/src/main/java/net/minecraft/core/block/LeavesLayerBlock.java
similarity index 88%
rename from src/main/java/net/minecraft/core/block/BlockLayerLeaves.java
rename to src/main/java/net/minecraft/core/block/LeavesLayerBlock.java
index faefd92a3..74473f4b3 100644
--- a/src/main/java/net/minecraft/core/block/BlockLayerLeaves.java
+++ b/src/main/java/net/minecraft/core/block/LeavesLayerBlock.java
@@ -1,10 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.EntityLiving;
+
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
@@ -14,16 +13,16 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, AxisAlignedBB, 
-//            IBlockAccess, Item, EntityItem, ItemStack, 
-//            StatList, EntityPlayer, EnumSkyBlock
+//            IBlockAccess, Item, ItemEntity, ItemStack,
+//            StatList, Player, EnumSkyBlock
 
-public class BlockLayerLeaves extends BlockLayerBase
+public class LeavesLayerBlock extends BaseLayerBlock
 {
     public static final int MASK_PERMANENT = 0b1000_0000;
 
-	public BlockLayerLeaves(String key, int id, Material material)
+	public LeavesLayerBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
         setTicking(true);
     }
@@ -56,7 +55,7 @@ public class BlockLayerLeaves extends BlockLayerBase
 	public boolean canPlaceBlockAt(World world, int x, int y, int z)
     {
         int l = world.getBlockId(x, y - 1, z);
-        if(l == 0 || (!Block.blocksList[l].isSolidRender() && !(Block.blocksList[l] instanceof BlockLeavesBase)))
+        if(l == 0 || (!Block.blocksList[l].isSolidRender() && !(Block.blocksList[l] instanceof BaseLeavesBlock)))
         {
         	return false;
         }
@@ -87,7 +86,7 @@ public class BlockLayerLeaves extends BlockLayerBase
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockChestLegacy.java b/src/main/java/net/minecraft/core/block/LegacyChestBlock.java
similarity index 79%
rename from src/main/java/net/minecraft/core/block/BlockChestLegacy.java
rename to src/main/java/net/minecraft/core/block/LegacyChestBlock.java
index 8b16e2890..ee4ad0fe7 100644
--- a/src/main/java/net/minecraft/core/block/BlockChestLegacy.java
+++ b/src/main/java/net/minecraft/core/block/LegacyChestBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.Global;
-import net.minecraft.core.block.BlockChest.Type;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityChest;
+import net.minecraft.core.block.ChestBlock.Type;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.ChestBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Direction;
@@ -13,42 +13,42 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 @Deprecated
-public class BlockChestLegacy extends BlockTileEntity {
+public class LegacyChestBlock extends EntityBlock {
 	
-	public BlockChestLegacy(String key, int id, Material material) {
-		super(key, id, Material.wood);
+	public LegacyChestBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.wood);
 	}
 	
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
 		if(isLegacyChest(world, x, y, z)) {
 			updateLegacyChest(world, x, y, z);
 		}
 		Block block = world.getBlock(x, y, z);
 		if(block != null) {
-			return super.getBreakResult(world, dropCause, x, y, z, meta, tileEntity);
+			return super.getBreakResult(world, dropCause, x, y, z, meta, blockEntity);
 		}
 		return null;
 	}
 
 	@Override
-	protected TileEntity getNewBlockEntity() {
-		return new TileEntityChest();
+	protected BlockEntity getNewBlockEntity() {
+		return new ChestBlockEntity();
 	}
 	
 	public static boolean isLegacyChest(World world, int x, int y, int z) {
 		int id = world.getBlockId(x, y, z);
-		return id == Block.chestLegacy.id || id == Block.chestLegacyPainted.id;
+		return id == Blocks.CHEST_LEGACY.id || id == Blocks.CHEST_LEGACY_PAINTED.id;
 	}
 	
 	@Override
 	public void onBlockRemoved(World world, int x, int y, int z, int data) {
-		BlockChest.dropChestContent(world, x, y, z);
+		ChestBlock.dropChestContent(world, x, y, z);
 		super.onBlockRemoved(world, x, y, z, data);
 	}
 	
 	@Override
-	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) {
 			return true;
 		}
@@ -92,8 +92,8 @@ public class BlockChestLegacy extends BlockTileEntity {
 				facingDirection = Direction.SOUTH;
 			}
 			
-			meta = BlockChest.getMetaWithDirection(meta, facingDirection);
-			meta = BlockChest.getMetaWithType(meta, Type.SINGLE);
+			meta = ChestBlock.getMetaWithDirection(meta, facingDirection);
+			meta = ChestBlock.getMetaWithType(meta, Type.SINGLE);
 			
 			ItemStack[] items = getAndClearChestInventory(world, x, y, z);
 			
@@ -155,11 +155,11 @@ public class BlockChestLegacy extends BlockTileEntity {
 			if(type == Type.LEFT) otherType = Type.RIGHT;
 			if(type == Type.RIGHT) otherType = Type.LEFT;
 			
-			meta = BlockChest.getMetaWithDirection(meta, facingDirection);
-			meta = BlockChest.getMetaWithType(meta, type);
+			meta = ChestBlock.getMetaWithDirection(meta, facingDirection);
+			meta = ChestBlock.getMetaWithType(meta, type);
 			
-			otherMeta = BlockChest.getMetaWithDirection(otherMeta, facingDirection);
-			otherMeta = BlockChest.getMetaWithType(otherMeta, otherType);
+			otherMeta = ChestBlock.getMetaWithDirection(otherMeta, facingDirection);
+			otherMeta = ChestBlock.getMetaWithType(otherMeta, otherType);
 			
 			ItemStack[] items1 = getAndClearChestInventory(world, x, y, z);
 			ItemStack[] items2 = getAndClearChestInventory(world, otherChestX, y, otherChestZ);
@@ -178,23 +178,23 @@ public class BlockChestLegacy extends BlockTileEntity {
 	}
 	
 	private ItemStack[] getAndClearChestInventory(World world, int x, int y, int z) {
-		TileEntityChest tileEntityChest = (TileEntityChest) world.getBlockTileEntity(x, y, z);
+		ChestBlockEntity tileEntityChest = (ChestBlockEntity) world.getBlockEntity(x, y, z);
 		
-		ItemStack[] items = new ItemStack[tileEntityChest.getSizeInventory()];
+		ItemStack[] items = new ItemStack[tileEntityChest.getContainerSize()];
 		
 		for(int i=0; i < items.length; i++) {
-			items[i] = tileEntityChest.getStackInSlot(i);
-			tileEntityChest.setInventorySlotContents(i, null);
+			items[i] = tileEntityChest.getItem(i);
+			tileEntityChest.setItem(i, null);
 		}
 		
 		return items;
 	}
 	
 	private void setChestInventory(World world, int x, int y, int z, ItemStack[] items) {
-		TileEntityChest tileEntityChest = (TileEntityChest) world.getBlockTileEntity(x, y, z);
+		ChestBlockEntity tileEntityChest = (ChestBlockEntity) world.getBlockEntity(x, y, z);
 		
 		for(int i=0; i < items.length; i++) {
-			tileEntityChest.setInventorySlotContents(i, items[i]);
+			tileEntityChest.setItem(i, items[i]);
 		}
 	}
 	
@@ -207,10 +207,10 @@ public class BlockChestLegacy extends BlockTileEntity {
 		int legacyChestMeta = world.getBlockMetadata(x, y, z);
 		
 		Block oldBlock = world.getBlock(x, y, z);
-		Block newBlock = Block.chestPlanksOak;
+		Block newBlock = Blocks.CHEST_PLANKS_OAK;
 		
-		if(oldBlock == Block.chestLegacyPainted) {
-			newBlock = Block.chestPlanksOakPainted;
+		if(oldBlock == Blocks.CHEST_LEGACY_PAINTED) {
+			newBlock = Blocks.CHEST_PLANKS_OAK_PAINTED;
 			newMeta = newMeta | (legacyChestMeta << 4);
 		}
 		
diff --git a/src/main/java/net/minecraft/core/block/LeverBlock.java b/src/main/java/net/minecraft/core/block/LeverBlock.java
new file mode 100644
index 000000000..21af5a45b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/LeverBlock.java
@@ -0,0 +1,302 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.tag.ItemTags;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.World;
+
+public class LeverBlock extends Block
+{
+    public static final int MASK_POWERED = 0b0001_0000;
+    public static final int MASK_ROTATION = 0b0000_1111;
+    public static final int ROTATION_EAST = 1;
+    public static final int ROTATION_WEST = 2;
+    public static final int ROTATION_SOUTH = 3;
+    public static final int ROTATION_NORTH = 4;
+    public static final int ROTATION_TOP_NS = 5;
+    public static final int ROTATION_TOP_WE = 6;
+    public static final int ROTATION_BOTTOM_NS = 7;
+    public static final int ROTATION_BOTTOM_WE = 8;
+
+	public LeverBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.decoration);
+    }
+
+    @Override
+	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
+    {
+        return null;
+    }
+
+    @Override
+	public boolean isSolidRender()
+    {
+        return false;
+    }
+
+    @Override
+	public boolean isCubeShaped()
+    {
+        return false;
+    }
+
+    @Override
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side) {
+        Side checkSide = side.getOpposite();
+        return world.isBlockNormalCube(x + checkSide.getOffsetX(), y + checkSide.getOffsetY(), z + checkSide.getOffsetZ());
+    }
+
+
+    @Override
+	public boolean canPlaceBlockAt(World world, int x, int y, int z)
+    {
+        for (Side s : Side.sides){
+            if(world.isBlockNormalCube(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ())){
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    @Override
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean isPowered = isPowered(meta);
+        int rotation = -1;
+        switch (side){
+            case BOTTOM:
+                if (world.canPlaceOnSurfaceOfBlock(x, y + 1, z)){
+                    rotation = ROTATION_BOTTOM_NS + (mob.getHorizontalPlacementDirection(side).getAxis() == Axis.Z ? 1 : 0);
+                }
+                break;
+            case TOP:
+                if (world.canPlaceOnSurfaceOfBlock(x, y - 1, z))
+                {
+                    rotation = ROTATION_TOP_NS + (mob.getHorizontalPlacementDirection(side).getAxis() == Axis.Z ? 1 : 0);
+                }
+                break;
+            case NORTH:
+                if (world.isBlockNormalCube(x, y, z + 1)){
+                    rotation = ROTATION_NORTH;
+                }
+                break;
+            case SOUTH:
+                if (world.isBlockNormalCube(x, y, z - 1)){
+                    rotation = ROTATION_SOUTH;
+                }
+                break;
+            case WEST:
+                if (world.isBlockNormalCube(x + 1, y, z)){
+                    rotation = ROTATION_WEST;
+                }
+                break;
+            case EAST:
+                if (world.isBlockNormalCube(x - 1, y, z)){
+                    rotation = ROTATION_EAST;
+                }
+                break;
+        }
+
+        if(rotation == -1) {
+            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
+            world.setBlockWithNotify(x, y, z, 0);
+        } else {
+            world.setBlockMetadataWithNotify(x, y, z, rotation | (isPowered ? MASK_POWERED : 0));
+        }
+    }
+    
+    @Override
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
+    {
+        if(checkIfAttachedToBlock(world, x, y, z))
+        {
+            int rotation = getRotation(world.getBlockMetadata(x, y, z));
+            boolean shouldBreak;
+            switch (rotation){
+                case ROTATION_EAST:
+                    shouldBreak = !world.isBlockNormalCube(x - 1, y, z);
+                    break;
+                case ROTATION_WEST:
+                    shouldBreak = !world.isBlockNormalCube(x + 1, y, z);
+                    break;
+                case ROTATION_SOUTH:
+                    shouldBreak = !world.isBlockNormalCube(x, y, z - 1);
+                    break;
+                case ROTATION_NORTH:
+                    shouldBreak = !world.isBlockNormalCube(x, y, z + 1);
+                    break;
+                case ROTATION_TOP_NS:
+                case ROTATION_TOP_WE:
+                    shouldBreak = !world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
+                    break;
+                case ROTATION_BOTTOM_NS:
+                case ROTATION_BOTTOM_WE:
+                    shouldBreak = !world.canPlaceOnSurfaceOfBlock(x, y + 1, z);
+                    break;
+                default:
+                    shouldBreak = true;
+            }
+            if(shouldBreak)
+            {
+                dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
+                world.setBlockWithNotify(x, y, z, 0);
+            }
+        }
+    }
+
+    private boolean checkIfAttachedToBlock(World world, int x, int y, int z)
+    {
+        if(!canPlaceBlockAt(world, x, y, z))
+        {
+            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
+            world.setBlockWithNotify(x, y, z, 0);
+            return false;
+        } else
+        {
+            return true;
+        }
+    }
+
+    @Override
+    public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
+    {
+        int rotation = getRotation(world.getBlockMetadata(x, y, z));
+        float f = 0.1875F;
+        if(rotation == ROTATION_EAST) {
+            setBlockBounds(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f);
+        } else if(rotation == ROTATION_WEST) {
+            setBlockBounds(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f);
+        } else if(rotation == ROTATION_SOUTH) {
+            setBlockBounds(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F);
+        } else if(rotation == ROTATION_NORTH) {
+            setBlockBounds(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F);
+        } else if (rotation == ROTATION_TOP_NS || rotation == ROTATION_TOP_WE) {
+            float f1 = 0.25F;
+            setBlockBounds(0.5F - f1, 0.0F, 0.5F - f1, 0.5F + f1, 0.6F, 0.5F + f1);
+        } else {
+            float f1 = 0.25F;
+            setBlockBounds(0.5F - f1, 0.4, 0.5F - f1, 0.5F + f1, 1F, 0.5F + f1);
+        }
+    }
+
+    @Override
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
+    {
+    	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
+    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
+    	}
+    }
+
+    @Override
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
+    {
+        int meta = world.getBlockMetadata(x, y, z);
+        int rotation = getRotation(meta);
+        if (isPowered(meta)){
+            world.setBlockMetadataWithNotify(x, y, z, meta & ~MASK_POWERED);
+        } else {
+            world.setBlockMetadataWithNotify(x, y, z, meta | MASK_POWERED);
+        }
+
+        world.markBlocksDirty(x, y, z, x, y, z);
+        world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "random.click", 0.3F, isPowered(meta) ? 0.5F : 0.6F);
+        world.notifyBlocksOfNeighborChange(x, y, z, id);
+        if(rotation == ROTATION_EAST) {
+            world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
+        } else if(rotation == ROTATION_WEST) {
+            world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
+        } else if(rotation == ROTATION_SOUTH) {
+            world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
+        } else if(rotation == ROTATION_NORTH) {
+            world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
+        } else if (rotation == ROTATION_TOP_NS || rotation == ROTATION_TOP_WE){
+            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+        } else {
+            world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
+        }
+        return true;
+    }
+
+    @Override
+    public void onBlockRemoved(World world, int x, int y, int z, int data)
+    {
+        if(isPowered(data))
+        {
+            world.notifyBlocksOfNeighborChange(x, y, z, id);
+            int rotation = getRotation(data);
+            if(rotation == ROTATION_EAST) {
+                world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
+            } else if(rotation == ROTATION_WEST) {
+                world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
+            } else if(rotation == ROTATION_SOUTH) {
+                world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
+            } else if(rotation == ROTATION_NORTH) {
+                world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
+            } else if (rotation == ROTATION_TOP_NS || rotation == ROTATION_TOP_WE){
+                world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            } else {
+                world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
+            }
+        }
+        super.onBlockRemoved(world, x, y, z, data);
+    }
+    public static int getRotation(int meta){
+        return meta & MASK_ROTATION;
+    }
+
+    @Override
+    public boolean getSignal(WorldSource worldSource, int x, int y, int z, Side side)
+    {
+        return isPowered(worldSource.getBlockMetadata(x, y, z));
+    }
+    public static boolean isPowered(int meta){
+        return (meta & MASK_POWERED) != 0;
+    }
+
+    @Override
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
+    {
+        int meta = world.getBlockMetadata(x, y, z);
+        if(!isPowered(meta)) {
+            return false;
+        }
+        int rotation = getRotation(meta);
+        if(rotation == ROTATION_BOTTOM_WE && side == Side.BOTTOM) {
+            return true;
+        }
+        if(rotation == ROTATION_BOTTOM_NS && side == Side.BOTTOM) {
+            return true;
+        }
+        if(rotation == ROTATION_TOP_WE && side == Side.TOP) {
+            return true;
+        }
+        if(rotation == ROTATION_TOP_NS && side == Side.TOP) {
+            return true;
+        }
+        if(rotation == ROTATION_NORTH && side == Side.NORTH) {
+            return true;
+        }
+        if(rotation == ROTATION_SOUTH && side == Side.SOUTH) {
+            return true;
+        }
+        if(rotation == ROTATION_WEST && side == Side.WEST) {
+            return true;
+        }
+        return rotation == ROTATION_EAST && side == Side.EAST;
+    }
+
+    @Override
+    public boolean isSignalSource()
+    {
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockLog.java b/src/main/java/net/minecraft/core/block/LogBlock.java
similarity index 82%
rename from src/main/java/net/minecraft/core/block/BlockLog.java
rename to src/main/java/net/minecraft/core/block/LogBlock.java
index 0a9a7caa8..b015d03b2 100644
--- a/src/main/java/net/minecraft/core/block/BlockLog.java
+++ b/src/main/java/net/minecraft/core/block/LogBlock.java
@@ -3,12 +3,12 @@ package net.minecraft.core.block;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-public class BlockLog extends BlockAxisAligned
+public class LogBlock extends AxisAlignedBlock
 {
 
-	public BlockLog(String key, int id)
+	public LogBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
@@ -25,7 +25,7 @@ public class BlockLog extends BlockAxisAligned
                     for(int k1 = -byte0; k1 <= byte0; k1++)
                     {
                         int l1 = world.getBlockId(x + i1, y + j1, z + k1);
-                        if(!(Block.blocksList[l1] instanceof BlockLeavesBase))
+                        if(!(Block.blocksList[l1] instanceof BaseLeavesBlock))
                         {
                             continue;
                         }
diff --git a/src/main/java/net/minecraft/core/block/BlockMesh.java b/src/main/java/net/minecraft/core/block/MeshBlock.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/BlockMesh.java
rename to src/main/java/net/minecraft/core/block/MeshBlock.java
index 03307b030..b7b0cf44c 100644
--- a/src/main/java/net/minecraft/core/block/BlockMesh.java
+++ b/src/main/java/net/minecraft/core/block/MeshBlock.java
@@ -5,19 +5,19 @@ 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.entity.ItemEntity;
 import net.minecraft.core.world.World;
 
-public class BlockMesh extends BlockTransparent
+public class MeshBlock extends TransparentBlock
 {
 
-    public BlockMesh(String key, int id)
+    public MeshBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.metal);
+        super(key, namespaceId, id, Material.metal);
     }
     
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -30,6 +30,6 @@ public class BlockMesh extends BlockTransparent
 
     @Override
     public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
-        return !(entity instanceof EntityItem);
+        return !(entity instanceof ItemEntity);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java b/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockMobSpawner.java
rename to src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
index 8091527ec..e2e09f731 100644
--- a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
+++ b/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
@@ -1,29 +1,29 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.block.material.Material;
 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.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class BlockMobSpawner extends BlockTileEntity
+public class MobSpawnerBlock extends EntityBlock
 {
 
-	public BlockMobSpawner(String key, int id)
+	public MobSpawnerBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, Material.stone);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
         if (player.getGamemode() != Gamemode.creative) {
             return false;
         }
@@ -33,26 +33,26 @@ public class BlockMobSpawner extends BlockTileEntity
     }
 
     @Override
-	public TileEntity getNewBlockEntity()
+	public BlockEntity getNewBlockEntity()
     {
-        return new TileEntityMobSpawner();
+        return new MobSpawnerBlockEntity();
     }
 
     @Override
-	public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	TileEntityMobSpawner tileEntity = (TileEntityMobSpawner) world.getBlockTileEntity(x, y, z);
+	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	MobSpawnerBlockEntity tileEntity = (MobSpawnerBlockEntity) world.getBlockEntity(x, y, z);
     	tileEntity.setMobId("none");
     }
 
     @Override
     public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
-        return !(entity instanceof EntityItem);
+        return !(entity instanceof ItemEntity);
     }
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
         if (!world.isClientSide) {
-            TileEntityMobSpawner tileEntityMobSpawner = (TileEntityMobSpawner) world.getBlockTileEntity(x, y, z);
+            MobSpawnerBlockEntity tileEntityMobSpawner = (MobSpawnerBlockEntity) world.getBlockEntity(x, y, z);
             if (tileEntityMobSpawner == null) return;
             int amountToDrop = world.rand.nextInt(10) + 10;
             label0:
@@ -62,22 +62,22 @@ public class BlockMobSpawner extends BlockTileEntity
                     ItemStack itemstack;
                     switch (mobInSpawner) {
                         case "Zombie":
-                            itemstack = new ItemStack(Item.cloth);
+                            itemstack = new ItemStack(Items.CLOTH);
                             break;
                         case "Skeleton":
                             if (world.rand.nextInt(2) == 0)
-                                itemstack = new ItemStack(Item.bone);
+                                itemstack = new ItemStack(Items.BONE);
                             else
-                                itemstack = new ItemStack(Item.ammoArrow);
+                                itemstack = new ItemStack(Items.AMMO_ARROW);
                             break;
                         case "ArmouredZombie":
-                            itemstack = new ItemStack(Item.chainlink);
+                            itemstack = new ItemStack(Items.CHAINLINK);
                             break;
                         case "Spider":
-                            itemstack = new ItemStack(Item.string);
+                            itemstack = new ItemStack(Items.STRING);
                             break;
                         case "Snowman":
-                            itemstack = new ItemStack(Item.ammoSnowball);
+                            itemstack = new ItemStack(Items.AMMO_SNOWBALL);
                             break;
                         default:
                             itemstack = null;
@@ -99,7 +99,7 @@ public class BlockMobSpawner extends BlockTileEntity
                             i1 = itemstack.stackSize;
                         }
                         itemstack.stackSize -= i1;
-                        EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
+                        ItemEntity entityitem = new ItemEntity(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
                         float f3 = 0.05F;
                         entityitem.xd = (float) world.rand.nextGaussian() * f3;
                         entityitem.yd = (float) world.rand.nextGaussian() * f3 + 0.2F;
@@ -113,11 +113,11 @@ public class BlockMobSpawner extends BlockTileEntity
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause == EnumDropCause.SILK_TOUCH)
         {
-            return new ItemStack[] { new ItemStack(Block.mobspawnerDeactivated) };
+            return new ItemStack[] { new ItemStack(Blocks.MOBSPAWNER_DEACTIVATED) };
         }
         return null;
     }
@@ -129,7 +129,7 @@ public class BlockMobSpawner extends BlockTileEntity
     }
     
     @Override
-	public boolean renderAsNormalBlock() {
+	public boolean isCubeShaped() {
     	return false;
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java b/src/main/java/net/minecraft/core/block/MobSpawnerDeactivatedBlock.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java
rename to src/main/java/net/minecraft/core/block/MobSpawnerDeactivatedBlock.java
index c940c70c5..d41842fbb 100644
--- a/src/main/java/net/minecraft/core/block/BlockMobSpawnerDeactivated.java
+++ b/src/main/java/net/minecraft/core/block/MobSpawnerDeactivatedBlock.java
@@ -1,21 +1,21 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockMobSpawnerDeactivated extends BlockTransparent{
-    public BlockMobSpawnerDeactivated(String key, int id, Material material)
+public class MobSpawnerDeactivatedBlock extends TransparentBlock {
+    public MobSpawnerDeactivatedBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
@@ -28,10 +28,10 @@ public class BlockMobSpawnerDeactivated extends BlockTransparent{
 
     @Override
     public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
-        return !(entity instanceof EntityItem);
+        return !(entity instanceof ItemEntity);
     }
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockMoss.java b/src/main/java/net/minecraft/core/block/MossBlock.java
similarity index 65%
rename from src/main/java/net/minecraft/core/block/BlockMoss.java
rename to src/main/java/net/minecraft/core/block/MossBlock.java
index 85eb1e64e..ecdf73702 100644
--- a/src/main/java/net/minecraft/core/block/BlockMoss.java
+++ b/src/main/java/net/minecraft/core/block/MossBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -12,11 +12,12 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Random;
 
-public class BlockMoss extends Block implements IBonemealable {
-
-	public BlockMoss(String key, int id) {
-		super(key, id, Material.moss);
+public class MossBlock extends Block implements IBonemealable {
+	public static Map<Integer, Integer> variantMap = new HashMap<>();
+	public MossBlock(String key, String namespaceId, int id, int parentId) {
+		super(key, namespaceId, id, Material.moss);
 		setTicking(true);
+		variantMap.put(parentId, id);
 	}
 
 	@Override
@@ -95,13 +96,13 @@ public class BlockMoss extends Block implements IBonemealable {
 	public static final Map<Block, Block> mossToStoneMap = new HashMap<>();
 
 	public static void initMossMap() {
-		stoneToMossMap.put(stone, mossStone);
-		stoneToMossMap.put(granite, mossGranite);
-		stoneToMossMap.put(limestone, mossLimestone);
-		stoneToMossMap.put(basalt, mossBasalt);
-		stoneToMossMap.put(cobbleStone, cobbleStoneMossy);
-		stoneToMossMap.put(brickStonePolished, brickStonePolishedMossy);
-		stoneToMossMap.put(logOak, logOakMossy);
+		stoneToMossMap.put(Blocks.STONE, Blocks.MOSS_STONE);
+		stoneToMossMap.put(Blocks.GRANITE, Blocks.MOSS_GRANITE);
+		stoneToMossMap.put(Blocks.LIMESTONE, Blocks.MOSS_LIMESTONE);
+		stoneToMossMap.put(Blocks.BASALT, Blocks.MOSS_BASALT);
+		stoneToMossMap.put(Blocks.COBBLE_STONE, Blocks.COBBLE_STONE_MOSSY);
+		stoneToMossMap.put(Blocks.BRICK_STONE_POLISHED, Blocks.BRICK_STONE_POLISHED_MOSSY);
+		stoneToMossMap.put(Blocks.LOG_OAK, Blocks.LOG_OAK_MOSSY);
 		
 		for(Entry<Block, Block> entry : stoneToMossMap.entrySet()) {
 			mossToStoneMap.put(entry.getValue(), entry.getKey());
@@ -109,7 +110,7 @@ public class BlockMoss extends Block implements IBonemealable {
 	}
 
 	@Override
-	public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(!world.isClientSide)
 		{
 			if (entityplayer.getGamemode().consumeBlocks())
@@ -143,20 +144,20 @@ public class BlockMoss extends Block implements IBonemealable {
 					continue;
 				}
 
-				if(world.getBlockId(k1, l1, i2) == Block.stone.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.mossStone.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.limestone.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.mossLimestone.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.granite.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.mossGranite.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.basalt.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.mossBasalt.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.cobbleStone.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.cobbleStoneMossy.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.brickStonePolished.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.brickStonePolishedMossy.id);
-				else if(world.getBlockId(k1, l1, i2) == Block.logOak.id)
-					world.setBlockWithNotify(k1, l1, i2, Block.logOakMossy.id);
+				if(world.getBlockId(k1, l1, i2) == Blocks.STONE.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.MOSS_STONE.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.LIMESTONE.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.MOSS_LIMESTONE.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.GRANITE.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.MOSS_GRANITE.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.BASALT.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.MOSS_BASALT.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.COBBLE_STONE.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.COBBLE_STONE_MOSSY.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.BRICK_STONE_POLISHED.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.BRICK_STONE_POLISHED_MOSSY.id);
+				else if(world.getBlockId(k1, l1, i2) == Blocks.LOG_OAK.id)
+					world.setBlockWithNotify(k1, l1, i2, Blocks.LOG_OAK_MOSSY.id);
 
 			}
 
diff --git a/src/main/java/net/minecraft/core/block/BlockMotionSensor.java b/src/main/java/net/minecraft/core/block/MotionSensorBlock.java
similarity index 71%
rename from src/main/java/net/minecraft/core/block/BlockMotionSensor.java
rename to src/main/java/net/minecraft/core/block/MotionSensorBlock.java
index 7f88d6f2c..027013f01 100644
--- a/src/main/java/net/minecraft/core/block/BlockMotionSensor.java
+++ b/src/main/java/net/minecraft/core/block/MotionSensorBlock.java
@@ -4,39 +4,40 @@ package net.minecraft.core.block;
 import java.util.Random;
 
 import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntitySensor;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.SensorBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, Item,
-//            EntityPlayer, Entity
+//            Player, Entity
 
-public class BlockMotionSensor extends BlockTileEntityRotatable
+public class MotionSensorBlock extends RotatableEntityBlock
 {
     public final boolean isActive;
 
-    public BlockMotionSensor(String key, int id, boolean isActive)
+    public MotionSensorBlock(String key, String namespaceId, int id, boolean isActive)
     {
-        super(key, id, Material.glass);
+        super(key, namespaceId, id, Material.glass);
         this.isActive = isActive;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         setDefaultDirection(world, x, y, z);
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(!isActive)
         {
@@ -48,9 +49,9 @@ public class BlockMotionSensor extends BlockTileEntityRotatable
 	public static void updateSensorBlockState(boolean active, World world, int x, int y, int z) {
 		int meta = world.getBlockMetadata(x, y, z);
 		if(active) {
-			world.setBlockWithNotify(x, y, z, Block.motionsensorActive.id);
+			world.setBlockWithNotify(x, y, z, Blocks.MOTION_SENSOR_ACTIVE.id);
 		}else {
-			world.setBlockWithNotify(x, y, z, Block.motionsensorIdle.id);
+			world.setBlockWithNotify(x, y, z, Blocks.MOTION_SENSOR_IDLE.id);
 		}
 		world.setBlockMetadataWithNotify(x, y, z, meta);
 	}
@@ -87,30 +88,30 @@ public class BlockMotionSensor extends BlockTileEntityRotatable
 	}
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return true;
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
-        return isPoweringTo(world, x, y, z, side);
+        return getSignal(world, x, y, z, side);
     }
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
         return isActive;
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntitySensor();
+        return new SensorBlockEntity();
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
         switch (dropCause)
         {
             case WORLD:
@@ -118,7 +119,7 @@ public class BlockMotionSensor extends BlockTileEntityRotatable
             case PROPER_TOOL:
             case PICK_BLOCK:
             case SILK_TOUCH:
-                return new ItemStack[] { new ItemStack(Block.motionsensorIdle) };
+                return new ItemStack[] { new ItemStack(Blocks.MOTION_SENSOR_IDLE) };
             default:
                 return null;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockMud.java b/src/main/java/net/minecraft/core/block/MudBlock.java
similarity index 82%
rename from src/main/java/net/minecraft/core/block/BlockMud.java
rename to src/main/java/net/minecraft/core/block/MudBlock.java
index 9c051dc50..3cdd7e3ca 100644
--- a/src/main/java/net/minecraft/core/block/BlockMud.java
+++ b/src/main/java/net/minecraft/core/block/MudBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityFallingSand;
+import net.minecraft.core.entity.FallingBlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
@@ -12,23 +12,23 @@ import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class BlockMud extends Block{
-    public BlockMud(String key, int id, Material material, boolean isHardened)
+public class MudBlock extends Block{
+    public MudBlock(String key, String namespaceId, int id, Material material, boolean isHardened)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         this.isHardened = isHardened;
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 5;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
     }
 
     private boolean isWaterNearby(final World world, final int x, final int y, final int z, int range)
@@ -86,7 +86,7 @@ public class BlockMud extends Block{
                     for (int z1 = z - 1; z1 <= z + 1; z1++)
                     {
                         //...And the block is next to another wet mud block, it can become wet
-                        if (world.getBlockId(x1, y1, z1) == Block.mud.id)
+                        if (world.getBlockId(x1, y1, z1) == Blocks.MUD.id)
                         {
                             return true;
                         }
@@ -101,19 +101,19 @@ public class BlockMud extends Block{
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
     }
 
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return new ItemStack[] { new ItemStack(this, 1, meta) };
     }
 
     private void tryToFall(World world, int x, int y, int z)
     {
-        if(world.getBlockId(x, y, z) == Block.mudBaked.id){
+        if(world.getBlockId(x, y, z) == Blocks.MUD_BAKED.id){
             return;
         }
 
@@ -134,7 +134,7 @@ public class BlockMud extends Block{
                 }
             } else
             {
-                EntityFallingSand entityfallingsand = new EntityFallingSand(world, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, id);
+                FallingBlockEntity entityfallingsand = new FallingBlockEntity(world, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, id);
                 world.entityJoinedWorld(entityfallingsand);
             }
         }
@@ -147,7 +147,7 @@ public class BlockMud extends Block{
         {
             return true;
         }
-        if(blockId == Block.fire.id)
+        if(blockId == Blocks.FIRE.id)
         {
             return true;
         }
@@ -166,8 +166,8 @@ public class BlockMud extends Block{
         if(isHardened) {
             if(!isLavaNearby(world, x, y, z)) {
                 if (canBecomeWet(world, x, y, z)) {
-                    world.setBlock(x, y, z, Block.mud.id);
-                    world.notifyBlockChange(x, y, z, Block.mud.id);
+                    world.setBlock(x, y, z, Blocks.MUD.id);
+                    world.notifyBlockChange(x, y, z, Blocks.MUD.id);
                     return;
                 }
             }
@@ -180,8 +180,8 @@ 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, 0);
                 }
-                world.setBlock(x, y, z, Block.mudBaked.id);
-                world.notifyBlockChange(x, y, z, Block.mudBaked.id);
+                world.setBlock(x, y, z, Blocks.MUD_BAKED.id);
+                world.notifyBlockChange(x, y, z, Blocks.MUD_BAKED.id);
                 return;
             }
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockMushroom.java b/src/main/java/net/minecraft/core/block/MushroomBlock.java
similarity index 88%
rename from src/main/java/net/minecraft/core/block/BlockMushroom.java
rename to src/main/java/net/minecraft/core/block/MushroomBlock.java
index 4e5a0394c..a3a06e182 100644
--- a/src/main/java/net/minecraft/core/block/BlockMushroom.java
+++ b/src/main/java/net/minecraft/core/block/MushroomBlock.java
@@ -5,14 +5,14 @@ import net.minecraft.core.world.World;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, Block
+//            FlowerBlock, World, Block
 
-public class BlockMushroom extends BlockFlower
+public class MushroomBlock extends FlowerBlock
 {
 
-	public BlockMushroom(String key, int id)
+	public MushroomBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         float f = 0.2F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
         setTicking(true);
diff --git a/src/main/java/net/minecraft/core/block/BlockOreIron.java b/src/main/java/net/minecraft/core/block/NetherCoalOreBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockOreIron.java
rename to src/main/java/net/minecraft/core/block/NetherCoalOreBlock.java
index 727ef2e8b..d65276b39 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreIron.java
+++ b/src/main/java/net/minecraft/core/block/NetherCoalOreBlock.java
@@ -1,20 +1,22 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-public class BlockOreIron extends Block
+public class NetherCoalOreBlock extends Block
 {
-    public BlockOreIron(String key, int id, Material material) {
-        super(key, id, material);
+
+    public NetherCoalOreBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.netherrack);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -23,10 +25,9 @@ public class BlockOreIron extends Block
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.oreRawIron) };
+                return new ItemStack[] { new ItemStack(Items.NETHERCOAL) };
             default:
                 return null;
         }
     }
-
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockNote.java b/src/main/java/net/minecraft/core/block/NoteBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockNote.java
rename to src/main/java/net/minecraft/core/block/NoteBlock.java
index 22e27adc0..3ae00756d 100644
--- a/src/main/java/net/minecraft/core/block/BlockNote.java
+++ b/src/main/java/net/minecraft/core/block/NoteBlock.java
@@ -1,33 +1,28 @@
 package net.minecraft.core.block;
 
-
-// Referenced classes of package net.minecraft.src:
-//            BlockContainer, Material, Block, World, 
-//            TileEntityNote, EntityPlayer, TileEntity
-
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.NoteBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityNote;
 import net.minecraft.core.block.material.Material;
 
-public class BlockNote extends BlockTileEntity
+public class NoteBlock extends EntityBlock
 {
 
-    public BlockNote(String key, int id)
+    public NoteBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        if(blockId > 0 && Block.blocksList[blockId].canProvidePower())
+        if(blockId > 0 && Block.blocksList[blockId].isSignalSource())
         {
             boolean flag = world.isBlockGettingPowered(x, y, z);
-            TileEntityNote tileentitynote = (TileEntityNote)world.getBlockTileEntity(x, y, z);
+            NoteBlockEntity tileentitynote = (NoteBlockEntity)world.getBlockEntity(x, y, z);
             if(tileentitynote.previousRedstoneState != flag)
             {
                 if(flag)
@@ -40,14 +35,14 @@ public class BlockNote extends BlockTileEntity
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if(world.isClientSide)
         {
             return true;
         } else
         {
-            TileEntityNote tileentitynote = (TileEntityNote)world.getBlockTileEntity(x, y, z);
+            NoteBlockEntity tileentitynote = (NoteBlockEntity)world.getBlockEntity(x, y, z);
             tileentitynote.changePitch();
             tileentitynote.triggerNote(world, x, y, z);
             return true;
@@ -55,23 +50,23 @@ public class BlockNote extends BlockTileEntity
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         if(world.isClientSide)
         {
             return;
         } else
         {
-            TileEntityNote tileentitynote = (TileEntityNote)world.getBlockTileEntity(x, y, z);
+            NoteBlockEntity tileentitynote = (NoteBlockEntity)world.getBlockEntity(x, y, z);
             tileentitynote.triggerNote(world, x, y, z);
             return;
         }
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityNote();
+        return new NoteBlockEntity();
     }
 
     @Override
@@ -95,7 +90,7 @@ public class BlockNote extends BlockTileEntity
         {
             s = "bassattack";
         }
-        world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, (new StringBuilder()).append("note.").append(s).toString(), 3F, f);
+        world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D, "note." + s, 3F, f);
         world.spawnParticle("note", (double) x + 0.5D, (double) y + 1.2D, (double) z + 0.5D, (double) data / 24D, 0.0D, 0.0D, 0);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesOak.java b/src/main/java/net/minecraft/core/block/OakLeavesBlock.java
similarity index 59%
rename from src/main/java/net/minecraft/core/block/BlockLeavesOak.java
rename to src/main/java/net/minecraft/core/block/OakLeavesBlock.java
index de34c8669..12b58a7dd 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesOak.java
+++ b/src/main/java/net/minecraft/core/block/OakLeavesBlock.java
@@ -2,21 +2,21 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.world.wind.WindManager;
+import net.minecraft.core.world.wind.WindProvider;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess, 
-//            WorldChunkManager, World, Block, EntityPlayer, 
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
 //            ItemStack, Item, ItemShears, StatList, 
 //            Entity
 
-public class BlockLeavesOak extends BlockLeavesBase
+public class OakLeavesBlock extends BaseLeavesBlock
 {
-	public BlockLeavesOak(String key, int id)
+	public OakLeavesBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.leaves);
+        super(key, namespaceId, id, Material.leaves);
     }
 
     @Override
@@ -29,14 +29,14 @@ public class BlockLeavesOak extends BlockLeavesBase
             {
                 int id = world.getBlockId(x, y + q, z);
                 if (id != 0) break;
-                if (Block.layerLeavesOak.canPlaceBlockAt(world, x, y + q, z) && Block.blocksList[world.getBlockId(x, y + q - 1, z)].blockMaterial.blocksMotion())
+                if (Blocks.LAYER_LEAVES_OAK.canPlaceBlockAt(world, x, y + q, z) && Block.blocksList[world.getBlockId(x, y + q - 1, z)].blockMaterial.blocksMotion())
                 {
-                    world.setBlockWithNotify(x, y + q, z, Block.layerLeavesOak.id);
+                    world.setBlockWithNotify(x, y + q, z, Blocks.LAYER_LEAVES_OAK.id);
                     break;
                 }
-                else if (world.getBlockId(x, y + q, z) == Block.layerLeavesOak.id)
+                else if (world.getBlockId(x, y + q, z) == Blocks.LAYER_LEAVES_OAK.id)
                 {
-                    ((BlockLayerLeaves) Block.layerLeavesOak).accumulate(world, x, y + q, z);
+                    ((LeavesLayerBlock) Blocks.LAYER_LEAVES_OAK).accumulate(world, x, y + q, z);
                     break;
                 }
             }
@@ -46,15 +46,15 @@ public class BlockLeavesOak extends BlockLeavesBase
     @Override
     protected Block getSapling()
     {
-        return Block.saplingOak;
+        return Blocks.SAPLING_OAK;
     }
 
     @Override
-    public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+    public void animationTick(World world, int x, int y, int z, Random rand)
     {
     	if (world.getSeasonManager().getCurrentSeason() != null && world.getSeasonManager().getCurrentSeason().hasFallingLeaves)
     	{
-            WindManager wind = world.getWorldType().getWindManager();
+            WindProvider wind = world.getWorldType().getWindManager();
             float windIntensity = wind.getWindIntensity(world, x, y, z);
             if (rand.nextInt((int)(40 + 200 * (1 - windIntensity))) == 0)
             {
diff --git a/src/main/java/net/minecraft/core/block/BlockOverlayPebbles.java b/src/main/java/net/minecraft/core/block/OverlayPebblesBlock.java
similarity index 74%
rename from src/main/java/net/minecraft/core/block/BlockOverlayPebbles.java
rename to src/main/java/net/minecraft/core/block/OverlayPebblesBlock.java
index 61fdb3b3b..d6536bcc1 100644
--- a/src/main/java/net/minecraft/core/block/BlockOverlayPebbles.java
+++ b/src/main/java/net/minecraft/core/block/OverlayPebblesBlock.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockOverlayPebbles extends Block
+public class OverlayPebblesBlock extends Block
 {
-    public BlockOverlayPebbles(String key, int id, Material material)
+    public OverlayPebblesBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
@@ -44,7 +44,7 @@ public class BlockOverlayPebbles extends Block
     @Override
     public AABB getSelectedBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-        return AABB.getBoundingBoxFromPool(x, y, z, x + 1, y + 0.0625f, z + 1);
+        return AABB.getTemporaryBB(x, y, z, x + 1, y + 0.0625f, z + 1);
     }
 
     @Override
@@ -69,18 +69,18 @@ public class BlockOverlayPebbles extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause == EnumDropCause.PICK_BLOCK)
         {
-            return new ItemStack[] { new ItemStack(Item.ammoPebble, 1) };
+            return new ItemStack[] { new ItemStack(Items.AMMO_PEBBLE, 1) };
         }
-        return new ItemStack[] { new ItemStack(Item.ammoPebble, meta + 1) };
+        return new ItemStack[] { new ItemStack(Items.AMMO_PEBBLE, meta + 1) };
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockFencePainted.java b/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
similarity index 59%
rename from src/main/java/net/minecraft/core/block/BlockFencePainted.java
rename to src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
index c605fba45..2ae7966b8 100644
--- a/src/main/java/net/minecraft/core/block/BlockFencePainted.java
+++ b/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockFencePainted extends BlockFence
+public class PaintedFenceBlock extends FenceBlock
 {
-	public BlockFencePainted(String key, int id)
+	public PaintedFenceBlock(String key, String namespaceId, int id)
 	{
-		super(key, id);
+		super(key, namespaceId, id);
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		return new ItemStack[] { new ItemStack(this, 1, meta & 0x0F) };
 	}
diff --git a/src/main/java/net/minecraft/core/block/BlockFenceGatePainted.java b/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
similarity index 59%
rename from src/main/java/net/minecraft/core/block/BlockFenceGatePainted.java
rename to src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
index 0020b5e22..0743413f9 100644
--- a/src/main/java/net/minecraft/core/block/BlockFenceGatePainted.java
+++ b/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockFenceGatePainted extends BlockFenceGate
+public class PaintedFenceGateBlock extends FenceGateBlock
 {
-	public BlockFenceGatePainted(String key, int id)
+	public PaintedFenceGateBlock(String key, String namespaceId, int id)
 	{
-		super(key, id);
+		super(key, namespaceId, id);
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		return new ItemStack[] { new ItemStack(this, 1, meta & 0xF0) };
 	}
diff --git a/src/main/java/net/minecraft/core/block/BlockPlanksPainted.java b/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockPlanksPainted.java
rename to src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
index fe45c35f5..26e5c1cbf 100644
--- a/src/main/java/net/minecraft/core/block/BlockPlanksPainted.java
+++ b/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
@@ -9,21 +9,17 @@ import net.minecraft.core.world.World;
 // Referenced classes of package net.minecraft.src:
 //            Block, Material
 
-public class BlockPlanksPainted extends Block
+public class PaintedPlanksBlock extends Block
 {
-    public BlockPlanksPainted(String key, int id)
+    public PaintedPlanksBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return new ItemStack[] { new ItemStack(this, 1, meta) };
     }
 
-    public static int getMetadataForColour(int i)
-    {
-        return ~i & 0xf;
-    }
 }
diff --git a/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java b/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java
new file mode 100644
index 000000000..3865612f6
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java
@@ -0,0 +1,20 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class PaintedSlabBlock extends SlabBlock
+{
+	public PaintedSlabBlock(Block modelBlock, String namespaceId, int id)
+	{
+		super(modelBlock, namespaceId, id);
+	}
+
+	@Override
+	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+		int meta = mob.getVerticalPlacementDirection(side, sideHeight) == Direction.UP ? 2 : 0;
+		world.setBlockMetadataWithNotify(x, y, z, meta | (world.getBlockMetadata(x, y, z) & 0xF0));
+	}
+}
diff --git a/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java b/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java
new file mode 100644
index 000000000..3aaa018c6
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java
@@ -0,0 +1,33 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Mob;
+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 PaintedTrapDoorBlock extends TrapDoorBlock {
+    public PaintedTrapDoorBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material, false);
+    }
+    @Override
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+        int meta = world.getBlockMetadata(x, y, z);
+        int colorBits = meta & 0xF0;
+        meta = getMetaForDirection(mob.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
+        if(mob.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, BlockEntity blockEntity)
+    {
+        return new ItemStack[] { new ItemStack(Blocks.TRAPDOOR_PLANKS_PAINTED, 1, (meta >> 4 & 0xF) << 4) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/PalmLeavesBlock.java b/src/main/java/net/minecraft/core/block/PalmLeavesBlock.java
new file mode 100644
index 000000000..6738b2313
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/PalmLeavesBlock.java
@@ -0,0 +1,16 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+
+public class PalmLeavesBlock extends BaseLeavesBlock {
+
+	public PalmLeavesBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.leaves);
+	}
+
+	@Override
+	protected Block getSapling() {
+		return Blocks.SAPLING_PALM;
+	}
+
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockFencePaperWall.java b/src/main/java/net/minecraft/core/block/PaperWallFenceBlock.java
similarity index 91%
rename from src/main/java/net/minecraft/core/block/BlockFencePaperWall.java
rename to src/main/java/net/minecraft/core/block/PaperWallFenceBlock.java
index cbed1d345..6998095f4 100644
--- a/src/main/java/net/minecraft/core/block/BlockFencePaperWall.java
+++ b/src/main/java/net/minecraft/core/block/PaperWallFenceBlock.java
@@ -5,11 +5,11 @@ import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockFencePaperWall extends BlockFenceThin
+public class PaperWallFenceBlock extends ThinFenceBlock
 {
-    public BlockFencePaperWall(String key, int id, Material material)
+    public PaperWallFenceBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesPine.java b/src/main/java/net/minecraft/core/block/PineLeavesBlock.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/BlockLeavesPine.java
rename to src/main/java/net/minecraft/core/block/PineLeavesBlock.java
index 5f4b4eb82..78c0a67c4 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesPine.java
+++ b/src/main/java/net/minecraft/core/block/PineLeavesBlock.java
@@ -1,27 +1,27 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess, 
-//            WorldChunkManager, World, Block, EntityPlayer, 
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
 //            ItemStack, Item, ItemShears, StatList, 
 //            Entity
 
-public class BlockLeavesPine extends BlockLeavesBase
+public class PineLeavesBlock extends BaseLeavesBlock
 {
 
-	public BlockLeavesPine(String key, int id)
+	public PineLeavesBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.leaves);
+        super(key, namespaceId, id, Material.leaves);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause == EnumDropCause.PICK_BLOCK || dropCause == EnumDropCause.SILK_TOUCH) return new ItemStack[] { new ItemStack(this) };
 
@@ -35,6 +35,6 @@ public class BlockLeavesPine extends BlockLeavesBase
     @Override
     protected Block getSapling()
     {
-        return Block.saplingPine;
+        return Blocks.SAPLING_PINE;
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockPortal.java b/src/main/java/net/minecraft/core/block/PortalBlock.java
similarity index 94%
rename from src/main/java/net/minecraft/core/block/BlockPortal.java
rename to src/main/java/net/minecraft/core/block/PortalBlock.java
index 96b9086b9..85de42374 100644
--- a/src/main/java/net/minecraft/core/block/BlockPortal.java
+++ b/src/main/java/net/minecraft/core/block/PortalBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.enums.EnumDropCause;
@@ -14,17 +14,17 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockBreakable, Material, IBlockAccess, World, 
-//            Block, BlockFire, Entity, AxisAlignedBB
+//            Block, FireBlock, Entity, AxisAlignedBB
 
-public class BlockPortal extends BlockTransparent
+public class PortalBlock extends TransparentBlock
 {
 	public int targetDimension;
 	public int portalFrameId;
 	public int portalTriggerId;
 		
-    public BlockPortal(String key, int id, int targetDimension, int portalMaterialId, int portalTriggerId)
+    public PortalBlock(String key, String namespaceId, int id, int targetDimension, int portalMaterialId, int portalTriggerId)
     {
-        super(key, id, Material.portal);
+        super(key, namespaceId, id, Material.portal);
         this.targetDimension = targetDimension;
         this.portalFrameId = portalMaterialId;
         this.portalTriggerId = portalTriggerId;
@@ -61,7 +61,7 @@ public class BlockPortal extends BlockTransparent
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -296,13 +296,13 @@ public class BlockPortal extends BlockTransparent
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return null;
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
         return 1;
     }
@@ -317,7 +317,7 @@ public class BlockPortal extends BlockTransparent
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         int meta = world.getBlockMetadata(x, y, z);
         if((meta & 0x2) > 0 && rand.nextInt(20) == 0)
diff --git a/src/main/java/net/minecraft/core/block/BlockPressurePlate.java b/src/main/java/net/minecraft/core/block/PressurePlateBlock.java
similarity index 84%
rename from src/main/java/net/minecraft/core/block/BlockPressurePlate.java
rename to src/main/java/net/minecraft/core/block/PressurePlateBlock.java
index f3f4e851a..69f08f4e4 100644
--- a/src/main/java/net/minecraft/core/block/BlockPressurePlate.java
+++ b/src/main/java/net/minecraft/core/block/PressurePlateBlock.java
@@ -2,7 +2,7 @@ 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.Mob;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.sound.SoundCategory;
@@ -13,13 +13,13 @@ import net.minecraft.core.util.phys.AABB;
 import java.util.List;
 import java.util.Random;
 
-public class BlockPressurePlate extends Block
+public class PressurePlateBlock extends Block
 {
     private final Class<? extends Entity> triggerMobClass;
 
-	public BlockPressurePlate(String key, int id, Class<? extends Entity> mobType, Material material)
+	public PressurePlateBlock(String key, String namespaceId, int id, Class<? extends Entity> mobType, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         triggerMobClass = mobType;
         setTicking(true);
         float pixel = 1 / 16f;
@@ -27,7 +27,7 @@ public class BlockPressurePlate extends Block
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 20;
     }
@@ -45,7 +45,7 @@ public class BlockPressurePlate extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -98,7 +98,7 @@ public class BlockPressurePlate extends Block
         boolean isCeiling = (meta & 0b10) != 0;
         boolean isSteppedOn = false;
         float f = 0.125F;
-        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));;
+        List<Entity> list = world.getEntitiesWithinAABB(triggerMobClass, AABB.getTemporaryBB((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;
@@ -121,7 +121,7 @@ public class BlockPressurePlate extends Block
         }
         if(isSteppedOn)
         {
-            world.scheduleBlockUpdate(x, y, z, id, tickRate());
+            world.scheduleBlockUpdate(x, y, z, id, tickDelay());
         }
     }
 
@@ -162,22 +162,20 @@ public class BlockPressurePlate extends Block
     }
 
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
 
         return isPressed(blockAccess.getBlockMetadata(x, y, z));
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
         int meta = world.getBlockMetadata(x, y, z);
         boolean isCeiling = (meta & 0b10) != 0;
-        if(isPressed(world.getBlockMetadata(x, y, z)))
-        {
-            return side == (isCeiling ? 0 : 1);
-        } else
-        {
+        if(isPressed(world.getBlockMetadata(x, y, z))) {
+            return side == (isCeiling ? Side.BOTTOM : Side.TOP);
+        } else {
             return false;
         }
     }
@@ -186,7 +184,7 @@ public class BlockPressurePlate extends Block
     }
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return true;
     }
@@ -197,7 +195,7 @@ 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) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, 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/PumpkinBlock.java b/src/main/java/net/minecraft/core/block/PumpkinBlock.java
new file mode 100644
index 000000000..c0ed759dd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/PumpkinBlock.java
@@ -0,0 +1,44 @@
+package net.minecraft.core.block;
+
+// Referenced classes of package net.minecraft.src:
+//            Block, Material, World, Mob,
+//            MathHelper
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.tool.SwordToolItem;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class PumpkinBlock extends RotatableBlock
+{
+    private final boolean isCarvable;
+
+	public PumpkinBlock(String key, String namespaceId, int id, boolean isCarvable)
+    {
+        super(key, namespaceId, id, Material.vegetable);
+        setTicking(true);
+        this.isCarvable = isCarvable;
+        withOverrideColor(MaterialColor.paintedOrange);
+    }
+
+    @Override
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
+        if (!isCarvable) return false;
+        ItemStack heldItem = player.getHeldItem();
+        if (heldItem != null && heldItem.getItem() instanceof SwordToolItem){
+            heldItem.damageItem(1,player);
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.PUMPKIN_CARVED_IDLE.id, player.getHorizontalPlacementDirection(Direction.getHorizontalDirection(player).getSide()).getOpposite().getId());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void onBlockPlacedByWorld(World world, int x, int y, int z)
+    {
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java b/src/main/java/net/minecraft/core/block/PumpkinPieBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockPumpkinPie.java
rename to src/main/java/net/minecraft/core/block/PumpkinPieBlock.java
index 95e5075e7..a79470794 100644
--- a/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java
+++ b/src/main/java/net/minecraft/core/block/PumpkinPieBlock.java
@@ -1,15 +1,15 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockPumpkinPie extends BlockEdible
+public class PumpkinPieBlock extends EdibleBlock
 {
 
-    public BlockPumpkinPie(String key, int id)
+    public PumpkinPieBlock(String key, String namespaceId, int id)
     {
-        super(key, id, 4, 5, () -> Item.foodPumpkinPie);
+        super(key, namespaceId, id, 4, 5, () -> Items.FOOD_PUMPKIN_PIE);
     }
 
     @Override
@@ -31,7 +31,7 @@ public class BlockPumpkinPie extends BlockEdible
         float xMin = l >= 2 ? 0.5f : f;
         float zMin = l >= 3 ? 0.5f : f;
         float f2 = 0.4375F;
-        return AABB.getBoundingBoxFromPool((float) x + xMin, y, (float) z + zMin, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + xMin, y, (float) z + zMin, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
     }
 
     @Override
@@ -42,7 +42,7 @@ public class BlockPumpkinPie extends BlockEdible
         float xMin = l >= 2 ? 0.5f : f;
         float zMin = l >= 3 ? 0.5f : f;
         float f2 = 0.4375F;
-        return AABB.getBoundingBoxFromPool((float) x + xMin, y, (float) z + zMin, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
+        return AABB.getTemporaryBB((float) x + xMin, y, (float) z + zMin, (float)(x + 1) - f, ((float) y + f2) - f, (float)(z + 1) - f);
     }
 
 }
diff --git a/src/main/java/net/minecraft/core/block/RailBlock.java b/src/main/java/net/minecraft/core/block/RailBlock.java
new file mode 100644
index 000000000..8a5495621
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/RailBlock.java
@@ -0,0 +1,509 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.logic.RailDirection;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.chunk.ChunkPosition;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RailBlock extends Block {
+    public final boolean isPowered;
+
+    public static boolean isRailBlockAt(World world, int x, int y, int z) {
+        return world.getBlock(x, y, z) instanceof RailBlock;
+    }
+    public RailDirection getRailDirection(WorldSource world, int x, int y, int z){
+        int meta = world.getBlockMetadata(x, y, z);
+        if (isPowered){
+            meta &= 0b111;
+        }
+        return RailDirection.getFromMeta(meta);
+    }
+
+    protected RailBlock(String key, String namespaceId, int id, boolean isPowered) {
+        super(key, namespaceId, id, Material.decoration);
+        this.isPowered = isPowered;
+        setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
+    }
+
+    public boolean getIsPowered() {
+        return isPowered;
+    }
+
+    @Override
+	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
+    {
+        return null;
+    }
+
+    @Override
+	public boolean isSolidRender()
+    {
+        return false;
+    }
+
+    @Override
+    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end) {
+        setBlockBoundsBasedOnState(world, x, y, z);
+        return super.collisionRayTrace(world, x, y, z, start, end);
+    }
+
+    @Override
+    public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z) {
+        RailDirection direction = getRailDirection(world, x, y, z);
+        if(direction.isSloped()) {
+            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.725F, 1.0F);
+        } else {
+            setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
+        }
+    }
+
+    @Override
+	public boolean isCubeShaped()
+    {
+        return false;
+    }
+
+    @Override
+	public boolean canPlaceBlockAt(World world, int x, int y, int z) {
+        return world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
+    }
+
+    @Override
+	public void onBlockPlacedByWorld(World world, int x, int y, int z) {
+        performRailTurn(world, x, y, z, true);
+        if(this == Blocks.RAIL_POWERED) {
+        	onNeighborBlockChange(world, x, y, z, id);
+        }
+    }
+    @Override
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
+        if(world.isClientSide) {
+            return;
+        }
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean isPoweredFlagSet = (meta & 0b1000) != 0;
+        RailDirection railDirection = getRailDirection(world, x, y, z);
+
+        if(!isValidState(world, x, y, z)) {
+            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
+            world.setBlockWithNotify(x, y, z, 0);
+            return;
+        }
+
+        Block block = Block.getBlock(blockId);
+
+        if(isPowered) {
+            boolean gettingPower =
+                    world.isBlockIndirectlyGettingPowered(x, y, z) ||
+                    world.isBlockIndirectlyGettingPowered(x, y + 1, z) ||
+                    isConnectedPoweredRail1(world, x, y, z, true, 0) ||
+                    isConnectedPoweredRail1(world, x, y, z, false, 0);
+
+            boolean changedMeta = false;
+            if(gettingPower && !isPoweredFlagSet) {
+                // Set powered bit
+                world.setBlockMetadataWithNotify(x, y, z, railDirection.meta | 0b1000);
+                changedMeta = true;
+            } else if(!gettingPower && isPoweredFlagSet) {
+                // Remove powered bit
+                world.setBlockMetadataWithNotify(x, y, z, railDirection.meta);
+                changedMeta = true;
+            }
+
+            if(changedMeta) {
+                world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+                if(railDirection.isSloped()) {
+                    world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
+                }
+            }
+        } else if(block != null && block.isSignalSource() && Rail.getNAdjacentTracks(new Rail(world, x, y, z)) == 3) {
+            performRailTurn(world, x, y, z, false);
+        }
+    }
+    // Checks that the rail is placed on top of a block and doesn't slope into the air
+
+    private boolean isValidState(World world, int x, int y, int z){
+        if (!world.canPlaceOnSurfaceOfBlock(x, y - 1, z)) return false;
+
+        RailDirection railDirection = getRailDirection(world, x, y, z);
+        if(railDirection == RailDirection.SLOPE_E && !world.canPlaceOnSurfaceOfBlock(x + 1, y, z)) {
+            return false;
+        }
+        if(railDirection == RailDirection.SLOPE_W && !world.canPlaceOnSurfaceOfBlock(x - 1, y, z)) {
+            return false;
+        }
+        if(railDirection == RailDirection.SLOPE_N && !world.canPlaceOnSurfaceOfBlock(x, y, z - 1)) {
+            return false;
+        }
+        return railDirection != RailDirection.SLOPE_S || world.canPlaceOnSurfaceOfBlock(x, y, z + 1);
+    }
+    // Turn logic what a regular rail is powered in an intersection
+
+    private void performRailTurn(World world, int x, int y, int z, boolean forceUpdate) {
+        if (!world.isClientSide) {
+            new Rail(world, x, y, z).railTurn(world.isBlockIndirectlyGettingPowered(x, y, z), forceUpdate);
+        }
+    }
+
+    private boolean isConnectedPoweredRail1(World world, int x, int y, int z, boolean forward, int distance) {
+        // Only check for powered rails for an 8 block span
+        if(distance >= 8) {
+            return false;
+        }
+        RailDirection railDirection = getRailDirection(world, x, y, z);
+        Axis axis = Axis.NONE;
+
+        int nextX = x;
+        int nextY = y;
+        int nextZ = z;
+
+        if (forward){
+            nextX += railDirection.getNextRailX();
+            nextY += railDirection.getNextRailY();
+            nextZ += railDirection.getNextRailZ();
+        } else {
+            nextX += railDirection.getPrevRailX();
+            nextY += railDirection.getPrevRailY();
+            nextZ += railDirection.getPrevRailZ();
+        }
+
+        switch(railDirection) {
+            case STRAIGHT_NS:
+            case SLOPE_N:
+            case SLOPE_S:
+                axis = Axis.Z;
+                break;
+
+            case STRAIGHT_EW:
+            case SLOPE_E:
+            case SLOPE_W:
+                axis = Axis.X;
+                break;
+        }
+
+        if(isConnectedPoweredRail2(world, nextX, nextY, nextZ, forward, distance, axis)) { return true; }
+        return railDirection.isStraight() && isConnectedPoweredRail2(world, nextX, nextY - 1, nextZ, forward, distance, axis);
+    }
+
+    private boolean isConnectedPoweredRail2(World world, int x, int y, int z, boolean forward, int distance, Axis axis) {
+        int blockId = world.getBlockId(x, y, z);
+        if(blockId == Blocks.RAIL_POWERED.id) {
+            int meta = world.getBlockMetadata(x, y, z);
+            boolean isPoweredFlagSet = (meta & 0b1000) != 0;
+            RailDirection direction = getRailDirection(world, x, y, z);
+
+            // Return false for perpendicular powered rails
+            if(axis == Axis.X && (
+                    direction == RailDirection.STRAIGHT_NS ||
+                    direction == RailDirection.SLOPE_N ||
+                    direction == RailDirection.SLOPE_S)) {
+                return false;
+            }
+            if(axis == Axis.Z && (
+                    direction == RailDirection.STRAIGHT_EW ||
+                    direction == RailDirection.SLOPE_E ||
+                    direction == RailDirection.SLOPE_W)) {
+                return false;
+            }
+
+            if(isPoweredFlagSet) {
+                // If rail powered return true
+                if(world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z)) {
+                    return true;
+                } else { // else check 1 block further down if powered
+                    return isConnectedPoweredRail1(world, x, y, z, forward, distance + 1);
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int getPistonPushReaction()
+    {
+        return 0;
+    }
+    public static class Rail {
+        private final World world;
+        private final int x;
+        private final int y;
+        private final int z;
+        private final boolean isPoweredRail;
+        private final List<ChunkPosition> connectedTracks;
+        public Rail(World world, int x, int y, int z) {
+            connectedTracks = new ArrayList<>();
+            this.world = world;
+            this.x = x;
+            this.y = y;
+            this.z = z;
+            Block block = world.getBlock(x, y, z);
+            int meta = world.getBlockMetadata(x, y, z);
+
+            isPoweredRail = block instanceof RailBlock && ((RailBlock) block).isPowered;
+
+            setConnections(RailDirection.getFromMeta(meta));
+        }
+
+        private void setConnections(RailDirection direction) {
+            connectedTracks.clear();
+            connectedTracks.add(new ChunkPosition(x + direction.getNextRailX(), y + direction.getNextRailY(), z + direction.getNextRailZ()));
+            connectedTracks.add(new ChunkPosition(x + direction.getPrevRailX(), y + direction.getPrevRailY(), z + direction.getPrevRailZ()));
+        }
+
+        private void checkAndRemoveMissingRails() {
+            for(int i = 0; i < connectedTracks.size(); i++) {
+                Rail rail = getMinecartTrackLogic(connectedTracks.get(i));
+                if(rail == null || !rail.isConnectedTo(this)) {
+                    connectedTracks.remove(i--);
+                } else {
+                    connectedTracks.set(i, new ChunkPosition(rail.x, rail.y, rail.z));
+                }
+            }
+
+        }
+
+        private boolean isMinecartTrack(int x, int y, int z) {
+            if(RailBlock.isRailBlockAt(world, x, y, z)) {
+                return true;
+            }
+            if(RailBlock.isRailBlockAt(world, x, y + 1, z)) {
+                return true;
+            }
+            return RailBlock.isRailBlockAt(world, x, y - 1, z);
+        }
+
+        private Rail getMinecartTrackLogic(ChunkPosition chunkposition) {
+            if(RailBlock.isRailBlockAt(world, chunkposition.x, chunkposition.y, chunkposition.z)) {
+                return new Rail(world, chunkposition.x, chunkposition.y, chunkposition.z);
+            }
+            if(RailBlock.isRailBlockAt(world, chunkposition.x, chunkposition.y + 1, chunkposition.z)) {
+                return new Rail(world, chunkposition.x, chunkposition.y + 1, chunkposition.z);
+            }
+            if(RailBlock.isRailBlockAt(world, chunkposition.x, chunkposition.y - 1, chunkposition.z)) {
+                return new Rail(world, chunkposition.x, chunkposition.y - 1, chunkposition.z);
+            } else {
+                return null;
+            }
+        }
+
+        private boolean isConnectedTo(Rail rail) {
+            for (ChunkPosition chunkposition : connectedTracks) {
+                if (chunkposition.x == rail.x && chunkposition.z == rail.z) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private boolean isInTrack(int x, int y, int z) {
+            for (ChunkPosition chunkposition : connectedTracks) {
+                if (chunkposition.x == x && chunkposition.z == z) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private int getAdjacentTracks() {
+            int count = 0;
+            if(isMinecartTrack(x, y, z - 1)) { // North
+                count++;
+            }
+            if(isMinecartTrack(x, y, z + 1)) { // South
+                count++;
+            }
+            if(isMinecartTrack(x - 1, y, z)) { // West
+                count++;
+            }
+            if(isMinecartTrack(x + 1, y, z)) { // East
+                count++;
+            }
+            return count;
+        }
+
+        private boolean handleKeyPress(Rail rail) {
+            if(isConnectedTo(rail)) {
+                return true;
+            }
+            return connectedTracks.size() != 2;
+        }
+        private boolean canTrackTurnTo(int x, int y, int z) {
+            Rail rail = getMinecartTrackLogic(new ChunkPosition(x, y, z));
+            if (rail == null) return false;
+
+            rail.checkAndRemoveMissingRails();
+            return rail.handleKeyPress(this);
+        }
+
+        public void railTurn(boolean isPowered, boolean forceUpdate) {
+            boolean flagNorth = canTrackTurnTo(x, y, z - 1);
+            boolean flagSouth = canTrackTurnTo(x, y, z + 1);
+            boolean flagWest = canTrackTurnTo(x - 1, y, z);
+            boolean flagEast = canTrackTurnTo(x + 1, y, z);
+
+            RailDirection railType = RailDirection.NONE;
+            if((flagNorth || flagSouth) && !flagWest && !flagEast) {
+                railType = RailDirection.STRAIGHT_NS;
+            }
+            if((flagWest || flagEast) && !flagNorth && !flagSouth) {
+                railType = RailDirection.STRAIGHT_EW;
+            }
+            if(!isPoweredRail) {
+                if(flagSouth && flagEast && !flagNorth && !flagWest) {
+                    railType = RailDirection.TURN_ES;
+                }
+                if(flagSouth && flagWest && !flagNorth && !flagEast) {
+                    railType = RailDirection.TURN_WS;
+                }
+                if(flagNorth && flagWest && !flagSouth && !flagEast) {
+                    railType = RailDirection.TURN_WN;
+                }
+                if(flagNorth && flagEast && !flagSouth && !flagWest) {
+                    railType = RailDirection.TURN_EN;
+                }
+            }
+            if(railType == RailDirection.NONE) {
+                if(flagNorth || flagSouth) {
+                    railType = RailDirection.STRAIGHT_NS;
+                }
+                if(flagWest || flagEast) {
+                    railType = RailDirection.STRAIGHT_EW;
+                }
+                if(!isPoweredRail) {
+                    if(isPowered) {
+                        if(flagSouth && flagEast) {
+                            railType = RailDirection.TURN_ES;
+                        }
+                        if(flagWest && flagSouth) {
+                            railType = RailDirection.TURN_WS;
+                        }
+                        if(flagEast && flagNorth) {
+                            railType = RailDirection.TURN_EN;
+                        }
+                        if(flagNorth && flagWest) {
+                            railType = RailDirection.TURN_WN;
+                        }
+                    } else {
+                        if(flagNorth && flagWest) {
+                            railType = RailDirection.TURN_WN;
+                        }
+                        if(flagEast && flagNorth) {
+                            railType = RailDirection.TURN_EN;
+                        }
+                        if(flagWest && flagSouth) {
+                            railType = RailDirection.TURN_WS;
+                        }
+                        if(flagSouth && flagEast) {
+                            railType = RailDirection.TURN_ES;
+                        }
+                    }
+                }
+            }
+            if(railType == RailDirection.STRAIGHT_NS) {
+                if(RailBlock.isRailBlockAt(world, x, y + 1, z - 1)) {
+                    railType = RailDirection.SLOPE_N;
+                }
+                if(RailBlock.isRailBlockAt(world, x, y + 1, z + 1)) {
+                    railType = RailDirection.SLOPE_S;
+                }
+            }
+            if(railType == RailDirection.STRAIGHT_EW) {
+                if(RailBlock.isRailBlockAt(world, x + 1, y + 1, z)) {
+                    railType = RailDirection.SLOPE_E;
+                }
+                if(RailBlock.isRailBlockAt(world, x - 1, y + 1, z)) {
+                    railType = RailDirection.SLOPE_W;
+                }
+            }
+            if (railType == RailDirection.NONE) {
+                railType = RailDirection.STRAIGHT_EW;
+            }
+            setConnections(railType);
+
+            int newMeta = railType.meta;
+            if(isPoweredRail) {
+                newMeta |= world.getBlockMetadata(x, y, z) & 0b1000;
+            }
+
+            if(forceUpdate || world.getBlockMetadata(x, y, z) != newMeta) {
+                world.setBlockMetadataWithNotify(x, y, z, newMeta);
+                // Update the rail states of the connected tracks
+                for (ChunkPosition connectedTrack : connectedTracks) {
+                    Rail rail = getMinecartTrackLogic(connectedTrack);
+                    if (rail == null) {
+                        continue;
+                    }
+                    rail.checkAndRemoveMissingRails();
+                    if (rail.handleKeyPress(this)) {
+                        rail.updateRailState(this);
+                    }
+                }
+            }
+        }
+        private void updateRailState(Rail otherLogic) {
+            connectedTracks.add(new ChunkPosition(otherLogic.x, otherLogic.y, otherLogic.z));
+            boolean flagNorth = isInTrack(x, y, z - 1);
+            boolean flagSouth = isInTrack(x, y, z + 1);
+            boolean flagWest = isInTrack(x - 1, y, z);
+            boolean flagEast = isInTrack(x + 1, y, z);
+            RailDirection railDirection = RailDirection.NONE;
+            if(flagNorth || flagSouth) {
+                railDirection = RailDirection.STRAIGHT_NS;
+            }
+            if(flagWest || flagEast) {
+                railDirection = RailDirection.STRAIGHT_EW;
+            }
+            if(!isPoweredRail) {
+                if(flagSouth && flagEast && !flagNorth && !flagWest) {
+                    railDirection = RailDirection.TURN_ES;
+                }
+                if(flagSouth && flagWest && !flagNorth && !flagEast) {
+                    railDirection = RailDirection.TURN_WS;
+                }
+                if(flagNorth && flagWest && !flagSouth && !flagEast) {
+                    railDirection = RailDirection.TURN_WN;
+                }
+                if(flagNorth && flagEast && !flagSouth && !flagWest) {
+                    railDirection = RailDirection.TURN_EN;
+                }
+            }
+            if(railDirection == RailDirection.STRAIGHT_NS) {
+                if(RailBlock.isRailBlockAt(world, x, y + 1, z - 1)) {
+                    railDirection = RailDirection.SLOPE_N;
+                }
+                if(RailBlock.isRailBlockAt(world, x, y + 1, z + 1)) {
+                    railDirection = RailDirection.SLOPE_S;
+                }
+            }
+            if(railDirection == RailDirection.STRAIGHT_EW) {
+                if(RailBlock.isRailBlockAt(world, x + 1, y + 1, z)) {
+                    railDirection = RailDirection.SLOPE_E;
+                }
+                if(RailBlock.isRailBlockAt(world, x - 1, y + 1, z)) {
+                    railDirection = RailDirection.SLOPE_W;
+                }
+            }
+            if(railDirection == RailDirection.NONE) {
+                railDirection = RailDirection.STRAIGHT_NS;
+            }
+            int newMeta = railDirection.meta;
+            if(isPoweredRail) {
+                newMeta |= world.getBlockMetadata(x, y, z) & 0b1000;
+            }
+            world.setBlockMetadataWithNotify(x, y, z, newMeta);
+        }
+
+        public static int getNAdjacentTracks(Rail rail) {
+            return rail.getAdjacentTracks();
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/RedstoneBlock.java b/src/main/java/net/minecraft/core/block/RedstoneBlock.java
new file mode 100644
index 000000000..89a15b9f1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/RedstoneBlock.java
@@ -0,0 +1,115 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.util.helper.Color;
+import net.minecraft.client.util.helper.Colors;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.WorldSource;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class RedstoneBlock extends Block
+{
+	public RedstoneBlock(String key, String namespaceId, int id, Material material)
+    {
+		super(key, namespaceId, id, material);
+	}
+
+	@Override
+    public boolean isSignalSource()
+    {
+        return true;
+    }
+	
+    @Override
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
+    {
+    	return true;
+    }
+    
+    @Override
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
+    {
+        return getSignal(world, x, y, z, side);
+    }
+    
+    @Override
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
+    {
+        for (Side s : Side.sides){
+            world.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), id);
+        }
+    }
+
+    @Override
+    public void onBlockRemoved(World world, int x, int y, int z, int data)
+    {
+        for (Side s : Side.sides){
+            world.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), id);
+        }
+    }
+
+    
+    @Override
+	public void animationTick(World world, int x, int y, int z, Random rand)
+    {
+        spawnParticles(world, x, y, z);
+    }
+    
+	private void spawnParticles(World world, int x, int y, int z) {
+		Random random = world.rand;
+
+        final int redstoneBrightness = 10;
+		Color color = Colors.allRedstoneColors[redstoneBrightness];
+		if(color == null) {
+			return;
+		}
+		float red = color.getRed() / 255.0f;
+		float green = color.getGreen() / 255.0f;
+		float blue = color.getBlue() / 255.0f;
+		
+		final double d = 0.0625;
+        for (Side s : Side.sides){
+            double px = (double) x + random.nextFloat();
+            double py = (double) y + random.nextFloat();
+            double pz = (double) z + random.nextFloat();
+            switch (s){
+                case BOTTOM:
+                    if (!world.isBlockOpaqueCube(x, y + 1, z)) {
+                        py = (y + 1) + d;
+                    }
+                    break;
+                case TOP:
+                    if (!world.isBlockOpaqueCube(x, y - 1, z)) {
+                        py = (y + 0) - d;
+                    }
+                    break;
+                case NORTH:
+                    if (!world.isBlockOpaqueCube(x, y, z + 1)) {
+                        pz = (z + 1) + d;
+                    }
+                    break;
+                case SOUTH:
+                    if (!world.isBlockOpaqueCube(x, y, z - 1)) {
+                        pz = (z + 0) - d;
+                    }
+                    break;
+                case WEST:
+                    if (!world.isBlockOpaqueCube(x + 1, y, z)) {
+                        px = (x + 1) + d;
+                    }
+                    break;
+                case EAST:
+                    if (!world.isBlockOpaqueCube(x - 1, y, z)) {
+                        px = (x + 0) - d;
+                    }
+                    break;
+            }
+            if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
+                world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
+            }
+        }
+	}
+
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java b/src/main/java/net/minecraft/core/block/RedstoneOreBlock.java
similarity index 62%
rename from src/main/java/net/minecraft/core/block/BlockOreRedstone.java
rename to src/main/java/net/minecraft/core/block/RedstoneOreBlock.java
index 3feaebfaa..3f6ad8d70 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
+++ b/src/main/java/net/minecraft/core/block/RedstoneOreBlock.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Side;
@@ -12,35 +12,44 @@ import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Random;
+import java.util.function.Supplier;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, Item, 
-//            EntityPlayer, Entity
+//            Player, Entity
 
-public class BlockOreRedstone extends Block
+public class RedstoneOreBlock extends Block
 {
-
-    public BlockOreRedstone(String key, int id, boolean illuminated, String normalKey, String illuminatedKey)
+    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    private final boolean illuminated;
+    private final Supplier<Block> normalBlock;
+    private final Supplier<Block> illuminatedBlock;
+    public RedstoneOreBlock(String key, String namespaceId, int id, int parentId, Material material, boolean illuminated, Supplier<Block> normalBlock, Supplier<Block> illuminatedBlock)
     {
-        super(key, id, Material.stone);
+        super(key, namespaceId, id, material);
         if(illuminated)
         {
             setTicking(true);
         }
         this.illuminated = illuminated;
-        this.keyNormal = normalKey;
-        this.keyIlluminated = illuminatedKey;
+        this.normalBlock = normalBlock;
+        this.illuminatedBlock = illuminatedBlock;
+        if (parentId > 0){
+            variantMap.put(parentId, id);
+        }
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 30;
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         lightRedstone(world, x, y, z);
         super.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
@@ -59,7 +68,7 @@ public class BlockOreRedstone extends Block
         spawnParticles(world, i, j, k);
         if (!illuminated)
         {
-        	world.setBlockWithNotify(i, j, k, Block.getBlockByName(keyIlluminated).id);
+        	world.setBlockWithNotify(i, j, k, illuminatedBlock.get().id);
         }
     }
 
@@ -68,28 +77,28 @@ public class BlockOreRedstone extends Block
     {
         if(illuminated)
         {
-            world.setBlockWithNotify(x, y, z, Block.getBlockByName(keyNormal).id);
+            world.setBlockWithNotify(x, y, z, normalBlock.get().id);
         }
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
             case SILK_TOUCH:
             case PICK_BLOCK:
-                return new ItemStack[] { new ItemStack(Block.getBlockByName(this.keyNormal)) };
+                return new ItemStack[] { new ItemStack(normalBlock.get()) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.dustRedstone, 4 + world.rand.nextInt(2)) };
+                return new ItemStack[] { new ItemStack(Items.DUST_REDSTONE, 4 + world.rand.nextInt(2)) };
             default:
                 return null;
         }
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(illuminated)
         {
@@ -118,19 +127,15 @@ public class BlockOreRedstone extends Block
 			double pz = (double) z + random.nextFloat();
 			
 			if (i == 0 && !world.isBlockOpaqueCube(x, y + 1, z)) py = (y + 1) + d;
-			if (i == 1 && !world.isBlockOpaqueCube(x, y - 1, z)) py = (y + 0) - d;
+			if (i == 1 && !world.isBlockOpaqueCube(x, y - 1, z)) py = (y) - d;
 			if (i == 2 && !world.isBlockOpaqueCube(x, y, z + 1)) pz = (z + 1) + d;
-			if (i == 3 && !world.isBlockOpaqueCube(x, y, z - 1)) pz = (z + 0) - d;
+			if (i == 3 && !world.isBlockOpaqueCube(x, y, z - 1)) pz = (z) - d;
 			if (i == 4 && !world.isBlockOpaqueCube(x + 1, y, z)) px = (x + 1) + d;
-			if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x + 0) - d;
+			if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x) - d;
 			
 			if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
 				world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
 			}
 		}
     }
-
-    private boolean illuminated;
-    private String keyNormal;
-    private String keyIlluminated;
 }
diff --git a/src/main/java/net/minecraft/core/block/RedstonePumpkinBlock.java b/src/main/java/net/minecraft/core/block/RedstonePumpkinBlock.java
new file mode 100644
index 000000000..6d64c8580
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/RedstonePumpkinBlock.java
@@ -0,0 +1,43 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.WorldSource;
+
+public class RedstonePumpkinBlock extends RotatableBlock {
+
+    public RedstonePumpkinBlock(String translationKey, String namespaceId, int id) {
+        super(translationKey, namespaceId, id, Material.vegetable);
+    }
+
+    @Override
+    public void onBlockPlacedByWorld(World world, int x, int y, int z)
+    {
+        for (Side s : Side.sides){
+            world.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), id);
+        }
+    }
+
+    @Override
+    public void onBlockRemoved(World world, int x, int y, int z, int data)
+    {
+        for (Side s : Side.sides){
+            world.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), id);
+        }
+    }
+
+    @Override
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side) {
+        return getSignal(world, x, y, z, side);
+    }
+
+    @Override
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side) {
+        if (!side.isHorizontal()) {
+            return false;
+        }
+        Side mySide = Side.getSideById(blockAccess.getBlockMetadata(x, y, z));
+        return mySide == side.getOpposite();
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstoneTorch.java b/src/main/java/net/minecraft/core/block/RedstoneTorchBlock.java
similarity index 67%
rename from src/main/java/net/minecraft/core/block/BlockRedstoneTorch.java
rename to src/main/java/net/minecraft/core/block/RedstoneTorchBlock.java
index 08eeceed7..bcaf06c8d 100644
--- a/src/main/java/net/minecraft/core/block/BlockRedstoneTorch.java
+++ b/src/main/java/net/minecraft/core/block/RedstoneTorchBlock.java
@@ -1,12 +1,13 @@
 package net.minecraft.core.block;
 
 import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.logic.RedstoneUpdateInfo;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
@@ -15,20 +16,19 @@ import java.util.List;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockTorch, Block, RedstoneUpdateInfo, World, 
+//            TorchBlock, Block, RedstoneUpdateInfo, World,
 //            IBlockAccess
 
-public class BlockRedstoneTorch extends BlockTorch
+public class RedstoneTorchBlock extends TorchBlock
 {
-    private boolean checkForBurnout(World world, int i, int j, int k, boolean flag)
+    private boolean checkForBurnout(World world, int x, int y, int z, boolean addUpdateInfo)
     {
-        if(flag)
-        {
-            torchUpdates.add(new RedstoneUpdateInfo(i, j, k, world.getWorldTime()));
+        if(addUpdateInfo) {
+            torchUpdates.add(new RedstoneUpdateInfo(x, y, z, world.getWorldTime()));
         }
         int l = 0;
         for (RedstoneUpdateInfo redstoneupdateinfo : torchUpdates) {
-            if (redstoneupdateinfo.getXCoord() == i && redstoneupdateinfo.getYCoord() == j && redstoneupdateinfo.getZCoord() == k && ++l >= 8) {
+            if (redstoneupdateinfo.getXCoord() == x && redstoneupdateinfo.getYCoord() == y && redstoneupdateinfo.getZCoord() == z && ++l >= 8) {
                 return true;
             }
         }
@@ -36,28 +36,25 @@ public class BlockRedstoneTorch extends BlockTorch
         return false;
     }
 
-    protected BlockRedstoneTorch(String key, int id, boolean flag)
-    {
-        super(key, id);
+    protected RedstoneTorchBlock(String key, String namespaceId, int id, boolean flag) {
+        super(key, namespaceId, id);
         torchActive = flag;
         setTicking(true);
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
         return 2;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        if(world.getBlockMetadata(x, y, z) == 0)
-        {
-            super.onBlockAdded(world, x, y, z);
+        if(world.getBlockMetadata(x, y, z) == 0) {
+            super.onBlockPlacedByWorld(world, x, y, z);
         }
-        if(torchActive)
-        {
+        if(torchActive) {
             world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
             world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
             world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
@@ -68,10 +65,8 @@ public class BlockRedstoneTorch extends BlockTorch
     }
 
     @Override
-    public void onBlockRemoved(World world, int x, int y, int z, int data)
-    {
-        if(torchActive)
-        {
+    public void onBlockRemoved(World world, int x, int y, int z, int data) {
+        if(torchActive) {
             world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
             world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
             world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
@@ -82,52 +77,41 @@ public class BlockRedstoneTorch extends BlockTorch
     }
 
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-        if(!torchActive)
-        {
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side) {
+        if(!torchActive) {
             return false;
         }
-        int i1 = blockAccess.getBlockMetadata(x, y, z);
-        if(i1 == 5 && side == 1)
-        {
+        int meta = blockAccess.getBlockMetadata(x, y, z);
+        if(meta == 5 && side == Side.TOP) {
             return false;
         }
-        if(i1 == 3 && side == 3)
-        {
+        if(meta == 3 && side == Side.SOUTH) {
             return false;
         }
-        if(i1 == 4 && side == 2)
-        {
+        if(meta == 4 && side == Side.NORTH) {
             return false;
         }
-        if(i1 == 1 && side == 5)
-        {
+        if(meta == 1 && side == Side.EAST) {
             return false;
         }
-        return i1 != 2 || side != 4;
+        return meta != 2 || side != Side.WEST;
     }
 
-    private boolean isPoweredByBlock(World world, int i, int j, int k)
-    {
-        int l = world.getBlockMetadata(i, j, k);
-        if(l == 5 && world.isBlockIndirectlyProvidingPowerTo(i, j - 1, k, 0))
-        {
+    private boolean isPoweredByBlock(World world, int x, int y, int z) {
+        int meta = world.getBlockMetadata(x, y, z);
+        if(meta == 5 && world.isBlockIndirectlyProvidingPowerTo(x, y - 1, z, Side.BOTTOM)) {
             return true;
         }
-        if(l == 3 && world.isBlockIndirectlyProvidingPowerTo(i, j, k - 1, 2))
-        {
+        if(meta == 3 && world.isBlockIndirectlyProvidingPowerTo(x, y, z - 1, Side.NORTH)) {
             return true;
         }
-        if(l == 4 && world.isBlockIndirectlyProvidingPowerTo(i, j, k + 1, 3))
-        {
+        if(meta == 4 && world.isBlockIndirectlyProvidingPowerTo(x, y, z + 1, Side.SOUTH)) {
             return true;
         }
-        if(l == 1 && world.isBlockIndirectlyProvidingPowerTo(i - 1, j, k, 4))
-        {
+        if(meta == 1 && world.isBlockIndirectlyProvidingPowerTo(x - 1, y, z, Side.WEST)) {
             return true;
         }
-        return l == 2 && world.isBlockIndirectlyProvidingPowerTo(i + 1, j, k, 5);
+        return meta == 2 && world.isBlockIndirectlyProvidingPowerTo(x + 1, y, z, Side.EAST);
     }
 
     @Override
@@ -145,7 +129,7 @@ public class BlockRedstoneTorch extends BlockTorch
         {
             if(flag)
             {
-                world.setBlockAndMetadataWithNotify(x, y, z, Block.torchRedstoneIdle.id, world.getBlockMetadata(x, y, z));
+                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.TORCH_REDSTONE_IDLE.id, world.getBlockMetadata(x, y, z));
                 if(checkForBurnout(world, x, y, z, true))
                 {
                     world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
@@ -161,7 +145,7 @@ public class BlockRedstoneTorch extends BlockTorch
         } else
         if(!flag && !checkForBurnout(world, x, y, z, false))
         {
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.torchRedstoneActive.id, world.getBlockMetadata(x, y, z));
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.TORCH_REDSTONE_ACTIVE.id, world.getBlockMetadata(x, y, z));
         }
     }
 
@@ -169,35 +153,32 @@ public class BlockRedstoneTorch extends BlockTorch
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
         super.onNeighborBlockChange(world, x, y, z, blockId);
-        world.scheduleBlockUpdate(x, y, z, id, tickRate());
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
-        if(side == 0)
-        {
-            return isPoweringTo(world, x, y, z, side);
-        } else
-        {
+        if(side == Side.BOTTOM) {
+            return getSignal(world, x, y, z, side);
+        } else {
             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.torchRedstoneActive) };
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
+        return new ItemStack[] { new ItemStack(Blocks.TORCH_REDSTONE_ACTIVE) };
     }
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return true;
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+	public void animationTick(World world, int x, int y, int z, Random rand) {
 		if (!torchActive) {
 			return;
 		}
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstoneWire.java b/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/BlockRedstoneWire.java
rename to src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
index 7ed042869..7ea6f59ae 100644
--- a/src/main/java/net/minecraft/core/block/BlockRedstoneWire.java
+++ b/src/main/java/net/minecraft/core/block/RedstoneWireBlock.java
@@ -1,10 +1,11 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.logic.BedDirections;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
@@ -19,14 +20,14 @@ import java.util.*;
 //            Block, Material, World, ChunkPosition, 
 //            Item, IBlockAccess, ModelBed, AxisAlignedBB
 
-public class BlockRedstoneWire extends Block
+public class RedstoneWireBlock extends Block
 {
 
-    public BlockRedstoneWire(String key, int id)
+    public RedstoneWireBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.decoration);
+        super(key, namespaceId, id, Material.decoration);
         wiresProvidePower = true;
-        field_21031_b = new HashSet();
+        chunkPositionSet = new HashSet<>();
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F);
     }
 
@@ -43,7 +44,7 @@ public class BlockRedstoneWire extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -54,35 +55,30 @@ public class BlockRedstoneWire extends Block
         return world.canPlaceOnSurfaceOfBlock(x, y - 1, z);
     }
 
-    private void updateAndPropagateCurrentStrength(World world, int i, int j, int k)
+    private void updateAndPropagateCurrentStrength(World world, int x, int y, int z)
     {
-        func_21030_a(world, i, j, k, i, j, k);
-        ArrayList arraylist = new ArrayList(field_21031_b);
-        field_21031_b.clear();
-        for(int l = 0; l < arraylist.size(); l++)
-        {
-            ChunkPosition chunkposition = (ChunkPosition)arraylist.get(l);
+        func_21030_a(world, x, y, z, x, y, z);
+        ArrayList<ChunkPosition> arraylist = new ArrayList<>(chunkPositionSet);
+        chunkPositionSet.clear();
+        for (ChunkPosition chunkposition : arraylist) {
             world.notifyBlocksOfNeighborChange(chunkposition.x, chunkposition.y, chunkposition.z, id);
         }
 
     }
 
-    private void func_21030_a(World world, int i, int j, int k, int l, int i1, int j1)
-    {
-        int k1 = world.getBlockMetadata(i, j, k);
+    private void func_21030_a(World world, int x, int y, int z, int l, int i1, int j1) {
+        int meta = world.getBlockMetadata(x, y, z);
         int l1 = 0;
         wiresProvidePower = false;
-        boolean flag = world.isBlockIndirectlyGettingPowered(i, j, k);
+        boolean flag = world.isBlockIndirectlyGettingPowered(x, y, z);
         wiresProvidePower = true;
-        if(flag)
-        {
+        if(flag) {
             l1 = 15;
-        } else
-        {
+        } else {
             for(int i2 = 0; i2 < 4; i2++)
             {
-                int k2 = i;
-                int i3 = k;
+                int k2 = x;
+                int i3 = z;
                 if(i2 == 0)
                 {
                     k2--;
@@ -99,21 +95,21 @@ public class BlockRedstoneWire extends Block
                 {
                     i3++;
                 }
-                if(k2 != l || j != i1 || i3 != j1)
+                if(k2 != l || y != i1 || i3 != j1)
                 {
-                    l1 = getMaxCurrentStrength(world, k2, j, i3, l1);
+                    l1 = getMaxCurrentStrength(world, k2, y, i3, l1);
                 }
-                if(world.isBlockNormalCube(k2, j, i3) && !world.isBlockNormalCube(i, j + 1, k))
+                if(world.isBlockNormalCube(k2, y, i3) && !world.isBlockNormalCube(x, y + 1, z))
                 {
-                    if(k2 != l || j + 1 != i1 || i3 != j1)
+                    if(k2 != l || y + 1 != i1 || i3 != j1)
                     {
-                        l1 = getMaxCurrentStrength(world, k2, j + 1, i3, l1);
+                        l1 = getMaxCurrentStrength(world, k2, y + 1, i3, l1);
                     }
                     continue;
                 }
-                if(!world.isBlockNormalCube(k2, j, i3) && (k2 != l || j - 1 != i1 || i3 != j1))
+                if(!world.isBlockNormalCube(k2, y, i3) && (k2 != l || y - 1 != i1 || i3 != j1))
                 {
-                    l1 = getMaxCurrentStrength(world, k2, j - 1, i3, l1);
+                    l1 = getMaxCurrentStrength(world, k2, y - 1, i3, l1);
                 }
             }
 
@@ -125,17 +121,17 @@ public class BlockRedstoneWire extends Block
                 l1 = 0;
             }
         }
-        if(k1 != l1)
+        if(meta != l1)
         {
             world.editingBlocks = true;
-            world.setBlockMetadataWithNotify(i, j, k, l1);
-            world.markBlocksDirty(i, j, k, i, j, k);
+            world.setBlockMetadataWithNotify(x, y, z, l1);
+            world.markBlocksDirty(x, y, z, x, y, z);
             world.editingBlocks = false;
             for(int j2 = 0; j2 < 4; j2++)
             {
-                int l2 = i;
-                int j3 = k;
-                int k3 = j - 1;
+                int l2 = x;
+                int j3 = z;
+                int k3 = y - 1;
                 if(j2 == 0)
                 {
                     l2--;
@@ -152,68 +148,63 @@ public class BlockRedstoneWire extends Block
                 {
                     j3++;
                 }
-                if(world.isBlockNormalCube(l2, j, j3))
+                if(world.isBlockNormalCube(l2, y, j3))
                 {
                     k3 += 2;
                 }
                 int l3 = 0;
-                l3 = getMaxCurrentStrength(world, l2, j, j3, -1);
-                l1 = world.getBlockMetadata(i, j, k);
+                l3 = getMaxCurrentStrength(world, l2, y, j3, -1);
+                l1 = world.getBlockMetadata(x, y, z);
                 if(l1 > 0)
                 {
                     l1--;
                 }
                 if(l3 >= 0 && l3 != l1)
                 {
-                    func_21030_a(world, l2, j, j3, i, j, k);
+                    func_21030_a(world, l2, y, j3, x, y, z);
                 }
                 l3 = getMaxCurrentStrength(world, l2, k3, j3, -1);
-                l1 = world.getBlockMetadata(i, j, k);
+                l1 = world.getBlockMetadata(x, y, z);
                 if(l1 > 0)
                 {
                     l1--;
                 }
                 if(l3 >= 0 && l3 != l1)
                 {
-                    func_21030_a(world, l2, k3, j3, i, j, k);
+                    func_21030_a(world, l2, k3, j3, x, y, z);
                 }
             }
 
-            if(k1 == 0 || l1 == 0)
+            if(meta == 0 || l1 == 0)
             {
-                field_21031_b.add(new ChunkPosition(i, j, k));
-                field_21031_b.add(new ChunkPosition(i - 1, j, k));
-                field_21031_b.add(new ChunkPosition(i + 1, j, k));
-                field_21031_b.add(new ChunkPosition(i, j - 1, k));
-                field_21031_b.add(new ChunkPosition(i, j + 1, k));
-                field_21031_b.add(new ChunkPosition(i, j, k - 1));
-                field_21031_b.add(new ChunkPosition(i, j, k + 1));
+                chunkPositionSet.add(new ChunkPosition(x, y, z));
+                chunkPositionSet.add(new ChunkPosition(x - 1, y, z));
+                chunkPositionSet.add(new ChunkPosition(x + 1, y, z));
+                chunkPositionSet.add(new ChunkPosition(x, y - 1, z));
+                chunkPositionSet.add(new ChunkPosition(x, y + 1, z));
+                chunkPositionSet.add(new ChunkPosition(x, y, z - 1));
+                chunkPositionSet.add(new ChunkPosition(x, y, z + 1));
             }
         }
     }
 
-    private void notifyWireNeighborsOfNeighborChange(World world, int i, int j, int k)
+    private void notifyWireNeighborsOfNeighborChange(World world, int x, int y, int z)
     {
-        if(world.getBlockId(i, j, k) != id)
-        {
-            return;
-        } else
-        {
-            world.notifyBlocksOfNeighborChange(i, j, k, id);
-            world.notifyBlocksOfNeighborChange(i - 1, j, k, id);
-            world.notifyBlocksOfNeighborChange(i + 1, j, k, id);
-            world.notifyBlocksOfNeighborChange(i, j, k - 1, id);
-            world.notifyBlocksOfNeighborChange(i, j, k + 1, id);
-            world.notifyBlocksOfNeighborChange(i, j - 1, k, id);
-            world.notifyBlocksOfNeighborChange(i, j + 1, k, id);
-            return;
+        if (world.getBlockId(x, y, z) == id) {
+            world.notifyBlocksOfNeighborChange(x, y, z, id);
+            world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
+            world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
+            world.notifyBlocksOfNeighborChange(x, y, z - 1, id);
+            world.notifyBlocksOfNeighborChange(x, y, z + 1, id);
+            world.notifyBlocksOfNeighborChange(x, y - 1, z, id);
+            world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
         }
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         if(world.isClientSide)
         {
             return;
@@ -300,73 +291,55 @@ public class BlockRedstoneWire extends Block
         }
     }
 
-    private int getMaxCurrentStrength(World world, int i, int j, int k, int l)
-    {
-        if(world.getBlockId(i, j, k) != id)
-        {
-            return l;
-        }
-        int i1 = world.getBlockMetadata(i, j, k);
-        if(i1 > l)
-        {
-            return i1;
-        } else
-        {
-            return l;
+    private int getMaxCurrentStrength(World world, int x, int y, int z, int inputMeta) {
+        if(world.getBlockId(x, y, z) != id) {
+            return inputMeta;
         }
+
+        int meta = world.getBlockMetadata(x, y, z);
+        return Math.max(meta, inputMeta);
     }
 
     @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int i1 = world.getBlockMetadata(x, y, z);
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
+        if(world.isClientSide) {return;}
+
+        int meta = world.getBlockMetadata(x, y, z);
         boolean flag = canPlaceBlockAt(world, x, y, z);
-        if(!flag)
-        {
-            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, i1, null);
+        if(!flag) {
+            dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, meta, null);
             world.setBlockWithNotify(x, y, z, 0);
-        } else
-        {
+        } else {
             updateAndPropagateCurrentStrength(world, x, y, z);
         }
         super.onNeighborBlockChange(world, x, y, z, blockId);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
-    {
-        return new ItemStack[] { new ItemStack(Item.dustRedstone ) };
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
+        return new ItemStack[] { new ItemStack(Items.DUST_REDSTONE ) };
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side)
     {
-        if(!wiresProvidePower)
-        {
+        if(!wiresProvidePower) {
             return false;
-        } else
-        {
-            return isPoweringTo(world, x, y, z, side);
+        } else {
+            return getSignal(world, x, y, z, side);
         }
     }
 
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side)
     {
-        if(!wiresProvidePower)
-        {
+        if(!wiresProvidePower) {
             return false;
         }
-        if(blockAccess.getBlockMetadata(x, y, z) == 0)
-        {
+        if(blockAccess.getBlockMetadata(x, y, z) == 0) {
             return false;
         }
-        if(side == 1)
-        {
+        if(side == Side.TOP) {
             return true;
         }
         boolean flag = isPowerProviderOrWire(blockAccess, x - 1, y, z, 1) || !blockAccess.isBlockNormalCube(x - 1, y, z) && isPowerProviderOrWire(blockAccess, x - 1, y - 1, z, -1);
@@ -392,33 +365,33 @@ public class BlockRedstoneWire extends Block
                 flag3 = true;
             }
         }
-        if(!flag2 && !flag1 && !flag && !flag3 && side >= 2 && side <= 5)
+        if(!flag2 && !flag1 && !flag && !flag3 && side.getAxis() != Axis.Y)
         {
             return true;
         }
-        if(side == 2 && flag2 && !flag && !flag1)
+        if(side == Side.NORTH && flag2 && !flag && !flag1)
         {
             return true;
         }
-        if(side == 3 && flag3 && !flag && !flag1)
+        if(side == Side.SOUTH && flag3 && !flag && !flag1)
         {
             return true;
         }
-        if(side == 4 && flag && !flag2 && !flag3)
+        if(side == Side.WEST && flag && !flag2 && !flag3)
         {
             return true;
         }
-        return side == 5 && flag1 && !flag2 && !flag3;
+        return side == Side.EAST && flag1 && !flag2 && !flag3;
     }
 
     @Override
-    public boolean canProvidePower()
+    public boolean isSignalSource()
     {
         return wiresProvidePower;
     }
 
 	@Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+	public void animationTick(World world, int x, int y, int z, Random rand) {
 		int meta = world.getBlockMetadata(x, y, z);
 		if(meta == 0) {
 			return;
@@ -439,31 +412,34 @@ public class BlockRedstoneWire extends Block
 		world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
 	}
 
-    public static boolean isPowerProviderOrWire(WorldSource iblockaccess, int i, int j, int k, int l)
+    public static boolean isPowerProviderOrWire(WorldSource worldSource, int x, int y, int z, int l)
     {
-        int i1 = iblockaccess.getBlockId(i, j, k);
-        if(i1 == Block.wireRedstone.id)
-        {
+        int blockId = worldSource.getBlockId(x, y, z);
+        if(blockId == Blocks.WIRE_REDSTONE.id) {
             return true;
         }
-        if(i1 == 0)
-        {
+        if(blockId <= 0) {
             return false;
         }
-        if(Block.blocksList[i1].canProvidePower())
-        {
+        if(Block.blocksList[blockId].isSignalSource()) {
             return true;
         }
-        if(i1 == Block.repeaterIdle.id || i1 == Block.repeaterActive.id)
-        {
-            int j1 = iblockaccess.getBlockMetadata(i, j, k);
-            return l == BedDirections.footToHeadMap[j1 & 3];
-        } else
-        {
+        if (blockId == Blocks.PUMPKIN_REDSTONE.id) {
+            if (l < 0 || l > 3) {
+                return false;
+            }
+            Side[] lookup = { Side.NORTH, Side.EAST, Side.SOUTH, Side.WEST };
+            Side side = Side.getSideById(worldSource.getBlockMetadata(x, y, z));
+            return side == lookup[l];
+        }
+        if(blockId == Blocks.REPEATER_IDLE.id || blockId == Blocks.REPEATER_ACTIVE.id) {
+            int meta = worldSource.getBlockMetadata(x, y, z);
+            return l == BedBlock.footToHeadMap[meta & 0b11];
+        } else {
             return false;
         }
     }
 
     private boolean wiresProvidePower;
-    private Set field_21031_b;
+    private final Set<ChunkPosition> chunkPositionSet;
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java b/src/main/java/net/minecraft/core/block/RepeaterBlock.java
similarity index 52%
rename from src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java
rename to src/main/java/net/minecraft/core/block/RepeaterBlock.java
index 518b6d4e1..00d477bd3 100644
--- a/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java
+++ b/src/main/java/net/minecraft/core/block/RepeaterBlock.java
@@ -1,36 +1,31 @@
 package net.minecraft.core.block;
 
 import net.minecraft.client.util.helper.Colors;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Material, World, IBlockAccess, 
-//            EntityLiving, MathHelper, Item, EntityPlayer
-
-public class BlockRedstoneRepeater extends Block
+public class RepeaterBlock extends Block
 {
 
-	public BlockRedstoneRepeater(String key, int id, boolean flag)
+	public RepeaterBlock(String key, String namespaceId, int id, boolean flag)
     {
-        super(key, id, Material.decoration);
+        super(key, namespaceId, id, Material.decoration);
         isRepeaterPowered = flag;
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -48,9 +43,9 @@ public class BlockRedstoneRepeater extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Item.repeater) };
+        return new ItemStack[] { new ItemStack(Items.REPEATER) };
     }
 
     @Override
@@ -66,98 +61,82 @@ public class BlockRedstoneRepeater extends Block
     }
 
     @Override
-	public void updateTick(World world, int x, int y, int z, Random rand)
-    {
-        int l = world.getBlockMetadata(x, y, z);
-        boolean flag = func_22022_g(world, x, y, z, l);
-        if(isRepeaterPowered && !flag)
-        {
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.repeaterIdle.id, l);
-        } else
-        if(!isRepeaterPowered)
-        {
-            world.setBlockAndMetadataWithNotify(x, y, z, Block.repeaterActive.id, l);
-            if(!flag)
-            {
-                int i1 = (l & 0xc) >> 2;
-                world.scheduleBlockUpdate(x, y, z, Block.repeaterActive.id, field_22023_b[i1] * 2);
+	public void updateTick(World world, int x, int y, int z, Random rand) {
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean flag = func_22022_g(world, x, y, z, meta);
+        if(isRepeaterPowered && !flag) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.REPEATER_IDLE.id, meta);
+        } else if(!isRepeaterPowered) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.REPEATER_ACTIVE.id, meta);
+            if(!flag) {
+                int i1 = (meta & 0xc) >> 2;
+                world.scheduleBlockUpdate(x, y, z, Blocks.REPEATER_ACTIVE.id, tickDelayMap[i1] * 2);
             }
         }
     }
 
     @Override
-    public boolean isIndirectlyPoweringTo(World world, int x, int y, int z, int side)
-    {
-        return isPoweringTo(world, x, y, z, side);
+    public boolean getDirectSignal(World world, int x, int y, int z, Side side) {
+        return getSignal(world, x, y, z, side);
     }
 
     @Override
-    public boolean isPoweringTo(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-        if(!isRepeaterPowered)
-        {
+    public boolean getSignal(WorldSource blockAccess, int x, int y, int z, Side side) {
+        if(!isRepeaterPowered) {
             return false;
         }
-        int i1 = blockAccess.getBlockMetadata(x, y, z) & 3;
-        if(i1 == 0 && side == 3)
-        {
+        int meta = blockAccess.getBlockMetadata(x, y, z) & 3;
+        if(meta == 0 && side == Side.SOUTH) {
             return true;
         }
-        if(i1 == 1 && side == 4)
-        {
+        if(meta == 1 && side == Side.WEST) {
             return true;
         }
-        if(i1 == 2 && side == 2)
-        {
+        if(meta == 2 && side == Side.NORTH) {
             return true;
         }
-        return i1 == 3 && side == 5;
+        return meta == 3 && side == Side.EAST;
     }
 
     @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
-    {
-        if(!canBlockStay(world, x, y, z))
-        {
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
+        if(!canBlockStay(world, x, y, z)) {
             dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
             world.setBlockWithNotify(x, y, z, 0);
             return;
         }
-        int i1 = world.getBlockMetadata(x, y, z);
-        boolean flag = func_22022_g(world, x, y, z, i1);
-        int j1 = (i1 & 0xc) >> 2;
-        if(isRepeaterPowered && !flag)
-        {
-            world.scheduleBlockUpdate(x, y, z, id, field_22023_b[j1] * 2);
-        } else
-        if(!isRepeaterPowered && flag)
-        {
-            world.scheduleBlockUpdate(x, y, z, id, field_22023_b[j1] * 2);
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean flag = func_22022_g(world, x, y, z, meta);
+        int j1 = (meta & 0xc) >> 2;
+        if(isRepeaterPowered && !flag) {
+            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[j1] * 2);
+        } else if(!isRepeaterPowered && flag) {
+            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[j1] * 2);
         }
     }
 
-    private boolean func_22022_g(World world, int i, int j, int k, int l)
+    private boolean func_22022_g(World world, int x, int y, int z, int meta)
     {
-        int i1 = l & 3;
-        switch(i1)
+        int direction = meta & 3;
+        switch(direction)
         {
         case 0: // '\0'
-            return world.isBlockIndirectlyProvidingPowerTo(i, j, k + 1, 3) || world.getBlockId(i, j, k + 1) == Block.wireRedstone.id && world.getBlockMetadata(i, j, k + 1) > 0;
+            return world.isBlockIndirectlyProvidingPowerTo(x, y, z + 1, Side.SOUTH) || world.getBlockId(x, y, z + 1) == Blocks.WIRE_REDSTONE.id && world.getBlockMetadata(x, y, z + 1) > 0;
 
         case 2: // '\002'
-            return world.isBlockIndirectlyProvidingPowerTo(i, j, k - 1, 2) || world.getBlockId(i, j, k - 1) == Block.wireRedstone.id && world.getBlockMetadata(i, j, k - 1) > 0;
+            return world.isBlockIndirectlyProvidingPowerTo(x, y, z - 1, Side.NORTH) || world.getBlockId(x, y, z - 1) == Blocks.WIRE_REDSTONE.id && world.getBlockMetadata(x, y, z - 1) > 0;
 
         case 3: // '\003'
-            return world.isBlockIndirectlyProvidingPowerTo(i + 1, j, k, 5) || world.getBlockId(i + 1, j, k) == Block.wireRedstone.id && world.getBlockMetadata(i + 1, j, k) > 0;
+            return world.isBlockIndirectlyProvidingPowerTo(x + 1, y, z, Side.EAST) || world.getBlockId(x + 1, y, z) == Blocks.WIRE_REDSTONE.id && world.getBlockMetadata(x + 1, y, z) > 0;
 
         case 1: // '\001'
-            return world.isBlockIndirectlyProvidingPowerTo(i - 1, j, k, 4) || world.getBlockId(i - 1, j, k) == Block.wireRedstone.id && world.getBlockMetadata(i - 1, j, k) > 0;
+            return world.isBlockIndirectlyProvidingPowerTo(x - 1, y, z, Side.WEST) || world.getBlockId(x - 1, y, z) == Blocks.WIRE_REDSTONE.id && world.getBlockMetadata(x - 1, y, z) > 0;
         }
         return false;
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = (l & 0xc) >> 2;
@@ -167,14 +146,8 @@ public class BlockRedstoneRepeater extends Block
     }
 
     @Override
-    public boolean canProvidePower()
-    {
-        return false;
-    }
-    
-    @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-		int l = entity.getHorizontalPlacementDirection(side).index;
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+		int l = mob.getHorizontalPlacementDirection(side).index;
 		world.setBlockMetadataWithNotify(x, y, z, l);
 		boolean flag = func_22022_g(world, x, y, z, l);
 		if(flag)
@@ -184,7 +157,7 @@ public class BlockRedstoneRepeater extends Block
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         world.notifyBlocksOfNeighborChange(x + 1, y, z, id);
         world.notifyBlocksOfNeighborChange(x - 1, y, z, id);
@@ -201,7 +174,7 @@ public class BlockRedstoneRepeater extends Block
     }
 
 	@Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+	public void animationTick(World world, int x, int y, int z, Random rand) {
 		if (!isRepeaterPowered) {
 			return;
 		}
@@ -241,26 +214,26 @@ public class BlockRedstoneRepeater extends Block
 			int i1 = (meta & 0xc) >> 2;
 			switch (meta & 3) {
 			case 0:
-				zOffset = field_22024_a[i1];
+				zOffset = torchPosOffset[i1];
 				break;
 			case 2:
-				zOffset = -field_22024_a[i1];
+				zOffset = -torchPosOffset[i1];
 				break;
 			case 3:
-				xOffset = field_22024_a[i1];
+				xOffset = torchPosOffset[i1];
 				break;
 			case 1:
-				xOffset = -field_22024_a[i1];
+				xOffset = -torchPosOffset[i1];
 				break;
 			}
 		}
 		world.spawnParticle("reddust", px + xOffset, py, pz + zOffset, red, green, blue, redstoneBrightness);
 	}
 
-    public static final double field_22024_a[] = {
+    public static final double[] torchPosOffset = {
         -0.0625D, 0.0625D, 0.1875D, 0.3125D
     };
-    private static final int field_22023_b[] = {
+    private static final int[] tickDelayMap = {
         1, 2, 3, 4
     };
     public final boolean isRepeaterPowered;
diff --git a/src/main/java/net/minecraft/core/block/RetroLeavesBlock.java b/src/main/java/net/minecraft/core/block/RetroLeavesBlock.java
new file mode 100644
index 000000000..8f43daa80
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/RetroLeavesBlock.java
@@ -0,0 +1,17 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+
+public class RetroLeavesBlock extends BaseLeavesBlock
+{
+	public RetroLeavesBlock(String key, String namespaceId, int id)
+	{
+        super(key, namespaceId, id, Material.leaves);
+	}
+
+    @Override
+    protected Block getSapling()
+    {
+        return Blocks.SAPLING_OAK_RETRO;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockRope.java b/src/main/java/net/minecraft/core/block/RopeBlock.java
similarity index 78%
rename from src/main/java/net/minecraft/core/block/BlockRope.java
rename to src/main/java/net/minecraft/core/block/RopeBlock.java
index 3b4843561..abbefe753 100644
--- a/src/main/java/net/minecraft/core/block/BlockRope.java
+++ b/src/main/java/net/minecraft/core/block/RopeBlock.java
@@ -1,26 +1,25 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityNote;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.ItemToolShears;
+import net.minecraft.core.item.ToolShearsItem;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockRope
+public class RopeBlock
     extends Block {
-    public BlockRope(String key, int id) {
-        super(key, id, Material.cloth);
+    public RopeBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId,id, Material.cloth);
     }
 
     @Override
-    public boolean renderAsNormalBlock() {
+    public boolean isCubeShaped() {
         return false;
     }
 
@@ -66,10 +65,10 @@ public class BlockRope
         setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ);
     }
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         ItemStack heldItem = player.getHeldItem();
-        if (heldItem != null && heldItem.getItem() instanceof ItemToolShears){
+        if (heldItem != null && heldItem.getItem() instanceof ToolShearsItem){
             int meta = world.getBlockMetadata(x, y, z);
             int forceRope = (~meta) & 0b1000_0000;
             world.setBlockMetadataWithNotify(x, y, z, forceRope | (meta & 0b0111_1111));
@@ -83,7 +82,7 @@ public class BlockRope
     }
 
     @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) };
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
+        return new ItemStack[] { new ItemStack(Items.ROPE) };
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockRotatable.java b/src/main/java/net/minecraft/core/block/RotatableBlock.java
similarity index 66%
rename from src/main/java/net/minecraft/core/block/BlockRotatable.java
rename to src/main/java/net/minecraft/core/block/RotatableBlock.java
index 5b64e70bb..ce6f92075 100644
--- a/src/main/java/net/minecraft/core/block/BlockRotatable.java
+++ b/src/main/java/net/minecraft/core/block/RotatableBlock.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public abstract class BlockRotatable extends Block{
-    public BlockRotatable(String key, int id, Material material) {
-        super(key, id, material);
+public abstract class RotatableBlock extends Block{
+    public RotatableBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material);
     }
 
     public void setDefaultDirection(World world, int i, int j, int k)
@@ -46,14 +46,14 @@ public abstract class BlockRotatable extends Block{
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-        world.setBlockMetadataWithNotify(x, y, z, entity.getPlacementDirection(side).getOpposite().getId());
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+        world.setBlockMetadataWithNotify(x, y, z, mob.getHorizontalPlacementDirection(side).getOpposite().getId());
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         setDefaultDirection(world, x, y, z);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockTileEntityRotatable.java b/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockTileEntityRotatable.java
rename to src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
index 0146465bf..f8523a78e 100644
--- a/src/main/java/net/minecraft/core/block/BlockTileEntityRotatable.java
+++ b/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
@@ -1,15 +1,14 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.helper.Sides;
 import net.minecraft.core.world.World;
 
-public abstract class BlockTileEntityRotatable extends BlockTileEntity {
+public abstract class RotatableEntityBlock extends EntityBlock {
 
-	public BlockTileEntityRotatable(String key, int id, Material material) {
-        super(key, id, material);
+	public RotatableEntityBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material);
     }
 	public void setDefaultDirection(World world, int i, int j, int k)
     {
@@ -42,14 +41,14 @@ public abstract class BlockTileEntityRotatable extends BlockTileEntity {
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	world.setBlockMetadataWithNotify(x, y, z, entity.getHorizontalPlacementDirection(side).getOpposite().getId());
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	world.setBlockMetadataWithNotify(x, y, z, mob.getHorizontalPlacementDirection(side).getOpposite().getId());
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         setDefaultDirection(world, x, y, z);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/SandBlock.java b/src/main/java/net/minecraft/core/block/SandBlock.java
new file mode 100644
index 000000000..6c8b46b55
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/SandBlock.java
@@ -0,0 +1,87 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.entity.FallingBlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+// Referenced classes of package net.minecraft.src:
+//            Block, Material, World, FallingBlockEntity,
+//            FireBlock
+
+public class SandBlock extends Block
+{
+
+    public SandBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.sand);
+    }
+
+    @Override
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
+    {
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+    }
+
+    @Override
+	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
+    {
+        world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+    }
+
+    @Override
+	public void updateTick(World world, int x, int y, int z, Random rand)
+    {
+        tryToFall(world, x, y, z);
+    }
+
+    private void tryToFall(World world, int x, int y, int z)
+    {
+        if(canFallBelow(world, x, y - 1, z) && y >= 0)
+        {
+            byte byte0 = 32;
+            if(fallInstantly || !world.areBlocksLoaded(x - byte0, y - byte0, z - byte0, x + byte0, y + byte0, z + byte0))
+            {
+                world.setBlockWithNotify(x, y, z, 0);
+                for(; canFallBelow(world, x, y - 1, z) && y > 0; y--) { }
+                if(y > 0)
+                {
+                    world.setBlockWithNotify(x, y, z, id);
+                }
+            } else
+            {
+                FallingBlockEntity fallingBlockEntity = new FallingBlockEntity(world, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, id);
+                world.entityJoinedWorld(fallingBlockEntity);
+            }
+        }
+    }
+
+    @Override
+    public int tickDelay()
+    {
+        return 3;
+    }
+
+    public static boolean canFallBelow(World world, int x, int y, int z)
+    {
+        int blockId = world.getBlockId(x, y, z);
+        if(blockId == 0)
+        {
+            return true;
+        }
+        if(blockId == Blocks.FIRE.id)
+        {
+            return true;
+        }
+        if(Block.hasTag(blockId, BlockTags.IS_WATER))
+        {
+            return true;
+        }
+        return Block.hasTag(blockId, BlockTags.IS_LAVA);
+    }
+
+    public static boolean fallInstantly = false;
+
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingBase.java b/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
similarity index 72%
rename from src/main/java/net/minecraft/core/block/BlockSaplingBase.java
rename to src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
index dac851101..a2af4d4e2 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingBase.java
+++ b/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
@@ -2,7 +2,7 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
@@ -10,16 +10,16 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public abstract class BlockSaplingBase extends BlockFlower implements IBonemealable
+public abstract class SaplingBaseBlock extends FlowerBlock implements IBonemealable
 {
 	public boolean canGrowOnSand = false;
 
-	public BlockSaplingBase(String key, int id)
+	public SaplingBaseBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         float f = 0.4F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
     }
@@ -27,7 +27,7 @@ public abstract class BlockSaplingBase extends BlockFlower implements IBonemeala
 	@Override
 	public boolean canThisPlantGrowOnThisBlockID(int i)
     {
-        return i == Block.sand.id || super.canThisPlantGrowOnThisBlockID(i);
+        return i == Blocks.SAND.id || super.canThisPlantGrowOnThisBlockID(i);
     }
 
     @Override
@@ -39,8 +39,8 @@ public abstract class BlockSaplingBase extends BlockFlower implements IBonemeala
         }
 
         if(!canGrowOnSand) {
-            if(world.getBlockId(x, y -1, z) == Block.sand.id) {
-                world.setBlockWithNotify(x, y, z, Block.deadbush.id);
+            if(world.getBlockId(x, y -1, z) == Blocks.SAND.id) {
+                world.setBlockWithNotify(x, y, z, Blocks.DEADBUSH.id);
             }	
         }
 
@@ -63,10 +63,10 @@ public abstract class BlockSaplingBase extends BlockFlower implements IBonemeala
     }
     
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced){
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced){
         if(!world.isClientSide)
         {
-            ((BlockSaplingBase)Block.blocksList[id]).growTree(world, blockX, blockY, blockZ, world.rand);
+            ((SaplingBaseBlock)Block.blocksList[id]).growTree(world, blockX, blockY, blockZ, world.rand);
             if (entityplayer.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingBirch.java b/src/main/java/net/minecraft/core/block/SaplingBirchBlock.java
similarity index 54%
rename from src/main/java/net/minecraft/core/block/BlockSaplingBirch.java
rename to src/main/java/net/minecraft/core/block/SaplingBirchBlock.java
index b76481bed..8818e28b7 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingBirch.java
+++ b/src/main/java/net/minecraft/core/block/SaplingBirchBlock.java
@@ -3,21 +3,19 @@ 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.WorldFeature;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeCherry;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingBirch extends BlockSaplingBase
+public class SaplingBirchBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingBirch(String key, int id)
+	public SaplingBirchBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
 
@@ -28,9 +26,9 @@ public class BlockSaplingBirch extends BlockSaplingBase
 
     	world.setBlock(i, j, k, 0);
 
-    	obj = new WorldFeatureTree(Block.leavesBirch.id, Block.logBirch.id, 5);
+    	obj = new WorldFeatureTree(Blocks.LEAVES_BIRCH.id, Blocks.LOG_BIRCH.id, 5);
 
-        if(!((WorldFeature) (obj)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (obj)).place(world, random, i, j, k))
         {
             world.setBlock(i, j, k, id);
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingCacao.java b/src/main/java/net/minecraft/core/block/SaplingCacaoBlock.java
similarity index 57%
rename from src/main/java/net/minecraft/core/block/BlockSaplingCacao.java
rename to src/main/java/net/minecraft/core/block/SaplingCacaoBlock.java
index d07e47e78..1db56e5d2 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingCacao.java
+++ b/src/main/java/net/minecraft/core/block/SaplingCacaoBlock.java
@@ -6,21 +6,21 @@ import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 
 import java.util.Random;
 
-public class BlockSaplingCacao extends BlockSaplingBase
+public class SaplingCacaoBlock extends SaplingBaseBlock
 {
 
-    public BlockSaplingCacao(String key, int id)
+    public SaplingCacaoBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
     @Override
     public void growTree(World world, int i, int j, int k, Random random)
     {
-        Object treeSmall = new WorldFeatureTree(Block.leavesCacao.id, Block.logOakMossy.id, 4);
+        Object treeSmall = new WorldFeatureTree(Blocks.LEAVES_CACAO.id, Blocks.LOG_OAK_MOSSY.id, 4);
         world.setBlock(i, j, k, 0);
 
-        if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (treeSmall)).place(world, random, i, j, k))
         {
                 world.setBlock(i, j, k, id);
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingCherry.java b/src/main/java/net/minecraft/core/block/SaplingCherryBlock.java
similarity index 53%
rename from src/main/java/net/minecraft/core/block/BlockSaplingCherry.java
rename to src/main/java/net/minecraft/core/block/SaplingCherryBlock.java
index 65023a6c0..9a8e99d6b 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingCherry.java
+++ b/src/main/java/net/minecraft/core/block/SaplingCherryBlock.java
@@ -8,27 +8,27 @@ import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeCherry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingCherry extends BlockSaplingBase
+public class SaplingCherryBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingCherry(String key, int id)
+	public SaplingCherryBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
     @Override
 	public void growTree(World world, int i, int j, int k, Random random)
     {
-        Object treeBig  = new WorldFeatureTreeFancy(Block.leavesCherry.id, Block.logCherry.id);
-        Object treeSmall = new WorldFeatureTreeCherry(Block.leavesCherry.id, Block.logCherry.id, 4);
+        Object treeBig  = new WorldFeatureTreeFancy(Blocks.LEAVES_CHERRY.id, Blocks.LOG_CHERRY.id);
+        Object treeSmall = new WorldFeatureTreeCherry(Blocks.LEAVES_CHERRY.id, Blocks.LOG_CHERRY.id, 4);
         world.setBlock(i, j, k, 0);
 
-        if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (treeSmall)).place(world, random, i, j, k))
         {
-            if(!((WorldFeature) (treeBig)).generate(world, random, i, j, k)) {
+            if(!((WorldFeature) (treeBig)).place(world, random, i, j, k)) {
                 world.setBlock(i, j, k, id);
             }
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingEucalyptus.java b/src/main/java/net/minecraft/core/block/SaplingEucalyptusBlock.java
similarity index 59%
rename from src/main/java/net/minecraft/core/block/BlockSaplingEucalyptus.java
rename to src/main/java/net/minecraft/core/block/SaplingEucalyptusBlock.java
index 820e873e7..58c267aa6 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingEucalyptus.java
+++ b/src/main/java/net/minecraft/core/block/SaplingEucalyptusBlock.java
@@ -7,15 +7,15 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingEucalyptus extends BlockSaplingBase
+public class SaplingEucalyptusBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingEucalyptus(String key, int id)
+	public SaplingEucalyptusBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
     
     @Override
@@ -25,9 +25,9 @@ public class BlockSaplingEucalyptus extends BlockSaplingBase
         
     	world.setBlock(i, j, k, 0);
         
-        obj = new WorldFeatureTreeEucalyptus(Block.leavesEucalyptus.id, Block.logEucalyptus.id);
-        obj.func_517_a(1.0D, 1.0D, 1.0D);
-        if(!obj.generate(world, random, i, j, k))
+        obj = new WorldFeatureTreeEucalyptus(Blocks.LEAVES_EUCALYPTUS.id, Blocks.LOG_EUCALYPTUS.id);
+        obj.init(1.0D, 1.0D, 1.0D);
+        if(!obj.place(world, random, i, j, k))
         {
             world.setBlock(i, j, k, id);
         }
diff --git a/src/main/java/net/minecraft/core/block/SaplingOakBlock.java b/src/main/java/net/minecraft/core/block/SaplingOakBlock.java
new file mode 100644
index 000000000..a4b0410c2
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/SaplingOakBlock.java
@@ -0,0 +1,36 @@
+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.WorldFeatureTreeFancy;
+import net.minecraft.core.world.generate.feature.WorldFeature;
+
+import java.util.Random;
+
+// Referenced classes of package net.minecraft.src:
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
+//            WorldGenTrees, WorldGenBigTree, WorldGenerator
+
+public class SaplingOakBlock extends SaplingBaseBlock
+{
+
+	public SaplingOakBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id);
+    }
+    
+    @Override
+	public void growTree(World world, int i, int j, int k, Random random)
+    {
+    	Object treeBig = new WorldFeatureTreeFancy(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id);
+        Object treeSmall = new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 4);
+    	world.setBlock(i, j, k, 0);
+
+        if(!((WorldFeature) (treeSmall)).place(world, random, i, j, k))
+        {
+            if(!((WorldFeature) (treeBig)).place(world, random, i, j, k)) {
+                world.setBlock(i, j, k, id);
+            }
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/SaplingPalmBlock.java b/src/main/java/net/minecraft/core/block/SaplingPalmBlock.java
new file mode 100644
index 000000000..6c71d2c3c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/SaplingPalmBlock.java
@@ -0,0 +1,23 @@
+package net.minecraft.core.block;
+
+import java.util.Random;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreePalm;
+
+public class SaplingPalmBlock extends SaplingBaseBlock {
+
+	public SaplingPalmBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id);
+		
+		this.canGrowOnSand = true;
+	}
+	
+	@Override
+	public void growTree(World world, int x, int y, int z, Random random) {
+    	boolean big = world.getBlockId(x, y - 1, z) != Blocks.SAND.id;
+    	
+    	new WorldFeatureTreePalm(Blocks.LOG_PALM, Blocks.LEAVES_PALM, big, true).place(world, random, x, y, z);
+	}
+
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingPine.java b/src/main/java/net/minecraft/core/block/SaplingPineBlock.java
similarity index 69%
rename from src/main/java/net/minecraft/core/block/BlockSaplingPine.java
rename to src/main/java/net/minecraft/core/block/SaplingPineBlock.java
index 6caa6fa5f..dec0a43db 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingPine.java
+++ b/src/main/java/net/minecraft/core/block/SaplingPineBlock.java
@@ -8,15 +8,15 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingPine extends BlockSaplingBase
+public class SaplingPineBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingPine(String key, int id)
+	public SaplingPineBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
     @Override
@@ -44,14 +44,14 @@ public class BlockSaplingPine extends BlockSaplingBase
     @Override
 	public void growTree(World world, int i, int j, int k, Random random)
     {
-        Object treeBig  = new WorldFeatureTreeTaigaTall(Block.leavesPine.id, Block.logPine.id);
-        Object treeSmall = new WorldFeatureTreeTaigaBushy(Block.leavesPine.id, Block.logPine.id);
+        Object treeBig  = new WorldFeatureTreeTaigaTall(Blocks.LEAVES_PINE.id, Blocks.LOG_PINE.id);
+        Object treeSmall = new WorldFeatureTreeTaigaBushy(Blocks.LEAVES_PINE.id, Blocks.LOG_PINE.id);
         
     	world.setBlock(i, j, k, 0);
 
-        if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (treeSmall)).place(world, random, i, j, k))
         {
-            if(!((WorldFeature) (treeBig)).generate(world, random, i, j, k)) {
+            if(!((WorldFeature) (treeBig)).place(world, random, i, j, k)) {
                 world.setBlock(i, j, k, id);
             }
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingRetro.java b/src/main/java/net/minecraft/core/block/SaplingRetroBlock.java
similarity index 53%
rename from src/main/java/net/minecraft/core/block/BlockSaplingRetro.java
rename to src/main/java/net/minecraft/core/block/SaplingRetroBlock.java
index ff857b08b..c4ac5780e 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingRetro.java
+++ b/src/main/java/net/minecraft/core/block/SaplingRetroBlock.java
@@ -8,28 +8,28 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingRetro extends BlockSaplingBase
+public class SaplingRetroBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingRetro(String key, int id)
+	public SaplingRetroBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
 
     @Override
 	public void growTree(World world, int i, int j, int k, Random random)
     {
-        Object treeBig  = new WorldFeatureTreeFancy(Block.leavesOakRetro.id, Block.logOak.id);
-        Object treeSmall = new WorldFeatureTree(Block.leavesOakRetro.id, Block.logOak.id, 4);
+        Object treeBig  = new WorldFeatureTreeFancy(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id);
+        Object treeSmall = new WorldFeatureTree(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id, 4);
         world.setBlock(i, j, k, 0);
 
-        if(!((WorldFeature) (treeSmall)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (treeSmall)).place(world, random, i, j, k))
         {
-            if(!((WorldFeature) (treeBig)).generate(world, random, i, j, k)) {
+            if(!((WorldFeature) (treeBig)).place(world, random, i, j, k)) {
                 world.setBlock(i, j, k, id);
             }
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingShrub.java b/src/main/java/net/minecraft/core/block/SaplingShrubBlock.java
similarity index 62%
rename from src/main/java/net/minecraft/core/block/BlockSaplingShrub.java
rename to src/main/java/net/minecraft/core/block/SaplingShrubBlock.java
index 6eab4f4ed..ff81de64a 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingShrub.java
+++ b/src/main/java/net/minecraft/core/block/SaplingShrubBlock.java
@@ -7,15 +7,15 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, World, WorldGenTaiga2, WorldGenForest, 
+//            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
 //            WorldGenTrees, WorldGenBigTree, WorldGenerator
 
-public class BlockSaplingShrub extends BlockSaplingBase
+public class SaplingShrubBlock extends SaplingBaseBlock
 {
 
-	public BlockSaplingShrub(String key, int id)
+	public SaplingShrubBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
     
     @Override
@@ -25,9 +25,9 @@ public class BlockSaplingShrub extends BlockSaplingBase
         
     	world.setBlock(i, j, k, 0);
         
-    	obj = new WorldFeatureTreeShrub(Block.leavesShrub.id, Block.logOak.id);
+    	obj = new WorldFeatureTreeShrub(Blocks.LEAVES_SHRUB.id, Blocks.LOG_OAK.id);
         
-        if(!((WorldFeature) (obj)).generate(world, random, i, j, k))
+        if(!((WorldFeature) (obj)).place(world, random, i, j, k))
         {
             world.setBlock(i, j, k, id);
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSaplingThorn.java b/src/main/java/net/minecraft/core/block/SaplingThornBlock.java
similarity index 60%
rename from src/main/java/net/minecraft/core/block/BlockSaplingThorn.java
rename to src/main/java/net/minecraft/core/block/SaplingThornBlock.java
index a0006e8ed..3eb007099 100644
--- a/src/main/java/net/minecraft/core/block/BlockSaplingThorn.java
+++ b/src/main/java/net/minecraft/core/block/SaplingThornBlock.java
@@ -6,12 +6,12 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 
 import java.util.Random;
 
-public class BlockSaplingThorn extends BlockSaplingBase
+public class SaplingThornBlock extends SaplingBaseBlock
 {
 
-    public BlockSaplingThorn(String key, int id)
+    public SaplingThornBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
     }
 
 
@@ -21,9 +21,9 @@ public class BlockSaplingThorn extends BlockSaplingBase
         WorldFeature treeFeature = null;
 
         world.setBlock(x, y, z, 0);
-        treeFeature = new WorldFeatureTreeThorn(1, Block.logThorn.id, 0, Block.leavesThorn.id, 0);
+        treeFeature = new WorldFeatureTreeThorn(1, Blocks.LOG_THORN.id, 0, Blocks.LEAVES_THORN.id, 0);
 
-        if(!treeFeature.generate(world, random, x, y, z))
+        if(!treeFeature.place(world, random, x, y, z))
         {
             world.setBlock(x, y, z, id);
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockGrassScorched.java b/src/main/java/net/minecraft/core/block/ScorchedGrassBlock.java
similarity index 57%
rename from src/main/java/net/minecraft/core/block/BlockGrassScorched.java
rename to src/main/java/net/minecraft/core/block/ScorchedGrassBlock.java
index 9db9d555d..de5039780 100644
--- a/src/main/java/net/minecraft/core/block/BlockGrassScorched.java
+++ b/src/main/java/net/minecraft/core/block/ScorchedGrassBlock.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockGrassScorched extends Block
+public class ScorchedGrassBlock extends Block
 {
-    public BlockGrassScorched(String key, int id, Material material)
+    public ScorchedGrassBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -22,7 +22,7 @@ public class BlockGrassScorched extends Block
             case SILK_TOUCH:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Block.dirtScorched) };
+                return new ItemStack[] { new ItemStack(Blocks.DIRT_SCORCHED) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockSeat.java b/src/main/java/net/minecraft/core/block/SeatBlock.java
similarity index 60%
rename from src/main/java/net/minecraft/core/block/BlockSeat.java
rename to src/main/java/net/minecraft/core/block/SeatBlock.java
index c6141a2fa..55fb71954 100644
--- a/src/main/java/net/minecraft/core/block/BlockSeat.java
+++ b/src/main/java/net/minecraft/core/block/SeatBlock.java
@@ -1,31 +1,31 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntitySeat;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.SeatBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class BlockSeat
-    extends BlockTileEntity
+public class SeatBlock
+    extends EntityBlock
 {
-    public BlockSeat(String key, int id) {
-        super(key, id, Material.wood);
+    public SeatBlock(String key, String namespaceId, int id) {
+        super(key, namespaceId, id, Material.wood);
         
         setBlockBounds(0f, 0f, 0f, 1f, 9f / 16f, 1f);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
         if (world.isBlockNormalCube(x, y + 1, z)) {
             return false;
         }
         if (!world.isClientSide) {
-            TileEntitySeat tileEntity = (TileEntitySeat) world.getBlockTileEntity(x, y, z);
+            SeatBlockEntity tileEntity = (SeatBlockEntity) world.getBlockEntity(x, y, z);
             if (tileEntity.getPassenger() == null) {
                 player.startRiding(tileEntity);
             }
@@ -37,7 +37,7 @@ public class BlockSeat
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data) {
         if (!world.isClientSide) {
-            TileEntitySeat tileEntity = (TileEntitySeat) world.getBlockTileEntity(x, y, z);
+            SeatBlockEntity tileEntity = (SeatBlockEntity) world.getBlockEntity(x, y, z);
             if (tileEntity.getPassenger() != null) {
                 tileEntity.ejectRider();
             }
@@ -46,7 +46,7 @@ public class BlockSeat
     }
 
     @Override
-    public boolean renderAsNormalBlock() {
+    public boolean isCubeShaped() {
         return false;
     }
 
@@ -56,15 +56,15 @@ public class BlockSeat
     }
     
     @Override
-    protected TileEntity getNewBlockEntity() {
-        return new TileEntitySeat();
+    protected BlockEntity getNewBlockEntity() {
+        return new SeatBlockEntity();
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity) {
         if (dropCause != EnumDropCause.IMPROPER_TOOL)
         {
-            return new ItemStack[] { new ItemStack(Item.seat) };
+            return new ItemStack[] { new ItemStack(Items.SEAT) };
         }
         else return null;
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesShrub.java b/src/main/java/net/minecraft/core/block/ShrubLeavesBlock.java
similarity index 61%
rename from src/main/java/net/minecraft/core/block/BlockLeavesShrub.java
rename to src/main/java/net/minecraft/core/block/ShrubLeavesBlock.java
index 7a0bb876a..3632ad986 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesShrub.java
+++ b/src/main/java/net/minecraft/core/block/ShrubLeavesBlock.java
@@ -6,27 +6,27 @@ import net.minecraft.core.block.material.Material;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockLeavesBase, Material, ColorizerFoliage, IBlockAccess,
-//            WorldChunkManager, World, Block, EntityPlayer,
+//            BaseLeavesBlock, Material, ColorizerFoliage, IBlockAccess,
+//            WorldChunkManager, World, Block, Player,
 //            ItemStack, Item, ItemShears, StatList,
 //            Entity
 
-public class BlockLeavesShrub extends BlockLeavesBase
+public class ShrubLeavesBlock extends BaseLeavesBlock
 {
 
-	public BlockLeavesShrub(String key, int id)
+	public ShrubLeavesBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.leaves);
+        super(key, namespaceId, id, Material.leaves);
     }
 
     @Override
     protected Block getSapling()
     {
-        return Block.saplingShrub;
+        return Blocks.SAPLING_SHRUB;
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if (world.getSeasonManager().getCurrentSeason() != null && world.getSeasonManager().getCurrentSeason().hasFallingLeaves && rand.nextInt(40) == 0)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockSign.java b/src/main/java/net/minecraft/core/block/SignBlock.java
similarity index 70%
rename from src/main/java/net/minecraft/core/block/BlockSign.java
rename to src/main/java/net/minecraft/core/block/SignBlock.java
index c6c706203..cdcb84b7c 100644
--- a/src/main/java/net/minecraft/core/block/BlockSign.java
+++ b/src/main/java/net/minecraft/core/block/SignBlock.java
@@ -1,29 +1,25 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntitySign;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.SignBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.WorldSource;
 
-// Referenced classes of package net.minecraft.src:
-//            BlockContainer, Material, IBlockAccess, TileEntity, 
-//            Item, World, AxisAlignedBB
-
-public class BlockSign extends BlockTileEntity
+public class SignBlock extends EntityBlock
 {
+    private final boolean isFreeStanding;
 
-	public BlockSign(String key, int id, Class class1, boolean flag)
+	public SignBlock(String key, String namespaceId, int id, boolean isFreeStanding)
     {
-        super(key, id, Material.wood);
-        isFreestanding = flag;
-        signEntityClass = class1;
+        super(key, namespaceId, id, Material.wood);
+        this.isFreeStanding = isFreeStanding;
         float f = 0.25F;
         float f1 = 1.0F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f);
@@ -45,7 +41,7 @@ public class BlockSign extends BlockTileEntity
     @Override
     public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
     {
-        if(isFreestanding)
+        if(isFreeStanding)
         {
             return;
         }
@@ -98,7 +94,7 @@ public class BlockSign extends BlockTileEntity
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -110,23 +106,16 @@ public class BlockSign extends BlockTileEntity
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        try
-        {
-            return (TileEntity)signEntityClass.newInstance();
-        }
-        catch(Exception exception)
-        {
-            throw new RuntimeException(exception);
-        }
+        return new SignBlockEntity();
     }
 
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
         boolean flag = false;
-        if(isFreestanding)
+        if(isFreeStanding)
         {
             if(!world.getBlockMaterial(x, y - 1, z).isSolid())
             {
@@ -160,23 +149,28 @@ public class BlockSign extends BlockTileEntity
         }
         super.onNeighborBlockChange(world, x, y, z, blockId);
     }
-
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Item.sign) };
+        return new ItemStack[] { new ItemStack(Items.SIGN) };
     }
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
-        TileEntitySign tileentitysign = (TileEntitySign)world.getBlockTileEntity(x, y, z);
-        if(tileentitysign != null && tileentitysign.getIsEditable(player))
-        {
-            player.displayGUIEditSign(tileentitysign);
-            return true;
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
+        SignBlockEntity signEntity = (SignBlockEntity)world.getBlockEntity(x, y, z);
+        if (signEntity != null && player != null) {
+            if (player.getHeldItem() != null && player.getHeldItem().itemID == Items.DUST_GLOWSTONE.id && !signEntity.isGlowing()) {
+                signEntity.setGlowing(true);
+                if (player.getGamemode().consumeBlocks()) {
+                    player.getHeldItem().stackSize--;
+                }
+                return true;
+            } else if (player.getHeldItem() != null && player.getHeldItem().itemID == Items.DYE.id) {
+                return false;
+            } else if (signEntity.isEditableBy(player)) {
+                player.displayGUIEditSign(signEntity);
+                return true;
+            }
         }
         return false;
     }
-
-    private Class signEntityClass;
-    private boolean isFreestanding;
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockSlab.java b/src/main/java/net/minecraft/core/block/SlabBlock.java
similarity index 73%
rename from src/main/java/net/minecraft/core/block/BlockSlab.java
rename to src/main/java/net/minecraft/core/block/SlabBlock.java
index e04b5018a..50fb2099f 100644
--- a/src/main/java/net/minecraft/core/block/BlockSlab.java
+++ b/src/main/java/net/minecraft/core/block/SlabBlock.java
@@ -1,16 +1,17 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.MaterialColor;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlockSlab;
+import net.minecraft.core.item.block.SlabBlockItem;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
@@ -19,18 +20,18 @@ import java.util.Random;
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, IBlockAccess
 
-public class BlockSlab extends Block
+public class SlabBlock extends Block
 {
 
-    public BlockSlab(Block modelBlock, int id)
+    public SlabBlock(Block modelBlock, String namespaceId, int id)
     {
-        this(modelBlock, id, 0);
-        setBlockItem(() -> new ItemBlockSlab(this));
+        this(modelBlock, namespaceId, id, 0);
+        setBlockItem(() -> new SlabBlockItem(this));
     }
     
-    public BlockSlab(Block modelBlock, int id, int modelBlockMetadata)
+    public SlabBlock(Block modelBlock, String namespaceId, int id, int modelBlockMetadata)
     {
-    	super("slab." + modelBlock.key.substring(5), id, modelBlock.blockMaterial);
+    	super("slab." + modelBlock.key.substring(5), namespaceId, id, modelBlock.blockMaterial);
         this.modelBlock = modelBlock;
         this.modelBlockMetadata = modelBlockMetadata;
         withHardness(modelBlock.blockHardness);
@@ -56,10 +57,10 @@ public class BlockSlab extends Block
     {
         int l = world.getBlockMetadata(x, y, z) & 0x3;
         if(l == 0)
-            return AABB.getBoundingBoxFromPool(x, y, z, x +1f, y +0.5f, z +1f);
+            return AABB.getTemporaryBB(x, y, z, x +1f, y +0.5f, z +1f);
         if(l == 1)
-            return AABB.getBoundingBoxFromPool(x, y, z, x +1, y +1f, z +1f);
-        return AABB.getBoundingBoxFromPool(x, y +0.5f, z, x +1f, y +1f, z +1f);
+            return AABB.getTemporaryBB(x, y, z, x +1, y +1f, z +1f);
+        return AABB.getTemporaryBB(x, y +0.5f, z, x +1f, y +1f, z +1f);
     }
 
     @Override
@@ -83,9 +84,9 @@ public class BlockSlab extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, modelBlockMetadata, tileEntity);
+        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, modelBlockMetadata, blockEntity);
 
         if (result != null)
         {
@@ -105,9 +106,9 @@ public class BlockSlab extends Block
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
-        return modelBlock.tickRate();
+        return modelBlock.tickDelay();
     }
 
     @Override
@@ -118,7 +119,7 @@ public class BlockSlab extends Block
 
 
     @Override
-    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3d entityVelocity)
+    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3 entityVelocity)
     {
         modelBlock.handleEntityInside(world, x, y, z, entity, entityVelocity);
     }
@@ -153,7 +154,7 @@ public class BlockSlab extends Block
         modelBlock.updateTick(world, x, y, z, rand);
     }
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         return modelBlock.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
     }
@@ -164,8 +165,8 @@ public class BlockSlab extends Block
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	Direction dir = entity.getVerticalPlacementDirection(side, sideHeight);
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	Direction dir = mob.getVerticalPlacementDirection(side, sideHeight);
     	if(dir == Direction.DOWN) {
             world.setBlockMetadataWithNotify(x, y, z, 0);
     	}
@@ -175,16 +176,16 @@ public class BlockSlab extends Block
     }
     
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         onNeighborBlockChange(world, x, y, z, 0);
-        modelBlock.onBlockAdded(world, x, y, z);
+        modelBlock.onBlockPlacedByWorld(world, x, y, z);
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
-        return modelBlock.getRenderBlockPass();
+        return modelBlock.getRenderLayer();
     }
 
     @Override
@@ -200,15 +201,19 @@ public class BlockSlab extends Block
     }
     
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         modelBlock.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
-        modelBlock.randomDisplayTick(world, x, y, z, rand);
+        modelBlock.animationTick(world, x, y, z, rand);
+    }
+    @Override
+    public MaterialColor getMaterialColor(){
+        return modelBlock.getMaterialColor();
     }
 
     public Block modelBlock;
diff --git a/src/main/java/net/minecraft/core/block/BlockLayerSlate.java b/src/main/java/net/minecraft/core/block/SlateLayerBlock.java
similarity index 69%
rename from src/main/java/net/minecraft/core/block/BlockLayerSlate.java
rename to src/main/java/net/minecraft/core/block/SlateLayerBlock.java
index 8acf62348..ef6ffe989 100644
--- a/src/main/java/net/minecraft/core/block/BlockLayerSlate.java
+++ b/src/main/java/net/minecraft/core/block/SlateLayerBlock.java
@@ -1,20 +1,21 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
-public class BlockLayerSlate extends BlockLayerBase 
+
+public class SlateLayerBlock extends BaseLayerBlock
 {
-	public BlockLayerSlate(String key, int id, Material material)
+	public SlateLayerBlock(String key, String namespaceId, int id, Material material)
 	{
-		super(key, id, material);
+		super(key, namespaceId, id, material);
 	}
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/SlipperyBlock.java b/src/main/java/net/minecraft/core/block/SlipperyBlock.java
new file mode 100644
index 000000000..804b2880b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/SlipperyBlock.java
@@ -0,0 +1,11 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+
+public class SlipperyBlock extends Block {
+
+    public SlipperyBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material);
+        friction = 0.98F;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockSnow.java b/src/main/java/net/minecraft/core/block/SnowBlock.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/BlockSnow.java
rename to src/main/java/net/minecraft/core/block/SnowBlock.java
index 773f4df29..9eaca196e 100644
--- a/src/main/java/net/minecraft/core/block/BlockSnow.java
+++ b/src/main/java/net/minecraft/core/block/SnowBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
@@ -14,12 +14,12 @@ import java.util.Random;
 //            Block, Material, Item, EnumSkyBlock, 
 //            World
 
-public class BlockSnow extends Block
+public class SnowBlock extends Block
 {
 
-	public BlockSnow(String key, int id)
+	public SnowBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.snow);
+        super(key, namespaceId, id, Material.snow);
         setTicking(true);
     }
 
@@ -39,7 +39,7 @@ public class BlockSnow extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -47,7 +47,7 @@ public class BlockSnow extends Block
             case SILK_TOUCH:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Item.ammoSnowball, 4) };
+                return new ItemStack[] { new ItemStack(Items.AMMO_SNOWBALL, 4) };
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockLayerSnow.java b/src/main/java/net/minecraft/core/block/SnowLayerBlock.java
similarity index 84%
rename from src/main/java/net/minecraft/core/block/BlockLayerSnow.java
rename to src/main/java/net/minecraft/core/block/SnowLayerBlock.java
index 4dda1042c..e03309eb7 100644
--- a/src/main/java/net/minecraft/core/block/BlockLayerSnow.java
+++ b/src/main/java/net/minecraft/core/block/SnowLayerBlock.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
@@ -14,15 +14,15 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, AxisAlignedBB, 
-//            IBlockAccess, Item, EntityItem, ItemStack, 
-//            StatList, EntityPlayer, EnumSkyBlock
+//            IBlockAccess, Item, ItemEntity, ItemStack,
+//            StatList, Player, EnumSkyBlock
 
-public class BlockLayerSnow extends BlockLayerBase
+public class SnowLayerBlock extends BaseLayerBlock
 {
 
-	public BlockLayerSnow(String key, int id, Material material)
+	public SnowLayerBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
         setTicking(true);
     }
@@ -32,7 +32,7 @@ public class BlockLayerSnow extends BlockLayerBase
     {
         int l = world.getBlockMetadata(x, y, z) & 7;
         float f = (float)(2 * (1 + l)) / 16F;
-        return AABB.getBoundingBoxFromPool((double) x + minX, (double) y + minY, (double) z + minZ, (double) x + maxX, (float) y + f - 0.125F, (double) z + maxZ);
+        return AABB.getTemporaryBB((double) x + minX, (double) y + minY, (double) z + minZ, (double) x + maxX, (float) y + f - 0.125F, (double) z + maxZ);
     }
 
     public void accumulate(World world, int x, int y, int z)
@@ -57,7 +57,7 @@ public class BlockLayerSnow extends BlockLayerBase
 	public boolean canPlaceBlockAt(World world, int x, int y, int z)
     {
         int l = world.getBlockId(x, y - 1, z);
-        if(l == 0 || (!Block.blocksList[l].isSolidRender() && !(Block.blocksList[l] instanceof BlockLeavesBase)))
+        if(l == 0 || (!Block.blocksList[l].isSolidRender() && !(Block.blocksList[l] instanceof BaseLeavesBlock)))
         {
         	return false;
         }
@@ -88,7 +88,7 @@ public class BlockLayerSnow extends BlockLayerBase
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -98,7 +98,7 @@ public class BlockLayerSnow extends BlockLayerBase
                 return new ItemStack[] { new ItemStack(this) };
             case EXPLOSION:
             case PROPER_TOOL:
-                return new ItemStack[] { new ItemStack(Item.ammoSnowball, meta + 1) };
+                return new ItemStack[] { new ItemStack(Items.AMMO_SNOWBALL, meta + 1) };
             default:
                 return null;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSoulSand.java b/src/main/java/net/minecraft/core/block/SoulSandBlock.java
similarity index 74%
rename from src/main/java/net/minecraft/core/block/BlockSoulSand.java
rename to src/main/java/net/minecraft/core/block/SoulSandBlock.java
index 40419ab71..756f9b62c 100644
--- a/src/main/java/net/minecraft/core/block/BlockSoulSand.java
+++ b/src/main/java/net/minecraft/core/block/SoulSandBlock.java
@@ -11,19 +11,19 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockSoulSand extends Block
+public class SoulSandBlock extends Block
 {
 
-    public BlockSoulSand(String key, int id)
+    public SoulSandBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.sand);
+        super(key, namespaceId, id, Material.sand);
     }
 
     @Override
 	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
         float f = 0.125F;
-        return AABB.getBoundingBoxFromPool(x, y, z, x + 1, (float)(y + 1) - f, z + 1);
+        return AABB.getTemporaryBB(x, y, z, x + 1, (float)(y + 1) - f, z + 1);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockSpikes.java b/src/main/java/net/minecraft/core/block/SpikesBlock.java
similarity index 73%
rename from src/main/java/net/minecraft/core/block/BlockSpikes.java
rename to src/main/java/net/minecraft/core/block/SpikesBlock.java
index ac1610170..b9446e445 100644
--- a/src/main/java/net/minecraft/core/block/BlockSpikes.java
+++ b/src/main/java/net/minecraft/core/block/SpikesBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
@@ -18,24 +18,24 @@ import net.minecraft.core.world.WorldSource;
 //            World, AxisAlignedBB
 
 //TODO make it not extend blockWeb
-public class BlockSpikes extends BlockCobweb
+public class SpikesBlock extends CobwebBlock
 {
 
-    public BlockSpikes(String key, int id, Material mat)
+    public SpikesBlock(String key, String namespaceId, int id, Material mat)
     {
-        super(key, id, mat);
+        super(key, namespaceId, id, mat);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Block.spikes) };
+        return new ItemStack[] { new ItemStack(Blocks.SPIKES) };
     }
 
     @Override
 	public boolean canPlaceBlockAt(World world, int x, int y, int z)
     {
-        return world.canPlaceOnSurfaceOfBlock(x, y -1, z) || world.getBlockId(x, y - 1, z) == Block.mobspawner.id;
+        return world.canPlaceOnSurfaceOfBlock(x, y -1, z) || world.getBlockId(x, y - 1, z) == Blocks.MOBSPAWNER.id;
     }
 
 	@Override
@@ -44,7 +44,7 @@ public class BlockSpikes extends BlockCobweb
 			return;
 		}
 		
-		boolean destroy = !world.canPlaceOnSurfaceOfBlock(x, y - 1, z) && world.getBlockId(x, y - 1, z) != Block.mesh.id && world.getBlockId(x, y - 1, z) != Block.mobspawner.id;
+		boolean destroy = !world.canPlaceOnSurfaceOfBlock(x, y - 1, z) && world.getBlockId(x, y - 1, z) != Blocks.MESH.id && world.getBlockId(x, y - 1, z) != Blocks.MOBSPAWNER.id;
 		if(destroy) {
 			dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, world.getBlockMetadata(x, y, z), null);
 			world.setBlockWithNotify(x, y, z, 0);
@@ -70,7 +70,7 @@ public class BlockSpikes extends BlockCobweb
 	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {	
     	float f = 1.0f / 16.0f;
-        return AABB.getBoundingBoxFromPool(x + f, y, z + f, x + 1 - f, y + 0.1875F, z + 1 - f);
+        return AABB.getTemporaryBB(x + f, y, z + f, x + 1 - f, y + 0.1875F, z + 1 - f);
     }
 
     @Override
@@ -78,9 +78,9 @@ public class BlockSpikes extends BlockCobweb
     {
         int metaData = world.getBlockMetadata(x, y, z);
         if(isSpikesUp(metaData)) {
-            if (entity instanceof EntityLiving) {
+            if (entity instanceof Mob) {
                 if(entity.fallDistance > 1.5F) {
-                    entity.hurt(null, (MathHelper.floor_double(entity.fallDistance) * 2) + 1, DamageType.COMBAT);
+                    entity.hurt(null, (MathHelper.floor(entity.fallDistance) * 2) + 1, DamageType.COMBAT);
                     entity.stuck = true;
                 } else if (entity.isWalking){
                     entity.hurt(null, 1, DamageType.COMBAT);
@@ -91,7 +91,7 @@ public class BlockSpikes extends BlockCobweb
 
     @Override
     public boolean collidesWithEntity(Entity entity, World world, int x, int y, int z) {
-        return !(entity instanceof EntityItem);
+        return !(entity instanceof ItemEntity);
     }
     
     public static boolean isSpikesUp(int i)
diff --git a/src/main/java/net/minecraft/core/block/BlockSpinifex.java b/src/main/java/net/minecraft/core/block/SpinifexBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockSpinifex.java
rename to src/main/java/net/minecraft/core/block/SpinifexBlock.java
index 28b14cf8d..c01be71cb 100644
--- a/src/main/java/net/minecraft/core/block/BlockSpinifex.java
+++ b/src/main/java/net/minecraft/core/block/SpinifexBlock.java
@@ -1,26 +1,25 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, Block
+//            FlowerBlock, Block
 
-public class BlockSpinifex extends BlockFlower
+public class SpinifexBlock extends FlowerBlock
 {
 
-	public BlockSpinifex(String key, int id)
+	public SpinifexBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         float f = 0.4F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.8F, 0.5F + f);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockSponge.java b/src/main/java/net/minecraft/core/block/SpongeBlock.java
similarity index 88%
rename from src/main/java/net/minecraft/core/block/BlockSponge.java
rename to src/main/java/net/minecraft/core/block/SpongeBlock.java
index 01c82464e..6507c428d 100644
--- a/src/main/java/net/minecraft/core/block/BlockSponge.java
+++ b/src/main/java/net/minecraft/core/block/SpongeBlock.java
@@ -10,22 +10,22 @@ import net.minecraft.core.world.Dimension;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-public class BlockSponge extends Block
+public class SpongeBlock extends Block
 {
 
-	public BlockSponge(String key, int id, boolean isWet)
+	public SpongeBlock(String key, String namespaceId, int id, boolean isWet)
     {
-        super(key, id, Material.sponge);
+        super(key, namespaceId, id, Material.sponge);
         this.isWet = isWet;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         byte byte0 = 2;
         if(world.dimension.id == Dimension.nether.id && isWet){
-            world.setBlockWithNotify(x, y, z, Block.spongeDry.id);
+            world.setBlockWithNotify(x, y, z, Blocks.SPONGE_DRY.id);
             world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x + 0.5D, y + 0.5D, z + 0.5D, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
             for(int l = 0; l < 8; l++)
             {
diff --git a/src/main/java/net/minecraft/core/block/BlockStairs.java b/src/main/java/net/minecraft/core/block/StairsBlock.java
similarity index 84%
rename from src/main/java/net/minecraft/core/block/BlockStairs.java
rename to src/main/java/net/minecraft/core/block/StairsBlock.java
index d0ebaaf7c..c4bf69798 100644
--- a/src/main/java/net/minecraft/core/block/BlockStairs.java
+++ b/src/main/java/net/minecraft/core/block/StairsBlock.java
@@ -3,11 +3,12 @@ package net.minecraft.core.block;
 import java.util.ArrayList;
 import java.util.Random;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.Vec3;
 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.item.ItemStack;
 import net.minecraft.core.util.helper.Direction;
@@ -17,11 +18,11 @@ import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            Block, World, EntityLiving, MathHelper, 
-//            IBlockAccess, AxisAlignedBB, EntityPlayer, Entity, 
+//            Block, World, Mob, MathHelper,
+//            IBlockAccess, AxisAlignedBB, Player, Entity,
 //            Vec3D
 
-public class BlockStairs extends Block
+public class StairsBlock extends Block
 {
 //    private static final Map<Integer, BoundingVolume> selectionVolumes = new HashMap<>();
 //
@@ -84,9 +85,9 @@ public class BlockStairs extends Block
 //        selectionVolumes.put(0b1011, vol);
 //    }
 
-	public BlockStairs(Block block, int id)
+	public StairsBlock(Block block, String namespaceId, int id)
     {
-        super("stairs." + block.key.substring(5), id, block.blockMaterial);
+        super("stairs." + block.key.substring(5), namespaceId, id, block.blockMaterial);
         modelBlock = block;
         withHardness(block.blockHardness);
         withBlastResistance(block.blastResistance / 3F);
@@ -112,7 +113,7 @@ public class BlockStairs extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -161,9 +162,9 @@ public class BlockStairs extends Block
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, 0, tileEntity);
+        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, 0, blockEntity);
 
         if (result != null)
         {
@@ -181,13 +182,13 @@ public class BlockStairs extends Block
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
-        modelBlock.randomDisplayTick(world, x, y, z, rand);
+        modelBlock.animationTick(world, x, y, z, rand);
     }
 
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
         modelBlock.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
@@ -205,15 +206,15 @@ public class BlockStairs extends Block
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
-        return modelBlock.getRenderBlockPass();
+        return modelBlock.getRenderLayer();
     }
 
     @Override
-    public int tickRate()
+    public int tickDelay()
     {
-        return modelBlock.tickRate();
+        return modelBlock.tickDelay();
     }
 
     @Override
@@ -230,7 +231,7 @@ public class BlockStairs extends Block
 //    }
 
     @Override
-    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3d entityVelocity)
+    public void handleEntityInside(World world, int x, int y, int z, Entity entity, Vec3 entityVelocity)
     {
         modelBlock.handleEntityInside(world, x, y, z, entity, entityVelocity);
     }
@@ -254,10 +255,10 @@ public class BlockStairs extends Block
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         onNeighborBlockChange(world, x, y, z, 0);
-        modelBlock.onBlockAdded(world, x, y, z);
+        modelBlock.onBlockPlacedByWorld(world, x, y, z);
     }
 
     @Override
@@ -273,7 +274,7 @@ public class BlockStairs extends Block
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         return modelBlock.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
     }
@@ -285,18 +286,18 @@ public class BlockStairs extends Block
     }
     
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
 //    	System.out.println("Placed Side: "+side+" Height: "+sideHeight);
     	
         int meta = world.getBlockMetadata(x, y, z) & 0xF0;
 
-        Direction hRotation = entity.getHorizontalPlacementDirection(side).getOpposite();
+        Direction hRotation = mob.getHorizontalPlacementDirection(side).getOpposite();
         if(hRotation == Direction.NORTH) meta |= 0b0010;
         if(hRotation == Direction.EAST) meta |= 0b0001;
         if(hRotation == Direction.SOUTH) meta |= 0b0011;
         if(hRotation == Direction.WEST) meta |= 0b0000;
 
-        Direction vRotation = entity.getVerticalPlacementDirection(side, sideHeight);
+        Direction vRotation = mob.getVerticalPlacementDirection(side, sideHeight);
         if (vRotation == Direction.DOWN) meta |= 0b0000;
         if (vRotation == Direction.UP) meta |= 0b1000;
 
@@ -308,5 +309,9 @@ public class BlockStairs extends Block
     	return 0.0f;
     }
 
+    @Override
+    public MaterialColor getMaterialColor(){
+        return modelBlock.getMaterialColor();
+    }
     public Block modelBlock;
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockFluidStill.java b/src/main/java/net/minecraft/core/block/StillFluidBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockFluidStill.java
rename to src/main/java/net/minecraft/core/block/StillFluidBlock.java
index 49a414f84..3b8b57696 100644
--- a/src/main/java/net/minecraft/core/block/BlockFluidStill.java
+++ b/src/main/java/net/minecraft/core/block/StillFluidBlock.java
@@ -5,17 +5,12 @@ import java.util.Random;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            BlockFluid, Material, World, Block, 
-//            BlockFire
-
-public class BlockFluidStill extends BlockFluid
+public class StillFluidBlock extends FluidBlock
 {
 
-	public BlockFluidStill(String key, int id, Material material)
+	public StillFluidBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         setTicking(false);
         if(material == Material.lava)
         {
@@ -30,17 +25,17 @@ public class BlockFluidStill extends BlockFluid
         if (blockId == Side.TOP.getId()) return;
         if(world.getBlockId(x, y, z) == id)
         {
-            func_30004_j(world, x, y, z);
+            setFlowing(world, x, y, z);
         }
     }
 
-    private void func_30004_j(World world, int i, int j, int k)
+    private void setFlowing(World world, int i, int j, int k)
     {
         int l = world.getBlockMetadata(i, j, k);
         world.editingBlocks = true;
         world.setBlockAndMetadata(i, j, k, id - 1, l);
         world.markBlocksDirty(i, j, k, i, j, k);
-        world.scheduleBlockUpdate(i, j, k, id - 1, tickRate());
+        world.scheduleBlockUpdate(i, j, k, id - 1, tickDelay());
         world.editingBlocks = false;
     }
 
@@ -55,17 +50,17 @@ public class BlockFluidStill extends BlockFluid
                 x += rand.nextInt(3) - 1;
                 y++;
                 z += rand.nextInt(3) - 1;
-                int j1 = world.getBlockId(x, y, z);
-                if(j1 == 0)
+                int blockId = world.getBlockId(x, y, z);
+                if(blockId == 0)
                 {
-                    if(func_301_k(world, x - 1, y, z) || func_301_k(world, x + 1, y, z) || func_301_k(world, x, y, z - 1) || func_301_k(world, x, y, z + 1) || func_301_k(world, x, y - 1, z) || func_301_k(world, x, y + 1, z))
+                    if(isFlammable(world, x - 1, y, z) || isFlammable(world, x + 1, y, z) || isFlammable(world, x, y, z - 1) || isFlammable(world, x, y, z + 1) || isFlammable(world, x, y - 1, z) || isFlammable(world, x, y + 1, z))
                     {
-                        world.setBlockWithNotify(x, y, z, Block.fire.id);
+                        world.setBlockWithNotify(x, y, z, Blocks.FIRE.id);
                         return;
                     }
                     continue;
                 }
-                if(Block.blocksList[j1].blockMaterial.blocksMotion())
+                if(Block.blocksList[blockId].blockMaterial.blocksMotion())
                 {
                     return;
                 }
@@ -74,8 +69,8 @@ public class BlockFluidStill extends BlockFluid
         }
     }
 
-    private boolean func_301_k(World world, int i, int j, int k)
+    private boolean isFlammable(World world, int x, int y, int z)
     {
-        return world.getBlockMaterial(i, j, k).isFlammable();
+        return FireBlock.canBurn(world, x, y, z);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockStone.java b/src/main/java/net/minecraft/core/block/StoneBlock.java
similarity index 57%
rename from src/main/java/net/minecraft/core/block/BlockStone.java
rename to src/main/java/net/minecraft/core/block/StoneBlock.java
index a6495a688..8b005717c 100644
--- a/src/main/java/net/minecraft/core/block/BlockStone.java
+++ b/src/main/java/net/minecraft/core/block/StoneBlock.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
@@ -13,13 +13,13 @@ import net.minecraft.core.world.chunk.Chunk;
 import java.util.Random;
 import java.util.function.Supplier;
 
-public class BlockStone extends Block {
+public class StoneBlock extends Block {
 	
 	public Block cobblestone;
 	private final Supplier<Block> blockSupplier;
-	
-	public BlockStone(String key, int id, Supplier<Block> cobbleStoneSupplier) {
-		super(key, id, Material.stone);
+
+	public StoneBlock(String key, String namespaceId, int id, Supplier<Block> cobbleStoneSupplier, Material material) {
+		super(key, namespaceId, id, material);
 		this.blockSupplier = cobbleStoneSupplier;
 	}
 
@@ -28,18 +28,18 @@ public class BlockStone extends Block {
 		this.cobblestone = blockSupplier.get();
 	}
 	@Override
-	public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta, TileEntity tileEntity)
+	public void harvestBlock(World world, Player player, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
-		super.harvestBlock(world, player, x, y, z, meta, tileEntity);
-		if(player.getStat(StatList.mineBlockStatArray[Block.basalt.id]) > 0
-				&& player.getStat(StatList.mineBlockStatArray[Block.limestone.id]) > 0
-				&& player.getStat(StatList.mineBlockStatArray[Block.granite.id]) > 0) {
-			player.triggerAchievement(AchievementList.COLLECT_STONE);
+		super.harvestBlock(world, player, x, y, z, meta, blockEntity);
+		if(player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0
+				&& player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0
+				&& player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0) {
+			player.triggerAchievement(Achievements.COLLECT_STONE);
 		}
 	}
 
 	@Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
+	public void animationTick(World world, int x, int y, int z, Random rand) {
 
         Chunk chunk = world.getChunkFromBlockCoords(x, z);
 		if (y <= 32 && chunk.getChunkRandom(0x3ad8025fL).nextInt(10) == 0 && world.getBlockId(x, y - 1, z) == 0) {
@@ -49,7 +49,7 @@ public class BlockStone extends Block {
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		switch (dropCause)
 		{
diff --git a/src/main/java/net/minecraft/core/block/BlockSugarcane.java b/src/main/java/net/minecraft/core/block/SugarcaneBlock.java
similarity index 82%
rename from src/main/java/net/minecraft/core/block/BlockSugarcane.java
rename to src/main/java/net/minecraft/core/block/SugarcaneBlock.java
index a9f0517e6..bcadba290 100644
--- a/src/main/java/net/minecraft/core/block/BlockSugarcane.java
+++ b/src/main/java/net/minecraft/core/block/SugarcaneBlock.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
@@ -16,15 +16,15 @@ import net.minecraft.core.world.WorldSource;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            Block, Material, World, BlockGrass, 
+//            Block, Material, World, GrassBlock,
 //            Item, AxisAlignedBB
 
-public class BlockSugarcane extends Block implements IBonemealable
+public class SugarcaneBlock extends Block implements IBonemealable
 {
 
-	public BlockSugarcane(String key, int id)
+	public SugarcaneBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.plant);
+        super(key, namespaceId, id, Material.plant);
         float f = 0.375F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f);
         setTicking(true);
@@ -107,9 +107,9 @@ public class BlockSugarcane extends Block implements IBonemealable
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
-        return new ItemStack[] { new ItemStack(Item.sugarcane) };
+        return new ItemStack[] { new ItemStack(Items.SUGARCANE) };
     }
 
     @Override
@@ -131,16 +131,16 @@ public class BlockSugarcane extends Block implements IBonemealable
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(!world.isClientSide)
         {
-            ((BlockSugarcane)Block.blocksList[id]).growReedOnTop(world, blockX, blockY, blockZ);
+            ((SugarcaneBlock)Block.blocksList[id]).growReedOnTop(world, blockX, blockY, blockZ);
             if (entityplayer.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
diff --git a/src/main/java/net/minecraft/core/block/BlockTNT.java b/src/main/java/net/minecraft/core/block/TNTBlock.java
similarity index 60%
rename from src/main/java/net/minecraft/core/block/BlockTNT.java
rename to src/main/java/net/minecraft/core/block/TNTBlock.java
index 7001b63cc..28509f42d 100644
--- a/src/main/java/net/minecraft/core/block/BlockTNT.java
+++ b/src/main/java/net/minecraft/core/block/TNTBlock.java
@@ -1,25 +1,24 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.TNTPrimedEntity;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.ItemFirestriker;
+import net.minecraft.core.item.FireStrikerItem;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
-public class BlockTNT extends Block {
+public class TNTBlock extends Block {
 
-	public BlockTNT(String key, int id) {
-		super(key, id, Material.explosive);
+	public TNTBlock(String key, String namespaceId, int id) {
+		super(key, namespaceId, id, Material.explosive);
 	}
 
 	@Override
-	public void onBlockAdded(World world, int x, int y, int z) {
-		super.onBlockAdded(world, x, y, z);
+	public void onBlockPlacedByWorld(World world, int x, int y, int z) {
+		super.onBlockPlacedByWorld(world, x, y, z);
 		if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
 			ignite(world, x, y, z, true);
 		}
@@ -27,13 +26,13 @@ public class BlockTNT extends Block {
 
 	@Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
-		if (blockId > 0 && Block.blocksList[blockId].canProvidePower() && world.isBlockIndirectlyGettingPowered(x, y, z)) {
+		if (blockId > 0 && Block.blocksList[blockId].isSignalSource() && world.isBlockIndirectlyGettingPowered(x, y, z)) {
 			ignite(world, x, y, z, true);
 		}
 	}
 
 	@Override
-	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
 	{
 		if (dropCause == EnumDropCause.EXPLOSION)
 		{
@@ -44,7 +43,7 @@ public class BlockTNT extends Block {
 
 	@Override
 	public void onBlockDestroyedByExplosion(World world, int x, int y, int z) {
-		EntityTNT entity = new EntityTNT(world, x + 0.5F, y + 0.5F, z + 0.5F);
+		TNTPrimedEntity entity = new TNTPrimedEntity(world, x + 0.5F, y + 0.5F, z + 0.5F);
 		entity.fuse = world.rand.nextInt(entity.fuse / 4) + entity.fuse / 8;
 		world.entityJoinedWorld(entity);
 	}
@@ -53,33 +52,33 @@ public class BlockTNT extends Block {
 		ignite(world, x, y, z, null, sound);
 	}
 
-	public void ignite(World world, int x, int y, int z, EntityPlayer player, boolean sound) {
+	public void ignite(World world, int x, int y, int z, Player player, boolean sound) {
 		if (world.isClientSide) {
-			if (player != null && player.inventory.getCurrentItem() != null && (player.inventory.getCurrentItem().getItem() instanceof ItemFirestriker)) {
+			if (player != null && player.inventory.getCurrentItem() != null && (player.inventory.getCurrentItem().getItem() instanceof FireStrikerItem)) {
 				player.inventory.getCurrentItem().damageItem(1, player);
 			}
 			return;
 		}
 		world.setBlockWithNotify(x, y, z, 0);
-		EntityTNT e = new EntityTNT(world, x + 0.5F, y + 0.5F, z + 0.5F);
+		TNTPrimedEntity e = new TNTPrimedEntity(world, x + 0.5F, y + 0.5F, z + 0.5F);
 		world.entityJoinedWorld(e);
 		world.playSoundAtEntity(null, e, "random.fuse", 1.0F, 1.0F);
-		if (player != null && player.inventory.getCurrentItem() != null && (player.inventory.getCurrentItem().getItem() instanceof ItemFirestriker)) {
+		if (player != null && player.inventory.getCurrentItem() != null && (player.inventory.getCurrentItem().getItem() instanceof FireStrikerItem)) {
 			player.inventory.getCurrentItem().damageItem(1, player);
 		}
 	}
 
 	@Override
-	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
-		if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemFirestriker) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit) {
+		if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof FireStrikerItem) {
 			world.setBlockMetadata(x, y, z, 1);
 		}
 		super.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
 	}
 
 	@Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
-		if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() instanceof ItemFirestriker) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
+		if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() instanceof FireStrikerItem) {
 			ignite(world, x, y, z, player, true);
 			return true;
 		}
diff --git a/src/main/java/net/minecraft/core/block/BlockTallGrass.java b/src/main/java/net/minecraft/core/block/TallGrassBlock.java
similarity index 63%
rename from src/main/java/net/minecraft/core/block/BlockTallGrass.java
rename to src/main/java/net/minecraft/core/block/TallGrassBlock.java
index 39fcc8a28..6b7d8c44f 100644
--- a/src/main/java/net/minecraft/core/block/BlockTallGrass.java
+++ b/src/main/java/net/minecraft/core/block/TallGrassBlock.java
@@ -1,34 +1,37 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.MaterialColor;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            BlockFlower, IBlockAccess, WorldChunkManager, ColorizerGrass, 
+//            FlowerBlock, IBlockAccess, WorldChunkManager, ColorizerGrass,
 //            Item
 
-public class BlockTallGrass extends BlockFlower
+public class TallGrassBlock extends FlowerBlock
 {
-	public BlockTallGrass(String key, int id)
+	public TallGrassBlock(String key, String namespaceId, int id)
     {
-        super(key, id);
+        super(key, namespaceId, id);
         float f = 0.4F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.8F, 0.5F + f);
+        withOverrideColor(MaterialColor.grass);
     }
 
     @Override
     protected boolean canThisPlantGrowOnThisBlockID(int i) {
     	Block block = Block.getBlock(i);
-    	if(block != null && block instanceof BlockMoss) {
+    	if(block != null && block instanceof MossBlock) {
     		return true;
     	}
     	return super.canThisPlantGrowOnThisBlockID(i);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockFenceThin.java b/src/main/java/net/minecraft/core/block/ThinFenceBlock.java
similarity index 78%
rename from src/main/java/net/minecraft/core/block/BlockFenceThin.java
rename to src/main/java/net/minecraft/core/block/ThinFenceBlock.java
index ae287f6b4..7eb18be65 100644
--- a/src/main/java/net/minecraft/core/block/BlockFenceThin.java
+++ b/src/main/java/net/minecraft/core/block/ThinFenceBlock.java
@@ -4,11 +4,11 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
-public abstract class BlockFenceThin extends Block
+public abstract class ThinFenceBlock extends Block
 {
-    public BlockFenceThin(String key, int id, Material material)
+    public ThinFenceBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
@@ -24,7 +24,7 @@ public abstract class BlockFenceThin extends Block
         boolean connectXNeg = canConnectTo(world, x - 1, y, z);
         boolean connectZPos = canConnectTo(world, x, y, z + 1);
         boolean connectZNeg = canConnectTo(world, x, y, z - 1);
-        return AABB.getBoundingBoxFromPool(x + (connectXNeg ? 0.0f : 0.375f), y, z + (connectZNeg ? 0.0f : 0.375f), x + 1 - (connectXPos ? 0.0f : 0.375f), (float) y + 1, z + 1 - (connectZPos ? 0.0f : 0.375f));
+        return AABB.getTemporaryBB(x + (connectXNeg ? 0.0f : 0.375f), y, z + (connectZNeg ? 0.0f : 0.375f), x + 1 - (connectXPos ? 0.0f : 0.375f), (float) y + 1, z + 1 - (connectZPos ? 0.0f : 0.375f));
     }
 
     @Override
@@ -52,7 +52,7 @@ public abstract class BlockFenceThin extends Block
     }
 
     @Override
-    public boolean renderAsNormalBlock()
+    public boolean isCubeShaped()
     {
         return false;
     }
diff --git a/src/main/java/net/minecraft/core/block/ThornLeavesBlock.java b/src/main/java/net/minecraft/core/block/ThornLeavesBlock.java
new file mode 100644
index 000000000..4ca86074d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/ThornLeavesBlock.java
@@ -0,0 +1,17 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+
+public class ThornLeavesBlock extends BaseLeavesBlock
+{
+    public ThornLeavesBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.leaves);
+    }
+    @Override
+    protected Block getSapling()
+    {
+        return Blocks.SAPLING_THORN;
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockGlassTinted.java b/src/main/java/net/minecraft/core/block/TintedGlassBlock.java
similarity index 70%
rename from src/main/java/net/minecraft/core/block/BlockGlassTinted.java
rename to src/main/java/net/minecraft/core/block/TintedGlassBlock.java
index ca92ffc2d..1fa8b99e3 100644
--- a/src/main/java/net/minecraft/core/block/BlockGlassTinted.java
+++ b/src/main/java/net/minecraft/core/block/TintedGlassBlock.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
@@ -9,12 +9,12 @@ import net.minecraft.core.world.World;
 // Referenced classes of package net.minecraft.src:
 //            BlockBreakable, Material
 
-public class BlockGlassTinted extends BlockGlass
+public class TintedGlassBlock extends GlassBlock
 {
 
-    public BlockGlassTinted(String key, int id)
+    public TintedGlassBlock(String key, String namespaceID, int id)
     {
-        super(key, id, Material.glass);
+        super(key, namespaceID, id, Material.glass);
     }
 
 
@@ -25,13 +25,13 @@ public class BlockGlassTinted extends BlockGlass
     }
 
     @Override
-    public int getRenderBlockPass()
+    public int getRenderLayer()
     {
         return 1;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockTorch.java b/src/main/java/net/minecraft/core/block/TorchBlock.java
similarity index 90%
rename from src/main/java/net/minecraft/core/block/BlockTorch.java
rename to src/main/java/net/minecraft/core/block/TorchBlock.java
index 248a1700a..9a6a29bcf 100644
--- a/src/main/java/net/minecraft/core/block/BlockTorch.java
+++ b/src/main/java/net/minecraft/core/block/TorchBlock.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.HitResult;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
@@ -16,12 +16,12 @@ import java.util.Random;
 //            Block, Material, World, AxisAlignedBB, 
 //            Vec3D, MovingObjectPosition
 
-public class BlockTorch extends Block
+public class TorchBlock extends Block
 {
 
-	public BlockTorch(String key, int id)
+	public TorchBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.decoration);
+        super(key, namespaceId, id, Material.decoration);
         setTicking(true);
     }
 
@@ -38,7 +38,7 @@ public class BlockTorch extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -46,7 +46,7 @@ public class BlockTorch extends Block
     private boolean canPlaceOnTop(World world, int x, int y, int z)
     {
     	int id = world.getBlockId(x, y, z);
-        return world.canPlaceOnSurfaceOfBlock(x, y, z) || id == Block.fencePlanksOak.id || id == Block.fencePlanksOakPainted.id;
+        return world.canPlaceOnSurfaceOfBlock(x, y, z) || id == Blocks.FENCE_PLANKS_OAK.id || id == Blocks.FENCE_PLANKS_OAK_PAINTED.id;
     }
 
     @Override
@@ -72,7 +72,7 @@ public class BlockTorch extends Block
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
     	int l = side.getId();
         int i1 = world.getBlockMetadata(x, y, z);
         if(l == 1 && canPlaceOnTop(world, x, y - 1, z))
@@ -104,12 +104,12 @@ public class BlockTorch extends Block
         super.updateTick(world, x, y, z, rand);
         if(world.getBlockMetadata(x, y, z) == 0)
         {
-            onBlockAdded(world, x, y, z);
+            onBlockPlacedByWorld(world, x, y, z);
         }
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
         if(world.isBlockNormalCube(x - 1, y, z))
         {
@@ -183,7 +183,7 @@ public class BlockTorch extends Block
     }
 
     @Override
-    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3d start, Vec3d end)
+    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end)
     {
         int l = world.getBlockMetadata(x, y, z) & 7;
         float f = 0.15F;
@@ -211,7 +211,7 @@ public class BlockTorch extends Block
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         int l = world.getBlockMetadata(x, y, z);
         double xPos = (double) x + 0.5D;
diff --git a/src/main/java/net/minecraft/core/block/BlockTransparent.java b/src/main/java/net/minecraft/core/block/TransparentBlock.java
similarity index 50%
rename from src/main/java/net/minecraft/core/block/BlockTransparent.java
rename to src/main/java/net/minecraft/core/block/TransparentBlock.java
index 92db3ee62..85ee513ca 100644
--- a/src/main/java/net/minecraft/core/block/BlockTransparent.java
+++ b/src/main/java/net/minecraft/core/block/TransparentBlock.java
@@ -2,12 +2,12 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
 
-public abstract class BlockTransparent extends Block
+public abstract class TransparentBlock extends Block
 {
 
-	public BlockTransparent(String key, int id, Material material)
+	public TransparentBlock(String key, String namespaceId, int id, Material material)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockTrapDoor.java b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
similarity index 81%
rename from src/main/java/net/minecraft/core/block/BlockTrapDoor.java
rename to src/main/java/net/minecraft/core/block/TrapDoorBlock.java
index a14558983..72e5b8adf 100644
--- a/src/main/java/net/minecraft/core/block/BlockTrapDoor.java
+++ b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
@@ -1,32 +1,32 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.HitResult;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, IBlockAccess, World, 
-//            AxisAlignedBB, EntityPlayer, Vec3D, MovingObjectPosition
+//            AxisAlignedBB, Player, Vec3D, MovingObjectPosition
 
-public class BlockTrapDoor extends Block
+public class TrapDoorBlock extends Block
 {
 
 	
 	private boolean isIron;
 	
-	public BlockTrapDoor(String key, int id, Material material, boolean isIron)
+	public TrapDoorBlock(String key, String namespaceId, int id, Material material, boolean isIron)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         float f = 0.5F;
         float f1 = 1.0F;
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f);
@@ -40,7 +40,7 @@ public class BlockTrapDoor extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -97,14 +97,14 @@ public class BlockTrapDoor extends Block
     }
     
     @Override
-    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
+    public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
     		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if (blockMaterial != Material.metal) {
             int l = world.getBlockMetadata(x, y, z);
@@ -121,7 +121,7 @@ public class BlockTrapDoor extends Block
 			return;
 		}
 
-		if(isIron || blockId > 0 && Block.getBlock(blockId).canProvidePower()) {
+		if(isIron || blockId > 0 && Block.getBlock(blockId).isSignalSource()) {
 			int meta = world.getBlockMetadata(x, y, z);
 			boolean isOpened = isTrapdoorOpen(meta);
 			boolean isPowered = world.isBlockIndirectlyGettingPowered(x, y, z);
@@ -134,16 +134,16 @@ public class BlockTrapDoor extends Block
 	}
 
     @Override
-    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3d start, Vec3d end)
+    public HitResult collisionRayTrace(World world, int x, int y, int z, Vec3 start, Vec3 end)
     {
         setBlockBoundsBasedOnState(world, x, y, z);
         return super.collisionRayTrace(world, x, y, z, start, end);
     }
     
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	int meta = getMetaForDirection(entity.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
-    	if(entity.getVerticalPlacementDirection(side, sideHeight) == Direction.UP) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	int meta = getMetaForDirection(mob.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
+    	if(mob.getVerticalPlacementDirection(side, sideHeight) == Direction.UP) {
     		meta |= 8;
     	}
     	world.setBlockMetadata(x, y, z, meta);
@@ -153,8 +153,8 @@ public class BlockTrapDoor extends Block
     public boolean isClimbable(World world, int x, int y, int z) {
     	Block block = world.getBlock(x, y - 1, z);
     	int meta = world.getBlockMetadata(x, y, z);
-    	if(isTrapdoorOpen(meta) && block instanceof BlockLadder) {
-    		BlockLadder ladder = (BlockLadder) block;
+    	if(isTrapdoorOpen(meta) && block instanceof LadderBlock) {
+    		LadderBlock ladder = (LadderBlock) block;
     		Side ladderSide = ladder.getSideFromMeta(world.getBlockMetadata(x, y - 1, z));
     		Direction trapdoorDirection = getDirectionForMeta(meta);
     		return ladderSide.getDirection().getOpposite() == trapdoorDirection;
diff --git a/src/main/java/net/minecraft/core/block/BlockTrommel.java b/src/main/java/net/minecraft/core/block/TrommelBlock.java
similarity index 68%
rename from src/main/java/net/minecraft/core/block/BlockTrommel.java
rename to src/main/java/net/minecraft/core/block/TrommelBlock.java
index feb818e32..12887ff9c 100644
--- a/src/main/java/net/minecraft/core/block/BlockTrommel.java
+++ b/src/main/java/net/minecraft/core/block/TrommelBlock.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.Global;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityTrommel;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.TrommelBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -13,24 +13,24 @@ import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class BlockTrommel extends BlockTileEntityRotatable
+public class TrommelBlock extends RotatableEntityBlock
 {
-	public BlockTrommel(String key, int id, Material material, boolean isActive)
+	public TrommelBlock(String key, String namespaceId, int id, Material material, boolean isActive)
     {
-        super(key, id, material);
+        super(key, namespaceId, id, material);
         this.isActive = isActive;
         random = new Random();
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        super.onBlockAdded(world, x, y, z);
+        super.onBlockPlacedByWorld(world, x, y, z);
         setDefaultDirection(world, x, y, z);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         switch (dropCause)
         {
@@ -38,24 +38,24 @@ public class BlockTrommel extends BlockTileEntityRotatable
             case EXPLOSION:
             case PROPER_TOOL:
             case SILK_TOUCH:
-                return new ItemStack[] { new ItemStack(Block.trommelIdle) };
+                return new ItemStack[] { new ItemStack(Blocks.TROMMEL_IDLE) };
             default:
                 return null;
         }
     }
     
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide) {
-            TileEntityTrommel tileEntityTrommel = (TileEntityTrommel) world.getBlockTileEntity(x, y, z);
+            TrommelBlockEntity tileEntityTrommel = (TrommelBlockEntity) world.getBlockEntity(x, y, z);
             player.displayGUITrommel(tileEntityTrommel);
         }
         return true;
     }
 
     @Override
-	public void randomDisplayTick(World world, int x, int y, int z, Random rand)
+	public void animationTick(World world, int x, int y, int z, Random rand)
     {
         if(!isActive)
             return;
@@ -68,7 +68,7 @@ public class BlockTrommel extends BlockTileEntityRotatable
     public static void updateTrommelBlockState(boolean flag, World world, int i, int j, int k)
     {
         int l = world.getBlockMetadata(i, j, k);
-        TileEntity tileentity = world.getBlockTileEntity(i, j, k);
+        BlockEntity tileentity = world.getBlockEntity(i, j, k);
         if(tileentity == null) {
             String msg = "Trommel is missing Tile Entity at x: " + i + " y: " + j + " z: " + k + ", block will be removed!";
             if(Global.BUILD_CHANNEL.isUnstableBuild()) {
@@ -81,10 +81,10 @@ public class BlockTrommel extends BlockTileEntityRotatable
         keepTrommelInventory = true;
         if(flag)
         {
-            world.setBlockWithNotify(i, j, k, Block.trommelActive.id);
+            world.setBlockWithNotify(i, j, k, Blocks.TROMMEL_ACTIVE.id);
         } else
         {
-            world.setBlockWithNotify(i, j, k, Block.trommelIdle.id);
+            world.setBlockWithNotify(i, j, k, Blocks.TROMMEL_IDLE.id);
         }
         keepTrommelInventory = false;
         world.setBlockMetadataWithNotify(i, j, k, l);
@@ -97,13 +97,13 @@ public class BlockTrommel extends BlockTileEntityRotatable
     {
     	if (!keepTrommelInventory)
     	{
-    		if(world.getBlockTileEntity(x, y, z) != null)
+    		if(world.getBlockEntity(x, y, z) != null)
     		{
-    			TileEntityTrommel tileentitytrommel = (TileEntityTrommel) world.getBlockTileEntity(x, y, z);
+    			TrommelBlockEntity tileentitytrommel = (TrommelBlockEntity) world.getBlockEntity(x, y, z);
     			label0:
-				for (int l = 0; l < tileentitytrommel.getSizeInventory(); l++) 
+				for (int l = 0; l < tileentitytrommel.getContainerSize(); l++)
 				{
-					ItemStack itemstack = tileentitytrommel.getStackInSlot(l);
+					ItemStack itemstack = tileentitytrommel.getItem(l);
 					if (itemstack == null) {
 						continue;
 					}
@@ -119,7 +119,7 @@ public class BlockTrommel extends BlockTileEntityRotatable
 							i1 = itemstack.stackSize;
 						}
 						itemstack.stackSize -= i1;
-						EntityItem entityitem = new EntityItem(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
+						ItemEntity entityitem = new ItemEntity(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
 						float f3 = 0.05F;
 						entityitem.xd = (float) random.nextGaussian() * f3;
 						entityitem.yd = (float) random.nextGaussian() * f3 + 0.2F;
@@ -135,9 +135,9 @@ public class BlockTrommel extends BlockTileEntityRotatable
 
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
-        return new TileEntityTrommel();
+        return new TrommelBlockEntity();
     }
 
     private boolean isActive;
diff --git a/src/main/java/net/minecraft/core/block/WoolBlock.java b/src/main/java/net/minecraft/core/block/WoolBlock.java
new file mode 100644
index 000000000..1cf8852de
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/WoolBlock.java
@@ -0,0 +1,20 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+public class WoolBlock extends Block
+{
+    public WoolBlock(String key, String namespaceId, int id) {
+
+        super(key, namespaceId, id, Material.cloth);
+    }
+
+    @Override
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
+    {
+        return new ItemStack[] { new ItemStack(this, 1, meta) };
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/BlockWorkbench.java b/src/main/java/net/minecraft/core/block/WorkbenchBlock.java
similarity index 58%
rename from src/main/java/net/minecraft/core/block/BlockWorkbench.java
rename to src/main/java/net/minecraft/core/block/WorkbenchBlock.java
index 6621d0d0c..3ff1605f6 100644
--- a/src/main/java/net/minecraft/core/block/BlockWorkbench.java
+++ b/src/main/java/net/minecraft/core/block/WorkbenchBlock.java
@@ -1,23 +1,23 @@
 package net.minecraft.core.block;
 
 // Referenced classes of package net.minecraft.src:
-//            Block, Material, World, EntityPlayer
+//            Block, Material, World, Player
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
-public class BlockWorkbench extends Block
+public class WorkbenchBlock extends Block
 {
 
-	public BlockWorkbench(String key, int id)
+	public WorkbenchBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.wood);
+        super(key, namespaceId, id, Material.wood);
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide)
         {
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java b/src/main/java/net/minecraft/core/block/entity/BasketBlockEntity.java
similarity index 90%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java
rename to src/main/java/net/minecraft/core/block/entity/BasketBlockEntity.java
index a06d6fe6f..0f92e779d 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java
+++ b/src/main/java/net/minecraft/core/block/entity/BasketBlockEntity.java
@@ -2,20 +2,20 @@ package net.minecraft.core.block.entity;
 
 import java.util.*;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
-public class TileEntityBasket extends TileEntity
+public class BasketBlockEntity extends BlockEntity
 {
     private int numUnitsInside = 0;
     private final Map<BasketEntry, Integer> contents = new HashMap<>();
@@ -42,7 +42,7 @@ public class TileEntityBasket extends TileEntity
 
         contents.clear();
 
-        worldObj.notifyBlockChange(x, y, z, Block.basket.id);
+        worldObj.notifyBlockChange(x, y, z, Blocks.BASKET.id);
         updateNumUnits();
     }
 
@@ -76,7 +76,7 @@ public class TileEntityBasket extends TileEntity
         final float f1 = rand.nextFloat() * 0.8F + 0.1F;
         final float f2 = rand.nextFloat() * 0.8F + 0.1F;
 
-        final EntityItem entityitem = new EntityItem(worldObj, x + f, y + f1, z + f2, itemstack);
+        final ItemEntity entityitem = new ItemEntity(worldObj, x + f, y + f1, z + f2, itemstack);
         final float f3 = 0.05F;
         entityitem.xd = (float) rand.nextGaussian() * f3;
         entityitem.yd = (float) rand.nextGaussian() * f3 + 0.25F;
@@ -94,7 +94,7 @@ public class TileEntityBasket extends TileEntity
         return 27 * 64;
     }
 
-	public void givePlayerAllItems(final World world, final EntityPlayer player) {
+	public void givePlayerAllItems(final World world, final Player player) {
 		List<BasketEntry> toRemove = new ArrayList<>();
 
 		for(Map.Entry<BasketEntry, Integer> entry : contents.entrySet()) {
@@ -115,7 +115,7 @@ public class TileEntityBasket extends TileEntity
 		}
 
 		updateNumUnits();
-		worldObj.notifyBlockChange(x, y, z, Block.basket.id);
+		worldObj.notifyBlockChange(x, y, z, Blocks.BASKET.id);
 	}
 
     @Override
@@ -139,9 +139,9 @@ public class TileEntityBasket extends TileEntity
     {
         if (worldObj == null || worldObj.isClientSide) return;
 
-        final AABB aabb = AABB.getBoundingBoxFromPool(x, y, z, x + 1, y + 2, z + 1);
+        final AABB aabb = AABB.getTemporaryBB(x, y, z, x + 1, y + 2, z + 1);
 
-        final List<Entity> entities = worldObj.getEntitiesWithinAABB(EntityItem.class, aabb);
+        final List<Entity> entities = worldObj.getEntitiesWithinAABB(ItemEntity.class, aabb);
 
         boolean shouldUpdate = false;
 
@@ -149,7 +149,7 @@ public class TileEntityBasket extends TileEntity
         {
             for (final Entity e : entities)
             {
-                final EntityItem entity = (EntityItem) e;
+                final ItemEntity entity = (ItemEntity) e;
                 if (entity.item != null && entity.item.stackSize > 0 && entity.basketPickupDelay == 0)
                 {
                     shouldUpdate = importItemStack(entity.item);
@@ -164,7 +164,7 @@ public class TileEntityBasket extends TileEntity
 
         if (shouldUpdate)
         {
-            worldObj.notifyBlockChange(x, y, z, Block.basket.id);
+            worldObj.notifyBlockChange(x, y, z, Blocks.BASKET.id);
             updateNumUnits();
         }
     }
@@ -201,7 +201,7 @@ public class TileEntityBasket extends TileEntity
 
     @Override
     public Packet getDescriptionPacket() {
-        return new Packet140TileEntityData(this);
+        return new BlockEntityDataPacket(this);
     }
 
     private static final class BasketEntry
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityBlastFurnace.java b/src/main/java/net/minecraft/core/block/entity/BlastFurnaceBlockEntity.java
similarity index 85%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityBlastFurnace.java
rename to src/main/java/net/minecraft/core/block/entity/BlastFurnaceBlockEntity.java
index 6af468353..14913b32c 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityBlastFurnace.java
+++ b/src/main/java/net/minecraft/core/block/entity/BlastFurnaceBlockEntity.java
@@ -2,36 +2,35 @@ package net.minecraft.core.block.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, IInventory, ItemStack, NBTTagCompound,
-//            NBTTagList, World, BlockFurnace, FurnaceRecipes,
-//            Item, Block, Material, EntityPlayer
+//            BlockEntity, IInventory, ItemStack, NBTTagCompound,
+//            NBTTagList, World, FurnaceBlock, FurnaceRecipes,
+//            Item, Block, Material, Player
 
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBlastFurnace;
+import net.minecraft.core.block.BlastFurnaceBlock;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.crafting.LookupFuelFurnaceBlast;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.RecipeGroup;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryBlastFurnace;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 
 import java.util.List;
 
-public class TileEntityBlastFurnace extends TileEntityFurnace
-        implements IInventory
+public class BlastFurnaceBlockEntity extends FurnaceBlockEntity
+        implements Container
 {
 
 
-    public TileEntityBlastFurnace()
+    public BlastFurnaceBlockEntity()
     {
         super();
         maxCookTime = 100;
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "BlastFurnace";
     }
@@ -41,7 +40,7 @@ public class TileEntityBlastFurnace extends TileEntityFurnace
     {
         super.readFromNBT(nbttagcompound);
         ListTag nbttaglist = nbttagcompound.getList("Items");
-        furnaceItemStacks = new ItemStack[getSizeInventory()];
+        furnaceItemStacks = new ItemStack[getContainerSize()];
         for(int i = 0; i < nbttaglist.tagCount(); i++)
         {
             CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
@@ -91,12 +90,12 @@ public class TileEntityBlastFurnace extends TileEntityFurnace
         }
         if(worldObj != null && !worldObj.isClientSide)
         {
-        	if(worldObj.getBlockId(x, y, z) == Block.furnaceBlastIdle.id) {
+        	if(worldObj.getBlockId(x, y, z) == Blocks.FURNACE_BLAST_IDLE.id) {
             	if(currentBurnTime == 0 && furnaceItemStacks[0] == null) {
-            		if(furnaceItemStacks[1] != null && furnaceItemStacks[1].itemID == Block.netherrack.id) {
+            		if(furnaceItemStacks[1] != null && furnaceItemStacks[1].itemID == Blocks.NETHERRACK.id) {
             			furnaceItemStacks[1].stackSize--;
             			if(furnaceItemStacks[1].stackSize <= 0) furnaceItemStacks[1] = null;
-            			BlockBlastFurnace.updateFurnaceBlockState(true, worldObj, x, y, z);
+            			BlastFurnaceBlock.updateFurnaceBlockState(true, worldObj, x, y, z);
             			furnaceUpdated = true;
             		}
             	}
@@ -138,13 +137,13 @@ public class TileEntityBlastFurnace extends TileEntityFurnace
         }
         if(furnaceUpdated)
         {
-            onInventoryChanged();
+            setChanged();
         }
     }
 
     @Override
     protected void updateFurnace(){
-        BlockBlastFurnace.updateFurnaceBlockState(currentBurnTime > 0, worldObj, x, y, z);
+        BlastFurnaceBlock.updateFurnaceBlockState(currentBurnTime > 0, worldObj, x, y, z);
     }
 
     private boolean canSmelt()
@@ -174,7 +173,7 @@ public class TileEntityBlastFurnace extends TileEntityFurnace
         {
             return false;
         }
-        if(furnaceItemStacks[2].stackSize < getInventoryStackLimit() && furnaceItemStacks[2].stackSize < furnaceItemStacks[2].getMaxStackSize())
+        if(furnaceItemStacks[2].stackSize < getMaxStackSize() && furnaceItemStacks[2].stackSize < furnaceItemStacks[2].getMaxStackSize())
         {
             return true;
         }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntity.java b/src/main/java/net/minecraft/core/block/entity/BlockEntity.java
similarity index 66%
rename from src/main/java/net/minecraft/core/block/entity/TileEntity.java
rename to src/main/java/net/minecraft/core/block/entity/BlockEntity.java
index a21ea60a5..9a8b24ee1 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/BlockEntity.java
@@ -2,7 +2,7 @@ package net.minecraft.core.block.entity;
 
 import net.minecraft.core.block.Block;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.block.piston.TileEntityPistonMoving;
+import net.minecraft.core.block.piston.MovingPistonBlockEntity;
 import net.minecraft.core.net.packet.Packet;
 import net.minecraft.core.world.World;
 
@@ -10,14 +10,14 @@ import java.util.HashMap;
 import java.util.Map;
 
 // Referenced classes of package net.minecraft.src:
-//            NBTTagCompound, World, Block, TileEntityFurnace, 
-//            TileEntityChest, TileEntityRecordPlayer, TileEntityDispenser, TileEntitySign, 
-//            TileEntityMobSpawner, TileEntityNote, TileEntityPiston
+//            NBTTagCompound, World, Block, FurnaceBlockEntity,
+//            ChestBlockEntity, JukeboxBlockEntity, DispenserBlockEntity, SignBlockEntity,
+//            MobSpawnerBlockEntity, NoteBlockEntity, TileEntityPiston
 
-public class TileEntity
+public class BlockEntity
 {
 
-    public TileEntity()
+    public BlockEntity()
     {
     }
 
@@ -61,15 +61,15 @@ public class TileEntity
     {
     }
 
-    public static TileEntity createAndLoadEntity(CompoundTag nbttagcompound)
+    public static BlockEntity createAndLoadEntity(CompoundTag nbttagcompound)
     {
-        TileEntity tileentity = null;
+        BlockEntity tileentity = null;
         try
         {
             Class class1 = (Class)nameToClassMap.get(nbttagcompound.getString("id"));
             if(class1 != null)
             {
-                tileentity = (TileEntity)class1.newInstance();
+                tileentity = (BlockEntity)class1.newInstance();
             }
         }
         catch(Exception exception)
@@ -81,7 +81,7 @@ public class TileEntity
             tileentity.readFromNBT(nbttagcompound);
         } else
         {
-            System.out.println("Skipping TileEntity with id " + nbttagcompound.getString("id"));
+            System.out.println("Skipping BlockEntity with id " + nbttagcompound.getString("id"));
         }
         return tileentity;
     }
@@ -96,7 +96,7 @@ public class TileEntity
         return worldObj.getBlockMetadata(x, y, z);
     }
 
-    public void onInventoryChanged()
+    public void setChanged()
     {
         if(worldObj != null)
         {
@@ -147,21 +147,21 @@ public class TileEntity
 
     static 
     {
-        addMapping(TileEntityFurnace.class, "Furnace");
-        addMapping(TileEntityChest.class, "Chest");
-        addMapping(TileEntityRecordPlayer.class, "RecordPlayer");
-        addMapping(TileEntityDispenser.class, "Trap");
-        addMapping(TileEntitySign.class, "Sign");
-        addMapping(TileEntityMobSpawner.class, "MobSpawner");
-        addMapping(TileEntityNote.class, "Music");
-        addMapping(TileEntityPistonMoving.class, "Piston");
-        addMapping(TileEntityBlastFurnace.class, "BlastFurnace");
-        addMapping(TileEntitySensor.class, "Sensor");
-        addMapping(TileEntityTrommel.class, "Trommel");
-        addMapping(TileEntityBasket.class, "Basket");
-        addMapping(TileEntityFlag.class, "Flag");
-        addMapping(TileEntitySeat.class, "Seat");
-        addMapping(TileEntityFlowerJar.class, "FlowerJar");
-        addMapping(TileEntityMeshGold.class, "MeshGold");
+        addMapping(FurnaceBlockEntity.class, "Furnace");
+        addMapping(ChestBlockEntity.class, "Chest");
+        addMapping(JukeboxBlockEntity.class, "RecordPlayer");
+        addMapping(DispenserBlockEntity.class, "Trap");
+        addMapping(SignBlockEntity.class, "Sign");
+        addMapping(MobSpawnerBlockEntity.class, "MobSpawner");
+        addMapping(NoteBlockEntity.class, "Music");
+        addMapping(MovingPistonBlockEntity.class, "Piston");
+        addMapping(BlastFurnaceBlockEntity.class, "BlastFurnace");
+        addMapping(SensorBlockEntity.class, "Sensor");
+        addMapping(TrommelBlockEntity.class, "Trommel");
+        addMapping(BasketBlockEntity.class, "Basket");
+        addMapping(FlagBlockEntity.class, "Flag");
+        addMapping(SeatBlockEntity.class, "Seat");
+        addMapping(FlowerJarBlockEntity.class, "FlowerJar");
+        addMapping(GoldMeshBlockEntity.class, "MeshGold");
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityChest.java b/src/main/java/net/minecraft/core/block/entity/ChestBlockEntity.java
similarity index 60%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityChest.java
rename to src/main/java/net/minecraft/core/block/entity/ChestBlockEntity.java
index 4d9912364..f6f7dbd4c 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityChest.java
+++ b/src/main/java/net/minecraft/core/block/entity/ChestBlockEntity.java
@@ -2,55 +2,55 @@ package net.minecraft.core.block.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, IInventory, ItemStack, NBTTagCompound, 
-//            NBTTagList, World, EntityPlayer
+//            BlockEntity, IInventory, ItemStack, NBTTagCompound,
+//            NBTTagList, World, Player
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 import net.minecraft.core.player.inventory.InventorySorter;
 
-public class TileEntityChest extends TileEntity
-    implements IInventory
+public class ChestBlockEntity extends BlockEntity
+    implements Container
 {
 
-    public TileEntityChest()
+    public ChestBlockEntity()
     {
         chestContents = new ItemStack[36];
     }
 
     @Override
-	public int getSizeInventory()
+	public int getContainerSize()
     {
         return 27;
     }
 
     @Override
-	public ItemStack getStackInSlot(int i)
+	public ItemStack getItem(int index)
     {
-        return chestContents[i];
+        return chestContents[index];
     }
 
     @Override
-	public ItemStack decrStackSize(int i, int j)
+	public ItemStack removeItem(int index, int takeAmount)
     {
-        if(chestContents[i] != null)
+        if(chestContents[index] != null)
         {
-            if(chestContents[i].stackSize <= j)
+            if(chestContents[index].stackSize <= takeAmount)
             {
-                ItemStack itemstack = chestContents[i];
-                chestContents[i] = null;
-                onInventoryChanged();
+                ItemStack itemstack = chestContents[index];
+                chestContents[index] = null;
+                setChanged();
                 return itemstack;
             }
-            ItemStack itemstack1 = chestContents[i].splitStack(j);
-            if(chestContents[i].stackSize <= 0)
+            ItemStack itemstack1 = chestContents[index].splitStack(takeAmount);
+            if(chestContents[index].stackSize <= 0)
             {
-                chestContents[i] = null;
+                chestContents[index] = null;
             }
-            onInventoryChanged();
+            setChanged();
             return itemstack1;
         } else
         {
@@ -59,18 +59,18 @@ public class TileEntityChest extends TileEntity
     }
 
     @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
+	public void setItem(int index, ItemStack itemstack)
     {
-        chestContents[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
+        chestContents[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
         {
-            itemstack.stackSize = getInventoryStackLimit();
+            itemstack.stackSize = getMaxStackSize();
         }
-        onInventoryChanged();
+        setChanged();
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "Chest";
     }
@@ -80,7 +80,7 @@ public class TileEntityChest extends TileEntity
     {
         super.readFromNBT(nbttagcompound);
         ListTag nbttaglist = nbttagcompound.getList("Items");
-        chestContents = new ItemStack[getSizeInventory()];
+        chestContents = new ItemStack[getContainerSize()];
         for(int i = 0; i < nbttaglist.tagCount(); i++)
         {
             CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
@@ -112,15 +112,15 @@ public class TileEntityChest extends TileEntity
     }
 
     @Override
-	public int getInventoryStackLimit()
+	public int getMaxStackSize()
     {
         return 64;
     }
 
     @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
-        if(worldObj.getBlockTileEntity(x, y, z) != this)
+        if(worldObj.getBlockEntity(x, y, z) != this)
         {
             return false;
         }
@@ -128,7 +128,7 @@ public class TileEntityChest extends TileEntity
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         InventorySorter.sortInventory(chestContents);
     }
 
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityDispenser.java b/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
similarity index 64%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityDispenser.java
rename to src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
index bac18fe2a..02643c2c7 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityDispenser.java
+++ b/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
@@ -1,58 +1,58 @@
 package net.minecraft.core.block.entity;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.IDispensable;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, IInventory, ItemStack, NBTTagCompound, 
-//            NBTTagList, World, EntityPlayer
+//            BlockEntity, IInventory, ItemStack, NBTTagCompound,
+//            NBTTagList, World, Player
 
-public class TileEntityDispenser extends TileEntity
-    implements IInventory
+public class DispenserBlockEntity extends BlockEntity
+    implements Container
 {
 
-    public TileEntityDispenser()
+    public DispenserBlockEntity()
     {
         dispenserContents = new ItemStack[9];
         dispenserRandom = new Random();
     }
 
     @Override
-	public int getSizeInventory()
+	public int getContainerSize()
     {
         return 9;
     }
 
     @Override
-	public ItemStack getStackInSlot(int i)
+	public ItemStack getItem(int index)
     {
-        return dispenserContents[i];
+        return dispenserContents[index];
     }
 
     @Override
-	public ItemStack decrStackSize(int i, int j)
+	public ItemStack removeItem(int index, int takeAmount)
     {
-        if(dispenserContents[i] != null)
+        if(dispenserContents[index] != null)
         {
-            if(dispenserContents[i].stackSize <= j)
+            if(dispenserContents[index].stackSize <= takeAmount)
             {
-                ItemStack itemstack = dispenserContents[i];
-                dispenserContents[i] = null;
-                onInventoryChanged();
+                ItemStack itemstack = dispenserContents[index];
+                dispenserContents[index] = null;
+                setChanged();
                 return itemstack;
             }
-            ItemStack itemstack1 = dispenserContents[i].splitStack(j);
-            if(dispenserContents[i].stackSize <= 0)
+            ItemStack itemstack1 = dispenserContents[index].splitStack(takeAmount);
+            if(dispenserContents[index].stackSize <= 0)
             {
-                dispenserContents[i] = null;
+                dispenserContents[index] = null;
             }
-            onInventoryChanged();
+            setChanged();
             return itemstack1;
         } else
         {
@@ -74,16 +74,16 @@ public class TileEntityDispenser extends TileEntity
 
         if(i >= 0)
         {
-            ItemStack stack = getStackInSlot(i);
+            ItemStack stack = getItem(i);
             if (stack.getItem() instanceof IDispensable) {
                 IDispensable dispensable = (IDispensable) stack.getItem();
                 if (dispensable.isRemovedOnDispense()) {
-                    return decrStackSize(i, 1);
+                    return removeItem(i, 1);
                 } else {
                     return stack;
                 }
             }
-            return decrStackSize(i, 1);
+            return removeItem(i, 1);
         }
         else
         {
@@ -92,18 +92,18 @@ public class TileEntityDispenser extends TileEntity
     }
 
     @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
+	public void setItem(int index, ItemStack itemstack)
     {
-        dispenserContents[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
+        dispenserContents[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
         {
-            itemstack.stackSize = getInventoryStackLimit();
+            itemstack.stackSize = getMaxStackSize();
         }
-        onInventoryChanged();
+        setChanged();
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "Trap";
     }
@@ -113,7 +113,7 @@ public class TileEntityDispenser extends TileEntity
     {
         super.readFromNBT(nbttagcompound);
         ListTag nbttaglist = nbttagcompound.getList("Items");
-        dispenserContents = new ItemStack[getSizeInventory()];
+        dispenserContents = new ItemStack[getContainerSize()];
         for(int i = 0; i < nbttaglist.tagCount(); i++)
         {
             CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
@@ -146,15 +146,15 @@ public class TileEntityDispenser extends TileEntity
     }
 
     @Override
-	public int getInventoryStackLimit()
+	public int getMaxStackSize()
     {
         return 64;
     }
 
     @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
-        if(worldObj.getBlockTileEntity(x, y, z) != this)
+        if(worldObj.getBlockEntity(x, y, z) != this)
         {
             return false;
         }
@@ -162,7 +162,7 @@ public class TileEntityDispenser extends TileEntity
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         // Do nothing
     }
 
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityFlag.java b/src/main/java/net/minecraft/core/block/entity/FlagBlockEntity.java
similarity index 82%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityFlag.java
rename to src/main/java/net/minecraft/core/block/entity/FlagBlockEntity.java
index fc6134628..aae0feea3 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityFlag.java
+++ b/src/main/java/net/minecraft/core/block/entity/FlagBlockEntity.java
@@ -5,15 +5,15 @@ import java.util.Random;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
+import net.minecraft.core.player.inventory.container.Container;
 
-public class TileEntityFlag extends TileEntity
-    implements IInventory
+public class FlagBlockEntity extends BlockEntity
+    implements Container
 {
     public final int CANVAS_WIDTH = 24;
     public final int CANVAS_HEIGHT = 16;
@@ -24,7 +24,7 @@ public class TileEntityFlag extends TileEntity
     
     public int sway = new Random().nextInt(100); // Random start value
     
-    public TileEntityFlag()
+    public FlagBlockEntity()
     {
     }
     
@@ -52,7 +52,7 @@ public class TileEntityFlag extends TileEntity
         if(colorIndex < 0 || colorIndex >= items.length) {
             return 15;
         }
-        if((items[colorIndex] != null && items[colorIndex].itemID == Item.dye.id)) {
+        if((items[colorIndex] != null && items[colorIndex].itemID == Items.DYE.id)) {
             return (byte) (items[colorIndex].getMetadata() & 0xF);
         }
         return 15;
@@ -100,7 +100,7 @@ public class TileEntityFlag extends TileEntity
         owner = tag.getStringOrDefault("Owner", "");
 
         ListTag list = tag.getList("Items");
-        items = new ItemStack[getSizeInventory()];
+        items = new ItemStack[getContainerSize()];
         for (int i = 0; i < list.tagCount(); i++)
         {
             CompoundTag compound = (CompoundTag)list.tagAt(i);
@@ -155,38 +155,38 @@ public class TileEntityFlag extends TileEntity
     }
 
     @Override
-    public int getSizeInventory() {
+    public int getContainerSize() {
         return 3;
     }
 
     @Override
-    public ItemStack getStackInSlot(int i) {
-        i -= 36;
-        if (i < 0 || i >= 3) return null;
+    public ItemStack getItem(int index) {
+        index -= 36;
+        if (index < 0 || index >= 3) return null;
         
-        return items[i];
+        return items[index];
     }
 
     @Override
-    public ItemStack decrStackSize(int index, int numToTake) {
+    public ItemStack removeItem(int index, int takeAmount) {
         index -= 36;
         if (items[index] != null)
         {
-            if (items[index].stackSize <= numToTake)
+            if (items[index].stackSize <= takeAmount)
             {
                 ItemStack stack = items[index];
                 items[index] = null;
-                onInventoryChanged();
+                setChanged();
                 return stack;
             }
             else
             {
-                ItemStack splitStack = items[index].splitStack(numToTake);
+                ItemStack splitStack = items[index].splitStack(takeAmount);
                 if (items[index].stackSize <= 0)
                 {
                     items[index] = null;
                 }
-                onInventoryChanged();
+                setChanged();
                 return splitStack;
             }
         }
@@ -198,33 +198,33 @@ public class TileEntityFlag extends TileEntity
 
     @Override
     public Packet getDescriptionPacket() {
-        return new Packet140TileEntityData(this);
+        return new BlockEntityDataPacket(this);
     }
 
     @Override
-    public void setInventorySlotContents(int index, ItemStack stack) 
+    public void setItem(int index, ItemStack stack)
     {
         index -= 36;
         items[index] = stack;
-        onInventoryChanged();
+        setChanged();
     }
 
     @Override
-    public String getInvName() 
+    public String getName()
     {
         return "Flag";
     }
 
     @Override
-    public int getInventoryStackLimit() 
+    public int getMaxStackSize()
     {
         return 1;
     }
 
     @Override
-    public boolean canInteractWith(EntityPlayer entityplayer) 
+    public boolean stillValid(Player entityplayer)
     {
-        if(worldObj.getBlockTileEntity(x, y, z) != this)
+        if(worldObj.getBlockEntity(x, y, z) != this)
         {
             return false;
         }
@@ -232,7 +232,7 @@ public class TileEntityFlag extends TileEntity
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         // Do nothing
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityFlowerJar.java b/src/main/java/net/minecraft/core/block/entity/FlowerJarBlockEntity.java
similarity index 77%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityFlowerJar.java
rename to src/main/java/net/minecraft/core/block/entity/FlowerJarBlockEntity.java
index 7fa9f4e60..32f4af1cc 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityFlowerJar.java
+++ b/src/main/java/net/minecraft/core/block/entity/FlowerJarBlockEntity.java
@@ -2,9 +2,9 @@ package net.minecraft.core.block.entity;
 
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
 
-public class TileEntityFlowerJar extends TileEntity{
+public class FlowerJarBlockEntity extends BlockEntity {
 
     public int flowerInPot;
 
@@ -24,6 +24,6 @@ public class TileEntityFlowerJar extends TileEntity{
 
     @Override
     public Packet getDescriptionPacket() {
-        return new Packet140TileEntityData(this);
+        return new BlockEntityDataPacket(this);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java b/src/main/java/net/minecraft/core/block/entity/FurnaceBlockEntity.java
similarity index 78%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
rename to src/main/java/net/minecraft/core/block/entity/FurnaceBlockEntity.java
index 1e4373d25..58eaeb004 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
+++ b/src/main/java/net/minecraft/core/block/entity/FurnaceBlockEntity.java
@@ -2,30 +2,29 @@ package net.minecraft.core.block.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, IInventory, ItemStack, NBTTagCompound, 
-//            NBTTagList, World, BlockFurnace, FurnaceRecipes, 
-//            Item, Block, Material, EntityPlayer
+//            BlockEntity, IInventory, ItemStack, NBTTagCompound,
+//            NBTTagList, World, FurnaceBlock, FurnaceRecipes,
+//            Item, Block, Material, Player
 
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFurnace;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.FurnaceBlock;
 import net.minecraft.core.crafting.LookupFuelFurnace;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.RecipeGroup;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryFurnace;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 
 import java.util.List;
 
-public class TileEntityFurnace extends TileEntity
-        implements IInventory
+public class FurnaceBlockEntity extends BlockEntity
+        implements Container
 {
 
-    public TileEntityFurnace()
+    public FurnaceBlockEntity()
     {
         furnaceItemStacks = new ItemStack[3];
         currentBurnTime = 0;
@@ -35,32 +34,32 @@ public class TileEntityFurnace extends TileEntity
     }
 
     @Override
-	public int getSizeInventory()
+	public int getContainerSize()
     {
         return furnaceItemStacks.length;
     }
 
     @Override
-	public ItemStack getStackInSlot(int i)
+	public ItemStack getItem(int index)
     {
-        return furnaceItemStacks[i];
+        return furnaceItemStacks[index];
     }
 
     @Override
-	public ItemStack decrStackSize(int i, int j)
+	public ItemStack removeItem(int index, int takeAmount)
     {
-        if(furnaceItemStacks[i] != null)
+        if(furnaceItemStacks[index] != null)
         {
-            if(furnaceItemStacks[i].stackSize <= j)
+            if(furnaceItemStacks[index].stackSize <= takeAmount)
             {
-                ItemStack itemstack = furnaceItemStacks[i];
-                furnaceItemStacks[i] = null;
+                ItemStack itemstack = furnaceItemStacks[index];
+                furnaceItemStacks[index] = null;
                 return itemstack;
             }
-            ItemStack itemstack1 = furnaceItemStacks[i].splitStack(j);
-            if(furnaceItemStacks[i].stackSize <= 0)
+            ItemStack itemstack1 = furnaceItemStacks[index].splitStack(takeAmount);
+            if(furnaceItemStacks[index].stackSize <= 0)
             {
-                furnaceItemStacks[i] = null;
+                furnaceItemStacks[index] = null;
             }
             return itemstack1;
         } else
@@ -70,17 +69,17 @@ public class TileEntityFurnace extends TileEntity
     }
 
     @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
+	public void setItem(int index, ItemStack itemstack)
     {
-        furnaceItemStacks[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
+        furnaceItemStacks[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
         {
-            itemstack.stackSize = getInventoryStackLimit();
+            itemstack.stackSize = getMaxStackSize();
         }
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "Furnace";
     }
@@ -90,7 +89,7 @@ public class TileEntityFurnace extends TileEntity
     {
         super.readFromNBT(nbttagcompound);
         ListTag nbttaglist = nbttagcompound.getList("Items");
-        furnaceItemStacks = new ItemStack[getSizeInventory()];
+        furnaceItemStacks = new ItemStack[getContainerSize()];
         for(int i = 0; i < nbttaglist.tagCount(); i++)
         {
             CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
@@ -129,7 +128,7 @@ public class TileEntityFurnace extends TileEntity
     }
 
     @Override
-	public int getInventoryStackLimit()
+	public int getMaxStackSize()
     {
         return 64;
     }
@@ -165,12 +164,12 @@ public class TileEntityFurnace extends TileEntity
         }
         if(worldObj != null && !worldObj.isClientSide)
         {
-        	if(worldObj.getBlockId(x, y, z) == Block.furnaceStoneIdle.id) {
+        	if(worldObj.getBlockId(x, y, z) == Blocks.FURNACE_STONE_IDLE.id) {
             	if(currentBurnTime == 0 && furnaceItemStacks[0] == null) {
-            		if(furnaceItemStacks[1] != null && furnaceItemStacks[1].itemID == Block.netherrack.id) {
+            		if(furnaceItemStacks[1] != null && furnaceItemStacks[1].itemID == Blocks.NETHERRACK.id) {
             			furnaceItemStacks[1].stackSize--;
             			if(furnaceItemStacks[1].stackSize <= 0) furnaceItemStacks[1] = null;
-            			BlockFurnace.updateFurnaceBlockState(true, worldObj, x, y, z);
+            			FurnaceBlock.updateFurnaceBlockState(true, worldObj, x, y, z);
             			furnaceUpdated = true;
             		}
             	}
@@ -184,9 +183,9 @@ public class TileEntityFurnace extends TileEntity
                     furnaceUpdated = true;
                     if(furnaceItemStacks[1] != null)
                     {
-                        if (furnaceItemStacks[1].getItem() == Item.bucketLava)
+                        if (furnaceItemStacks[1].getItem() == Items.BUCKET_LAVA)
                         {
-                            furnaceItemStacks[1] = new ItemStack(Item.bucket);
+                            furnaceItemStacks[1] = new ItemStack(Items.BUCKET);
                         }
                         else
                         {
@@ -220,7 +219,7 @@ public class TileEntityFurnace extends TileEntity
         }
         if(furnaceUpdated)
         {
-            onInventoryChanged();
+            setChanged();
         }
     }
 
@@ -251,7 +250,7 @@ public class TileEntityFurnace extends TileEntity
         {
             return false;
         }
-        if(furnaceItemStacks[2].stackSize < getInventoryStackLimit() && furnaceItemStacks[2].stackSize < furnaceItemStacks[2].getMaxStackSize())
+        if(furnaceItemStacks[2].stackSize < getMaxStackSize() && furnaceItemStacks[2].stackSize < furnaceItemStacks[2].getMaxStackSize())
         {
             return true;
         }
@@ -288,7 +287,7 @@ public class TileEntityFurnace extends TileEntity
     }
 
     protected void updateFurnace(){
-        BlockFurnace.updateFurnaceBlockState(currentBurnTime > 0, worldObj, x, y, z);
+        FurnaceBlock.updateFurnaceBlockState(currentBurnTime > 0, worldObj, x, y, z);
     }
 
     private int getBurnTimeFromItem(ItemStack itemStack)
@@ -299,9 +298,9 @@ public class TileEntityFurnace extends TileEntity
     }
 
     @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
-        if(worldObj.getBlockTileEntity(x, y, z) != this)
+        if(worldObj.getBlockEntity(x, y, z) != this)
         {
             return false;
         }
@@ -309,7 +308,7 @@ public class TileEntityFurnace extends TileEntity
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         // Do nothing
     }
 
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java b/src/main/java/net/minecraft/core/block/entity/GoldMeshBlockEntity.java
similarity index 83%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
rename to src/main/java/net/minecraft/core/block/entity/GoldMeshBlockEntity.java
index a071b3cc1..16c673589 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
+++ b/src/main/java/net/minecraft/core/block/entity/GoldMeshBlockEntity.java
@@ -1,17 +1,17 @@
 package net.minecraft.core.block.entity;
 
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
 import org.jetbrains.annotations.Nullable;
 
-public class TileEntityMeshGold extends TileEntity{
+public class GoldMeshBlockEntity extends BlockEntity {
     @Nullable
     public ItemStack filterItem;
     public int ticksRan = 0;
-    public TileEntityMeshGold() {
+    public GoldMeshBlockEntity() {
     }
 
     public void tick()
@@ -21,7 +21,8 @@ public class TileEntityMeshGold extends TileEntity{
         }
         ticksRan++;
     }
-    public boolean setFilterItem(EntityPlayer player, @Nullable ItemStack stack){
+
+    public boolean setFilterItem(Player player, @Nullable ItemStack stack){
         boolean success = false;
         boolean wasNull = filterItem == null;
         if (filterItem != null && player.getGamemode().consumeBlocks()){
@@ -59,6 +60,6 @@ public class TileEntityMeshGold extends TileEntity{
     }
     @Override
     public Packet getDescriptionPacket() {
-        return new Packet140TileEntityData(this);
+        return new BlockEntityDataPacket(this);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityRecordPlayer.java b/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
similarity index 89%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityRecordPlayer.java
rename to src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
index e1c705439..a0265330f 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityRecordPlayer.java
+++ b/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
@@ -2,15 +2,15 @@ package net.minecraft.core.block.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, NBTTagCompound
+//            BlockEntity, NBTTagCompound
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.world.save.conversion.ChunkConverter;
 import com.mojang.nbt.CompoundTag;
 
-public class TileEntityRecordPlayer extends TileEntity {
+public class JukeboxBlockEntity extends BlockEntity {
 
-    public TileEntityRecordPlayer() {
+    public JukeboxBlockEntity() {
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityMobSpawner.java b/src/main/java/net/minecraft/core/block/entity/MobSpawnerBlockEntity.java
similarity index 80%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityMobSpawner.java
rename to src/main/java/net/minecraft/core/block/entity/MobSpawnerBlockEntity.java
index a5776d35d..7780f22de 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityMobSpawner.java
+++ b/src/main/java/net/minecraft/core/block/entity/MobSpawnerBlockEntity.java
@@ -1,22 +1,18 @@
 package net.minecraft.core.block.entity;
 
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.enums.EnumCreatureType;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.enums.MobCategory;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.phys.AABB;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet132SetMobSpawner;
+import net.minecraft.core.net.packet.SetMobSpawnerPacket;
 import net.minecraft.core.entity.SpawnListEntry;
 
 import java.util.List;
 
-// Referenced classes of package net.minecraft.src:
-//            TileEntity, World, EntityList, EntityLiving, 
-//            AxisAlignedBB, NBTTagCompound
-
-public class TileEntityMobSpawner extends TileEntity
+public class MobSpawnerBlockEntity extends BlockEntity
 {
     public int delay;
     private String mobId;
@@ -24,7 +20,7 @@ public class TileEntityMobSpawner extends TileEntity
     public double yaw2;
     private int nearby;
 
-    public TileEntityMobSpawner()
+    public MobSpawnerBlockEntity()
     {
         delay = -1;
         yaw2 = 0.0D;
@@ -54,7 +50,7 @@ public class TileEntityMobSpawner extends TileEntity
     @Override
 	public void tick()
     {
-        if (worldObj.getBlockId(x, y, z) != Block.mobspawner.id) return; // dumb fix for mp particle bug, need proper way to inform client to remove tileEntity
+        if (worldObj.getBlockId(x, y, z) != Blocks.MOBSPAWNER.id) return; // dumb fix for mp particle bug, need proper way to inform client to remove tileEntity
         yaw2 = yaw;
         if(!anyPlayerInRange())
         {
@@ -94,22 +90,22 @@ public class TileEntityMobSpawner extends TileEntity
             byte byte0 = 4;
             for(int i = 0; i < byte0; i++)
             {
-                EntityLiving entityliving = null;
+                Mob entityliving = null;
                 
                 if(mobId.equalsIgnoreCase("random")) {
-                	List<SpawnListEntry> list = worldObj.getBlockBiome(x, y, z).getSpawnableList(EnumCreatureType.monster);
+                	List<SpawnListEntry> list = worldObj.getBlockBiome(x, y, z).getSpawnableList(MobCategory.monster);
                 	
                 	SpawnListEntry entry = list.get(worldObj.rand.nextInt(list.size()));
-                	entityliving = (EntityLiving) EntityDispatcher.createEntityInWorld(EntityDispatcher.classToKeyMap.get(entry.entityClass), worldObj);
+                	entityliving = (Mob) EntityDispatcher.createEntityInWorld(EntityDispatcher.classToKeyMap.get(entry.entityClass), worldObj);
                 }else {
-                	entityliving = (EntityLiving) EntityDispatcher.createEntityInWorld(mobId, worldObj);
+                	entityliving = (Mob) EntityDispatcher.createEntityInWorld(mobId, worldObj);
                 }
                 
                 if(entityliving == null)
                 {
                     return;
                 }
-                int j = worldObj.getEntitiesWithinAABB(entityliving.getClass(), AABB.getBoundingBoxFromPool(x, y, z, x + 1, y + 1, z + 1).expand(8D, 4D, 8D)).size();
+                int j = worldObj.getEntitiesWithinAABB(entityliving.getClass(), AABB.getTemporaryBB(x, y, z, x + 1, y + 1, z + 1).grow(8D, 4D, 8D)).size();
                 if(j >= 6)
                 {
                     updateDelay();
@@ -119,7 +115,7 @@ public class TileEntityMobSpawner extends TileEntity
                 double d7 = (y + worldObj.rand.nextInt(3)) - 1;
                 double d8 = (double) z + (worldObj.rand.nextDouble() - worldObj.rand.nextDouble()) * 4D;
                 entityliving.moveTo(d6, d7, d8, worldObj.rand.nextFloat() * 360F, 0.0F);
-                if(!entityliving.getCanSpawnHere())
+                if(!entityliving.canSpawnHere())
                 {
                 	updateDelay();
                     continue;
@@ -146,7 +142,7 @@ public class TileEntityMobSpawner extends TileEntity
     @Override
 	public Packet getDescriptionPacket()
     {
-        return new Packet132SetMobSpawner(x, y, z, mobId);
+        return new SetMobSpawnerPacket(x, y, z, mobId);
     }
     
     public int countNearbySpawners() {
@@ -156,7 +152,7 @@ public class TileEntityMobSpawner extends TileEntity
     		for(int j = -r; j <= r; j++) {
     			for(int k = -r; k <= r; k++) {
     				int id = worldObj.getBlockId(x + i, y + j, z + k);
-    				if(id == Block.mobspawner.id) {
+    				if(id == Blocks.MOBSPAWNER.id) {
     					count++;
     				}
     			}
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityNote.java b/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
similarity index 90%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityNote.java
rename to src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
index 7af6e129c..8ca0bac10 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityNote.java
+++ b/src/main/java/net/minecraft/core/block/entity/NoteBlockEntity.java
@@ -2,16 +2,16 @@ package net.minecraft.core.block.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            TileEntity, NBTTagCompound, World, Material
+//            BlockEntity, NBTTagCompound, World, Material
 
 import net.minecraft.core.block.material.Material;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class TileEntityNote extends TileEntity
+public class NoteBlockEntity extends BlockEntity
 {
 
-    public TileEntityNote()
+    public NoteBlockEntity()
     {
         note = 0;
         previousRedstoneState = false;
@@ -42,7 +42,7 @@ public class TileEntityNote extends TileEntity
     public void changePitch()
     {
         note = (byte)((note + 1) % 25);
-        onInventoryChanged();
+        setChanged();
     }
 
     public void triggerNote(World world, int x, int y, int z)
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntitySeat.java b/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
similarity index 93%
rename from src/main/java/net/minecraft/core/block/entity/TileEntitySeat.java
rename to src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
index 165d39805..7a0463c87 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntitySeat.java
+++ b/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
@@ -1,15 +1,15 @@
 package net.minecraft.core.block.entity;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.world.IVehicle;
 
-public class TileEntitySeat
-    extends TileEntity
+public class SeatBlockEntity
+    extends BlockEntity
     implements IVehicle {
     private Entity passenger;
 
-    public TileEntitySeat() {
+    public SeatBlockEntity() {
         passenger = null;
     }
 
@@ -20,7 +20,7 @@ public class TileEntitySeat
         }
 
         // TODO the server really needs a better way of telling the client that a tile entity no longer exists, but this works to fix the client thinking that the seat remains if its broken in multiplayer
-        if (worldObj.getBlock(x, y, z) != Block.seat){
+        if (worldObj.getBlock(x, y, z) != Blocks.SEAT){
             ejectRider();
         }
     }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java b/src/main/java/net/minecraft/core/block/entity/SensorBlockEntity.java
similarity index 75%
rename from src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
rename to src/main/java/net/minecraft/core/block/entity/SensorBlockEntity.java
index faea99ca2..6919c71a6 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
+++ b/src/main/java/net/minecraft/core/block/entity/SensorBlockEntity.java
@@ -2,18 +2,19 @@ package net.minecraft.core.block.entity;
 
 import java.util.List;
 
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockMotionSensor;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.MotionSensorBlock;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
-public class TileEntitySensor extends TileEntity {
+public class SensorBlockEntity extends BlockEntity {
 
 	private int getSightRange(World world, int x, int y, int z, Direction facing) {
 		if(facing == Direction.NONE) {
@@ -56,7 +57,7 @@ public class TileEntitySensor extends TileEntity {
 		int maxY = Math.max(y1, y2) + 1;
 		int maxZ = Math.max(z1, z2) + 1;
 		
-		return AABB.getBoundingBoxFromPool(minX, minY, minZ, maxX, maxY, maxZ);
+		return AABB.getTemporaryBB(minX, minY, minZ, maxX, maxY, maxZ);
 	}
 
 	@Override
@@ -69,27 +70,27 @@ public class TileEntitySensor extends TileEntity {
 		int meta = worldObj.getBlockMetadata(x, y, z);
 		
 		boolean shouldBeActive = false;
-		Direction facing = BlockMotionSensor.getFacingDirection(meta);
+		Direction facing = MotionSensorBlock.getFacingDirection(meta);
 		int effectiveRange = getSightRange(worldObj, x, y, z, facing);
 		if(effectiveRange > 0) {
 			AABB detectionBox = getDetectionBox(x, y, z, facing, effectiveRange);
 			List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(null, detectionBox);
 			for(int i=0; i < list.size(); i++) {
 				Entity entity = list.get(i);
-				if(entity instanceof EntityPlayer) {
-					EntityPlayer player = (EntityPlayer) entity;
-					player.triggerAchievement(AchievementList.GET_SENSED);
+				if(entity instanceof Player) {
+					Player player = (Player) entity;
+					player.triggerAchievement(Achievements.GET_SENSED);
 				}
 				shouldBeActive = true;
 			}
 		}
 		
-		if(shouldBeActive && id == Block.motionsensorIdle.id) {
+		if(shouldBeActive && id == Blocks.MOTION_SENSOR_IDLE.id) {
 			worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x + 0.5, y + 0.5, z + 0.5, "random.breath", 0.5f, worldObj.rand.nextFloat());
-			BlockMotionSensor.updateSensorBlockState(true, worldObj, x, y, z);
+			MotionSensorBlock.updateSensorBlockState(true, worldObj, x, y, z);
 		}
-		if(!shouldBeActive && id == Block.motionsensorActive.id) {
-			BlockMotionSensor.updateSensorBlockState(false, worldObj, x, y, z);
+		if(!shouldBeActive && id == Blocks.MOTION_SENSOR_ACTIVE.id) {
+			MotionSensorBlock.updateSensorBlockState(false, worldObj, x, y, z);
 		}
 	}
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntitySign.java b/src/main/java/net/minecraft/core/block/entity/SignBlockEntity.java
similarity index 77%
rename from src/main/java/net/minecraft/core/block/entity/TileEntitySign.java
rename to src/main/java/net/minecraft/core/block/entity/SignBlockEntity.java
index 939c74685..fa243d89e 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntitySign.java
+++ b/src/main/java/net/minecraft/core/block/entity/SignBlockEntity.java
@@ -1,16 +1,22 @@
 package net.minecraft.core.block.entity;
 
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet140TileEntityData;
+import net.minecraft.core.net.packet.BlockEntityDataPacket;
 
-public class TileEntitySign extends TileEntity
+public class SignBlockEntity extends BlockEntity
 {
+    public String[] signText = { "", "", "", "" };
+    public int lineBeingEdited;
+    private int selectedPicture = 0;
+    private int selectedColor = 15;
+    private String owner = "";
+    private boolean glowing = false;
 
-    public TileEntitySign()
+    public SignBlockEntity()
     {
         lineBeingEdited = -1;
     }
@@ -25,6 +31,7 @@ public class TileEntitySign extends TileEntity
         tag.putString("Text4", signText[3]);
         tag.putInt("Picture", selectedPicture);
         tag.putInt("Color", selectedColor);
+        tag.putBoolean("Glowing", glowing);
         tag.putString("Owner", owner);
     }
 
@@ -42,18 +49,19 @@ public class TileEntitySign extends TileEntity
         }
         selectedPicture = tag.getIntegerOrDefault("Picture", 0);
         selectedColor = tag.getIntegerOrDefault("Color", 15);
+        glowing = tag.getBooleanOrDefault("Glowing", false);
         owner = tag.getString("Owner");
     }
     
-    public boolean getIsEditable(EntityPlayer player)
+    public boolean isEditableBy(Player player)
     {
         return player.username.equals(owner);
     }
-    public void setOwner(EntityPlayer player){
+
+    public void setOwner(Player player){
         this.owner = player.username;
     }
 
-
     public EnumSignPicture getPicture()
     {
         if (selectedPicture < 0) return null;
@@ -88,18 +96,18 @@ public class TileEntitySign extends TileEntity
     {
         selectedColor = color.id;
     }
+
+    public boolean isGlowing() {
+        return glowing;
+    }
+
+    public void setGlowing(boolean glowing) {
+        this.glowing = glowing;
+    }
     
     @Override
 	public Packet getDescriptionPacket()
     {
-        return new Packet140TileEntityData(this);
+        return new BlockEntityDataPacket(this);
     }
-
-    public String[] signText = {
-        "", "", "", ""
-    };
-    public int lineBeingEdited;
-    private int selectedPicture = 0;
-    private int selectedColor = 15;
-    private String owner = "";
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java b/src/main/java/net/minecraft/core/block/entity/TrommelBlockEntity.java
similarity index 81%
rename from src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java
rename to src/main/java/net/minecraft/core/block/entity/TrommelBlockEntity.java
index 2fd6dfb81..094d8a83e 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java
+++ b/src/main/java/net/minecraft/core/block/entity/TrommelBlockEntity.java
@@ -4,16 +4,18 @@ package net.minecraft.core.block.entity;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockChest;
-import net.minecraft.core.block.BlockTrommel;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.ChestBlock;
+import net.minecraft.core.block.TrommelBlock;
 import net.minecraft.core.crafting.LookupFuelFurnace;
 import net.minecraft.core.data.registry.recipe.entry.RecipeEntryTrommel;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.monster.EntitySlime;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.monster.SlimeMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.util.helper.MathHelper;
 
 import java.util.HashMap;
@@ -21,11 +23,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
-public class TileEntityTrommel extends TileEntity
-        implements IInventory
+public class TrommelBlockEntity extends BlockEntity
+        implements Container
 {
 
-    public TileEntityTrommel()
+    public TrommelBlockEntity()
     {
         itemStacks = new ItemStack[5];
         burnTime = 0;
@@ -40,32 +42,32 @@ public class TileEntityTrommel extends TileEntity
     }
 
     @Override
-	public int getSizeInventory()
+	public int getContainerSize()
     {
         return itemStacks.length;
     }
 
     @Override
-	public ItemStack getStackInSlot(int i)
+	public ItemStack getItem(int index)
     {
-        return itemStacks[i];
+        return itemStacks[index];
     }
 
     @Override
-	public ItemStack decrStackSize(int i, int j)
+	public ItemStack removeItem(int index, int takeAmount)
     {
-        if(itemStacks[i] != null)
+        if(itemStacks[index] != null)
         {
-            if(itemStacks[i].stackSize <= j)
+            if(itemStacks[index].stackSize <= takeAmount)
             {
-                ItemStack itemstack = itemStacks[i];
-                itemStacks[i] = null;
+                ItemStack itemstack = itemStacks[index];
+                itemStacks[index] = null;
                 return itemstack;
             }
-            ItemStack itemstack1 = itemStacks[i].splitStack(j);
-            if(itemStacks[i].stackSize <= 0)
+            ItemStack itemstack1 = itemStacks[index].splitStack(takeAmount);
+            if(itemStacks[index].stackSize <= 0)
             {
-                itemStacks[i] = null;
+                itemStacks[index] = null;
             }
             return itemstack1;
         } else
@@ -75,17 +77,17 @@ public class TileEntityTrommel extends TileEntity
     }
 
     @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
+	public void setItem(int index, ItemStack itemstack)
     {
-        itemStacks[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
+        itemStacks[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
         {
-            itemstack.stackSize = getInventoryStackLimit();
+            itemstack.stackSize = getMaxStackSize();
         }
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "Trommel";
     }
@@ -95,7 +97,7 @@ public class TileEntityTrommel extends TileEntity
     {
         super.readFromNBT(nbttagcompound);
         ListTag nbttaglist = nbttagcompound.getList("Items");
-        itemStacks = new ItemStack[getSizeInventory()];
+        itemStacks = new ItemStack[getContainerSize()];
         for(int i = 0; i < nbttaglist.tagCount(); i++)
         {
             CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
@@ -133,7 +135,7 @@ public class TileEntityTrommel extends TileEntity
     }
 
     @Override
-	public int getInventoryStackLimit()
+	public int getMaxStackSize()
     {
         return 64;
     }
@@ -170,12 +172,12 @@ public class TileEntityTrommel extends TileEntity
         }
         if(worldObj != null && !worldObj.isClientSide)
         {
-        	if(worldObj.getBlockId(x, y, z) == Block.trommelIdle.id) {
+        	if(worldObj.getBlockId(x, y, z) == Blocks.TROMMEL_IDLE.id) {
             	if(currentItemBurnTime == 0 && itemStacks[0] == null) {
-            		if(itemStacks[4] != null && itemStacks[4].itemID == Block.netherrack.id) {
+            		if(itemStacks[4] != null && itemStacks[4].itemID == Blocks.NETHERRACK.id) {
             			itemStacks[4].stackSize--;
             			if(itemStacks[4].stackSize <= 0) itemStacks[4] = null;
-            			BlockTrommel.updateTrommelBlockState(true, worldObj, x, y, z);
+            			TrommelBlock.updateTrommelBlockState(true, worldObj, x, y, z);
             			flag1 = true;
             		}
             	}
@@ -190,8 +192,8 @@ public class TileEntityTrommel extends TileEntity
                     flag1 = true;
                     if(itemStacks[4] != null)
                     {
-                    	if(itemStacks[4].getItem() == Item.bucketLava) {
-                    		itemStacks[4] = new ItemStack(Item.bucket);
+                    	if(itemStacks[4].getItem() == Items.BUCKET_LAVA) {
+                    		itemStacks[4] = new ItemStack(Items.BUCKET);
                     	}else {
                             itemStacks[4].stackSize--;
                             if(itemStacks[4].stackSize <= 0)
@@ -219,12 +221,12 @@ public class TileEntityTrommel extends TileEntity
             if(isBurning != (burnTime > 0))
             {
                 flag1 = true;
-                BlockTrommel.updateTrommelBlockState(burnTime > 0, worldObj, x, y, z);
+                TrommelBlock.updateTrommelBlockState(burnTime > 0, worldObj, x, y, z);
             }
         }
         if(flag1)
         {
-            onInventoryChanged();
+            setChanged();
         }
     }
 
@@ -272,21 +274,21 @@ public class TileEntityTrommel extends TileEntity
         	}
         	int adjacentId = worldObj.getBlockId(x + xOffset, y, z + zOffset);
         	
-        	IInventory chest = null;
-        	if (Block.blocksList[adjacentId] instanceof BlockChest) {
-        		chest = BlockChest.getInventory(worldObj, x + xOffset, y, z + zOffset);
+        	Container chest = null;
+        	if (Block.blocksList[adjacentId] instanceof ChestBlock) {
+        		chest = ChestBlock.getInventory(worldObj, x + xOffset, y, z + zOffset);
         	}
         	
         	if (chest != null)
         	{
-        		for (int i = 0; i < chest.getSizeInventory(); i++)
+        		for (int i = 0; i < chest.getContainerSize(); i++)
         		{
-        			ItemStack slot = chest.getStackInSlot(i);
+        			ItemStack slot = chest.getItem(i);
         			if (slot != null && slot.itemID == itemResult.itemID && slot.getMetadata() == itemResult.getMetadata())
         			{
                         for(; slot.stackSize + 1 <= slot.getMaxStackSize(); itemResult.stackSize--){
                             slot.stackSize ++;
-                            chest.setInventorySlotContents(i, slot);
+                            chest.setItem(i, slot);
                             if(itemResult.stackSize <= 0)
                                 return;
                         }
@@ -294,13 +296,13 @@ public class TileEntityTrommel extends TileEntity
         		}
                 if(itemResult.stackSize <= 0)
                     return;
-        		for (int i = 0; i < chest.getSizeInventory(); i++)
+        		for (int i = 0; i < chest.getContainerSize(); i++)
         		{
-        			ItemStack slot = chest.getStackInSlot(i);
+        			ItemStack slot = chest.getItem(i);
         			if (slot == null)
         			{
 
-        				chest.setInventorySlotContents(i, itemResult);
+        				chest.setItem(i, itemResult);
         				return;
         			}
         		}
@@ -313,7 +315,7 @@ public class TileEntityTrommel extends TileEntity
 
             float f = (((float) 1 - 0.5F)) / 4F;
             float f1 = (((float) 1 - 0.5F)) / 4F;
-            EntitySlime entityslime = new EntitySlime(worldObj);
+            SlimeMob entityslime = new SlimeMob(worldObj);
             entityslime.setSlimeSize(1);
             entityslime.moveTo(x + (double)f, y + 1D, z + (double)f1, rand.nextFloat() * 360F, 0.0F);
             float f3 = 0.05F;
@@ -360,9 +362,9 @@ public class TileEntityTrommel extends TileEntity
     }
 
     @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
-        if(worldObj.getBlockTileEntity(x, y, z) != this)
+        if(worldObj.getBlockEntity(x, y, z) != this)
         {
             return false;
         }
@@ -370,7 +372,7 @@ public class TileEntityTrommel extends TileEntity
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         // Do nothing
     }
 
diff --git a/src/main/java/net/minecraft/core/block/logic/BedDirections.java b/src/main/java/net/minecraft/core/block/logic/BedDirections.java
deleted file mode 100644
index 08334e9e7..000000000
--- a/src/main/java/net/minecraft/core/block/logic/BedDirections.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package net.minecraft.core.block.logic;
-
-
-public class BedDirections
-{
-
-    public BedDirections()
-    {
-    }
-
-    public static final int[] headOfBedMap = {
-        3, 4, 2, 5
-    };
-    public static final int[] footToHeadMap = {
-        2, 3, 0, 1
-    };
-    public static final int[][] bedDirection = {
-        {
-            1, 0, 3, 2, 5, 4
-        }, {
-            1, 0, 5, 4, 2, 3
-        }, {
-            1, 0, 2, 3, 4, 5
-        }, {
-            1, 0, 4, 5, 3, 2
-        }
-    };
-
-}
diff --git a/src/main/java/net/minecraft/core/block/logic/RailDirection.java b/src/main/java/net/minecraft/core/block/logic/RailDirection.java
new file mode 100644
index 000000000..0467a8afa
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/logic/RailDirection.java
@@ -0,0 +1,109 @@
+package net.minecraft.core.block.logic;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum RailDirection {
+    NONE(-1, false, false, false,
+        0, 0, 0,
+        0, 0, 0),
+    STRAIGHT_NS(0, false, true, false,
+        0, 0, 1,
+        0, 0, -1),
+    STRAIGHT_EW(1, false, true, false,
+        -1, 0, 0,
+        1, 0, 0),
+    SLOPE_E(2, true, false, false,
+        -1, 0, 0,
+        1, 1, 0),
+    SLOPE_W(3, true, false, false,
+        -1, 1, 0,
+        1, 0, 0),
+    SLOPE_N(4, true, false, false,
+        0, 0, 1,
+        0, 1, -1),
+    SLOPE_S(5, true, false, false,
+        0, 1, 1,
+        0, 0, -1),
+    TURN_ES(6, false, false, true,
+        0, 0, 1,
+        1, 0, 0),
+    TURN_WS(7, false, false, true,
+        0, 0, 1,
+        -1, 0, 0),
+    TURN_WN(8, false, false, true,
+        0, 0, -1,
+        -1, 0, 0),
+    TURN_EN(9, false, false, true,
+        0, 0, -1,
+        1, 0, 0);
+
+    private static final Map<Integer, RailDirection> directionMap = new HashMap<>();
+    public final int meta;
+    private final boolean sloped;
+    private final boolean straight;
+    private final boolean curved;
+    private final int offX1;
+    private final int offY1;
+    private final int offZ1;
+    private final int offX2;
+    private final int offY2;
+    private final int offZ2;
+
+    RailDirection(int meta, boolean sloped, boolean straight, boolean curved,
+                  int offX1, int offY1, int offZ1,
+                  int offX2, int offY2, int offZ2){
+        this.meta = meta;
+        this.sloped = sloped;
+        this.straight = straight;
+        this.curved = curved;
+        this.offX1 = offX1;
+        this.offY1 = offY1;
+        this.offZ1 = offZ1;
+        this.offX2 = offX2;
+        this.offY2 = offY2;
+        this.offZ2 = offZ2;
+    }
+    public int getNextRailX(){
+        return offX1;
+    }
+    public int getNextRailY(){
+        return offY1;
+    }
+    public int getNextRailZ(){
+        return offZ1;
+    }
+    public int getPrevRailX(){
+        return offX2;
+    }
+    public int getPrevRailY(){
+        return offY2;
+    }
+    public int getPrevRailZ(){
+        return offZ2;
+    }
+    public boolean isSloped(){
+        return sloped;
+    }
+    public boolean isStraight(){
+        return straight;
+    }
+    public boolean isCurved(){
+        return curved;
+    }
+    @NotNull
+    public static RailDirection getFromMeta(int meta){
+        if (directionMap.containsKey(meta)){
+            return directionMap.get(meta);
+        }
+        return NONE;
+    }
+
+    static {
+        for (RailDirection d : values()){
+            directionMap.put(d.meta, d);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/logic/RailLogic.java b/src/main/java/net/minecraft/core/block/logic/RailLogic.java
deleted file mode 100644
index 1d4077870..000000000
--- a/src/main/java/net/minecraft/core/block/logic/RailLogic.java
+++ /dev/null
@@ -1,441 +0,0 @@
-package net.minecraft.core.block.logic;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRail;
-import net.minecraft.core.world.chunk.ChunkPosition;
-import net.minecraft.core.world.World;
-
-import java.util.ArrayList;
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            World, Block, BlockRail, ChunkPosition
-
-public class RailLogic
-{
-
-    public RailLogic(BlockRail blockrail, World world, int i, int j, int k)
-    {
-//        super();
-        rail = blockrail;
-        connectedTracks = new ArrayList();
-        worldObj = world;
-        trackX = i;
-        trackY = j;
-        trackZ = k;
-        int l = world.getBlockId(i, j, k);
-        int i1 = world.getBlockMetadata(i, j, k);
-        if(BlockRail.isPoweredBlockRail((BlockRail) Block.blocksList[l]))
-        {
-            isPoweredRail = true;
-            i1 &= -9;
-        } else
-        {
-            isPoweredRail = false;
-        }
-        setConnections(i1);
-    }
-
-    private void setConnections(int i)
-    {
-        connectedTracks.clear();
-        if(i == 0)
-        {
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1));
-        } else
-        if(i == 1)
-        {
-            connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ));
-        } else
-        if(i == 2)
-        {
-            connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX + 1, trackY + 1, trackZ));
-        } else
-        if(i == 3)
-        {
-            connectedTracks.add(new ChunkPosition(trackX - 1, trackY + 1, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ));
-        } else
-        if(i == 4)
-        {
-            connectedTracks.add(new ChunkPosition(trackX, trackY + 1, trackZ - 1));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1));
-        } else
-        if(i == 5)
-        {
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1));
-            connectedTracks.add(new ChunkPosition(trackX, trackY + 1, trackZ + 1));
-        } else
-        if(i == 6)
-        {
-            connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1));
-        } else
-        if(i == 7)
-        {
-            connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1));
-        } else
-        if(i == 8)
-        {
-            connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1));
-        } else
-        if(i == 9)
-        {
-            connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ));
-            connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1));
-        }
-    }
-
-    private void func_785_b()
-    {
-        for(int i = 0; i < connectedTracks.size(); i++)
-        {
-            RailLogic raillogic = getMinecartTrackLogic((ChunkPosition)connectedTracks.get(i));
-            if(raillogic == null || !raillogic.isConnectedTo(this))
-            {
-                connectedTracks.remove(i--);
-            } else
-            {
-                connectedTracks.set(i, new ChunkPosition(raillogic.trackX, raillogic.trackY, raillogic.trackZ));
-            }
-        }
-
-    }
-
-    private boolean isMinecartTrack(int i, int j, int k)
-    {
-        if(BlockRail.isRailBlockAt(worldObj, i, j, k))
-        {
-            return true;
-        }
-        if(BlockRail.isRailBlockAt(worldObj, i, j + 1, k))
-        {
-            return true;
-        }
-        return BlockRail.isRailBlockAt(worldObj, i, j - 1, k);
-    }
-
-    private RailLogic getMinecartTrackLogic(ChunkPosition chunkposition)
-    {
-        if(BlockRail.isRailBlockAt(worldObj, chunkposition.x, chunkposition.y, chunkposition.z))
-        {
-            return new RailLogic(rail, worldObj, chunkposition.x, chunkposition.y, chunkposition.z);
-        }
-        if(BlockRail.isRailBlockAt(worldObj, chunkposition.x, chunkposition.y + 1, chunkposition.z))
-        {
-            return new RailLogic(rail, worldObj, chunkposition.x, chunkposition.y + 1, chunkposition.z);
-        }
-        if(BlockRail.isRailBlockAt(worldObj, chunkposition.x, chunkposition.y - 1, chunkposition.z))
-        {
-            return new RailLogic(rail, worldObj, chunkposition.x, chunkposition.y - 1, chunkposition.z);
-        } else
-        {
-            return null;
-        }
-    }
-
-    private boolean isConnectedTo(RailLogic raillogic)
-    {
-        for(int i = 0; i < connectedTracks.size(); i++)
-        {
-            ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(i);
-            if(chunkposition.x == raillogic.trackX && chunkposition.z == raillogic.trackZ)
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean isInTrack(int i, int j, int k)
-    {
-        for(int l = 0; l < connectedTracks.size(); l++)
-        {
-            ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(l);
-            if(chunkposition.x == i && chunkposition.z == k)
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private int getAdjacentTracks()
-    {
-        int i = 0;
-        if(isMinecartTrack(trackX, trackY, trackZ - 1))
-        {
-            i++;
-        }
-        if(isMinecartTrack(trackX, trackY, trackZ + 1))
-        {
-            i++;
-        }
-        if(isMinecartTrack(trackX - 1, trackY, trackZ))
-        {
-            i++;
-        }
-        if(isMinecartTrack(trackX + 1, trackY, trackZ))
-        {
-            i++;
-        }
-        return i;
-    }
-
-    private boolean handleKeyPress(RailLogic raillogic)
-    {
-        if(isConnectedTo(raillogic))
-        {
-            return true;
-        }
-        if(connectedTracks.size() == 2)
-        {
-            return false;
-        }
-        if(connectedTracks.size() == 0)
-        {
-            return true;
-        }
-        ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(0);
-        return raillogic.trackY != trackY || chunkposition.y != trackY ? true : true;
-    }
-
-    private void func_788_d(RailLogic raillogic)
-    {
-        connectedTracks.add(new ChunkPosition(raillogic.trackX, raillogic.trackY, raillogic.trackZ));
-        boolean flag = isInTrack(trackX, trackY, trackZ - 1);
-        boolean flag1 = isInTrack(trackX, trackY, trackZ + 1);
-        boolean flag2 = isInTrack(trackX - 1, trackY, trackZ);
-        boolean flag3 = isInTrack(trackX + 1, trackY, trackZ);
-        byte byte0 = -1;
-        if(flag || flag1)
-        {
-            byte0 = 0;
-        }
-        if(flag2 || flag3)
-        {
-            byte0 = 1;
-        }
-        if(!isPoweredRail)
-        {
-            if(flag1 && flag3 && !flag && !flag2)
-            {
-                byte0 = 6;
-            }
-            if(flag1 && flag2 && !flag && !flag3)
-            {
-                byte0 = 7;
-            }
-            if(flag && flag2 && !flag1 && !flag3)
-            {
-                byte0 = 8;
-            }
-            if(flag && flag3 && !flag1 && !flag2)
-            {
-                byte0 = 9;
-            }
-        }
-        if(byte0 == 0)
-        {
-            if(BlockRail.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ - 1))
-            {
-                byte0 = 4;
-            }
-            if(BlockRail.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ + 1))
-            {
-                byte0 = 5;
-            }
-        }
-        if(byte0 == 1)
-        {
-            if(BlockRail.isRailBlockAt(worldObj, trackX + 1, trackY + 1, trackZ))
-            {
-                byte0 = 2;
-            }
-            if(BlockRail.isRailBlockAt(worldObj, trackX - 1, trackY + 1, trackZ))
-            {
-                byte0 = 3;
-            }
-        }
-        if(byte0 < 0)
-        {
-            byte0 = 0;
-        }
-        int i = byte0;
-        if(isPoweredRail)
-        {
-            i = worldObj.getBlockMetadata(trackX, trackY, trackZ) & 8 | byte0;
-        }
-        worldObj.setBlockMetadataWithNotify(trackX, trackY, trackZ, i);
-    }
-
-    private boolean func_786_c(int i, int j, int k)
-    {
-        RailLogic raillogic = getMinecartTrackLogic(new ChunkPosition(i, j, k));
-        if(raillogic == null)
-        {
-            return false;
-        } else
-        {
-            raillogic.func_785_b();
-            return raillogic.handleKeyPress(this);
-        }
-    }
-
-    public void func_792_a(boolean flag, boolean flag1)
-    {
-        boolean flag2 = func_786_c(trackX, trackY, trackZ - 1);
-        boolean flag3 = func_786_c(trackX, trackY, trackZ + 1);
-        boolean flag4 = func_786_c(trackX - 1, trackY, trackZ);
-        boolean flag5 = func_786_c(trackX + 1, trackY, trackZ);
-        byte byte0 = -1;
-        if((flag2 || flag3) && !flag4 && !flag5)
-        {
-            byte0 = 0;
-        }
-        if((flag4 || flag5) && !flag2 && !flag3)
-        {
-            byte0 = 1;
-        }
-        if(!isPoweredRail)
-        {
-            if(flag3 && flag5 && !flag2 && !flag4)
-            {
-                byte0 = 6;
-            }
-            if(flag3 && flag4 && !flag2 && !flag5)
-            {
-                byte0 = 7;
-            }
-            if(flag2 && flag4 && !flag3 && !flag5)
-            {
-                byte0 = 8;
-            }
-            if(flag2 && flag5 && !flag3 && !flag4)
-            {
-                byte0 = 9;
-            }
-        }
-        if(byte0 == -1)
-        {
-            if(flag2 || flag3)
-            {
-                byte0 = 0;
-            }
-            if(flag4 || flag5)
-            {
-                byte0 = 1;
-            }
-            if(!isPoweredRail)
-            {
-                if(flag)
-                {
-                    if(flag3 && flag5)
-                    {
-                        byte0 = 6;
-                    }
-                    if(flag4 && flag3)
-                    {
-                        byte0 = 7;
-                    }
-                    if(flag5 && flag2)
-                    {
-                        byte0 = 9;
-                    }
-                    if(flag2 && flag4)
-                    {
-                        byte0 = 8;
-                    }
-                } else
-                {
-                    if(flag2 && flag4)
-                    {
-                        byte0 = 8;
-                    }
-                    if(flag5 && flag2)
-                    {
-                        byte0 = 9;
-                    }
-                    if(flag4 && flag3)
-                    {
-                        byte0 = 7;
-                    }
-                    if(flag3 && flag5)
-                    {
-                        byte0 = 6;
-                    }
-                }
-            }
-        }
-        if(byte0 == 0)
-        {
-            if(BlockRail.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ - 1))
-            {
-                byte0 = 4;
-            }
-            if(BlockRail.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ + 1))
-            {
-                byte0 = 5;
-            }
-        }
-        if(byte0 == 1)
-        {
-            if(BlockRail.isRailBlockAt(worldObj, trackX + 1, trackY + 1, trackZ))
-            {
-                byte0 = 2;
-            }
-            if(BlockRail.isRailBlockAt(worldObj, trackX - 1, trackY + 1, trackZ))
-            {
-                byte0 = 3;
-            }
-        }
-        if(byte0 < 0)
-        {
-            byte0 = 0;
-        }
-        setConnections(byte0);
-        int i = byte0;
-        if(isPoweredRail)
-        {
-            i = worldObj.getBlockMetadata(trackX, trackY, trackZ) & 8 | byte0;
-        }
-        if(flag1 || worldObj.getBlockMetadata(trackX, trackY, trackZ) != i)
-        {
-            worldObj.setBlockMetadataWithNotify(trackX, trackY, trackZ, i);
-            for(int j = 0; j < connectedTracks.size(); j++)
-            {
-                RailLogic raillogic = getMinecartTrackLogic((ChunkPosition)connectedTracks.get(j));
-                if(raillogic == null)
-                {
-                    continue;
-                }
-                raillogic.func_785_b();
-                if(raillogic.handleKeyPress(this))
-                {
-                    raillogic.func_788_d(this);
-                }
-            }
-
-        }
-    }
-
-    public static int getNAdjacentTracks(RailLogic raillogic)
-    {
-        return raillogic.getAdjacentTracks();
-    }
-
-    private World worldObj;
-    private int trackX;
-    private int trackY;
-    private int trackZ;
-    private final boolean isPoweredRail;
-    private List connectedTracks;
-    final BlockRail rail; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/core/block/logic/RedstoneUpdateInfo.java b/src/main/java/net/minecraft/core/block/logic/RedstoneUpdateInfo.java
index a58220590..133508cf0 100644
--- a/src/main/java/net/minecraft/core/block/logic/RedstoneUpdateInfo.java
+++ b/src/main/java/net/minecraft/core/block/logic/RedstoneUpdateInfo.java
@@ -1,15 +1,17 @@
 package net.minecraft.core.block.logic;
 
 
-public class RedstoneUpdateInfo
-{
+public class RedstoneUpdateInfo {
+    private final int x;
+    private final int y;
+    private final int z;
+    private final long updateTime;
 
-    public RedstoneUpdateInfo(int i, int j, int k, long l)
-    {
-        x = i;
-        y = j;
-        z = k;
-        updateTime = l;
+    public RedstoneUpdateInfo(int x, int y, int z, long updateTime) {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        this.updateTime = updateTime;
     }
 
     public int getXCoord(){
@@ -24,9 +26,4 @@ public class RedstoneUpdateInfo
     public long getUpdateTime(){
         return updateTime;
     }
-
-    int x;
-    int y;
-    int z;
-    long updateTime;
 }
diff --git a/src/main/java/net/minecraft/core/block/material/Material.java b/src/main/java/net/minecraft/core/block/material/Material.java
index eb34c413b..6d2253f0b 100644
--- a/src/main/java/net/minecraft/core/block/material/Material.java
+++ b/src/main/java/net/minecraft/core/block/material/Material.java
@@ -2,12 +2,18 @@ package net.minecraft.core.block.material;
 
 public class Material
 {
+    public static final int LIGHTNING_NEUTRAL = 0;
+    public static final int LIGHTNING_STRONG_CONDUCTOR = 20;
+    public static final int LIGHTNING_LIGHT_CONDUCTOR = 5;
+    public static final int LIGHTNING_LIGHT_INSULATOR = -5;
+    public static final int LIGHTNING_STRONG_INSULATOR = -20;
     private boolean flammable;
     private boolean replaceable;
     private boolean notSolidBlocking;
     public final MaterialColor color;
     private boolean alwaysDestroyable;
     private int pushReaction;
+    private int lightningConductivity = LIGHTNING_NEUTRAL;
 
     public Material(MaterialColor color)
     {
@@ -35,19 +41,19 @@ public class Material
         return true;
     }
 
-    private Material notSolidBlocking()
+    public Material notSolidBlocking()
     {
         notSolidBlocking = true;
         return this;
     }
 
-    private Material notAlwaysDestroyable()
+    public Material notAlwaysDestroyable()
     {
         alwaysDestroyable = false;
         return this;
     }
 
-    private Material flammable()
+    public Material flammable()
     {
         flammable = true;
         return this;
@@ -91,80 +97,63 @@ public class Material
         return pushReaction;
     }
 
-    protected Material destroyOnPush()
+    public Material destroyOnPush()
     {
         pushReaction = 1;
         return this;
     }
 
-    protected Material notPushable()
+    public Material notPushable()
     {
         pushReaction = 2;
         return this;
     }
-
-    public static final Material air;
-    public static final Material grass;
-    public static final Material dirt;
-    public static final Material wood;
-    public static final Material stone;
-    public static final Material metal;
-    public static final Material water;
-    public static final Material lava;
-    public static final Material leaves;
-    public static final Material plant;
-    public static final Material sponge;
-    public static final Material cloth;
-    public static final Material fire;
-    public static final Material sand;
-    public static final Material decoration;
-    public static final Material glass;
-    public static final Material explosive;
-    public static final Material coral;
-    public static final Material ice;
-    public static final Material topSnow;
-    public static final Material snow;
-    public static final Material cactus;
-    public static final Material clay;
-    public static final Material vegetable;
-    public static final Material portal;
-    public static final Material cake;
-    public static final Material web;
-    public static final Material piston;
-    public static final Material moss;
-    public static final Material woodWet;
-
-    static 
-    {
-        air = new GasMaterial(MaterialColor.none);
-        grass = new Material(MaterialColor.grass);
-        dirt = new Material(MaterialColor.dirt);
-        wood = (new Material(MaterialColor.wood)).flammable();
-        stone = (new Material(MaterialColor.stone)).notAlwaysDestroyable();
-        metal = (new Material(MaterialColor.metal)).notAlwaysDestroyable();
-        water = (new LiquidMaterial(MaterialColor.water)).destroyOnPush();
-        lava = (new LiquidMaterial(MaterialColor.fire)).destroyOnPush();
-        leaves = (new Material(MaterialColor.plant)).flammable().notSolidBlocking().destroyOnPush();
-        plant = (new DecorationMaterial(MaterialColor.plant)).destroyOnPush().replaceable();
-        sponge = new Material(MaterialColor.wool);
-        cloth = (new Material(MaterialColor.wool)).flammable();
-        fire = (new GasMaterial(MaterialColor.none)).destroyOnPush();
-        sand = new Material(MaterialColor.sand);
-        decoration = (new DecorationMaterial(MaterialColor.none)).destroyOnPush();
-        glass = (new Material(MaterialColor.none)).notSolidBlocking();
-        explosive = (new Material(MaterialColor.fire)).flammable().notSolidBlocking();
-        coral = (new Material(MaterialColor.plant)).destroyOnPush();
-        ice = (new Material(MaterialColor.ice)).notSolidBlocking();
-        topSnow = (new DecorationMaterial(MaterialColor.snow)).replaceable().notSolidBlocking().notAlwaysDestroyable().destroyOnPush();
-        snow = (new Material(MaterialColor.snow)).notAlwaysDestroyable();
-        cactus = (new Material(MaterialColor.plant)).notSolidBlocking().destroyOnPush();
-        clay = new Material(MaterialColor.clay);
-        vegetable = (new Material(MaterialColor.plant)).destroyOnPush();
-        portal = (new PortalMaterial(MaterialColor.none)).notPushable();
-        cake = (new Material(MaterialColor.none)).destroyOnPush();
-        web = (new Material(MaterialColor.wool)).notAlwaysDestroyable().destroyOnPush();
-        piston = (new Material(MaterialColor.stone)).notPushable();
-        moss = (new Material(MaterialColor.grass)).flammable().notAlwaysDestroyable();
-        woodWet = (new Material(MaterialColor.grass));
+    public int getConductivity(){
+        return lightningConductivity;
+    }
+    public Material setConductivity(int conductivity){
+        lightningConductivity = conductivity;
+        return this;
     }
+
+
+    public static final Material air = new GasMaterial(MaterialColor.none);
+    public static final Material grass = new Material(MaterialColor.grass);
+    public static final Material dirt = new Material(MaterialColor.dirt);
+    public static final Material wood = new Material(MaterialColor.wood).flammable();
+
+    public static final Material stone = new Material(MaterialColor.stone).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material basalt = new Material(MaterialColor.basalt).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material limestone = new Material(MaterialColor.limestone).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material granite = new Material(MaterialColor.granite).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material permafrost = new Material(MaterialColor.permafrost).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material marble = new Material(MaterialColor.marble).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material slate = new Material(MaterialColor.slate).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+    public static final Material netherrack = new Material(MaterialColor.netherrack).setConductivity(LIGHTNING_LIGHT_INSULATOR).notAlwaysDestroyable();
+
+    public static final Material metal = new Material(MaterialColor.metal).setConductivity(LIGHTNING_STRONG_CONDUCTOR).notAlwaysDestroyable();
+    public static final Material water = new LiquidMaterial(MaterialColor.water).setConductivity(LIGHTNING_LIGHT_CONDUCTOR).destroyOnPush();
+    public static final Material lava = new LiquidMaterial(MaterialColor.fire).destroyOnPush();
+    public static final Material leaves = new Material(MaterialColor.plant).flammable().notSolidBlocking().destroyOnPush();
+    public static final Material plant = new DecorationMaterial(MaterialColor.plant).destroyOnPush().replaceable();
+    public static final Material sponge = new Material(MaterialColor.wool);
+    public static final Material cloth = new Material(MaterialColor.wool).flammable();
+    public static final Material fire = new GasMaterial(MaterialColor.none).destroyOnPush();
+    public static final Material sand = new Material(MaterialColor.sand);
+    public static final Material decoration = new DecorationMaterial(MaterialColor.none).destroyOnPush();
+    public static final Material glass = new Material(MaterialColor.none).setConductivity(LIGHTNING_STRONG_INSULATOR).notSolidBlocking();
+    public static final Material explosive = new Material(MaterialColor.fire).flammable().notSolidBlocking();
+    public static final Material coral = new Material(MaterialColor.plant).destroyOnPush();
+    public static final Material ice = new Material(MaterialColor.ice).notSolidBlocking();
+    public static final Material topSnow = new DecorationMaterial(MaterialColor.snow).replaceable().notSolidBlocking().notAlwaysDestroyable().destroyOnPush();
+    public static final Material snow = new Material(MaterialColor.snow).notAlwaysDestroyable();
+    public static final Material cactus = new Material(MaterialColor.plant).notSolidBlocking().destroyOnPush();
+    public static final Material clay = new Material(MaterialColor.clay);
+    public static final Material vegetable = new Material(MaterialColor.plant).destroyOnPush();
+    public static final Material portal = new PortalMaterial(MaterialColor.none).notPushable();
+    public static final Material cake = new Material(MaterialColor.none).destroyOnPush();
+    public static final Material web = new Material(MaterialColor.wool).notAlwaysDestroyable().destroyOnPush();
+    public static final Material piston = new Material(MaterialColor.stone).notPushable();
+    public static final Material moss = new Material(MaterialColor.grass).flammable().notAlwaysDestroyable();
+    public static final Material woodWet = (new Material(MaterialColor.grass).setConductivity(LIGHTNING_LIGHT_CONDUCTOR));
 }
diff --git a/src/main/java/net/minecraft/core/block/material/MaterialColor.java b/src/main/java/net/minecraft/core/block/material/MaterialColor.java
index 2a76416a4..e8ab9faef 100644
--- a/src/main/java/net/minecraft/core/block/material/MaterialColor.java
+++ b/src/main/java/net/minecraft/core/block/material/MaterialColor.java
@@ -1,17 +1,16 @@
 package net.minecraft.core.block.material;
 
 
-public class MaterialColor
-{
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
-    private MaterialColor(int id, int col)
-    {
-        this.id = id;
-        this.col = col;
-        materialColors[id] = this;
-    }
+import java.util.HashMap;
+import java.util.Map;
 
-    public static final MaterialColor[] materialColors = new MaterialColor[16];
+public class MaterialColor {
+    private static final int ALLOCATED_COLORS = 0b1000000;
+    private static final MaterialColor[] materialColors = new MaterialColor[ALLOCATED_COLORS];
+    // <<<<< Original pallet >>>>>
     public static final MaterialColor none = new MaterialColor(0, 0);
     public static final MaterialColor grass = new MaterialColor(1, 0x7fb238);
     public static final MaterialColor sand = new MaterialColor(2, 0xf7e9a3);
@@ -19,14 +18,125 @@ public class MaterialColor
     public static final MaterialColor fire = new MaterialColor(4, 0xff0000);
     public static final MaterialColor ice = new MaterialColor(5, 0xa0a0ff);
     public static final MaterialColor metal = new MaterialColor(6, 0xa7a7a7);
-    public static final MaterialColor plant = new MaterialColor(7, 31744);
+    public static final MaterialColor plant = new MaterialColor(7, 0x007c00);
     public static final MaterialColor snow = new MaterialColor(8, 0xffffff);
     public static final MaterialColor clay = new MaterialColor(9, 0xa4a8b8);
-    public static final MaterialColor dirt = new MaterialColor(10, 0xb76a2f);
+    public static final MaterialColor dirt = new MaterialColor(10, 0x876145);
     public static final MaterialColor stone = new MaterialColor(11, 0x707070);
     public static final MaterialColor water = new MaterialColor(12, 0x4040ff);
     public static final MaterialColor wood = new MaterialColor(13, 0x685332);
-    public final int col;
+    // <<<<< Original pallet >>>>>
+
+    // <<<<< Stone Colors pallet >>>>>
+    public static final MaterialColor limestone = new MaterialColor(14, 0xd9cb9a);
+    public static final MaterialColor granite = new MaterialColor(15, 0xcba17b);
+    public static final MaterialColor basalt = new MaterialColor(16, 0x2e2e2e);
+    public static final MaterialColor permafrost = new MaterialColor(17, 0xa7b6cc);
+    public static final MaterialColor marble = new MaterialColor(18, 0xeaeae0);
+    public static final MaterialColor slate = new MaterialColor(19, 0x6e6b93);
+    public static final MaterialColor netherrack = new MaterialColor(20, 0x6b1013);
+    public static final MaterialColor brick = new MaterialColor(21, 0x7c4536);
+    // <<<<< Stone Colors pallet >>>>>
+
+    // <<<<< Resource Colors pallet >>>>>
+    public static final MaterialColor iron = new MaterialColor(30, 0xececec);
+    public static final MaterialColor gold = new MaterialColor(31, 0xfdf656);
+    public static final MaterialColor lapis = new MaterialColor(32, 0x1e48a7);
+    public static final MaterialColor coal = new MaterialColor(33, 0x141414);
+    public static final MaterialColor olivine = new MaterialColor(34, 0x7cd939);
+    public static final MaterialColor quartz = new MaterialColor(35, 0xf4cdd3);
+    public static final MaterialColor redstone = new MaterialColor(36, 0x930000);
+    public static final MaterialColor steel = new MaterialColor(37, 0x414141);
+    public static final MaterialColor diamond = new MaterialColor(38, 0x84e3df);
+    // <<<<< Resource Colors pallet >>>>>
+    // <<<<< Environment Colors pallet >>>>>
+    public static final MaterialColor dirtScorched = new MaterialColor(40, 0xb26c2d);
+    public static final MaterialColor grassScorched = new MaterialColor(41, 0xaf985a);
+    public static final MaterialColor mud = new MaterialColor(42, 0x492e10);
+
+
+    public static final MaterialColor birchLeaves = new MaterialColor(43, 0x639472);
+    public static final MaterialColor thornLeaves = new MaterialColor(44, 0x929340);
+    public static final MaterialColor pineLeaves = new MaterialColor(45, 0x253c25);
+    public static final MaterialColor palmLeaves = new MaterialColor(46, 0x607313);
+    public static final MaterialColor cherryLeaves = new MaterialColor(47, 0xc36f8f);
+    // <<<<< Environment Colors pallet >>>>>
+
+    // <<<<< Painted Colors pallet >>>>>
+    public static final MaterialColor paintedWhite = new MaterialColor(48, 0xffffff);
+    public static final MaterialColor paintedOrange = new MaterialColor(49, 0xe87126);
+    public static final MaterialColor paintedMagenta = new MaterialColor(50, 0xb443c2);
+    public static final MaterialColor paintedLightblue = new MaterialColor(51, 0x5a7eca);
+    public static final MaterialColor paintedYellow = new MaterialColor(52, 0xd3c55f);
+    public static final MaterialColor paintedLime = new MaterialColor(53, 0x54b24f);
+    public static final MaterialColor paintedPink = new MaterialColor(54, 0xdb6f8d);
+    public static final MaterialColor paintedGrey = new MaterialColor(55, 0x484848);
+    public static final MaterialColor paintedSilver = new MaterialColor(56, 0x969e9e);
+    public static final MaterialColor paintedCyan = new MaterialColor(57, 0x398796);
+    public static final MaterialColor paintedPurple = new MaterialColor(58, 0x7c44db);
+    public static final MaterialColor paintedBlue = new MaterialColor(59, 0x2131e9);
+    public static final MaterialColor paintedBrown = new MaterialColor(60, 0x6e321c);
+    public static final MaterialColor paintedGreen = new MaterialColor(61, 0x266326);
+    public static final MaterialColor paintedRed = new MaterialColor(62, 0xed33434);
+    public static final MaterialColor paintedBlack = new MaterialColor(63, 0x020202);
+    // <<<<< Painted Colors pallet >>>>>
+    private static final Map<Integer, Integer> blockIdColorIndexMap = new HashMap<>();
+    private final int col;
     public final int id;
+    private MaterialColor(int id, int col)
+    {
+        this.id = id;
+        this.col = col;
+        materialColors[id] = this;
+    }
+
+    private static int makeBlockIndex(Block block, int meta){
+        return block.id << 8 | meta;
+    }
+    public static void registerManualBlockColor(Block block, int meta, MaterialColor color){
+        int blockIndex = makeBlockIndex(block, meta);
+        blockIdColorIndexMap.put(blockIndex, color.id);
+    }
+    public static int getColorIndexFromBlock(Block block, int meta){
+        int blockIndex = makeBlockIndex(block, meta);
+        if (blockIdColorIndexMap.containsKey(blockIndex)){
+            return blockIdColorIndexMap.get(blockIndex);
+        }
+        blockIndex = makeBlockIndex(block, 0);
+        if (blockIdColorIndexMap.containsKey(blockIndex)){
+            return blockIdColorIndexMap.get(blockIndex);
+        }
+        return block.getMaterialColor().id;
+    }
+    public static int getColorFromIndex(int colorIndex){
+        colorIndex &= (ALLOCATED_COLORS - 1);
+        MaterialColor col = materialColors[colorIndex];
+        if (col == null) return none.col;
+        return col.col;
+    }
+
+    public static void assignManualEntries(){
+        for (int i = 0; i < 16; i++) {
+            MaterialColor color = materialColors[i + paintedWhite.id];
+            registerManualBlockColor(Blocks.PLANKS_OAK_PAINTED, i, color);
+            registerManualBlockColor(Blocks.WOOL, i, color);
+            registerManualBlockColor(Blocks.FENCE_PLANKS_OAK_PAINTED, i, color);
+            // Fill out each rotation value for rotated colored blocks
+            for (int j = 0; j < 16; j++) {
+                registerManualBlockColor(Blocks.SLAB_PLANKS_PAINTED, i << 4 | j, color);
+                registerManualBlockColor(Blocks.CHEST_PLANKS_OAK_PAINTED, i << 4 | j, color);
+                registerManualBlockColor(Blocks.CHEST_LEGACY_PAINTED, i << 4 | j, color);
+                registerManualBlockColor(Blocks.STAIRS_PLANKS_PAINTED, i << 4 | j, color);
+                registerManualBlockColor(Blocks.TRAPDOOR_PLANKS_PAINTED, i << 4 | j, color);
+                registerManualBlockColor(Blocks.DOOR_PLANKS_PAINTED_BOTTOM, i << 4 | j, color);
+                registerManualBlockColor(Blocks.DOOR_PLANKS_PAINTED_TOP, i << 4 | j, color);
+            }
+            registerManualBlockColor(Blocks.LAMP_ACTIVE, i, color);
+            registerManualBlockColor(Blocks.LAMP_IDLE, i, color);
+        }
 
+        for (int i = 1; i < 256; i++) {
+            registerManualBlockColor(Blocks.FARMLAND_DIRT, i, mud);
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java b/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
similarity index 79%
rename from src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java
rename to src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
index f54487a8f..ea4582340 100644
--- a/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java
+++ b/src/main/java/net/minecraft/core/block/piston/BasePistonBlock.java
@@ -1,12 +1,13 @@
 package net.minecraft.core.block.piston;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.logic.PistonDirections;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.enums.EnumDropCause;
-import net.minecraft.core.item.block.ItemBlockPiston;
+import net.minecraft.core.item.block.PistonBlockItem;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
@@ -16,14 +17,14 @@ import net.minecraft.core.world.WorldSource;
 
 import java.util.ArrayList;
 
-public class BlockPistonBase extends Block
+public class BasePistonBlock extends Block
 {
 
-    public BlockPistonBase(String key, int id, boolean isSticky)
+    public BasePistonBlock(String key, String namespaceId, int id, boolean isSticky)
     {
-        super(key, id, Material.piston);
+        super(key, namespaceId, id, Material.piston);
         this.isSticky = isSticky;
-        setBlockItem(() -> new ItemBlockPiston(this));
+        setBlockItem(() -> new PistonBlockItem(this));
         withHardness(0.5F);
     }
 
@@ -34,8 +35,8 @@ public class BlockPistonBase extends Block
     }
 
     @Override
-    public void onBlockPlaced(World world, int x, int y, int z, Side side, EntityLiving entity, double sideHeight) {
-    	Direction placementDirection = entity.getPlacementDirection(side).getOpposite();
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    	Direction placementDirection = mob.getPlacementDirection(side).getOpposite();
         world.setBlockMetadataWithNotify(x, y, z, placementDirection.getId());
         if(!world.isClientSide)
         {
@@ -50,9 +51,9 @@ public class BlockPistonBase extends Block
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
-        if(!world.isClientSide && world.getBlockTileEntity(x, y, z) == null)
+        if(!world.isClientSide && world.getBlockEntity(x, y, z) == null)
         {
             checkIfExtend(world, x, y, z);
         }
@@ -63,7 +64,7 @@ public class BlockPistonBase extends Block
         int data = world.getBlockMetadata(x, y, z);
         int direction = getDirection(data);
         boolean hasNeighborSignal = getNeighborSignal(world, x, y, z, direction);
-        if(data == 7)
+        if(data == 0b111)
         {
             return;
         }
@@ -82,53 +83,41 @@ public class BlockPistonBase extends Block
         }
     }
 
-    private boolean getNeighborSignal(World world, int x, int y, int z, int direction)
-    {
-        if(direction != 0 && world.isBlockIndirectlyProvidingPowerTo(x, y - 1, z, 0))
-        {
+    private boolean getNeighborSignal(World world, int x, int y, int z, int direction) {
+        if(direction != 0 && world.isBlockIndirectlyProvidingPowerTo(x, y - 1, z, Side.BOTTOM)) {
             return true;
         }
-        if(direction != 1 && world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z, 1))
-        {
+        if(direction != 1 && world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z, Side.TOP)) {
             return true;
         }
-        if(direction != 2 && world.isBlockIndirectlyProvidingPowerTo(x, y, z - 1, 2))
-        {
+        if(direction != 2 && world.isBlockIndirectlyProvidingPowerTo(x, y, z - 1, Side.NORTH)) {
             return true;
         }
-        if(direction != 3 && world.isBlockIndirectlyProvidingPowerTo(x, y, z + 1, 3))
-        {
+        if(direction != 3 && world.isBlockIndirectlyProvidingPowerTo(x, y, z + 1, Side.SOUTH)) {
             return true;
         }
-        if(direction != 5 && world.isBlockIndirectlyProvidingPowerTo(x + 1, y, z, 5))
-        {
+        if(direction != 5 && world.isBlockIndirectlyProvidingPowerTo(x + 1, y, z, Side.EAST)) {
             return true;
         }
-        if(direction != 4 && world.isBlockIndirectlyProvidingPowerTo(x - 1, y, z, 4))
-        {
+        if(direction != 4 && world.isBlockIndirectlyProvidingPowerTo(x - 1, y, z, Side.WEST)) {
             return true;
         }
-        if(world.isBlockIndirectlyProvidingPowerTo(x, y, z, 0))
-        {
+        if(world.isBlockIndirectlyProvidingPowerTo(x, y, z, Side.BOTTOM)) {
             return true;
         }
-        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 2, z, 1))
-        {
+        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 2, z, Side.TOP)) {
             return true;
         }
-        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z - 1, 2))
-        {
+        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z - 1, Side.NORTH)) {
             return true;
         }
-        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z + 1, 3))
-        {
+        if(world.isBlockIndirectlyProvidingPowerTo(x, y + 1, z + 1, Side.SOUTH)) {
             return true;
         }
-        if(world.isBlockIndirectlyProvidingPowerTo(x - 1, y + 1, z, 4))
-        {
+        if(world.isBlockIndirectlyProvidingPowerTo(x - 1, y + 1, z, Side.WEST)) {
             return true;
         }
-        return world.isBlockIndirectlyProvidingPowerTo(x + 1, y + 1, z, 5);
+        return world.isBlockIndirectlyProvidingPowerTo(x + 1, y + 1, z, Side.EAST);
     }
 
     @Override
@@ -146,13 +135,13 @@ public class BlockPistonBase extends Block
         }
         else if(index == 1)
         {
-            TileEntity tileentity = world.getBlockTileEntity(x + PistonDirections.xOffset[direction], y + PistonDirections.yOffset[direction], z + PistonDirections.zOffset[direction]);
-            if(tileentity != null && (tileentity instanceof TileEntityPistonMoving))
+            BlockEntity tileentity = world.getBlockEntity(x + PistonDirections.xOffset[direction], y + PistonDirections.yOffset[direction], z + PistonDirections.zOffset[direction]);
+            if(tileentity != null && (tileentity instanceof MovingPistonBlockEntity))
             {
-                ((TileEntityPistonMoving)tileentity).finalTick();
+                ((MovingPistonBlockEntity)tileentity).finalTick();
             }
-            world.setBlockAndMetadata(x, y, z, Block.pistonMoving.id, direction);
-            world.setBlockTileEntity(x, y, z, BlockPistonMoving.createTileEntity(id, direction, direction, false, true));
+            world.setBlockAndMetadata(x, y, z, Blocks.PISTON_MOVING.id, direction);
+            world.setBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id, direction, direction, false, true));
             if(isSticky)
             {
                 int x1 = x + PistonDirections.xOffset[direction] * 2;
@@ -161,12 +150,12 @@ public class BlockPistonBase extends Block
                 int id1 = world.getBlockId(x1, y1, z1);
                 int meta1 = world.getBlockMetadata(x1, y1, z1);
                 boolean flag = false;
-                if(id1 == Block.pistonMoving.id)
+                if(id1 == Blocks.PISTON_MOVING.id)
                 {
-                    TileEntity tileentity1 = world.getBlockTileEntity(x1, y1, z1);
-                    if(tileentity1 != null && (tileentity1 instanceof TileEntityPistonMoving))
+                    BlockEntity tileentity1 = world.getBlockEntity(x1, y1, z1);
+                    if(tileentity1 != null && (tileentity1 instanceof MovingPistonBlockEntity))
                     {
-                        TileEntityPistonMoving tileentitypiston = (TileEntityPistonMoving)tileentity1;
+                        MovingPistonBlockEntity tileentitypiston = (MovingPistonBlockEntity)tileentity1;
                         if(tileentitypiston.getDirection() == direction && tileentitypiston.isExtending())
                         {
                             tileentitypiston.finalTick();
@@ -176,14 +165,14 @@ public class BlockPistonBase extends Block
                         }
                     }
                 }
-                if(!flag && id1 > 0 && isPushable(id1, world, x1, y1, z1, false) && (Block.blocksList[id1].getPistonPushReaction() == 0 || id1 == Block.pistonBase.id || id1 == Block.pistonBaseSticky.id))
+                if(!flag && id1 > 0 && isPushable(id1, world, x1, y1, z1, false) && (Block.blocksList[id1].getPistonPushReaction() == 0 || id1 == Blocks.PISTON_BASE.id || id1 == Blocks.PISTON_BASE_STICKY.id))
                 {
                     world.setBlockWithNotify(x1, y1, z1, 0);
                     x += PistonDirections.xOffset[direction];
                     y += PistonDirections.yOffset[direction];
                     z += PistonDirections.zOffset[direction];
-                    world.setBlockAndMetadata(x, y, z, Block.pistonMoving.id, meta1);
-                    world.setBlockTileEntity(x, y, z, BlockPistonMoving.createTileEntity(id1, meta1, direction, false, false));
+                    world.setBlockAndMetadata(x, y, z, Blocks.PISTON_MOVING.id, meta1);
+                    world.setBlockTileEntity(x, y, z, MovingPistonBlock.createTileEntity(id1, meta1, direction, false, false));
                 } else
                 if(!flag)
                 {
@@ -237,14 +226,14 @@ public class BlockPistonBase extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     public static int getDirection(int data)
     {
-        return data & 7;
+        return data & 0b111;
     }
 
     public static boolean isPowered(int data)
@@ -254,11 +243,11 @@ public class BlockPistonBase extends Block
     
     private static boolean isPushable(int id, World world, int x, int y, int z, boolean canDestroy)
     {
-        if(id == Block.obsidian.id)
+        if(id == Blocks.OBSIDIAN.id)
         {
             return false;
         }
-        if(id == Block.pistonBase.id || id == Block.pistonBaseSticky.id)
+        if(id == Blocks.PISTON_BASE.id || id == Blocks.PISTON_BASE_STICKY.id)
         {
             if(isPowered(world.getBlockMetadata(x, y, z)))
             {
@@ -283,7 +272,7 @@ public class BlockPistonBase extends Block
                 return false;
             }
         }
-        TileEntity tileentity = world.getBlockTileEntity(x, y, z);
+        BlockEntity tileentity = world.getBlockEntity(x, y, z);
         return tileentity == null;
     }
 
@@ -310,7 +299,7 @@ public class BlockPistonBase extends Block
             }
             if(!isPushable(id, world, xo, yo, zo, true))
             {
-                if(i == 1 && (id == Block.obsidian.id || id == Block.bedrock.id)){
+                if(i == 1 && (id == Blocks.OBSIDIAN.id || id == Blocks.BEDROCK.id)){
                     int x2 = x + PistonDirections.xOffset[direction % 6];
                     int y2 = y + PistonDirections.yOffset[direction % 6];
                     int z2 = z + PistonDirections.zOffset[direction % 6];
@@ -387,12 +376,12 @@ public class BlockPistonBase extends Block
             int j3 = world.getBlockMetadata(i2, k2, l2);
             if(i3 == id && i2 == x && k2 == y && l2 == z)
             {
-                world.setBlockAndMetadata(i1, j1, k1, Block.pistonMoving.id, direction | (isSticky ? 8 : 0));
-                world.setBlockTileEntity(i1, j1, k1, BlockPistonMoving.createTileEntity(Block.pistonHead.id, direction | (isSticky ? 8 : 0), direction, true, false));
+                world.setBlockAndMetadata(i1, j1, k1, Blocks.PISTON_MOVING.id, direction | (isSticky ? 8 : 0));
+                world.setBlockTileEntity(i1, j1, k1, MovingPistonBlock.createTileEntity(Blocks.PISTON_HEAD.id, direction | (isSticky ? 8 : 0), direction, true, false));
             } else
             {
-                world.setBlockAndMetadata(i1, j1, k1, Block.pistonMoving.id, j3);
-                world.setBlockTileEntity(i1, j1, k1, BlockPistonMoving.createTileEntity(i3, j3, direction, true, false));
+                world.setBlockAndMetadata(i1, j1, k1, Blocks.PISTON_MOVING.id, j3);
+                world.setBlockTileEntity(i1, j1, k1, MovingPistonBlock.createTileEntity(i3, j3, direction, true, false));
             }
             i1 = i2;
             j1 = k2;
diff --git a/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
similarity index 73%
rename from src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java
rename to src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
index f5c4d0778..a85ad3f76 100644
--- a/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java
+++ b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlock.java
@@ -1,8 +1,9 @@
 package net.minecraft.core.block.piston;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockTileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.EntityBlock;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.logic.PistonDirections;
@@ -10,41 +11,40 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 
 // Referenced classes of package net.minecraft.src:
 //            BlockContainer, Material, World, TileEntityPiston, 
 //            Block, PistonBlockTextures, AxisAlignedBB, IBlockAccess, 
-//            TileEntity, EntityPlayer
+//            BlockEntity, Player
 
-public class BlockPistonMoving extends BlockTileEntity
+public class MovingPistonBlock extends EntityBlock
 {
 
-    public BlockPistonMoving(String key, int id)
+    public MovingPistonBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.piston);
+        super(key, namespaceId, id, Material.piston);
         withHardness(-1F);
     }
 
     @Override
-	protected TileEntity getNewBlockEntity()
+	protected BlockEntity getNewBlockEntity()
     {
         return null;
     }
 
     @Override
-	public void onBlockAdded(World world, int x, int y, int z)
+	public void onBlockPlacedByWorld(World world, int x, int y, int z)
     {
     }
 
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
-        TileEntity tileentity = world.getBlockTileEntity(x, y, z);
-        if(tileentity != null && (tileentity instanceof TileEntityPistonMoving))
+        BlockEntity tileentity = world.getBlockEntity(x, y, z);
+        if(tileentity != null && (tileentity instanceof MovingPistonBlockEntity))
         {
-            ((TileEntityPistonMoving)tileentity).finalTick();
+            ((MovingPistonBlockEntity)tileentity).finalTick();
         } else
         {
             super.onBlockRemoved(world, x, y, z, data);
@@ -58,7 +58,7 @@ public class BlockPistonMoving extends BlockTileEntity
     }
 
     @Override
-    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side)
     {
         return false;
     }
@@ -70,15 +70,15 @@ public class BlockPistonMoving extends BlockTileEntity
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
-        if(!world.isClientSide && world.getBlockTileEntity(x, y, z) == null)
+        if(!world.isClientSide && world.getBlockEntity(x, y, z) == null)
         {
             world.setBlockWithNotify(x, y, z, 0);
             return true;
@@ -89,19 +89,19 @@ public class BlockPistonMoving extends BlockTileEntity
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         return null;
     }
 
     @Override
-    public void dropBlockWithCause(World world, EnumDropCause cause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public void dropBlockWithCause(World world, EnumDropCause cause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if(world.isClientSide)
         {
             return;
         }
-        TileEntityPistonMoving piston = getBlockEntity(world, x, y, z);
+        MovingPistonBlockEntity piston = getBlockEntity(world, x, y, z);
         if(piston != null)
         {
             Block.blocksList[piston.getMovedId()].dropBlockWithCause(world, EnumDropCause.WORLD, x, y, z, meta, null);
@@ -113,19 +113,19 @@ public class BlockPistonMoving extends BlockTileEntity
     {
         if(!world.isClientSide)
         {
-            if(world.getBlockTileEntity(x, y, z) != null);
+            if(world.getBlockEntity(x, y, z) != null);
         }
     }
 
-    public static TileEntity createTileEntity(int id, int oldData, int newData, boolean flag, boolean flag1)
+    public static BlockEntity createTileEntity(int id, int oldData, int newData, boolean flag, boolean flag1)
     {
-        return new TileEntityPistonMoving(id, oldData, newData, flag, flag1);
+        return new MovingPistonBlockEntity(id, oldData, newData, flag, flag1);
     }
 
     @Override
 	public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
     {
-        TileEntityPistonMoving tileEntity = getBlockEntity(world, x, y, z);
+        MovingPistonBlockEntity tileEntity = getBlockEntity(world, x, y, z);
         if(tileEntity == null)
         {
             return null;
@@ -141,7 +141,7 @@ public class BlockPistonMoving extends BlockTileEntity
     @Override
     public void setBlockBoundsBasedOnState(WorldSource world, int x, int y, int z)
     {
-        TileEntityPistonMoving tileentitypiston = getBlockEntity(world, x, y, z);
+        MovingPistonBlockEntity tileentitypiston = getBlockEntity(world, x, y, z);
         if(tileentitypiston != null)
         {
             Block block = Block.blocksList[tileentitypiston.getMovedId()];
@@ -187,12 +187,12 @@ public class BlockPistonMoving extends BlockTileEntity
         }
     }
 
-    private TileEntityPistonMoving getBlockEntity(WorldSource world, int x, int y, int z)
+    private MovingPistonBlockEntity getBlockEntity(WorldSource world, int x, int y, int z)
     {
-        TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
-        if(tileEntity instanceof TileEntityPistonMoving)
+        BlockEntity blockEntity = world.getBlockEntity(x, y, z);
+        if(blockEntity instanceof MovingPistonBlockEntity)
         {
-            return (TileEntityPistonMoving)tileEntity;
+            return (MovingPistonBlockEntity) blockEntity;
         }
         else
         {
diff --git a/src/main/java/net/minecraft/core/block/piston/TileEntityPistonMoving.java b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
similarity index 88%
rename from src/main/java/net/minecraft/core/block/piston/TileEntityPistonMoving.java
rename to src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
index 2c838ea84..60f1f042e 100644
--- a/src/main/java/net/minecraft/core/block/piston/TileEntityPistonMoving.java
+++ b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
@@ -1,22 +1,22 @@
 package net.minecraft.core.block.piston;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.phys.AABB;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.block.logic.PistonDirections;
 
 import java.util.*;
 
-public class TileEntityPistonMoving extends TileEntity
+public class MovingPistonBlockEntity extends BlockEntity
 {
 
-    public TileEntityPistonMoving()
+    public MovingPistonBlockEntity()
     {
     }
 
-    public TileEntityPistonMoving(int movedId, int movedData, int direction, boolean extending, boolean isSourcePiston)
+    public MovingPistonBlockEntity(int movedId, int movedData, int direction, boolean extending, boolean isSourcePiston)
     {
         this.movedId = movedId;
         this.movedData = movedData;
@@ -102,7 +102,7 @@ public class TileEntityPistonMoving extends TileEntity
         {
             f = 1.0F - f;
         }
-        AABB axisalignedbb = ((BlockPistonMoving) Block.pistonMoving).getCollisionShapeFromTileEntity(worldObj, x, y, z, movedId, f, direction);
+        AABB axisalignedbb = ((MovingPistonBlock) Blocks.PISTON_MOVING).getCollisionShapeFromTileEntity(worldObj, x, y, z, movedId, f, direction);
         if(axisalignedbb != null)
         {
             List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb);
@@ -130,7 +130,7 @@ public class TileEntityPistonMoving extends TileEntity
             progressO = progress = 1.0F;
             worldObj.removeBlockTileEntity(x, y, z);
             invalidate();
-            if(worldObj.getBlockId(x, y, z) == Block.pistonMoving.id)
+            if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id)
             {
                 worldObj.setBlockAndMetadataWithNotify(x, y, z, movedId, movedData);
             }
@@ -146,7 +146,7 @@ public class TileEntityPistonMoving extends TileEntity
             moveCollidedEntities(1.0F, 0.25F);
             worldObj.removeBlockTileEntity(x, y, z);
             invalidate();
-            if(worldObj.getBlockId(x, y, z) == Block.pistonMoving.id)
+            if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id)
             {
                 worldObj.setBlockAndMetadataWithNotify(x, y, z, movedId, movedData);
             }
diff --git a/src/main/java/net/minecraft/core/block/piston/BlockPistonHead.java b/src/main/java/net/minecraft/core/block/piston/PistonHeadBlock.java
similarity index 85%
rename from src/main/java/net/minecraft/core/block/piston/BlockPistonHead.java
rename to src/main/java/net/minecraft/core/block/piston/PistonHeadBlock.java
index 3bc54f8e0..05064fd5b 100644
--- a/src/main/java/net/minecraft/core/block/piston/BlockPistonHead.java
+++ b/src/main/java/net/minecraft/core/block/piston/PistonHeadBlock.java
@@ -2,37 +2,27 @@ package net.minecraft.core.block.piston;
 
 import java.util.ArrayList;
 
-import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.logic.PistonDirections;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockPistonHead extends Block
+public class PistonHeadBlock extends Block
 {
 
-    public BlockPistonHead(String key, int id)
+    public PistonHeadBlock(String key, String namespaceId, int id)
     {
-        super(key, id, Material.piston);
-        faceTexture = null;
+        super(key, namespaceId, id, Material.piston);
         withHardness(0.5F);
     }
 
-    public void setFaceTexture(IconCoordinate icon)
-    {
-        faceTexture = icon;
-    }
-
-    public void resetFace()
-    {
-        faceTexture = null;
-    }
-
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
@@ -46,10 +36,10 @@ public class BlockPistonHead extends Block
         y += PistonDirections.yOffset[orientation];
         z += PistonDirections.zOffset[orientation];
         int k1 = world.getBlockId(x, y, z);
-        if(k1 == Block.pistonBase.id || k1 == Block.pistonBaseSticky.id)
+        if(k1 == Blocks.PISTON_BASE.id || k1 == Blocks.PISTON_BASE_STICKY.id)
         {
             int i1 = world.getBlockMetadata(x, y, z);
-            if(BlockPistonBase.isPowered(i1))
+            if(BasePistonBlock.isPowered(i1))
             {
                 Block.blocksList[k1].dropBlockWithCause(world, EnumDropCause.PROPER_TOOL, x, y, z, i1, null);
                 world.setBlockWithNotify(x, y, z, 0);
@@ -64,7 +54,7 @@ public class BlockPistonHead extends Block
     }
 
     @Override
-	public boolean renderAsNormalBlock()
+	public boolean isCubeShaped()
     {
         return false;
     }
@@ -76,7 +66,7 @@ public class BlockPistonHead extends Block
     }
 
     @Override
-    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side)
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, Side side)
     {
         return false;
     }
@@ -172,7 +162,7 @@ public class BlockPistonHead extends Block
         	return;
         }
         int id = world.getBlockId(x - PistonDirections.xOffset[direction], y - PistonDirections.yOffset[direction], z - PistonDirections.zOffset[direction]);
-        if(id != Block.pistonBase.id && id != Block.pistonBaseSticky.id)
+        if(id != Blocks.PISTON_BASE.id && id != Blocks.PISTON_BASE_STICKY.id)
         {
             world.setBlockWithNotify(x, y, z, 0);
         } else
@@ -183,26 +173,24 @@ public class BlockPistonHead extends Block
 
     public static int getDirectionFromMeta(int meta)
     {
-        return meta & 7;
+        return meta & 0b111;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, BlockEntity blockEntity)
     {
         if (dropCause == EnumDropCause.PICK_BLOCK)
         {
-            if((meta & 8) != 0)
+            if((meta & 0b1000) != 0)
             {
-                return new ItemStack[] { new ItemStack(Block.pistonBaseSticky) };
+                return new ItemStack[] { new ItemStack(Blocks.PISTON_BASE_STICKY) };
             }
             else
             {
-                return new ItemStack[] { new ItemStack(Block.pistonBase) };
+                return new ItemStack[] { new ItemStack(Blocks.PISTON_BASE) };
             }
         }
 
         return null;
     }
-
-    public IconCoordinate faceTexture;
 }
diff --git a/src/main/java/net/minecraft/core/block/tag/BlockTags.java b/src/main/java/net/minecraft/core/block/tag/BlockTags.java
index f6845617c..b2a4e806b 100644
--- a/src/main/java/net/minecraft/core/block/tag/BlockTags.java
+++ b/src/main/java/net/minecraft/core/block/tag/BlockTags.java
@@ -1,8 +1,25 @@
 package net.minecraft.core.block.tag;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.CactusBlock;
+import net.minecraft.core.block.ChainlinkFenceBlock;
+import net.minecraft.core.block.FenceBlock;
+import net.minecraft.core.block.FireBlock;
+import net.minecraft.core.block.FireflyLanternBlock;
+import net.minecraft.core.block.FlowerBlock;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.JarBlock;
+import net.minecraft.core.block.SugarcaneBlock;
+import net.minecraft.core.block.TallGrassBlock;
 import net.minecraft.core.data.tag.Tag;
-import net.minecraft.core.item.ItemToolShears;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.item.ToolShearsItem;
+import net.minecraft.core.item.tool.AxeToolItem;
+import net.minecraft.core.item.tool.HoeToolItem;
+import net.minecraft.core.item.tool.PickaxeToolItem;
+import net.minecraft.core.item.tool.ShovelToolItem;
+import net.minecraft.core.item.tool.SwordToolItem;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -14,27 +31,27 @@ import java.util.List;
 public abstract class BlockTags
 {
     /**
-     * block can be mined by {@link net.minecraft.core.item.tool.ItemToolPickaxe ItemToolPickaxe}.
+     * block can be mined by {@link PickaxeToolItem PickaxeToolItem}.
      */
     public static Tag<Block> MINEABLE_BY_PICKAXE = Tag.of("mineable_by_pickaxe");
     /**
-     * block can be mined by {@link net.minecraft.core.item.tool.ItemToolAxe ItemToolAxe}.
+     * block can be mined by {@link AxeToolItem AxeToolItem}.
      */
     public static Tag<Block> MINEABLE_BY_AXE = Tag.of("mineable_by_axe");
     /**
-     * block can be mined by {@link net.minecraft.core.item.tool.ItemToolShovel ItemToolShovel}.
+     * block can be mined by {@link ShovelToolItem ShovelToolItem}.
      */
     public static Tag<Block> MINEABLE_BY_SHOVEL = Tag.of("mineable_by_shovel");
     /**
-     * block can be mined by {@link net.minecraft.core.item.tool.ItemToolHoe ItemToolHoe}.
+     * block can be mined by {@link HoeToolItem HoeToolItem}.
      */
     public static Tag<Block> MINEABLE_BY_HOE = Tag.of("mineable_by_hoe");
     /**
-     * block can be mined by {@link net.minecraft.core.item.tool.ItemToolSword ItemToolSword}.
+     * block can be mined by {@link SwordToolItem SwordToolItem}.
      */
     public static Tag<Block> MINEABLE_BY_SWORD = Tag.of("mineable_by_sword");
     /**
-     * block can be mined by {@link ItemToolShears ItemShears}.
+     * block can be mined by {@link ToolShearsItem ItemShears}.
      */
     public static Tag<Block> MINEABLE_BY_SHEARS = Tag.of("mineable_by_shears");
     /**
@@ -46,15 +63,15 @@ public abstract class BlockTags
      */
     public static Tag<Block> IS_LAVA = Tag.of("is_lava");
     /**
-     * {@link net.minecraft.core.block.BlockFlower BlockFlower}-derived blocks can be placed on this block.
+     * {@link FlowerBlock FlowerBlock}-derived blocks can be placed on this block.
      */
     public static Tag<Block> GROWS_FLOWERS = Tag.of("grows_flowers");
     /**
-     * {@link net.minecraft.core.block.BlockSugarcane BlockSugarcane} can be placed on this block.
+     * {@link SugarcaneBlock SugarcaneBlock} can be placed on this block.
      */
     public static Tag<Block> GROWS_SUGAR_CANE = Tag.of("grows_sugar_cane");
     /**
-     * {@link net.minecraft.core.block.BlockCactus BlockCactus} can be placed on this block.
+     * {@link CactusBlock CactusBlock} can be placed on this block.
      */
     public static Tag<Block> GROWS_CACTI = Tag.of("grows_cacti");
     /**
@@ -63,11 +80,11 @@ public abstract class BlockTags
     public static Tag<Block> GROWS_TREES = Tag.of("grows_trees");
     public static Tag<Block> GROWS_SPINIFEX = Tag.of("grows_spinifex");
     /**
-     * This block is destroyed when {@link net.minecraft.core.block.BlockFluid BlockFluid}-derived blocks try to move into its space.
+     * This block is destroyed when {@link FluidBlock FluidBlock}-derived blocks try to move into its space.
      */
     public static Tag<Block> BROKEN_BY_FLUIDS = Tag.of("broken_by_fluids");
     /**
-     * The block can have other blocks placed "into" it, like how {@link net.minecraft.core.block.BlockTallGrass BlockTallGrass} behaves.
+     * The block can have other blocks placed "into" it, like how {@link TallGrassBlock TallGrassBlock} behaves.
      */
     public static Tag<Block> PLACE_OVERWRITES = Tag.of("place_overwrites");
     /**
@@ -75,11 +92,11 @@ public abstract class BlockTags
      */
     public static Tag<Block> PASSIVE_MOBS_SPAWN = Tag.of("passive_mobs_spawn");
     /**
-     * {@link net.minecraft.core.entity.animal.EntityFireflyCluster EntityFireflyCluster} can spawn on this block.
+     * {@link FireflyClusterMob FireflyClusterMob} can spawn on this block.
      */
     public static Tag<Block> FIREFLIES_CAN_SPAWN = Tag.of("fireflies_can_spawn");
     /**
-     * {@link net.minecraft.core.block.BlockFence BlockFence} visually connects to this block.
+     * {@link FenceBlock FenceBlock} visually connects to this block.
      */
     public static Tag<Block> FENCES_CONNECT = Tag.of("fences_connect");
     /**
@@ -87,11 +104,11 @@ public abstract class BlockTags
      */
     public static Tag<Block> NOT_IN_CREATIVE_MENU = Tag.of("not_in_creative_menu");
     /**
-     * This block drops as if using a silk touch tool when broken by {@link ItemToolShears ItemShears}.
+     * This block drops as if using a silk touch tool when broken by {@link ToolShearsItem ItemShears}.
      */
     public static Tag<Block> SHEARS_DO_SILK_TOUCH = Tag.of("shears_do_silk_touch");
     /**
-     * This block can be skated on using {@link net.minecraft.core.item.Item#armorBootsIceskates ice skates}. 
+     * This block can be skated on using {@link net.minecraft.core.item.Item#ARMOR_BOOTS_ICESKATES ice skates}.
      */
     public static Tag<Block> SKATEABLE = Tag.of("skateable");
     /**
@@ -103,7 +120,7 @@ public abstract class BlockTags
      */
     public static Tag<Block> CAVES_CUT_THROUGH = Tag.of("caves_cut_through");
     /**
-     * Blocks such as {@link net.minecraft.core.block.BlockLanternFirefly BlockLanternFirefly} can hang off this block.
+     * Blocks such as {@link FireflyLanternBlock FireflyLanternBlock} can hang off this block.
      */
     public static Tag<Block> CAN_HANG_OFF = Tag.of("can_hang_off");
     /**
@@ -111,7 +128,7 @@ public abstract class BlockTags
      */
     public static Tag<Block> OVERRIDE_STEPSOUND = Tag.of("override_stepsound");
     /**
-     * {@link net.minecraft.core.block.BlockFenceChainlink BlockFenceChainlink} visually connects to this block.
+     * {@link ChainlinkFenceBlock ChainlinkFenceBlock} visually connects to this block.
      */
     public static Tag<Block> CHAINLINK_FENCES_CONNECT = Tag.of("chainlink_fences_connect");
     /**
@@ -119,15 +136,15 @@ public abstract class BlockTags
      */
     public static Tag<Block> PREVENT_MOB_SPAWNS = Tag.of("prevent_mob_spawns");
     /**
-     * Block can be planted inside a {@link net.minecraft.core.block.BlockJar BlockJar}
+     * Block can be planted inside a {@link JarBlock JarBlock}
      */
     public static Tag<Block> PLANTABLE_IN_JAR = Tag.of("plantable_in_jar");
     /**
-     * Block allows fire to burn forever on it {@link net.minecraft.core.block.BlockFire BlockFire}
+     * Block allows fire to burn forever on it {@link FireBlock FireBlock}
      */
     public static Tag<Block> INFINITE_BURN = Tag.of("infinite_burn");
     /**
-     * Block is broken on contact with an {@link net.minecraft.core.entity.vehicle.EntityBoat EntityBoat}
+     * Block is broken on contact with an {@link BoatEntity BoatEntity}
      */
     public static Tag<Block> BOAT_BREAKS = Tag.of("boat_breaks");
     /**
diff --git a/src/main/java/net/minecraft/core/crafting/ContainerListener.java b/src/main/java/net/minecraft/core/crafting/ContainerListener.java
new file mode 100644
index 000000000..62c8e1edd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/crafting/ContainerListener.java
@@ -0,0 +1,18 @@
+package net.minecraft.core.crafting;
+
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.menu.AbstractContainerMenu;
+
+import java.util.List;
+
+// Referenced classes of package net.minecraft.src:
+//            Container, ItemStack
+
+public interface ContainerListener
+{
+    void updateCraftingInventory(AbstractContainerMenu container, List<ItemStack> list);
+	
+    void updateInventorySlot(AbstractContainerMenu container, int i, ItemStack itemstack);
+
+    void updateCraftingInventoryInfo(AbstractContainerMenu container, int id, int value);
+}
diff --git a/src/main/java/net/minecraft/core/crafting/ICrafting.java b/src/main/java/net/minecraft/core/crafting/ICrafting.java
deleted file mode 100644
index a686b2c74..000000000
--- a/src/main/java/net/minecraft/core/crafting/ICrafting.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.minecraft.core.crafting;
-
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.Container;
-
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            Container, ItemStack
-
-public interface ICrafting
-{
-    void updateCraftingInventory(Container container, List<ItemStack> list);
-	
-    void updateInventorySlot(Container container, int i, ItemStack itemstack);
-
-    void updateCraftingInventoryInfo(Container container, int id, int value);
-}
diff --git a/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java b/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
index 2edf6ab2d..312b89c88 100644
--- a/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
+++ b/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.crafting;
 
-import net.minecraft.core.item.Item;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.block.Blocks;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -16,72 +16,71 @@ public class LookupFuelFurnace {
 	}
 
 	protected void register() {
-		addFuelEntry(Block.planksOak.id, 300);
-		addFuelEntry(Block.planksOakPainted.id, 300);
-		addFuelEntry(Block.stairsPlanksOak.id, 300);
-		addFuelEntry(Block.stairsPlanksOakPainted.id, 300);
-		addFuelEntry(Block.slabPlanksOak.id, 150);
-		addFuelEntry(Block.slabPlanksOakPainted.id, 150);
-		addFuelEntry(Block.fencePlanksOak.id, 300);
-		addFuelEntry(Block.fencePlanksOakPainted.id, 300);
-		addFuelEntry(Block.fencegatePlanksOak.id, 300);
-		addFuelEntry(Block.fencegatePlanksOakPainted.id, 300);
-		addFuelEntry(Block.ladderOak.id, 300);
-		addFuelEntry(Block.bookshelfPlanksOak.id, 300);
-		addFuelEntry(Block.chestPlanksOak.id, 300);
-		addFuelEntry(Block.chestPlanksOakPainted.id, 300);
-		addFuelEntry(Block.workbench.id, 300);
-		addFuelEntry(Block.pressureplatePlanksOak.id, 300);
-		addFuelEntry(Block.trapdoorPlanksOak.id, 300);
-		addFuelEntry(Block.trapdoorPlanksOakPainted.id, 300);
-
-		addFuelEntry(Block.logOak.id, 300);
-		addFuelEntry(Block.logBirch.id, 300);
-		addFuelEntry(Block.logPine.id, 300);
-		addFuelEntry(Block.logCherry.id, 300);
-		addFuelEntry(Block.logOakMossy.id, 300);
-		addFuelEntry(Block.logEucalyptus.id, 300);
-		addFuelEntry(Block.logThorn.id, 300);
-		addFuelEntry(Block.logPalm.id, 300);
-
-		addFuelEntry(Block.saplingOak.id, 100);
-		addFuelEntry(Block.saplingPine.id, 100);
-		addFuelEntry(Block.saplingBirch.id, 100);
-		addFuelEntry(Block.saplingCherry.id, 100);
-		addFuelEntry(Block.saplingEucalyptus.id, 100);
-		addFuelEntry(Block.saplingShrub.id, 100);
-		addFuelEntry(Block.saplingOakRetro.id, 100);
-		addFuelEntry(Block.saplingCacao.id, 100);
-		addFuelEntry(Block.saplingThorn.id, 100);
-		addFuelEntry(Block.saplingPalm.id, 100);
-		addFuelEntry(Block.deadbush.id, 100);
-		addFuelEntry(Block.spinifex.id, 100);
-
-		addFuelEntry(Block.blockCoal.id, 12800);
-		addFuelEntry(Block.blockCharcoal.id, 12800);
-		addFuelEntry(Block.blockNetherCoal.id, 25600);
-
-		addFuelEntry(Item.stick.id, 100);
-
-		addFuelEntry(Item.toolPickaxeWood.id, 500);
-		addFuelEntry(Item.toolSwordWood.id, 500);
-		addFuelEntry(Item.toolAxeWood.id, 500);
-		addFuelEntry(Item.toolShovelWood.id, 500);
-		addFuelEntry(Item.toolHoeWood.id, 500);
-		addFuelEntry(Item.toolBow.id, 300);
-		addFuelEntry(Item.toolFishingrod.id, 300);
-
-		addFuelEntry(Item.boat.id, 300);
-		addFuelEntry(Item.doorOak.id, 300);
-		addFuelEntry(Item.doorOakPainted.id, 300);
-		addFuelEntry(Item.sign.id, 300);
-		addFuelEntry(Item.bowl.id, 300);
-		addFuelEntry(Item.toolCalendar.id, 300);
-
-		addFuelEntry(Item.coal.id, 1600);
-		addFuelEntry(Item.nethercoal.id, 6400);
-
-		addFuelEntry(Item.bucketLava.id, 20000);
+		addFuelEntry(Blocks.PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.PLANKS_OAK_PAINTED.id, 300);
+		addFuelEntry(Blocks.STAIRS_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.STAIRS_PLANKS_PAINTED.id, 300);
+		addFuelEntry(Blocks.SLAB_PLANKS_OAK.id, 150);
+		addFuelEntry(Blocks.SLAB_PLANKS_PAINTED.id, 150);
+		addFuelEntry(Blocks.FENCE_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.FENCE_PLANKS_OAK_PAINTED.id, 300);
+		addFuelEntry(Blocks.FENCE_GATE_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.FENCE_GATE_PLANKS_OAK_PAINTED.id, 300);
+		addFuelEntry(Blocks.LADDER_OAK.id, 300);
+		addFuelEntry(Blocks.BOOKSHELF_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.CHEST_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.CHEST_PLANKS_OAK_PAINTED.id, 300);
+		addFuelEntry(Blocks.WORKBENCH.id, 300);
+		addFuelEntry(Blocks.PRESSURE_PLATE_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.TRAPDOOR_PLANKS_OAK.id, 300);
+		addFuelEntry(Blocks.TRAPDOOR_PLANKS_PAINTED.id, 300);
+
+		addFuelEntry(Blocks.LOG_OAK.id, 300);
+		addFuelEntry(Blocks.LOG_BIRCH.id, 300);
+		addFuelEntry(Blocks.LOG_PINE.id, 300);
+		addFuelEntry(Blocks.LOG_CHERRY.id, 300);
+		addFuelEntry(Blocks.LOG_OAK_MOSSY.id, 300);
+		addFuelEntry(Blocks.LOG_EUCALYPTUS.id, 300);
+		addFuelEntry(Blocks.LOG_THORN.id, 300);
+		addFuelEntry(Blocks.LOG_PALM.id, 300);
+
+		addFuelEntry(Blocks.SAPLING_OAK.id, 100);
+		addFuelEntry(Blocks.SAPLING_PINE.id, 100);
+		addFuelEntry(Blocks.SAPLING_BIRCH.id, 100);
+		addFuelEntry(Blocks.SAPLING_CHERRY.id, 100);
+		addFuelEntry(Blocks.SAPLING_EUCALYPTUS.id, 100);
+		addFuelEntry(Blocks.SAPLING_SHRUB.id, 100);
+		addFuelEntry(Blocks.SAPLING_OAK_RETRO.id, 100);
+		addFuelEntry(Blocks.SAPLING_CACAO.id, 100);
+		addFuelEntry(Blocks.SAPLING_THORN.id, 100);
+		addFuelEntry(Blocks.SAPLING_PALM.id, 100);
+		addFuelEntry(Blocks.DEADBUSH.id, 100);
+		addFuelEntry(Blocks.SPINIFEX.id, 100);
+
+		addFuelEntry(Blocks.BLOCK_COAL.id, 12800);
+		addFuelEntry(Blocks.BLOCK_CHARCOAL.id, 12800);
+		addFuelEntry(Blocks.BLOCK_NETHER_COAL.id, 25600);
+
+		addFuelEntry(Items.STICK.id, 100);
+
+		addFuelEntry(Items.TOOL_PICKAXE_WOOD.id, 500);
+		addFuelEntry(Items.TOOL_SWORD_WOOD.id, 500);
+		addFuelEntry(Items.TOOL_AXE_WOOD.id, 500);
+		addFuelEntry(Items.TOOL_SHOVEL_WOOD.id, 500);
+		addFuelEntry(Items.TOOL_HOE_WOOD.id, 500);
+		addFuelEntry(Items.TOOL_BOW.id, 300);
+		addFuelEntry(Items.TOOL_FISHINGROD.id, 300);
+
+		addFuelEntry(Items.BOAT.id, 300);
+		addFuelEntry(Items.DOOR_OAK.id, 300);
+		addFuelEntry(Items.SIGN.id, 300);
+		addFuelEntry(Items.BOWL.id, 300);
+		addFuelEntry(Items.TOOL_CALENDAR.id, 300);
+
+		addFuelEntry(Items.COAL.id, 1600);
+		addFuelEntry(Items.NETHERCOAL.id, 6400);
+
+		addFuelEntry(Items.BUCKET_LAVA.id, 20000);
 	}
 
 	public void addFuelEntry(int id, int fuelYield) {
diff --git a/src/main/java/net/minecraft/core/crafting/LookupFuelFurnaceBlast.java b/src/main/java/net/minecraft/core/crafting/LookupFuelFurnaceBlast.java
index a942026a6..aea76c956 100644
--- a/src/main/java/net/minecraft/core/crafting/LookupFuelFurnaceBlast.java
+++ b/src/main/java/net/minecraft/core/crafting/LookupFuelFurnaceBlast.java
@@ -1,7 +1,8 @@
 package net.minecraft.core.crafting;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 
 public class LookupFuelFurnaceBlast extends LookupFuelFurnace {
 
@@ -13,11 +14,11 @@ public class LookupFuelFurnaceBlast extends LookupFuelFurnace {
 
 	@Override
 	protected void register() {
-		addFuelEntry(Block.blockNetherCoal.id, 12800);
-		addFuelEntry(Block.blockOlivine.id, 1600);
+		addFuelEntry(Blocks.BLOCK_NETHER_COAL.id, 12800);
+		addFuelEntry(Blocks.BLOCK_OLIVINE.id, 1600);
 
-		addFuelEntry(Item.nethercoal.id, 1600);
-		addFuelEntry(Item.olivine.id, 200);
+		addFuelEntry(Items.NETHERCOAL.id, 1600);
+		addFuelEntry(Items.OLIVINE.id, 200);
 	}
 
 }
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/CraftingManager.java b/src/main/java/net/minecraft/core/crafting/legacy/CraftingManager.java
deleted file mode 100644
index 2e6424ada..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/CraftingManager.java
+++ /dev/null
@@ -1,654 +0,0 @@
-package net.minecraft.core.crafting.legacy;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryCraftingWithTool;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairable;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryRepairableStackable;
-import net.minecraft.core.data.registry.recipe.entry.RecipeEntryScrap;
-import net.minecraft.core.crafting.legacy.recipe.*;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.RecipeRegistry;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-import net.minecraft.core.util.helper.DyeColor;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-@Deprecated
-public class CraftingManager
-{
-    public static CraftingManager getInstance()
-    {
-        return instance;
-    }
-    private static int recipeId = 0;
-    private static int scrapRecipeId = 0;
-    private static int repairRecipeId = 0;
-    private static int repairStackRecipeId = 0;
-    private static int usesToolId = 0;
-
-    public void init() {
-        (new RecipesRepairs()).addRecipes(this);
-        (new RecipesScrappable()).addRecipes(this);
-        (new RecipesUsesTool()).addRecipes(this);
-    }
-
-    public void reset(){
-        recipeId = 0;
-        scrapRecipeId = 0;
-        repairRecipeId = 0;
-        repairStackRecipeId = 0;
-        usesToolId = 0;
-    }
-
-    private CraftingManager()
-    {
-        recipes = new ArrayList<>();
-        if (true) return;
-        init();
-        (new RecipesTools()).addRecipes(this);
-        (new RecipesWeapons()).addRecipes(this);
-        (new RecipesIngots()).addRecipes(this);
-        (new RecipesFood()).addRecipes(this);
-        (new RecipesCrafting()).addRecipes(this);
-        (new RecipesArmor()).addRecipes(this);
-        (new RecipesDyes()).addRecipes(this);
-
-        addRecipe(new ItemStack(Block.pillarMarble, 2), new Object[] {
-        	"#", "#", Character.valueOf('#'), Block.marble
-        });
-        
-        addRecipe(new ItemStack(Block.sandstone, 2), new Object[] {
-            "##", "##", Character.valueOf('#'), Block.sand
-        });
-        
-        addRecipe(new ItemStack(Block.torchCoal, 4), new Object[] {
-            "X", "#", Character.valueOf('X'), Item.coal, Character.valueOf('#'), Item.stick
-        });
-        
-        addRecipe(new ItemStack(Block.planksOak, 4), false, new Object[] {
-            "#", Character.valueOf('#'), Block.logOak
-        });
-
-        addRecipe(new ItemStack(Block.planksOakPainted, 4, DyeColor.DYE_BROWN.blockMeta), false,new Object[] {
-                "#", '#', Block.logPine
-        });
-
-        addRecipe(new ItemStack(Block.planksOakPainted, 4, DyeColor.DYE_WHITE.blockMeta), false, new Object[] {
-                "#", '#', Block.logBirch
-        });
-
-        addRecipe(new ItemStack(Block.planksOakPainted, 4, DyeColor.DYE_GREEN.blockMeta), false,new Object[] {
-                "#", '#', Block.logOakMossy
-        });
-
-        addRecipe(new ItemStack(Block.planksOakPainted, 4, DyeColor.DYE_ORANGE.blockMeta), false, new Object[] {
-                "#", '#', Block.logEucalyptus
-        });
-
-        addRecipe(new ItemStack(Block.planksOakPainted, 4, DyeColor.DYE_PINK.blockMeta), false, new Object[] {
-                "#", '#', Block.logCherry
-        });
-
-        addRecipe(new ItemStack(Block.ladderOak, 2), new Object[] {
-            "# #", "###", "# #", Character.valueOf('#'), Item.stick
-        });
-
-        addRecipe(new ItemStack(Block.fencePlanksOak, 6), true, new Object[] {
-            "#X#", "#X#", Character.valueOf('X'), Item.stick, Character.valueOf('#'), Block.planksOak
-        });
-        
-        addRecipe(new ItemStack(Block.fencegatePlanksOak, 3), true, new Object[] {
-            "#X#", "#X#", Character.valueOf('X'), Block.planksOak, Character.valueOf('#'), Item.stick
-        });
-
-        addRecipe(new ItemStack(Block.bookshelfPlanksOak, 1), true, false, new Object[] {
-            "###", "XXX", "###", Character.valueOf('#'), Block.planksOak, Character.valueOf('X'), Item.book
-        });
-        
-        addRecipe(new ItemStack(Block.wool, 1), new Object[] {
-            "##", "##", Character.valueOf('#'), Item.string
-        });
-
-        addRecipe(
-                new ItemStack(Block.brickClay, 4),
-                "##",
-                "##",
-                '#', Item.brickClay);
-        addRecipe(
-                new ItemStack(Block.brickGold, 4),
-                "##",
-                "##",
-                '#', Item.ingotGold);
-        addRecipe(
-                new ItemStack(Block.brickIron, 4),
-                "##",
-                "##",
-                '#', Item.ingotIron);
-        addRecipe(new ItemStack(Block.brickStonePolished, 4), new Object[] {
-            "##", "##", Character.valueOf('#'), Block.stonePolished
-        });
-        addRecipe(new ItemStack(Block.brickStone, 4), new Object[] {
-                "##", "##", Character.valueOf('#'), Block.stone
-        });
-        addRecipe(new ItemStack(Block.brickSandstone, 4), new Object[] {
-    		"##", "##", Character.valueOf('#'), Block.sandstone
-        });
-        addRecipe(new ItemStack(Block.brickLapis, 4), new Object[] {
-    		"##", "##", Character.valueOf('#'), new ItemStack(Item.dye, 1, 4)
-        });
-        addRecipe(new ItemStack(Block.brickBasalt, 4), new Object[] {
-            "##", "##", Character.valueOf('#'), Block.basalt
-        });
-        addRecipe(new ItemStack(Block.brickLimestone, 4), new Object[] {
-            "##", "##", Character.valueOf('#'), Block.limestone
-        });
-        addRecipe(new ItemStack(Block.brickGranite, 4), new Object[] {
-            "##", "##", Character.valueOf('#'), Block.granite
-        });
-        addRecipe(new ItemStack(Block.brickMarble, 4), new Object[] {
-    		"##", "##", Character.valueOf('#'), Block.marble
-        });
-        addRecipe(new ItemStack(Block.brickSlate, 4), new Object[] {
-                "##", "##", Character.valueOf('#'), Block.slate
-        });
-
-        addRecipe(new ItemStack(Block.brickPermafrost, 4), new Object[] {
-                "##", "##", Character.valueOf('#'), Block.permafrost
-        });
-        
-        addRecipe(new ItemStack(Block.slabPlanksOak, 6), true, new Object[] {
-    		"###", Character.valueOf('#'), Block.planksOak
-        });
-        addRecipe(new ItemStack(Block.slabCobbleStone, 6), new Object[] {
-            "###", Character.valueOf('#'), Block.cobbleStone
-        });
-        addRecipe(new ItemStack(Block.slabSandstone, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.sandstone
-        });
-        addRecipe(new ItemStack(Block.slabBrickStonePolished, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.brickStonePolished
-        });
-        addRecipe(new ItemStack(Block.slabStonePolished, 6), new Object[] {
-            "###", Character.valueOf('#'), Block.stonePolished
-        });
-        addRecipe(new ItemStack(Block.slabGranitePolished, 6), new Object[] {
-                "###", Character.valueOf('#'), Block.granitePolished
-        });
-        addRecipe(new ItemStack(Block.slabBasaltPolished, 6), new Object[] {
-                "###", Character.valueOf('#'), Block.basaltPolished
-        });
-        addRecipe(new ItemStack(Block.slabLimestonePolished, 6), new Object[] {
-                "###", Character.valueOf('#'), Block.limestonePolished
-        });
-        addRecipe(new ItemStack(Block.slabBrickMarble, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.brickMarble
-        });
-        addRecipe(new ItemStack(Block.slabBrickClay, 6), new Object[] {
-            "###", Character.valueOf('#'), Block.brickClay
-        });
-        addRecipe(new ItemStack(Block.slabCapstoneMarble, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.marble
-        });
-        addRecipe(new ItemStack(Block.slabCobbleBasalt, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.cobbleBasalt
-        });
-        addRecipe(new ItemStack(Block.slabCobbleLimestone, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.cobbleLimestone
-        });
-        addRecipe(new ItemStack(Block.slabCobbleGranite, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.cobbleGranite
-        });
-        addRecipe(new ItemStack(Block.slabBrickBasalt, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.brickBasalt
-        });
-        addRecipe(new ItemStack(Block.slabBrickLimestone, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.brickLimestone
-        });
-        addRecipe(new ItemStack(Block.slabBrickGranite, 6), new Object[] {
-    		"###", Character.valueOf('#'), Block.brickGranite
-        });
-        addRecipe(new ItemStack(Block.slabBrickStone, 6), new Object[] {
-                "###", Character.valueOf('#'), Block.brickStone
-        });
-        addRecipe(new ItemStack(Block.slabBrickSlate, 6), new Object[] {
-                "###", Character.valueOf('#'), Block.brickSlate
-        });
-        
-        addRecipe(new ItemStack(Block.stairsPlanksOak, 6), true, new Object[] {
-            "#  ", "## ", "###", Character.valueOf('#'), Block.planksOak
-        });
-        addRecipe(new ItemStack(Block.stairsCobbleStone, 6), new Object[] {
-            "#  ", "## ", "###", Character.valueOf('#'), Block.cobbleStone
-        });
-        addRecipe(new ItemStack(Block.stairsBrickStonePolished, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.brickStonePolished
-        });
-        addRecipe(new ItemStack(Block.stairsBrickMarble, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.brickMarble
-        });
-        addRecipe(new ItemStack(Block.stairsCobbleBasalt, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.cobbleBasalt
-        });
-        addRecipe(new ItemStack(Block.stairsCobbleLimestone, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.cobbleLimestone
-        });
-        addRecipe(new ItemStack(Block.stairsCobbleGranite, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.cobbleGranite
-        });
-        addRecipe(new ItemStack(Block.stairsBrickBasalt, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.brickBasalt
-        });
-        addRecipe(new ItemStack(Block.stairsBrickLimestone, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.brickLimestone
-        });
-        addRecipe(new ItemStack(Block.stairsBrickGranite, 6), new Object[] {
-    		"#  ", "## ", "###", Character.valueOf('#'), Block.brickGranite
-        });
-        addRecipe(new ItemStack(Block.stairsBrickClay, 6), new Object[] {
-                "#  ", "## ", "###", Character.valueOf('#'), Block.brickClay
-        });
-        addRecipe(new ItemStack(Block.stairsBrickStone, 6), new Object[] {
-                "#  ", "## ", "###", Character.valueOf('#'), Block.brickStone
-        });
-        addRecipe(new ItemStack(Block.stairsBrickSlate, 6), new Object[] {
-                "#  ", "## ", "###", Character.valueOf('#'), Block.brickSlate
-        });
-
-
-        addRecipe(new ItemStack(Block.torchRedstoneActive, 1), new Object[] {
-            "X", "#", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.dustRedstone
-        });
-
-        addRecipe(new ItemStack(Block.buttonStone, 4), true, new Object[] {
-            "#", Character.valueOf('#'), Block.stone
-        });
-
-        addRecipe(new ItemStack(Block.leverCobbleStone, 2), true, new Object[] {
-            "X", "#", Character.valueOf('#'), Block.cobbleStone, Character.valueOf('X'), Item.stick
-        });
-
-        addRecipe(new ItemStack(Block.pressureplateStone, 1), true, new Object[] {
-            "##", Character.valueOf('#'), Block.stone
-        });
-        addRecipe(new ItemStack(Block.pressureplatePlanksOak, 1), true, false, new Object[] {
-            "##", Character.valueOf('#'), Block.planksOak
-        });
-        addRecipe(new ItemStack(Block.pressureplateCobbleStone, 1), true, new Object[] {
-            "##", Character.valueOf('#'), Block.cobbleStone
-        });
-        
-        addRecipe(new ItemStack(Block.pistonBase, 1), true, false, new Object[] {
-            "TTT", "#X#", "#R#", Character.valueOf('#'), Block.cobbleStone, Character.valueOf('X'), Item.ingotIron, Character.valueOf('R'), Item.dustRedstone, Character.valueOf('T'),
-            Block.planksOak
-        });
-        addRecipe(new ItemStack(Block.pistonBaseSticky, 1), true, new Object[] {
-            "S", "P", Character.valueOf('S'), Item.slimeball, Character.valueOf('P'), Block.pistonBase
-        });
-        
-        addRecipe(new ItemStack(Block.noteblock, 1), true, false, new Object[] {
-            "###", "#X#", "###", Character.valueOf('#'), Block.planksOak, Character.valueOf('X'), Item.dustRedstone
-        });
-
-        addRecipe(new ItemStack(Block.rail, 16), new Object[] {
-            "X X", "X#X", "X X", Character.valueOf('X'), Item.ingotIron, Character.valueOf('#'), Item.stick
-        });
-        addRecipe(new ItemStack(Block.railPowered, 8), new Object[] {
-            "X X", "X#X", "XRX", Character.valueOf('X'), Item.ingotGold, Character.valueOf('R'), Item.dustRedstone, Character.valueOf('#'), Item.stick
-        });
-        addRecipe(new ItemStack(Block.railDetector, 8), new Object[] {
-            "X X", "X#X", "XRX", Character.valueOf('X'), Item.ingotIron, Character.valueOf('R'), Item.dustRedstone, Character.valueOf('#'), Block.pressureplateStone
-        });
-        
-        addRecipe(new ItemStack(Block.spikes, 4), true, new Object[] {
-                " # ", "#X#", "YYY", Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.dustRedstone, Character.valueOf('Y'), Block.cobbleStone
-        });
-        
-        addRecipe(new ItemStack(Block.dispenserCobbleStone, 1), true, new Object[] {
-            "###", "#X#", "#R#", Character.valueOf('#'), Block.cobbleStone, Character.valueOf('X'), Item.toolBow, Character.valueOf('R'), Item.dustRedstone
-        });
-
-        addRecipe(new ItemStack(Block.trapdoorPlanksOak, 6), true, false, new Object[] {
-            "###", "###", Character.valueOf('#'), Block.planksOak
-        });
-
-        addRecipe(new ItemStack(Block.trapdoorIron, 6), true, false, new Object[] {
-                "###", "###", Character.valueOf('#'), Item.ingotIron
-        });
-
-        addRecipe(new ItemStack(Block.trapdoorGlass, 6), true, false, new Object[] {
-                "###", "###", Character.valueOf('#'), Block.glass
-        });
-
-        addRecipe(new ItemStack(Block.tnt, 1), new Object[] {
-            "X#X", "#X#", "X#X", Character.valueOf('X'), Item.sulphur, Character.valueOf('#'), Block.sand
-        });
-        
-        addRecipe(new ItemStack(Block.mesh, 8), new Object[] {
-                "###", "# #", "###", Character.valueOf('#'), Item.ingotIron
-        });
-
-        addRecipe(new ItemStack(Block.cobweb, 1), new Object[] {
-                "###", "###", "###", Character.valueOf('#'), Item.string
-        });
-        
-        addRecipe(new ItemStack(Block.blockSnow, 1), new Object[] {
-            "##", "##", Character.valueOf('#'), Item.ammoSnowball
-        });
-
-        addRecipe(new ItemStack(Block.blockClay, 1), new Object[] {
-            "##", "##", Character.valueOf('#'), Item.clay
-        });
-        
-        addRecipe(new ItemStack(Block.jukebox, 1), true, false, new Object[] {
-            "###", "#X#", "###", Character.valueOf('#'), Block.planksOak, Character.valueOf('X'), Item.diamond
-        });
-        
-        addRecipe(new ItemStack(Item.paper, 6), new Object[] {
-            "###", Character.valueOf('#'), Item.sugarcane
-        });
-        addRecipe(new ItemStack(Item.book, 1), new Object[] {
-            "#", "#", "#", Character.valueOf('#'), Item.paper
-        });
-
-        addRecipe(new ItemStack(Item.seedsPumpkin, 4), "#", '#', Block.pumpkin);
-        addShapelessRecipe(new ItemStack(Block.pumpkinCarvedIdle, 1), new ItemStack(Block.pumpkin), new ItemStack(Item.toolShears));
-        addShapelessRecipe(new ItemStack(Block.pumpkinCarvedIdle, 1), new ItemStack(Block.pumpkin), new ItemStack(Item.toolShearsSteel));
-        addRecipe(new ItemStack(Block.pumpkinCarvedActive, 1), "A", "B", 'A', Block.pumpkinCarvedIdle, 'B', Block.torchCoal);
-        
-        addRecipe(new ItemStack(Block.glowstone, 1), new Object[] {
-            "##", "##", Character.valueOf('#'), Item.dustGlowstone
-        });
-
-        addRecipe(new ItemStack(Item.doorOak, 2), true, false, new Object[] {
-            "##", "##", "##", Character.valueOf('#'), Block.planksOak
-        });
-        addRecipe(new ItemStack(Item.doorIron, 2), new Object[] {
-            "##", "##", "##", Character.valueOf('#'), Item.ingotIron
-        });
-        addRecipe(new ItemStack(Item.sign, 4), true, false, new Object[] {
-            "###", "###", " X ", Character.valueOf('#'), Block.planksOak, Character.valueOf('X'), Item.stick
-        });
-        addRecipe(new ItemStack(Item.foodCake, 1), false, false, false, new Object[] {
-            "AAA", "BEB", "CCC", Character.valueOf('A'), Item.bucketMilk, Character.valueOf('B'), Item.dustSugar, Character.valueOf('C'), Item.wheat, Character.valueOf('E'),
-            Item.eggChicken
-        });
-        addRecipe(new ItemStack(Item.dustSugar, 3), new Object[] {
-            "#", Character.valueOf('#'), Item.sugarcane
-        });
-        addRecipe(new ItemStack(Item.stick, 4), true, false, new Object[] {
-            "#", "#", Character.valueOf('#'), Block.planksOak
-        });
-
-        addRecipe(new ItemStack(Block.torchCoal, 4), new Object[] {
-            "X", "#", Character.valueOf('X'), new ItemStack(Item.coal, 1, 1), Character.valueOf('#'), Item.stick
-        });
-        addRecipe(new ItemStack(Block.torchCoal, 8), new Object[] {
-            "X", "#", Character.valueOf('X'), new ItemStack(Item.nethercoal, 1, 0), Character.valueOf('#'), Item.stick
-        });
-        addRecipe(new ItemStack(Item.bowl, 4), true, false, new Object[] {
-            "# #", " # ", Character.valueOf('#'), Block.planksOak
-        });
-
-        addRecipe(new ItemStack(Item.minecart, 1), new Object[] {
-            "# #", "###", Character.valueOf('#'), Item.ingotIron
-        });
-
-        addRecipe(new ItemStack(Item.minecartChest, 1), true, false, new Object[] {
-            "A", "B", Character.valueOf('A'), Block.chestPlanksOak, Character.valueOf('B'), Item.minecart
-        });
-        addRecipe(new ItemStack(Item.minecartFurnace, 1), new Object[] {
-            "A", "B", Character.valueOf('A'), Block.furnaceStoneIdle, Character.valueOf('B'), Item.minecart
-        });
-        addRecipe(new ItemStack(Item.boat, 1), true, false, new Object[] {
-            "# #", "###", Character.valueOf('#'), Block.planksOak
-        });
-        addRecipe(new ItemStack(Item.bucket, 1), new Object[] {
-            "# #", " # ", Character.valueOf('#'), Item.ingotIron
-        });
-        addShapelessRecipe(new ItemStack(Item.toolFirestriker),
-                new ItemStack(Item.ingotIron),
-                new ItemStack(Item.flint));
-        addShapelessRecipe(new ItemStack(Item.toolFirestrikerSteel),
-                new ItemStack(Item.ingotSteel),
-                new ItemStack(Item.flint));
-        addRecipe(new ItemStack(Item.foodBread, 1), new Object[] {
-            "###", Character.valueOf('#'), Item.wheat
-        });
-        addRecipe(new ItemStack(Item.toolFishingrod, 1), new Object[] {
-            "  #", " #X", "# X", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.string
-        });
-        addRecipe(new ItemStack(Item.painting, 1), false, false, new Object[] {
-            "###", "#X#", "###", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Block.wool
-        });
-        addRecipe(new ItemStack(Item.foodAppleGold, 1), new Object[] {
-            "###", "#X#", "###", Character.valueOf('#'), Block.blockGold, Character.valueOf('X'), Item.foodApple
-        });
-        addRecipe(new ItemStack(Item.repeater, 1), true, new Object[] {
-            "#X#", "III", Character.valueOf('#'), Block.torchRedstoneActive, Character.valueOf('X'), Item.dustRedstone, Character.valueOf('I'), Block.stone
-        });
-        addRecipe(new ItemStack(Item.toolClock, 1), new Object[] {
-            " # ", "#X#", " # ", Character.valueOf('#'), Item.ingotGold, Character.valueOf('X'), Item.dustRedstone
-        });
-        addRecipe(new ItemStack(Item.toolCompass, 1), new Object[] {
-            " # ", "#X#", " # ", Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.dustRedstone
-        });
-        addRecipe(new ItemStack(Item.toolCalendar, 1), true, false, new Object[] {
-                " # ", "#X#", " # ", Character.valueOf('#'), Block.planksOak, Character.valueOf('X'), Item.dustRedstone
-        });
-        addRecipe(new ItemStack(Item.map, 1), new Object[] {
-            "###", "#X#", "###", Character.valueOf('#'), Item.paper, Character.valueOf('X'), Item.toolCompass
-        });
-
-        addRecipe(new ItemStack(Item.bed, 1), true, false, new Object[] {
-            "YY#", "XXX", Character.valueOf('#'), Block.wool, Character.valueOf('X'), Block.planksOak, Character.valueOf('Y'), Item.cloth
-        });
-        addRecipe(new ItemStack(Block.stairsBrickStonePolished, 6), new Object[] {
-                "#  ", "## ", "###", Character.valueOf('#'), Block.brickStonePolished
-        });
-
-        addRecipe(new ItemStack(Item.ingotSteel, 1), new Object[] {
-                "###", Character.valueOf('#'), Item.ingotSteelCrude
-        });
-        addRecipe(new ItemStack(Block.lampIdle, 4), new Object[] {
-                "###", "#O#", "#X#", Character.valueOf('#'), Block.glass, Character.valueOf('O'), Item.quartz, Character.valueOf('X'), Item.dustRedstone
-        });
-        addRecipe(new ItemStack(Block.glassTinted, 4), new Object[] {
-                "#X", "X#", Character.valueOf('#'), Block.glass, Character.valueOf('X'), Item.olivine
-        });
-        addRecipe(new ItemStack(Block.layerSlate, 8), new Object[] {
-                "#", Character.valueOf('#'), Block.slate
-        });
-        addRecipe(new ItemStack(Block.layerSnow, 2), new Object[] {
-                "##", Character.valueOf('#'), Item.ammoSnowball
-        });
-        addRecipe(new ItemStack(Block.layerLeavesOak, 8), new Object[] {
-                "#", Character.valueOf('#'), Block.leavesOak
-        });
-        addRecipe(new ItemStack(Block.cobbleStone, 2), new Object[] {
-                "##", "##", Character.valueOf('#'), Item.ammoPebble
-        });
-        addRecipe(new ItemStack(Block.cobbleBasalt, 2), new Object[] {
-                "#X", "X#", Character.valueOf('#'), Item.ammoPebble, Character.valueOf('X'), Item.coal
-        });
-        addRecipe(new ItemStack(Block.cobbleLimestone, 2), new Object[] {
-                "#X", "X#", Character.valueOf('#'), Item.ammoPebble, Character.valueOf('X'), Block.sand
-        });
-        addRecipe(new ItemStack(Block.cobbleGranite, 2), new Object[] {
-                "#X", "X#", Character.valueOf('#'), Item.ammoPebble, Character.valueOf('X'), Item.quartz
-        });
-        addRecipe(new ItemStack(Block.slatePolished, 2), new Object[] {
-                "#", "#", Character.valueOf('#'), Block.slate
-        });
-        addRecipe(new ItemStack(Block.stonePolished, 2), new Object[] {
-                "#", "#", Character.valueOf('#'), Block.stone
-        });
-        addRecipe(new ItemStack(Block.granitePolished, 2), new Object[] {
-                "#", "#", Character.valueOf('#'), Block.granite
-        });
-        addRecipe(new ItemStack(Block.limestonePolished, 2), new Object[] {
-                "#", "#", Character.valueOf('#'), Block.limestone
-        });
-        addRecipe(new ItemStack(Block.basaltPolished, 2), new Object[] {
-                "#", "#", Character.valueOf('#'), Block.basalt
-        });
-        addShapelessRecipe(new ItemStack(Block.spongeWet, 1), new Object[] {
-                new ItemStack(Block.spongeDry, 1), new ItemStack(Item.bucketWater, 1, 0)
-        });
-        addShapelessRecipe(new ItemStack(Item.label), new Object[] {
-                Item.string, Item.paper, new ItemStack(Item.dye, 1, 0)
-        });
-        addRecipe(new ItemStack(Block.gravel), "FPF", "PFP", "FPF", 'P', Item.ammoPebble, 'F', Item.flint);
-        addRecipe(new ItemStack(Item.jar, 4), false, false, new Object[] {
-                "# #", " # ", Character.valueOf('#'), Block.glass
-        });
-        addRecipe(new ItemStack(Block.permaice, 2), new Object[] {
-                "#X", "X#", Character.valueOf('#'), Block.permafrost, Character.valueOf('X'), Block.ice
-        });
-        addRecipe(new ItemStack(Block.paperWall, 4), "#X", "X#", '#', Item.paper, 'X', Block.planksOak);
-        addRecipe(new ItemStack(Block.paperWall, 4), "#X", "X#", '#', Item.paper, 'X', Block.planksOakPainted);
-        addRecipe(new ItemStack(Block.paperWall, 4), "X#", "#X", '#', Item.paper, 'X', Block.planksOak);
-        addRecipe(new ItemStack(Block.paperWall, 4), "X#", "#X", '#', Item.paper, 'X', Block.planksOakPainted);
-        addRecipe(new ItemStack(Block.fencePaperWall, 4), "I#I", "I#I", '#', Block.paperWall, 'I', Item.stick);
-
-
-        addRecipe(new ItemStack(Block.fenceChainlink, 8), "I#I", "I#I", '#', Item.chainlink, 'I', Item.ingotIron);
-        addRecipe(new ItemStack(Item.basket),"YYY", "X X","XXX", 'X', Item.wheat, 'Y', Item.leather);
-        addRecipe(new ItemStack(Item.flag),"XYY","XYY", "X  ",'X', Item.stick, 'Y', Item.cloth);
-        addRecipe(new ItemStack(Block.blockSugarcane), "##", "##", '#', Item.sugarcane);
-
-        addRecipe(new ItemStack(Item.seat), "###", "X X", '#', Item.cloth, 'X', Block.planksOak);
-
-        //noinspection ResultOfMethodCallIgnored
-        RecipesBlastFurnace.getInstance();
-
-        Collections.sort(recipes, new RecipeSorter(this));
-    }
-
-    @Deprecated
-    public void addRecipe(ItemStack itemstack, Object... aobj)
-    {
-    	this.addRecipe(itemstack, false, true, aobj);
-    }
-
-    @Deprecated
-    public void addRecipe(ItemStack itemstack, boolean useAlternatives, Object... aobj)
-    {
-        this.addRecipe(itemstack, useAlternatives, true, aobj);
-    }
-
-    @Deprecated
-    public void addRecipe(ItemStack itemstack, boolean useAlternatives, boolean countForMetadata, Object... aobj)
-    {
-        this.addRecipe(itemstack, useAlternatives, countForMetadata, true, aobj);
-    }
-
-    @Deprecated
-    public void addRecipe(ItemStack itemstack, boolean useAlternatives, boolean countForMetadata, boolean consumeContainerItem, Object... aobj) {
-        if(Registries.RECIPES == null){
-            new RecipeRegistry();
-        }
-        Registries.RECIPES.addRecipe("minecraft:workbench/legacy_recipe_"+ recipeId,itemstack,consumeContainerItem,aobj);
-        recipeId++;
-    }
-
-    @Deprecated
-	public void addShapelessRecipe(ItemStack result, Object... ingredients) {
-        if(Registries.RECIPES == null){
-            new RecipeRegistry();
-        }
-        Registries.RECIPES.addShapelessRecipe("minecraft:workbench/legacy_recipe_"+ recipeId,result,ingredients);
-        recipeId++;
-	}
-
-    @Deprecated
-    public void addRepairableRecipe(Item inItem, Item repairMaterial)
-    {
-
-        Registries.RECIPES.addCustomRecipe("minecraft:workbench/repair_stackable_recipe_"+ repairStackRecipeId,new RecipeEntryRepairable(inItem, repairMaterial));
-        repairStackRecipeId++;
-    }
-
-    @Deprecated
-    public void addRepairableStackableRecipe(Item inItem, ItemStack materialStack)
-    {
-        Registries.RECIPES.addCustomRecipe("minecraft:workbench/repair_stackable_recipe_"+ repairRecipeId,new RecipeEntryRepairableStackable(inItem, materialStack));
-        repairRecipeId++;
-    }
-
-    @Deprecated
-    public void addScrappableRecipe(Item itemToScrap, Item scrapYield)
-    {
-        Registries.RECIPES.addCustomRecipe("minecraft:workbench/scrap_recipe_"+ scrapRecipeId,new RecipeEntryScrap(itemToScrap, scrapYield));
-        scrapRecipeId++;
-    }
-
-    @Deprecated
-    public void addUsesToolRecipe(ItemStack inItemStack, Item toolToUse, ItemStack output)
-    {
-
-        Registries.RECIPES.addCustomRecipe("minecraft:workbench/uses_tool" + usesToolId, new RecipeEntryCraftingWithTool(inItemStack, toolToUse, output));
-        usesToolId++;
-    }
-
-    @Deprecated
-    public ItemStack findMatchingRecipe(InventoryCrafting inventorycrafting)
-    {
-        for(int i = 0; i < recipes.size(); i++)
-        {
-            IRecipe irecipe = (IRecipe)recipes.get(i);
-            if(irecipe.matches(inventorycrafting))
-            {
-                return irecipe.getCraftingResult(inventorycrafting);
-            }
-        }
-
-        return null;
-    }
-
-    @Deprecated
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting)
-    {
-        for(int i = 0; i < recipes.size(); i++)
-        {
-            IRecipe irecipe = (IRecipe)recipes.get(i);
-            if(irecipe.matches(inventorycrafting))
-            {
-                return irecipe.onCraftResult(inventorycrafting);
-            }
-        }
-
-        return null;
-    }
-
-    @Deprecated
-    public List<IRecipe> getRecipeList()
-    {
-        return recipes;
-    }
-
-    private static final CraftingManager instance = new CraftingManager();
-    private List<IRecipe> recipes;
-    @Deprecated
-    public static Block[][] blockAlternatives =
-    	{
-			{ Block.stone, Block.basalt, Block.limestone, Block.granite },
-			{ Block.cobbleStone, Block.cobbleBasalt, Block.cobbleLimestone, Block.cobbleGranite, Block.cobblePermafrost },
-			{ Block.planksOak, Block.planksOakPainted},
-			{ Block.grass, Block.grassRetro},
-			{ Block.dirt, Block.dirtScorched},
-			{ Block.mossStone, Block.mossBasalt, Block.mossLimestone, Block.mossGranite },
-			{ Block.logOak, Block.logPine, Block.logBirch, Block.logCherry, Block.logEucalyptus, Block.logOakMossy},
-			{ Block.leavesOak, Block.leavesOakRetro, Block.leavesPine, Block.leavesBirch, Block.leavesCherry, Block.leavesEucalyptus, Block.leavesShrub },
-			{ Block.oreCoalStone, Block.oreCoalBasalt, Block.oreCoalLimestone, Block.oreCoalGranite },
-			{ Block.oreIronStone, Block.oreIronBasalt, Block.oreIronLimestone, Block.oreIronGranite },
-			{ Block.oreGoldStone, Block.oreGoldBasalt, Block.oreGoldLimestone, Block.oreGoldGranite },
-			{ Block.oreLapisStone, Block.oreLapisBasalt, Block.oreLapisLimestone, Block.oreLapisGranite },
-			{ Block.oreRedstoneStone, Block.oreRedstoneBasalt, Block.oreRedstoneLimestone, Block.oreRedstoneGranite, Block.oreRedstoneGlowingStone, Block.oreRedstoneGlowingBasalt, Block.oreRedstoneGlowingLimestone, Block.oreRedstoneGlowingGranite },
-			{ Block.chestPlanksOak, Block.chestPlanksOakPainted },
-    	};
-
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/package-info.java b/src/main/java/net/minecraft/core/crafting/legacy/package-info.java
deleted file mode 100644
index c967e3909..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/package-info.java
+++ /dev/null
@@ -1,2 +0,0 @@
-@Deprecated
-package net.minecraft.core.crafting.legacy;
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/IRecipe.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/IRecipe.java
deleted file mode 100644
index 821dcf1c0..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/IRecipe.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            InventoryCrafting, ItemStack
-
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public interface IRecipe
-{
-
-    public abstract boolean matches(InventoryCrafting inventorycrafting);
-
-    public abstract ItemStack getCraftingResult(InventoryCrafting inventorycrafting);
-
-    public abstract int getRecipeSize();
-
-    public abstract ItemStack getRecipeOutput();
-
-    public abstract ItemStack[] onCraftResult(InventoryCrafting inventorycrafting);
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipeSorter.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipeSorter.java
deleted file mode 100644
index 3c1339802..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipeSorter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.crafting.legacy.CraftingManager;
-import net.minecraft.core.crafting.legacy.type.*;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-
-import java.util.Comparator;
-
-// Referenced classes of package net.minecraft.src:
-//            ShapelessRecipes, ShapedRecipes, IRecipe, CraftingManager
-
-public class RecipeSorter
-    implements Comparator
-{
-
-    public RecipeSorter(CraftingManager craftingmanager)
-    {
-//        super();
-        craftingManager = craftingmanager;
-    }
-
-    public int compareRecipes(IRecipe irecipe, IRecipe irecipe1)
-    {
-    	try {
-        	ItemStack result = irecipe.getCraftingResult(null);
-        	if(result != null && result.itemID == Item.bed.id) {
-        		return -1;
-        	}
-        	ItemStack result1 = irecipe1.getCraftingResult(null);
-        	if(result1 != null && result1.itemID == Item.bed.id) {
-        		return 1;
-        	}
-    	}catch (Exception e) {}
-        if((irecipe instanceof RecipeShapeless || irecipe instanceof RecipeRepairable || irecipe instanceof RecipeRepairableStackable || irecipe instanceof RecipeScrap) && (irecipe1 instanceof RecipeShaped))
-        {
-            return 1;
-        }
-        if((irecipe1 instanceof RecipeShapeless || irecipe1 instanceof RecipeRepairable || irecipe1 instanceof RecipeRepairableStackable || irecipe1 instanceof RecipeScrap) && (irecipe instanceof RecipeShaped))
-        {
-            return -1;
-        }
-        if(irecipe1.getRecipeSize() < irecipe.getRecipeSize())
-        {
-            return -1;
-        }
-        return irecipe1.getRecipeSize() <= irecipe.getRecipeSize() ? 0 : 1;
-    }
-
-    @Override
-	public int compare(Object obj, Object obj1)
-    {
-        return compareRecipes((IRecipe)obj, (IRecipe)obj1);
-    }
-
-    final CraftingManager craftingManager; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesArmor.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesArmor.java
deleted file mode 100644
index 6202cd3c1..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesArmor.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item, Block, ItemStack, CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesArmor
-{
-
-    public RecipesArmor()
-    {
-        recipeItems = (new Object[][] {
-            new Object[] {
-                Item.leather, Item.ingotIron, Item.diamond, Item.ingotGold, Item.ingotSteel
-            }, new Object[] {
-                Item.armorHelmetLeather, Item.armorHelmetIron, Item.armorHelmetDiamond, Item.armorHelmetGold, Item.armorHelmetSteel
-            }, new Object[] {
-                Item.armorChestplateLeather, Item.armorChestplateIron, Item.armorChestplateDiamond, Item.armorChestplateGold, Item.armorChestplateSteel
-            }, new Object[] {
-                Item.armorLeggingsLeather, Item.armorLeggingsIron, Item.armorLeggingsDiamond, Item.armorLeggingsGold, Item.armorLeggingsSteel
-            }, new Object[] {
-                Item.armorBootsLeather, Item.armorBootsIron, Item.armorBootsDiamond, Item.armorBootsGold, Item.armorBootsSteel
-            }
-        });
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        for(int i = 0; i < recipeItems[0].length; i++)
-        {
-            Object obj = recipeItems[0][i];
-            for(int j = 0; j < recipeItems.length - 1; j++)
-            {
-                Item item = (Item)recipeItems[j + 1][i];
-                craftingmanager.addRecipe(new ItemStack(item), recipePatterns[j], 'X', obj);
-            }
-        }
-
-        craftingmanager.addRecipe(new ItemStack(Item.armorQuiver, 1, Item.armorQuiver.getMaxDamage()),
-                "#OO", "#XX", " XX",
-                '#', Item.string,
-                'O', Item.cloth,
-                'X', Item.leather
-        );
-
-    }
-
-    private final String[][] recipePatterns = {
-        {
-            "XXX", "X X"
-        }, {
-            "X X", "XXX", "XXX"
-        }, {
-            "XXX", "X X", "X X"
-        }, {
-            "X X", "X X"
-        }
-    };
-    private final Object[][] recipeItems;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesBlastFurnace.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesBlastFurnace.java
deleted file mode 100644
index 3cc383f85..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesBlastFurnace.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-
-import java.util.Map;
-
-@Deprecated
-public class RecipesBlastFurnace
-    extends RecipesFurnaceBase {
-
-    public static RecipesBlastFurnace getInstance()
-    {
-        return INSTANCE;
-    }
-
-    private RecipesBlastFurnace() {
-        super();
-    }
-
-    @Override
-    public void init() {
-        for (Map.Entry<Integer, ItemStack> entry : getSmeltingList().entrySet()) {
-            addSmelting(entry.getKey(), entry.getValue());
-        }
-        addSmelting(Item.ingotIron.id, new ItemStack(Item.ingotSteelCrude));
-        addSmelting(Block.cobbleLimestone.id, new ItemStack(Block.marble));
-        addSmelting(Block.cobbleBasalt.id, new ItemStack(Item.olivine));
-        addSmelting(Block.cobbleGranite.id, new ItemStack(Item.quartz));
-        addSmelting(Block.cobbleStone.id, new ItemStack(Block.slate));
-    }
-
-    private static final RecipesBlastFurnace INSTANCE = new RecipesBlastFurnace();
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesCrafting.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesCrafting.java
deleted file mode 100644
index ffd5be1d8..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesCrafting.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, Block, CraftingManager
-
-import net.minecraft.core.crafting.legacy.type.RecipeLabel;
-import net.minecraft.core.crafting.legacy.type.RecipeLabelDye;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesCrafting
-{
-
-    public RecipesCrafting()
-    {
-    }
-
-    @Deprecated
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        craftingmanager.addRecipe(new ItemStack(Block.chestPlanksOak), new Object[] {
-            "###", "# #", "###", Character.valueOf('#'), Block.planksOak
-        });
-        
-        craftingmanager.addRecipe(new ItemStack(Block.furnaceStoneIdle), true,  new Object[] {
-            "###", "# #", "###", Character.valueOf('#'), Block.cobbleStone
-        });
-        craftingmanager.addRecipe(new ItemStack(Block.workbench), true, false, new Object[] {
-            "##", "##", Character.valueOf('#'), Block.planksOak
-        });
-        craftingmanager.addRecipe(new ItemStack(Block.furnaceBlastIdle), new Object[] {
-                "###", "#O#", "###", Character.valueOf('#'), Item.ingotIron, Character.valueOf('O'), Item.nethercoal
-        });
-        craftingmanager.addRecipe(new ItemStack(Block.trommelIdle), true, new Object[] {
-        	"CCC", "CMC", "LLL", Character.valueOf('C'), Block.cobbleStone, Character.valueOf('M'), Block.mesh, Character.valueOf('L'), Block.logOak
-        });
-        craftingmanager.getRecipeList().add(new RecipeLabel());
-        craftingmanager.getRecipeList().add(new RecipeLabelDye());
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesDyes.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesDyes.java
deleted file mode 100644
index aeb623c56..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesDyes.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, Block, BlockCloth, Item, 
-//            CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.*;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-import net.minecraft.core.util.helper.DyeColor;
-
-@Deprecated
-public class RecipesDyes
-{
-
-    public RecipesDyes()
-    {
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        for(int dye = 0; dye < 16; dye++)
-        {
-            //Shapeless
-            craftingmanager.addShapelessRecipe(new ItemStack(Block.lampIdle, 1, BlockLamp.getMetadataForColour(dye)),
-                    new ItemStack(Item.dye, 1, dye),
-                    new ItemStack(Item.itemsList[Block.lampIdle.id], 1, 0));
-            
-            //Shaped
-            craftingmanager.addRecipe(new ItemStack(Block.fencePlanksOakPainted, 6, BlockFencePainted.getMetadataForColour(dye)),
-                    "X#X",
-                    "X#X",
-                    '#', Item.stick,
-                    'X', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(dye)));
-            craftingmanager.addRecipe(new ItemStack(Block.slabPlanksOakPainted, 6, BlockSlabPainted.getMetadataForColour(dye)),
-                    "###",
-                    '#', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(dye)));
-            craftingmanager.addRecipe(new ItemStack(Block.stairsPlanksOakPainted, 6, BlockSlabPainted.getMetadataForColour(dye)),
-                    "#  ",
-                    "## ",
-                    "###",
-                    '#', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(dye)));
-            craftingmanager.addRecipe(new ItemStack(Block.fencegatePlanksOakPainted, 3, BlockFenceGatePainted.getMetadataForColour(dye)),
-                    "X#X",
-                    "X#X",
-                    'X', Item.stick,
-                    '#', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(dye)));
-            //Wool
-            if(dye != 15)
-                craftingmanager.addShapelessRecipe(new ItemStack(Block.wool, 1, BlockWool.getMetadataForColour(dye)),
-                        Block.wool,
-                        new ItemStack(Item.dye, 1, dye));
-            
-            //Chest
-            craftingmanager.addRecipe(new ItemStack(Block.chestPlanksOakPainted, 1, BlockChestPainted.getMetaForDyeColor(dye)),
-                    "###",
-                    "# #",
-                    "###",
-                    '#', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(dye)));
-            craftingmanager.addShapelessRecipe(new ItemStack(Block.chestPlanksOakPainted, 1, BlockChestPainted.getMetaForDyeColor(dye)),
-                    Block.chestPlanksOak,
-                    new ItemStack(Item.dye, 1, dye));
-            
-            //Planks
-            craftingmanager.addRecipe(new ItemStack(Block.planksOakPainted, 8, BlockPlanksPainted.getMetadataForColour(dye)),
-                    "###",
-                    "#0#",
-                    "###",
-                    '#', Block.planksOak,
-                    '0', new ItemStack(Item.dye, 1, dye));
-            
-//			// Recolor
-//			for (int oldDye = 0; oldDye < 16; oldDye++) {
-//				if(dye != oldDye) {
-//					// Wool
-//					craftingManager.addShapelessRecipe(new ItemStack(Block.wool, 1, BlockWool.getMetadataForColour(dye)), new ItemStack(Block.wool, 1, BlockWool.getMetadataForColour(oldDye)), new ItemStack(Item.dye, 1, dye));
-//					// Chest
-//					craftingManager.addShapelessRecipe(new ItemStack(Block.chestPlanksOakPainted, 1, BlockChestPainted.getMetaForDyeColor(dye)), new ItemStack(Block.chestPlanksOakPainted, 1, BlockChestPainted.getMetaForDyeColor(oldDye)), new ItemStack(Item.dye, 1, dye));
-//					// Planks
-//					craftingManager.addRecipe(new ItemStack(Block.planksOakPainted, 8, BlockPlanksPainted.getMetadataForColour(dye)), "###", "#0#", "###", '#', new ItemStack(Block.planksOakPainted, 1, BlockPlanksPainted.getMetadataForColour(oldDye)), Character.valueOf('0'), new ItemStack(Item.dye, 1, dye));
-//				}
-//			}
-        }
-
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_YELLOW.dyeMeta),
-                Block.flowerYellow);
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_RED.dyeMeta),
-                Block.flowerRed);
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 3, DyeColor.DYE_WHITE.dyeMeta),
-                Item.bone);
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_PINK.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_ORANGE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_YELLOW.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_LIME.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_GREEN.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_GRAY.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLACK.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_LIGHT_GRAY.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_GRAY.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 3, DyeColor.DYE_LIGHT_GRAY.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLACK.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_LIGHT_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_CYAN.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_GREEN.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_PURPLE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 2, DyeColor.DYE_MAGENTA.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_PURPLE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_PINK.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 3, DyeColor.DYE_MAGENTA.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_PINK.dyeMeta));
-        craftingmanager.addShapelessRecipe(new ItemStack(Item.dye, 4, DyeColor.DYE_MAGENTA.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_BLUE.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_RED.dyeMeta),
-                new ItemStack(Item.dye, 1, DyeColor.DYE_WHITE.dyeMeta));
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java
deleted file mode 100644
index 8573976ae..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, Item, Block, CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesFood
-{
-
-    public RecipesFood()
-    {
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        craftingmanager.addRecipe(new ItemStack(Item.foodStewMushroom), new Object[] {
-            "Y", "X", "#", Character.valueOf('X'), Block.mushroomBrown, Character.valueOf('Y'), Block.mushroomRed, Character.valueOf('#'), Item.bowl
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.foodStewMushroom), new Object[] {
-            "Y", "X", "#", Character.valueOf('X'), Block.mushroomRed, Character.valueOf('Y'), Block.mushroomBrown, Character.valueOf('#'), Item.bowl
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.foodCookie, 8), new Object[] {
-            "#X#", Character.valueOf('X'), new ItemStack(Item.dye, 1, 3), Character.valueOf('#'), Item.wheat
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.bucketIcecream), false, true, true, new Object[] {
-                " Y ", "#O#"," X ", Character.valueOf('O'), new ItemStack(Item.ammoSnowball), Character.valueOf('X'), new ItemStack(Item.bucketMilk), Character.valueOf('#'), new ItemStack(Item.dye, 1, 3), Character.valueOf('Y'), new ItemStack(Item.foodCherry)
-        });
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnace.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnace.java
deleted file mode 100644
index 021b410b6..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnace.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-
-@Deprecated
-public class RecipesFurnace
-    extends RecipesFurnaceBase {
-    private static final RecipesFurnace INSTANCE = new RecipesFurnace();
-
-    public static RecipesFurnace getInstance()
-    {
-        return INSTANCE;
-    }
-
-    private RecipesFurnace() {
-        super();
-    }
-
-    @Override
-    public void init() {
-        addSmelting(Block.oreCoalStone.id, new ItemStack(Item.coal));
-        addSmelting(Block.oreCoalBasalt.id, new ItemStack(Item.coal));
-        addSmelting(Block.oreCoalLimestone.id, new ItemStack(Item.coal));
-        addSmelting(Block.oreCoalGranite.id, new ItemStack(Item.coal));
-        addSmelting(Block.oreIronStone.id, new ItemStack(Item.ingotIron));
-        addSmelting(Block.oreIronBasalt.id, new ItemStack(Item.ingotIron));
-        addSmelting(Block.oreIronLimestone.id, new ItemStack(Item.ingotIron));
-        addSmelting(Block.oreIronGranite.id, new ItemStack(Item.ingotIron));
-        addSmelting(Block.oreGoldStone.id, new ItemStack(Item.ingotGold));
-        addSmelting(Block.oreGoldBasalt.id, new ItemStack(Item.ingotGold));
-        addSmelting(Block.oreGoldLimestone.id, new ItemStack(Item.ingotGold));
-        addSmelting(Block.oreGoldGranite.id, new ItemStack(Item.ingotGold));
-        addSmelting(Block.oreDiamondStone.id, new ItemStack(Item.diamond));
-        addSmelting(Block.oreDiamondBasalt.id, new ItemStack(Item.diamond));
-        addSmelting(Block.oreDiamondLimestone.id, new ItemStack(Item.diamond));
-        addSmelting(Block.oreDiamondGranite.id, new ItemStack(Item.diamond));
-        addSmelting(Block.oreRedstoneStone.id, new ItemStack(Item.dustRedstone));
-        addSmelting(Block.oreRedstoneBasalt.id, new ItemStack(Item.dustRedstone));
-        addSmelting(Block.oreRedstoneLimestone.id, new ItemStack(Item.dustRedstone));
-        addSmelting(Block.oreRedstoneGranite.id, new ItemStack(Item.dustRedstone));
-        addSmelting(Block.oreLapisStone.id, new ItemStack(Item.dye, 1, 4));
-        addSmelting(Block.oreLapisBasalt.id, new ItemStack(Item.dye, 1, 4));
-        addSmelting(Block.oreLapisLimestone.id, new ItemStack(Item.dye, 1, 4));
-        addSmelting(Block.oreLapisGranite.id, new ItemStack(Item.dye, 1, 4));
-        addSmelting(Block.oreNethercoalNetherrack.id, new ItemStack(Item.nethercoal));
-        addSmelting(Block.sand.id, new ItemStack(Block.glass));
-        addSmelting(Item.foodPorkchopRaw.id, new ItemStack(Item.foodPorkchopCooked));
-        addSmelting(Item.foodFishRaw.id, new ItemStack(Item.foodFishCooked));
-        addSmelting(Block.cobbleStone.id, new ItemStack(Block.stone));
-        addSmelting(Block.cobbleBasalt.id, new ItemStack(Block.basalt));
-        addSmelting(Block.cobbleLimestone.id, new ItemStack(Block.limestone));
-        addSmelting(Block.cobbleGranite.id, new ItemStack(Block.granite));
-        addSmelting(Item.clay.id, new ItemStack(Item.brickClay));
-        addSmelting(Block.cactus.id, new ItemStack(Item.dye, 1, 2));
-        addSmelting(Block.logOak.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.logPine.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.logBirch.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.logCherry.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.logEucalyptus.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.logOakMossy.id, new ItemStack(Item.coal, 1, 1));
-        addSmelting(Block.spongeWet.id, new ItemStack(Block.spongeDry, 1));
-        addSmelting(Item.oreRawIron.id, new ItemStack(Item.ingotIron));
-        addSmelting(Item.oreRawGold.id, new ItemStack(Item.ingotGold));
-        addSmelting(Block.mud.id, new ItemStack(Block.mudBaked, 1));
-        addSmelting(Block.cobblePermafrost.id, new ItemStack(Block.permafrost, 1));
-        addSmelting(Block.blockSugarcane.id, new ItemStack(Block.blockSugarcaneBaked, 1));
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnaceBase.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnaceBase.java
deleted file mode 100644
index c44631076..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFurnaceBase.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.item.ItemStack;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@Deprecated
-public abstract class RecipesFurnaceBase {
-    private final Map<Integer, ItemStack> smeltingList = new HashMap<>();
-    private static int i = 0;
-    private static int j = 0;
-
-    public RecipesFurnaceBase() {
-//        init();
-    }
-
-    public abstract void init();
-
-    @Deprecated
-    public void addSmelting(int id, ItemStack itemstack) {
-        if(this instanceof RecipesFurnace){
-            Registries.RECIPES.addFurnaceRecipe("minecraft:furnace/legacy_recipe_"+i,itemstack,new ItemStack(id,1,0));
-            i++;
-        } else if(this instanceof RecipesBlastFurnace) {
-            Registries.RECIPES.addBlastFurnaceRecipe("minecraft:blast_furnace/legacy_recipe_"+j,itemstack,new ItemStack(id,1,0));
-            j++;
-        }
-    }
-
-    public ItemStack getSmeltingResult(int id) {
-        return smeltingList.get(id);
-    }
-
-    public Map<Integer, ItemStack> getSmeltingList() {
-        return smeltingList;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesIngots.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesIngots.java
deleted file mode 100644
index 70e83dca4..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesIngots.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Block, ItemStack, Item, CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesIngots
-{
-
-    public RecipesIngots()
-    {
-        recipeItems = (new Object[][] {
-            new Object[] {
-                Block.blockGold, new ItemStack(Item.ingotGold, 9)
-            }, new Object[] {
-                Block.blockIron, new ItemStack(Item.ingotIron, 9)
-            }, new Object[] {
-                Block.blockDiamond, new ItemStack(Item.diamond, 9)
-            }, new Object[] {
-                Block.blockLapis, new ItemStack(Item.dye, 9, 4)
-            }, new Object[] {
-                Block.blockSteel, new ItemStack(Item.ingotSteel, 9)
-            }, new Object[] {
-                Block.blockRedstone, new ItemStack(Item.dustRedstone, 9)
-            }, new Object[] {
-                Block.blockQuartz, new ItemStack(Item.quartz, 9)
-            }
-
-        });
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        for(int i = 0; i < recipeItems.length; i++)
-        {
-            Block block = (Block)recipeItems[i][0];
-            ItemStack itemstack = (ItemStack)recipeItems[i][1];
-            craftingmanager.addRecipe(new ItemStack(block), new Object[] {
-                "###", "###", "###", Character.valueOf('#'), itemstack
-            });
-            craftingmanager.addRecipe(itemstack, new Object[] {
-                "#", Character.valueOf('#'), block
-            });
-        }
-
-        craftingmanager.addRecipe(new ItemStack(Block.blockCoal, 1), new Object[] {
-                "###", "# #", "###", Character.valueOf('#'), Item.coal
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Block.blockCharcoal, 1), new Object[] {
-                "###", "# #", "###", Character.valueOf('#'), new ItemStack(Item.coal, 1, 1)
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Item.coal, 8), new Object[] {
-                "#", Character.valueOf('#'), Block.blockCoal
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Item.coal, 8, 1), new Object[] {
-                "#", Character.valueOf('#'), Block.blockCharcoal
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Item.olivine, 8), new Object[] {
-                "#", Character.valueOf('#'), Block.blockOlivine
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Block.blockOlivine, 1), new Object[] {
-                "###", "# #", "###", Character.valueOf('#'), Item.olivine
-        });
-
-        craftingmanager.addRecipe(new ItemStack(Block.blockNetherCoal, 1), new Object[] {
-                "###", "# #", "###", Character.valueOf('#'), Item.nethercoal
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.nethercoal, 8), new Object[] {
-                "#", Character.valueOf('#'), Block.blockNetherCoal
-        });
-
-    }
-
-    private Object recipeItems[][];
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesRepairs.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesRepairs.java
deleted file mode 100644
index ce081e57f..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesRepairs.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, Block, BlockCloth, Item,
-//            CraftingManager
-
-import net.minecraft.core.item.Item;
-
-public class RecipesRepairs
-{
-
-    public RecipesRepairs()
-    {
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        craftingmanager.addRepairableRecipe(Item.armorBootsChainmail, Item.chainlink);
-        craftingmanager.addRepairableRecipe(Item.armorHelmetChainmail, Item.chainlink);
-        craftingmanager.addRepairableRecipe(Item.armorChestplateChainmail, Item.chainlink);
-        craftingmanager.addRepairableRecipe(Item.armorLeggingsChainmail, Item.chainlink);
-
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesScrappable.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesScrappable.java
deleted file mode 100644
index a7857874a..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesScrappable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, Block, BlockCloth, Item,
-//            CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-public class RecipesScrappable
-{
-
-    public RecipesScrappable()
-    {
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        craftingmanager.addScrappableRecipe(Item.armorBootsChainmail, Item.chainlink);
-        craftingmanager.addScrappableRecipe(Item.armorHelmetChainmail, Item.chainlink);
-        craftingmanager.addScrappableRecipe(Item.armorChestplateChainmail, Item.chainlink);
-        craftingmanager.addScrappableRecipe(Item.armorLeggingsChainmail, Item.chainlink);
-
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesTools.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesTools.java
deleted file mode 100644
index 45e0300fe..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesTools.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesTools
-{
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        for(int i = 0; i < recipeItems[0].length; i++)
-        {
-            Object obj = recipeItems[0][i];
-            for(int j = 0; j < recipeItems.length - 1; j++)
-            {
-                Item item = (Item)recipeItems[j + 1][i];
-                craftingmanager.addRecipe(new ItemStack(item), true, false, new Object[] {
-                        recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
-                });
-            }
-
-        }
-
-        craftingmanager.addRecipe(new ItemStack(Item.toolShears), " #", "# ", '#', Item.ingotIron);
-        craftingmanager.addRecipe(new ItemStack(Item.toolShearsSteel), " #", "# ", '#', Item.ingotSteel);
-    }
-
-    private final String[][] recipePatterns = {
-        {
-            "XXX",
-            " # ",
-            " # "
-        }, {
-            "X",
-            "#",
-            "#"
-        }, {
-            "XX",
-            "X#",
-            " #"
-        }, {
-            "XX",
-            " #",
-            " #"
-        }
-    };
-
-    private final Object[][] recipeItems = (new Object[][] {
-        new Object[] {
-            Block.planksOak, Block.cobbleStone, Item.ingotIron, Item.diamond, Item.ingotGold, Item.ingotSteel
-        }, new Object[] {
-            Item.toolPickaxeWood, Item.toolPickaxeStone, Item.toolPickaxeIron, Item.toolPickaxeDiamond, Item.toolPickaxeGold, Item.toolPickaxeSteel
-        }, new Object[] {
-            Item.toolShovelWood, Item.toolShovelStone, Item.toolShovelIron, Item.toolShovelDiamond, Item.toolShovelGold, Item.toolShovelSteel
-        }, new Object[] {
-            Item.toolAxeWood, Item.toolAxeStone, Item.toolAxeIron, Item.toolAxeDiamond, Item.toolAxeGold, Item.toolAxeSteel
-        }, new Object[] {
-            Item.toolHoeWood, Item.toolHoeStone, Item.toolHoeIron, Item.toolHoeDiamond, Item.toolHoeGold, Item.toolHoeSteel
-        }
-    });
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesUsesTool.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesUsesTool.java
deleted file mode 100644
index be21ee14f..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesUsesTool.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-
-public class RecipesUsesTool {
-
-    public RecipesUsesTool()
-    {
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordWood, new ItemStack(Block.pumpkinCarvedIdle));
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordStone, new ItemStack(Block.pumpkinCarvedIdle));
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordIron, new ItemStack(Block.pumpkinCarvedIdle));
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordGold, new ItemStack(Block.pumpkinCarvedIdle));
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordDiamond, new ItemStack(Block.pumpkinCarvedIdle));
-        craftingmanager.addUsesToolRecipe(new ItemStack(Block.pumpkin), Item.toolSwordSteel, new ItemStack(Block.pumpkinCarvedIdle));
-    }
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesWeapons.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesWeapons.java
deleted file mode 100644
index f296f4b83..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesWeapons.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.minecraft.core.crafting.legacy.recipe;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Block, Item, ItemStack, CraftingManager
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-@Deprecated
-public class RecipesWeapons
-{
-
-    public RecipesWeapons()
-    {
-        recipeItems = (new Object[][] {
-            new Object[] {
-                Block.planksOak, Block.cobbleStone, Item.ingotIron, Item.diamond, Item.ingotGold, Item.ingotSteel
-            }, new Object[] {
-                Item.toolSwordWood, Item.toolSwordStone, Item.toolSwordIron, Item.toolSwordDiamond, Item.toolSwordGold, Item.toolSwordSteel
-            }
-        });
-    }
-
-    public void addRecipes(CraftingManager craftingmanager)
-    {
-        for(int i = 0; i < recipeItems[0].length; i++)
-        {
-            Object obj = recipeItems[0][i];
-            for(int j = 0; j < recipeItems.length - 1; j++)
-            {
-                Item item = (Item)recipeItems[j + 1][i];
-                craftingmanager.addRecipe(new ItemStack(item), true, false, new Object[] {
-                    recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
-                });
-            }
-
-        }
-
-        craftingmanager.addRecipe(new ItemStack(Item.toolBow, 1), new Object[] {
-            " #X", "# X", " #X", Character.valueOf('X'), Item.string, Character.valueOf('#'), Item.stick
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.handcannonUnloaded, 1), true, new Object[] {
-                "X  ", "#X ", " #O", Character.valueOf('X'), Block.logOak, Character.valueOf('#'), Item.ingotSteel, Character.valueOf('O'), Item.toolBow
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.ammoArrow, 4), new Object[] {
-            "X", "#", "Y", Character.valueOf('Y'), Item.featherChicken, Character.valueOf('X'), Item.flint, Character.valueOf('#'), Item.stick
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.ammoArrowGold, 4), new Object[] {
-                " X ", "X#X", " X ", Character.valueOf('X'), Item.ammoArrow, Character.valueOf('#'), Item.ingotGold
-        });
-        craftingmanager.addRecipe(new ItemStack(Item.ammoChargeExplosive, 4), new Object[] {
-                " S ", "#X#", " # ", Character.valueOf('S'), Item.string, Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.sulphur
-        });
-    }
-
-    private String recipePatterns[][] = {
-        {
-            "X", "X", "#"
-        }
-    };
-    private Object recipeItems[][];
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabel.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabel.java
deleted file mode 100644
index b104ad3a9..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabel.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class RecipeLabel implements IRecipe
-{
-
-	@Override
-	public ItemStack getCraftingResult(final InventoryCrafting inventorycrafting) {
-		ItemStack labelStack = null;
-		ItemStack otherItem = null;
-
-		label0: for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				if(stack.itemID == Item.label.id && labelStack == null) {
-					labelStack = stack;
-				} else if(otherItem == null) {
-					otherItem = stack;
-				}
-				if(labelStack != null && otherItem != null) {
-					break label0;
-				}
-			}
-		}
-		
-		if(labelStack != null && otherItem != null) {
-			final ItemStack outStack = otherItem.copy();
-			
-			if(labelStack.hasCustomName()) outStack.setCustomName(labelStack.getCustomName());
-			if(labelStack.hasCustomColor()) outStack.setCustomColor(labelStack.getCustomColor());
-            outStack.stackSize = 1;
-			
-			return outStack;
-		}
-
-		return null;
-	}
-
-    @Override
-    public ItemStack getRecipeOutput()
-    {
-        return new ItemStack(Item.label);
-    }
-
-    @Override
-    public int getRecipeSize()
-    {
-        return 2;
-    }
-
-    @Override
-	public boolean matches(final InventoryCrafting crafting) {
-		ItemStack labelStack = null;
-		ItemStack otherStack = null;
-
-		for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = crafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				if(stack.itemID == Item.label.id) {
-					if(labelStack != null || !stack.hasCustomName()) {
-						return false;
-					}
-					labelStack = stack;
-				} else {
-					if(otherStack != null) {
-						return false;
-					}
-					otherStack = stack;
-				}
-			}
-		}
-		
-		if(labelStack == null || otherStack == null) {
-			return false;
-		}
-		
-		if(otherStack.itemID == Item.dye.id) {
-			// If the label is not already colored, it should be recolored by RecipeLabelDye
-			if(!labelStack.hasCustomColor()) {
-				return false;
-			}
-		}
-		
-		if(!labelStack.hasCustomName()) {
-			// Label does not have a name
-			return false;
-		}
-		
-		if(otherStack.hasCustomName() && otherStack.getCustomName().equals(labelStack.getCustomName())) {
-			// Same name, check if color changes
-			if(labelStack.hasCustomColor()) {
-				if(!otherStack.hasCustomColor()) {
-					return true;
-				}
-				return otherStack.getCustomColor() != labelStack.getCustomColor();
-			}
-			
-			if(!otherStack.hasCustomColor() && !labelStack.hasCustomColor()) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	@Override
-	public ItemStack[] onCraftResult(final InventoryCrafting crafting) {
-		final ItemStack[] returnStack = new ItemStack[9];
-		for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = crafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				if(stack.itemID != Item.label.id) {
-					stack.stackSize--;
-					if(stack.stackSize <= 0) {
-						crafting.setSlotContentsAt(x, y, null);	
-					}
-				}
-			}
-		}
-		return returnStack;
-	}
-
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabelDye.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabelDye.java
deleted file mode 100644
index 26ee9d910..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeLabelDye.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class RecipeLabelDye implements IRecipe
-{
-    @Override
-	public ItemStack getCraftingResult(final InventoryCrafting inventorycrafting) {
-		ItemStack labelStack = null;
-		ItemStack dyeStack = null;
-
-		label0: for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				if(stack.itemID == Item.label.id && labelStack == null) {
-					labelStack = stack;
-				} else if(stack.itemID == Item.dye.id && dyeStack == null) {
-					dyeStack = stack;
-				}
-				if(labelStack != null && dyeStack != null) {
-					break label0;
-				}
-			}
-		}
-
-		if(labelStack != null && dyeStack != null) {
-			final ItemStack outStack = labelStack.copy();
-			outStack.setCustomColor((byte) (15 - dyeStack.getMetadata()));
-			outStack.stackSize = 1;
-			return outStack;
-		}
-
-		return null;
-	}
-
-    @Override
-    public ItemStack getRecipeOutput()
-    {
-        return new ItemStack(Item.label);
-    }
-
-    @Override
-    public int getRecipeSize()
-    {
-        return 2;
-    }
-
-    @Override
-	public boolean matches(final InventoryCrafting crafting) {
-		ItemStack labelStack = null;
-		ItemStack dyeStack = null;
-
-		for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = crafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				if(stack.itemID == Item.label.id) {
-					if(labelStack != null) {
-						return false;
-					}
-					labelStack = stack;
-				} else if(stack.itemID == Item.dye.id){
-					if(dyeStack != null) {
-						return false;
-					}
-					dyeStack = stack;
-				}else {
-					return false;
-				}
-			}
-		}
-		
-		if(labelStack == null || dyeStack == null) {
-			return false;
-		}
-		
-		if(!labelStack.hasCustomName() || labelStack.hasCustomColor()) {
-			return false;
-		}
-		
-		return true;
-	}
-
-	@Override
-	public ItemStack[] onCraftResult(final InventoryCrafting crafting) {
-		final ItemStack[] returnStack = new ItemStack[9];
-		for(int x = 0; x < 3; x++) {
-			for(int y = 0; y < 3; y++) {
-				final ItemStack stack = crafting.getItemStackAt(x, y);
-				if(stack == null) {
-					continue;
-				}
-				stack.stackSize--;
-				if(stack.stackSize <= 0) {
-					crafting.setSlotContentsAt(x, y, null);	
-				}
-			}
-		}
-		return returnStack;
-	}
-
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairable.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairable.java
deleted file mode 100644
index 74a7da2c1..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairable.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class RecipeRepairable implements IRecipe
-{
-
-    public RecipeRepairable(Item inItem, Item repairMaterial)
-    {
-        this.inItem = inItem;
-        this.repairMaterial = repairMaterial;
-        inItemStack = new ItemStack(inItem);
-    }
-
-    @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
-    {
-        int repairMaterialCount = 0;
-        int inItemCount = 0;
-
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == repairMaterial.id)
-                {
-                    repairMaterialCount++;
-                }
-                else if (stack.itemID == inItem.id)
-                {
-                    inItemCount++;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }
-
-        if (repairMaterialCount == 0) return false;
-        return inItemCount == 1;
-    }
-
-    @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
-    {
-        int repairMaterialCount = 0;
-        ItemStack inItemStack = null;
-
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == repairMaterial.id)
-                {
-                    repairMaterialCount++;
-                }
-                else if (stack.itemID == inItem.id)
-                {
-                    inItemStack = stack.copy();
-                }
-            }
-        }
-
-        for (int i = 0; i < repairMaterialCount; i++)
-        {
-            if (inItemStack.getMetadata() < inItemStack.getMaxDamage())
-            {
-                inItemStack.setMetadata(inItemStack.getMetadata() - inItemStack.getMaxDamage() / 8);
-            }
-        }
-
-        if(inItemStack.getMetadata() < 0)
-            inItemStack.setMetadata(0);
-
-        return inItemStack;
-    }
-    @Override
-	public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
-        ItemStack[] returnStack = new ItemStack[9];
-        for(int x = 0; x < 3; x++)
-        {
-            for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                ItemStack stack2;
-                if(stack.stackSize-1 == 0)
-                    stack2 = null;
-                else {
-                    stack2 = new ItemStack(stack.getItem(), stack.stackSize - 1);
-                }
-                inventorycrafting.setSlotContentsAt(x, y, stack2);
-            }
-        }
-        return returnStack;
-    }
-
-    @Override
-    public int getRecipeSize() {
-        return 2;
-    }
-
-    @Override
-    public ItemStack getRecipeOutput() {
-        return inItemStack;
-    }
-
-    public Item inItem;
-    public Item repairMaterial;
-    public ItemStack inItemStack;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairableStackable.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairableStackable.java
deleted file mode 100644
index 1b6453ba8..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeRepairableStackable.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class RecipeRepairableStackable implements IRecipe
-{
-
-    public RecipeRepairableStackable(Item inItem, ItemStack materialStack)
-    {
-        this.inItem = inItem;
-        this.materialStack = materialStack;
-        inItemStack = new ItemStack(inItem);
-        totalStackCount = 0;
-    }
-
-    @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
-    {
-        int materialStackCount = 0;
-        int inItemCount = 0;
-
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == materialStack.itemID)
-                {
-                    materialStackCount++;
-                }
-                else if (stack.itemID == inItem.id && stack.getMetadata() > 0)
-                {
-                    inItemCount++;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }
-
-        if (materialStackCount == 0) return false;
-        return inItemCount == 1;
-    }
-
-    @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
-    {
-        ItemStack inItemStack = null;
-        totalStackCount = 0;
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == materialStack.itemID)
-                {
-                    totalStackCount += stack.stackSize;
-                }
-                else if (stack.itemID == inItem.id)
-                {
-                    inItemStack = stack.copy();
-                    originalDamage = inItemStack.getMetadata();
-                }
-            }
-        }
-
-        if (inItemStack.getMetadata() - totalStackCount > 0)
-        {
-            inItemStack.setMetadata(inItemStack.getMetadata() - totalStackCount);
-        }else{
-            inItemStack.setMetadata(0);
-        }
-
-        if(inItemStack.getMetadata() < 0)
-            inItemStack.setMetadata(0);
-
-        return inItemStack;
-    }
-
-    @Override
-	public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
-        int repairCost =  originalDamage - inItemStack.getMetadata();
-        ItemStack[] returnStack = new ItemStack[9];
-        for(int x = 0; x < 3; x++)
-        {
-            for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.getItem() == inItem) inventorycrafting.setSlotContentsAt(x, y, null);
-                if (stack.getItem() == materialStack.getItem()) {
-                    ItemStack replacementStack;
-                    if (repairCost <= 0) return returnStack;
-                    if (stack.stackSize - repairCost <= 0) {
-                        replacementStack = null;
-                    } else {
-                        replacementStack = new ItemStack(stack.getItem(), stack.stackSize - repairCost);
-                    }
-                    repairCost = repairCost - stack.stackSize;
-                    inventorycrafting.setSlotContentsAt(x, y, replacementStack);
-                }
-            }
-        }
-        return returnStack;
-    }
-
-    @Override
-    public int getRecipeSize() {
-        return 2;
-    }
-
-    @Override
-    public ItemStack getRecipeOutput() {
-
-        return inItemStack;
-    }
-
-    public Item inItem;
-    public ItemStack materialStack;
-    public ItemStack inItemStack;
-    int originalDamage;
-    int totalStackCount;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeScrap.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeScrap.java
deleted file mode 100644
index 651032cca..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeScrap.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class RecipeScrap implements IRecipe
-{
-
-    public RecipeScrap(Item itemToScrap, Item scrapYield)
-    {
-        this.itemToScrap = itemToScrap;
-        this.scrapYield = scrapYield;
-        scrapYieldStack = new ItemStack(scrapYield);
-    }
-
-    @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
-    {
-        int itemToScrapCount = 0;
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == itemToScrap.id)
-                {
-                    itemToScrapCount++;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }
-        if (itemToScrapCount != 1) return false;
-        return true;
-    }
-
-    @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
-    {
-        float itemToScrapDamage = 0;
-        float itemMaxDamage = 0;
-        ItemStack scrapYieldStack = null;
-
-        for (int x = 0; x < 3; x++)
-        {
-            for (int y = 0; y < 3; y++)
-            {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                if (stack.itemID == itemToScrap.id)
-                {
-                    itemToScrapDamage = stack.getMetadata();
-                    itemMaxDamage = stack.getMaxDamage();
-                }
-            }
-        }
-        float scrapYieldResult = ((itemMaxDamage - itemToScrapDamage) / itemMaxDamage) * 4;
-        if(scrapYieldResult >= 1)
-            return new ItemStack(scrapYield, (int)scrapYieldResult);
-        return null;
-    }
-
-    @Override
-	public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
-        ItemStack[] returnStack = new ItemStack[9];
-        for(int x = 0; x < 3; x++)
-        {
-            for(int y = 0; y < 3; y++) {
-                ItemStack stack = inventorycrafting.getItemStackAt(x, y);
-                if (stack == null) continue;
-                ItemStack stack2;
-                if(stack.stackSize-1 == 0)
-                    stack2 = null;
-                else {
-                    stack2 = new ItemStack(stack.getItem(), stack.stackSize - 1);
-                }
-                inventorycrafting.setSlotContentsAt(x, y, stack2);
-            }
-        }
-        return returnStack;
-    }
-
-    @Override
-    public int getRecipeSize() {
-        return 2;
-    }
-
-    @Override
-    public ItemStack getRecipeOutput() {
-        return scrapYieldStack;
-    }
-
-    public Item itemToScrap;
-    public Item scrapYield;
-    public ItemStack scrapYieldStack;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShaped.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShaped.java
deleted file mode 100644
index 8c4e2b402..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShaped.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-
-// Referenced classes of package net.minecraft.src:
-//            IRecipe, ItemStack, InventoryCrafting
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-import net.minecraft.core.crafting.legacy.CraftingManager;
-
-public class RecipeShaped
-    implements IRecipe
-{
-
-    public RecipeShaped(int i, int j, ItemStack[] inputs, ItemStack output)
-    {
-        recipeOutputItemID = output.itemID;
-        recipeWidth = i;
-        recipeHeight = j;
-        recipeItems = inputs;
-        recipeOutput = output;
-        useAlternatives = false;
-        countForMetadata = true;
-        consumeContainerItem = false;
-    }
-    
-    public RecipeShaped(int i, int j, ItemStack[] inputs, ItemStack output, boolean useAlternatives, boolean countForMetadata)
-    {
-        this(i, j, inputs, output);
-        this.useAlternatives = useAlternatives;
-        this.countForMetadata = countForMetadata;
-    }
-
-    public RecipeShaped(int i, int j, ItemStack[] inputs, ItemStack output, boolean useAlternatives, boolean countForMetadata, boolean consumeContainingItem)
-    {
-        this(i, j, inputs, output);
-        this.useAlternatives = useAlternatives;
-        this.countForMetadata = countForMetadata;
-        this.consumeContainerItem = consumeContainingItem;
-    }
-
-    @Override
-	public ItemStack getRecipeOutput()
-    {
-        return recipeOutput;
-    }
-
-    @Override
-	public boolean matches(InventoryCrafting inventory)
-    {
-        for(int i = 0; i <= 3 - recipeWidth; i++)
-        {
-            for(int j = 0; j <= 3 - recipeHeight; j++)
-            {
-                if(isRecipeMatching(inventory, i, j, true))
-                {
-                    return true;
-                }
-                if(isRecipeMatching(inventory, i, j, false))
-                {
-                    return true;
-                }
-            }
-
-        }
-
-        return false;
-    }
-
-    private boolean isRecipeMatching(InventoryCrafting inventory, int i, int j, boolean flag)
-    {
-        for(int k = 0; k < 3; k++)
-        {
-            for(int l = 0; l < 3; l++)
-            {
-                int i1 = k - i;
-                int j1 = l - j;
-                ItemStack stack = null;
-                if(i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight)
-                {
-                    if (flag)
-                    {
-                        stack = recipeItems[(recipeWidth - i1 - 1) + j1 * recipeWidth];
-                    } else
-                    {
-                        stack = recipeItems[i1 + j1 * recipeWidth];
-                    }
-                }
-                
-                ItemStack itemstack1 = inventory.getItemStackAt(k, l);
-                if(itemstack1 == null && stack == null)
-                {
-                	continue;
-                }
-                
-                int alternativeIndex = -1;
-                if (useAlternatives && stack != null)
-                {
-                	for (int q = 0; q < CraftingManager.blockAlternatives.length; q++)
-                	{
-                		if (CraftingManager.blockAlternatives[q][0].id == stack.itemID)
-                		{
-                			alternativeIndex = q;
-                			break;
-                		}
-                	}                	
-                }
-                
-                if(itemstack1 == null && stack != null || itemstack1 != null && stack == null)
-                {
-                    return false;
-                }
-                boolean idMatches = false;
-                if (alternativeIndex != -1)
-                {
-                	for (int q = 0; q < CraftingManager.blockAlternatives[alternativeIndex].length; q++)
-                	{
-                		if (itemstack1.itemID == CraftingManager.blockAlternatives[alternativeIndex][q].id)
-                		{
-                			idMatches = true;
-                			break;
-                		}
-                	}                	
-                }
-                else
-                {
-                	if(stack.itemID == itemstack1.itemID)
-                	{
-                		idMatches = true;
-                	}                	
-                }
-                if (!idMatches)
-                {
-                	return false;
-                }
-                if(countForMetadata) {
-                    if (stack.getMetadata() != -1 && stack.getMetadata() != itemstack1.getMetadata()) {
-                        return false;
-                    }
-                }
-            }
-
-        }
-
-        return true;
-    }
-
-    @Override
-	public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
-    {
-        return new ItemStack(recipeOutput.itemID, recipeOutput.stackSize, recipeOutput.getMetadata());
-    }
-
-    @Override
-	public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
-        ItemStack[] returnStack = new ItemStack[9];
-        for(int i = 0; i < inventorycrafting.getSizeInventory(); i++)
-        {
-            ItemStack itemstack1 = inventorycrafting.getStackInSlot(i);
-            if(itemstack1 == null)
-            {
-                continue;
-            }
-            inventorycrafting.decrStackSize(i, 1);
-            if(!consumeContainerItem && itemstack1.getItem().hasContainerItem())
-            {
-                inventorycrafting.setInventorySlotContents(i, new ItemStack(itemstack1.getItem().getContainerItem()));
-            }
-        }
-        return returnStack;
-    }
-
-    @Override
-	public int getRecipeSize()
-    {
-        return recipeWidth * recipeHeight;
-    }
-
-    public int recipeWidth;
-    public int recipeHeight;
-    public ItemStack recipeItems[];
-    public ItemStack recipeOutput;
-    public boolean useAlternatives;
-    public boolean countForMetadata;
-
-    public boolean consumeContainerItem;
-    public final int recipeOutputItemID;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShapeless.java b/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShapeless.java
deleted file mode 100644
index 1ae304d78..000000000
--- a/src/main/java/net/minecraft/core/crafting/legacy/type/RecipeShapeless.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package net.minecraft.core.crafting.legacy.type;
-
-import net.minecraft.core.crafting.legacy.recipe.IRecipe;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-import java.util.*;
-
-// Referenced classes of package net.minecraft.src:
-//            IRecipe, InventoryCrafting, ItemStack
-
-public class RecipeShapeless
-    implements IRecipe
-{
-
-    public RecipeShapeless(ItemStack itemstack, List list)
-    {
-        recipeOutput = itemstack;
-        recipeItems = list;
-    }
-
-    @Override
-	public ItemStack getRecipeOutput()
-    {
-        return recipeOutput;
-    }
-
-    @Override
-	public boolean matches(InventoryCrafting inventorycrafting)
-    {
-        ArrayList arraylist = new ArrayList(recipeItems);
-        int i = 0;
-        do
-        {
-            if(i >= 3)
-            {
-                break;
-            }
-            for(int j = 0; j < 3; j++)
-            {
-                ItemStack itemstack = inventorycrafting.getItemStackAt(j, i);
-                if(itemstack == null)
-                {
-                    continue;
-                }
-                boolean flag = false;
-                Iterator iterator = arraylist.iterator();
-                do
-                {
-                    if(!iterator.hasNext())
-                    {
-                        break;
-                    }
-                    ItemStack itemstack1 = (ItemStack)iterator.next();
-                    if(itemstack.itemID != itemstack1.itemID || itemstack1.getMetadata() != -1 && itemstack.getMetadata() != itemstack1.getMetadata())
-                    {
-                        continue;
-                    }
-                    flag = true;
-                    arraylist.remove(itemstack1);
-                    break;
-                } while(true);
-                if(!flag)
-                {
-                    return false;
-                }
-            }
-
-            i++;
-        } while(true);
-        return arraylist.isEmpty();
-    }
-
-    @Override
-	public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
-        ItemStack[] returnStack = new ItemStack[9];
-        for(int i = 0; i < inventorycrafting.getSizeInventory(); i++)
-        {
-            ItemStack itemstack1 = inventorycrafting.getStackInSlot(i);
-            if(itemstack1 == null)
-            {
-                continue;
-            }
-            inventorycrafting.decrStackSize(i, 1);
-            if(itemstack1.getItem().hasContainerItem())
-            {
-                inventorycrafting.setInventorySlotContents(i, new ItemStack(itemstack1.getItem().getContainerItem()));
-            }
-        }
-        return returnStack;
-    }
-
-    @Override
-	public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
-    {
-        return recipeOutput.copy();
-    }
-
-    @Override
-	public int getRecipeSize()
-    {
-        return recipeItems.size();
-    }
-
-    public final ItemStack recipeOutput;
-    public final List recipeItems;
-}
diff --git a/src/main/java/net/minecraft/core/crafting/recipe/TrommelRecipes.java b/src/main/java/net/minecraft/core/crafting/recipe/TrommelRecipes.java
deleted file mode 100644
index 551ba6e80..000000000
--- a/src/main/java/net/minecraft/core/crafting/recipe/TrommelRecipes.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package net.minecraft.core.crafting.recipe;
-
-import net.minecraft.core.WeightedRandomBag;
-import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-
-public class TrommelRecipes {
-    public TrommelRecipes(){
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsDirt = new WeightedRandomBag<>();
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.ammoPebble), 1, 3), 50.0);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.clay), 1, 5), 20.0);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.flint), 1, 3), 10.0);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.sulphur)), 2.0);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawIron), 1), 0.5);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.olivine)), 0.25);
-//        trommelDropsDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.quartz)), 0.25);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/dirt",trommelDropsDirt,new ItemStack(Block.dirt));
-//
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsGravel = new WeightedRandomBag<>();
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.flint), 1, 2), 25.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.olivine), 1, 3), 30.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.ammoPebble), 1, 6), 25.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawIron), 1, 2), 10.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.dye, 1, 4), 2, 6), 5.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.sulphur)), 5.0);
-//        trommelDropsGravel.addEntry(new WeightedRandomLootObject(new ItemStack(Item.quartz)), 0.5);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/gravel",trommelDropsGravel,new ItemStack(Block.gravel));
-//
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsClay = new WeightedRandomBag<>();
-//        trommelDropsClay.addEntry(new WeightedRandomLootObject(new ItemStack(Item.clay), 4, 8), 30.0);
-//        trommelDropsClay.addEntry(new WeightedRandomLootObject(new ItemStack(Item.ammoPebble), 1, 3), 20.0);
-//        trommelDropsClay.addEntry(new WeightedRandomLootObject(new ItemStack(Item.sulphur)), 10.0);
-//        trommelDropsClay.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawGold), 1), 1.0);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/clay",trommelDropsClay,new ItemStack(Block.blockClay));
-//
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsSand = new WeightedRandomBag<>();
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.quartz), 1, 3), 50.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.clay), 4, 8), 30.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.ammoPebble), 1, 5), 25.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.bone), 1, 3), 10.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.flint), 1, 3), 10.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.sulphur)), 5.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawGold), 1), 1.0);
-//        trommelDropsSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.olivine)), 5.0);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/sand",trommelDropsSand,new ItemStack(Block.sand));
-//
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsRichDirt = new WeightedRandomBag<>();
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawGold), 1), 10.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawIron), 1, 2), 15.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.quartz), 1, 4), 25.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.olivine), 1, 4), 25.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.dye, 1, 4), 2, 4), 20.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.clay), 4, 8), 10.0);
-//        trommelDropsRichDirt.addEntry(new WeightedRandomLootObject(new ItemStack(Item.ammoPebble), 1, 5), 5.0);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/rich_dirt",trommelDropsRichDirt,new ItemStack(Block.dirtScorchedRich));
-//
-//        WeightedRandomBag<WeightedRandomLootObject> trommelDropsSoulSand = new WeightedRandomBag<>();
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.flint), 1, 3), 20.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.bone), 1, 6), 10.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawGold), 1), 2.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.oreRawIron), 1), 1.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.dustGlowstone), 1, 6), 5.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.quartz), 1, 3), 5.0);
-//        trommelDropsSoulSand.addEntry(new WeightedRandomLootObject(new ItemStack(Item.nethercoal)), 0.5);
-//        Registries.RECIPES.addTrommelRecipe("minecraft:trommel/soul_sand",trommelDropsClay,new ItemStack(Block.soulsand));
-    }
-}
diff --git a/src/main/java/net/minecraft/core/data/DataLoader.java b/src/main/java/net/minecraft/core/data/DataLoader.java
index bc2c5bb5e..cc6e57c74 100644
--- a/src/main/java/net/minecraft/core/data/DataLoader.java
+++ b/src/main/java/net/minecraft/core/data/DataLoader.java
@@ -13,7 +13,7 @@ import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
 import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.adapter.*;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.packet.Packet75RecipeSync;
+import net.minecraft.core.net.packet.RecipeSyncPacket;
 
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
@@ -203,7 +203,7 @@ public class DataLoader {
         System.out.printf("Registered %d recipes%n",i);
     }
 
-    public static void loadRecipeFromServer(Packet75RecipeSync packet){
+    public static void loadRecipeFromServer(RecipeSyncPacket packet){
         JsonArray jsonArray = JsonParser.parseString(packet.recipe).getAsJsonArray();
         GsonBuilder builder = new GsonBuilder();
         builder.setPrettyPrinting();
diff --git a/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java b/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
index fc95f71ea..98d010b18 100644
--- a/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
+++ b/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
@@ -6,10 +6,10 @@ import java.util.List;
 import java.util.Set;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
-import net.minecraft.core.block.BlockLog;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.block.LogBlock;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
@@ -19,7 +19,7 @@ public class TreecapitatorHelper {
 	
 	public final World world;
 	public final ChunkPosition basePosition;
-	public final EntityPlayer player;
+	public final Player player;
 	
 	protected final Set<ChunkPosition> allBlocksSet = new HashSet<>();
 	protected final List<ChunkPosition> allBlocksList = new ArrayList<>();
@@ -28,7 +28,7 @@ public class TreecapitatorHelper {
 	
 	protected ChunkPosition lastBrokenBlock = null;
 	
-	public TreecapitatorHelper(World world, int x, int y, int z, EntityPlayer player) {
+	public TreecapitatorHelper(World world, int x, int y, int z, Player player) {
 		this.world = world;
 		this.basePosition = new ChunkPosition(x, y, z);
 		this.player = player;
@@ -46,7 +46,7 @@ public class TreecapitatorHelper {
 		}
 
 		ItemList itemList = null;
-		if(EntityItem.enableItemClumping) {
+		if(ItemEntity.enableItemClumping) {
 			itemList = new ItemList();
 		}
 		
@@ -132,8 +132,8 @@ public class TreecapitatorHelper {
 		for(int i=0; i < allBlocksList.size(); i++) {
 			ChunkPosition pos = allBlocksList.get(i);
 			Block block = world.getBlock(pos.x, pos.y, pos.z);
-			if(block instanceof BlockLeavesBase) {
-				BlockLeavesBase blockLeaves = (BlockLeavesBase) block;
+			if(block instanceof BaseLeavesBlock) {
+				BaseLeavesBlock blockLeaves = (BaseLeavesBlock) block;
 				
 				if(player.getGamemode().dropBlockOnBreak()) {
 					ItemStack[] drops = blockLeaves.getBreakResult(world, EnumDropCause.PROPER_TOOL, pos.x, pos.y, pos.z, world.getBlockMetadata(pos.x, pos.y, pos.z), null);
@@ -214,14 +214,14 @@ public class TreecapitatorHelper {
 	}
 	
 	protected boolean isLog(Block block) {
-		return block instanceof BlockLog;
+		return block instanceof LogBlock;
 	}
 	
 	protected boolean isDecayableLeaf(ChunkPosition pos) {
 		Block block = world.getBlock(pos.x, pos.y, pos.z);
-		if(block instanceof BlockLeavesBase) {
+		if(block instanceof BaseLeavesBlock) {
 			int meta = world.getBlockMetadata(pos.x, pos.y, pos.z);
-			if(BlockLeavesBase.isPermanent(meta)) {
+			if(BaseLeavesBlock.isPermanent(meta)) {
 				return false;
 			}
 			
@@ -265,7 +265,7 @@ public class TreecapitatorHelper {
 						Block block = world.getBlock(x + offX, y + offY, z + offZ);
 						if(isLog(block)) {
 							adjacentTreeBlocks[(offX + b) * a + (offY + b) * byte1 + (offZ + b)] = 0;
-						}else if(block instanceof BlockLeavesBase) {
+						}else if(block instanceof BaseLeavesBlock) {
 							adjacentTreeBlocks[(offX + b) * a + (offY + b) * byte1 + (offZ + b)] = -2;
 						} else {
 							adjacentTreeBlocks[(offX + b) * a + (offY + b) * byte1 + (offZ + b)] = -1;
diff --git a/src/main/java/net/minecraft/core/data/registry/Registries.java b/src/main/java/net/minecraft/core/data/registry/Registries.java
index 3423ad869..6f968f6ed 100644
--- a/src/main/java/net/minecraft/core/data/registry/Registries.java
+++ b/src/main/java/net/minecraft/core/data/registry/Registries.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.data.registry;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
 import net.minecraft.core.data.registry.recipe.RecipeRegistry;
 import net.minecraft.core.data.registry.recipe.entry.*;
@@ -8,6 +9,7 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.data.gamerule.GameRule;
 import net.minecraft.core.data.gamerule.GameRules;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.type.WorldType;
@@ -57,29 +59,30 @@ public class Registries extends Registry<Registry<?>>
         RECIPE_TYPES.register("minecraft:crafting/repairable", RecipeEntryRepairable.class);
         RECIPE_TYPES.register("minecraft:crafting/repairable_stackable", RecipeEntryRepairableStackable.class);
         RECIPE_TYPES.register("minecraft:crafting/uses_tool", RecipeEntryCraftingWithTool.class);
+        RECIPE_TYPES.register("minecraft:crafting/map_duplication", RecipeEntryMapDuplication.class);
         RECIPE_TYPES.register("minecraft:smelting", RecipeEntryFurnace.class);
         RECIPE_TYPES.register("minecraft:smelting/blast", RecipeEntryBlastFurnace.class);
         RECIPE_TYPES.register("minecraft:trommeling", RecipeEntryTrommel.class);
 
-        ITEM_GROUPS.register("minecraft:stones",stackListOf(Block.stone, Block.basalt, Block.limestone, Block.granite));
-        ITEM_GROUPS.register("minecraft:cobblestones",stackListOf(Block.cobbleStone, Block.cobbleBasalt, Block.cobbleLimestone, Block.cobbleGranite, Block.cobblePermafrost));
-        ITEM_GROUPS.register("minecraft:planks",stackListOf(Block.planksOak, new ItemStack(Block.planksOakPainted, 1, 0), new ItemStack(Block.planksOakPainted, 1, 1), new ItemStack(Block.planksOakPainted, 1, 2), new ItemStack(Block.planksOakPainted, 1, 3), new ItemStack(Block.planksOakPainted, 1, 4), new ItemStack(Block.planksOakPainted, 1, 5), new ItemStack(Block.planksOakPainted, 1, 6), new ItemStack(Block.planksOakPainted, 1, 7), new ItemStack(Block.planksOakPainted, 1, 8), new ItemStack(Block.planksOakPainted, 1, 9), new ItemStack(Block.planksOakPainted, 1, 10), new ItemStack(Block.planksOakPainted, 1, 11), new ItemStack(Block.planksOakPainted, 1, 12), new ItemStack(Block.planksOakPainted, 1, 13), new ItemStack(Block.planksOakPainted, 1, 14), new ItemStack(Block.planksOakPainted, 1, 15)));
-        ITEM_GROUPS.register("minecraft:grasses",stackListOf(Block.grass, Block.grassRetro));
-        ITEM_GROUPS.register("minecraft:dirt",stackListOf(Block.dirt, Block.dirtScorched));
-        ITEM_GROUPS.register("minecraft:trommel_dirt",stackListOf(Block.dirt, Block.dirtScorched, Block.grass, Block.grassRetro, Block.grassScorched, Block.pathDirt, Block.farmlandDirt));
-        ITEM_GROUPS.register("minecraft:moss_stones",stackListOf(Block.mossStone, Block.mossBasalt, Block.mossLimestone, Block.mossGranite));
-        ITEM_GROUPS.register("minecraft:logs",stackListOf(Block.logOak, Block.logPine, Block.logBirch, Block.logCherry, Block.logEucalyptus, Block.logOakMossy, Block.logThorn, Block.logPalm));
-        ITEM_GROUPS.register("minecraft:leaves",stackListOf(Block.leavesOak, Block.leavesOakRetro, Block.leavesPine, Block.leavesBirch, Block.leavesCherry, Block.leavesEucalyptus, Block.leavesShrub));
-        ITEM_GROUPS.register("minecraft:coal_ores",stackListOf(Block.oreCoalStone, Block.oreCoalBasalt, Block.oreCoalLimestone, Block.oreCoalGranite));
-        ITEM_GROUPS.register("minecraft:iron_ores",stackListOf(Block.oreIronStone, Block.oreIronBasalt, Block.oreIronLimestone, Block.oreIronGranite));
-        ITEM_GROUPS.register("minecraft:gold_ores",stackListOf(Block.oreGoldStone, Block.oreGoldBasalt, Block.oreGoldLimestone, Block.oreGoldGranite));
-        ITEM_GROUPS.register("minecraft:lapis_ores",stackListOf(Block.oreLapisStone, Block.oreLapisBasalt, Block.oreLapisLimestone, Block.oreLapisGranite));
-        ITEM_GROUPS.register("minecraft:redstone_ores",stackListOf(Block.oreRedstoneStone, Block.oreRedstoneBasalt, Block.oreRedstoneLimestone, Block.oreRedstoneGranite, Block.oreRedstoneGlowingStone, Block.oreRedstoneGlowingBasalt, Block.oreRedstoneGlowingLimestone, Block.oreRedstoneGlowingGranite));
-        ITEM_GROUPS.register("minecraft:diamond_ores",stackListOf(Block.oreDiamondStone, Block.oreDiamondBasalt, Block.oreDiamondLimestone, Block.oreDiamondGranite));
-        ITEM_GROUPS.register("minecraft:nethercoal_ores", stackListOf(Block.oreNethercoalNetherrack));
-        ITEM_GROUPS.register("minecraft:chests",stackListOf(Block.chestPlanksOak, new ItemStack(Block.chestPlanksOakPainted, 1, 0x00), new ItemStack(Block.chestPlanksOakPainted, 1, 0x10), new ItemStack(Block.chestPlanksOakPainted, 1, 0x20), new ItemStack(Block.chestPlanksOakPainted, 1, 0x30), new ItemStack(Block.chestPlanksOakPainted, 1, 0x40), new ItemStack(Block.chestPlanksOakPainted, 1, 0x50), new ItemStack(Block.chestPlanksOakPainted, 1, 0x60), new ItemStack(Block.chestPlanksOakPainted, 1, 0x70), new ItemStack(Block.chestPlanksOakPainted, 1, 0x80), new ItemStack(Block.chestPlanksOakPainted, 1, 0x90), new ItemStack(Block.chestPlanksOakPainted, 1, 0xA0), new ItemStack(Block.chestPlanksOakPainted, 1, 0xB0), new ItemStack(Block.chestPlanksOakPainted, 1, 0xC0), new ItemStack(Block.chestPlanksOakPainted, 1, 0xD0), new ItemStack(Block.chestPlanksOakPainted, 1, 0xE0), new ItemStack(Block.chestPlanksOakPainted, 1, 0xF0)));
-        ITEM_GROUPS.register("minecraft:wools", stackListOf(new ItemStack(Block.wool, 1, 0), new ItemStack(Block.wool, 1, 1), new ItemStack(Block.wool, 1, 2), new ItemStack(Block.wool, 1, 3), new ItemStack(Block.wool, 1, 4), new ItemStack(Block.wool, 1, 5), new ItemStack(Block.wool, 1, 6), new ItemStack(Block.wool, 1, 7), new ItemStack(Block.wool, 1, 8), new ItemStack(Block.wool, 1, 9), new ItemStack(Block.wool, 1, 10), new ItemStack(Block.wool, 1, 11), new ItemStack(Block.wool, 1, 12), new ItemStack(Block.wool, 1, 13), new ItemStack(Block.wool, 1, 14), new ItemStack(Block.wool, 1, 15)));
-        ITEM_GROUPS.register("minecraft:lamps", stackListOf(new ItemStack(Block.lampIdle, 1, 0), new ItemStack(Block.lampIdle, 1, 1), new ItemStack(Block.lampIdle, 1, 2), new ItemStack(Block.lampIdle, 1, 3), new ItemStack(Block.lampIdle, 1, 4), new ItemStack(Block.lampIdle, 1, 5), new ItemStack(Block.lampIdle, 1, 6), new ItemStack(Block.lampIdle, 1, 7), new ItemStack(Block.lampIdle, 1, 8), new ItemStack(Block.lampIdle, 1, 9), new ItemStack(Block.lampIdle, 1, 10), new ItemStack(Block.lampIdle, 1, 11), new ItemStack(Block.lampIdle, 1, 12), new ItemStack(Block.lampIdle, 1, 13), new ItemStack(Block.lampIdle, 1, 14), new ItemStack(Block.lampIdle, 1, 15)));
+        ITEM_GROUPS.register("minecraft:stones",stackListOf(Blocks.STONE, Blocks.BASALT, Blocks.LIMESTONE, Blocks.GRANITE));
+        ITEM_GROUPS.register("minecraft:cobblestones",stackListOf(Blocks.COBBLE_STONE, Blocks.COBBLE_BASALT, Blocks.COBBLE_LIMESTONE, Blocks.COBBLE_GRANITE, Blocks.COBBLE_PERMAFROST));
+        ITEM_GROUPS.register("minecraft:planks",stackListOf(Blocks.PLANKS_OAK, new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 0), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 1), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 2), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 3), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 4), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 5), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 6), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 7), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 8), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 9), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 10), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 11), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 12), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 13), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 14), new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, 15)));
+        ITEM_GROUPS.register("minecraft:grasses",stackListOf(Blocks.GRASS, Blocks.GRASS_RETRO));
+        ITEM_GROUPS.register("minecraft:dirt",stackListOf(Blocks.DIRT, Blocks.DIRT_SCORCHED));
+        ITEM_GROUPS.register("minecraft:trommel_dirt",stackListOf(Blocks.DIRT, Blocks.DIRT_SCORCHED, Blocks.GRASS, Blocks.GRASS_RETRO, Blocks.GRASS_SCORCHED, Blocks.PATH_DIRT, Blocks.FARMLAND_DIRT));
+        ITEM_GROUPS.register("minecraft:moss_stones",stackListOf(Blocks.MOSS_STONE, Blocks.MOSS_BASALT, Blocks.MOSS_LIMESTONE, Blocks.MOSS_GRANITE));
+        ITEM_GROUPS.register("minecraft:logs",stackListOf(Blocks.LOG_OAK, Blocks.LOG_PINE, Blocks.LOG_BIRCH, Blocks.LOG_CHERRY, Blocks.LOG_EUCALYPTUS, Blocks.LOG_OAK_MOSSY, Blocks.LOG_THORN, Blocks.LOG_PALM));
+        ITEM_GROUPS.register("minecraft:leaves",stackListOf(Blocks.LEAVES_OAK, Blocks.LEAVES_OAK_RETRO, Blocks.LEAVES_PINE, Blocks.LEAVES_BIRCH, Blocks.LEAVES_CHERRY, Blocks.LEAVES_EUCALYPTUS, Blocks.LEAVES_SHRUB));
+        ITEM_GROUPS.register("minecraft:coal_ores",stackListOf(Blocks.ORE_COAL_STONE, Blocks.ORE_COAL_BASALT, Blocks.ORE_COAL_LIMESTONE, Blocks.ORE_COAL_GRANITE));
+        ITEM_GROUPS.register("minecraft:iron_ores",stackListOf(Blocks.ORE_IRON_STONE, Blocks.ORE_IRON_BASALT, Blocks.ORE_IRON_LIMESTONE, Blocks.ORE_IRON_GRANITE));
+        ITEM_GROUPS.register("minecraft:gold_ores",stackListOf(Blocks.ORE_GOLD_STONE, Blocks.ORE_GOLD_BASALT, Blocks.ORE_GOLD_LIMESTONE, Blocks.ORE_GOLD_GRANITE));
+        ITEM_GROUPS.register("minecraft:lapis_ores",stackListOf(Blocks.ORE_LAPIS_STONE, Blocks.ORE_LAPIS_BASALT, Blocks.ORE_LAPIS_LIMESTONE, Blocks.ORE_LAPIS_GRANITE));
+        ITEM_GROUPS.register("minecraft:redstone_ores",stackListOf(Blocks.ORE_REDSTONE_STONE, Blocks.ORE_REDSTONE_BASALT, Blocks.ORE_REDSTONE_LIMESTONE, Blocks.ORE_REDSTONE_GRANITE, Blocks.ORE_REDSTONE_GLOWING_STONE, Blocks.ORE_REDSTONE_GLOWING_BASALT, Blocks.ORE_REDSTONE_GLOWING_LIMESTONE, Blocks.ORE_REDSTONE_GLOWING_GRANITE));
+        ITEM_GROUPS.register("minecraft:diamond_ores",stackListOf(Blocks.ORE_DIAMOND_STONE, Blocks.ORE_DIAMOND_BASALT, Blocks.ORE_DIAMOND_LIMESTONE, Blocks.ORE_DIAMOND_GRANITE));
+        ITEM_GROUPS.register("minecraft:nethercoal_ores", stackListOf(Blocks.ORE_NETHERCOAL_NETHERRACK));
+        ITEM_GROUPS.register("minecraft:chests",stackListOf(Blocks.CHEST_PLANKS_OAK, new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x00), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x10), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x20), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x30), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x40), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x50), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x60), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x70), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x80), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0x90), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xA0), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xB0), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xC0), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xD0), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xE0), new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, 0xF0)));
+        ITEM_GROUPS.register("minecraft:wools", stackListOf(new ItemStack(Blocks.WOOL, 1, 0), new ItemStack(Blocks.WOOL, 1, 1), new ItemStack(Blocks.WOOL, 1, 2), new ItemStack(Blocks.WOOL, 1, 3), new ItemStack(Blocks.WOOL, 1, 4), new ItemStack(Blocks.WOOL, 1, 5), new ItemStack(Blocks.WOOL, 1, 6), new ItemStack(Blocks.WOOL, 1, 7), new ItemStack(Blocks.WOOL, 1, 8), new ItemStack(Blocks.WOOL, 1, 9), new ItemStack(Blocks.WOOL, 1, 10), new ItemStack(Blocks.WOOL, 1, 11), new ItemStack(Blocks.WOOL, 1, 12), new ItemStack(Blocks.WOOL, 1, 13), new ItemStack(Blocks.WOOL, 1, 14), new ItemStack(Blocks.WOOL, 1, 15)));
+        ITEM_GROUPS.register("minecraft:lamps", stackListOf(new ItemStack(Blocks.LAMP_IDLE, 1, 0), new ItemStack(Blocks.LAMP_IDLE, 1, 1), new ItemStack(Blocks.LAMP_IDLE, 1, 2), new ItemStack(Blocks.LAMP_IDLE, 1, 3), new ItemStack(Blocks.LAMP_IDLE, 1, 4), new ItemStack(Blocks.LAMP_IDLE, 1, 5), new ItemStack(Blocks.LAMP_IDLE, 1, 6), new ItemStack(Blocks.LAMP_IDLE, 1, 7), new ItemStack(Blocks.LAMP_IDLE, 1, 8), new ItemStack(Blocks.LAMP_IDLE, 1, 9), new ItemStack(Blocks.LAMP_IDLE, 1, 10), new ItemStack(Blocks.LAMP_IDLE, 1, 11), new ItemStack(Blocks.LAMP_IDLE, 1, 12), new ItemStack(Blocks.LAMP_IDLE, 1, 13), new ItemStack(Blocks.LAMP_IDLE, 1, 14), new ItemStack(Blocks.LAMP_IDLE, 1, 15)));
 
         if(RECIPES == null) new RecipeRegistry();
     }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
index 3d5f1de1e..bcbbac3d7 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeRegistry.java
@@ -3,13 +3,14 @@ package net.minecraft.core.data.registry.recipe;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.recipe.TrommelRecipes;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.registry.Registry;
 import net.minecraft.core.data.registry.recipe.entry.*;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 import java.util.*;
 
@@ -18,10 +19,10 @@ import java.util.*;
 public class RecipeRegistry extends Registry<RecipeNamespace> {
 
     public final RecipeNamespace MINECRAFT = new RecipeNamespace();
-    public final RecipeGroup<RecipeEntryCrafting<?,?>> WORKBENCH = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Block.workbench)));
-    public final RecipeGroup<RecipeEntryFurnace> FURNACE = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Block.furnaceStoneActive)));
-    public final RecipeGroup<RecipeEntryBlastFurnace> BLAST_FURNACE = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Block.furnaceBlastActive)));
-    public final RecipeGroup<RecipeEntryTrommel> TROMMEL = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Block.trommelActive)));
+    public final RecipeGroup<RecipeEntryCrafting<?,?>> WORKBENCH = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Blocks.WORKBENCH)));
+    public final RecipeGroup<RecipeEntryFurnace> FURNACE = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Blocks.FURNACE_STONE_ACTIVE)));
+    public final RecipeGroup<RecipeEntryBlastFurnace> BLAST_FURNACE = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Blocks.FURNACE_BLAST_ACTIVE)));
+    public final RecipeGroup<RecipeEntryTrommel> TROMMEL = new RecipeGroup<>(new RecipeSymbol(new ItemStack(Blocks.TROMMEL_ACTIVE)));
 
     private ArrayList<RecipeEntryCrafting<?,?>> recipeCache = null;
 
@@ -34,8 +35,31 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
         MINECRAFT.register("blast_furnace",BLAST_FURNACE);
         MINECRAFT.register("trommel",TROMMEL);
         register("minecraft",MINECRAFT);
+        addProceduralRecipes();
+    }
+
+    public void addProceduralRecipes(){
         WORKBENCH.register("label",new RecipeEntryLabel());
         WORKBENCH.register("label_dye",new RecipeEntryLabelDye());
+
+        addCustomRecipe("minecraft:workbench/repair_chainmail_boots",       new RecipeEntryRepairable(Items.ARMOR_BOOTS_CHAINMAIL.getDefaultStack(),        new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+        addCustomRecipe("minecraft:workbench/repair_chainmail_leggings",    new RecipeEntryRepairable(Items.ARMOR_LEGGINGS_CHAINMAIL.getDefaultStack(),     new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+        addCustomRecipe("minecraft:workbench/repair_chainmail_chestplate",  new RecipeEntryRepairable(Items.ARMOR_CHESTPLATE_CHAINMAIL.getDefaultStack(),   new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+        addCustomRecipe("minecraft:workbench/repair_chainmail_helmet",      new RecipeEntryRepairable(Items.ARMOR_HELMET_CHAINMAIL.getDefaultStack(),       new RecipeSymbol(Items.CHAINLINK.getDefaultStack())));
+
+        addCustomRecipe("minecraft:workbench/scrap_chainmail_boots",        new RecipeEntryScrap(Items.ARMOR_BOOTS_CHAINMAIL,       Items.CHAINLINK));
+        addCustomRecipe("minecraft:workbench/scrap_chainmail_leggings",     new RecipeEntryScrap(Items.ARMOR_LEGGINGS_CHAINMAIL,    Items.CHAINLINK));
+        addCustomRecipe("minecraft:workbench/scrap_chainmail_chestplate",   new RecipeEntryScrap(Items.ARMOR_CHESTPLATE_CHAINMAIL,  Items.CHAINLINK));
+        addCustomRecipe("minecraft:workbench/scrap_chainmail_helmet",       new RecipeEntryScrap(Items.ARMOR_HELMET_CHAINMAIL,      Items.CHAINLINK));
+
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_wood",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_WOOD,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_stone",    new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_STONE,    new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_iron",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_IRON,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_gold",     new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_GOLD,     new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_diamond",  new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_DIAMOND,  new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+        addCustomRecipe("minecraft:workbench/carve_pumpkin_sword_steel",    new RecipeEntryCraftingWithTool(new ItemStack(Blocks.PUMPKIN), Items.TOOL_SWORD_STEEL,    new ItemStack(Blocks.PUMPKIN_CARVED_IDLE)));
+
+        addCustomRecipe("minecraft:workbench/map_duplication", new RecipeEntryMapDuplication());
     }
 
     @Override
@@ -144,7 +168,7 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
         return Collections.unmodifiableList(recipes);
     }
 
-    public ItemStack findMatchingRecipe(InventoryCrafting inventorycrafting)
+    public ItemStack findMatchingRecipe(CraftingContainer inventorycrafting)
     {
         for(int i = 0; i < getAllCraftingRecipes().size(); i++)
         {
@@ -158,7 +182,7 @@ public class RecipeRegistry extends Registry<RecipeNamespace> {
         return null;
     }
 
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting)
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting)
     {
         for(int i = 0; i < getAllCraftingRecipes().size(); i++)
         {
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
index 2c616ad98..89b8f86c5 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/adapter/ItemStackJsonAdapter.java
@@ -8,7 +8,9 @@ import com.google.gson.JsonParseException;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 
 import java.lang.reflect.Type;
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java
index a5edf3914..822251e7c 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCloneMap.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryCloneMap extends RecipeEntryCraftingDynamic {
 
 	@Override
-	public boolean matches(InventoryCrafting crafting) {
+	public boolean matches(CraftingContainer crafting) {
 		for(int x = 0; x < 3; x++) {
 			for(int y = 0; y < 3; y++) {
 				ItemStack stack = crafting.getItemStackAt(x, y);
@@ -18,11 +18,11 @@ public class RecipeEntryCloneMap extends RecipeEntryCraftingDynamic {
 				}
 				
 				if(x == 1 && y == 1) {
-					if(stack.itemID != Item.map.id) {
+					if(stack.itemID != Items.MAP.id) {
 						return false;
 					}
 				}else {
-					if(stack.itemID != Item.paper.id) {
+					if(stack.itemID != Items.PAPER.id) {
 						return false;
 					}
 				}
@@ -33,7 +33,7 @@ public class RecipeEntryCloneMap extends RecipeEntryCraftingDynamic {
 	}
 
 	@Override
-	public ItemStack getCraftingResult(InventoryCrafting crafting) {
+	public ItemStack getCraftingResult(CraftingContainer crafting) {
 		ItemStack output = crafting.getItemStackAt(1, 1).copy();
 		output.stackSize = 2;
 		return output;
@@ -50,12 +50,12 @@ public class RecipeEntryCloneMap extends RecipeEntryCraftingDynamic {
 	}
 
 	@Override
-	public ItemStack[] onCraftResult(InventoryCrafting crafting) {
-		for(int i=0; i < crafting.getSizeInventory(); i++) {
-			ItemStack stack = crafting.getStackInSlot(i);
+	public ItemStack[] onCraftResult(CraftingContainer crafting) {
+		for(int i = 0; i < crafting.getContainerSize(); i++) {
+			ItemStack stack = crafting.getItem(i);
 			stack.stackSize--;
 			if(stack.stackSize <= 0) {
-				crafting.setInventorySlotContents(i, null);
+				crafting.setItem(i, null);
 			}
 		}
 		return null;
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
index cc4f5d3a9..3d9b181bd 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCrafting.java
@@ -3,7 +3,7 @@ package net.minecraft.core.data.registry.recipe.entry;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public abstract class RecipeEntryCrafting<I,O> extends RecipeEntryBase<I,O,Void> {
 
@@ -23,7 +23,7 @@ public abstract class RecipeEntryCrafting<I,O> extends RecipeEntryBase<I,O,Void>
         return false;
     }
 
-    public abstract boolean matches(InventoryCrafting inventorycrafting);
+    public abstract boolean matches(CraftingContainer inventorycrafting);
 
     public boolean matchesQueryIgnoreExceptions(SearchQuery query){
         try {
@@ -35,9 +35,9 @@ public abstract class RecipeEntryCrafting<I,O> extends RecipeEntryBase<I,O,Void>
 
     public abstract boolean matchesQuery(SearchQuery query);
 
-    public abstract ItemStack getCraftingResult(InventoryCrafting inventorycrafting);
+    public abstract ItemStack getCraftingResult(CraftingContainer inventorycrafting);
 
     public abstract int getRecipeSize();
 
-    public abstract ItemStack[] onCraftResult(InventoryCrafting inventorycrafting);
+    public abstract ItemStack[] onCraftResult(CraftingContainer inventorycrafting);
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
index 44e456367..fa6c2000e 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShaped.java
@@ -9,7 +9,7 @@ import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.adapter.RecipeCraftingShapedJsonAdapter;
 import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 import java.util.List;
 import java.util.Objects;
@@ -39,7 +39,7 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
     }
 
     @Override
-    public boolean matches(InventoryCrafting inventory) {
+    public boolean matches(CraftingContainer inventory) {
         for (int i = 0; i <= 3 - recipeWidth; i++) {
             for (int j = 0; j <= 3 - recipeHeight; j++) {
                 if (isRecipeMatching(inventory, i, j, true)) {
@@ -135,7 +135,7 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
         return false;
     }
 
-    private boolean isRecipeMatching(InventoryCrafting inventory, int i, int j, boolean flag) {
+    private boolean isRecipeMatching(CraftingContainer inventory, int i, int j, boolean flag) {
         for (int k = 0; k < 3; k++) {
             for (int l = 0; l < 3; l++) {
                 int i1 = k - i;
@@ -170,21 +170,21 @@ public class RecipeEntryCraftingShaped extends RecipeEntryCrafting<RecipeSymbol[
     }
 
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting) {
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting) {
         return new ItemStack(getOutput().itemID, getOutput().stackSize, getOutput().getMetadata());
     }
 
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting) {
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
         ItemStack[] returnStack = new ItemStack[9];
-        for (int i = 0; i < inventorycrafting.getSizeInventory(); i++) {
-            ItemStack itemstack1 = inventorycrafting.getStackInSlot(i);
+        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
+            ItemStack itemstack1 = inventorycrafting.getItem(i);
             if (itemstack1 == null) {
                 continue;
             }
-            inventorycrafting.decrStackSize(i, 1);
+            inventorycrafting.removeItem(i, 1);
             if (!consumeContainerItem && itemstack1.getItem().hasContainerItem()) {
-                inventorycrafting.setInventorySlotContents(i, new ItemStack(itemstack1.getItem().getContainerItem()));
+                inventorycrafting.setItem(i, new ItemStack(itemstack1.getItem().getContainerItem()));
             }
         }
         return returnStack;
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
index 6af3d71af..8547ed7cd 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingShapeless.java
@@ -9,7 +9,7 @@ import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.adapter.RecipeCraftingShapelessJsonAdapter;
 import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -23,7 +23,7 @@ public class RecipeEntryCraftingShapeless extends RecipeEntryCrafting<List<Recip
     public RecipeEntryCraftingShapeless() {}
 
     @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
+    public boolean matches(CraftingContainer inventorycrafting)
     {
         ArrayList<RecipeSymbol> arraylist = new ArrayList<>(getInput());
         int i = 0;
@@ -141,26 +141,26 @@ public class RecipeEntryCraftingShapeless extends RecipeEntryCrafting<List<Recip
     }
 
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
         ItemStack[] returnStack = new ItemStack[9];
-        for(int i = 0; i < inventorycrafting.getSizeInventory(); i++)
+        for(int i = 0; i < inventorycrafting.getContainerSize(); i++)
         {
-            ItemStack itemStack = inventorycrafting.getStackInSlot(i);
+            ItemStack itemStack = inventorycrafting.getItem(i);
             if(itemStack == null)
             {
                 continue;
             }
-            inventorycrafting.decrStackSize(i, 1);
+            inventorycrafting.removeItem(i, 1);
             if(itemStack.getItem().hasContainerItem())
             {
-                inventorycrafting.setInventorySlotContents(i, new ItemStack(itemStack.getItem().getContainerItem()));
+                inventorycrafting.setItem(i, new ItemStack(itemStack.getItem().getContainerItem()));
             }
         }
         return returnStack;
     }
 
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
     {
         return getOutput().copy();
     }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
index d1e6cdb42..996e881ca 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryCraftingWithTool.java
@@ -1,20 +1,9 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.data.registry.recipe.HasJsonAdapter;
-import net.minecraft.core.data.registry.recipe.RecipeGroup;
-import net.minecraft.core.data.registry.recipe.RecipeNamespace;
-import net.minecraft.core.data.registry.recipe.RecipeSymbol;
-import net.minecraft.core.data.registry.recipe.adapter.RecipeCraftingShapelessJsonAdapter;
-import net.minecraft.core.data.registry.recipe.adapter.RecipeJsonAdapter;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
     public RecipeEntryCraftingWithTool(ItemStack inItemStack, Item toolToUse, ItemStack output) {
@@ -27,7 +16,7 @@ public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(InventoryCrafting inventorycrafting) {
+    public boolean matches(CraftingContainer inventorycrafting) {
         boolean toolMatch = false;
         boolean itemMatch = false;
 
@@ -55,12 +44,12 @@ public class RecipeEntryCraftingWithTool extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting) {
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting) {
         return new ItemStack(output.itemID, output.stackSize, output.getMetadata());
     }
 
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting) {
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
         ItemStack[] returnStack = new ItemStack[9];
         for (int x = 0; x < 3; x++) {
             for (int y = 0; y < 3; y++) {
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
index 01ee12009..70a0770a9 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabel.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
     @Override
-    public ItemStack getCraftingResult(final InventoryCrafting inventorycrafting) {
+    public ItemStack getCraftingResult(final CraftingContainer inventorycrafting) {
         ItemStack labelStack = null;
         ItemStack otherItem = null;
 
@@ -17,7 +17,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
                 if(stack == null) {
                     continue;
                 }
-                if(stack.itemID == Item.label.id && labelStack == null) {
+                if(stack.itemID == Items.LABEL.id && labelStack == null) {
                     labelStack = stack;
                 } else if(otherItem == null) {
                     otherItem = stack;
@@ -48,7 +48,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(final InventoryCrafting crafting) {
+    public boolean matches(final CraftingContainer crafting) {
         ItemStack labelStack = null;
         ItemStack otherStack = null;
 
@@ -58,7 +58,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
                 if(stack == null) {
                     continue;
                 }
-                if(stack.itemID == Item.label.id) {
+                if(stack.itemID == Items.LABEL.id) {
                     if(labelStack != null || !stack.hasCustomName()) {
                         return false;
                     }
@@ -76,7 +76,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
             return false;
         }
 
-        if(otherStack.itemID == Item.dye.id) {
+        if(otherStack.itemID == Items.DYE.id) {
             // If the label is not already colored, it should be recolored by RecipeLabelDye
             if(!labelStack.hasCustomColor()) {
                 return false;
@@ -111,7 +111,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack[] onCraftResult(final InventoryCrafting crafting) {
+    public ItemStack[] onCraftResult(final CraftingContainer crafting) {
         final ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
@@ -119,7 +119,7 @@ public class RecipeEntryLabel extends RecipeEntryCraftingDynamic {
                 if(stack == null) {
                     continue;
                 }
-                if(stack.itemID != Item.label.id) {
+                if(stack.itemID != Items.LABEL.id) {
                     stack.stackSize--;
                     if(stack.stackSize <= 0) {
                         crafting.setSlotContentsAt(x, y, null);
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
index a8eec3368..17c5b0331 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryLabelDye.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
     @Override
-    public ItemStack getCraftingResult(final InventoryCrafting inventorycrafting) {
+    public ItemStack getCraftingResult(final CraftingContainer inventorycrafting) {
         ItemStack labelStack = null;
         ItemStack dyeStack = null;
 
@@ -17,9 +17,9 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
                 if(stack == null) {
                     continue;
                 }
-                if(stack.itemID == Item.label.id && labelStack == null) {
+                if(stack.itemID == Items.LABEL.id && labelStack == null) {
                     labelStack = stack;
-                } else if(stack.itemID == Item.dye.id && dyeStack == null) {
+                } else if(stack.itemID == Items.DYE.id && dyeStack == null) {
                     dyeStack = stack;
                 }
                 if(labelStack != null && dyeStack != null) {
@@ -45,7 +45,7 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public boolean matches(final InventoryCrafting crafting) {
+    public boolean matches(final CraftingContainer crafting) {
         ItemStack labelStack = null;
         ItemStack dyeStack = null;
 
@@ -55,12 +55,12 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
                 if(stack == null) {
                     continue;
                 }
-                if(stack.itemID == Item.label.id) {
+                if(stack.itemID == Items.LABEL.id) {
                     if(labelStack != null) {
                         return false;
                     }
                     labelStack = stack;
-                } else if(stack.itemID == Item.dye.id){
+                } else if(stack.itemID == Items.DYE.id){
                     if(dyeStack != null) {
                         return false;
                     }
@@ -88,7 +88,7 @@ public class RecipeEntryLabelDye extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public ItemStack[] onCraftResult(final InventoryCrafting crafting) {
+    public ItemStack[] onCraftResult(final CraftingContainer crafting) {
         final ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++) {
             for(int y = 0; y < 3; y++) {
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java
new file mode 100644
index 000000000..314f3fbd8
--- /dev/null
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryMapDuplication.java
@@ -0,0 +1,83 @@
+package net.minecraft.core.data.registry.recipe.entry;
+
+import net.minecraft.core.data.registry.recipe.SearchQuery;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.MapItem;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
+
+public class RecipeEntryMapDuplication extends RecipeEntryCraftingDynamic{
+
+    @Override
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
+    {
+        ItemStack map = null;
+        int paperAmount = 0;
+        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
+            ItemStack s = inventorycrafting.getItem(i);
+            if (s != null)
+            {
+                Item item = s.getItem();
+                if (item == Items.MAP) {
+                    map = s;
+                } else if (item == Items.PAPER) {
+                    paperAmount++;
+                }
+            }
+        }
+        assert map != null;
+        ItemStack output = map.copy();
+        output.stackSize += paperAmount;
+        return output;
+    }
+
+    @Override
+    public int getRecipeSize() {
+        return 2;
+    }
+
+    @Override
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting) {
+        for (int i = 0; i < inventorycrafting.getContainerSize(); i++) {
+            inventorycrafting.setItem(i, null);
+        }
+        return new ItemStack[0];
+    }
+
+    @Override
+    public boolean matches(CraftingContainer inventorycrafting) {
+        ItemStack mapStack = null;
+        boolean hasPaper = false;
+
+        for(int x = 0; x < 3; x++) {
+            for(int y = 0; y < 3; y++) {
+                final ItemStack stack = inventorycrafting.getItemStackAt(x, y);
+                if(stack == null) {
+                    continue;
+                }
+                if(stack.itemID == Items.MAP.id) {
+                    if(mapStack != null) {
+                        return false;
+                    }
+                    mapStack = stack;
+                } else if(stack.itemID == Items.PAPER.id){
+                    hasPaper = true;
+                }else {
+                    return false;
+                }
+            }
+        }
+
+        if (mapStack == null) return  false;
+        if (!MapItem.hasInitialized(mapStack)) return false;
+        if (!hasPaper) return false;
+
+        return true;
+    }
+
+    @Override
+    public boolean matchesQuery(SearchQuery query) {
+        return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
index f4fc52261..223cb68d3 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairable.java
@@ -1,21 +1,23 @@
 package net.minecraft.core.data.registry.recipe.entry;
 
+import net.minecraft.core.data.registry.recipe.RecipeSymbol;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
-import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
+    public ItemStack inItem;
+    public RecipeSymbol repairMaterial;
 
-    public RecipeEntryRepairable(Item inItem, Item repairMaterial)
+
+    public RecipeEntryRepairable(ItemStack inItem, RecipeSymbol repairMaterial)
     {
         this.inItem = inItem;
         this.repairMaterial = repairMaterial;
-        inItemStack = new ItemStack(inItem);
     }
 
     @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
+    public boolean matches(CraftingContainer inventorycrafting)
     {
         int repairMaterialCount = 0;
         int inItemCount = 0;
@@ -26,11 +28,11 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
             {
                 ItemStack stack = inventorycrafting.getItemStackAt(x, y);
                 if (stack == null) continue;
-                if (stack.itemID == repairMaterial.id)
+                if (repairMaterial.matches(stack))
                 {
                     repairMaterialCount++;
                 }
-                else if (stack.itemID == inItem.id)
+                else if (inItem.itemID == stack.itemID)
                 {
                     inItemCount++;
                 }
@@ -49,9 +51,8 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
     public boolean matchesQuery(SearchQuery query) {
         return false;
     }
-
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
     {
         int repairMaterialCount = 0;
         ItemStack inItemStack = null;
@@ -62,17 +63,19 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
             {
                 ItemStack stack = inventorycrafting.getItemStackAt(x, y);
                 if (stack == null) continue;
-                if (stack.itemID == repairMaterial.id)
+                if (repairMaterial.matches(stack))
                 {
                     repairMaterialCount++;
                 }
-                else if (stack.itemID == inItem.id)
+                else if (inItem.itemID == stack.itemID)
                 {
                     inItemStack = stack.copy();
                 }
             }
         }
 
+        assert inItemStack != null;
+
         for (int i = 0; i < repairMaterialCount; i++)
         {
             if (inItemStack.getMetadata() <= inItemStack.getMaxDamage())
@@ -86,8 +89,9 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
 
         return inItemStack;
     }
+
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
         {
@@ -110,8 +114,4 @@ public class RecipeEntryRepairable extends RecipeEntryCraftingDynamic {
     public int getRecipeSize() {
         return 2;
     }
-
-    public Item inItem;
-    public Item repairMaterial;
-    public ItemStack inItemStack;
 }
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
index 08495834c..e7e02ccae 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryRepairableStackable.java
@@ -3,7 +3,7 @@ package net.minecraft.core.data.registry.recipe.entry;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     public RecipeEntryRepairableStackable(Item inItem, ItemStack materialStack)
@@ -15,7 +15,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
+    public boolean matches(CraftingContainer inventorycrafting)
     {
         int materialStackCount = 0;
         int inItemCount = 0;
@@ -51,7 +51,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
     {
         ItemStack inItemStack = null;
         totalStackCount = 0;
@@ -87,7 +87,7 @@ public class RecipeEntryRepairableStackable extends RecipeEntryCraftingDynamic {
     }
 
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
         int repairCost =  originalDamage - inItemStack.getMetadata();
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
index 5c423d9bc..c63678393 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/entry/RecipeEntryScrap.java
@@ -3,9 +3,13 @@ package net.minecraft.core.data.registry.recipe.entry;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryCrafting;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
 
 public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
+    public Item itemToScrap;
+    public Item scrapYield;
+    public ItemStack scrapYieldStack;
+
 
     public RecipeEntryScrap(Item itemToScrap, Item scrapYield)
     {
@@ -15,7 +19,7 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public boolean matches(InventoryCrafting inventorycrafting)
+    public boolean matches(CraftingContainer inventorycrafting)
     {
         int itemToScrapCount = 0;
         for (int x = 0; x < 3; x++)
@@ -44,7 +48,7 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public ItemStack getCraftingResult(InventoryCrafting inventorycrafting)
+    public ItemStack getCraftingResult(CraftingContainer inventorycrafting)
     {
         float itemToScrapDamage = 0;
         float itemMaxDamage = 0;
@@ -70,7 +74,7 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
     }
 
     @Override
-    public ItemStack[] onCraftResult(InventoryCrafting inventorycrafting){
+    public ItemStack[] onCraftResult(CraftingContainer inventorycrafting){
         ItemStack[] returnStack = new ItemStack[9];
         for(int x = 0; x < 3; x++)
         {
@@ -93,8 +97,4 @@ public class RecipeEntryScrap extends RecipeEntryCraftingDynamic{
     public int getRecipeSize() {
         return 2;
     }
-
-    public Item itemToScrap;
-    public Item scrapYield;
-    public ItemStack scrapYieldStack;
 }
diff --git a/src/main/java/net/minecraft/core/entity/ConsumedFood.java b/src/main/java/net/minecraft/core/entity/ConsumedFood.java
index b3777b165..c691678fa 100644
--- a/src/main/java/net/minecraft/core/entity/ConsumedFood.java
+++ b/src/main/java/net/minecraft/core/entity/ConsumedFood.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.entity;
 
-import net.minecraft.core.item.ItemFood;
+import net.minecraft.core.item.FoodItem;
 
 public class ConsumedFood {
-    private final EntityLiving entity;
-    private final ItemFood food;
+    private final Mob entity;
+    private final FoodItem food;
     private int healRemaining;
     private int tickCounter = 0;
 
-    public ConsumedFood(EntityLiving entity, ItemFood food) {
+    public ConsumedFood(Mob entity, FoodItem food) {
         this.entity = entity;
         this.food = food;
 
diff --git a/src/main/java/net/minecraft/core/entity/Entity.java b/src/main/java/net/minecraft/core/entity/Entity.java
index b2bd80477..2db366c6d 100644
--- a/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/src/main/java/net/minecraft/core/entity/Entity.java
@@ -12,10 +12,10 @@ import net.minecraft.client.gui.guidebook.mobs.MobInfoRegistry;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
+import net.minecraft.core.block.FluidBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
@@ -23,7 +23,7 @@ import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.IVehicle;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.data.SynchedEntityData;
@@ -32,6 +32,11 @@ import org.jetbrains.annotations.Nullable;
 public abstract class Entity
     implements IVehicle
 {
+    public static final int DATA_SHARED_FLAGS_ID = 0;
+    public static final int FLAG_ONFIRE = 0;
+    public static final int FLAG_SNEAKING = 1;
+    public static final int FLAG_RIDING = 2;
+    public static final int FLAG_SPRINTING = 3;
     private static int entityCounter = 0;
     public int id = entityCounter++;
     public double viewScale = 1.0D;
@@ -52,7 +57,7 @@ public abstract class Entity
     public float xRot;
     public float yRotO;
     public float xRotO;
-    public final AABB bb = AABB.getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+    public final AABB bb = AABB.getPermanentBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
     public boolean onGround = false;
     public boolean horizontalCollision;
     public boolean verticalCollision;
@@ -107,11 +112,11 @@ public abstract class Entity
     public Entity(World world) {
         this.world = world;
         setPos(0.0D, 0.0D, 0.0D);
-        entityData.define(0, (byte) 0);
-        init();
+        entityData.define(DATA_SHARED_FLAGS_ID, (byte) 0);
+        defineSynchedData();
     }
 
-    protected abstract void init();
+    protected abstract void defineSynchedData();
 
     public void spawnInit()
     {
@@ -193,7 +198,7 @@ public abstract class Entity
         this.z = z;
         float center = bbWidth / 2.0F;
         float heightOfMob = bbHeight;
-        bb.setBounds(
+        bb.set(
                 x - (double)center,
                 (y - (double) heightOffset) + (double) ySlideOffset,
                 z - (double)center,
@@ -300,8 +305,8 @@ public abstract class Entity
 
         if (!world.isClientSide)
         {
-            setSharedFlag(0, remainingFireTicks > 0);
-            setSharedFlag(2, vehicle != null);
+            setSharedFlag(FLAG_ONFIRE, remainingFireTicks > 0);
+            setSharedFlag(FLAG_RIDING, vehicle != null);
         }
 
         firstTick = false;
@@ -311,7 +316,7 @@ public abstract class Entity
         {
             if(!wasInWater && !firstTick)
             {
-                float f = MathHelper.sqrt_double(xd * xd * 0.2D + yd * yd + zd * zd * 0.2D) * 0.2F;
+                float f = MathHelper.sqrt(xd * xd * 0.2D + yd * yd + zd * zd * 0.2D) * 0.2F;
                 if(f > 1.0F)
                 {
                     f = 1.0F;
@@ -326,7 +331,7 @@ public abstract class Entity
                     }
                 }
                 
-                float f1 = MathHelper.floor_double(bb.minY);
+                float f1 = MathHelper.floor(bb.minY);
                 for(int i = 0; (float)i < 1.0F + bbWidth * 20F; i++)
                 {
                     double offX = (random.nextFloat() * 2.0F - 1.0F) * bbWidth;
@@ -379,7 +384,7 @@ public abstract class Entity
 
     public boolean isFree(double x, double y, double z)
     {
-        AABB offsetBb = bb.getOffsetBoundingBox(x, y, z).expand(-0.01, -0.01, -0.01);
+        AABB offsetBb = bb.cloneMove(x, y, z).grow(-0.01, -0.01, -0.01);
         List<AABB> list = world.getCubes(this, offsetBb);
         if(list.size() > 0)
         {
@@ -393,7 +398,7 @@ public abstract class Entity
         if(noPhysics)
         {
         	onGround = false;
-            bb.offset(xd, yd, zd);
+            bb.move(xd, yd, zd);
             this.x = (bb.minX + bb.maxX) / 2D;
             this.y = (bb.minY + (double) heightOffset) - (double) ySlideOffset;
             this.z = (bb.minZ + bb.maxZ) / 2D;
@@ -420,7 +425,7 @@ public abstract class Entity
         if(sneakingOnGround)
         {
             double maxSneakOverhang = 0.05D;
-            for (; xd != 0.0 && this.world.getCubes(this, bb.getOffsetBoundingBox(xd, -1D, 0.0D)).size() == 0; oldXd = xd)
+            for (; xd != 0.0 && this.world.getCubes(this, bb.cloneMove(xd, -1D, 0.0D)).size() == 0; oldXd = xd)
             {
                 if(xd < maxSneakOverhang && xd >= -maxSneakOverhang)
                 {
@@ -437,7 +442,7 @@ public abstract class Entity
                     xd += maxSneakOverhang;
                 }
             }
-            for (; zd != 0.0D && world.getCubes(this, bb.getOffsetBoundingBox(0.0D, -1D, zd)).size() == 0; oldZd = zd)
+            for (; zd != 0.0D && world.getCubes(this, bb.cloneMove(0.0D, -1D, zd)).size() == 0; oldZd = zd)
             {
                 if(zd < maxSneakOverhang && zd >= -maxSneakOverhang)
                 {
@@ -456,13 +461,13 @@ public abstract class Entity
             }
         }
 
-        List<AABB> cubes = world.getCubes(this, bb.addCoord(xd, yd, zd));
+        List<AABB> cubes = world.getCubes(this, bb.expand(xd, yd, zd));
         for (AABB aabb : cubes)
         {
-            yd = aabb.calculateYOffset(bb, yd);
+            yd = aabb.clipYCollide(bb, yd);
         }
 
-        bb.offset(0.0D, yd, 0.0D);
+        bb.move(0.0D, yd, 0.0D);
         if(!slide && oldYd != yd)
         {
             xd = yd = zd = 0.0D;
@@ -470,20 +475,20 @@ public abstract class Entity
         boolean flag1 = onGround || oldYd != yd && oldYd < 0.0D;
         for (AABB aabb : cubes)
         {
-            xd = aabb.calculateXOffset(bb, xd);
+            xd = aabb.clipXCollide(bb, xd);
         }
 
-        bb.offset(xd, 0.0D, 0.0D);
+        bb.move(xd, 0.0D, 0.0D);
         if(!slide && oldXd != xd)
         {
             xd = yd = zd = 0.0D;
         }
         for (AABB aabb : cubes)
         {
-            zd = aabb.calculateZOffset(bb, zd);
+            zd = aabb.clipZCollide(bb, zd);
         }
 
-        bb.offset(0.0D, 0.0D, zd);
+        bb.move(0.0D, 0.0D, zd);
         if(!slide && oldZd != zd)
         {
             xd = yd = zd = 0.0D;
@@ -498,30 +503,30 @@ public abstract class Entity
             zd = oldZd;
             AABB axisalignedbb1 = bb.copy();
             bb.setBB(bbCopy);
-            List<AABB> list1 = world.getCubes(this, bb.addCoord(xd, yd, zd));
+            List<AABB> list1 = world.getCubes(this, bb.expand(xd, yd, zd));
             for (AABB aabb : list1) {
-                yd = aabb.calculateYOffset(bb, yd);
+                yd = aabb.clipYCollide(bb, yd);
             }
 
-            bb.offset(0.0D, yd, 0.0D);
+            bb.move(0.0D, yd, 0.0D);
             if(!slide && oldYd != yd)
             {
                 xd = yd = zd = 0.0D;
             }
             for (AABB aabb : list1) {
-                xd = aabb.calculateXOffset(bb, xd);
+                xd = aabb.clipXCollide(bb, xd);
             }
 
-            bb.offset(xd, 0.0D, 0.0D);
+            bb.move(xd, 0.0D, 0.0D);
             if(!slide && oldXd != xd)
             {
                 xd = yd = zd = 0.0D;
             }
             for (AABB aabb : list1) {
-                zd = aabb.calculateZOffset(bb, zd);
+                zd = aabb.clipZCollide(bb, zd);
             }
 
-            bb.offset(0.0D, 0.0D, zd);
+            bb.move(0.0D, 0.0D, zd);
             if(!slide && oldZd != zd)
             {
                 xd = yd = zd = 0.0D;
@@ -533,10 +538,10 @@ public abstract class Entity
             {
                 yd = -footSize;
                 for (AABB aabb : list1) {
-                    yd = aabb.calculateYOffset(bb, yd);
+                    yd = aabb.clipYCollide(bb, yd);
                 }
 
-                bb.offset(0.0D, yd, 0.0D);
+                bb.move(0.0D, yd, 0.0D);
             }
             if(oldX * oldX + oldZ * oldZ >= xd * xd + zd * zd)
             {
@@ -547,7 +552,7 @@ public abstract class Entity
             }
         }
         //fix for entity jitter when blasted by cannonballs (can cause some client-side jitter when entity is under a ceiling. unsure exactly why)
-        if (!this.world.isClientSide || this instanceof EntityPlayer || !(this instanceof EntityLiving)) {
+        if (!this.world.isClientSide || this instanceof Player || !(this instanceof Mob)) {
             this.x = (bb.minX + bb.maxX) / 2D;
             this.y = (bb.minY + (double) heightOffset) - (double) ySlideOffset;
             this.z = (bb.minZ + bb.maxZ) / 2D;
@@ -573,14 +578,14 @@ public abstract class Entity
         double d10 = this.x - d3;
         double d12 = this.z - d4;
         if(makeStepSound() && !sneakingOnGround && vehicle == null) {
-            walkDist += (double) MathHelper.sqrt_double(d10 * d10 + d12 * d12) * 0.6;
+            walkDist += (double) MathHelper.sqrt(d10 * d10 + d12 * d12) * 0.6;
             
             // Tiny bounding box
-            AABB boundingBox = AABB.getBoundingBox(this.x - 0.01, this.bb.minY - 0.01, this.z - 0.01, this.x + 0.01, this.bb.minY + 0.01, this.z + 0.01);
+            AABB boundingBox = AABB.getPermanentBB(this.x - 0.01, this.bb.minY - 0.01, this.z - 0.01, this.x + 0.01, this.bb.minY + 0.01, this.z + 0.01);
 
-            int blockX = MathHelper.floor_double(this.x);
-            int blockY = MathHelper.floor_double(boundingBox.minY);
-            int blockZ = MathHelper.floor_double(this.z);
+            int blockX = MathHelper.floor(this.x);
+            int blockY = MathHelper.floor(boundingBox.minY);
+            int blockZ = MathHelper.floor(this.z);
             
             Block blockWalkedOn = null;
 
@@ -607,7 +612,7 @@ public abstract class Entity
             }
             
             // Check for snow layers
-            int blockYUp = MathHelper.floor_double(boundingBox.maxY);
+            int blockYUp = MathHelper.floor(boundingBox.maxY);
             Block blockAbove = world.getBlock(blockX, blockYUp, blockZ);
             if(blockAbove != null && blockAbove.hasTag(BlockTags.OVERRIDE_STEPSOUND)) {
             	blockWalkedOn = blockAbove;
@@ -625,12 +630,12 @@ public abstract class Entity
                 }
             }
         }
-        int minX = MathHelper.floor_double(bb.minX + 0.001D);
-        int minY = MathHelper.floor_double(bb.minY + 0.001D);
-        int minZ = MathHelper.floor_double(bb.minZ + 0.001D);
-        int maxX = MathHelper.floor_double(bb.maxX - 0.001D);
-        int maxY = MathHelper.floor_double(bb.maxY - 0.001D);
-        int maxZ = MathHelper.floor_double(bb.maxZ - 0.001D);
+        int minX = MathHelper.floor(bb.minX + 0.001D);
+        int minY = MathHelper.floor(bb.minY + 0.001D);
+        int minZ = MathHelper.floor(bb.minZ + 0.001D);
+        int maxX = MathHelper.floor(bb.maxX - 0.001D);
+        int maxY = MathHelper.floor(bb.maxY - 0.001D);
+        int maxZ = MathHelper.floor(bb.maxZ - 0.001D);
         if(world.areBlocksLoaded(minX, minY, minZ, maxX, maxY, maxZ))
         {
             for(int _x = minX; _x <= maxX; _x++)
@@ -710,17 +715,17 @@ public abstract class Entity
         }
     }
 
-    protected void causeFallDamage(float f)
+    protected void causeFallDamage(float distance)
     {
         if (passenger != null)
         {
-            passenger.causeFallDamage(f);
+            passenger.causeFallDamage(distance);
         }
     }
 
     public boolean isInWaterOrRain()
     {
-        return wasInWater || world.canBlockBeRainedOn(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z));
+        return wasInWater || world.canBlockBeRainedOn(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z));
     }
 
     public boolean isInWater()
@@ -736,13 +741,13 @@ public abstract class Entity
     public boolean isUnderLiquid(Material material)
     {
         double d = y + (double) getHeadHeight();
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_float(MathHelper.floor_double(d));
-        int k = MathHelper.floor_double(z);
+        int i = MathHelper.floor(x);
+        int j = MathHelper.floor_float(MathHelper.floor(d));
+        int k = MathHelper.floor(z);
         int l = world.getBlockId(i, j, k);
         if(l != 0 && Block.blocksList[l].blockMaterial == material)
         {
-            float f = BlockFluid.getWaterVolume(world.getBlockMetadata(i, j, k)) - 0.2F;
+            float f = FluidBlock.getWaterVolume(world.getBlockMetadata(i, j, k)) - 0.2F;
             float f1 = (float)(j + 1) - f;
             return d < (double)f1;
         } else
@@ -777,8 +782,8 @@ public abstract class Entity
         f *= f3;
         f1 *= f3;
 
-        float sinYaw = MathHelper.sin((yRot * 3.141593F) / 180F);
-        float cosYaw = MathHelper.cos((yRot * 3.141593F) / 180F);
+        float sinYaw = MathHelper.sin((yRot * MathHelper.PI) / 180F);
+        float cosYaw = MathHelper.cos((yRot * MathHelper.PI) / 180F);
         xd += f * cosYaw - f1 * sinYaw ;
         zd += f1 * cosYaw + f * sinYaw;
     }
@@ -788,11 +793,11 @@ public abstract class Entity
     	if(Global.accessor.isFullbrightEnabled()) {
     		return 1.0f;
     	}
-        int i = MathHelper.floor_double(x);
+        int i = MathHelper.floor(x);
         double d = (bb.maxY - bb.minY) * 0.66D;
-        int j = MathHelper.floor_double((y - (double) heightOffset) + d);
-        int k = MathHelper.floor_double(z);
-        if(world != null && world.areBlocksLoaded(MathHelper.floor_double(bb.minX), MathHelper.floor_double(bb.minY), MathHelper.floor_double(bb.minZ), MathHelper.floor_double(bb.maxX), MathHelper.floor_double(bb.maxY), MathHelper.floor_double(bb.maxZ)))
+        int j = MathHelper.floor((y - (double) heightOffset) + d);
+        int k = MathHelper.floor(z);
+        if(world != null && world.areBlocksLoaded(MathHelper.floor(bb.minX), MathHelper.floor(bb.minY), MathHelper.floor(bb.minZ), MathHelper.floor(bb.maxX), MathHelper.floor(bb.maxY), MathHelper.floor(bb.maxZ)))
         {
             float f1 = world.getLightBrightness(i, j, k);
             if(f1 < entityBrightness)
@@ -806,16 +811,16 @@ public abstract class Entity
         }
     }
     
-    public int getLightmapCoord(float partialTicks) {
+    public int getLightmapCoord(float partialTick) {
     	if(world == null) {
     		// Happens when the guidebook is rendered
     		return LightmapHelper.getLightmapCoord(15, 15);
     	}
     	
-    	int blockX = MathHelper.floor_double(x);
+    	int blockX = MathHelper.floor(x);
         double d = (bb.maxY - bb.minY) * 0.66D;
-    	int blockY = MathHelper.floor_double((y - (double) heightOffset) + d);
-    	int blockZ = MathHelper.floor_double(z);
+    	int blockY = MathHelper.floor((y - (double) heightOffset) + d);
+    	int blockZ = MathHelper.floor(z);
     	
     	int skylight = world.getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ);
     	int blocklight = world.getSavedLightValue(LightLayer.Block, blockX, blockY, blockZ);
@@ -882,7 +887,7 @@ public abstract class Entity
         double d3 = x - d;
         double d4 = y - d1;
         double d5 = z - d2;
-        return MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
+        return MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
     }
 
     public double distanceToSqr(Entity entity)
@@ -893,7 +898,7 @@ public abstract class Entity
         return d * d + d1 * d1 + d2 * d2;
     }
 
-    public void playerTouch(EntityPlayer player)
+    public void playerTouch(Player player)
     {
     }
 
@@ -917,7 +922,7 @@ public abstract class Entity
         double d2 = MathHelper.abs_max(d, d1);
         if (d2 >= 0.01D)
         {
-            d2 = MathHelper.sqrt_double(d2);
+            d2 = MathHelper.sqrt(d2);
             d /= d2;
             d1 /= d2;
             double d3 = 1.0D / d2;
@@ -973,18 +978,18 @@ public abstract class Entity
     {
     }
 
-    public boolean shouldRender(Vec3d vec3d)
+    public boolean shouldRender(Vec3 vec3)
     {
-        double d = x - vec3d.xCoord;
-        double d1 = y - vec3d.yCoord;
-        double d2 = z - vec3d.zCoord;
+        double d = x - vec3.x;
+        double d1 = y - vec3.y;
+        double d2 = z - vec3.z;
         double d3 = d * d + d1 * d1 + d2 * d2;
         return shouldRenderAtSqrDistance(d3);
     }
 
     public boolean shouldRenderAtSqrDistance(double distance)
     {
-        double d1 = bb.getAverageEdgeLength();
+        double d1 = bb.getSize();
         d1 *= 64D * viewScale;
         return distance < d1 * d1;
     }
@@ -996,7 +1001,7 @@ public abstract class Entity
 
     public boolean save(CompoundTag tag)
     {
-        String s = getEntityString();
+        String s = getEncodeId();
         if(removed || s == null)
         {
             return false;
@@ -1013,7 +1018,7 @@ public abstract class Entity
     {
         tag.put("Pos", newDoubleList(new double[] { x, y + ySlideOffset, z }));
         tag.put("Motion", newDoubleList(new double[] { xd, yd, zd }));
-        tag.put("Rotation", newFloatNBTList(new float[] { yRot, xRot }));
+        tag.put("Rotation", newFloatList(new float[] { yRot, xRot }));
         tag.putFloat("FallDistance", fallDistance);
         tag.putShort("Fire", (short) remainingFireTicks);
         tag.putShort("Air", (short) airSupply);
@@ -1056,9 +1061,9 @@ public abstract class Entity
         readAdditionalSaveData(tag);
     }
 
-    protected final String getEntityString()
+    protected final String getEncodeId()
     {
-        return EntityDispatcher.getEntityString(this);
+        return EntityDispatcher.getEncodeId(this);
     }
 
     public abstract void readAdditionalSaveData(CompoundTag tag);
@@ -1076,7 +1081,7 @@ public abstract class Entity
         return list;
     }
 
-    protected ListTag newFloatNBTList(float[] array)
+    protected ListTag newFloatList(float[] array)
     {
         ListTag list = new ListTag();
         for (float f : array)
@@ -1092,20 +1097,20 @@ public abstract class Entity
         return bbHeight / 2.0F;
     }
 
-    public EntityItem spawnAtLocation(int itemId, int stackSize)
+    public ItemEntity spawnAtLocation(int itemId, int stackSize)
     {
         return spawnAtLocation(itemId, stackSize, 0.0F);
     }
 
-    public EntityItem spawnAtLocation(int itemId, int stackSize, float verticalOffset)
+    public ItemEntity spawnAtLocation(int itemId, int stackSize, float verticalOffset)
     {
         return spawnAtLocation(new ItemStack(itemId, stackSize, 0), verticalOffset);
     }
 
-    public EntityItem spawnAtLocation(ItemStack itemStack, float verticalOffset)
+    public ItemEntity spawnAtLocation(ItemStack itemStack, float verticalOffset)
     {
-        EntityItem entityitem = new EntityItem(world, x, y + verticalOffset, z, itemStack);
-        entityitem.delayBeforeCanPickup = 10;
+        ItemEntity entityitem = new ItemEntity(world, x, y + verticalOffset, z, itemStack);
+        entityitem.pickupDelay = 10;
         world.entityJoinedWorld(entityitem);
         return entityitem;
     }
@@ -1122,9 +1127,9 @@ public abstract class Entity
             float f = ((float)((i >> 0) % 2) - 0.5F) * bbWidth * 0.9F;
             float f1 = ((float)((i >> 1) % 2) - 0.5F) * 0.1F;
             float f2 = ((float)((i >> 2) % 2) - 0.5F) * bbWidth * 0.9F;
-            int j = MathHelper.floor_double(x + (double)f);
-            int k = MathHelper.floor_double(y + (double) getHeadHeight() + (double)f1);
-            int l = MathHelper.floor_double(z + (double)f2);
+            int j = MathHelper.floor(x + (double)f);
+            int k = MathHelper.floor(y + (double) getHeadHeight() + (double)f1);
+            int l = MathHelper.floor(z + (double)f2);
             if(world.isBlockNormalCube(j, k, l))
             {
                 return true;
@@ -1134,7 +1139,7 @@ public abstract class Entity
         return false;
     }
 
-    public boolean interact(EntityPlayer entityplayer)
+    public boolean interact(Player entityplayer)
     {
         return false;
     }
@@ -1155,35 +1160,17 @@ public abstract class Entity
             return;
         }
         vehicle.positionRider();
-        entityRiderYawDelta += vehicle.getYRotDelta();
-        entityRiderPitchDelta += vehicle.getXRotDelta();
-        for(; entityRiderYawDelta >= 180D; entityRiderYawDelta -= 360D) { }
-        for(; entityRiderYawDelta < -180D; entityRiderYawDelta += 360D) { }
-        for(; entityRiderPitchDelta >= 180D; entityRiderPitchDelta -= 360D) { }
-        for(; entityRiderPitchDelta < -180D; entityRiderPitchDelta += 360D) { }
-        double d = entityRiderYawDelta * 0.5D;
-        double d1 = entityRiderPitchDelta * 0.5D;
-        float f = 10F;
-        if(d > (double)f)
-        {
-            d = f;
-        }
-        if(d < (double)(-f))
-        {
-            d = -f;
-        }
-        if(d1 > (double)f)
-        {
-            d1 = f;
-        }
-        if(d1 < (double)(-f))
-        {
-            d1 = -f;
-        }
-        entityRiderYawDelta -= d;
-        //entityRiderPitchDelta -= d1;
-        if(turnWithVehicle) yRot += d;
-        //rotationPitch += d1;
+        entityRiderYawDelta = MathHelper.normalizeRotation(entityRiderYawDelta + vehicle.getYRotDelta());
+        entityRiderPitchDelta = MathHelper.normalizeRotation(entityRiderPitchDelta + vehicle.getXRotDelta());
+
+        final float maxRot = 10F;
+        double yaw = MathHelper.clamp(entityRiderYawDelta / 2D, -maxRot, maxRot);
+        double pitch = MathHelper.clamp(entityRiderPitchDelta / 2D, -maxRot, maxRot);
+
+        entityRiderYawDelta -= yaw;
+        //entityRiderPitchDelta -= pitch;
+        if(turnWithVehicle && false) yRot += yaw;
+        //rotationPitch += pitch;
     }
 
     @Override
@@ -1273,7 +1260,7 @@ public abstract class Entity
         return 0.1F;
     }
 
-    public Vec3d getLookAngle()
+    public Vec3 getLookAngle()
     {
         return null;
     }
@@ -1309,22 +1296,22 @@ public abstract class Entity
 
     public boolean isOnFire()
     {
-        return !fireImmune && remainingFireTicks > 0 || getSharedFlag(0);
+        return !fireImmune && remainingFireTicks > 0 || getSharedFlag(FLAG_ONFIRE);
     }
 
     public boolean isPassenger()
     {
-        return vehicle != null || getSharedFlag(2);
+        return vehicle != null || getSharedFlag(FLAG_RIDING);
     }
 
     public boolean isSneaking()
     {
-        return getSharedFlag(1);
+        return getSharedFlag(FLAG_SNEAKING);
     }
     
     public void setSneaking(boolean flag)
     {
-    	setSharedFlag(1, flag);
+    	setSharedFlag(FLAG_SNEAKING, flag);
     }
 
     protected boolean getSharedFlag(int i)
@@ -1332,19 +1319,19 @@ public abstract class Entity
         return (entityData.getByte(0) & 1 << i) != 0;
     }
 
-    protected void setSharedFlag(int i, boolean flag)
+    protected void setSharedFlag(int id, boolean flag)
     {
-        byte byte0 = entityData.getByte(0);
+        byte sharedFlags = entityData.getByte(DATA_SHARED_FLAGS_ID);
         if(flag)
         {
-            entityData.set(0, (byte) (byte0 | 1 << i));
+            entityData.set(DATA_SHARED_FLAGS_ID, (byte) (sharedFlags | 1 << id));
         } else
         {
-            entityData.set(0, (byte) (byte0 & ~(1 << i)));
+            entityData.set(DATA_SHARED_FLAGS_ID, (byte) (sharedFlags & ~(1 << id)));
         }
     }
 
-    public void thunderHit(EntityLightningBolt bolt)
+    public void thunderHit(LightningEntity bolt)
     {
         burn(5);
         remainingFireTicks++;
@@ -1355,15 +1342,15 @@ public abstract class Entity
         maxFireTicks = remainingFireTicks;
     }
 
-    public void killed(EntityLiving entityliving)
+    public void killed(Mob entityliving)
     {
     }
 
     protected boolean checkInTile(double d, double d1, double d2)
     {
-        int i = MathHelper.floor_double(d);
-        int j = MathHelper.floor_double(d1);
-        int k = MathHelper.floor_double(d2);
+        int i = MathHelper.floor(d);
+        int j = MathHelper.floor(d1);
+        int k = MathHelper.floor(d2);
         double d3 = d - (double)i;
         double d4 = d1 - (double)j;
         double d5 = d2 - (double)k;
@@ -1442,12 +1429,12 @@ public abstract class Entity
 
     public boolean isSprinting()
     {
-        return getSharedFlag(3);
+        return getSharedFlag(FLAG_SPRINTING);
     }
 
     public void setSprinting(boolean sprinting)
     {
-        setSharedFlag(3, sprinting);
+        setSharedFlag(FLAG_SPRINTING, sprinting);
     }
 
     @Override
@@ -1472,28 +1459,28 @@ public abstract class Entity
 
     @Override
     public float getYRotDelta() {
-        return yRot - yRotO;
+        return (float) MathHelper.deltaAngle(yRot, yRotO);
     }
 
     @Override
     public float getXRotDelta() {
-        return xRot - xRotO;
+        return (float) MathHelper.deltaAngle(xRot, xRotO);
     }
 
     public static String getNameFromEntity(Entity entity, boolean useNickname){
         I18n translator = I18n.getInstance();
-        if (entity instanceof EntityLiving && useNickname){
-            if (!((EntityLiving) entity).nickname.isEmpty()){
-                return ((EntityLiving) entity).nickname;
+        if (entity instanceof Mob && useNickname){
+            if (!((Mob) entity).nickname.isEmpty()){
+                return ((Mob) entity).nickname;
             }
         }
-        if (entity instanceof EntityPlayer){
-            return ((EntityPlayer) entity).getDisplayName();
+        if (entity instanceof Player){
+            return ((Player) entity).getDisplayName();
         }
         if (MobInfoRegistry.getMobInfo(entity.getClass()) != null){
             return translator.translateKey(MobInfoRegistry.getMobInfo(entity.getClass()).getNameTranslationKey());
         }
-        String dispatcherName = EntityDispatcher.getEntityString(entity);
+        String dispatcherName = EntityDispatcher.getEncodeId(entity);
         if (dispatcherName != null) return dispatcherName;
         return entity.getClass().getSimpleName();
     }
diff --git a/src/main/java/net/minecraft/core/entity/EntityDispatcher.java b/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
index a8044bf50..f50e6a645 100644
--- a/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
+++ b/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
@@ -3,23 +3,14 @@ package net.minecraft.core.entity;
 import net.minecraft.core.entity.animal.*;
 import net.minecraft.core.entity.monster.*;
 import net.minecraft.core.entity.projectile.*;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
 import java.util.HashMap;
 import java.util.Map;
 
-// Referenced classes of package net.minecraft.src:
-//            World, Entity, NBTTagCompound, EntityArrow, 
-//            EntitySnowball, EntityItem, EntityPainting, EntityLiving, 
-//            EntityMob, EntityCreeper, EntitySkeleton, EntitySpider, 
-//            EntityGiantZombie, EntityZombie, EntitySlime, EntityGhast, 
-//            EntityPigZombie, EntityPig, EntitySheep, EntityCow, 
-//            EntityChicken, EntitySquid, EntityWolf, EntityTNTPrimed, 
-//            EntityFallingSand, EntityMinecart, EntityBoat
-
 public class EntityDispatcher
 {
 
@@ -40,10 +31,10 @@ public class EntityDispatcher
         Entity entity = null;
         try
         {
-            Class<? extends Entity> entityClass = keyToClassMap.get(s);
-            if(entityClass != null)
+            Class<? extends Entity> clazz = keyToClassMap.get(s);
+            if(clazz != null)
             {
-                entity = entityClass.getConstructor(World.class).newInstance(world);
+                entity = clazz.getConstructor(World.class).newInstance(world);
             }
         }
         catch(Exception exception)
@@ -54,19 +45,15 @@ public class EntityDispatcher
         return entity;
     }
 
-    public static Entity createEntityFromNBT(CompoundTag nbttagcompound, World world)
+    public static Entity createEntityFromNBT(CompoundTag compoundTag, World world)
     {
         Entity entity = null;
         try
         {
-            Class class1 = (Class) keyToClassMap.get(nbttagcompound.getString("id"));
-            if(class1 != null)
+            Class<? extends Entity> clazz = keyToClassMap.get(compoundTag.getString("id"));
+            if(clazz != null)
             {
-                entity = (Entity)class1.getConstructor(new Class[] {
-                    World.class
-                }).newInstance(new Object[] {
-                    world
-                });
+                entity = clazz.getConstructor(new Class[] {World.class}).newInstance(world);
             }
         }
         catch(Exception exception)
@@ -75,27 +62,22 @@ public class EntityDispatcher
         }
         if(entity != null)
         {
-            entity.load(nbttagcompound);
+            entity.load(compoundTag);
         } else
         {
-            System.out.println((new StringBuilder()).append("Skipping Entity with id ").append(nbttagcompound.getString("id")).toString());
+            System.out.println("Skipping Entity with id " + compoundTag.getString("id"));
         }
         return entity;
     }
 
-    public static Entity createEntity(int i, World world)
+    public static Entity createEntity(int id, World world)
     {
         Entity entity = null;
         try
         {
-            Class class1 = (Class) idToClassMap.get(Integer.valueOf(i));
-            if(class1 != null)
-            {
-                entity = (Entity)class1.getConstructor(new Class[] {
-                    World.class
-                }).newInstance(new Object[] {
-                    world
-                });
+            Class<? extends Entity> clazz = idToClassMap.get(id);
+            if(clazz != null) {
+                entity = clazz.getConstructor(new Class[] {World.class}).newInstance(world);
             }
         }
         catch(Exception exception)
@@ -104,7 +86,7 @@ public class EntityDispatcher
         }
         if(entity == null)
         {
-            System.out.println((new StringBuilder()).append("Skipping Entity with id ").append(i).toString());
+            System.out.println("Skipping Entity with id " + id);
         }
         return entity;
     }
@@ -118,11 +100,24 @@ public class EntityDispatcher
         return classToIdMap.get(entityClass);
     }
 
-    public static String getEntityString(Entity entity)
+    public static String getEncodeId(Entity entity)
     {
         return classToKeyMap.get(entity.getClass());
     }
 
+    public static String getEncodeId(Class<? extends Entity> clazz)
+    {
+        return classToKeyMap.get(clazz);
+    }
+
+    public static Class<? extends Entity> getClassFromID(int id) {
+        return idToClassMap.get(id);
+    }
+
+    public static Class<? extends Entity> getClassFromEncodeID(String encodeID) {
+        return keyToClassMap.get(encodeID);
+    }
+
     public static final Map<String, Class<? extends Entity>> keyToClassMap = new HashMap<>();
     public static final Map<Class<? extends Entity>, String> classToKeyMap = new HashMap<>();
     private static final Map<Integer, Class<? extends Entity>> idToClassMap = new HashMap<>();
@@ -130,39 +125,39 @@ public class EntityDispatcher
 
     static 
     {
-        addMapping(EntityItem.class, "Item", 1);
-        addMapping(EntityLightningBolt.class, "Lightning", 8);
-        addMapping(EntityPainting.class, "Painting", 9);
-        addMapping(EntityArrow.class, "Arrow", 10);
-        addMapping(EntitySnowball.class, "Snowball", 11);
-        addMapping(EntityFireball.class, "Fireball", 12);
-        addMapping(EntityTNT.class, "PrimedTnt", 20);
-        addMapping(EntityFallingSand.class, "FallingSand", 21);
-        addMapping(EntityMinecart.class, "Minecart", 40);
-        addMapping(EntityBoat.class, "Boat", 41);
-        addMapping(EntityArmoredZombie.class, "ArmouredZombie", 42);
-        addMapping(EntityArrowGolden.class, "ArrowGolden", 43);
-        addMapping(EntityCannonball.class, "Cannonball", 44);
-        addMapping(EntityArrowPurple.class, "ArrowPurple", 45);
-        addMapping(EntityPebble.class, "Pebble", 46);
-        addMapping(EntityFireflyCluster.class, "FireflyCluster", 47);
-        addMapping(EntityLiving.class, "Mob", 48);
-        addMapping(EntityHuman.class, "Monster", 49);
-        addMapping(EntityCreeper.class, "Creeper", 50);
-        addMapping(EntitySkeleton.class, "Skeleton", 51);
-        addMapping(EntitySpider.class, "Spider", 52);
-        addMapping(EntityGiant.class, "Giant", 53);
-        addMapping(EntityZombie.class, "Zombie", 54);
-        addMapping(EntitySlime.class, "Slime", 55);
-        addMapping(EntityGhast.class, "Ghast", 56);
-        addMapping(EntityPigZombie.class, "PigZombie", 57);
-        addMapping(EntitySnowman.class, "Snowman", 58);
-        addMapping(EntityScorpion.class, "Scorpion", 59);
-        addMapping(EntityPig.class, "Pig", 90);
-        addMapping(EntitySheep.class, "Sheep", 91);
-        addMapping(EntityCow.class, "Cow", 92);
-        addMapping(EntityChicken.class, "Chicken", 93);
-        addMapping(EntitySquid.class, "Squid", 94);
-        addMapping(EntityWolf.class, "Wolf", 95);
+        addMapping(ItemEntity.class, "Item", 1);
+        addMapping(LightningEntity.class, "Lightning", 8);
+        addMapping(PaintingEntity.class, "Painting", 9);
+        addMapping(ArrowProjectile.class, "Arrow", 10);
+        addMapping(SnowballProjectile.class, "Snowball", 11);
+        addMapping(FireballProjectile.class, "Fireball", 12);
+        addMapping(TNTPrimedEntity.class, "PrimedTnt", 20);
+        addMapping(FallingBlockEntity.class, "FallingSand", 21);
+        addMapping(MinecartEntity.class, "Minecart", 40);
+        addMapping(BoatEntity.class, "Boat", 41);
+        addMapping(ZombieArmoredMob.class, "ArmouredZombie", 42);
+        addMapping(ArrowProjectileGolden.class, "ArrowGolden", 43);
+        addMapping(CannonballProjectile.class, "Cannonball", 44);
+        addMapping(ArrowProjectilePurple.class, "ArrowPurple", 45);
+        addMapping(PebbleProjectile.class, "Pebble", 46);
+        addMapping(FireflyClusterMob.class, "FireflyCluster", 47);
+        addMapping(Mob.class, "Mob", 48);
+        addMapping(HumanMob.class, "Monster", 49);
+        addMapping(CreeperMob.class, "Creeper", 50);
+        addMapping(SkeletonMob.class, "Skeleton", 51);
+        addMapping(SpiderMob.class, "Spider", 52);
+        addMapping(GiantMob.class, "Giant", 53);
+        addMapping(ZombieMob.class, "Zombie", 54);
+        addMapping(SlimeMob.class, "Slime", 55);
+        addMapping(GhastMob.class, "Ghast", 56);
+        addMapping(ZombiePigMob.class, "PigZombie", 57);
+        addMapping(SnowmanMob.class, "Snowman", 58);
+        addMapping(ScorpionMob.class, "Scorpion", 59);
+        addMapping(PigMob.class, "Pig", 90);
+        addMapping(SheepMob.class, "Sheep", 91);
+        addMapping(CowMob.class, "Cow", 92);
+        addMapping(ChickenMob.class, "Chicken", 93);
+        addMapping(SquidMob.class, "Squid", 94);
+        addMapping(WolfMob.class, "Wolf", 95);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityFallingSand.java b/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
similarity index 77%
rename from src/main/java/net/minecraft/core/entity/EntityFallingSand.java
rename to src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
index a139d371c..17b38abac 100644
--- a/src/main/java/net/minecraft/core/entity/EntityFallingSand.java
+++ b/src/main/java/net/minecraft/core/entity/FallingBlockEntity.java
@@ -2,42 +2,43 @@ package net.minecraft.core.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, MathHelper, World, BlockSand, 
+//            Entity, MathHelper, World, SandBlock,
 //            NBTTagCompound
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSand;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.SandBlock;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class EntityFallingSand extends Entity
+public class FallingBlockEntity extends Entity
 {
+    public int blockID;
+    public int fallTime;
+    public boolean hasRemovedBlock = false;
 
-    public EntityFallingSand(World world)
+    public FallingBlockEntity(World world)
     {
         super(world);
-        blockID = Block.sand.id;
+        blockID = Blocks.SAND.id;
         fallTime = 0;
     }
 
-    public EntityFallingSand(World world, double d, double d1, double d2, 
-            int i)
-    {
+    public FallingBlockEntity(World world, double x, double y, double z, int blockId) {
         super(world);
         fallTime = 0;
-        blockID = i;
+        blockID = blockId;
         blocksBuilding = true;
         setSize(0.98F, 0.98F);
         heightOffset = bbHeight / 2.0F;
-        setPos(d, d1, d2);
+        setPos(x, y, z);
         xd = 0.0D;
         yd = 0.0D;
         zd = 0.0D;
-        xo = d;
-        yo = d1;
-        zo = d2;
+        xo = x;
+        yo = y;
+        zo = z;
     }
 
     @Override
@@ -47,7 +48,7 @@ public class EntityFallingSand extends Entity
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
     }
 
@@ -74,9 +75,9 @@ public class EntityFallingSand extends Entity
         xd *= 0.98D;
         yd *= 0.98D;
         zd *= 0.98D;
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_double(y);
-        int k = MathHelper.floor_double(z);
+        int i = MathHelper.floor(x);
+        int j = MathHelper.floor(y);
+        int k = MathHelper.floor(z);
         if(world.getBlockId(i, j, k) == blockID)
         {
             world.setBlockWithNotify(i, j, k, 0);
@@ -88,7 +89,7 @@ public class EntityFallingSand extends Entity
             zd *= 0.7D;
             yd *= -0.5D;
             remove();
-            if((!world.canBlockBePlacedAt(blockID, i, j, k, true, Side.TOP) || BlockSand.canFallBelow(world, i, j - 1, k) || !world.setBlockWithNotify(i, j, k, blockID)) && !world.isClientSide)
+            if((!world.canBlockBePlacedAt(blockID, i, j, k, true, Side.TOP) || SandBlock.canFallBelow(world, i, j - 1, k) || !world.setBlockWithNotify(i, j, k, blockID)) && !world.isClientSide)
             {
             	if(hasRemovedBlock) {
             		spawnAtLocation(blockID, 1);
@@ -131,8 +132,4 @@ public class EntityFallingSand extends Entity
     public boolean showBoundingBoxOnHover() {
         return true;
     }
-
-    public int blockID;
-    public int fallTime;
-    public boolean hasRemovedBlock = false;
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityBobber.java b/src/main/java/net/minecraft/core/entity/FishingBobberEntity.java
similarity index 60%
rename from src/main/java/net/minecraft/core/entity/EntityBobber.java
rename to src/main/java/net/minecraft/core/entity/FishingBobberEntity.java
index 98a846379..34afa481a 100644
--- a/src/main/java/net/minecraft/core/entity/EntityBobber.java
+++ b/src/main/java/net/minecraft/core/entity/FishingBobberEntity.java
@@ -1,42 +1,42 @@
 package net.minecraft.core.entity;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.helper.DamageType;
 
 import java.util.List;
 
-public class EntityBobber extends Entity
+public class FishingBobberEntity extends Entity
 {
     private int xTile;
     private int yTile;
     private int zTile;
     private boolean inGround;
-    public EntityPlayer player;
+    public Player owner;
     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 int lerpSteps;
+    private double lerpX;
+    private double lerpY;
+    private double lerpZ;
+    private double lerpYRot;
+    private double lerpXRot;
     private double velocityX;
     private double velocityY;
     private double velocityZ;
 
-    public EntityBobber(World world)
+    public FishingBobberEntity(World world)
     {
         super(world);
         ticksInAir = 0;
@@ -46,24 +46,24 @@ public class EntityBobber extends Entity
         ignoreFrustumCheck = true;
     }
 
-    public EntityBobber(World world, double d, double d1, double d2)
+    public FishingBobberEntity(World world, double x, double y, double z)
     {
         this(world);
-        setPos(d, d1, d2);
+        setPos(x, y, z);
         ignoreFrustumCheck = true;
     }
 
-    public EntityBobber(World world, EntityPlayer entityplayer)
+    public FishingBobberEntity(World world, Player owner)
     {
         super(world);
         ticksInAir = 0;
         ticksCatchable = 0;
         hookedEntity = null;
         ignoreFrustumCheck = true;
-        player = entityplayer;
-        player.bobberEntity = this;
+        this.owner = owner;
+        this.owner.bobberEntity = this;
         setSize(0.25F, 0.25F);
-        moveTo(entityplayer.x, (entityplayer.y + 1.62D) - (double)entityplayer.heightOffset, entityplayer.z, entityplayer.yRot, entityplayer.xRot);
+        moveTo(owner.x, (owner.y + 1.62D) - (double)owner.heightOffset, owner.z, owner.yRot, owner.xRot);
         x -= MathHelper.cos((yRot / 180F) * MathHelper.PI) * 0.16F;
         y -= 0.1D;
         z -= MathHelper.sin((yRot / 180F) * MathHelper.PI) * 0.16F;
@@ -73,53 +73,51 @@ public class EntityBobber extends Entity
         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);
+        shoot(xd, yd, zd, 1.5F, 1.0F);
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
     }
 
     @Override
 	public boolean shouldRenderAtSqrDistance(double distance)
     {
-        double d1 = bb.getAverageEdgeLength() * 4D;
+        double d1 = bb.getSize() * 4D;
         d1 *= 64D;
         return distance < d1 * d1;
     }
 
-    public void func_4042_a(double d, double d1, double d2, float f, 
-            float f1)
-    {
-        float f2 = MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2);
-        d /= f2;
-        d1 /= f2;
-        d2 /= f2;
-        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;
-        xd = d;
-        yd = d1;
-        zd = d2;
-        float f3 = MathHelper.sqrt_double(d * d + d2 * d2);
-        yRotO = yRot = (float)((Math.atan2(d, d2) * 180D) / Math.PI);
-        xRotO = xRot = (float)((Math.atan2(d1, f3) * 180D) / Math.PI);
+    public void shoot(double x, double y, double z, float speed, float randomness) {
+        float f2 = MathHelper.sqrt(x * x + y * y + z * z);
+        x /= f2;
+        y /= f2;
+        z /= f2;
+        x += random.nextGaussian() * 0.0075D * (double)randomness;
+        y += random.nextGaussian() * 0.0075D * (double)randomness;
+        z += random.nextGaussian() * 0.0075D * (double)randomness;
+        x *= speed;
+        y *= speed;
+        z *= speed;
+        xd = x;
+        yd = y;
+        zd = z;
+        float hAng = MathHelper.sqrt(x * x + z * z);
+        yRotO = yRot = (float)((Math.atan2(x, z) * 180D) / Math.PI);
+        xRotO = xRot = (float)((Math.atan2(y, hAng) * 180D) / Math.PI);
     }
 
     @Override
 	public void lerpTo(double x, double y, double z, float yRot,
                        float xRot, int i)
     {
-        field_6387_m = x;
-        field_6386_n = y;
-        field_6385_o = z;
-        field_6384_p = yRot;
-        field_6383_q = xRot;
-        field_6388_l = i;
+        lerpX = x;
+        lerpY = y;
+        lerpZ = z;
+        lerpYRot = yRot;
+        lerpXRot = xRot;
+        lerpSteps = i;
         xd = velocityX;
         yd = velocityY;
         zd = velocityZ;
@@ -137,28 +135,28 @@ public class EntityBobber extends Entity
 	public void tick()
     {
         super.tick();
-        if(field_6388_l > 0)
+        if(lerpSteps > 0)
         {
-            double d = x + (field_6387_m - x) / (double)field_6388_l;
-            double d1 = y + (field_6386_n - y) / (double)field_6388_l;
-            double d2 = z + (field_6385_o - z) / (double)field_6388_l;
+            double d = x + (lerpX - x) / (double) lerpSteps;
+            double d1 = y + (lerpY - y) / (double) lerpSteps;
+            double d2 = z + (lerpZ - z) / (double) lerpSteps;
             double d4;
-            for(d4 = field_6384_p - (double) yRot; d4 < -180D; d4 += 360D) { }
+            for(d4 = lerpYRot - (double) yRot; d4 < -180D; d4 += 360D) { }
             for(; d4 >= 180D; d4 -= 360D) { }
-            yRot += d4 / (double)field_6388_l;
-            xRot += (field_6383_q - (double) xRot) / (double)field_6388_l;
-            field_6388_l--;
+            yRot += d4 / (double) lerpSteps;
+            xRot += (lerpXRot - (double) xRot) / (double) lerpSteps;
+            lerpSteps--;
             setPos(d, d1, d2);
             setRot(yRot, xRot);
             return;
         }
         if(!world.isClientSide)
         {
-            ItemStack heldPlayerItem = player.getCurrentEquippedItem();
-            if(player.removed || !player.isAlive() || heldPlayerItem == null || heldPlayerItem.getItem() != Item.toolFishingrod || distanceToSqr(player) > 1024D)
+            ItemStack heldPlayerItem = owner.getCurrentEquippedItem();
+            if(owner.removed || !owner.isAlive() || heldPlayerItem == null || heldPlayerItem.getItem() != Items.TOOL_FISHINGROD || distanceToSqr(owner) > 1024D)
             {
                 remove();
-                player.bobberEntity = null;
+                owner.bobberEntity = null;
                 return;
             }
             if(hookedEntity != null)
@@ -176,7 +174,7 @@ public class EntityBobber extends Entity
             }
         }
         if (inGround) {
-            if (world.getBlockId(xTile, yTile, zTile) == Block.rope.id) {
+            if (world.getBlockId(xTile, yTile, zTile) == Blocks.ROPE.id) {
                 x = xTile + 0.5D;
                 y = yTile + 0.5D;
                 z = zTile + 0.5D;
@@ -191,32 +189,32 @@ public class EntityBobber extends Entity
             }
         }
         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)
+        Vec3 currentPos = Vec3.getTempVec3(x, y, z);
+        Vec3 nextPos = Vec3.getTempVec3(x + xd, y + yd, z + zd);
+        HitResult clip = world.checkBlockCollisionBetweenPoints(currentPos, nextPos);
+        currentPos = Vec3.getTempVec3(x, y, z);
+        nextPos = Vec3.getTempVec3(x + xd, y + yd, z + zd);
+        if(clip != null)
         {
-            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) {
+            nextPos = Vec3.getTempVec3(clip.location.x, clip.location.y, clip.location.z);
+            if (clip.hitType == HitResult.HitType.TILE && world.getBlockId(clip.x, clip.y, clip.z) == Blocks.ROPE.id) {
                 inGround = true;
-                xTile = hitResult.x;
-                yTile = hitResult.y;
-                zTile = hitResult.z;
+                xTile = clip.x;
+                yTile = clip.y;
+                zTile = clip.z;
             }
         }
         Entity entity = null;
-        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.addCoord(xd, yd, zd).expand(1.0D, 1.0D, 1.0D));
+        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(xd, yd, zd).grow(1.0D, 1.0D, 1.0D));
         double d3 = 0.0D;
         for (Entity e : list)
         {
-            if (!e.isPickable() || e == player && ticksInAir < 5) {
+            if (!e.isPickable() || e == owner && ticksInAir < 5) {
                 continue;
             }
             float f2 = 0.3F;
-            AABB aabb = e.bb.expand(f2, f2, f2);
-            HitResult newHitResult = aabb.func_1169_a(currentPos, nextPos);
+            AABB aabb = e.bb.grow(f2, f2, f2);
+            HitResult newHitResult = aabb.clip(currentPos, nextPos);
             if (newHitResult == null) {
                 continue;
             }
@@ -229,20 +227,20 @@ public class EntityBobber extends Entity
 
         if(entity != null)
         {
-            hitResult = new HitResult(entity);
+            clip = new HitResult(entity);
         }
-        if(hitResult != null)
+        if(clip != null)
         {
-            if(hitResult.entity != null)
+            if(clip.entity != null)
             {
-                if(hitResult.entity.hurt(player, 0, DamageType.COMBAT))
+                if(clip.entity.hurt(owner, 0, DamageType.COMBAT))
                 {
-                    hookedEntity = hitResult.entity;
+                    hookedEntity = clip.entity;
                 }
             }
         }
         move(xd, yd, zd);
-        float f = MathHelper.sqrt_double(xd * xd + zd * zd);
+        float f = MathHelper.sqrt(xd * xd + zd * zd);
         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) { }
@@ -262,7 +260,7 @@ public class EntityBobber extends Entity
         {
             double d8 = ((bb.minY + ((bb.maxY - bb.minY) * (double)(l)) / (double)k) - 0.125D) + 0.125D;
             double d9 = ((bb.minY + ((bb.maxY - bb.minY) * (double)(l + 1)) / (double)k) - 0.125D) + 0.125D;
-            AABB axisalignedbb1 = AABB.getBoundingBoxFromPool(bb.minX, d8, bb.minZ, bb.maxX, d9, bb.maxZ);
+            AABB axisalignedbb1 = AABB.getTemporaryBB(bb.minX, d8, bb.minZ, bb.maxX, d9, bb.maxZ);
 
             if(world.isAABBInMaterial(axisalignedbb1, Material.water))
             {
@@ -280,12 +278,12 @@ public class EntityBobber extends Entity
                 int catchRate = 500;
                 int rainRate = 0;
                 int algaeRate = 0;
-                if(world.canBlockBeRainedOn(MathHelper.floor_double(x), MathHelper.floor_double(y) + 1, MathHelper.floor_double(z)))
+                if(world.canBlockBeRainedOn(MathHelper.floor(x), MathHelper.floor(y) + 1, MathHelper.floor(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(x), MathHelper.floor(y) + 1, MathHelper.floor(z)) == Blocks.ALGAE.id) {
                     algaeRate = 100;
                 }
                 catchRate = (catchRate - rainRate) - algaeRate;
@@ -295,7 +293,7 @@ public class EntityBobber extends Entity
                     ticksCatchable = random.nextInt(30) + 10;
                     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);
+                    float f3 = MathHelper.floor(bb.minY);
                     for(int i1 = 0; (float)i1 < 1.0F + bbWidth * 20F; i1++)
                     {
                         double xOff = (random.nextFloat() * 2.0F - 1.0F) * bbWidth;
@@ -331,13 +329,19 @@ public class EntityBobber extends Entity
     }
 
     @Override
-	public void addAdditionalSaveData(CompoundTag tag)
-    {
+	public void addAdditionalSaveData(CompoundTag compoundTag) {
+        compoundTag.putShort("xTile", (short)this.xTile);
+        compoundTag.putShort("yTile", (short)this.yTile);
+        compoundTag.putShort("zTile", (short)this.zTile);
+        compoundTag.putByte("inGround", (byte)(this.inGround ? 1 : 0));
     }
 
     @Override
-	public void readAdditionalSaveData(CompoundTag tag)
-    {
+	public void readAdditionalSaveData(CompoundTag compoundTag) {
+        this.xTile = compoundTag.getShort("xTile");
+        this.yTile = compoundTag.getShort("yTile");
+        this.zTile = compoundTag.getShort("zTile");
+        this.inGround = (compoundTag.getByte("inGround") == 1);
     }
 
     @Override
@@ -352,10 +356,10 @@ public class EntityBobber extends Entity
 
         if(inGround)
         {
-            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);
+            double dx = x - owner.x;
+            double dy = y - owner.y;
+            double dz = z - owner.z;
+            double distance = MathHelper.sqrt(dx * dx + dy * dy + dz * dz);
             dx /= distance;
             dy /= distance;
             dz /= distance;
@@ -364,36 +368,36 @@ public class EntityBobber extends Entity
             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;
+            owner.xd += dx * scale;
+            owner.yd += dy * scale;
+            owner.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 dx = owner.x - x;
+            double dy = owner.y - y;
+            double dz = owner.z - z;
+            double distance = MathHelper.sqrt(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.yd += dy * scale + (double) MathHelper.sqrt(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 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);
+            ItemEntity entityitem = new ItemEntity(world, x, y, z, new ItemStack(Items.FOOD_FISH_RAW));
+            double dx = owner.x - x;
+            double dy = owner.y - y;
+            double dz = owner.z - z;
+            double distance = MathHelper.sqrt(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.yd = dy * scale + (double) MathHelper.sqrt(distance) * 0.08D;
             entityitem.zd = dz * scale;
             world.entityJoinedWorld(entityitem);
-            player.addStat(StatList.fishCaughtStat, 1);
+            owner.addStat(StatList.fishCaughtStat, 1);
             damage = 1;
         }
         if(inGround)
@@ -401,7 +405,7 @@ public class EntityBobber extends Entity
             damage = 2;
         }
         remove();
-        player.bobberEntity = null;
+        owner.bobberEntity = null;
         return damage;
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityFlying.java b/src/main/java/net/minecraft/core/entity/FlyingMob.java
similarity index 68%
rename from src/main/java/net/minecraft/core/entity/EntityFlying.java
rename to src/main/java/net/minecraft/core/entity/FlyingMob.java
index 809ffc691..908d7bf25 100644
--- a/src/main/java/net/minecraft/core/entity/EntityFlying.java
+++ b/src/main/java/net/minecraft/core/entity/FlyingMob.java
@@ -2,23 +2,23 @@ package net.minecraft.core.entity;
 
 
 // Referenced classes of package net.minecraft.src:
-//            EntityLiving, MathHelper, AxisAlignedBB, World, 
+//            Mob, MathHelper, AxisAlignedBB, World,
 //            Block
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 
-public class EntityFlying extends EntityLiving
+public class FlyingMob extends Mob
 {
 
-    public EntityFlying(World world)
+    public FlyingMob(World world)
     {
         super(world);
     }
 
     @Override
-	protected void causeFallDamage(float f)
+	protected void causeFallDamage(float distance)
     {
     }
 
@@ -46,10 +46,10 @@ public class EntityFlying extends EntityLiving
             if(onGround)
             {
                 f2 = 0.5460001F;
-                int i = world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(bb.minY) - 1, MathHelper.floor_double(z));
+                int i = world.getBlockId(MathHelper.floor(x), MathHelper.floor(bb.minY) - 1, MathHelper.floor(z));
                 if(i > 0)
                 {
-                    f2 = Block.blocksList[i].movementScale * 0.91F;
+                    f2 = Block.blocksList[i].friction * 0.91F;
                 }
             }
             float f3 = 0.1627714F / (f2 * f2 * f2);
@@ -58,10 +58,10 @@ public class EntityFlying extends EntityLiving
             if(onGround)
             {
                 f2 = 0.5460001F;
-                int j = world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(bb.minY) - 1, MathHelper.floor_double(z));
+                int j = world.getBlockId(MathHelper.floor(x), MathHelper.floor(bb.minY) - 1, MathHelper.floor(z));
                 if(j > 0)
                 {
-                    f2 = Block.blocksList[j].movementScale * 0.91F;
+                    f2 = Block.blocksList[j].friction * 0.91F;
                 }
             }
             move(xd, yd, zd);
@@ -69,16 +69,16 @@ public class EntityFlying extends EntityLiving
             yd *= f2;
             zd *= f2;
         }
-        prevLimbYaw = limbYaw;
+        walkAnimSpeedO = walkAnimSpeed;
         double d = x - xo;
         double d1 = z - zo;
-        float f4 = MathHelper.sqrt_double(d * d + d1 * d1) * 4F;
+        float f4 = MathHelper.sqrt(d * d + d1 * d1) * 4F;
         if(f4 > 1.0F)
         {
             f4 = 1.0F;
         }
-        limbYaw += (f4 - limbYaw) * 0.4F;
-        limbSwing += limbYaw;
+        walkAnimSpeed += (f4 - walkAnimSpeed) * 0.4F;
+        walkAnimPos += walkAnimSpeed;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/entity/EntityItem.java b/src/main/java/net/minecraft/core/entity/ItemEntity.java
similarity index 56%
rename from src/main/java/net/minecraft/core/entity/EntityItem.java
rename to src/main/java/net/minecraft/core/entity/ItemEntity.java
index 70bb17571..a4394a968 100644
--- a/src/main/java/net/minecraft/core/entity/EntityItem.java
+++ b/src/main/java/net/minecraft/core/entity/ItemEntity.java
@@ -7,39 +7,49 @@ import com.mojang.nbt.CompoundTag;
 // Referenced classes of package net.minecraft.src:
 //            Entity, MathHelper, World, Material, 
 //            AxisAlignedBB, Block, NBTTagCompound, ItemStack, 
-//            EntityPlayer, InventoryPlayer, AchievementList, Item
+//            Player, InventoryPlayer, Achievements, Item
 
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLog;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.LogBlock;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
-public class EntityItem extends Entity
+public class ItemEntity extends Entity
 {
+    private static final int LIFETIME = 6000;
+    public ItemStack item;
+    public int age;
+    public int pickupDelay;
+    private int health;
+    public float bobOffset;
+    public int basketPickupDelay = 0;
+    public static boolean enableItemClumping = true;
 
-    public EntityItem(World world, double x, double y, double z, ItemStack itemstack) {
+    public ItemEntity(World world, double x, double y, double z, ItemStack itemstack) {
         super(world);
         age = 0;
         health = 5;
-        initialRotation = (float)(java.lang.Math.random() * Math.PI * 2D);
+        bobOffset = (float)(Math.random() * Math.PI * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
         setPos(x, y, z);
         item = itemstack;
-        yRot = (float)(java.lang.Math.random() * 360D);
-        xd = (float)(java.lang.Math.random() * 0.20000000298023224D - 0.10000000149011612D);
-        yd = 0.20000000298023224D;
-        zd = (float)(java.lang.Math.random() * 0.20000000298023224D - 0.10000000149011612D);
+        yRot = (float)(Math.random() * 360D);
+        xd = (float)(Math.random() * 0.2D - 0.1D);
+        yd = 0.2D;
+        zd = (float)(Math.random() * 0.2D - 0.1D);
         if(itemstack == null) {
-        	System.err.println("Created EntityItem with no item!");
+        	System.err.println("Created ItemEntity with no item!");
         	Thread.dumpStack();
         }
     }
@@ -50,18 +60,18 @@ public class EntityItem extends Entity
         return false;
     }
 
-    public EntityItem(World world)
+    public ItemEntity(World world)
     {
         super(world);
         age = 0;
         health = 5;
-        initialRotation = (float)(java.lang.Math.random() * 3.1415926535897931D * 2D);
+        bobOffset = (float)(Math.random() * Math.PI * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
     }
 
@@ -70,7 +80,7 @@ public class EntityItem extends Entity
     {
         super.tick();
         if(item == null) {
-            System.err.println("Removing EntityItem with no item!");
+            System.err.println("Removing ItemEntity with no item!");
             Thread.dumpStack();
             remove();
             return;
@@ -81,17 +91,17 @@ public class EntityItem extends Entity
         }
         
         
-        if(delayBeforeCanPickup > 0)
+        if(pickupDelay > 0)
         {
-            delayBeforeCanPickup--;
+            pickupDelay--;
         }
         xo = x;
         yo = y;
         zo = z;
-        yd -= 0.039999999105930328D;
-        if(world.getBlockMaterial(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) == Material.lava)
+        yd -= 0.04D;
+        if(world.getBlockMaterial(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) == Material.lava)
         {
-            yd = 0.20000000298023224D;
+            yd = 0.2D;
             xd = (random.nextFloat() - random.nextFloat()) * 0.2F;
             zd = (random.nextFloat() - random.nextFloat()) * 0.2F;
             world.playSoundAtEntity(null, this, "random.fizz", 0.4F, 2.0F + random.nextFloat() * 0.4F);
@@ -102,25 +112,25 @@ public class EntityItem extends Entity
         
         if(!world.isClientSide) {
         	if(enableItemClumping) {
-                if(MathHelper.floor_double(x) != MathHelper.floor_double(xo) || MathHelper.floor_double(y) != MathHelper.floor_double(yo) || MathHelper.floor_double(z) != MathHelper.floor_double(zo) || age % 25 == 0) {
+                if(MathHelper.floor(x) != MathHelper.floor(xo) || MathHelper.floor(y) != MathHelper.floor(yo) || MathHelper.floor(z) != MathHelper.floor(zo) || age % 25 == 0) {
                 	clumpToNearbyStack();
                 }		
         	}
         }
         
-        float f = 0.98F;
+        float friction = 0.98F;
         if(onGround)
         {
-            f = 0.5880001F;
-            int i = world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(bb.minY) - 1, MathHelper.floor_double(z));
-            if(i > 0)
+            friction = 0.588F;
+            int blockId = world.getBlockId(MathHelper.floor(x), MathHelper.floor(bb.minY) - 1, MathHelper.floor(z));
+            if(blockId > 0)
             {
-                f = Block.blocksList[i].movementScale * 0.98F;
+                friction = Block.blocksList[blockId].friction * 0.98F;
             }
         }
-        xd *= f;
-        yd *= 0.98000001907348633D;
-        zd *= f;
+        xd *= friction;
+        yd *= 0.98D;
+        zd *= friction;
 
         if (wasInWater)
         {
@@ -135,9 +145,8 @@ public class EntityItem extends Entity
         {
             yd *= -0.5D;
         }
-        field_803_e++;
         age++;
-        if(age >= 6000)
+        if(age >= LIFETIME)
         {
             remove();
         }
@@ -188,38 +197,41 @@ public class EntityItem extends Entity
     }
 
 	@Override
-	public void playerTouch(EntityPlayer player) {
+	public void playerTouch(Player player) {
 		if(world.isClientSide) {
 			return;
 		}
-		if(delayBeforeCanPickup == 0) {
+		if(pickupDelay == 0) {
 			int previousStackSize = item.stackSize;
 			player.inventory.insertItem(item, true);
 
 			if(item.stackSize < previousStackSize) {
 				if(item.itemID < 16384) {
-					if(Block.blocksList[item.itemID] instanceof BlockLog) {
-						player.triggerAchievement(AchievementList.MINE_WOOD);
+					if(Block.blocksList[item.itemID] instanceof LogBlock) {
+						player.triggerAchievement(Achievements.MINE_WOOD);
 					}
 				}
-				if(item.itemID == Item.leather.id) {
-					player.triggerAchievement(AchievementList.KILL_COW);
+				if(item.itemID == Items.LEATHER.id) {
+					player.triggerAchievement(Achievements.KILL_COW);
 				}
-				if(item.itemID == Block.ice.id) {
-					player.triggerAchievement(AchievementList.CRUSH_BLOCKS);
+				if(item.itemID == Blocks.ICE.id) {
+					player.triggerAchievement(Achievements.CRUSH_BLOCKS);
 				}
 				
 				if(item.stackSize <= 0) {
 					world.playSoundAtEntity(player, this, "random.pop", 0.2F, ((random.nextFloat() - random.nextFloat()) * 0.7F + 1.0F) * 2.0F);
-					player.onItemPickup(this, item.itemID);	
+					player.onItemPickup(this, item);
 				}
 
-				if(item.itemID == Item.lanternFireflyGreen.id
-						|| item.itemID == Item.lanternFireflyBlue.id
-						|| item.itemID == Item.lanternFireflyOrange.id
-						|| item.itemID == Item.lanternFireflyRed.id) {
-					if(player.getStat(StatList.pickUpItemStats[Item.lanternFireflyRed.id]) > 0 && player.getStat(StatList.pickUpItemStats[Item.lanternFireflyGreen.id]) > 0 && player.getStat(StatList.pickUpItemStats[Item.lanternFireflyBlue.id]) > 0 && player.getStat(StatList.pickUpItemStats[Item.lanternFireflyOrange.id]) > 0) {
-						player.triggerAchievement(AchievementList.CAUGHT_EM_ALL);
+				if(item.itemID == Items.LANTERN_FIREFLY_GREEN.id
+						|| item.itemID == Items.LANTERN_FIREFLY_BLUE.id
+						|| item.itemID == Items.LANTERN_FIREFLY_ORANGE.id
+						|| item.itemID == Items.LANTERN_FIREFLY_RED.id) {
+					if( player.getStat(Items.LANTERN_FIREFLY_RED.getStat(StatList.STAT_PICKED_UP)) > 0 &&
+                            player.getStat(Items.LANTERN_FIREFLY_GREEN.getStat(StatList.STAT_PICKED_UP)) > 0 &&
+                            player.getStat(Items.LANTERN_FIREFLY_BLUE.getStat(StatList.STAT_PICKED_UP)) > 0 &&
+                            player.getStat(Items.LANTERN_FIREFLY_ORANGE.getStat(StatList.STAT_PICKED_UP)) > 0) {
+						player.triggerAchievement(Achievements.CAUGHT_EM_ALL);
 					}
 				}
 
@@ -231,14 +243,14 @@ public class EntityItem extends Entity
 	}
 
     public void clumpToNearbyStack() {
-    	AABB boundingBox = this.bb.expand(0.5, 0.0, 0.5);
-    	List<Entity> entities = world.getEntitiesWithinAABB(EntityItem.class, boundingBox);
+    	AABB boundingBox = this.bb.grow(0.5, 0.0, 0.5);
+    	List<Entity> entities = world.getEntitiesWithinAABB(ItemEntity.class, boundingBox);
     	
     	for(Entity otherEntity : entities) {
-    		if(otherEntity == this || !(otherEntity instanceof EntityItem) || !otherEntity.isAlive() || !this.isAlive()) {
+    		if(otherEntity == this || !(otherEntity instanceof ItemEntity) || !otherEntity.isAlive() || !this.isAlive()) {
     			continue;
     		}
-    		EntityItem otherItemEntity = (EntityItem) otherEntity;
+    		ItemEntity otherItemEntity = (ItemEntity) otherEntity;
     		
     		ItemStack thisItemStack = this.item;
     		ItemStack otherItemStack = otherItemEntity.item;
@@ -257,20 +269,11 @@ public class EntityItem extends Entity
     	}
     }
     
-    private static void combineItems(EntityItem entityItem1, EntityItem entityItem2) {
-    	entityItem1.item.stackSize += entityItem2.item.stackSize;
-    	entityItem2.item.stackSize = 0;
-    	entityItem1.age = Math.min(entityItem1.age, entityItem2.age);
-    	entityItem1.delayBeforeCanPickup = Math.max(entityItem1.delayBeforeCanPickup, entityItem2.delayBeforeCanPickup);
-    	entityItem2.remove();
+    private static void combineItems(ItemEntity itemEntity1, ItemEntity itemEntity2) {
+    	itemEntity1.item.stackSize += itemEntity2.item.stackSize;
+    	itemEntity2.item.stackSize = 0;
+    	itemEntity1.age = Math.min(itemEntity1.age, itemEntity2.age);
+    	itemEntity1.pickupDelay = Math.max(itemEntity1.pickupDelay, itemEntity2.pickupDelay);
+    	itemEntity2.remove();
     }
-
-    public ItemStack item;
-    private int field_803_e;
-    public int age;
-    public int delayBeforeCanPickup;
-    private int health;
-    public float initialRotation;
-    public int basketPickupDelay = 0;
-    public static boolean enableItemClumping = true;
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityLightningBolt.java b/src/main/java/net/minecraft/core/entity/LightningEntity.java
similarity index 56%
rename from src/main/java/net/minecraft/core/entity/EntityLightningBolt.java
rename to src/main/java/net/minecraft/core/entity/LightningEntity.java
index a5024280d..11df05144 100644
--- a/src/main/java/net/minecraft/core/entity/EntityLightningBolt.java
+++ b/src/main/java/net/minecraft/core/entity/LightningEntity.java
@@ -1,30 +1,30 @@
 package net.minecraft.core.entity;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
 //            EntityWeatherEffect, World, MathHelper, Block, 
-//            BlockFire, AxisAlignedBB, Entity, NBTTagCompound, 
+//            FireBlock, AxisAlignedBB, Entity, NBTTagCompound,
 //            Vec3D
 
-public class EntityLightningBolt extends Entity
+public class LightningEntity extends Entity
 {
     private int life;
     public long seed;
     private int flashes;
-    public EntityLightningBolt(World world){
+    public LightningEntity(World world){
         this(world,0, 0, 0);
     }
 
-    public EntityLightningBolt(World world, double x, double y, double z)
+    public LightningEntity(World world, double x, double y, double z)
     {
         super(world);
         seed = 0L;
@@ -55,14 +55,14 @@ public class EntityLightningBolt extends Entity
                 flashes--;
                 life = 1;
                 seed = random.nextLong();
-                if(world.areBlocksLoaded(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), 10))
+                if(world.areBlocksLoaded(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z), 10))
                 {
-                    int i = MathHelper.floor_double(x);
-                    int j = MathHelper.floor_double(y);
-                    int k = MathHelper.floor_double(z);
-                    if(world.getBlockId(i, j, k) == 0 && Block.fire.canPlaceBlockAt(world, i, j, k))
+                    int i = MathHelper.floor(x);
+                    int j = MathHelper.floor(y);
+                    int k = MathHelper.floor(z);
+                    if(world.getBlockId(i, j, k) == 0 && Blocks.FIRE.canPlaceBlockAt(world, i, j, k))
                     {
-                        world.setBlockWithNotify(i, j, k, Block.fire.id);
+                        world.setBlockWithNotify(i, j, k, Blocks.FIRE.id);
                     }
                 }
             }
@@ -70,7 +70,7 @@ public class EntityLightningBolt extends Entity
         if(life >= 0)
         {
             double radius = 3D;
-            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, AABB.getBoundingBoxFromPool(x - radius, y - radius, z - radius, x + radius, y + 6D + radius, z + radius));
+            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, AABB.getTemporaryBB(x - radius, y - radius, z - radius, x + radius, y + 6D + radius, z + radius));
             for (Entity entity : list)
             {
                 entity.thunderHit(this);
@@ -80,30 +80,30 @@ public class EntityLightningBolt extends Entity
         }
     }
     @Override
-    protected void init(){
+    protected void defineSynchedData(){
 
     }
 
     @Override
     public void spawnInit()
     {
-        if(world.difficultySetting >= 2 && world.areBlocksLoaded(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z), 10))
+        if(world.difficultySetting >= 2 && world.areBlocksLoaded(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z), 10))
         {
-            int i = MathHelper.floor_double(x);
-            int k = MathHelper.floor_double(y);
-            int i1 = MathHelper.floor_double(z);
-            if(world.getBlockId(i, k, i1) == 0 && Block.fire.canPlaceBlockAt(world, i, k, i1))
+            int i = MathHelper.floor(x);
+            int k = MathHelper.floor(y);
+            int i1 = MathHelper.floor(z);
+            if(world.getBlockId(i, k, i1) == 0 && Blocks.FIRE.canPlaceBlockAt(world, i, k, i1))
             {
-                world.setBlockWithNotify(i, k, i1, Block.fire.id);
+                world.setBlockWithNotify(i, k, i1, Blocks.FIRE.id);
             }
             for(int j = 0; j < 4; j++)
             {
-                int l = (MathHelper.floor_double(x) + random.nextInt(3)) - 1;
-                int j1 = (MathHelper.floor_double(y) + random.nextInt(3)) - 1;
-                int k1 = (MathHelper.floor_double(z) + random.nextInt(3)) - 1;
-                if(world.getBlockId(l, j1, k1) == 0 && Block.fire.canPlaceBlockAt(world, l, j1, k1))
+                int l = (MathHelper.floor(x) + random.nextInt(3)) - 1;
+                int j1 = (MathHelper.floor(y) + random.nextInt(3)) - 1;
+                int k1 = (MathHelper.floor(z) + random.nextInt(3)) - 1;
+                if(world.getBlockId(l, j1, k1) == 0 && Blocks.FIRE.canPlaceBlockAt(world, l, j1, k1))
                 {
-                    world.setBlockWithNotify(l, j1, k1, Block.fire.id);
+                    world.setBlockWithNotify(l, j1, k1, Blocks.FIRE.id);
                 }
             }
         }
@@ -120,7 +120,7 @@ public class EntityLightningBolt extends Entity
     }
 
     @Override
-	public boolean shouldRender(Vec3d vec3d)
+	public boolean shouldRender(Vec3 vec3)
     {
         return life >= 0;
     }
diff --git a/src/main/java/net/minecraft/core/entity/EntityLiving.java b/src/main/java/net/minecraft/core/entity/Mob.java
similarity index 83%
rename from src/main/java/net/minecraft/core/entity/EntityLiving.java
rename to src/main/java/net/minecraft/core/entity/Mob.java
index 341074db2..137609321 100644
--- a/src/main/java/net/minecraft/core/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/core/entity/Mob.java
@@ -3,17 +3,18 @@ package net.minecraft.core.entity;
 import com.b100.utils.StringUtils;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.Global;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.gamerule.GameRules;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 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.Items;
+import net.minecraft.core.item.FoodItem;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.collection.NamespaceID;
@@ -22,7 +23,7 @@ import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
@@ -35,30 +36,100 @@ import java.util.Map;
 //            MathHelper, Block, StepSound, AxisAlignedBB,
 //            NBTTagCompound, ItemStack, MovingObjectPosition
 
-public abstract class EntityLiving extends Entity
+public abstract class Mob extends Entity
 {
+    public static final int DATA_VARIANT = 1;
+    public static final int DATA_HEALTH = 2;
+    protected Map<FoodItem, ConsumedFood> consumedFood = new HashMap<FoodItem, ConsumedFood>();
+    public int heartsHalvesLife;
+//    public float timeOffs;
+//    public float rotA;
+    public float yBodyRot;
+    public float yBodyRotO;
+    protected float ridingRotUnused;
+    protected float prevRidingRotUnused;
+    protected float unusedRotation1;
+    protected float prevRotationUnused;
+//    protected boolean hasHair;
+//    protected boolean allowAlpha;
+//    protected float rotOffs;
+    protected String entityType;
+//    protected float bobStrength;
+    protected int scoreValue;
+    //    protected float renderOffset;
+    public boolean isMultiplayerEntity;
+    public float prevSwingProgress;
+    public float swingProgress;
+    public int prevHealth;
+    public int bonusHealth;
+    public int prevBonusHealth;
+    private int livingSoundTime;
+    public int hurtTime;
+    public int maxHurtTime;
+    public float attackedAtYaw;
+    public int deathTime;
+    public int attackTime;
+    public float prevCameraPitch;
+    public float cameraPitch;
+    protected boolean dead;
+    //    public int modelNum;
+//    public float animSpeed;
+    public float walkAnimSpeedO;
+    public float walkAnimSpeed;
+    public float walkAnimPos;
+    protected int newPosRotationIncrements;
+    protected double newPosX;
+    protected double newPosY;
+    protected double newPosZ;
+    protected double newRotationYaw;
+    protected double newRotationPitch;
+//    float fallTime;
+    protected int lastDamage;
+    protected int entityAge;
+    protected float moveStrafing;
+    protected float moveForward;
+    protected float randomYawVelocity;
+    protected boolean isJumping;
+    protected float defaultPitch;
+    protected float moveSpeed;
+    protected float noclipSpeed = 0.5f;
+    protected float flightSmoothness = 0.5f;
+    private Entity currentTarget;
+    protected int numTicksToChaseTarget;
+    public String nickname = "";
+    public byte chatColor = 0;
+    protected NamespaceID textureIdentifier = new NamespaceID("minecraft", "char");
+    protected float lastStrafe = 0.0f;
+
+    public boolean isSkating = false;
 
-    public EntityLiving(World world)
+    public Direction rotationLock = null;
+    public Direction rotationLockHorizontal = null;
+    public Direction rotationLockVertical = null;
+    public PlacementMode placementModeOverride = PlacementMode.FACING;
+    public List<WeightedRandomLootObject> mobDrops = new ArrayList<>();
+
+    public Mob(World world)
     {
         super(world);
         heartsHalvesLife = 20;
-        renderYawOffset = 0.0F;
-        prevRenderYawOffset = 0.0F;
-        unusedBool1 = true;
-        unusedBool2 = true;
-        unusedRotation2 = 0.0F;
+        yBodyRot = 0.0F;
+        yBodyRotO = 0.0F;
+//        hasHair = true;
+//        allowAlpha = true;
+//        rotOffs = 0.0F;
         entityType = null;
-        unusedFloat1 = 1.0F;
+//        bobStrength = 1.0F;
         scoreValue = 0;
-        unusedFloat2 = 0.0F;
+//        renderOffset = 0.0F;
         isMultiplayerEntity = false;
         attackedAtYaw = 0.0F;
         deathTime = 0;
         attackTime = 0;
         dead = false;
-        unusedInt = -1;
-        unusedFloat4 = (float)(java.lang.Math.random() * 0.9D + 0.1D);
-        unusedFloat3 = 0.0F;
+//        modelNum = -1;
+//        animSpeed = (float)(Math.random() * 0.9D + 0.1D);
+//        fallTime = 0.0F;
         lastDamage = 0;
         entityAge = 0;
         isJumping = false;
@@ -66,44 +137,50 @@ public abstract class EntityLiving extends Entity
         moveSpeed = 0.7F;
         numTicksToChaseTarget = 0;
         blocksBuilding = true;
-        unusedRotationPitch = (float)(java.lang.Math.random() + 1.0D) * 0.01F;
+//        rotA = (float)(Math.random() + 1.0D) * 0.01F;
         setPos(x, y, z);
-        unusedRotationPitch2 = (float) java.lang.Math.random() * 12398F;
-        yRot = (float)(java.lang.Math.random() * 3.1415927410125732D * 2D);
+//        timeOffs = (float) Math.random() * 12398F;
+        yRot = (float)(Math.random() * Math.PI * 2D);
         footSize = 0.5F;
-        int variant = random.nextInt(Byte.MAX_VALUE);
-        entityData.define(1, Byte.valueOf((byte)variant));
+
+        int variant = random.nextInt(0xFF);
+        entityData.define(DATA_VARIANT, (byte) variant);
+        entityData.define(DATA_HEALTH, getMaxHealth());
         setSkinVariant(variant);
+
         speed = 0.1f;
         flySpeed = 0.02f;
-        entityData.define(2, getMaxHealth());
         this.mobDrops = new ArrayList<>();
     }
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        if (this.mobDrops == null) {
-            this.mobDrops = new ArrayList<>();
-        }
     }
 
     public boolean canEntityBeSeen(Entity entity)
     {
-        return world.checkBlockCollisionBetweenPoints(Vec3d.createVector(x, y + (double) getHeadHeight(), z), Vec3d.createVector(entity.x, entity.y + (double)entity.getHeadHeight(), entity.z)) == null;
+        return world.checkBlockCollisionBetweenPoints(Vec3.getTempVec3(x, y + (double) getHeadHeight(), z), Vec3.getTempVec3(entity.x, entity.y + (double)entity.getHeadHeight(), entity.z)) == null;
     }
 
     @Override
 	public String getEntityTexture() {
-        return String.format("/assets/%s/textures/entity/%s/%d.png", textureIdentifier.namespace, textureIdentifier.value, getSkinVariant());
+        SkinVariantList variantList = Global.accessor.getSkinVariantList();
+        String basePath = String.format("/assets/%s/textures/entity/%s/", textureIdentifier.namespace, textureIdentifier.value);
+        return basePath + getTextureReference() + ".png";
+    }
+
+    public String getTextureReference() {
+        SkinVariantList variantList = Global.accessor.getSkinVariantList();
+        String basePath = String.format("/assets/%s/textures/entity/%s/", textureIdentifier.namespace, textureIdentifier.value);
+        return variantList.getSkinReference(basePath + "variants.json", "0", getSkinVariant());
     }
 
     public int getSkinVariant() {
-        int skinVariantCount = Global.accessor.getSkinVariantList().getNumSkinsForEntity(getClass());
-        return entityData.getByte(1) % skinVariantCount;
+        return Byte.toUnsignedInt(entityData.getByte(DATA_VARIANT));
     }
 
     public void setSkinVariant(int skinVariant) {
-        entityData.set(1, (byte)(MathHelper.clamp(skinVariant, 0, Byte.MAX_VALUE)));
+        entityData.set(DATA_VARIANT, (byte) (skinVariant));
     }
 
     public String getDefaultEntityTexture() {
@@ -128,7 +205,7 @@ public abstract class EntityLiving extends Entity
         return bbHeight * 0.85F;
     }
 
-    public int getTalkInterval()
+    public int getAmbientSoundInterval()
     {
         return 80;
     }
@@ -139,10 +216,10 @@ public abstract class EntityLiving extends Entity
     }
 
     @Override
-    public boolean interact(EntityPlayer entityplayer)
+    public boolean interact(Player entityplayer)
     {
         ItemStack item = entityplayer.inventory.getCurrentItem();
-        if (item != null && item.itemID == Item.label.id && item.hasCustomName())
+        if (item != null && item.itemID == Items.LABEL.id && item.hasCustomName())
         {
             if(item.hasCustomColor()) {
             	this.chatColor = item.getCustomColor();
@@ -189,7 +266,7 @@ public abstract class EntityLiving extends Entity
         super.baseTick();
         if(random.nextInt(1000) < livingSoundTime++)
         {
-            livingSoundTime = -getTalkInterval();
+            livingSoundTime = -getAmbientSoundInterval();
             playLivingSound();
         }
         if(isAlive() && isInWall() && !noPhysics)
@@ -219,7 +296,7 @@ public abstract class EntityLiving extends Entity
             deathTime++;
             if(deathTime > 20)
             {
-                onEntityDeath();
+                beforeRemove();
                 remove();
                 for(int j = 0; j < 20; j++)
                 {
@@ -231,18 +308,18 @@ public abstract class EntityLiving extends Entity
 
             }
         }
-        List<ItemFood> finishedFood = new ArrayList<>();
-        for (Map.Entry<ItemFood, ConsumedFood> entry : consumedFood.entrySet()) {
+        List<FoodItem> finishedFood = new ArrayList<>();
+        for (Map.Entry<FoodItem, ConsumedFood> entry : consumedFood.entrySet()) {
             entry.getValue().tick();
             if (entry.getValue().isFinished()) {
                 finishedFood.add(entry.getKey());
             }
         }
-        for (ItemFood food : finishedFood) {
+        for (FoodItem food : finishedFood) {
             consumedFood.remove(food);
         }
         prevRotationUnused = unusedRotation1;
-        prevRenderYawOffset = renderYawOffset;
+        yBodyRotO = yBodyRot;
         yRotO = yRot;
         xRotO = xRot;
     }
@@ -311,8 +388,8 @@ public abstract class EntityLiving extends Entity
         onLivingUpdate();
         double d = x - xo;
         double d1 = z - zo;
-        float f = MathHelper.sqrt_double(d * d + d1 * d1);
-        float f1 = renderYawOffset;
+        float f = MathHelper.sqrt(d * d + d1 * d1);
+        float f1 = yBodyRot;
         float f2 = 0.0F;
         ridingRotUnused = prevRidingRotUnused;
         float f3 = 0.0F;
@@ -320,7 +397,7 @@ public abstract class EntityLiving extends Entity
         {
             f3 = 1.0F;
             f2 = f * 3F;
-            f1 = ((float) java.lang.Math.atan2(d1, d) * 180F) / 3.141593F - 90F;
+            f1 = ((float) java.lang.Math.atan2(d1, d) * 180F) / MathHelper.PI - 90F;
         }
         if(swingProgress > 0.0F)
         {
@@ -332,11 +409,11 @@ public abstract class EntityLiving extends Entity
         }
         prevRidingRotUnused = prevRidingRotUnused + (f3 - prevRidingRotUnused) * 0.3F;
         float f4;
-        for(f4 = f1 - renderYawOffset; f4 < -180F; f4 += 360F) { }
+        for(f4 = f1 - yBodyRot; f4 < -180F; f4 += 360F) { }
         for(; f4 >= 180F; f4 -= 360F) { }
-        renderYawOffset += f4 * 0.3F;
+        yBodyRot += f4 * 0.3F;
         float f5;
-        for(f5 = yRot - renderYawOffset; f5 < -180F; f5 += 360F) { }
+        for(f5 = yRot - yBodyRot; f5 < -180F; f5 += 360F) { }
         for(; f5 >= 180F; f5 -= 360F) { }
         boolean flag = f5 < -90F || f5 >= 90F;
         if(f5 < -75F)
@@ -347,10 +424,10 @@ public abstract class EntityLiving extends Entity
         {
             f5 = 75F;
         }
-        renderYawOffset = yRot - f5;
+        yBodyRot = yRot - f5;
         if(f5 * f5 > 2500F)
         {
-            renderYawOffset += f5 * 0.2F;
+            yBodyRot += f5 * 0.2F;
         }
         if(flag)
         {
@@ -358,8 +435,8 @@ public abstract class EntityLiving extends Entity
         }
         for(; yRot - yRotO < -180F; yRotO -= 360F) { }
         for(; yRot - yRotO >= 180F; yRotO += 360F) { }
-        for(; renderYawOffset - prevRenderYawOffset < -180F; prevRenderYawOffset -= 360F) { }
-        for(; renderYawOffset - prevRenderYawOffset >= 180F; prevRenderYawOffset += 360F) { }
+        for(; yBodyRot - yBodyRotO < -180F; yBodyRotO -= 360F) { }
+        for(; yBodyRot - yBodyRotO >= 180F; yBodyRotO += 360F) { }
         for(; xRot - xRotO < -180F; xRotO -= 360F) { }
         for(; xRot - xRotO >= 180F; xRotO += 360F) { }
         unusedRotation1 += f2;
@@ -385,10 +462,10 @@ public abstract class EntityLiving extends Entity
         heartsFlashTime = heartsHalvesLife / 2;
     }
     public int getHealth(){
-        return entityData.getInt(2);
+        return entityData.getInt(DATA_HEALTH);
     }
     public void setHealthRaw(int health){
-        entityData.set(2, health);
+        entityData.set(DATA_HEALTH, health);
     }
     public int getMaxHealth(){
         return 10;
@@ -403,7 +480,7 @@ public abstract class EntityLiving extends Entity
         return totalHealingRemaining;
     }
 
-    public void eatFood(ItemFood food) {
+    public void eatFood(FoodItem food) {
         if (food == null) return;
         if (food.getTicksPerHeal() == 0 || world.getGameRuleValue(GameRules.INSTANT_HEALING)) {
             heal(food.getHealAmount());
@@ -428,7 +505,7 @@ public abstract class EntityLiving extends Entity
         {
             return false;
         }
-        limbYaw = 1.5F;
+        walkAnimSpeed = 1.5F;
         boolean flag = true;
         if((float) heartsFlashTime > (float)heartsHalvesLife / 2.0F)
         {
@@ -461,7 +538,7 @@ public abstract class EntityLiving extends Entity
                     d = (java.lang.Math.random() - java.lang.Math.random()) * 0.01D;
                 }
 
-                attackedAtYaw = (float)((java.lang.Math.atan2(d1, d) * 180D) / 3.1415927410125732D) - yRot;
+                attackedAtYaw = (float)((java.lang.Math.atan2(d1, d) * 180D) / Math.PI) - yRot;
                 knockBack(attacker, damage, d, d1);
             } else
             {
@@ -519,7 +596,7 @@ public abstract class EntityLiving extends Entity
 
     public void knockBack(Entity entity, int i, double d, double d1)
     {
-        float f = MathHelper.sqrt_double(d * d + d1 * d1);
+        float f = MathHelper.sqrt(d * d + d1 * d1);
         float f1 = 0.4F;
         xd /= 2D;
         yd /= 2D;
@@ -546,7 +623,7 @@ public abstract class EntityLiving extends Entity
         dead = true;
         if(!world.isClientSide)
         {
-            dropFewItems();
+            dropDeathItems();
         }
         if (vehicle != null){
             vehicle.ejectRider();
@@ -573,7 +650,7 @@ public abstract class EntityLiving extends Entity
         {
             return String.format("%s%s swam in lava.", name, deathMsgColor);
         }
-        if (world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) == Block.spikes.id)
+        if (world.getBlockId(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) == Blocks.SPIKES.id)
         {
             return String.format("%s%s got impaled.", name, deathMsgColor);
         }
@@ -591,7 +668,7 @@ public abstract class EntityLiving extends Entity
         }
         return String.format("%s%s died", name, deathMsgColor);
     }
-    protected void dropFewItems()
+    protected void dropDeathItems()
     {
         List<WeightedRandomLootObject> drops = getMobDrops();
         if (drops != null){
@@ -610,14 +687,14 @@ public abstract class EntityLiving extends Entity
     }
 
     @Override
-	protected void causeFallDamage(float f)
+	protected void causeFallDamage(float distance)
     {
-        super.causeFallDamage(f);
-        int i = (int) java.lang.Math.ceil(f - 3F);
+        super.causeFallDamage(distance);
+        int i = (int) java.lang.Math.ceil(distance - 3F);
         if(i > 0)
         {
             hurt(null, i, DamageType.FALL);
-            int j = world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(y - 0.2D - (double) heightOffset), MathHelper.floor_double(z));
+            int j = world.getBlockId(MathHelper.floor(x), MathHelper.floor(y - 0.2D - (double) heightOffset), MathHelper.floor(z));
             if(j > 0)
             {
                 world.playBlockSoundEffect(this, this.x, this.y - this.heightOffset, this.z, Block.blocksList[j], EnumBlockSoundEffectType.ENTITY_LAND);
@@ -640,7 +717,7 @@ public abstract class EntityLiving extends Entity
 
     public void moveEntityWithHeading(float moveStrafing, float moveForward)
     {
-        int floorBlockId = world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(bb.minY) - 1, MathHelper.floor_double(z));
+        int floorBlockId = world.getBlockId(MathHelper.floor(x), MathHelper.floor(bb.minY) - 1, MathHelper.floor(z));
         this.muteStepSounds = false;
         this.isSkating = false;
 
@@ -727,8 +804,8 @@ public abstract class EntityLiving extends Entity
                 moveRelative(moveStrafing * 0.1f, 0.0f, 0.125f);
                 float speedBoost = 0.025f;
                 float maxSpeed = 0.5f;
-                float dx = MathHelper.sin((yRot * 3.141593F) / 180F);
-                float dz = MathHelper.cos((yRot * 3.141593F) / 180F);
+                float dx = MathHelper.sin((yRot * MathHelper.PI) / 180F);
+                float dz = MathHelper.cos((yRot * MathHelper.PI) / 180F);
                 double newMotionX = xd - speedBoost * dx;
                 double newMotionZ = zd + speedBoost * dz;
                 if ((newMotionX * newMotionX) + (newMotionZ * newMotionZ) < maxSpeed * maxSpeed)
@@ -748,7 +825,7 @@ public abstract class EntityLiving extends Entity
                 movementScale = 0.5460001F;
                 if(floorBlockId > 0)
                 {
-                    movementScale = Block.blocksList[floorBlockId].movementScale * 0.91F;
+                    movementScale = Block.blocksList[floorBlockId].friction * 0.91F;
                 }
             }
 
@@ -760,7 +837,7 @@ public abstract class EntityLiving extends Entity
                 movementScale = 0.5460001F;
                 if(floorBlockId > 0)
                 {
-                    movementScale = Block.blocksList[floorBlockId].movementScale * 0.91F;
+                    movementScale = Block.blocksList[floorBlockId].friction * 0.91F;
                 }
 
             }
@@ -803,23 +880,23 @@ public abstract class EntityLiving extends Entity
             xd *= movementScale;
             zd *= movementScale;
         }
-        prevLimbYaw = limbYaw;
+        walkAnimSpeedO = walkAnimSpeed;
         double d2 = x - xo;
         double d3 = z - zo;
-        float f5 = MathHelper.sqrt_double(d2 * d2 + d3 * d3) * 4F;
+        float f5 = MathHelper.sqrt(d2 * d2 + d3 * d3) * 4F;
         if(f5 > 1.0F)
         {
             f5 = 1.0F;
         }
-        limbYaw += (f5 - limbYaw) * 0.4F;
-        limbSwing += limbYaw;
+        walkAnimSpeed += (f5 - walkAnimSpeed) * 0.4F;
+        walkAnimPos += walkAnimSpeed;
     }
 
     public boolean canClimb()
     {
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_double(bb.minY);
-        int k = MathHelper.floor_double(z);
+        int i = MathHelper.floor(x);
+        int j = MathHelper.floor(bb.minY);
+        int k = MathHelper.floor(z);
         Block block = world.getBlock(i, j, k);
         return block != null && block.isClimbable(world, i, j, k);
     }
@@ -904,7 +981,7 @@ public abstract class EntityLiving extends Entity
         } else
         if(!isMultiplayerEntity)
         {
-            updatePlayerActionState();
+            updateAI();
         }
         boolean flag = isInWater();
         boolean flag1 = isInLava();
@@ -927,7 +1004,7 @@ public abstract class EntityLiving extends Entity
         moveForward *= 0.98F;
         randomYawVelocity *= 0.9F;
         moveEntityWithHeading(moveStrafing, moveForward);
-        List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));
+        List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.grow(0.2D, 0.0D, 0.2D));
         if(list != null && list.size() > 0)
         {
             for(int i = 0; i < list.size(); i++)
@@ -968,7 +1045,7 @@ public abstract class EntityLiving extends Entity
 
     public void tryToDespawn()
     {
-        EntityPlayer entityplayer = world.getClosestPlayerToEntity(this, -1D);
+        Player entityplayer = world.getClosestPlayerToEntity(this, -1D);
         if(canDespawn() && entityplayer != null)
         {
             double d = entityplayer.x - x;
@@ -992,17 +1069,17 @@ public abstract class EntityLiving extends Entity
         }
     }
 
-    protected void updatePlayerActionState()
+    protected void updateAI()
     {
         entityAge++;
-        EntityPlayer entityplayer = world.getClosestPlayerToEntity(this, -1D);
+        Player entityplayer = world.getClosestPlayerToEntity(this, -1D);
         tryToDespawn();
         moveStrafing = 0.0F;
         moveForward = 0.0F;
         float f = 8F;
         if(random.nextFloat() < 0.02F)
         {
-            EntityPlayer entityplayer1 = world.getClosestPlayerToEntity(this, f);
+            Player entityplayer1 = world.getClosestPlayerToEntity(this, f);
             if(entityplayer1 != null)
             {
                 currentTarget = entityplayer1;
@@ -1014,7 +1091,7 @@ public abstract class EntityLiving extends Entity
         }
         if(currentTarget != null)
         {
-            faceEntity(currentTarget, 10F, func_25026_x());
+            lookAt(currentTarget, 10F, func_25026_x());
             if(numTicksToChaseTarget-- <= 0 || currentTarget.removed || currentTarget.distanceToSqr(this) > (double)(f * f))
             {
                 currentTarget = null;
@@ -1041,24 +1118,24 @@ public abstract class EntityLiving extends Entity
         return 40;
     }
 
-    public void faceEntity(Entity entity, float f, float f1)
+    public void lookAt(Entity entity, float f, float f1)
     {
-        double d = entity.x - x;
-        double d2 = entity.z - z;
-        double d1;
-        if(entity instanceof EntityLiving)
+        double x = entity.x - this.x;
+        double y = entity.z - z;
+        double y2;
+        if(entity instanceof Mob)
         {
-            EntityLiving entityliving = (EntityLiving)entity;
-            d1 = (y + (double) getHeadHeight()) - (entityliving.y + (double)entityliving.getHeadHeight());
+            Mob entityliving = (Mob)entity;
+            y2 = entityliving.y + entityliving.getHeadHeight() - (this.y + this.getHeadHeight());
         } else
         {
-            d1 = (entity.bb.minY + entity.bb.maxY) / 2D - (y + (double) getHeadHeight());
+            y2 = (entity.bb.minY + entity.bb.maxY) / 2D - (this.y + (double) getHeadHeight());
         }
-        double d3 = MathHelper.sqrt_double(d * d + d2 * d2);
-        float f2 = (float)((java.lang.Math.atan2(d2, d) * 180D) / 3.1415927410125732D) - 90F;
-        float f3 = (float)(-((java.lang.Math.atan2(d1, d3) * 180D) / 3.1415927410125732D));
-        xRot = -updateRotation(xRot, f3, f1);
-        yRot = updateRotation(yRot, f2, f);
+        double d3 = MathHelper.sqrt(x * x + y * y);
+        float f2 = (float)((Math.atan2(y, x) * 180D) / Math.PI) - 90F;
+        float f3 = (float)(-((Math.atan2(-y2, d3) * 180D) / Math.PI));
+        xRot = -rotationLerp(xRot, f3, f1);
+        yRot = rotationLerp(yRot, f2, f);
     }
 
     public boolean hasCurrentTarget()
@@ -1071,7 +1148,7 @@ public abstract class EntityLiving extends Entity
         return currentTarget;
     }
 
-    private float updateRotation(float f, float f1, float f2)
+    private float rotationLerp(float f, float f1, float f2) // Was called rotLerp in the b1.2 leak
     {
         float f3;
         for(f3 = f1 - f; f3 < -180F; f3 += 360F) { }
@@ -1087,15 +1164,15 @@ public abstract class EntityLiving extends Entity
         return f + f3;
     }
 
-    public void onEntityDeath()
+    public void beforeRemove()
     {
     }
 
-    public boolean getCanSpawnHere()
+    public boolean canSpawnHere()
     {
-        int blockX = MathHelper.floor_double(x);
-        int blockY = MathHelper.floor_double(bb.minY);
-        int blockZ = MathHelper.floor_double(z);
+        int blockX = MathHelper.floor(x);
+        int blockY = MathHelper.floor(bb.minY);
+        int blockZ = MathHelper.floor(z);
         if(Block.hasTag(world.getBlockId(blockX, blockY, blockZ), BlockTags.PREVENT_MOB_SPAWNS)) {
         	return false;
         }
@@ -1118,27 +1195,27 @@ public abstract class EntityLiving extends Entity
         return prevSwingProgress + f1 * partialTick;
     }
 
-    public Vec3d getPosition(float partialTick)
+    public Vec3 getPosition(float partialTick)
     {
         if(partialTick == 1.0F)
         {
-            return Vec3d.createVector(x, y, z);
+            return Vec3.getTempVec3(x, y, z);
         } else
         {
             double d = xo + (x - xo) * (double)partialTick;
             double d1 = yo + (y - yo) * (double)partialTick;
             double d2 = zo + (z - zo) * (double)partialTick;
-            return Vec3d.createVector(d, d1, d2);
+            return Vec3.getTempVec3(d, d1, d2);
         }
     }
 
     @Override
-	public Vec3d getLookAngle()
+	public Vec3 getLookAngle()
     {
         return getViewVector(1.0F);
     }
 
-    public Vec3d getViewVector(float partialTick)
+    public Vec3 getViewVector(float partialTick)
     {
         if(partialTick == 1.0F)
         {
@@ -1146,7 +1223,7 @@ public abstract class EntityLiving extends Entity
             float f3 = MathHelper.sin(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
             float f5 = -MathHelper.cos(-xRot * (MathHelper.PI / 180f));
             float f7 = MathHelper.sin(-xRot * (MathHelper.PI / 180f));
-            return Vec3d.createVector(f3 * f5, f7, f1 * f5);
+            return Vec3.getTempVec3(f3 * f5, f7, f1 * f5);
         }
         else
         {
@@ -1156,16 +1233,16 @@ public abstract class EntityLiving extends Entity
             float x = MathHelper.sin(-yaw * (MathHelper.PI / 180f) - MathHelper.PI);
             float y = MathHelper.sin(-pitch * (MathHelper.PI / 180f));
             float z = MathHelper.cos(-yaw * (MathHelper.PI / 180f) - MathHelper.PI);
-            return Vec3d.createVector(x * xzLen, y, z * xzLen);
+            return Vec3.getTempVec3(x * xzLen, y, z * xzLen);
         }
     }
 
     public HitResult rayTrace(double d, float partialTick)
     {
-        Vec3d vec3d = getPosition(partialTick);
-        Vec3d vec3d1 = getViewVector(partialTick);
-        Vec3d vec3d2 = vec3d.addVector(vec3d1.xCoord * d, vec3d1.yCoord * d, vec3d1.zCoord * d);
-        return world.checkBlockCollisionBetweenPoints(vec3d, vec3d2);
+        Vec3 vec3 = getPosition(partialTick);
+        Vec3 vec31 = getViewVector(partialTick);
+        Vec3 vec32 = vec3.add(vec31.x * d, vec31.y * d, vec31.z * d);
+        return world.checkBlockCollisionBetweenPoints(vec3, vec32);
     }
 
     public int getMaxSpawnedInChunk()
@@ -1183,7 +1260,7 @@ public abstract class EntityLiving extends Entity
     {
         if(byte0 == 2)
         {
-            limbYaw = 1.5F;
+            walkAnimSpeed = 1.5F;
             heartsFlashTime = heartsHalvesLife;
             hurtTime = maxHurtTime = 10;
             this.attackedAtYaw = attackedAtYaw;
@@ -1259,73 +1336,4 @@ 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;
-    public float renderYawOffset;
-    public float prevRenderYawOffset;
-    protected float ridingRotUnused;
-    protected float prevRidingRotUnused;
-    protected float unusedRotation1;
-    protected float prevRotationUnused;
-    protected boolean unusedBool1;
-    protected boolean unusedBool2;
-    protected float unusedRotation2;
-    protected String entityType;
-    protected float unusedFloat1;
-    protected int scoreValue;
-    protected float unusedFloat2;
-    public boolean isMultiplayerEntity;
-    public float prevSwingProgress;
-    public float swingProgress;
-    public int prevHealth;
-    public int bonusHealth;
-    public int prevBonusHealth;
-    private int livingSoundTime;
-    public int hurtTime;
-    public int maxHurtTime;
-    public float attackedAtYaw;
-    public int deathTime;
-    public int attackTime;
-    public float prevCameraPitch;
-    public float cameraPitch;
-    protected boolean dead;
-    public int unusedInt;
-    public float unusedFloat4;
-    public float prevLimbYaw;
-    public float limbYaw;
-    public float limbSwing;
-    protected int newPosRotationIncrements;
-    protected double newPosX;
-    protected double newPosY;
-    protected double newPosZ;
-    protected double newRotationYaw;
-    protected double newRotationPitch;
-    float unusedFloat3;
-    protected int lastDamage;
-    protected int entityAge;
-    protected float moveStrafing;
-    protected float moveForward;
-    protected float randomYawVelocity;
-    protected boolean isJumping;
-    protected float defaultPitch;
-    protected float moveSpeed;
-    protected float noclipSpeed = 0.5f;
-    protected float flightSmoothness = 0.5f;
-    private Entity currentTarget;
-    protected int numTicksToChaseTarget;
-    public String nickname = "";
-    public byte chatColor = 0;
-    protected NamespaceID textureIdentifier = new NamespaceID("minecraft", "char");
-    protected float lastStrafe = 0.0f;
-    
-    public boolean isSkating = false;
-
-    public Direction rotationLock = null;
-    public Direction rotationLockHorizontal = null;
-    public Direction rotationLockVertical = null;
-    public PlacementMode placementModeOverride = PlacementMode.FACING;
-    public List<WeightedRandomLootObject> mobDrops = new ArrayList<>();
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityPainting.java b/src/main/java/net/minecraft/core/entity/PaintingEntity.java
similarity index 67%
rename from src/main/java/net/minecraft/core/entity/EntityPainting.java
rename to src/main/java/net/minecraft/core/entity/PaintingEntity.java
index 4f21e75d5..062487d35 100644
--- a/src/main/java/net/minecraft/core/entity/EntityPainting.java
+++ b/src/main/java/net/minecraft/core/entity/PaintingEntity.java
@@ -1,17 +1,17 @@
 package net.minecraft.core.entity;
 
 import net.minecraft.core.Global;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.packet.Packet25EntityPainting;
+import net.minecraft.core.net.packet.AddPaintingPacket;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.server.MinecraftServer;
@@ -20,13 +20,20 @@ import java.util.*;
 
 // Referenced classes of package net.minecraft.src:
 //            Entity, ArtType, AxisAlignedBB, World,
-//            EntityItem, ItemStack, Item, MathHelper, 
+//            ItemEntity, ItemStack, Item, MathHelper,
 //            Material, NBTTagCompound
 
-public class EntityPainting extends Entity
+public class PaintingEntity extends Entity
 {
+    private int updateCounter;
+    public int direction;
+    public int blockX;
+    public int blockY;
+    public int blockZ;
+    public ItemStack borderStack;
+    public ArtType art;
 
-    public EntityPainting(World world)
+    public PaintingEntity(World world)
     {
         super(world);
         updateCounter = 0;
@@ -42,22 +49,20 @@ public class EntityPainting extends Entity
         return true;
     }
 
-    public EntityPainting(World world, int x, int y, int z, int side, String motive)
+    public PaintingEntity(World world, int x, int y, int z, int side, String motive)
     {
         this(world);
-        xPosition = x;
-        yPosition = y;
-        zPosition = z;
+        blockX = x;
+        blockY = y;
+        blockZ = z;
 
         art = ArtType.map.getOrDefault(motive, art);
         setDirection(side);
     }
 
     @Override
-    protected void init()
+    protected void defineSynchedData()
     {
-        entityData.define(1, -1);
-        entityData.define(2, -1);
     }
 
     public void setDirection(int direction)
@@ -77,9 +82,9 @@ public class EntityPainting extends Entity
         sizeX /= 32F;
         sizeY /= 32F;
         sizeZ /= 32F;
-        double centerX = (double)xPosition + 0.5D;
-        double centerY = (double)yPosition + 0.5D;
-        double centerZ = (double)zPosition + 0.5D;
+        double centerX = (double) blockX + 0.5D;
+        double centerY = (double) blockY + 0.5D;
+        double centerZ = (double) blockZ + 0.5D;
         float offsetFromWall = 0.5F + 0.03F;
         if(direction == 0)
         {
@@ -116,7 +121,7 @@ public class EntityPainting extends Entity
         centerY += offsetFromCenter(art.sizeY);
         setPos(centerX, centerY, centerZ);
         float expand = -0.00F;
-        bb.setBounds(centerX - sizeX - expand, centerY - sizeY - expand, centerZ - sizeZ - expand, centerX + sizeX + expand, centerY + sizeY + expand, centerZ + sizeZ + expand);
+        bb.set(centerX - sizeX - expand, centerY - sizeY - expand, centerZ - sizeZ - expand, centerX + sizeX + expand, centerY + sizeY + expand, centerZ + sizeZ + expand);
         if (direction == 0 || direction == 2)
         {
             bb.minZ -= 0.01f;
@@ -144,18 +149,18 @@ public class EntityPainting extends Entity
         if(updateCounter++ == 100 && !world.isClientSide)
         {
             updateCounter = 0;
-            if(!canFitPainting())
+            if(!canStay())
             {
                 remove();
-                world.entityJoinedWorld(new EntityItem(world, x, y, z, new ItemStack(Item.painting)));
+                world.entityJoinedWorld(new ItemEntity(world, x, y, z, new ItemStack(Items.PAINTING)));
                 if (getBorderStack() != null){
-                    this.world.entityJoinedWorld(new EntityItem(this.world, this.x, this.y, this.z, getBorderStack()));
+                    this.world.entityJoinedWorld(new ItemEntity(this.world, this.x, this.y, this.z, getBorderStack()));
                 }
             }
         }
     }
 
-    public boolean canFitPainting()
+    public boolean canStay()
     {
         if(!world.getCubes(this, bb).isEmpty())
         {
@@ -163,26 +168,26 @@ public class EntityPainting extends Entity
         }
         int xSize = art.sizeX / 16;
         int ySize = art.sizeY / 16;
-        int xPosition = this.xPosition;
-        int yPosition = this.yPosition;
-        int zPosition = this.zPosition;
+        int xPosition = this.blockX;
+        int yPosition = this.blockY;
+        int zPosition = this.blockZ;
         if(direction == 0)
         {
-            xPosition = MathHelper.floor_double(x - (double)((float)art.sizeX / 32F));
+            xPosition = MathHelper.floor(x - (double)((float)art.sizeX / 32F));
         }
         if(direction == 1)
         {
-            zPosition = MathHelper.floor_double(z - (double)((float)art.sizeX / 32F));
+            zPosition = MathHelper.floor(z - (double)((float)art.sizeX / 32F));
         }
         if(direction == 2)
         {
-            xPosition = MathHelper.floor_double(x - (double)((float)art.sizeX / 32F));
+            xPosition = MathHelper.floor(x - (double)((float)art.sizeX / 32F));
         }
         if(direction == 3)
         {
-            zPosition = MathHelper.floor_double(z - (double)((float)art.sizeX / 32F));
+            zPosition = MathHelper.floor(z - (double)((float)art.sizeX / 32F));
         }
-        yPosition = MathHelper.floor_double(y - (double)((float)art.sizeY / 32F));
+        yPosition = MathHelper.floor(y - (double)((float)art.sizeY / 32F));
         for(int dx = 0; dx < xSize; dx++)
         {
             for(int dy = 0; dy < ySize; dy++)
@@ -190,11 +195,11 @@ public class EntityPainting extends Entity
                 Material material;
                 if(direction == 0 || direction == 2)
                 {
-                    material = world.getBlockMaterial(xPosition + dx, yPosition + dy, this.zPosition);
+                    material = world.getBlockMaterial(xPosition + dx, yPosition + dy, this.blockZ);
                 }
                 else
                 {
-                    material = world.getBlockMaterial(this.xPosition, yPosition + dy, zPosition + dx);
+                    material = world.getBlockMaterial(this.blockX, yPosition + dy, zPosition + dx);
                 }
                 if(!material.isSolid())
                 {
@@ -207,7 +212,7 @@ public class EntityPainting extends Entity
         List<Entity> entities = world.getEntitiesWithinAABBExcludingEntity(this, bb);
         for (Entity entity : entities)
         {
-            if (entity instanceof EntityPainting)
+            if (entity instanceof PaintingEntity)
             {
                 return false;
             }
@@ -229,14 +234,14 @@ public class EntityPainting extends Entity
         {
             remove();
             markHurt();
-            if (!(entity instanceof EntityPlayer) || ((EntityPlayer) entity).getGamemode().dropBlockOnBreak())
+            if (!(entity instanceof Player) || ((Player) entity).getGamemode().dropBlockOnBreak())
             {
-                world.entityJoinedWorld(new EntityItem(world, x, y, z, new ItemStack(Item.painting)));
+                world.entityJoinedWorld(new ItemEntity(world, x, y, z, new ItemStack(Items.PAINTING)));
                 if (getBorderStack() != null){
-                    this.world.entityJoinedWorld(new EntityItem(this.world, this.x, this.y, this.z, getBorderStack()));
+                    this.world.entityJoinedWorld(new ItemEntity(this.world, this.x, this.y, this.z, getBorderStack()));
                 }
             }
-            world.playBlockSoundEffect(null, this.x, this.y + heightOffset, this.z, Block.planksOak, EnumBlockSoundEffectType.MINE);
+            world.playBlockSoundEffect(null, this.x, this.y + heightOffset, this.z, Blocks.PLANKS_OAK, EnumBlockSoundEffectType.MINE);
         }
         return true;
     }
@@ -246,9 +251,9 @@ public class EntityPainting extends Entity
     {
         tag.putByte("Dir", (byte)direction);
         tag.putString("Motive", art.key);
-        tag.putInt("TileX", xPosition);
-        tag.putInt("TileY", yPosition);
-        tag.putInt("TileZ", zPosition);
+        tag.putInt("TileX", blockX);
+        tag.putInt("TileY", blockY);
+        tag.putInt("TileZ", blockZ);
         ItemStack stack = getBorderStack();
         if (stack != null){
             tag.putBoolean("itemExists", true);
@@ -263,9 +268,9 @@ public class EntityPainting extends Entity
 	public void readAdditionalSaveData(CompoundTag tag)
     {
         direction = tag.getByte("Dir");
-        xPosition = tag.getInteger("TileX");
-        yPosition = tag.getInteger("TileY");
-        zPosition = tag.getInteger("TileZ");
+        blockX = tag.getInteger("TileX");
+        blockY = tag.getInteger("TileY");
+        blockZ = tag.getInteger("TileZ");
         String motive = tag.getString("Motive");
         art = ArtType.map.getOrDefault(motive, ArtType.Kebab);
         setDirection(direction);
@@ -284,7 +289,7 @@ public class EntityPainting extends Entity
         if(!world.isClientSide && xd * xd + yd * yd + zd * zd > 0.0D)
         {
             remove();
-            world.entityJoinedWorld(new EntityItem(world, x, y, z, new ItemStack(Item.painting)));
+            world.entityJoinedWorld(new ItemEntity(world, x, y, z, new ItemStack(Items.PAINTING)));
         }
     }
 
@@ -294,12 +299,12 @@ public class EntityPainting extends Entity
         if(!world.isClientSide && x * x + y * y + z * z > 0.0D)
         {
             remove();
-            world.entityJoinedWorld(new EntityItem(world, this.x, this.y, this.z, new ItemStack(Item.painting)));
+            world.entityJoinedWorld(new ItemEntity(world, this.x, this.y, this.z, new ItemStack(Items.PAINTING)));
         }
     }
 
     @Override
-    public boolean interact(EntityPlayer player) {
+    public boolean interact(Player player) {
         if (player.getHeldItem() != null){
             ItemStack stack = player.getHeldItem();
             ItemStack paintingStack = getBorderStack();
@@ -307,7 +312,7 @@ public class EntityPainting extends Entity
             setStack(new ItemStack(stack.getItem(), 1, stack.getMetadata()));
             stack.consumeItem(player);
             if (stack.stackSize <= 0) {
-                player.inventory.setInventorySlotContents(player.inventory.currentItem, null);
+                player.inventory.setItem(player.inventory.currentItem, null);
             }
             if (paintingStack != null && player.getGamemode().consumeBlocks()){
                 player.inventory.insertItem(paintingStack, true);
@@ -332,7 +337,7 @@ public class EntityPainting extends Entity
     public void setStack(ItemStack stack){
         borderStack = stack;
         if (Global.isServer){
-            MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet25EntityPainting(this), world.dimension.id);
+            MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new AddPaintingPacket(this), world.dimension.id);
         }
     }
     private static final HashMap<String, NamespaceID> borderMaterialMap = new HashMap<>();
@@ -343,20 +348,13 @@ public class EntityPainting extends Entity
         return borderMaterialMap.get(stack.itemID + "|" + stack.getMetadata());
     }
     static {
-        addBorder(Item.ingotIron.getDefaultStack(), new NamespaceID("minecraft", "border_iron"));
-        addBorder(Item.ingotGold.getDefaultStack(), new NamespaceID("minecraft", "border_gold"));
-        addBorder(Item.ingotSteel.getDefaultStack(), new NamespaceID("minecraft", "border_steel"));
-        addBorder(new ItemStack(Item.dye, 1, 4), new NamespaceID("minecraft", "border_lapis"));
-        addBorder(Item.diamond.getDefaultStack(), new NamespaceID("minecraft", "border_diamond"));
-        addBorder(Item.dustRedstone.getDefaultStack(), new NamespaceID("minecraft", "border_redstone"));
-        addBorder(Item.olivine.getDefaultStack(), new NamespaceID("minecraft", "border_olivine"));
-        addBorder(Item.quartz.getDefaultStack(), new NamespaceID("minecraft", "border_quartz"));
+        addBorder(Items.INGOT_IRON.getDefaultStack(), new NamespaceID("minecraft", "border_iron"));
+        addBorder(Items.INGOT_GOLD.getDefaultStack(), new NamespaceID("minecraft", "border_gold"));
+        addBorder(Items.INGOT_STEEL.getDefaultStack(), new NamespaceID("minecraft", "border_steel"));
+        addBorder(new ItemStack(Items.DYE, 1, 4), new NamespaceID("minecraft", "border_lapis"));
+        addBorder(Items.DIAMOND.getDefaultStack(), new NamespaceID("minecraft", "border_diamond"));
+        addBorder(Items.DUST_REDSTONE.getDefaultStack(), new NamespaceID("minecraft", "border_redstone"));
+        addBorder(Items.OLIVINE.getDefaultStack(), new NamespaceID("minecraft", "border_olivine"));
+        addBorder(Items.QUARTZ.getDefaultStack(), new NamespaceID("minecraft", "border_quartz"));
     }
-    private int updateCounter;
-    public int direction;
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-    public ItemStack borderStack;
-    public ArtType art;
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityPathfinder.java b/src/main/java/net/minecraft/core/entity/PathfinderMob.java
similarity index 77%
rename from src/main/java/net/minecraft/core/entity/EntityPathfinder.java
rename to src/main/java/net/minecraft/core/entity/PathfinderMob.java
index ee37a1b09..a4c968ce2 100644
--- a/src/main/java/net/minecraft/core/entity/EntityPathfinder.java
+++ b/src/main/java/net/minecraft/core/entity/PathfinderMob.java
@@ -1,21 +1,26 @@
 package net.minecraft.core.entity;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityLiving, World, Entity, AxisAlignedBB, 
+//            Mob, World, Entity, AxisAlignedBB,
 //            MathHelper, PathEntity, Vec3D
 
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.pathfinder.Path;
-import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.World;
 import java.util.List;
 
-public abstract class EntityPathfinder extends EntityLiving
+public abstract class PathfinderMob extends Mob
 {
+    private static final int MAX_TURN = 30;
+    protected Path pathToEntity;
+    protected Entity entityToAttack;
+    protected Entity closestFireflyEntity;
+    protected boolean hasAttacked;
 
-    public EntityPathfinder(World world)
+    public PathfinderMob(World world)
     {
         super(world);
         hasAttacked = false;
@@ -27,7 +32,7 @@ public abstract class EntityPathfinder extends EntityLiving
     }
 
     @Override
-	protected void updatePlayerActionState()
+	protected void updateAI()
     {
         hasAttacked = isMovementCeased();
         float sightRadius = 16F;
@@ -63,18 +68,18 @@ public abstract class EntityPathfinder extends EntityLiving
             // random roaming
             roamRandomPath();
         }
-        int i = MathHelper.floor_double(bb.minY + 0.5D);
+        int i = MathHelper.floor(bb.minY + 0.5D);
         boolean inWater = isInWater();
         boolean inLava = isInLava();
         xRot = 0.0F;
         if(pathToEntity == null || random.nextInt(100) == 0)
         {
-            super.updatePlayerActionState();
+            super.updateAI();
             pathToEntity = null;
             return;
         }
-        Vec3d coordsForNextPath = pathToEntity.getPos(this);
-        for(double d = bbWidth * 2.0F; coordsForNextPath != null && coordsForNextPath.squareDistanceTo(x, coordsForNextPath.yCoord, z) < d * d;)
+        Vec3 coordsForNextPath = pathToEntity.getPos(this);
+        for(double d = bbWidth * 2.0F; coordsForNextPath != null && coordsForNextPath.distanceToSquared(x, coordsForNextPath.y, z) < d * d;)
         {
             pathToEntity.next();
             if(pathToEntity.isDone())
@@ -91,23 +96,23 @@ public abstract class EntityPathfinder extends EntityLiving
         isJumping = false;
         if(coordsForNextPath != null)
         {
-            double x1 = coordsForNextPath.xCoord - x;
-            double z1 = coordsForNextPath.zCoord - z;
-            double y1 = coordsForNextPath.yCoord - (double)i;
-            float f2 = (float)((java.lang.Math.atan2(z1, x1) * 180D) / 3.1415927410125732D) - 90F;
+            double x1 = coordsForNextPath.x - x;
+            double z1 = coordsForNextPath.z - z;
+            double y1 = coordsForNextPath.y - (double)i;
+            float f2 = (float)((java.lang.Math.atan2(z1, x1) * 180D) / Math.PI) - 90F;
             float f3 = f2 - yRot;
 
             //move forward towards path
             moveForward = moveSpeed;
             for(; f3 < -180F; f3 += 360F) { }
             for(; f3 >= 180F; f3 -= 360F) { }
-            if(f3 > 30F)
+            if(f3 > MAX_TURN)
             {
-                f3 = 30F;
+                f3 = MAX_TURN;
             }
-            if(f3 < -30F)
+            if(f3 < -MAX_TURN)
             {
-                f3 = -30F;
+                f3 = -MAX_TURN;
             }
             yRot += f3;
             if(hasAttacked && entityToAttack != null)
@@ -115,8 +120,8 @@ public abstract class EntityPathfinder extends EntityLiving
                 double d4 = entityToAttack.x - x;
                 double d5 = entityToAttack.z - z;
                 float f5 = yRot;
-                yRot = (float)((java.lang.Math.atan2(d5, d4) * 180D) / 3.1415927410125732D) - 90F;
-                float f4 = (((f5 - yRot) + 90F) * 3.141593F) / 180F;
+                yRot = (float)((java.lang.Math.atan2(d5, d4) * 180D) / Math.PI) - 90F;
+                float f4 = (((f5 - yRot) + 90F) * MathHelper.PI) / 180F;
                 moveStrafing = -MathHelper.sin(f4) * moveForward * 1.0F;
                 moveForward = MathHelper.cos(f4) * moveForward * 1.0F;
             }
@@ -127,7 +132,7 @@ public abstract class EntityPathfinder extends EntityLiving
         }
         if(entityToAttack != null)
         {
-            faceEntity(entityToAttack, 30F, 30F);
+            lookAt(entityToAttack, 30F, 30F);
         }
         if(horizontalCollision && !hasPath())
         {
@@ -140,7 +145,7 @@ public abstract class EntityPathfinder extends EntityLiving
     }
 
     protected Entity getClosestFireflyToEntity (int x, int y, int z, float radius){
-        List<Entity> nearbyFireflies = world.getEntitiesWithinAABB(EntityFireflyCluster.class, AABB.getBoundingBoxFromPool(this.x, this.y, this.z, this.x + 1.0D, this.y + 1.0D, this.z + 1.0D).expand(radius, 4D, radius));
+        List<Entity> nearbyFireflies = world.getEntitiesWithinAABB(FireflyClusterMob.class, AABB.getTemporaryBB(this.x, this.y, this.z, this.x + 1.0D, this.y + 1.0D, this.z + 1.0D).grow(radius, 4D, radius));
 
         double closestDistance = -1D;
         Entity cluster = null;
@@ -166,9 +171,9 @@ public abstract class EntityPathfinder extends EntityLiving
         float bestPathWeight = -99999F;
         for(int l = 0; l < 10; l++)
         {
-            int x1 = MathHelper.floor_double((this.x + (double) random.nextInt(13)) - 6D);
-            int y1 = MathHelper.floor_double((this.y + (double) random.nextInt(7)) - 3D);
-            int z1 = MathHelper.floor_double((this.z + (double) random.nextInt(13)) - 6D);
+            int x1 = MathHelper.floor((this.x + (double) random.nextInt(13)) - 6D);
+            int y1 = MathHelper.floor((this.y + (double) random.nextInt(7)) - 3D);
+            int z1 = MathHelper.floor((this.z + (double) random.nextInt(13)) - 6D);
             float currentPathWeight = getBlockPathWeight(x1, y1, z1);
             if(currentPathWeight > bestPathWeight)
             {
@@ -205,12 +210,12 @@ public abstract class EntityPathfinder extends EntityLiving
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_double(bb.minY);
-        int k = MathHelper.floor_double(z);
-        return super.getCanSpawnHere() && getBlockPathWeight(i, j, k) >= 0.0F;
+        int i = MathHelper.floor(x);
+        int j = MathHelper.floor(bb.minY);
+        int k = MathHelper.floor(z);
+        return super.canSpawnHere() && getBlockPathWeight(i, j, k) >= 0.0F;
     }
 
     public boolean hasPath()
@@ -233,8 +238,5 @@ public abstract class EntityPathfinder extends EntityLiving
         entityToAttack = entity;
     }
 
-    protected Path pathToEntity;
-    protected Entity entityToAttack;
-    protected Entity closestFireflyEntity;
-    protected boolean hasAttacked;
+
 }
diff --git a/src/main/java/net/minecraft/core/entity/SkinVariantList.java b/src/main/java/net/minecraft/core/entity/SkinVariantList.java
index 90539d563..30549e9d5 100644
--- a/src/main/java/net/minecraft/core/entity/SkinVariantList.java
+++ b/src/main/java/net/minecraft/core/entity/SkinVariantList.java
@@ -1,10 +1,9 @@
 package net.minecraft.core.entity;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 public abstract class SkinVariantList {
-    public abstract int getNumSkinsForEntity(Class<? extends Entity> entityClass);
+    public abstract @NotNull String getSkinReference(@Nullable String variantJsonPath, @NotNull String defaultKey, int skinIndex);
 
-    public int getRandomSkinForEntity(Class<? extends Entity> entityClass) {
-        int maxSkins = getNumSkinsForEntity(entityClass);
-        return maxSkins > 1 ? (int) (Math.random() * maxSkins) : 0;
-    }
 }
diff --git a/src/main/java/net/minecraft/core/entity/EntityTNT.java b/src/main/java/net/minecraft/core/entity/TNTPrimedEntity.java
similarity index 76%
rename from src/main/java/net/minecraft/core/entity/EntityTNT.java
rename to src/main/java/net/minecraft/core/entity/TNTPrimedEntity.java
index 0e64d0771..718180d5d 100644
--- a/src/main/java/net/minecraft/core/entity/EntityTNT.java
+++ b/src/main/java/net/minecraft/core/entity/TNTPrimedEntity.java
@@ -8,10 +8,11 @@ import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class EntityTNT extends Entity
+public class TNTPrimedEntity extends Entity
 {
+    public int fuse;
 
-    public EntityTNT(World world)
+    public TNTPrimedEntity(World world)
     {
         super(world);
         fuse = 0;
@@ -20,14 +21,14 @@ public class EntityTNT extends Entity
         heightOffset = bbHeight / 2.0F;
     }
 
-    public EntityTNT(World world, double d, double d1, double d2)
+    public TNTPrimedEntity(World world, double d, double d1, double d2)
     {
         this(world);
         setPos(d, d1, d2);
-        float f = (float)(java.lang.Math.random() * 3.1415927410125732D * 2D);
-        xd = -MathHelper.sin((f * 3.141593F) / 180F) * 0.02F;
-        yd = 0.20000000298023224D;
-        zd = -MathHelper.cos((f * 3.141593F) / 180F) * 0.02F;
+        float f = (float)(java.lang.Math.random() * Math.PI * 2D);
+        xd = -MathHelper.sin((f * MathHelper.PI) / 180F) * 0.02F;
+        yd = 0.2D;
+        zd = -MathHelper.cos((f * MathHelper.PI) / 180F) * 0.02F;
         fuse = 80;
         xo = d;
         yo = d1;
@@ -35,7 +36,7 @@ public class EntityTNT extends Entity
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
     }
 
@@ -75,7 +76,7 @@ public class EntityTNT extends Entity
             if(!world.isClientSide)
             {
                 remove();
-                explode();
+                world.createExplosion(null, x, y, z, 4);
             } else
             {
                 remove();
@@ -86,12 +87,6 @@ public class EntityTNT extends Entity
         }
     }
 
-    private void explode()
-    {
-        float f = 4F;
-        world.createExplosion(null, x, y, z, f);
-    }
-
     @Override
     public void addAdditionalSaveData(CompoundTag tag)
     {
@@ -109,6 +104,4 @@ public class EntityTNT extends Entity
     {
         return 0.0F;
     }
-
-    public int fuse;
 }
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityAnimal.java b/src/main/java/net/minecraft/core/entity/animal/Animal.java
similarity index 74%
rename from src/main/java/net/minecraft/core/entity/animal/EntityAnimal.java
rename to src/main/java/net/minecraft/core/entity/animal/Animal.java
index 44c454c83..eabf88600 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityAnimal.java
+++ b/src/main/java/net/minecraft/core/entity/animal/Animal.java
@@ -2,22 +2,23 @@ package net.minecraft.core.entity.animal;
 
 
 // Referenced classes of package net.minecraft.src:
-//            EntityCreature, World, Block, BlockGrass, 
+//            EntityCreature, World, Block, GrassBlock,
 //            MathHelper, AxisAlignedBB, NBTTagCompound
 
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityPathfinder;
+import net.minecraft.core.entity.PathfinderMob;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.season.Seasons;
 
-public abstract class EntityAnimal extends EntityPathfinder
-	implements IAnimal
+public abstract class Animal extends PathfinderMob
+	implements Creature
 {
 
-    public EntityAnimal(World world)
+    public Animal(World world)
     {
         super(world);
         scoreValue = 10;
@@ -36,7 +37,7 @@ public abstract class EntityAnimal extends EntityPathfinder
     @Override
 	protected float getBlockPathWeight(int x, int y, int z)
     {
-        if(world.getBlockId(x, y - 1, z) == Block.grass.id)
+        if(world.getBlockId(x, y - 1, z) == Blocks.GRASS.id)
         {
             return 10F;
         } else
@@ -58,21 +59,21 @@ public abstract class EntityAnimal extends EntityPathfinder
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-        int x = MathHelper.floor_double(this.x);
-        int y = MathHelper.floor_double(bb.minY);
-        int z = MathHelper.floor_double(this.z);
+        int x = MathHelper.floor(this.x);
+        int y = MathHelper.floor(bb.minY);
+        int z = MathHelper.floor(this.z);
         int id = world.getBlockId(x, y - 1, z);
         if (Block.blocksList[id] != null)
         {
-            return Block.blocksList[id].hasTag(BlockTags.PASSIVE_MOBS_SPAWN) && world.getFullBlockLightValue(x, y, z) > 8 && super.getCanSpawnHere();
+            return Block.blocksList[id].hasTag(BlockTags.PASSIVE_MOBS_SPAWN) && world.getFullBlockLightValue(x, y, z) > 8 && super.canSpawnHere();
         }
         return false;
     }
 
     @Override
-	public int getTalkInterval()
+	public int getAmbientSoundInterval()
     {
         return 120;
     }
diff --git a/src/main/java/net/minecraft/core/entity/animal/ChickenMob.java b/src/main/java/net/minecraft/core/entity/animal/ChickenMob.java
new file mode 100644
index 000000000..1fb5661bb
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/animal/ChickenMob.java
@@ -0,0 +1,101 @@
+package net.minecraft.core.entity.animal;
+
+import com.mojang.nbt.CompoundTag;
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.collection.NamespaceID;
+import net.minecraft.core.world.World;
+
+public class ChickenMob extends Animal
+{
+    public float flap;
+    public float flapSpeed;
+    public float oFlapSpeed;
+    public float oFlap;
+    public float flapping;
+    public int eggTimer;
+
+    public ChickenMob(World world)
+    {
+        super(world);
+        flap = 0.0F;
+        flapSpeed = 0.0F;
+        flapping = 1.0F;
+        textureIdentifier = new NamespaceID("minecraft", "chicken");
+        setSize(0.4F, 0.8F);
+        eggTimer = random.nextInt(6000) + 6000;
+        mobDrops.add(new WeightedRandomLootObject(Items.FEATHER_CHICKEN.getDefaultStack(), 0, 2));
+    }
+    @Override
+    public int getMaxHealth(){
+        return 4;
+    }
+
+    @Override
+	public void onLivingUpdate()
+    {
+        super.onLivingUpdate();
+        oFlap = flap;
+        oFlapSpeed = flapSpeed;
+        flapSpeed += (onGround ? -1 : 4) * 0.3D;
+        if(flapSpeed < 0.0F)
+        {
+            flapSpeed = 0.0F;
+        }
+        if(flapSpeed > 1.0F)
+        {
+            flapSpeed = 1.0F;
+        }
+        if(!onGround && flapping < 1.0F)
+        {
+            flapping = 1.0F;
+        }
+        flapping *= 0.9D;
+        if(!onGround && yd < 0.0D)
+        {
+            yd *= 0.6D;
+        }
+        flap += flapping * 2.0F;
+        if(!world.isClientSide && --eggTimer <= 0)
+        {
+            world.playSoundAtEntity(null, this, "mob.chickenplop", 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
+            spawnAtLocation(Items.EGG_CHICKEN.id, 1);
+            eggTimer = random.nextInt(6000) + 6000;
+        }
+    }
+
+    @Override
+	protected void causeFallDamage(float distance)
+    {
+    }
+
+    @Override
+	public void addAdditionalSaveData(CompoundTag tag)
+    {
+        super.addAdditionalSaveData(tag);
+    }
+
+    @Override
+	public void readAdditionalSaveData(CompoundTag tag)
+    {
+        super.readAdditionalSaveData(tag);
+    }
+
+    @Override
+    public String getLivingSound()
+    {
+        return "mob.chicken";
+    }
+
+    @Override
+	protected String getHurtSound()
+    {
+        return "mob.chickenhurt";
+    }
+
+    @Override
+	protected String getDeathSound()
+    {
+        return "mob.chickenhurt";
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityCow.java b/src/main/java/net/minecraft/core/entity/animal/CowMob.java
similarity index 68%
rename from src/main/java/net/minecraft/core/entity/animal/EntityCow.java
rename to src/main/java/net/minecraft/core/entity/animal/CowMob.java
index 4878e4d23..8b4c863ed 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityCow.java
+++ b/src/main/java/net/minecraft/core/entity/animal/CowMob.java
@@ -2,27 +2,27 @@ package net.minecraft.core.entity.animal;
 
 
 // Referenced classes of package net.minecraft.src:
-//            EntityAnimal, Item, EntityPlayer, InventoryPlayer, 
+//            Animal, Item, Player, InventoryPlayer,
 //            ItemStack, World, NBTTagCompound
 
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemBucketEmpty;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.EmptyBucketItem;
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.world.World;
 
-public class EntityCow extends EntityAnimal
+public class CowMob extends Animal
 {
 
-    public EntityCow(World world)
+    public CowMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "cow");
         setSize(0.9F, 1.3F);
-        mobDrops.add(new WeightedRandomLootObject(Item.leather.getDefaultStack(), 1, 5));
+        mobDrops.add(new WeightedRandomLootObject(Items.LEATHER.getDefaultStack(), 1, 5));
     }
 
     @Override
@@ -62,12 +62,12 @@ public class EntityCow extends EntityAnimal
     }
 
     @Override
-	public boolean interact(EntityPlayer entityplayer)
+	public boolean interact(Player entityplayer)
     {
         ItemStack itemstack = entityplayer.inventory.getCurrentItem();
-        if(itemstack != null && itemstack.itemID == Item.bucket.id)
+        if(itemstack != null && itemstack.itemID == Items.BUCKET.id)
         {
-            ItemBucketEmpty.useBucket(entityplayer, new ItemStack(Item.bucketMilk));
+            EmptyBucketItem.useBucket(entityplayer, new ItemStack(Items.BUCKET_MILK));
             return true;
         }
         return super.interact(entityplayer);
diff --git a/src/main/java/net/minecraft/core/entity/animal/IAnimal.java b/src/main/java/net/minecraft/core/entity/animal/Creature.java
similarity index 64%
rename from src/main/java/net/minecraft/core/entity/animal/IAnimal.java
rename to src/main/java/net/minecraft/core/entity/animal/Creature.java
index c8ab92122..db8402ed2 100644
--- a/src/main/java/net/minecraft/core/entity/animal/IAnimal.java
+++ b/src/main/java/net/minecraft/core/entity/animal/Creature.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.entity.animal;
 
 
-public interface IAnimal
+public interface Creature
 {
 }
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityChicken.java b/src/main/java/net/minecraft/core/entity/animal/EntityChicken.java
deleted file mode 100644
index 706f9d260..000000000
--- a/src/main/java/net/minecraft/core/entity/animal/EntityChicken.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package net.minecraft.core.entity.animal;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityAnimal, World, Item, NBTTagCompound
-
-import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.item.Item;
-import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.util.collection.NamespaceID;
-import net.minecraft.core.world.World;
-
-public class EntityChicken extends EntityAnimal
-{
-
-    public EntityChicken(World world)
-    {
-        super(world);
-        field_753_a = false;
-        field_752_b = 0.0F;
-        destPos = 0.0F;
-        field_755_h = 1.0F;
-        textureIdentifier = new NamespaceID("minecraft", "chicken");
-        setSize(0.4F, 0.8F);
-        timeUntilNextEgg = random.nextInt(6000) + 6000;
-        mobDrops.add(new WeightedRandomLootObject(Item.featherChicken.getDefaultStack(), 0, 2));
-    }
-    @Override
-    public int getMaxHealth(){
-        return 4;
-    }
-
-    @Override
-	public void onLivingUpdate()
-    {
-        super.onLivingUpdate();
-        field_756_e = field_752_b;
-        field_757_d = destPos;
-        destPos += (double)(onGround ? -1 : 4) * 0.29999999999999999D;
-        if(destPos < 0.0F)
-        {
-            destPos = 0.0F;
-        }
-        if(destPos > 1.0F)
-        {
-            destPos = 1.0F;
-        }
-        if(!onGround && field_755_h < 1.0F)
-        {
-            field_755_h = 1.0F;
-        }
-        field_755_h *= 0.90000000000000002D;
-        if(!onGround && yd < 0.0D)
-        {
-            yd *= 0.59999999999999998D;
-        }
-        field_752_b += field_755_h * 2.0F;
-        if(!world.isClientSide && --timeUntilNextEgg <= 0)
-        {
-            world.playSoundAtEntity(null, this, "mob.chickenplop", 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
-            spawnAtLocation(Item.eggChicken.id, 1);
-            timeUntilNextEgg = random.nextInt(6000) + 6000;
-        }
-    }
-
-    @Override
-	protected void causeFallDamage(float f)
-    {
-    }
-
-    @Override
-	public void addAdditionalSaveData(CompoundTag tag)
-    {
-        super.addAdditionalSaveData(tag);
-    }
-
-    @Override
-	public void readAdditionalSaveData(CompoundTag tag)
-    {
-        super.readAdditionalSaveData(tag);
-    }
-
-    @Override
-    public String getLivingSound()
-    {
-        return "mob.chicken";
-    }
-
-    @Override
-	protected String getHurtSound()
-    {
-        return "mob.chickenhurt";
-    }
-
-    @Override
-	protected String getDeathSound()
-    {
-        return "mob.chickenhurt";
-    }
-    public boolean field_753_a;
-    public float field_752_b;
-    public float destPos;
-    public float field_757_d;
-    public float field_756_e;
-    public float field_755_h;
-    public int timeUntilNextEgg;
-}
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntitySquid.java b/src/main/java/net/minecraft/core/entity/animal/EntitySquid.java
deleted file mode 100644
index cdf580f08..000000000
--- a/src/main/java/net/minecraft/core/entity/animal/EntitySquid.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package net.minecraft.core.entity.animal;
-
-// Referenced classes of package net.minecraft.src:
-//            EntityWaterMob, ItemStack, Item, AxisAlignedBB, 
-//            Material, World, MathHelper, NBTTagCompound, 
-//            EntityPlayer
-
-import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.util.collection.NamespaceID;
-import net.minecraft.core.util.helper.DamageType;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.World;
-
-public class EntitySquid extends EntityWaterAnimal
-{
-
-    public EntitySquid(World world)
-    {
-        super(world);
-        newPitch = 0.0F;
-        prevPitch = 0.0F;
-        newYaw = 0.0F;
-        prevYaw = 0.0F;
-        animationProgress = 0.0F;
-        prevAnimationProgress = 0.0F;
-        newLimbAngle = 0.0F;
-        limbAnglePrev = 0.0F;
-        randomMotionSpeed = 0.0F;
-        animationVelocity = 0.0F;
-        field_21079_m = 0.0F;
-        randomMotionVecX = 0.0F;
-        randomMotionVecY = 0.0F;
-        randomMotionVecZ = 0.0F;
-        tickOutOfWater = 5;
-        isInWater();
-        textureIdentifier = new NamespaceID("minecraft", "squid");
-        setSize(0.95F, 0.95F);
-        animationVelocity = (1.0F / (random.nextFloat() + 1.0F)) * 0.2F;
-        mobDrops.add(new WeightedRandomLootObject(Item.dye.getDefaultStack(), 1, 3));
-    }
-
-    @Override
-	protected String getHurtSound()
-    {
-        return null;
-    }
-
-    @Override
-	protected String getDeathSound()
-    {
-        return null;
-    }
-
-    @Override
-	public boolean isInWater()
-    {
-        return wasInWater;
-//        if (world == null) return false;
-//        boolean flag = world.handleMaterialAcceleration(bb.expand(0.0D, -0.6D, 0.0D), Material.water, this);
-//        if (!flag){
-//            tickOutOfWater += 1;
-//        } else {
-//            tickOutOfWater = 0;
-//        }
-//        return tickOutOfWater <= 5;
-    }
-
-    @Override
-	public void onLivingUpdate()
-    {
-        super.onLivingUpdate();
-        prevPitch = newPitch;
-        prevYaw = newYaw;
-        prevAnimationProgress = animationProgress;
-        limbAnglePrev = newLimbAngle;
-        animationProgress += animationVelocity;
-        if(animationProgress > MathHelper.PI * 2)
-        {
-            animationProgress = 0;
-            if(random.nextInt(10) == 9)
-            {
-                animationVelocity = (1.0F / (random.nextFloat() + 1.0F)) * 0.2F;
-            }
-        }
-        if(isInWater())
-        {
-            if(animationProgress < MathHelper.PI) // Speed burst
-            {
-                float f = animationProgress / MathHelper.PI; // 0-1
-                newLimbAngle = MathHelper.sin(f * f * MathHelper.PI) * MathHelper.PI * 0.25F;
-                if((double)f > 0.75D)
-                {
-                    randomMotionSpeed = 1.0F;
-                    field_21079_m = 1.0F;
-                } else
-                {
-                    field_21079_m *= 0.8F;
-                }
-            } else // Drift
-            {
-                newLimbAngle = 0.0F;
-                randomMotionSpeed *= 0.9F;
-                field_21079_m *= 0.99F;
-            }
-            if(!isMultiplayerEntity)
-            {
-                xd = randomMotionVecX * randomMotionSpeed;
-                yd = randomMotionVecY * randomMotionSpeed;
-                zd = randomMotionVecZ * randomMotionSpeed;
-            }
-            float horizontalSpeed = MathHelper.sqrt_double(xd * xd + zd * zd);
-            renderYawOffset += ((-(float) Math.atan2(xd, zd) * 180F) / MathHelper.PI - renderYawOffset) * 0.1F;
-            yRot = renderYawOffset;
-            newYaw += MathHelper.PI * field_21079_m * 1.5F;
-            newPitch += ((-(float) Math.atan2(horizontalSpeed, yd) * 180F) / MathHelper.PI - newPitch) * 0.1F;
-        } else
-        {
-            newLimbAngle = MathHelper.abs(MathHelper.sin(animationProgress)) * MathHelper.PI * 0.25F;
-
-            if(!isMultiplayerEntity)
-            {
-                xd = 0.0D;
-                yd -= 0.08D;
-                yd *= 0.98D;
-                zd = 0.0D;
-            }
-            newPitch += (double)(-90F - newPitch) * 0.02D;
-        }
-    }
-    @Override
-    public void trySuffocate(){
-        if(isAlive() && !isUnderLiquid(Material.water) && canBreatheUnderwater())
-        {
-            airSupply--;
-            if(airSupply == -20)
-            {
-                airSupply = 0;
-                hurt(null, 2, DamageType.DROWN);
-            }
-            remainingFireTicks = 0;
-        } else
-        {
-            airSupply = airMaxSupply;
-        }
-    }
-
-    @Override
-	public void moveEntityWithHeading(float moveStrafing, float moveForward)
-    {
-        move(xd, yd, zd);
-    }
-
-    @Override
-	protected void updatePlayerActionState()
-    {
-        if(random.nextInt(50) == 0 || !wasInWater || randomMotionVecX == 0.0F && randomMotionVecY == 0.0F && randomMotionVecZ == 0.0F)
-        {
-            float f = random.nextFloat() * MathHelper.PI * 2.0F;
-            randomMotionVecX = MathHelper.cos(f) * 0.2F;
-            Block upwardsBlock = world.getBlock((int) x, (int) y + 3, (int) z);
-            Block downwardsBlock = world.getBlock((int) x, (int) y - 3, (int) z);
-
-            boolean isTouchingBlock = isTouchingBlock();
-
-            if (isTouchingBlock && isInWater() && !world.isAirBlock((int) x, (int) (y + 1), (int) z) && !world.isAirBlock((int) x, (int) (y + 2), (int) z)){
-                randomMotionVecY = random.nextFloat() * 0.2F;
-            } else {
-                if (upwardsBlock == null || upwardsBlock.blockMaterial != Material.water){
-                    randomMotionVecY = -0.15F + random.nextFloat() * 0.2F; // Swim with bias down
-                } else if (downwardsBlock == null || downwardsBlock.blockMaterial != Material.water) {
-                    randomMotionVecY = -0.05F + random.nextFloat() * 0.4F; // Swim with bias up
-                } else {
-                    randomMotionVecY = -0.1F + random.nextFloat() * 0.2F; // Swim with no bias
-                }
-            }
-
-            randomMotionVecZ = MathHelper.sin(f) * 0.2F;
-        }
-        tryToDespawn();
-    }
-    public boolean isTouchingBlock(){
-        int minX = MathHelper.floor_double(bb.minX - 0.25D);
-        int minY = MathHelper.floor_double(bb.minY - 0.25D);
-        int minZ = MathHelper.floor_double(bb.minZ - 0.25D);
-        int maxX = MathHelper.floor_double(bb.maxX + 0.25D);
-        int maxY = MathHelper.floor_double(bb.maxY + 0.25D);
-        int maxZ = MathHelper.floor_double(bb.maxZ + 0.25D);
-        if(world.areBlocksLoaded(minX, minY, minZ, maxX, maxY, maxZ))
-        {
-            for(int _x = minX; _x <= maxX; _x++)
-            {
-                for(int _y = minY; _y <= maxY; _y++)
-                {
-                    for(int _z = minZ; _z <= maxZ; _z++)
-                    {
-                        int blockId = world.getBlockId(_x, _y, _z);
-                        if(blockId != 0 && Block.blocksList[blockId].blockMaterial != Material.water)
-                        {
-                            return true;
-                        }
-                    }
-
-                }
-
-            }
-
-        }
-        return false;
-    }
-    
-    @Override
-    protected boolean makeStepSound() {
-    	return false;
-    }
-
-    public float newPitch;
-    public float prevPitch;
-    public float newYaw;
-    public float prevYaw;
-    public float animationProgress;
-    public float prevAnimationProgress;
-    public float newLimbAngle;
-    public float limbAnglePrev;
-    private float randomMotionSpeed;
-    private float animationVelocity;
-    private float field_21079_m;
-    private float randomMotionVecX;
-    private float randomMotionVecY;
-    private float randomMotionVecZ;
-    private int tickOutOfWater;
-}
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityFireflyCluster.java b/src/main/java/net/minecraft/core/entity/animal/FireflyClusterMob.java
similarity index 89%
rename from src/main/java/net/minecraft/core/entity/animal/EntityFireflyCluster.java
rename to src/main/java/net/minecraft/core/entity/animal/FireflyClusterMob.java
index 434fda998..657bebcb7 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityFireflyCluster.java
+++ b/src/main/java/net/minecraft/core/entity/animal/FireflyClusterMob.java
@@ -4,7 +4,7 @@ import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityFlying;
+import net.minecraft.core.entity.FlyingMob;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
@@ -17,9 +17,12 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class EntityFireflyCluster extends EntityFlying
-        implements IAnimal
+public class FireflyClusterMob extends FlyingMob
+        implements Creature
 {
+	public static final int DATA_COLOR_ID = 16;
+	public static final int DATA_CLUSTER_SIZE_ID = 17;
+	public static final int DATA_COUNT_ID = 18;
 	public final int maxLifetime = 12000;
 	public final int maxClusterSize = 6;
     public final int slowUpdateCooldownMax = 500;
@@ -36,7 +39,7 @@ public class EntityFireflyCluster extends EntityFlying
     private int slowUpdateCooldown;
     
     
-    public EntityFireflyCluster(World world)
+    public FireflyClusterMob(World world)
     {
         super(world);
         if(world == null || world.isClientSide) {
@@ -60,7 +63,7 @@ public class EntityFireflyCluster extends EntityFlying
 
 	@Override
 	public void spawnInit() {
-		super.init();
+		super.defineSynchedData();
 		Biome currentBiome = world.getBlockBiome((int) x, (int) y, (int) z);
 		FireflyColor color = null;
 
@@ -135,42 +138,39 @@ public class EntityFireflyCluster extends EntityFlying
     }
 
     @Override
-    protected void init()
+    protected void defineSynchedData()
     {
-        super.init();
-
-		// Color
-		entityData.define(16, (byte) 0);
-		// Cluster Size
-		entityData.define(17, (byte) 0);
-		// Firefly Count
-		entityData.define(18, (byte) 0);
+        super.defineSynchedData();
+
+		entityData.define(DATA_COLOR_ID, (byte) 0);
+		entityData.define(DATA_CLUSTER_SIZE_ID, (byte) 0);
+		entityData.define(DATA_COUNT_ID, (byte) 0);
     }
 
 	public void setColor(FireflyColor colour) {
-		entityData.set(16, (byte) colour.getId());
+		entityData.set(DATA_COLOR_ID, (byte) colour.getId());
 	}
 
 	public FireflyColor getColor() {
-		int id = entityData.getByte(16);
+		int id = entityData.getByte(DATA_COLOR_ID);
 		return FireflyColor.fireFlyColors.get(id);
 	}
 	
 	public void setClusterSize(int clusterSize) {
-		entityData.set(17, (byte) clusterSize);
+		entityData.set(DATA_CLUSTER_SIZE_ID, (byte) clusterSize);
 		setSizeBasedOnClusterSize(clusterSize);
 	}
 	
 	public int getClusterSize() {
-		return entityData.getByte(17) & 0xFF;
+		return entityData.getByte(DATA_CLUSTER_SIZE_ID) & 0xFF;
 	}
 	
 	public void setFireflyCount(int fireflyCount) {
-		entityData.set(18, (byte) fireflyCount);
+		entityData.set(DATA_COUNT_ID, (byte) fireflyCount);
 	}
 	
 	public int getFireflyCount() {
-		return entityData.getByte(18) & 0xFF;
+		return entityData.getByte(DATA_COUNT_ID) & 0xFF;
 	}
     
 //    private boolean isCourseTraversable(double waypointX, double waypointY, double waypointZ, double distanceFromEntity)
@@ -193,7 +193,7 @@ public class EntityFireflyCluster extends EntityFlying
 //    }
 
     @Override
-    protected void updatePlayerActionState()
+    protected void updateAI()
     {
         //After 5 minutes, firefly changes color to match biome
         
@@ -226,11 +226,11 @@ public class EntityFireflyCluster extends EntityFlying
     }
 
     @Override
-    public boolean getCanSpawnHere()
+    public boolean canSpawnHere()
     {
-        int x = MathHelper.floor_double(this.x);
-        int y = MathHelper.floor_double(bb.minY);
-        int z = MathHelper.floor_double(this.z);
+        int x = MathHelper.floor(this.x);
+        int y = MathHelper.floor(bb.minY);
+        int z = MathHelper.floor(this.z);
         int id = world.getBlockId(x, y - 1, z);
 
 		if (shouldRemove()) return false;
@@ -242,7 +242,7 @@ public class EntityFireflyCluster extends EntityFlying
         if(world.getCurrentWeather() != null && world.getCurrentWeather().doMobsSpawnInDaylight)
             blockLight = blockLight/2;
 
-        return  blockLight <= 4 && (Block.blocksList[id] != null && Block.blocksList[id].hasTag(BlockTags.FIREFLIES_CAN_SPAWN)) && world.checkIfAABBIsClear(bb.expand(-2f, 0f, -2f));
+        return  blockLight <= 4 && (Block.blocksList[id] != null && Block.blocksList[id].hasTag(BlockTags.FIREFLIES_CAN_SPAWN)) && world.checkIfAABBIsClear(bb.grow(-2f, 0f, -2f));
     }
 
     @Override
@@ -347,9 +347,9 @@ public class EntityFireflyCluster extends EntityFlying
 			expandIfPossible();
 		}
 		
-		int blockX = MathHelper.floor_double(x);
-		int blockY = MathHelper.floor_double(y);
-		int blockZ = MathHelper.floor_double(z);
+		int blockX = MathHelper.floor(x);
+		int blockY = MathHelper.floor(y);
+		int blockZ = MathHelper.floor(z);
 		FireflyColor colorForBiome = getColourForBiome(world.getBlockBiome(blockX, blockY, blockZ));
 		if(colorForBiome != this.getColor()) {
 			setColor(colorForBiome);
@@ -359,7 +359,7 @@ public class EntityFireflyCluster extends EntityFlying
 	private void merge() {
 		slowUpdateCooldown = slowUpdateCooldownMax;
 		
-		List<Entity> nearbyFireflies = world.getEntitiesWithinAABB(getClass(), bb.expand(2, 2, 2));
+		List<Entity> nearbyFireflies = world.getEntitiesWithinAABB(getClass(), bb.grow(2, 2, 2));
 		int nearbyCount = nearbyFireflies.size();
 		
 		if(nearbyCount == 1) {
@@ -369,10 +369,10 @@ public class EntityFireflyCluster extends EntityFlying
 		
 		for(int i=0; i < nearbyCount; i++) {
 			Entity entity = nearbyFireflies.get(i);
-			if(entity == this || !(entity instanceof EntityFireflyCluster)) {
+			if(entity == this || !(entity instanceof FireflyClusterMob)) {
 				continue;
 			}
-			EntityFireflyCluster fireflyCluster = (EntityFireflyCluster) entity;
+			FireflyClusterMob fireflyCluster = (FireflyClusterMob) entity;
 			if(fireflyCluster.getColor() != this.getColor()) {
 				continue;
 			}
@@ -390,7 +390,7 @@ public class EntityFireflyCluster extends EntityFlying
 		}
 	}
 	
-	private void merge(EntityFireflyCluster from, EntityFireflyCluster to) {
+	private void merge(FireflyClusterMob from, FireflyClusterMob to) {
 		if(from.getFireflyCount() + to.getFireflyCount() < maxFireflyCountPerCluster) {
 			to.setFireflyCount(to.getFireflyCount() + from.getFireflyCount());
 			from.remove();
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityPig.java b/src/main/java/net/minecraft/core/entity/animal/PigMob.java
similarity index 57%
rename from src/main/java/net/minecraft/core/entity/animal/EntityPig.java
rename to src/main/java/net/minecraft/core/entity/animal/PigMob.java
index 068acdc77..6dd14e84a 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityPig.java
+++ b/src/main/java/net/minecraft/core/entity/animal/PigMob.java
@@ -2,16 +2,16 @@ package net.minecraft.core.entity.animal;
 
 
 // Referenced classes of package net.minecraft.src:
-//            EntityAnimal, DataWatcher, NBTTagCompound, World, 
-//            EntityPlayer, Item, EntityPigZombie, AchievementList, 
-//            EntityLightningBolt
+//            Animal, DataWatcher, NBTTagCompound, World,
+//            Player, Item, ZombiePigMob, Achievements,
+//            LightningEntity
 
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.entity.EntityLightningBolt;
-import net.minecraft.core.entity.monster.EntityPigZombie;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.entity.monster.ZombiePigMob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.world.World;
@@ -19,22 +19,22 @@ import net.minecraft.core.world.World;
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityPig extends EntityAnimal
+public class PigMob extends Animal
 {
+    public static final int DATA_SADDLE_ID = 16;
 
-    public EntityPig(World world)
+    public PigMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "pig");
         setSize(0.9F, 0.9F);
-        mobDrops.add(new WeightedRandomLootObject(Item.foodPorkchopRaw.getDefaultStack(), 1, 2));
-        burningMobDrops.add(new WeightedRandomLootObject(Item.foodPorkchopCooked.getDefaultStack(), 1, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.FOOD_PORKCHOP_RAW.getDefaultStack(), 1, 2));
+        burningMobDrops.add(new WeightedRandomLootObject(Items.FOOD_PORKCHOP_COOKED.getDefaultStack(), 1, 2));
     }
 
     @Override
-	protected void init()
-    {
-        entityData.define(16, Byte.valueOf((byte)0));
+	protected void defineSynchedData() {
+        entityData.define(DATA_SADDLE_ID, Byte.valueOf((byte)0));
     }
 
     @Override
@@ -70,7 +70,7 @@ public class EntityPig extends EntityAnimal
     }
 
     @Override
-	public boolean interact(EntityPlayer entityplayer)
+	public boolean interact(Player entityplayer)
     {
         if (super.interact(entityplayer)) return true;
         if (getSaddled() && !world.isClientSide && (passenger == null || passenger == entityplayer))
@@ -85,12 +85,12 @@ public class EntityPig extends EntityAnimal
     }
 
     @Override
-	protected void dropFewItems()
+	protected void dropDeathItems()
     {
         if(getSaddled()){
-            spawnAtLocation(Item.saddle.id, 1);
+            spawnAtLocation(Items.SADDLE.id, 1);
         }
-        super.dropFewItems();
+        super.dropDeathItems();
     }
 
     @Override
@@ -107,43 +107,36 @@ public class EntityPig extends EntityAnimal
 
     public boolean getSaddled()
     {
-        return (entityData.getByte(16) & 1) != 0;
+        return (entityData.getByte(DATA_SADDLE_ID) & 1) != 0;
     }
 
     public void setSaddled(boolean flag)
     {
         if(flag)
         {
-            entityData.set(16, Byte.valueOf((byte)1));
+            entityData.set(DATA_SADDLE_ID, Byte.valueOf((byte)1));
         } else
         {
-            entityData.set(16, Byte.valueOf((byte)0));
+            entityData.set(DATA_SADDLE_ID, Byte.valueOf((byte)0));
         }
     }
 
     @Override
-	public void thunderHit(EntityLightningBolt bolt)
+	public void thunderHit(LightningEntity bolt)
     {
-        if(world.isClientSide)
-        {
-            return;
-        } else
-        {
-            EntityPigZombie entitypigzombie = new EntityPigZombie(world);
+        if (!world.isClientSide) {
+            ZombiePigMob entitypigzombie = new ZombiePigMob(world);
             entitypigzombie.moveTo(x, y, z, yRot, xRot);
             world.entityJoinedWorld(entitypigzombie);
             remove();
-            return;
         }
     }
 
     @Override
-	protected void causeFallDamage(float f)
-    {
-        super.causeFallDamage(f);
-        if(f > 5F && (passenger instanceof EntityPlayer))
-        {
-            ((EntityPlayer) passenger).triggerAchievement(AchievementList.FLY_PIG);
+	protected void causeFallDamage(float distance) {
+        super.causeFallDamage(distance);
+        if(distance > 5F && (passenger instanceof Player)) {
+            ((Player) passenger).triggerAchievement(Achievements.FLY_PIG);
         }
     }
     public List<WeightedRandomLootObject> burningMobDrops = new ArrayList<>();
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntitySheep.java b/src/main/java/net/minecraft/core/entity/animal/SheepMob.java
similarity index 56%
rename from src/main/java/net/minecraft/core/entity/animal/EntitySheep.java
rename to src/main/java/net/minecraft/core/entity/animal/SheepMob.java
index 797bdabb8..4055780ce 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntitySheep.java
+++ b/src/main/java/net/minecraft/core/entity/animal/SheepMob.java
@@ -1,29 +1,28 @@
 package net.minecraft.core.entity.animal;
 
+import com.mojang.nbt.CompoundTag;
 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.block.Blocks;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
-import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.item.ItemToolShears;
+import net.minecraft.core.item.ToolShearsItem;
 import net.minecraft.core.util.collection.NamespaceID;
-import net.minecraft.core.world.World;
-import net.minecraft.core.util.helper.DamageType;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-// Referenced classes of package net.minecraft.src:
-//            EntityAnimal, DataWatcher, ItemStack, Block, 
-//            EntityPlayer, InventoryPlayer, Item, ItemShears, 
-//            World, EntityItem, NBTTagCompound, Entity
-
-public class EntitySheep extends EntityAnimal
+public class SheepMob extends Animal
 {
+    public static final int DATA_WOOL_STATE_ID = 16;
+    public static final int MASK_WOOL_COLOR = 0b0000_1111;
+    public static final int MASK_SHEARED = 0b0001_0000;
+    public static final int DATA_EATING_ID = 17;
 
-    public EntitySheep(World world)
+    public SheepMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "sheep");
@@ -31,48 +30,40 @@ public class EntitySheep extends EntityAnimal
     }
 
     @Override
-    protected void init()
+    protected void defineSynchedData()
     {
-        super.init();
-        entityData.define(16, (byte) 0);
-        entityData.define(17, (byte) 0);
+        super.defineSynchedData();
+        entityData.define(DATA_WOOL_STATE_ID, (byte) 0);
+        entityData.define(DATA_EATING_ID, (byte) 0);
     }
 
     @Override
     public void spawnInit()
     {
-        super.init();
         setFleeceColor(getRandomFleeceColor(random));
     }
-
-    @Override
-    public boolean hurt(Entity attacker, int i, DamageType type)
-    {
-        return super.hurt(attacker, i, type);
-    }
-
     @Override
-    protected void dropFewItems()
+    protected void dropDeathItems()
     {
-        super.dropFewItems();
+        super.dropDeathItems();
         if(!getSheared())
         {
-            spawnAtLocation(new ItemStack(Block.wool.id, 1, getFleeceColor()), 0.0F);
+            spawnAtLocation(new ItemStack(Blocks.WOOL.id, 1, getFleeceColor().blockMeta), 0.0F);
         }
     }
     @Override
-    public boolean interact(EntityPlayer entityplayer)
+    public boolean interact(Player entityplayer)
     {
         if (super.interact(entityplayer)) return true;
         ItemStack itemstack = entityplayer.inventory.getCurrentItem();
         if(itemstack != null)
         {
-            if (itemstack.getItem() instanceof ItemToolShears && !getSheared()){
+            if (itemstack.getItem() instanceof ToolShearsItem && !getSheared()){
                 if(!world.isClientSide) {
                     setSheared(true);
                     int count = 2 + random.nextInt(3);
                     for (int j = 0; j < count; j++) {
-                        EntityItem entityitem = spawnAtLocation(new ItemStack(Block.wool.id, 1, getFleeceColor()), 1.0F);
+                        ItemEntity entityitem = spawnAtLocation(new ItemStack(Blocks.WOOL.id, 1, getFleeceColor().blockMeta), 1.0F);
                         entityitem.yd += random.nextFloat() * 0.05F;
                         entityitem.xd += (random.nextFloat() - random.nextFloat()) * 0.1F;
                         entityitem.zd += (random.nextFloat() - random.nextFloat()) * 0.1F;
@@ -93,7 +84,7 @@ public class EntitySheep extends EntityAnimal
     {
         super.addAdditionalSaveData(tag);
         tag.putBoolean("Sheared", getSheared());
-        tag.putByte("Color", (byte)getFleeceColor());
+        tag.putByte("Color", (byte)getFleeceColor().blockMeta);
         tag.putShort("GrowthTimer", (short) growthTimer);
     }
 
@@ -102,7 +93,7 @@ public class EntitySheep extends EntityAnimal
     {
         super.readAdditionalSaveData(tag);
         setSheared(tag.getBoolean("Sheared"));
-        setFleeceColor(tag.getByte("Color"));
+        setFleeceColor(DyeColor.colorFromBlockMeta(tag.getByte("Color")));
         setGrowthTimer(tag.getShort("GrowthTimer"));
     }
 
@@ -114,12 +105,12 @@ public class EntitySheep extends EntityAnimal
 
     public boolean getIsSheepEating()
     {
-        return entityData.getByte(17) != 0;
+        return entityData.getByte(DATA_EATING_ID) != 0;
     }
 
     protected void setIsSheepEating(boolean value)
     {
-        entityData.set(17, (byte)(value ? 1 : 0));
+        entityData.set(DATA_EATING_ID, (byte)(value ? 1 : 0));
     }
 
     @Override
@@ -132,13 +123,13 @@ public class EntitySheep extends EntityAnimal
 
 		
 		if (growthTimer > 400) {
-			int blockX = MathHelper.floor_double(x);
-			int blockY = MathHelper.floor_double(y);
-			int blockZ = MathHelper.floor_double(z);
+			int blockX = MathHelper.floor(x);
+			int blockY = MathHelper.floor(y);
+			int blockZ = MathHelper.floor(z);
 			Block blockBelow = world.getBlock(blockX, blockY - 1, blockZ);
 			
 			growthTimer = 0;
-			if (blockBelow == Block.grass || blockBelow == Block.grassRetro) {
+			if (blockBelow == Blocks.GRASS || blockBelow == Blocks.GRASS_RETRO) {
 				if(!world.isClientSide) {
 					setIsSheepEating(true);
 				}
@@ -149,22 +140,22 @@ public class EntitySheep extends EntityAnimal
 		}
 
 		if (getIsSheepEating()) {
-			int blockX = MathHelper.floor_double(x);
-			int blockY = MathHelper.floor_double(y);
-			int blockZ = MathHelper.floor_double(z);
+			int blockX = MathHelper.floor(x);
+			int blockY = MathHelper.floor(y);
+			int blockZ = MathHelper.floor(z);
 			Block blockBelow = world.getBlock(blockX, blockY - 1, blockZ);
 			
 			if (timeSheepEating >= 5 && timeSheepEating <= 35 && timeSheepEating % 5 == 0 && !world.isClientSide) {
-				world.playBlockSoundEffect(null, x + 0.5, y + 0.5, z + 0.5, Block.grass, EnumBlockSoundEffectType.DIG);
+				world.playBlockSoundEffect(null, x + 0.5, y + 0.5, z + 0.5, Blocks.GRASS, EnumBlockSoundEffectType.DIG);
 			}
 			
 			prevTimeSheepEating = timeSheepEating;
 			timeSheepEating++;
 			if (prevTimeSheepEating == 35) {
-				if(blockBelow == Block.grass || blockBelow == Block.grassRetro) {
+				if(blockBelow == Blocks.GRASS || blockBelow == Blocks.GRASS_RETRO) {
 					if(!world.isClientSide) {
 						world.playSoundEffect(null, 2001, (int) x, (int) y - 1, (int) z, world.getBlockId((int) x, (int) y - 1, (int) z));
-						world.setBlockWithNotify(blockX, blockY - 1, blockZ, Block.dirt.id);
+						world.setBlockWithNotify(blockX, blockY - 1, blockZ, Blocks.DIRT.id);
 						setSheared(false);
 					}
 				}
@@ -198,90 +189,73 @@ public class EntitySheep extends EntityAnimal
         return "mob.sheep";
     }
 
-    public int getFleeceColor()
+    public DyeColor getFleeceColor()
     {
-        return entityData.getByte(16) & 0xf;
+        return DyeColor.colorFromBlockMeta(entityData.getByte(DATA_WOOL_STATE_ID) & MASK_WOOL_COLOR);
     }
 
-    public void setFleeceColor(int i)
+    public void setFleeceColor(DyeColor color)
     {
-        byte byte0 = entityData.getByte(16);
-        entityData.set(16, Byte.valueOf((byte)(byte0 & 0xf0 | i & 0xf)));
+        byte woolState = entityData.getByte(DATA_WOOL_STATE_ID);
+        entityData.set(16, (byte) (woolState & ~MASK_WOOL_COLOR | color.blockMeta & MASK_WOOL_COLOR));
     }
 
     public boolean getSheared()
     {
-        return (entityData.getByte(16) & 0x10) != 0;
+        return (entityData.getByte(DATA_WOOL_STATE_ID) & MASK_SHEARED) != 0;
     }
 
     public void setSheared(boolean flag)
     {
-        byte byte0 = entityData.getByte(16);
+        byte woolState = entityData.getByte(DATA_WOOL_STATE_ID);
         if(flag)
         {
-            entityData.set(16, (byte) (byte0 | 0x10));
+            entityData.set(DATA_WOOL_STATE_ID, (byte) (woolState | MASK_SHEARED));
         } else
         {
-            entityData.set(16, (byte) (byte0 & 0xffffffef));
+            entityData.set(DATA_WOOL_STATE_ID, (byte) (woolState & ~MASK_SHEARED));
         }
     }
 
-    public static int getRandomFleeceColor(Random random)
+    public static DyeColor getRandomFleeceColor(Random random)
     {
         int i = random.nextInt(100);
         if(i < 5)
         {
-            return 15;
+            return DyeColor.BLACK;
         }
         if(i < 10)
         {
-            return 7;
+            return DyeColor.GRAY;
         }
         if(i < 15)
         {
-            return 8;
+            return DyeColor.SILVER;
         }
         if(i < 18)
         {
-            return 12;
+            return DyeColor.BROWN;
         }
-        return random.nextInt(500) != 0 ? 0 : 6;
+        return random.nextInt(500) != 0 ? DyeColor.WHITE : DyeColor.PINK;
     }
 
-    public static final float[][] fleeceColorTable = {
-        {
-            1.0F, 1.0F, 1.0F
-        }, {
-            0.95F, 0.7F, 0.2F
-        }, {
-            0.9F, 0.5F, 0.85F
-        }, {
-            0.6F, 0.7F, 0.95F
-        }, {
-            0.9F, 0.9F, 0.2F
-        }, {
-            0.5F, 0.8F, 0.1F
-        }, {
-            0.95F, 0.7F, 0.8F
-        }, {
-            0.3F, 0.3F, 0.3F
-        }, {
-            0.6F, 0.6F, 0.6F
-        }, {
-            0.3F, 0.6F, 0.7F
-        }, {
-            0.7F, 0.4F, 0.9F
-        }, {
-            0.2F, 0.4F, 0.8F
-        }, {
-            0.5F, 0.4F, 0.3F
-        }, {
-            0.4F, 0.5F, 0.2F
-        }, {
-            0.8F, 0.3F, 0.3F
-        }, {
-            0.1F, 0.1F, 0.1F
-        }
+    public static final float[][] FLEECE_COLOR_TABLE = {
+        {  1.0F,  1.0F,  1.0F  }, // White
+        {  0.95F, 0.7F,  0.2F  }, // Orange
+        {  0.9F,  0.5F,  0.85F }, // Magenta
+        {  0.6F,  0.7F,  0.95F }, // Light Blue
+        {  0.9F,  0.9F,  0.2F  }, // Yellow
+        {  0.5F,  0.8F,  0.1F  }, // Lime
+        {  0.95F, 0.7F,  0.8F  }, // Pink
+        {  0.3F,  0.3F,  0.3F  }, // Grey
+        {  0.6F,  0.6F,  0.6F  }, // Silver
+        {  0.3F,  0.6F,  0.7F  }, // Cyan
+        {  0.7F,  0.4F,  0.9F  }, // Purple
+        {  0.2F,  0.4F,  0.8F  }, // Blue
+        {  0.5F,  0.4F,  0.3F  }, // Brown
+        {  0.4F,  0.5F,  0.2F  }, // Green
+        {  0.8F,  0.3F,  0.3F  }, // Red
+        {  0.1F,  0.1F,  0.1F  }  // Black
     };
 
     public void setGrowthTimer(int growthTimer){
diff --git a/src/main/java/net/minecraft/core/entity/animal/SquidMob.java b/src/main/java/net/minecraft/core/entity/animal/SquidMob.java
new file mode 100644
index 000000000..1ee9c5d3a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/animal/SquidMob.java
@@ -0,0 +1,217 @@
+package net.minecraft.core.entity.animal;
+
+// Referenced classes of package net.minecraft.src:
+//            EntityWaterMob, ItemStack, Item, AxisAlignedBB, 
+//            Material, World, MathHelper, NBTTagCompound, 
+//            Player
+
+import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.collection.NamespaceID;
+import net.minecraft.core.util.helper.DamageType;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class SquidMob extends WaterAnimal
+{
+    public float xBodyRot;
+    public float xBodyRotO;
+    public float zBodyRot;
+    public float zBodyRotO;
+    public float tentacleMovement;
+    public float oldTentacleMovement;
+    public float tentacleAngle;
+    public float oldTentacleAngle;
+    private float _speed;
+    private float tentacleSpeed;
+    private float rotateSpeed;
+    private float tx;
+    private float ty;
+    private float tz;
+
+    public SquidMob(World world)
+    {
+        super(world);
+        xBodyRot = 0.0F;
+        xBodyRotO = 0.0F;
+        zBodyRot = 0.0F;
+        zBodyRotO = 0.0F;
+        tentacleMovement = 0.0F;
+        oldTentacleMovement = 0.0F;
+        tentacleAngle = 0.0F;
+        oldTentacleAngle = 0.0F;
+        _speed = 0.0F;
+        tentacleSpeed = 0.0F;
+        rotateSpeed = 0.0F;
+        tx = 0.0F;
+        ty = 0.0F;
+        tz = 0.0F;
+        isInWater();
+        textureIdentifier = new NamespaceID("minecraft", "squid");
+        setSize(0.95F, 0.95F);
+        tentacleSpeed = (1.0F / (random.nextFloat() + 1.0F)) * 0.2F;
+        mobDrops.add(new WeightedRandomLootObject(Items.DYE.getDefaultStack(), 1, 3));
+    }
+
+    @Override
+	protected String getHurtSound()
+    {
+        return null;
+    }
+
+    @Override
+	protected String getDeathSound()
+    {
+        return null;
+    }
+
+    @Override
+	public void onLivingUpdate()
+    {
+        super.onLivingUpdate();
+        xBodyRotO = xBodyRot;
+        zBodyRotO = zBodyRot;
+        oldTentacleMovement = tentacleMovement;
+        oldTentacleAngle = tentacleAngle;
+        tentacleMovement += tentacleSpeed;
+        if(tentacleMovement > MathHelper.PI * 2)
+        {
+            tentacleMovement = 0;
+            if(random.nextInt(10) == 9)
+            {
+                tentacleSpeed = (1.0F / (random.nextFloat() + 1.0F)) * 0.2F;
+            }
+        }
+        if(isInWater())
+        {
+            if(tentacleMovement < MathHelper.PI) // Speed burst
+            {
+                float f = tentacleMovement / MathHelper.PI; // 0-1
+                tentacleAngle = MathHelper.sin(f * f * MathHelper.PI) * MathHelper.PI * 0.25F;
+                if((double)f > 0.75D)
+                {
+                    _speed = 1.0F;
+                    rotateSpeed = 1.0F;
+                } else
+                {
+                    rotateSpeed *= 0.8F;
+                }
+            } else // Drift
+            {
+                tentacleAngle = 0.0F;
+                _speed *= 0.9F;
+                rotateSpeed *= 0.99F;
+            }
+            if(!isMultiplayerEntity)
+            {
+                xd = tx * _speed;
+                yd = ty * _speed;
+                zd = tz * _speed;
+            }
+            float horizontalSpeed = MathHelper.sqrt(xd * xd + zd * zd);
+            yBodyRot += ((-(float) Math.atan2(xd, zd) * 180F) / MathHelper.PI - yBodyRot) * 0.1F;
+            yRot = yBodyRot;
+            zBodyRot += MathHelper.PI * rotateSpeed * 1.5F;
+            xBodyRot += ((-(float) Math.atan2(horizontalSpeed, yd) * 180F) / MathHelper.PI - xBodyRot) * 0.1F;
+        } else
+        {
+            tentacleAngle = MathHelper.abs(MathHelper.sin(tentacleMovement)) * MathHelper.PI * 0.25F;
+
+            if(!isMultiplayerEntity)
+            {
+                xd = 0.0D;
+                yd -= 0.08D;
+                yd *= 0.98D;
+                zd = 0.0D;
+            }
+            xBodyRot += (double)(-90F - xBodyRot) * 0.02D;
+        }
+    }
+    @Override
+    public void trySuffocate(){
+        if(isAlive() && !isUnderLiquid(Material.water) && canBreatheUnderwater())
+        {
+            airSupply--;
+            if(airSupply == -20)
+            {
+                airSupply = 0;
+                hurt(null, 2, DamageType.DROWN);
+            }
+            remainingFireTicks = 0;
+        } else
+        {
+            airSupply = airMaxSupply;
+        }
+    }
+
+    @Override
+	public void moveEntityWithHeading(float moveStrafing, float moveForward)
+    {
+        move(xd, yd, zd);
+    }
+
+    @Override
+	protected void updateAI()
+    {
+        if(random.nextInt(50) == 0 || !wasInWater || tx == 0.0F && ty == 0.0F && tz == 0.0F)
+        {
+            float f = random.nextFloat() * MathHelper.PI * 2.0F;
+            tx = MathHelper.cos(f) * 0.2F;
+            Block upwardsBlock = world.getBlock((int) x, (int) y + 3, (int) z);
+            Block downwardsBlock = world.getBlock((int) x, (int) y - 3, (int) z);
+
+            boolean isTouchingBlock = isTouchingBlock();
+
+            if (isTouchingBlock && isInWater() && !world.isAirBlock((int) x, (int) (y + 1), (int) z) && !world.isAirBlock((int) x, (int) (y + 2), (int) z)){
+                ty = random.nextFloat() * 0.2F;
+            } else {
+                if (upwardsBlock == null || upwardsBlock.blockMaterial != Material.water){
+                    ty = -0.15F + random.nextFloat() * 0.2F; // Swim with bias down
+                } else if (downwardsBlock == null || downwardsBlock.blockMaterial != Material.water) {
+                    ty = -0.05F + random.nextFloat() * 0.4F; // Swim with bias up
+                } else {
+                    ty = -0.1F + random.nextFloat() * 0.2F; // Swim with no bias
+                }
+            }
+
+            tz = MathHelper.sin(f) * 0.2F;
+        }
+        tryToDespawn();
+    }
+    public boolean isTouchingBlock(){
+        int minX = MathHelper.floor(bb.minX - 0.25D);
+        int minY = MathHelper.floor(bb.minY - 0.25D);
+        int minZ = MathHelper.floor(bb.minZ - 0.25D);
+        int maxX = MathHelper.floor(bb.maxX + 0.25D);
+        int maxY = MathHelper.floor(bb.maxY + 0.25D);
+        int maxZ = MathHelper.floor(bb.maxZ + 0.25D);
+        if(world.areBlocksLoaded(minX, minY, minZ, maxX, maxY, maxZ))
+        {
+            for(int _x = minX; _x <= maxX; _x++)
+            {
+                for(int _y = minY; _y <= maxY; _y++)
+                {
+                    for(int _z = minZ; _z <= maxZ; _z++)
+                    {
+                        int blockId = world.getBlockId(_x, _y, _z);
+                        if(blockId != 0 && Block.blocksList[blockId].blockMaterial != Material.water)
+                        {
+                            return true;
+                        }
+                    }
+
+                }
+
+            }
+
+        }
+        return false;
+    }
+    
+    @Override
+    protected boolean makeStepSound() {
+    	return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityWaterAnimal.java b/src/main/java/net/minecraft/core/entity/animal/WaterAnimal.java
similarity index 76%
rename from src/main/java/net/minecraft/core/entity/animal/EntityWaterAnimal.java
rename to src/main/java/net/minecraft/core/entity/animal/WaterAnimal.java
index 4c2536454..7d2f316b4 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityWaterAnimal.java
+++ b/src/main/java/net/minecraft/core/entity/animal/WaterAnimal.java
@@ -4,15 +4,15 @@ package net.minecraft.core.entity.animal;
 // Referenced classes of package net.minecraft.src:
 //            EntityCreature, World, NBTTagCompound
 
-import net.minecraft.core.entity.EntityPathfinder;
+import net.minecraft.core.entity.PathfinderMob;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class EntityWaterAnimal extends EntityPathfinder
-	implements IAnimal
+public class WaterAnimal extends PathfinderMob
+	implements Creature
 {
 
-    public EntityWaterAnimal(World world)
+    public WaterAnimal(World world)
     {
         super(world);
         scoreValue = 10;
@@ -37,13 +37,13 @@ public class EntityWaterAnimal extends EntityPathfinder
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
         return world.checkIfAABBIsClear(bb);
     }
 
     @Override
-	public int getTalkInterval()
+	public int getAmbientSoundInterval()
     {
         return 120;
     }
diff --git a/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java b/src/main/java/net/minecraft/core/entity/animal/WolfMob.java
similarity index 80%
rename from src/main/java/net/minecraft/core/entity/animal/EntityWolf.java
rename to src/main/java/net/minecraft/core/entity/animal/WolfMob.java
index 76adf674b..ac4f3abc3 100644
--- a/src/main/java/net/minecraft/core/entity/animal/EntityWolf.java
+++ b/src/main/java/net/minecraft/core/entity/animal/WolfMob.java
@@ -1,13 +1,14 @@
 package net.minecraft.core.entity.animal;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.item.FoodItem;
+import net.minecraft.core.item.IArmorItem;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemArmor;
-import net.minecraft.core.item.ItemFood;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ArmorMaterial;
 import net.minecraft.core.util.collection.NamespaceID;
@@ -21,15 +22,15 @@ import net.minecraft.core.util.helper.DamageType;
 import java.util.*;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityAnimal, DataWatcher, NBTTagCompound, World, 
-//            EntityPlayer, EntitySheep, AxisAlignedBB, Entity, 
-//            InventoryPlayer, ItemStack, Item, ItemFood, 
-//            MathHelper, EntityArrow, EntityLiving
+//            Animal, DataWatcher, NBTTagCompound, World,
+//            Player, SheepMob, AxisAlignedBB, Entity,
+//            InventoryPlayer, ItemStack, Item, FoodItem,
+//            MathHelper, ArrowProjectile, Mob
 
-public class EntityWolf extends EntityAnimal
+public class WolfMob extends Animal
 {
 
-    public EntityWolf(World world)
+    public WolfMob(World world)
     {
         super(world);
         looksWithInterest = false;
@@ -37,22 +38,22 @@ public class EntityWolf extends EntityAnimal
         setSize(0.8F, 0.8F);
         moveSpeed = 1.1F;
         scoreValue = 500;
+
+        if(!isWolfTamed()){
+            if(random.nextInt(100) == 0){
+                setWolfHeldItem(new ItemStack(Items.RECORD_DOG, 1));
+            }
+        }
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(15, ItemStack.NO_ITEM);
         entityData.define(16, (byte) 0);
         entityData.define(17, "");
         entityData.define(19, "");
-
-        if(!isWolfTamed()){
-            if(random.nextInt(100) == 0){
-                setWolfHeldItem(new ItemStack(Item.recordDog, 1));
-            }
-        }
     }
     @Override
     public boolean sendDeathMessage(Entity entityKilledBy){
@@ -75,8 +76,9 @@ public class EntityWolf extends EntityAnimal
     public void setArmor(ItemStack stack) {
         ArmorMaterial material = null;
         armor = stack;
-        if (stack != null && stack.getItem() instanceof ItemArmor && ARMOR_MATERIALS.containsValue(stack.getItem())){
-            material = ((ItemArmor) stack.getItem()).material;
+        //noinspection SuspiciousMethodCalls
+        if (stack != null && stack.getItem() instanceof IArmorItem && ARMOR_MATERIALS.containsValue(stack.getItem())){
+            material = ((IArmorItem) stack.getItem()).getArmorMaterial();
         }
         if (material == null) {
             entityData.set(19, "");
@@ -96,11 +98,11 @@ public class EntityWolf extends EntityAnimal
     {
         if(isWolfTamed())
         {
-            return "/assets/minecraft/textures/entity/wolf_tame/" + getSkinVariant() + ".png";
+            return "/assets/minecraft/textures/entity/wolf_tame/" + getTextureReference() + ".png";
         }
         else if(isWolfAngry())
         {
-            return "/assets/minecraft/textures/entity/wolf_angry/" + getSkinVariant() + ".png";
+            return "/assets/minecraft/textures/entity/wolf_angry/" + getTextureReference() + ".png";
         }
         else
         {
@@ -128,9 +130,9 @@ public class EntityWolf extends EntityAnimal
     @Override
     public boolean collidesWith(Entity entity)
     {
-        if (entity instanceof EntityPlayer)
+        if (entity instanceof Player)
         {
-            EntityPlayer player = (EntityPlayer) entity;
+            Player player = (Player) entity;
             return !player.username.equalsIgnoreCase(getWolfOwner()) || isWolfSitting();
         }
 
@@ -192,7 +194,7 @@ public class EntityWolf extends EntityAnimal
                         break;
                     }
                 }
-                Item item = ARMOR_MATERIALS.get(material);
+                Item item = ARMOR_MATERIALS.get(material).asItem();
                 setArmor(item.getDefaultStack());
             } else {
                 CompoundTag armorTag = tag.getCompound("Armor");
@@ -257,7 +259,7 @@ public class EntityWolf extends EntityAnimal
     }
 
     @Override
-    protected void dropFewItems()
+    protected void dropDeathItems()
     {
         if(getHeldItem() != null && getHeldItem().stackSize > 0) {
         	spawnAtLocation(getHeldItem(), 0.0f);
@@ -267,15 +269,15 @@ public class EntityWolf extends EntityAnimal
             spawnAtLocation(armor, 0);
             setArmor(null);
         }
-        super.dropFewItems();
+        super.dropDeathItems();
     }
 
     @Override
-	protected void updatePlayerActionState()
+	protected void updateAI()
     {
-        super.updatePlayerActionState();
+        super.updateAI();
 
-        if (getTarget() instanceof EntityItem)
+        if (getTarget() instanceof ItemEntity)
         {
             if (getTarget().isInWater() || getTarget().isInLava() || getTarget().isInWall() || !getTarget().onGround || getTarget().isRemoved())
             {
@@ -285,7 +287,7 @@ public class EntityWolf extends EntityAnimal
 
         if(!hasAttacked && !hasPath() && isWolfTamed() && vehicle == null)
         {
-            EntityPlayer entityplayer = world.getPlayerEntityByName(getWolfOwner());
+            Player entityplayer = world.getPlayerEntityByName(getWolfOwner());
             if(entityplayer != null)
             {
                 float f = entityplayer.distanceTo(this);
@@ -302,7 +304,7 @@ public class EntityWolf extends EntityAnimal
         if(entityToAttack == null && !hasPath())
         {
             if(!isWolfTamed() && world.rand.nextInt(100) == 0){
-                List nearbySheep = world.getEntitiesWithinAABB(EntitySheep.class, AABB.getBoundingBoxFromPool(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(16D, 4D, 16D));
+                List nearbySheep = world.getEntitiesWithinAABB(SheepMob.class, AABB.getTemporaryBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).grow(16D, 4D, 16D));
                 if (!nearbySheep.isEmpty()) {
                     setTarget((Entity) nearbySheep.get(world.rand.nextInt(nearbySheep.size())));
                 }
@@ -311,11 +313,11 @@ public class EntityWolf extends EntityAnimal
         ItemStack heldItemSlot = getWolfHeldItem();
         if((heldItemSlot == null || heldItemSlot.itemID <= 0)) {
             List<Entity> triedItems = new ArrayList<>();
-            List<Entity> nearbyItems = world.getEntitiesWithinAABB(EntityItem.class, AABB.getBoundingBoxFromPool(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(16D, 4D, 16D));
+            List<Entity> nearbyItems = world.getEntitiesWithinAABB(ItemEntity.class, AABB.getTemporaryBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).grow(16D, 4D, 16D));
             if (!nearbyItems.isEmpty()) {
                 while (triedItems.size() != nearbyItems.size())
                 {
-                    EntityItem item = (EntityItem) nearbyItems.get(world.rand.nextInt(nearbyItems.size()));
+                    ItemEntity item = (ItemEntity) nearbyItems.get(world.rand.nextInt(nearbyItems.size()));
                     if (triedItems.contains(item))
                     {
                         continue;
@@ -347,19 +349,19 @@ public class EntityWolf extends EntityAnimal
         if(hasCurrentTarget() && !hasPath() && !isWolfAngry())
         {
             Entity entity = getCurrentTarget();
-            if(entity instanceof EntityPlayer)
+            if(entity instanceof Player)
             {
-                EntityPlayer entityplayer = (EntityPlayer)entity;
+                Player entityplayer = (Player)entity;
                 ItemStack itemstack = entityplayer.inventory.getCurrentItem();
                 if(itemstack != null)
                 {
-                    if(!isWolfTamed() && itemstack.itemID == Item.bone.id)
+                    if(!isWolfTamed() && itemstack.itemID == Items.BONE.id)
                     {
                         looksWithInterest = true;
                     } else
-                    if(isWolfTamed() && (Item.itemsList[itemstack.itemID] instanceof ItemFood))
+                    if(isWolfTamed() && (Item.itemsList[itemstack.itemID] instanceof FoodItem))
                     {
-                        looksWithInterest = ((ItemFood)Item.itemsList[itemstack.itemID]).getIsWolfsFavoriteMeat();
+                        looksWithInterest = ((FoodItem)Item.itemsList[itemstack.itemID]).getIsWolfsFavoriteMeat();
                     }
                 }
             }
@@ -388,12 +390,12 @@ public class EntityWolf extends EntityAnimal
         if(entitiesNearWolf != null && entitiesNearWolf.size() > 0 && isAlive())
         {
             for (Entity entity : entitiesNearWolf) {
-                if(entity instanceof EntityItem && (this.getWolfHeldItem() == null || this.getWolfHeldItem().getItem() == null)){
-                    EntityItem entityItem = (EntityItem) entity;
+                if(entity instanceof ItemEntity && (this.getWolfHeldItem() == null || this.getWolfHeldItem().getItem() == null)){
+                    ItemEntity itemEntity = (ItemEntity) entity;
 
-                    if (entityItem.item != null && entityItem.item.stackSize > 0) {
-                        setWolfHeldItem(entityItem.item.copy());
-                        entityItem.item.stackSize = 0;
+                    if (itemEntity.item != null && itemEntity.item.stackSize > 0) {
+                        setWolfHeldItem(itemEntity.item.copy());
+                        itemEntity.item.stackSize = 0;
                         entity.outOfWorld();
 
                         break;
@@ -440,7 +442,7 @@ public class EntityWolf extends EntityAnimal
             if(timeWolfIsShaking > 0.4F)
             {
                 float f = (float) bb.minY;
-                int i = (int)(MathHelper.sin((timeWolfIsShaking - 0.4F) * 3.141593F) * 7F);
+                int i = (int)(MathHelper.sin((timeWolfIsShaking - 0.4F) * MathHelper.PI) * 7F);
                 for(int j = 0; j < i; j++)
                 {
                     double offX = (random.nextFloat() * 2.0F - 1.0F) * bbWidth * 0.5F;
@@ -473,12 +475,12 @@ public class EntityWolf extends EntityAnimal
         {
             f2 = 1.0F;
         }
-        return MathHelper.sin(f2 * 3.141593F) * MathHelper.sin(f2 * 3.141593F * 11F) * 0.15F * 3.141593F;
+        return MathHelper.sin(f2 * MathHelper.PI) * MathHelper.sin(f2 * MathHelper.PI * 11F) * 0.15F * MathHelper.PI;
     }
 
     public float getInterestedAngle(float f)
     {
-        return (field_25054_c + (field_25048_b - field_25054_c) * f) * 0.15F * 3.141593F;
+        return (field_25054_c + (field_25048_b - field_25054_c) * f) * 0.15F * MathHelper.PI;
     }
 
     @Override
@@ -504,9 +506,9 @@ public class EntityWolf extends EntityAnimal
         Path pathentity = world.getPathToEntity(this, entity, 16F);
         if(pathentity == null && f > 12F)
         {
-            int i = MathHelper.floor_double(entity.x) - 2;
-            int j = MathHelper.floor_double(entity.z) - 2;
-            int k = MathHelper.floor_double(entity.bb.minY);
+            int i = MathHelper.floor(entity.x) - 2;
+            int j = MathHelper.floor(entity.z) - 2;
+            int k = MathHelper.floor(entity.bb.minY);
             for(int l = 0; l <= 4; l++)
             {
                 for(int i1 = 0; i1 <= 4; i1++)
@@ -536,7 +538,7 @@ public class EntityWolf extends EntityAnimal
     public boolean hurt(Entity attacker, int i, DamageType type)
     {
         setWolfSitting(false);
-        if(attacker != null && !(attacker instanceof EntityPlayer) && !(attacker instanceof EntityArrow))
+        if(attacker != null && !(attacker instanceof Player) && !(attacker instanceof ArrowProjectile))
         {
             i = (i + 1) / 2;
         }
@@ -544,18 +546,18 @@ public class EntityWolf extends EntityAnimal
         {
             if(!isWolfTamed() && !isWolfAngry())
             {
-                if(attacker instanceof EntityPlayer)
+                if(attacker instanceof Player)
                 {
                     setWolfAngry(true);
                     entityToAttack = attacker;
                 }
-                if((attacker instanceof EntityArrow) && ((EntityArrow) attacker).owner != null)
+                if((attacker instanceof ArrowProjectile) && ((ArrowProjectile) attacker).owner != null)
                 {
-                    attacker = ((EntityArrow) attacker).owner;
+                    attacker = ((ArrowProjectile) attacker).owner;
                 }
-                if(attacker instanceof EntityLiving)
+                if(attacker instanceof Mob)
                 {
-                    List list = world.getEntitiesWithinAABB(EntityWolf.class, AABB.getBoundingBoxFromPool(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(16D, 4D, 16D));
+                    List list = world.getEntitiesWithinAABB(WolfMob.class, AABB.getTemporaryBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).grow(16D, 4D, 16D));
                     Iterator iterator = list.iterator();
                     do
                     {
@@ -564,11 +566,11 @@ public class EntityWolf extends EntityAnimal
                             break;
                         }
                         Entity entity1 = (Entity)iterator.next();
-                        EntityWolf entitywolf = (EntityWolf)entity1;
+                        WolfMob entitywolf = (WolfMob)entity1;
                         if(!entitywolf.isWolfTamed() && entitywolf.entityToAttack == null)
                         {
                             entitywolf.entityToAttack = attacker;
-                            if(attacker instanceof EntityPlayer)
+                            if(attacker instanceof Player)
                             {
                                 entitywolf.setWolfAngry(true);
                             }
@@ -578,7 +580,7 @@ public class EntityWolf extends EntityAnimal
             } else
             if(attacker != this && attacker != null)
             {
-                if(isWolfTamed() && (attacker instanceof EntityPlayer) && ((EntityPlayer) attacker).username.equalsIgnoreCase(getWolfOwner()))
+                if(isWolfTamed() && (attacker instanceof Player) && ((Player) attacker).username.equalsIgnoreCase(getWolfOwner()))
                 {
                     return true;
                 }
@@ -606,7 +608,7 @@ public class EntityWolf extends EntityAnimal
     @Override
 	protected void attackEntity(Entity entity, float distance)
     {
-        if(entity instanceof EntityItem)
+        if(entity instanceof ItemEntity)
             return;
         if(distance > 2.0F && distance < 6F && random.nextInt(10) == 0)
         {
@@ -614,9 +616,9 @@ public class EntityWolf extends EntityAnimal
             {
                 double d = entity.x - x;
                 double d1 = entity.z - z;
-                float f1 = MathHelper.sqrt_double(d * d + d1 * d1);
-                xd = (d / (double)f1) * 0.5D * 0.80000001192092896D + xd * 0.20000000298023224D;
-                zd = (d1 / (double)f1) * 0.5D * 0.80000001192092896D + zd * 0.20000000298023224D;
+                float f1 = MathHelper.sqrt(d * d + d1 * d1);
+                xd = (d / (double)f1) * 0.5D * 0.80000001192092896D + xd * 0.2D;
+                zd = (d1 / (double)f1) * 0.5D * 0.80000001192092896D + zd * 0.2D;
                 yd = 0.40000000596046448D;
             }
         } else
@@ -651,18 +653,18 @@ public class EntityWolf extends EntityAnimal
     }
 
     @Override
-	public boolean interact(EntityPlayer entityplayer)
+	public boolean interact(Player entityplayer)
     {
         if (super.interact(entityplayer)) return true;
         ItemStack itemstack = entityplayer.inventory.getCurrentItem();
         if(!isWolfTamed())
         {
-            if(itemstack != null && itemstack.itemID == Item.bone.id && !isWolfAngry())
+            if(itemstack != null && itemstack.itemID == Items.BONE.id && !isWolfAngry())
             {
                 itemstack.consumeItem(entityplayer);
                 if(itemstack.stackSize <= 0)
                 {
-                    entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
+                    entityplayer.inventory.setItem(entityplayer.inventory.currentItem, null);
                 }
                 if(!world.isClientSide)
                 {
@@ -685,9 +687,9 @@ public class EntityWolf extends EntityAnimal
             }
         } else
         {
-            if(itemstack != null && (Item.itemsList[itemstack.itemID] instanceof ItemFood))
+            if(itemstack != null && (Item.itemsList[itemstack.itemID] instanceof FoodItem))
             {
-                ItemFood itemfood = (ItemFood)Item.itemsList[itemstack.itemID];
+                FoodItem itemfood = (FoodItem)Item.itemsList[itemstack.itemID];
                 if(itemfood.getIsWolfsFavoriteMeat() && getHealth() < getMaxHealth())
                 {
                 	if (entityplayer.getGamemode().consumeBlocks())
@@ -695,16 +697,16 @@ public class EntityWolf extends EntityAnimal
                 		itemstack.stackSize--;
                 		if(itemstack.stackSize <= 0)
                 		{
-                			entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
+                			entityplayer.inventory.setItem(entityplayer.inventory.currentItem, null);
                 		}                		
                 	}
-                    heal(((ItemFood)Item.foodPorkchopRaw).getHealAmount());
+                    heal(((FoodItem)Items.FOOD_PORKCHOP_RAW).getHealAmount());
                     return true;
                 }
             }
-            if (itemstack != null && itemstack.getItem() != null && itemstack.getItem() instanceof ItemArmor && entityplayer.username.equalsIgnoreCase(getWolfOwner())) {
-                ItemArmor itemArmor = (ItemArmor) itemstack.getItem();
-                if (itemArmor.material != null && ARMOR_MATERIALS.containsValue(itemArmor)) {
+            if (itemstack != null && itemstack.getItem() instanceof IArmorItem && entityplayer.username.equalsIgnoreCase(getWolfOwner())) {
+                IArmorItem armorItem = (IArmorItem) itemstack.getItem();
+                if (armorItem.getArmorMaterial() != null && ARMOR_MATERIALS.containsValue(armorItem)) {
                     if (armor != null) {
                         spawnAtLocation(armor, 0.0f);
                         setArmor(null);
@@ -713,7 +715,7 @@ public class EntityWolf extends EntityAnimal
                     if (entityplayer.getGamemode().consumeBlocks()) {
                         itemstack.stackSize--;
                         if (itemstack.stackSize <= 0) {
-                            entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
+                            entityplayer.inventory.setItem(entityplayer.inventory.currentItem, null);
                         }
                     }
                     return true;
@@ -787,22 +789,6 @@ public class EntityWolf extends EntityAnimal
         }
     }
 
-    public float getTailRotation()
-    {
-        if(isWolfAngry())
-        {
-            return 88 * (MathHelper.PI / 180F);
-        }
-        else if(isWolfTamed())
-        {
-            return (0.55F - (float)(getMaxHealth() - getHealth()) * 0.02F) * MathHelper.PI;
-        }
-        else
-        {
-            return 36 * (MathHelper.PI / 180F);
-        }
-    }
-
     public String getWolfOwner()
     {
         return entityData.getString(17);
@@ -887,13 +873,13 @@ public class EntityWolf extends EntityAnimal
     private float timeWolfIsShaking;
     private float prevTimeWolfIsShaking;
     private ItemStack armor = null;
-    public static final Map<ArmorMaterial, ItemArmor> ARMOR_MATERIALS = new HashMap<>();
+    public static final Map<ArmorMaterial, IArmorItem> ARMOR_MATERIALS = new HashMap<>();
     static {
-        ARMOR_MATERIALS.put(ArmorMaterial.LEATHER, (ItemArmor) Item.armorChestplateLeather);
-        ARMOR_MATERIALS.put(ArmorMaterial.CHAINMAIL, (ItemArmor) Item.armorChestplateChainmail);
-        ARMOR_MATERIALS.put(ArmorMaterial.IRON, (ItemArmor) Item.armorChestplateIron);
-        ARMOR_MATERIALS.put(ArmorMaterial.GOLD, (ItemArmor) Item.armorChestplateGold);
-        ARMOR_MATERIALS.put(ArmorMaterial.DIAMOND, (ItemArmor) Item.armorChestplateDiamond);
-        ARMOR_MATERIALS.put(ArmorMaterial.STEEL, (ItemArmor) Item.armorChestplateSteel);
+        ARMOR_MATERIALS.put(ArmorMaterial.LEATHER,   (IArmorItem) Items.ARMOR_CHESTPLATE_LEATHER);
+        ARMOR_MATERIALS.put(ArmorMaterial.CHAINMAIL, (IArmorItem) Items.ARMOR_CHESTPLATE_CHAINMAIL);
+        ARMOR_MATERIALS.put(ArmorMaterial.IRON,      (IArmorItem) Items.ARMOR_CHESTPLATE_IRON);
+        ARMOR_MATERIALS.put(ArmorMaterial.GOLD,      (IArmorItem) Items.ARMOR_CHESTPLATE_GOLD);
+        ARMOR_MATERIALS.put(ArmorMaterial.DIAMOND,   (IArmorItem) Items.ARMOR_CHESTPLATE_DIAMOND);
+        ARMOR_MATERIALS.put(ArmorMaterial.STEEL,     (IArmorItem) Items.ARMOR_CHESTPLATE_STEEL);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityCreeper.java b/src/main/java/net/minecraft/core/entity/monster/CreeperMob.java
similarity index 86%
rename from src/main/java/net/minecraft/core/entity/monster/EntityCreeper.java
rename to src/main/java/net/minecraft/core/entity/monster/CreeperMob.java
index 7945ea533..d0a4ba07c 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityCreeper.java
+++ b/src/main/java/net/minecraft/core/entity/monster/CreeperMob.java
@@ -2,32 +2,33 @@ package net.minecraft.core.entity.monster;
 
 // Referenced classes of package net.minecraft.src:
 //            EntityMob, DataWatcher, NBTTagCompound, World, 
-//            EntitySkeleton, Item, Entity, EntityLightningBolt
+//            SkeletonMob, Item, Entity, LightningEntity
 
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLightningBolt;
+import net.minecraft.core.entity.LightningEntity;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.world.World;
 
-public class EntityCreeper extends EntityMonster
+public class CreeperMob extends Monster
 {
 
-    public EntityCreeper(World world)
+    public CreeperMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "creeper");
         scoreValue = 800;
         setSize(0.6F, 1.6F);
-        mobDrops.add(new WeightedRandomLootObject(Item.sulphur.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.SULPHUR.getDefaultStack(), 0, 2));
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, (byte) -1);
         entityData.define(17, (byte) 0);
     }
@@ -110,9 +111,9 @@ public class EntityCreeper extends EntityMonster
 	public void onDeath(Entity entityKilledBy)
     {
         super.onDeath(entityKilledBy);
-        if(entityKilledBy instanceof EntitySkeleton)
+        if(entityKilledBy instanceof SkeletonMob)
         {
-            spawnAtLocation(Item.record13.id + random.nextInt(11), 1);
+            spawnAtLocation(Items.RECORD_13.id + random.nextInt(11), 1);
         }
     }
 
@@ -162,9 +163,9 @@ public class EntityCreeper extends EntityMonster
         return entityData.getByte(17) == 1;
     }
 
-    public float setCreeperFlashTime(float f)
+    public float getSwelling(float partialTick)
     {
-        return ((float)lastActiveTime + (float)(timeSinceIgnited - lastActiveTime) * f) / 28F;
+        return ((float)lastActiveTime + (float)(timeSinceIgnited - lastActiveTime) * partialTick) / 28F;
     }
 
     private int getCreeperState()
@@ -178,7 +179,7 @@ public class EntityCreeper extends EntityMonster
     }
 
     @Override
-	public void thunderHit(EntityLightningBolt bolt)
+	public void thunderHit(LightningEntity bolt)
     {
         super.thunderHit(bolt);
         entityData.set(17, Byte.valueOf((byte)1));
diff --git a/src/main/java/net/minecraft/core/entity/monster/Enemy.java b/src/main/java/net/minecraft/core/entity/monster/Enemy.java
new file mode 100644
index 000000000..a644bf256
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/monster/Enemy.java
@@ -0,0 +1,9 @@
+package net.minecraft.core.entity.monster;
+
+
+import net.minecraft.core.entity.animal.Creature;
+
+public interface Enemy
+	extends Creature
+{
+}
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityGhast.java b/src/main/java/net/minecraft/core/entity/monster/GhastMob.java
similarity index 73%
rename from src/main/java/net/minecraft/core/entity/monster/EntityGhast.java
rename to src/main/java/net/minecraft/core/entity/monster/GhastMob.java
index e3f7c39bd..90fee0c59 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityGhast.java
+++ b/src/main/java/net/minecraft/core/entity/monster/GhastMob.java
@@ -1,47 +1,56 @@
 package net.minecraft.core.entity.monster;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityFlying, IMob, DataWatcher, World, 
-//            MathHelper, Entity, AxisAlignedBB, EntityFireball, 
+//            FlyingMob, IMob, DataWatcher, World,
+//            MathHelper, Entity, AxisAlignedBB, FireballProjectile,
 //            Vec3D, Item
 
 import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.FireballProjectile;
 import net.minecraft.core.util.collection.NamespaceID;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityFireball;
-import net.minecraft.core.entity.EntityFlying;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.FlyingMob;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.helper.DamageType;
 
-public class EntityGhast extends EntityFlying
-    implements IEnemy
+public class GhastMob extends FlyingMob
+    implements Enemy
 {
+    public int courseChangeCooldown;
+    public double waypointX;
+    public double waypointY;
+    public double waypointZ;
+    private Entity targetedEntity;
+    private int aggroCooldown;
+    public int attackChargeO;
+    public int attackCharge;
+
 
-    public EntityGhast(World world)
+    public GhastMob(World world)
     {
         super(world);
         courseChangeCooldown = 0;
         targetedEntity = null;
         aggroCooldown = 0;
-        prevAttackCounter = 0;
-        attackCounter = 0;
+        attackChargeO = 0;
+        attackCharge = 0;
         textureIdentifier = new NamespaceID("minecraft", "ghast");
         setSize(4F, 7F);
         fireImmune = true;
         scoreValue = 1000;
-        bb.expand(2F, 3F, 2F);
-        mobDrops.add(new WeightedRandomLootObject(Item.sulphur.getDefaultStack(), 0, 2));
+        bb.grow(2F, 3F, 2F);
+        mobDrops.add(new WeightedRandomLootObject(Items.SULPHUR.getDefaultStack(), 0, 2));
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, Byte.valueOf((byte)0));
     }
 
@@ -77,40 +86,40 @@ public class EntityGhast extends EntityFlying
         if(world.isClientSide)
         {
             byte i = entityData.getByte(16);
-            if(i > 0 && attackCounter == 0)
+            if(i > 0 && attackCharge == 0)
             {
                 world.playSoundAtEntity(null, this, "mob.ghast.charge", getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
             }
-            attackCounter += i;
-            if(attackCounter < 0)
+            attackCharge += i;
+            if(attackCharge < 0)
             {
-                attackCounter = 0;
+                attackCharge = 0;
             }
-            if(attackCounter >= 20)
+            if(attackCharge >= 20)
             {
-                attackCounter = 20;
+                attackCharge = 20;
             }
-            if(attackCounter >= 20 && i == 0){
+            if(attackCharge >= 20 && i == 0){
                 world.playSoundAtEntity(null, this, "mob.ghast.fireball", getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
-                attackCounter = -40;
+                attackCharge = -40;
             }
         }
         super.tick();
     }
 
     @Override
-	protected void updatePlayerActionState()
+	protected void updateAI()
     {
         if(!world.isClientSide && world.difficultySetting == 0)
         {
             remove();
         }
         tryToDespawn();
-        prevAttackCounter = attackCounter;
+        attackChargeO = attackCharge;
         double d = waypointX - x;
         double d1 = waypointY - y;
         double d2 = waypointZ - z;
-        double d3 = MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2);
+        double d3 = MathHelper.sqrt(d * d + d1 * d1 + d2 * d2);
         if(d3 < 1.0D || d3 > 60D)
         {
             waypointX = x + (double)((random.nextFloat() * 2.0F - 1.0F) * 16F);
@@ -139,7 +148,7 @@ public class EntityGhast extends EntityFlying
         if(targetedEntity == null || aggroCooldown-- <= 0)
         {
             targetedEntity = world.getClosestPlayerToEntity(this, 100D);
-            if (targetedEntity != null && !((EntityPlayer) targetedEntity).getGamemode().areMobsHostile())
+            if (targetedEntity != null && !((Player) targetedEntity).getGamemode().areMobsHostile())
             {
             	targetedEntity = null;
             }
@@ -152,50 +161,50 @@ public class EntityGhast extends EntityFlying
         if(targetedEntity != null && targetedEntity.distanceToSqr(this) < d4 * d4)
         {
             double d8 = 4D;
-            Vec3d vec3d = getViewVector(1.0F);
+            Vec3 vec3 = getViewVector(1.0F);
             double dX = targetedEntity.x - x;
             double dY = targetedEntity.y - y;
             double dZ = targetedEntity.z - z;
-            double dist = MathHelper.sqrt_double(dX * dX + dY * dY + dZ * dZ);
-            double vX = dX + (targetedEntity.xd * dist/7.5d) - vec3d.xCoord * d8;
+            double dist = MathHelper.sqrt(dX * dX + dY * dY + dZ * dZ);
+            double vX = dX + (targetedEntity.xd * dist/7.5d) - vec3.x * d8;
             double vY = dY + (targetedEntity.yd * dist/7.5d) - ((double)(bbHeight / 2.0F) + 0.5D);
-            double vZ = dZ + (targetedEntity.zd * dist/7.5d) - vec3d.zCoord * d8;
-            renderYawOffset = yRot = (-(float) java.lang.Math.atan2(vX, vZ) * 180F) / MathHelper.PI;
+            double vZ = dZ + (targetedEntity.zd * dist/7.5d) - vec3.z * d8;
+            yBodyRot = yRot = (-(float) java.lang.Math.atan2(vX, vZ) * 180F) / MathHelper.PI;
             if(canEntityBeSeen(targetedEntity))
             {
-                if(attackCounter == 10)
+                if(attackCharge == 10)
                 {
                     world.playSoundAtEntity(null, this, "mob.ghast.charge", getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
                 }
-                attackCounter++;
-                if(attackCounter == 20)
+                attackCharge++;
+                if(attackCharge == 20)
                 {
                     world.playSoundAtEntity(null, this, "mob.ghast.fireball", getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
-                    EntityFireball entityfireball = new EntityFireball(world, this, vX, vY, vZ);
+                    FireballProjectile entityfireball = new FireballProjectile(world, this, vX, vY, vZ);
 
-                    entityfireball.x = x + vec3d.xCoord * d8;
+                    entityfireball.x = x + vec3.x * d8;
                     entityfireball.y = y + (double)(bbHeight / 2.0F) + 0.5D;
-                    entityfireball.z = z + vec3d.zCoord * d8;
+                    entityfireball.z = z + vec3.z * d8;
                     world.entityJoinedWorld(entityfireball);
-                    attackCounter = -40;
+                    attackCharge = -40;
                 }
             } else
-            if(attackCounter > 0)
+            if(attackCharge > 0)
             {
-                attackCounter--;
+                attackCharge--;
             }
         } else
         {
-            renderYawOffset = yRot = (-(float) java.lang.Math.atan2(xd, zd) * 180F) / 3.141593F;
-            if(attackCounter > 0)
+            yBodyRot = yRot = (-(float) java.lang.Math.atan2(xd, zd) * 180F) / MathHelper.PI;
+            if(attackCharge > 0)
             {
-                attackCounter--;
+                attackCharge--;
             }
         }
         if(!world.isClientSide)
         {
             byte byte0 = entityData.getByte(16);
-            byte byte1 = (byte)(attackCounter <= 10 ? 0 : 1);
+            byte byte1 = (byte)(attackCharge <= 10 ? 0 : 1);
             if(byte0 != byte1)
             {
                 entityData.set(16, Byte.valueOf(byte1));
@@ -211,7 +220,7 @@ public class EntityGhast extends EntityFlying
         AABB axisalignedbb = bb.copy();
         for(int i = 1; (double)i < d3; i++)
         {
-            axisalignedbb.offset(d4, d5, d6);
+            axisalignedbb.move(d4, d5, d6);
             if(world.getCubes(this, axisalignedbb).size() > 0)
             {
                 return false;
@@ -267,9 +276,9 @@ public class EntityGhast extends EntityFlying
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-        return random.nextInt(20) == 0 && super.getCanSpawnHere() && world.difficultySetting > 0;
+        return random.nextInt(20) == 0 && super.canSpawnHere() && world.difficultySetting > 0;
     }
 
     @Override
@@ -277,13 +286,4 @@ public class EntityGhast extends EntityFlying
     {
         return 1;
     }
-
-    public int courseChangeCooldown;
-    public double waypointX;
-    public double waypointY;
-    public double waypointZ;
-    private Entity targetedEntity;
-    private int aggroCooldown;
-    public int prevAttackCounter;
-    public int attackCounter;
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityGiant.java b/src/main/java/net/minecraft/core/entity/monster/GiantMob.java
similarity index 89%
rename from src/main/java/net/minecraft/core/entity/monster/EntityGiant.java
rename to src/main/java/net/minecraft/core/entity/monster/GiantMob.java
index c196c8446..85fb3d2f1 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityGiant.java
+++ b/src/main/java/net/minecraft/core/entity/monster/GiantMob.java
@@ -7,10 +7,10 @@ package net.minecraft.core.entity.monster;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.world.World;
 
-public class EntityGiant extends EntityMonster
+public class GiantMob extends Monster
 {
 
-    public EntityGiant(World world)
+    public GiantMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "zombie");
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityHuman.java b/src/main/java/net/minecraft/core/entity/monster/HumanMob.java
similarity index 90%
rename from src/main/java/net/minecraft/core/entity/monster/EntityHuman.java
rename to src/main/java/net/minecraft/core/entity/monster/HumanMob.java
index 8a62fdb3f..330b5975d 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityHuman.java
+++ b/src/main/java/net/minecraft/core/entity/monster/HumanMob.java
@@ -6,9 +6,9 @@ import net.minecraft.core.util.helper.GetMonsterSkinUrlThread;
 import net.minecraft.core.world.World;
 
 
-public class EntityHuman extends EntityMonster
+public class HumanMob extends Monster
 {
-    public EntityHuman(World world)
+    public HumanMob(World world)
     {
         super(world);
 
diff --git a/src/main/java/net/minecraft/core/entity/monster/IEnemy.java b/src/main/java/net/minecraft/core/entity/monster/IEnemy.java
deleted file mode 100644
index e31217930..000000000
--- a/src/main/java/net/minecraft/core/entity/monster/IEnemy.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package net.minecraft.core.entity.monster;
-
-
-import net.minecraft.core.entity.animal.IAnimal;
-
-public interface IEnemy
-	extends IAnimal
-{
-}
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityMonster.java b/src/main/java/net/minecraft/core/entity/monster/Monster.java
similarity index 81%
rename from src/main/java/net/minecraft/core/entity/monster/EntityMonster.java
rename to src/main/java/net/minecraft/core/entity/monster/Monster.java
index 2b6ba2314..d36825af4 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityMonster.java
+++ b/src/main/java/net/minecraft/core/entity/monster/Monster.java
@@ -5,21 +5,21 @@ package net.minecraft.core.entity.monster;
 //            AxisAlignedBB, MathHelper, EnumSkyBlock, NBTTagCompound
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityPathfinder;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.PathfinderMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.world.season.Seasons;
 
-public abstract class EntityMonster extends EntityPathfinder
-    implements IEnemy
+public abstract class Monster extends PathfinderMob
+    implements Enemy
 {
 
-    public EntityMonster(World world)
+    public Monster(World world)
     {
         super(world);
         attackStrength = 2;
@@ -29,7 +29,7 @@ public abstract class EntityMonster extends EntityPathfinder
         return 20;
     }
     @Override
-    protected void updatePlayerActionState()
+    protected void updateAI()
     {
         if(closestFireflyEntity == null) {
             closestFireflyEntity = getClosestFireflyToEntity((int) x, (int) y, (int) z, 8F);
@@ -45,11 +45,11 @@ public abstract class EntityMonster extends EntityPathfinder
             dX = dX * scaleFactor;
             dZ = dZ * scaleFactor;
 
-            Vec3d distanceXYZ = Vec3d.createVector(x + dX, y, z + dZ);
-            pathToEntity = world.getEntityPathToXYZ(this, MathHelper.floor_double(distanceXYZ.xCoord), MathHelper.floor_double(y), MathHelper.floor_double(distanceXYZ.zCoord), 16F);
+            Vec3 distanceXYZ = Vec3.getTempVec3(x + dX, y, z + dZ);
+            pathToEntity = world.getEntityPathToXYZ(this, MathHelper.floor(distanceXYZ.x), MathHelper.floor(y), MathHelper.floor(distanceXYZ.z), 16F);
         }
 
-    super.updatePlayerActionState();
+    super.updateAI();
     }
 
     @Override
@@ -76,7 +76,7 @@ public abstract class EntityMonster extends EntityPathfinder
     @Override
 	protected Entity findPlayerToAttack()
     {
-        EntityPlayer entityplayer = world.getClosestPlayerToEntity(this, 16D);
+        Player entityplayer = world.getClosestPlayerToEntity(this, 16D);
         if(entityplayer != null && canEntityBeSeen(entityplayer) && entityplayer.getGamemode().areMobsHostile())
         {
             return entityplayer;
@@ -145,11 +145,11 @@ public abstract class EntityMonster extends EntityPathfinder
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_double(bb.minY);
-        int k = MathHelper.floor_double(z);
+        int i = MathHelper.floor(x);
+        int j = MathHelper.floor(bb.minY);
+        int k = MathHelper.floor(z);
         if(world.getSavedLightValue(LightLayer.Block, i, j, k) > 0) return false;
         if(world.getSavedLightValue(LightLayer.Sky, i, j, k) > random.nextInt(32))
             return false;
@@ -158,7 +158,7 @@ public abstract class EntityMonster extends EntityPathfinder
         if(world.getCurrentWeather() != null && world.getCurrentWeather().doMobsSpawnInDaylight)
             blockLight = blockLight/2;
 
-        return blockLight <= 4 && super.getCanSpawnHere();
+        return blockLight <= 4 && super.canSpawnHere();
     }
 
     protected int attackStrength;
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityScorpion.java b/src/main/java/net/minecraft/core/entity/monster/ScorpionMob.java
similarity index 82%
rename from src/main/java/net/minecraft/core/entity/monster/EntityScorpion.java
rename to src/main/java/net/minecraft/core/entity/monster/ScorpionMob.java
index 8cb38c277..175288368 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityScorpion.java
+++ b/src/main/java/net/minecraft/core/entity/monster/ScorpionMob.java
@@ -6,39 +6,39 @@ package net.minecraft.core.entity.monster;
 
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class EntityScorpion extends EntityMonster
+public class ScorpionMob extends Monster
 {
 
-    public EntityScorpion(World world)
+    public ScorpionMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "scorpion");
         setSize(1F, 0.2F);
         moveSpeed = 0.8F;
         scoreValue = 200;
-        mobDrops.add(new WeightedRandomLootObject(Item.string.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.STRING.getDefaultStack(), 0, 2));
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, (byte) 1);
 
     }
     @Override
 	public void spawnInit()
     {
-        super.init();
+        super.defineSynchedData();
         if(world.difficultySetting != 0 && random.nextInt(100 / world.difficultySetting) == 0) {
-            EntitySkeleton entityskeleton = new EntitySkeleton(world);
+            SkeletonMob entityskeleton = new SkeletonMob(world);
             entityskeleton.moveTo(x, y, z, yRot, 0.0F);
             world.entityJoinedWorld(entityskeleton);
             entityskeleton.startRiding(this);
@@ -65,7 +65,7 @@ public class EntityScorpion extends EntityMonster
         if(f < 0.5F)
         {
             double d = 16D;
-            EntityPlayer p = world.getClosestPlayerToEntity(this, d);
+            Player p = world.getClosestPlayerToEntity(this, d);
             if (p != null)
             {
             	if (!p.gamemode.areMobsHostile()) return null;
@@ -110,9 +110,9 @@ public class EntityScorpion extends EntityMonster
             {
                 double d = entity.x - x;
                 double d1 = entity.z - z;
-                float f2 = MathHelper.sqrt_double(d * d + d1 * d1);
-                xd = (d / (double)f2) * 0.5D * 0.80000001192092896D + xd * 0.20000000298023224D;
-                zd = (d1 / (double)f2) * 0.5D * 0.80000001192092896D + zd * 0.20000000298023224D;
+                float f2 = MathHelper.sqrt(d * d + d1 * d1);
+                xd = (d / (double)f2) * 0.5D * 0.80000001192092896D + xd * 0.2D;
+                zd = (d1 / (double)f2) * 0.5D * 0.80000001192092896D + zd * 0.2D;
                 yd = 0.40000000596046448D;
             }
         } else
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntitySkeleton.java b/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
similarity index 71%
rename from src/main/java/net/minecraft/core/entity/monster/EntitySkeleton.java
rename to src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
index 8deb6a437..006930fd6 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntitySkeleton.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
@@ -2,29 +2,29 @@ package net.minecraft.core.entity.monster;
 
 // Referenced classes of package net.minecraft.src:
 //            EntityMob, World, MathHelper, Entity, 
-//            EntityArrow, Item, ItemStack, NBTTagCompound
+//            ArrowProjectile, Item, ItemStack, NBTTagCompound
 
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
-import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
-public class EntitySkeleton extends EntityMonster
+public class SkeletonMob extends Monster
 {
 
-    public EntitySkeleton(World world)
+    public SkeletonMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "skeleton");
         scoreValue = 500;
-        mobDrops.add(new WeightedRandomLootObject(Item.ammoArrow.getDefaultStack(), 0, 2));
-        mobDrops.add(new WeightedRandomLootObject(Item.bone.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.AMMO_ARROW.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.BONE.getDefaultStack(), 0, 2));
     }
 
     @Override
@@ -45,9 +45,9 @@ public class EntitySkeleton extends EntityMonster
         return "mob.skeletonhurt";
     }
     @Override
-    protected void init()
+    protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(15, attackTime);
     }
 
@@ -62,8 +62,8 @@ public class EntitySkeleton extends EntityMonster
         if(world.isDaytime())
         {
             float f = getBrightness(1.0F);
-            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
-             && (world.getCurrentWeather() != Weather.overworldFog || world.weatherManager.getWeatherPower() < 0.75F))
+            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
+             && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
             {
                 remainingFireTicks = 300;
             }
@@ -81,17 +81,17 @@ public class EntitySkeleton extends EntityMonster
             if(attackTime == 0)
             {
                 if(!world.isClientSide) {
-                    EntityArrow entityarrow = new EntityArrow(world, this, false, 0);
+                    ArrowProjectile entityarrow = new ArrowProjectile(world, this, false, 0);
                     entityarrow.y += 1.3999999761581421D;
-                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.20000000298023224D - entityarrow.y;
-                    float f1 = MathHelper.sqrt_double(d * d + d1 * d1) * 0.2F;
+                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.2D - entityarrow.y;
+                    float f1 = MathHelper.sqrt(d * d + d1 * d1) * 0.2F;
                     world.playSoundAtEntity(null, this, "random.bow", 1.0F, 1.0F / (random.nextFloat() * 0.4F + 0.8F));
                     entityarrow.setHeading(d, d2 + (double) f1, d1, 0.6F, 12F);
                     world.entityJoinedWorld(entityarrow);
                 }
                 attackTime = 30;
             }
-            yRot = (float)((java.lang.Math.atan2(d1, d) * 180D) / 3.1415927410125732D) - 90F;
+            yRot = (float)((java.lang.Math.atan2(d1, d) * 180D) / Math.PI) - 90F;
             hasAttacked = true;
         }
     }
@@ -118,6 +118,6 @@ public class EntitySkeleton extends EntityMonster
 
     static 
     {
-        defaultHeldItem = new ItemStack(Item.toolBow, 1);
+        defaultHeldItem = new ItemStack(Items.TOOL_BOW, 1);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntitySlime.java b/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
similarity index 78%
rename from src/main/java/net/minecraft/core/entity/monster/EntitySlime.java
rename to src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
index 79afce5ee..efa4bb154 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntitySlime.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.entity.monster;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityLiving, IMob, DataWatcher, NBTTagCompound, 
-//            MathHelper, AxisAlignedBB, World, EntityPlayer, 
+//            Mob, IMob, DataWatcher, NBTTagCompound,
+//            MathHelper, AxisAlignedBB, World, Player,
 //            Item, Chunk
 
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
@@ -18,44 +18,44 @@ import net.minecraft.core.util.helper.DamageType;
 
 import java.util.List;
 
-public class EntitySlime extends EntityLiving
-    implements IEnemy
+public class SlimeMob extends Mob
+    implements Enemy
 {
 
-    public EntitySlime(World world)
+    public SlimeMob(World world)
     {
         super(world);
-        slimeJumpDelay = 0;
+        jumpDelay = 0;
         textureIdentifier = new NamespaceID("minecraft", "slime");
         heightOffset = 0.0F;
-        slimeJumpDelay = 20;
+        jumpDelay = 20;
         scoreValue = 100;
         this.hasSlimeSplit = false;
-        mobDrops.add(new WeightedRandomLootObject(Item.slimeball.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.SLIMEBALL.getDefaultStack(), 0, 2));
     }
-    public EntitySlime(World world, boolean isSplit)
+    public SlimeMob(World world, boolean isSplit)
     {
         super(world);
-        slimeJumpDelay = 0;
+        jumpDelay = 0;
         textureIdentifier = new NamespaceID("minecraft", "slime");
         heightOffset = 0.0F;
-        slimeJumpDelay = 20;
+        jumpDelay = 20;
         scoreValue = 100;
         this.hasSlimeSplit = isSplit;
-        mobDrops.add(new WeightedRandomLootObject(Item.slimeball.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.SLIMEBALL.getDefaultStack(), 0, 2));
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, (byte) 1);
     }
 
     @Override
 	public void spawnInit()
     {
-        super.init();
+        super.defineSynchedData();
         if(!hasSlimeSplit) {
         	int size = random.nextInt(3) + 1;
         	if(size == 3) size = 4;
@@ -102,7 +102,7 @@ public class EntitySlime extends EntityLiving
             setSlimeSize(getSlimeSize());
             sizeSet = true;
         }
-        field_767_b = field_768_a;
+        oSquish = squish;
         boolean flag = onGround;
         super.tick();
         if(onGround && !flag)
@@ -114,49 +114,49 @@ public class EntitySlime extends EntityLiving
                 double f1 = random.nextFloat() * 0.5D + 0.5D;
                 double f2 = MathHelper.sin(f) * (float)i * 0.5D * f1;
                 double f3 = MathHelper.cos(f) * (float)i * 0.5D * f1;
-                world.spawnParticle("item", x + f2, bb.minY, z + f3, 0.0, 0.0D, 0.0D, Item.slimeball.id);
+                world.spawnParticle("item", x + f2, bb.minY, z + f3, 0.0, 0.0D, 0.0D, Items.SLIMEBALL.id);
             }
 
             if(i > 2)
             {
                 world.playSoundAtEntity(null, this, "mob.slime", getSoundVolume(), ((random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F) / 0.8F);
             }
-            field_768_a = -0.5F;
+            squish = -0.5F;
         }
         if (!world.isClientSide && world.difficultySetting == 0)
         {
         	remove();
         }
-        field_768_a = field_768_a * 0.6F;
+        squish = squish * 0.6F;
     }
 
     @Override
-	protected void updatePlayerActionState()
+	protected void updateAI()
     {
         tryToDespawn();
-        EntityPlayer entityplayer = world.getClosestPlayerToEntity(this, 16D);
+        Player entityplayer = world.getClosestPlayerToEntity(this, 16D);
         boolean targetPlayer = entityplayer != null && entityplayer.getGamemode().areMobsHostile();
         if(entityplayer != null && targetPlayer)
         {
-            faceEntity(entityplayer, 10F, 20F);
+            lookAt(entityplayer, 10F, 20F);
         }
-        if(onGround && slimeJumpDelay-- <= 0)
+        if(onGround && jumpDelay-- <= 0)
         {
         	if(!targetPlayer) {
         		float rotation = (world.rand.nextFloat() - 0.5f) * 90.0f;
         		this.yRot += rotation;
         	}
-            slimeJumpDelay = random.nextInt(20) + 10;
+            jumpDelay = random.nextInt(20) + 10;
             if(entityplayer != null)
             {
-                slimeJumpDelay /= 3;
+                jumpDelay /= 3;
             }
             isJumping = true;
             if(getSlimeSize() > 1)
             {
                 world.playSoundAtEntity(null, this, "mob.slime", getSoundVolume(), ((random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F) * 0.8F);
             }
-            field_768_a = 1.0F;
+            squish = 1.0F;
             moveStrafing = 1.0F - random.nextFloat() * 2.0F;
             moveForward = getSlimeSize();
         } else
@@ -180,7 +180,7 @@ public class EntitySlime extends EntityLiving
             {
                 float f = (((float)(j % 2) - 0.5F) * (float)size) / 4F;
                 float f1 = (((float)(j / 2) - 0.5F) * (float)size) / 4F;
-                EntitySlime entityslime = new EntitySlime(world, true);
+                SlimeMob entityslime = new SlimeMob(world, true);
                 entityslime.setSlimeSize(size / 2);
                 entityslime.moveTo(x + (double)f, y + 0.5D, z + (double)f1, random.nextFloat() * 360F, 0.0F);
                 world.entityJoinedWorld(entityslime);
@@ -191,7 +191,7 @@ public class EntitySlime extends EntityLiving
     }
 
     @Override
-	public void playerTouch(EntityPlayer player)
+	public void playerTouch(Player player)
     {
         int i = getSlimeSize();
         if(i > 1 && canEntityBeSeen(player) && (double) distanceTo(player) < 0.6D * (double)i && player.hurt(this, i, DamageType.COMBAT))
@@ -225,16 +225,16 @@ public class EntitySlime extends EntityLiving
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-        Chunk chunk = world.getChunkFromBlockCoords(MathHelper.floor_double(x), MathHelper.floor_double(z));
+        Chunk chunk = world.getChunkFromBlockCoords(MathHelper.floor(x), MathHelper.floor(z));
         if(y > 32D)
             return false;
         if(chunk.getChunkRandom(0x3AD8025FL).nextInt(10) != 0)
             return false;
         if(world.difficultySetting == 0)
             return false;
-        return super.getCanSpawnHere();
+        return super.canSpawnHere();
     }
 
 
@@ -244,9 +244,9 @@ public class EntitySlime extends EntityLiving
         return 0.6F;
     }
 
-    public float field_768_a;
-    public float field_767_b;
-    private int slimeJumpDelay;
+    public float squish;
+    public float oSquish;
+    private int jumpDelay;
     private final boolean hasSlimeSplit;
     private boolean sizeSet = false;
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java b/src/main/java/net/minecraft/core/entity/monster/SnowmanMob.java
similarity index 57%
rename from src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java
rename to src/main/java/net/minecraft/core/entity/monster/SnowmanMob.java
index 9b9e2b196..b60f78e83 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntitySnowman.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SnowmanMob.java
@@ -4,29 +4,29 @@ package net.minecraft.core.entity.monster;
 //            EntityMob, World, MathHelper, Item
 
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntitySnowball;
+import net.minecraft.core.entity.projectile.SnowballProjectile;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
-public class EntitySnowman extends EntityMonster
+public class SnowmanMob extends Monster
 {
 
-    public EntitySnowman(World world)
+    public SnowmanMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "snowman");
         moveSpeed = 0.5F;
         attackStrength = 5;
         scoreValue = 300;
-        mobDrops.add(new WeightedRandomLootObject(Item.ammoSnowball.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.AMMO_SNOWBALL.getDefaultStack(), 0, 2));
     }
 
     @Override
@@ -35,8 +35,8 @@ public class EntitySnowman extends EntityMonster
         if(world.isDaytime())
         {
             float f = getBrightness(1.0F);
-            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
-                    && (world.getCurrentWeather() != Weather.overworldFog || world.weatherManager.getWeatherPower() < 0.75F) && world.getCurrentWeather() != Weather.overworldSnow && world.getCurrentWeather() != Weather.overworldWinterSnow)
+            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
+                    && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F) && world.getCurrentWeather() != Weathers.OVERWORLD_SNOW && world.getCurrentWeather() != Weathers.OVERWORLD_WINTER_SNOW)
             {
                 remainingFireTicks = 300;
             }
@@ -54,17 +54,17 @@ public class EntitySnowman extends EntityMonster
             if(attackTime == 0)
             {
                 if(!world.isClientSide) {
-                    EntitySnowball snowball = new EntitySnowball(world, this);
-                    if (world.getBlockId((int) x, (int) y - 1, (int) z) == Block.gravel.id)
+                    SnowballProjectile snowballProjectile = new SnowballProjectile(world, this);
+                    if (world.getBlockId((int) x, (int) y - 1, (int) z) == Blocks.GRAVEL.id)
                     {
-                        snowball.damage = 1;
+                        snowballProjectile.damage = 1;
                     }
-                    snowball.y += 1.4D;
-                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.2D - snowball.y;
-                    float f1 = MathHelper.sqrt_double(dX * dX + dZ * dZ) * 0.2F;
+                    snowballProjectile.y += 1.4D;
+                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.2D - snowballProjectile.y;
+                    float f1 = MathHelper.sqrt(dX * dX + dZ * dZ) * 0.2F;
                     world.playSoundAtEntity(null, this, "random.bow", 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F));
-                    world.entityJoinedWorld(snowball);
-                    snowball.setHeadingPrecise(dX, d2 + (double) f1, dZ, 0.6F);
+                    world.entityJoinedWorld(snowballProjectile);
+                    snowballProjectile.setHeadingPrecise(dX, d2 + (double) f1, dZ, 0.6F);
                 }
                 attackTime = 30;
             }
@@ -78,14 +78,14 @@ public class EntitySnowman extends EntityMonster
     }
 
     @Override
-    public boolean getCanSpawnHere()
+    public boolean canSpawnHere()
     {
         int x = (int) this.x;
         int y = (int) this.y;
         int z = (int) this.z;
         Biome biome = world.getBlockBiome(x, y, z);
 
-        return super.getCanSpawnHere() && (world.canBlockSeeTheSky(x, y, z) && ((biome == Biomes.OVERWORLD_GLACIER) || ((world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER || world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER_ENDLESS) && (world.getCurrentWeather() == Weather.overworldSnow || world.getCurrentWeather() == Weather.overworldWinterSnow))));
+        return super.canSpawnHere() && (world.canBlockSeeTheSky(x, y, z) && ((biome == Biomes.OVERWORLD_GLACIER) || ((world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER || world.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER_ENDLESS) && (world.getCurrentWeather() == Weathers.OVERWORLD_SNOW || world.getCurrentWeather() == Weathers.OVERWORLD_WINTER_SNOW))));
     }
 
     @Override
@@ -107,11 +107,11 @@ public class EntitySnowman extends EntityMonster
     }
 
     @Override
-    protected void dropFewItems()
+    protected void dropDeathItems()
     {
         if (random.nextInt(1000) == 0){
-            spawnAtLocation(Item.bucketIcecream.id, 1);
+            spawnAtLocation(Items.BUCKET_ICECREAM.id, 1);
         }
-        super.dropFewItems();
+        super.dropDeathItems();
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntitySpider.java b/src/main/java/net/minecraft/core/entity/monster/SpiderMob.java
similarity index 82%
rename from src/main/java/net/minecraft/core/entity/monster/EntitySpider.java
rename to src/main/java/net/minecraft/core/entity/monster/SpiderMob.java
index 8f3712397..85cafede5 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntitySpider.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SpiderMob.java
@@ -6,39 +6,39 @@ package net.minecraft.core.entity.monster;
 
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
 
-public class EntitySpider extends EntityMonster
+public class SpiderMob extends Monster
 {
 
-    public EntitySpider(World world)
+    public SpiderMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "spider");
         setSize(1.4F, 0.9F);
         moveSpeed = 0.8F;
         scoreValue = 200;
-        mobDrops.add(new WeightedRandomLootObject(Item.string.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.STRING.getDefaultStack(), 0, 2));
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, (byte) 1);
 
     }
     @Override
 	public void spawnInit()
     {
-        super.init();
+        super.defineSynchedData();
         if(world.difficultySetting != 0 && random.nextInt(100 / world.difficultySetting) == 0) {
-            EntitySkeleton entityskeleton = new EntitySkeleton(world);
+            SkeletonMob entityskeleton = new SkeletonMob(world);
             entityskeleton.moveTo(x, y, z, yRot, 0.0F);
             world.entityJoinedWorld(entityskeleton);
             entityskeleton.startRiding(this);
@@ -65,7 +65,7 @@ public class EntitySpider extends EntityMonster
         if(f < 0.5F)
         {
             double d = 16D;
-            EntityPlayer p = world.getClosestPlayerToEntity(this, d);
+            Player p = world.getClosestPlayerToEntity(this, d);
             if (p != null)
             {
             	if (!p.gamemode.areMobsHostile()) return null;
@@ -110,9 +110,9 @@ public class EntitySpider extends EntityMonster
             {
                 double d = entity.x - x;
                 double d1 = entity.z - z;
-                float f2 = MathHelper.sqrt_double(d * d + d1 * d1);
-                xd = (d / (double)f2) * 0.5D * 0.80000001192092896D + xd * 0.20000000298023224D;
-                zd = (d1 / (double)f2) * 0.5D * 0.80000001192092896D + zd * 0.20000000298023224D;
+                float f2 = MathHelper.sqrt(d * d + d1 * d1);
+                xd = (d / (double)f2) * 0.5D * 0.80000001192092896D + xd * 0.2D;
+                zd = (d1 / (double)f2) * 0.5D * 0.80000001192092896D + zd * 0.2D;
                 yd = 0.40000000596046448D;
             }
         } else
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityArmoredZombie.java b/src/main/java/net/minecraft/core/entity/monster/ZombieArmoredMob.java
similarity index 90%
rename from src/main/java/net/minecraft/core/entity/monster/EntityArmoredZombie.java
rename to src/main/java/net/minecraft/core/entity/monster/ZombieArmoredMob.java
index bad5261e2..1ca4a8999 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityArmoredZombie.java
+++ b/src/main/java/net/minecraft/core/entity/monster/ZombieArmoredMob.java
@@ -5,8 +5,8 @@ package net.minecraft.core.entity.monster;
 
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.DamageType;
@@ -16,10 +16,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-public class EntityArmoredZombie extends EntityZombie
+public class ZombieArmoredMob extends ZombieMob
 {
     private boolean isHoldingSword;
-    public EntityArmoredZombie(World world)
+    public ZombieArmoredMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "zombie_armored");
@@ -47,7 +47,7 @@ public class EntityArmoredZombie extends EntityZombie
         scoreValue = 1000;
     }
     @Override
-    public void init(){
+    public void defineSynchedData(){
         entityData.define(6, Integer.valueOf(0));
         entityData.define(7, Short.valueOf((short) 0));
     }
@@ -74,7 +74,7 @@ public class EntityArmoredZombie extends EntityZombie
                 int numChainlinks = random.nextInt(2);
                 for (int k = 0; k < numChainlinks; k++)
                 {
-                    EntityItem entityitem = spawnAtLocation(new ItemStack(Item.chainlink), 1.0F);
+                    ItemEntity entityitem = spawnAtLocation(new ItemStack(Items.CHAINLINK), 1.0F);
                     entityitem.yd += random.nextFloat() * 0.05F;
                     entityitem.xd += (random.nextFloat() - random.nextFloat()) * 0.1F;
                     entityitem.zd += (random.nextFloat() - random.nextFloat()) * 0.1F;
@@ -123,6 +123,6 @@ public class EntityArmoredZombie extends EntityZombie
 
     static
     {
-        defaultHeldItem = new ItemStack(Item.toolSwordIron, 1);
+        defaultHeldItem = new ItemStack(Items.TOOL_SWORD_IRON, 1);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityZombie.java b/src/main/java/net/minecraft/core/entity/monster/ZombieMob.java
similarity index 69%
rename from src/main/java/net/minecraft/core/entity/monster/EntityZombie.java
rename to src/main/java/net/minecraft/core/entity/monster/ZombieMob.java
index 49832f78b..f6251782f 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityZombie.java
+++ b/src/main/java/net/minecraft/core/entity/monster/ZombieMob.java
@@ -4,23 +4,23 @@ package net.minecraft.core.entity.monster;
 //            EntityMob, World, MathHelper, Item
 
 import net.minecraft.core.WeightedRandomLootObject;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.world.weather.Weather;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.weather.Weathers;
 
-public class EntityZombie extends EntityMonster
+public class ZombieMob extends Monster
 {
 
-    public EntityZombie(World world)
+    public ZombieMob(World world)
     {
         super(world);
         textureIdentifier = new NamespaceID("minecraft", "zombie");
         moveSpeed = 0.5F;
         attackStrength = 5;
         scoreValue = 300;
-        mobDrops.add(new WeightedRandomLootObject(Item.cloth.getDefaultStack(), 0, 2));
+        mobDrops.add(new WeightedRandomLootObject(Items.CLOTH.getDefaultStack(), 0, 2));
     }
 
     @Override
@@ -29,8 +29,8 @@ public class EntityZombie extends EntityMonster
         if(world.isDaytime())
         {
             float f = getBrightness(1.0F);
-            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
-                    && (world.getCurrentWeather() != Weather.overworldFog || world.weatherManager.getWeatherPower() < 0.75F))
+            if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
+                    && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
             {
                 remainingFireTicks = 300;
             }
diff --git a/src/main/java/net/minecraft/core/entity/monster/EntityPigZombie.java b/src/main/java/net/minecraft/core/entity/monster/ZombiePigMob.java
similarity index 77%
rename from src/main/java/net/minecraft/core/entity/monster/EntityPigZombie.java
rename to src/main/java/net/minecraft/core/entity/monster/ZombiePigMob.java
index 2c4a21eed..5d33fbc47 100644
--- a/src/main/java/net/minecraft/core/entity/monster/EntityPigZombie.java
+++ b/src/main/java/net/minecraft/core/entity/monster/ZombiePigMob.java
@@ -2,8 +2,8 @@ package net.minecraft.core.entity.monster;
 
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.collection.NamespaceID;
@@ -16,13 +16,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
-//            EntityZombie, World, NBTTagCompound, EntityPlayer, 
+//            ZombieMob, World, NBTTagCompound, Player,
 //            AxisAlignedBB, Entity, Item, ItemStack
 
-public class EntityPigZombie extends EntityZombie
+public class ZombiePigMob extends ZombieMob
 {
 
-    public EntityPigZombie(World world)
+    public ZombiePigMob(World world)
     {
         super(world);
         angerLevel = 0;
@@ -46,11 +46,11 @@ public class EntityPigZombie extends EntityZombie
     }
 
     @Override
-	public boolean getCanSpawnHere()
+	public boolean canSpawnHere()
     {
-    	int x = MathHelper.floor_double(this.x);
-    	int y = MathHelper.floor_double(this.y);
-    	int z = MathHelper.floor_double(this.z);
+    	int x = MathHelper.floor(this.x);
+    	int y = MathHelper.floor(this.y);
+    	int z = MathHelper.floor(this.z);
     	if(world.getBlockId(x, y, z) != 0) return false;
     	int blockLight = world.getSavedLightValue(LightLayer.Block, x, y, z);
     	if(blockLight > 7) return false;
@@ -89,15 +89,15 @@ public class EntityPigZombie extends EntityZombie
     	if(type == DamageType.FIRE) {
     		return false;
     	}
-        if(attacker instanceof EntityPlayer)
+        if(attacker instanceof Player)
         {
-            List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(32D, 32D, 32D));
+            List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.grow(32D, 32D, 32D));
             for(int j = 0; j < list.size(); j++)
             {
                 Entity entity1 = (Entity)list.get(j);
-                if(entity1 instanceof EntityPigZombie)
+                if(entity1 instanceof ZombiePigMob)
                 {
-                    EntityPigZombie entitypigzombie = (EntityPigZombie)entity1;
+                    ZombiePigMob entitypigzombie = (ZombiePigMob)entity1;
                     entitypigzombie.becomeAngryAt(attacker);
                 }
             }
@@ -141,14 +141,14 @@ public class EntityPigZombie extends EntityZombie
         if (!(drop < 0.5f)) {
             if (drop < 0.95f) {
                 if (isOnFire()) {
-                    drops.add(new WeightedRandomLootObject(Item.foodPorkchopCooked.getDefaultStack(), 0, 1));
+                    drops.add(new WeightedRandomLootObject(Items.FOOD_PORKCHOP_COOKED.getDefaultStack(), 0, 1));
                 } else {
-                    drops.add(new WeightedRandomLootObject(Item.foodPorkchopRaw.getDefaultStack(), 0, 1));
+                    drops.add(new WeightedRandomLootObject(Items.FOOD_PORKCHOP_RAW.getDefaultStack(), 0, 1));
                 }
             } else if (drop < 0.99f) {
-                drops.add(new WeightedRandomLootObject(Item.oreRawGold.getDefaultStack(), 0, 1));
+                drops.add(new WeightedRandomLootObject(Items.ORE_RAW_GOLD.getDefaultStack(), 0, 1));
             } else {
-                drops.add(new WeightedRandomLootObject(Item.toolSwordGold.getDefaultStack(), 0, 1));
+                drops.add(new WeightedRandomLootObject(Items.TOOL_SWORD_GOLD.getDefaultStack(), 0, 1));
             }
         }
 
@@ -167,6 +167,6 @@ public class EntityPigZombie extends EntityZombie
 
     static 
     {
-        defaultHeldItem = new ItemStack(Item.toolSwordGold, 1);
+        defaultHeldItem = new ItemStack(Items.TOOL_SWORD_GOLD, 1);
     }
 }
diff --git a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java b/src/main/java/net/minecraft/core/entity/player/Player.java
similarity index 75%
rename from src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
rename to src/main/java/net/minecraft/core/entity/player/Player.java
index c689d17d5..9f0485ba7 100644
--- a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
+++ b/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -2,57 +2,59 @@ package net.minecraft.core.entity.player;
 
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
-import net.minecraft.core.achievement.AchievementList;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.core.block.BedBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBed;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityDispenser;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.block.entity.TileEntityFurnace;
-import net.minecraft.core.block.entity.TileEntitySign;
-import net.minecraft.core.block.entity.TileEntityTrommel;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.block.entity.SignBlockEntity;
+import net.minecraft.core.block.entity.TrommelBlockEntity;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityBobber;
+import net.minecraft.core.entity.FishingBobberEntity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLightningBolt;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.EntityTNT;
-import net.minecraft.core.entity.animal.EntityPig;
-import net.minecraft.core.entity.animal.EntityWolf;
-import net.minecraft.core.entity.monster.EntityCreeper;
-import net.minecraft.core.entity.monster.EntityGhast;
-import net.minecraft.core.entity.monster.EntityGiant;
-import net.minecraft.core.entity.monster.EntityMonster;
-import net.minecraft.core.entity.monster.EntityPigZombie;
-import net.minecraft.core.entity.monster.EntitySkeleton;
-import net.minecraft.core.entity.monster.EntitySlime;
-import net.minecraft.core.entity.monster.EntitySnowman;
-import net.minecraft.core.entity.monster.EntitySpider;
-import net.minecraft.core.entity.monster.EntityZombie;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityCannonball;
-import net.minecraft.core.entity.projectile.EntityFireball;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.TNTPrimedEntity;
+import net.minecraft.core.entity.animal.PigMob;
+import net.minecraft.core.entity.animal.WolfMob;
+import net.minecraft.core.entity.monster.CreeperMob;
+import net.minecraft.core.entity.monster.GhastMob;
+import net.minecraft.core.entity.monster.GiantMob;
+import net.minecraft.core.entity.monster.Monster;
+import net.minecraft.core.entity.monster.ZombiePigMob;
+import net.minecraft.core.entity.monster.SkeletonMob;
+import net.minecraft.core.entity.monster.SlimeMob;
+import net.minecraft.core.entity.monster.SnowmanMob;
+import net.minecraft.core.entity.monster.SpiderMob;
+import net.minecraft.core.entity.monster.ZombieMob;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.entity.projectile.ArrowProjectileGolden;
+import net.minecraft.core.entity.projectile.CannonballProjectile;
+import net.minecraft.core.entity.projectile.FireballProjectile;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.enums.EnumSleepStatus;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.tool.ItemToolSword;
+import net.minecraft.core.item.tool.SwordToolItem;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.Container;
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.IInventory;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.AbstractContainerMenu;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
@@ -60,36 +62,77 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.core.world.weather.Weathers;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
-public abstract class EntityPlayer extends EntityLiving
+public abstract class Player extends Mob
 {
     public static final TextFormatting deathMsgColor = TextFormatting.RED;
+    public Inventory inventory;
+    public AbstractContainerMenu inventorySlots;
+    public AbstractContainerMenu craftingInventory;
+    public Gamemode gamemode = Gamemode.survival;
+    //    public byte userType;
+    public int score;
+    public List<String> messageHistory = new ArrayList<>();
+    public float cameraVelocityOld;
+    public float cameraVelocity;
+    public boolean isSwinging;
+    public int swingProgressInt;
+    public String username;
+    public int dimension;
+    public double xdO;
+    public double ydO;
+    public double zd0;
+    protected boolean sleeping;
+    public ChunkCoordinates bedChunkCoordinates;
+    private int sleepTimer;
+    public float sleepOffX;
+    public float sleepOffY;
+    public float sleepOffZ;
+    private ChunkCoordinates playerSpawnCoordinate;
+    private ChunkCoordinates lastDeathCoordinate;
+    private ChunkCoordinates startMinecartRidingCoordinate;
+    public int timeUntilPortal;
+    protected boolean inPortal;
+    public int portalID;
+    public float timeInPortal;
+    public float prevTimeInPortal;
+    private final int damageRemainder;
+    public FishingBobberEntity bobberEntity;
+    public volatile String skinURL;
+    public volatile String capeURL;
+    public boolean slimModel = false;
+
+    protected float baseSpeed = 0.1f;
+    protected float baseFlySpeed = 0.02f;
+    protected boolean isDwarf = false;
+    public int lastRenderTick = 0;
+    public float wobbleTimer = 0;
 
-    public EntityPlayer(World world)
+    public Player(World world)
     {
         super(world);
-        inventory = new InventoryPlayer(this);
-        field_9371_f = 0;
+        inventory = new Inventory(this);
+//        userType = 0;
         score = 0;
         isSwinging = false;
         swingProgressInt = 0;
         timeUntilPortal = 20;
         inPortal = false;
         bobberEntity = null;
-        inventorySlots = new ContainerPlayer(inventory, !world.isClientSide);
+        inventorySlots = new InventoryMenu(inventory, !world.isClientSide);
         craftingInventory = inventorySlots;
         heightOffset = 1.62F;
         ChunkCoordinates chunkcoordinates = world.getSpawnPoint();
         moveTo((double)chunkcoordinates.x + 0.5D, chunkcoordinates.y + 1, (double)chunkcoordinates.z + 0.5D, 0.0F, 0.0F);
         entityType = "humanoid";
-        unusedRotation2 = 180F;
+//        rotOffs = 180F;
         fireImmuneTicks = 20;
         textureIdentifier = new NamespaceID("minecraft", "char");
         damageRemainder = 0;
@@ -129,9 +172,9 @@ public abstract class EntityPlayer extends EntityLiving
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
-        super.init();
+        super.defineSynchedData();
         entityData.define(16, (byte) 0);
         entityData.define(17, (byte) 0); // selected art
         entityData.define(18, -1);
@@ -140,7 +183,7 @@ public abstract class EntityPlayer extends EntityLiving
     @Override
     public boolean canSkate() 
     {
-        return inventory.armorInventory[0] != null && inventory.armorInventory[0].itemID == Item.armorBootsIceskates.id;
+        return inventory.armorInventory[0] != null && inventory.armorInventory[0].itemID == Items.ARMOR_BOOTS_ICESKATES.id;
     }
 
     @Override
@@ -164,7 +207,7 @@ public abstract class EntityPlayer extends EntityLiving
                 {
                     wakeUpPlayer(true, true);
                 } else
-                if(world.isDaytime() && world.getCurrentWeather() != Weather.overworldStorm)
+                if(world.isDaytime() && world.getCurrentWeather() != Weathers.OVERWORLD_STORM)
                 {
                     wakeUpPlayer(false, true);
                 }
@@ -180,7 +223,7 @@ public abstract class EntityPlayer extends EntityLiving
         }
         super.tick();
 
-        if(!world.isClientSide && craftingInventory != null && !craftingInventory.isUsableByPlayer(this))
+        if(!world.isClientSide && craftingInventory != null && !craftingInventory.stillValid(this))
         {
             closeScreen();
             craftingInventory = inventorySlots;
@@ -227,7 +270,7 @@ public abstract class EntityPlayer extends EntityLiving
     }
 
     @Override
-    protected void updatePlayerActionState()
+    protected void updateAI()
     {
         if(isSwinging)
         {
@@ -264,7 +307,7 @@ public abstract class EntityPlayer extends EntityLiving
             flySpeed += (double)baseFlySpeed * 0.3;
         }
 
-        double velocity = MathHelper.sqrt_double(xd * xd + zd * zd);
+        double velocity = MathHelper.sqrt(xd * xd + zd * zd);
         double pitch = (float) Math.atan(-yd * 0.2D) * 15F;
         if(velocity > 0.1F)
         {
@@ -291,7 +334,7 @@ public abstract class EntityPlayer extends EntityLiving
 
         if(getHealth() > 0)
         {
-            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(1.0D, 0.5D, 1.0D));
+            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.grow(1.0D, 0.5D, 1.0D));
             if(list != null)
             {
                 for (Entity entity : list) {
@@ -324,7 +367,7 @@ public abstract class EntityPlayer extends EntityLiving
     private void collideWithPlayer(Entity entity)
     {
         entity.playerTouch(this);
-        String entityName = EntityDispatcher.getEntityString(entity);
+        String entityName = EntityDispatcher.getEncodeId(entity);
         addStat(StatList.mobEncounterStats.get(entityName), 1);
     }
 
@@ -346,15 +389,15 @@ public abstract class EntityPlayer extends EntityLiving
         yd = 0.1d;
         if(username.equals("MaggAndGeez"))
         {
-            dropPlayerItemWithRandomChoice(new ItemStack(Item.ammoFireball, 1), true);
+            dropPlayerItemWithRandomChoice(new ItemStack(Items.AMMO_FIREBALL, 1), true);
         }
         else if (username.equals("jonkadelic"))
         {
-            dropPlayerItemWithRandomChoice(new ItemStack(Item.foodCookie, 1), true);
+            dropPlayerItemWithRandomChoice(new ItemStack(Items.FOOD_COOKIE, 1), true);
         }
         else if (username.equals("AnActualSign"))
         {
-            dropPlayerItemWithRandomChoice(new ItemStack(Item.sign, 1), true);
+            dropPlayerItemWithRandomChoice(new ItemStack(Items.SIGN, 1), true);
         }
         if (!world.getGameRuleValue(GameRules.KEEP_INVENTORY))
         {
@@ -363,8 +406,8 @@ public abstract class EntityPlayer extends EntityLiving
         }
         if(entityKilledBy != null)
         {
-            xd = -MathHelper.cos(((attackedAtYaw + yRot) * 3.141593F) / 180F) * 0.1F;
-            zd = -MathHelper.sin(((attackedAtYaw + yRot) * 3.141593F) / 180F) * 0.1F;
+            xd = -MathHelper.cos(((attackedAtYaw + yRot) * MathHelper.PI) / 180F) * 0.1F;
+            zd = -MathHelper.sin(((attackedAtYaw + yRot) * MathHelper.PI) / 180F) * 0.1F;
         } else
         {
             xd = zd = 0.0D;
@@ -382,9 +425,9 @@ public abstract class EntityPlayer extends EntityLiving
         {
             return getDisplayName() + deathMsgColor + " was killed by Herobrine.";
         }
-        if (entityKilledBy instanceof EntityZombie)
+        if (entityKilledBy instanceof ZombieMob)
         {
-            if (entityKilledBy instanceof EntityPigZombie)
+            if (entityKilledBy instanceof ZombiePigMob)
             {
                 return getDisplayName() + deathMsgColor + " discovered mob mentality.";
             }
@@ -393,113 +436,113 @@ public abstract class EntityPlayer extends EntityLiving
                 return getDisplayName() + deathMsgColor + " became a zombie.";
             }
         }
-        if (entityKilledBy instanceof EntityCreeper)
+        if (entityKilledBy instanceof CreeperMob)
         {
             return deathMsgColor + "Aw man, " + getDisplayName() + deathMsgColor + " didn't see the creeper.";
         }
-        if (entityKilledBy instanceof EntitySkeleton)
+        if (entityKilledBy instanceof SkeletonMob)
         {
             return getDisplayName() + deathMsgColor + " was a victim of aimbot.";
         }
-        if (entityKilledBy instanceof EntitySpider)
+        if (entityKilledBy instanceof SpiderMob)
         {
             return getDisplayName() + deathMsgColor + " spent too much time on the web.";
         }
-        if (entityKilledBy instanceof EntityGhast)
+        if (entityKilledBy instanceof GhastMob)
         {
             return getDisplayName() + deathMsgColor + " didn't return the serve.";
         }
-        if (entityKilledBy instanceof EntitySlime)
+        if (entityKilledBy instanceof SlimeMob)
         {
             return getDisplayName() + deathMsgColor + " was slimed.";
         }
-        if (entityKilledBy instanceof EntityWolf)
+        if (entityKilledBy instanceof WolfMob)
         {
             return getDisplayName() + deathMsgColor + " got what they deserved.";
         }
-        if (entityKilledBy instanceof EntityArrowGolden)
+        if (entityKilledBy instanceof ArrowProjectileGolden)
         {
-            if (((EntityArrowGolden) entityKilledBy).owner instanceof EntityPlayerMP)
+            if (((ArrowProjectileGolden) entityKilledBy).owner instanceof ServerPlayer)
             {
-                if (((EntityPlayerMP) ((EntityArrowGolden) entityKilledBy).owner).username.equals(username))
+                if (((ServerPlayer) ((ArrowProjectileGolden) entityKilledBy).owner).username.equals(username))
                 {
                     return getDisplayName() + deathMsgColor + " got gold in their eye.";
                 }
                 return getDisplayName() + deathMsgColor + " got pierced by " +
-                    ((EntityArrow) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
+                    ((ArrowProjectile) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
             }
             else
             {
                 return getDisplayName() + deathMsgColor + " is Swiss cheese.";
             }
         }
-        if (entityKilledBy instanceof EntityArrow)
+        if (entityKilledBy instanceof ArrowProjectile)
         {
-            if (((EntityArrow) entityKilledBy).owner instanceof EntitySkeleton)
+            if (((ArrowProjectile) entityKilledBy).owner instanceof SkeletonMob)
             {
                 return getDisplayName() + deathMsgColor + " was a victim of aimbot.";
             }
-            else if (((EntityArrow) entityKilledBy).owner instanceof EntityPlayerMP)
+            else if (((ArrowProjectile) entityKilledBy).owner instanceof ServerPlayer)
             {
-                if (((EntityPlayerMP) ((EntityArrow) entityKilledBy).owner).username.equals(username))
+                if (((ServerPlayer) ((ArrowProjectile) entityKilledBy).owner).username.equals(username))
                 {
                     return getDisplayName() + deathMsgColor + " lost a game of Russian roulette.";
                 }
                 return getDisplayName() + deathMsgColor + " got 360 noscoped by " +
-                    ((EntityArrow) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
+                    ((ArrowProjectile) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
             }
             else
             {
                 return getDisplayName() + deathMsgColor + " is a pincushion.";
             }
         }
-        if (entityKilledBy instanceof EntityCannonball)
+        if (entityKilledBy instanceof CannonballProjectile)
         {
-            if (((EntityCannonball) entityKilledBy).owner instanceof EntityPlayerMP)
+            if (((CannonballProjectile) entityKilledBy).owner instanceof ServerPlayer)
             {
-                if (((EntityPlayerMP) ((EntityCannonball) entityKilledBy).owner).username.equals(username))
+                if (((ServerPlayer) ((CannonballProjectile) entityKilledBy).owner).username.equals(username))
                 {
                     return getDisplayName() + deathMsgColor + " jumped too high.";
                 }
                 return getDisplayName() + deathMsgColor + " was fragmented by " +
-                    ((EntityCannonball) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
+                    ((CannonballProjectile) entityKilledBy).owner.getDisplayName() + deathMsgColor + ".";
             }
             else
             {
                 return getDisplayName() + deathMsgColor + " was detonated remotely.";
             }
         }
-        if (entityKilledBy instanceof EntityFireball)
+        if (entityKilledBy instanceof FireballProjectile)
         {
             return getDisplayName() + deathMsgColor + " didn't return the serve.";
         }
-        if (entityKilledBy instanceof EntityGiant)
+        if (entityKilledBy instanceof GiantMob)
         {
             return getDisplayName() + deathMsgColor + " was killed by- wait, what?!";
         }
-        if (entityKilledBy instanceof EntityLightningBolt)
+        if (entityKilledBy instanceof LightningEntity)
         {
             return getDisplayName() + deathMsgColor + " was grounded.";
         }
-        if (entityKilledBy instanceof EntityTNT)
+        if (entityKilledBy instanceof TNTPrimedEntity)
         {
             return getDisplayName() + deathMsgColor + " was killed by Popbob.";
         }
-        if (entityKilledBy instanceof EntityPlayerMP)
+        if (entityKilledBy instanceof ServerPlayer)
         {
-            return getDisplayName() + deathMsgColor + " was backstabbed by " + ((EntityPlayerMP) entityKilledBy).getDisplayName() + deathMsgColor + ".";
+            return getDisplayName() + deathMsgColor + " was backstabbed by " + ((ServerPlayer) entityKilledBy).getDisplayName() + deathMsgColor + ".";
         }
-        if (entityKilledBy instanceof EntityPig)
+        if (entityKilledBy instanceof PigMob)
         {
             return getDisplayName() + deathMsgColor + " is *really* bad at Minecraft.";
         }
         else
         {
-            if (world.getBlockMaterial(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) == Material.lava)
+            if (world.getBlockMaterial(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) == Material.lava)
             {
                 return getDisplayName() + deathMsgColor + " got lost in the sauce.";
             }
-            if (world.getBlockId(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) == Block.spikes.id)
+            if (world.getBlockId(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) == Blocks.SPIKES.id)
             {
                 return getDisplayName() + deathMsgColor + " fell for the trap.";
             }
@@ -520,7 +563,7 @@ public abstract class EntityPlayer extends EntityLiving
     }
     
     @Override
-    protected void dropFewItems()
+    protected void dropDeathItems()
     {
     }
 
@@ -528,7 +571,7 @@ public abstract class EntityPlayer extends EntityLiving
 	public void awardKillScore(Entity entity, int i)
     {
         score += i;
-        if(entity instanceof EntityPlayer)
+        if(entity instanceof Player)
         {
             addStat(StatList.playerKillsStat, 1);
         } else
@@ -539,7 +582,7 @@ public abstract class EntityPlayer extends EntityLiving
 
     public void dropCurrentItem(boolean dropFullStack)
     {
-        dropPlayerItemWithRandomChoice(inventory.decrStackSize(inventory.currentItem, dropFullStack ? 64 : 1), false);
+        dropPlayerItemWithRandomChoice(inventory.removeItem(inventory.currentItem, dropFullStack ? 64 : 1), false);
     }
 
     public void dropPlayerItem(ItemStack itemstack)
@@ -589,24 +632,24 @@ public abstract class EntityPlayer extends EntityLiving
         {
             return;
         }
-        EntityItem entityitem = new EntityItem(world, x, (y - 0.30000001192092896D) + (double) this.getHeadHeight(), z, itemstack);
-        entityitem.delayBeforeCanPickup = 40;
+        ItemEntity entityitem = new ItemEntity(world, x, (y - 0.30000001192092896D) + (double) this.getHeadHeight(), z, itemstack);
+        entityitem.pickupDelay = 40;
         float f = 0.1F;
         if(flag)
         {
             float f2 = random.nextFloat() * 0.5F;
-            float f4 = random.nextFloat() * 3.141593F * 2.0F;
+            float f4 = random.nextFloat() * MathHelper.PI * 2.0F;
             entityitem.xd = -MathHelper.sin(f4) * f2;
             entityitem.zd = MathHelper.cos(f4) * f2;
-            entityitem.yd = 0.20000000298023224D;
+            entityitem.yd = 0.2D;
         } else
         {
             float f1 = 0.3F;
-            entityitem.xd = -MathHelper.sin((yRot / 180F) * 3.141593F) * MathHelper.cos((xRot / 180F) * 3.141593F) * f1;
-            entityitem.zd = MathHelper.cos((yRot / 180F) * 3.141593F) * MathHelper.cos((xRot / 180F) * 3.141593F) * f1;
-            entityitem.yd = -MathHelper.sin((xRot / 180F) * 3.141593F) * f1 + 0.1F;
+            entityitem.xd = -MathHelper.sin((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI) * f1;
+            entityitem.zd = MathHelper.cos((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI) * f1;
+            entityitem.yd = -MathHelper.sin((xRot / 180F) * MathHelper.PI) * f1 + 0.1F;
             f1 = 0.02F;
-            float f3 = random.nextFloat() * 3.141593F * 2.0F;
+            float f3 = random.nextFloat() * MathHelper.PI * 2.0F;
             f1 *= random.nextFloat();
             entityitem.xd += java.lang.Math.cos(f3) * (double)f1;
             entityitem.yd += (random.nextFloat() - random.nextFloat()) * 0.1F;
@@ -616,7 +659,7 @@ public abstract class EntityPlayer extends EntityLiving
         addStat(StatList.dropStat, 1);
     }
 
-    protected void joinEntityItemWithWorld(EntityItem entityitem)
+    protected void joinEntityItemWithWorld(ItemEntity entityitem)
     {
         world.entityJoinedWorld(entityitem);
     }
@@ -624,7 +667,7 @@ public abstract class EntityPlayer extends EntityLiving
     public float getCurrentPlayerStrVsBlock(Block block)
     {
         float f = inventory.getStrVsBlock(block);
-        float defaultBreakSpeed = (inventory.getCurrentItem() != null && inventory.getCurrentItem().getItem() instanceof ItemToolSword) ? 1.51f : 1.01f;
+        float defaultBreakSpeed = (inventory.getCurrentItem() != null && inventory.getCurrentItem().getItem() instanceof SwordToolItem) ? 1.51f : 1.01f;
         if (this.getGamemode().doesRequireToolToBreak() && f <= defaultBreakSpeed) return 0; // Requires to break and not effective against block
         if(isUnderLiquid(Material.water))
         {
@@ -658,7 +701,7 @@ public abstract class EntityPlayer extends EntityLiving
         noPhysics = tag.getBoolean("Noclip") && gamemode.canPlayerFly();
         if(sleeping)
         {
-            bedChunkCoordinates = new ChunkCoordinates(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z));
+            bedChunkCoordinates = new ChunkCoordinates(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z));
             wakeUpPlayer(true, true);
         }
         if(tag.containsKey("SpawnX") && tag.containsKey("SpawnY") && tag.containsKey("SpawnZ"))
@@ -706,7 +749,7 @@ public abstract class EntityPlayer extends EntityLiving
         return TextFormatting.get(chatColor) + name;
     }
 
-    public void displayGUIChest(IInventory iinventory)
+    public void displayGUIChest(Container iinventory)
     {
     }
 
@@ -725,7 +768,7 @@ public abstract class EntityPlayer extends EntityLiving
     public void displayGUIMobSpawnerPicker(int x, int y, int z) { }
     public void displayGUIWandMonsterPicker(ItemStack stack) { }
 
-    public void onItemPickup(Entity entity, int i)
+    public void onItemPickup(Entity entity, ItemStack item)
     {
     }
 
@@ -771,7 +814,7 @@ public abstract class EntityPlayer extends EntityLiving
         {
             wakeUpPlayer(true, true);
         }
-        if((attacker instanceof EntityMonster) || (attacker instanceof EntityArrow))
+        if((attacker instanceof Monster) || (attacker instanceof ArrowProjectile))
         {
             if(world.difficultySetting == 0)
             {
@@ -787,21 +830,21 @@ public abstract class EntityPlayer extends EntityLiving
             }
         }
         Object obj = attacker;
-        if (damage == 0 && !(attacker instanceof EntitySnowman))
+        if (damage == 0 && !(attacker instanceof SnowmanMob))
         {
             return false;
         }
-        if((obj instanceof EntityArrow) && ((EntityArrow)obj).owner != null)
+        if((obj instanceof ArrowProjectile) && ((ArrowProjectile)obj).owner != null)
         {
-            obj = ((EntityArrow)obj).owner;
+            obj = ((ArrowProjectile)obj).owner;
         }
-        if(obj instanceof EntityLiving)
+        if(obj instanceof Mob)
         {
-            alertWolves((EntityLiving)obj, false);
+            alertWolves((Mob)obj, false);
         }
         addStat(StatList.damageTakenStat, damage);
         if (attacker != null) {
-            String entityName = EntityDispatcher.getEntityString(attacker);
+            String entityName = EntityDispatcher.getEncodeId(attacker);
             addStat(StatList.mobEncounterStats.get(entityName), 1);
         }
 
@@ -813,25 +856,25 @@ public abstract class EntityPlayer extends EntityLiving
         return false;
     }
 
-    protected void alertWolves(EntityLiving entityliving, boolean flag)
+    protected void alertWolves(Mob entityliving, boolean flag)
     {
-        if((entityliving instanceof EntityCreeper) || (entityliving instanceof EntityGhast))
+        if((entityliving instanceof CreeperMob) || (entityliving instanceof GhastMob))
         {
             return;
         }
-        if(entityliving instanceof EntityWolf)
+        if(entityliving instanceof WolfMob)
         {
-            EntityWolf entitywolf = (EntityWolf)entityliving;
+            WolfMob entitywolf = (WolfMob)entityliving;
             if(entitywolf.isWolfTamed() && username.equals(entitywolf.getWolfOwner()))
             {
                 return;
             }
         }
-        if((entityliving instanceof EntityPlayer) && !func_27025_G())
+        if((entityliving instanceof Player) && !func_27025_G())
         {
             return;
         }
-        List list = world.getEntitiesWithinAABB(EntityWolf.class, AABB.getBoundingBoxFromPool(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(16D, 4D, 16D));
+        List list = world.getEntitiesWithinAABB(WolfMob.class, AABB.getTemporaryBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).grow(16D, 4D, 16D));
         Iterator iterator = list.iterator();
         do
         {
@@ -840,7 +883,7 @@ public abstract class EntityPlayer extends EntityLiving
                 break;
             }
             Entity entity = (Entity)iterator.next();
-            EntityWolf entitywolf1 = (EntityWolf)entity;
+            WolfMob entitywolf1 = (WolfMob)entity;
             if(entitywolf1.isWolfTamed() && entitywolf1.getTarget() == null && username.equals(entitywolf1.getWolfOwner()) && (!flag || !entitywolf1.isWolfSitting()))
             {
                 entitywolf1.setWolfSitting(false);
@@ -869,32 +912,32 @@ public abstract class EntityPlayer extends EntityLiving
         super.damageEntity(newDamage, damageType);
     }
     
-    public void displayGUIFurnace(TileEntityFurnace tileentityfurnace)
+    public void displayGUIFurnace(FurnaceBlockEntity tileentityfurnace)
     {
     }
 
-    public void displayGUITrommel(TileEntityTrommel tileEntityTrommel)
+    public void displayGUITrommel(TrommelBlockEntity tileEntityTrommel)
     {
     }
 
-    public void displayGUIDispenser(TileEntityDispenser tileentitydispenser)
+    public void displayGUIDispenser(DispenserBlockEntity tileentitydispenser)
     {
     }
 
-    public void displayGUIGuidebook(TileEntityDispenser tileentitydispenser)
+    public void displayGUIGuidebook(DispenserBlockEntity tileentitydispenser)
     {
     }
 
-    public void displayGUIEditSign(TileEntitySign tileentitysign)
+    public void displayGUIEditSign(SignBlockEntity tileentitysign)
     {
     }
 
-    public void displayGUIEditFlag(TileEntityFlag tileEntityFlag)
+    public void displayGUIEditFlag(FlagBlockEntity tileEntityFlag)
     {
     }
 
     @Override
-    public boolean interact(EntityPlayer entityplayer) {
+    public boolean interact(Player entityplayer) {
         return false;
     }
 
@@ -907,9 +950,9 @@ public abstract class EntityPlayer extends EntityLiving
             flag = true;
         }
         ItemStack itemstack = getCurrentEquippedItem();
-        if(itemstack != null && (entity instanceof EntityLiving))
+        if(itemstack != null && (entity instanceof Mob))
         {
-            if (itemstack.useItemOnEntity((EntityLiving)entity, this))
+            if (itemstack.useItemOnEntity((Mob)entity, this))
             {
                 swingItem();
                 flag = true;
@@ -929,7 +972,7 @@ public abstract class EntityPlayer extends EntityLiving
 
     public void destroyCurrentEquippedItem()
     {
-        inventory.setInventorySlotContents(inventory.currentItem, null);
+        inventory.setItem(inventory.currentItem, null);
     }
 
     @Override
@@ -956,24 +999,24 @@ public abstract class EntityPlayer extends EntityLiving
             }
             entity.hurt(this, i, DamageType.COMBAT);
             ItemStack itemstack = getCurrentEquippedItem();
-            if(itemstack != null && (entity instanceof EntityLiving))
+            if(itemstack != null && (entity instanceof Mob))
             {
-                itemstack.hitEntity((EntityLiving)entity, this);
+                itemstack.hitEntity((Mob)entity, this);
                 if(itemstack.stackSize <= 0)
                 {
                     destroyCurrentEquippedItem();
                 }
             }
-            if(entity instanceof EntityLiving)
+            if(entity instanceof Mob)
             {
                 if(entity.isAlive())
                 {
-                    alertWolves((EntityLiving)entity, true);
+                    alertWolves((Mob)entity, true);
                 }
                 addStat(StatList.damageDealtStat, i);
             }
         }
-        String entityName = EntityDispatcher.getEntityString(entity);
+        String entityName = EntityDispatcher.getEncodeId(entity);
         addStat(StatList.mobEncounterStats.get(entityName), 1);
     }
 
@@ -1028,7 +1071,7 @@ public abstract class EntityPlayer extends EntityLiving
                 return EnumSleepStatus.DISABLED_BY_GAMERULE;
             }
 
-            if(world.isDaytime() && world.getCurrentWeather() != Weather.overworldStorm) {
+            if(world.isDaytime() && world.getCurrentWeather() != Weathers.OVERWORLD_STORM) {
             	sendStatusMessage(I18n.getInstance().translateKey("bed.noSleep"));
                 return EnumSleepStatus.NOT_POSSIBLE_NOW;
             }
@@ -1043,7 +1086,7 @@ public abstract class EntityPlayer extends EntityLiving
         if(world.isBlockLoaded(x, y, z))
         {
             int meta = world.getBlockMetadata(x, y, z);
-            int dir = BlockBed.getDirectionFromMetadata(meta);
+            int dir = BedBlock.getDirection(meta);
             float xOff = 0.5F;
             float zOff = 0.5F;
             
@@ -1074,24 +1117,24 @@ public abstract class EntityPlayer extends EntityLiving
 
     private void func_22052_e(int i)
     {
-        field_22063_x = 0.0F;
-        field_22061_z = 0.0F;
+        sleepOffX = 0.0F;
+        sleepOffZ = 0.0F;
         switch(i)
         {
         case 0: // '\0'
-            field_22061_z = -1.8F;
+            sleepOffZ = -1.8F;
             break;
 
         case 2: // '\002'
-            field_22061_z = 1.8F;
+            sleepOffZ = 1.8F;
             break;
 
         case 1: // '\001'
-            field_22063_x = 1.8F;
+            sleepOffX = 1.8F;
             break;
 
         case 3: // '\003'
-            field_22063_x = -1.8F;
+            sleepOffX = -1.8F;
             break;
         }
     }
@@ -1101,10 +1144,10 @@ public abstract class EntityPlayer extends EntityLiving
         setSize(0.6F, 1.8F);
         resetHeight();
         ChunkCoordinates chunkcoordinates = bedChunkCoordinates;
-        if(chunkcoordinates != null && world.getBlock(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) instanceof BlockBed)
+        if(chunkcoordinates != null && world.getBlock(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) instanceof BedBlock)
         {
-            BlockBed.setBedOccupied(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, false);
-            ChunkCoordinates chunkcoordinates2 = BlockBed.getNearestEmptyChunkCoordinates(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0);
+            BedBlock.setBedOccupied(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, false);
+            ChunkCoordinates chunkcoordinates2 = BedBlock.getNearestEmptyChunkCoordinates(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0);
             if(chunkcoordinates2 == null)
             {
                 chunkcoordinates2 = new ChunkCoordinates(chunkcoordinates.x, chunkcoordinates.y + 1, chunkcoordinates.z);
@@ -1127,7 +1170,7 @@ public abstract class EntityPlayer extends EntityLiving
 
     private boolean isInBed()
     {
-        return world.getBlock(bedChunkCoordinates.x, bedChunkCoordinates.y, bedChunkCoordinates.z) instanceof BlockBed;
+        return world.getBlock(bedChunkCoordinates.x, bedChunkCoordinates.y, bedChunkCoordinates.z) instanceof BedBlock;
     }
 
     public static ChunkCoordinates getValidBedSpawnCoordinates(World world, ChunkCoordinates coords)
@@ -1138,8 +1181,8 @@ public abstract class EntityPlayer extends EntityLiving
         chunkProvider.prepareChunk(coords.x + 3 >> 4, coords.z - 3 >> 4);
         chunkProvider.prepareChunk(coords.x - 3 >> 4, coords.z + 3 >> 4);
         chunkProvider.prepareChunk(coords.x + 3 >> 4, coords.z + 3 >> 4);
-        if (world.getBlock(coords.x, coords.y, coords.z) instanceof BlockBed) {
-            return BlockBed.getNearestEmptyChunkCoordinates(world, coords.x, coords.y, coords.z, 0);
+        if (world.getBlock(coords.x, coords.y, coords.z) instanceof BedBlock) {
+            return BedBlock.getNearestEmptyChunkCoordinates(world, coords.x, coords.y, coords.z, 0);
         } else {
             return null;
         }
@@ -1150,7 +1193,7 @@ public abstract class EntityPlayer extends EntityLiving
         if(bedChunkCoordinates != null)
         {
             int i = world.getBlockMetadata(bedChunkCoordinates.x, bedChunkCoordinates.y, bedChunkCoordinates.z);
-            int j = BlockBed.getDirectionFromMetadata(i);
+            int j = BedBlock.getDirection(i);
             switch(j)
             {
             case 0: // '\0'
@@ -1267,7 +1310,7 @@ public abstract class EntityPlayer extends EntityLiving
         }
         if(isUnderLiquid(Material.water))
         {
-            int i = java.lang.Math.round(MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2) * 100F);
+            int i = java.lang.Math.round(MathHelper.sqrt(d * d + d1 * d1 + d2 * d2) * 100F);
             if(i > 0)
             {
                 addStat(StatList.distanceDoveStat, i);
@@ -1275,7 +1318,7 @@ public abstract class EntityPlayer extends EntityLiving
         } else
         if(isInWater())
         {
-            int j = java.lang.Math.round(MathHelper.sqrt_double(d * d + d2 * d2) * 100F);
+            int j = java.lang.Math.round(MathHelper.sqrt(d * d + d2 * d2) * 100F);
             if(j > 0)
             {
                 addStat(StatList.distanceSwumStat, j);
@@ -1290,14 +1333,14 @@ public abstract class EntityPlayer extends EntityLiving
         } else
         if(onGround)
         {
-            int k = java.lang.Math.round(MathHelper.sqrt_double(d * d + d2 * d2) * 100F);
+            int k = java.lang.Math.round(MathHelper.sqrt(d * d + d2 * d2) * 100F);
             if(k > 0)
             {
                 addStat(StatList.distanceWalkedStat, k);
             }
         } else
         {
-            int l = java.lang.Math.round(MathHelper.sqrt_double(d * d + d2 * d2) * 100F);
+            int l = java.lang.Math.round(MathHelper.sqrt(d * d + d2 * d2) * 100F);
             if(l > 25)
             {
                 addStat(StatList.distanceFlownStat, l);
@@ -1309,26 +1352,26 @@ public abstract class EntityPlayer extends EntityLiving
     {
         if(vehicle != null)
         {
-            int i = java.lang.Math.round(MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2) * 100F);
+            int i = java.lang.Math.round(MathHelper.sqrt(d * d + d1 * d1 + d2 * d2) * 100F);
             if(i > 0)
             {
-                if(vehicle instanceof EntityMinecart)
+                if(vehicle instanceof MinecartEntity)
                 {
                     addStat(StatList.distanceByMinecartStat, i);
                     if(startMinecartRidingCoordinate == null)
                     {
-                        startMinecartRidingCoordinate = new ChunkCoordinates(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z));
+                        startMinecartRidingCoordinate = new ChunkCoordinates(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z));
                     } else
-                    if(startMinecartRidingCoordinate.getSqDistanceTo(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)) >= 1000D)
+                    if(startMinecartRidingCoordinate.getSqDistanceTo(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) >= 1000D)
                     {
-                        addStat(AchievementList.ON_A_RAIL, 1);
+                        addStat(Achievements.ON_A_RAIL, 1);
                     }
                 } else
-                if(vehicle instanceof EntityBoat)
+                if(vehicle instanceof BoatEntity)
                 {
                     addStat(StatList.distanceByBoatStat, i);
                 } else
-                if(vehicle instanceof EntityPig)
+                if(vehicle instanceof PigMob)
                 {
                     addStat(StatList.distanceByPigStat, i);
                 }
@@ -1337,21 +1380,21 @@ public abstract class EntityPlayer extends EntityLiving
     }
 
     @Override
-	protected void causeFallDamage(float f)
+	protected void causeFallDamage(float distance)
     {
-        if(f >= 2.0F)
+        if(distance >= 2.0F)
         {
-            addStat(StatList.distanceFallenStat, (int) java.lang.Math.round((double)f * 100D));
+            addStat(StatList.distanceFallenStat, (int) java.lang.Math.round((double) distance * 100D));
         }
-        super.causeFallDamage(f);
+        super.causeFallDamage(distance);
     }
 
     @Override
-	public void killed(EntityLiving entityliving)
+	public void killed(Mob entityliving)
     {
-        if(entityliving instanceof EntityMonster)
+        if(entityliving instanceof Monster)
         {
-            triggerAchievement(AchievementList.KILL_ENEMY);
+            triggerAchievement(Achievements.KILL_ENEMY);
         }
     }
 
@@ -1385,7 +1428,7 @@ public abstract class EntityPlayer extends EntityLiving
     {
         this.gamemode = gamemode;
 
-        ContainerPlayer newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
+        InventoryMenu newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
         if (craftingInventory == inventorySlots)
         {
             craftingInventory = newContainer;
@@ -1430,8 +1473,8 @@ public abstract class EntityPlayer extends EntityLiving
     		return;
     	}
     	
-    	TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
-    	ItemStack[] result = block.getBreakResult(world, EnumDropCause.PICK_BLOCK, x, y, z, meta, tileEntity);
+    	BlockEntity blockEntity = world.getBlockEntity(x, y, z);
+    	ItemStack[] result = block.getBreakResult(world, EnumDropCause.PICK_BLOCK, x, y, z, meta, blockEntity);
     	ItemStack selectItem = result != null ? result[0] : null;
     	
     	if(selectItem == null) {
@@ -1440,7 +1483,7 @@ public abstract class EntityPlayer extends EntityLiving
     	
 		//Find item in hotbar, and select it
 		for(int i=0; i < 9; i++) {
-			ItemStack stack = inventory.getStackInSlot(i + inventory.hotbarOffset);
+			ItemStack stack = inventory.getItem(i + inventory.hotbarOffset);
 			if(stack != null && stack.itemID == selectItem.itemID && stack.getMetadata() == selectItem.getMetadata()) {
 				setCurrentItem(i + inventory.hotbarOffset);
 				return;
@@ -1451,7 +1494,7 @@ public abstract class EntityPlayer extends EntityLiving
 		int emptyHotbarSlot = -1;
 		int slot = inventory.currentItem;
 		for(int i=0; i < 9; i++) {
-			if(inventory.getStackInSlot(i + inventory.hotbarOffset) == null) {
+			if(inventory.getItem(i + inventory.hotbarOffset) == null) {
 				emptyHotbarSlot = i + inventory.hotbarOffset;
 				slot = i + inventory.hotbarOffset;
 				break;
@@ -1462,7 +1505,7 @@ public abstract class EntityPlayer extends EntityLiving
 		int itemSlot = -1;
 		int stackSize = -1;
 		for(int i=9; i < 36; i++) {
-			ItemStack stack = inventory.getStackInSlot(i);
+			ItemStack stack = inventory.getItem(i);
 			if(stack != null && stack.itemID == selectItem.itemID && stack.getMetadata() == selectItem.getMetadata()) {
 				if(stackSize == -1 || stack.stackSize < stackSize) {
 					itemSlot = i;
@@ -1474,8 +1517,8 @@ public abstract class EntityPlayer extends EntityLiving
 		if(itemSlot == -1) {
 			if(getGamemode() == Gamemode.creative) {
 				int emptySlot = -1;
-				for(int i=0; i < inventory.getSizeInventory(); i++) {
-					if(inventory.getStackInSlot(i) == null) {
+				for(int i = 0; i < inventory.getContainerSize(); i++) {
+					if(inventory.getItem(i) == null) {
 						emptySlot = i;
 						break;
 					}
@@ -1486,7 +1529,7 @@ public abstract class EntityPlayer extends EntityLiving
 				if(emptySlot != -1) {
 					swapItems(emptySlot, createItemInsertSlot);
 				}
-				inventory.setInventorySlotContents(createItemInsertSlot, selectItem);
+				inventory.setItem(createItemInsertSlot, selectItem);
 				setCurrentItem(createItemInsertSlot);
 			}
 			
@@ -1502,28 +1545,28 @@ public abstract class EntityPlayer extends EntityLiving
     }
     
     public void swapItems(int slot1, int slot2) {
-        ItemStack stack1 = inventory.getStackInSlot(slot1);
-        ItemStack stack2 = inventory.getStackInSlot(slot2);
+        ItemStack stack1 = inventory.getItem(slot1);
+        ItemStack stack2 = inventory.getItem(slot2);
 
-        inventory.setInventorySlotContents(slot2, stack1);
-        inventory.setInventorySlotContents(slot1, stack2);
+        inventory.setItem(slot2, stack1);
+        inventory.setItem(slot1, stack2);
     }
     public Item getNextArrow(){
         Item nextArrow = null;
         ItemStack quiverSlot = inventory.armorItemInSlot(2);
-        if(quiverSlot != null && quiverSlot.itemID == Item.armorQuiver.id && quiverSlot.getMetadata() < quiverSlot.getMaxDamage()){
-            nextArrow = Item.ammoArrow;
+        if(quiverSlot != null && quiverSlot.itemID == Items.ARMOR_QUIVER.id && quiverSlot.getMetadata() < quiverSlot.getMaxDamage()){
+            nextArrow = Items.AMMO_ARROW;
         }
-        else if(quiverSlot != null && quiverSlot.itemID == Item.armorQuiverGold.id){
-            nextArrow = Item.ammoArrowPurple;
+        else if(quiverSlot != null && quiverSlot.itemID == Items.ARMOR_QUIVER_GOLD.id){
+            nextArrow = Items.AMMO_ARROW_PURPLE;
         }
-        else if (hasItem(Item.ammoArrowGold))
+        else if (hasItem(Items.AMMO_ARROW_GOLD))
         {
-            nextArrow = Item.ammoArrowGold;
+            nextArrow = Items.AMMO_ARROW_GOLD;
         }
-        else if(hasItem(Item.ammoArrow))
+        else if(hasItem(Items.AMMO_ARROW))
         {
-            nextArrow = Item.ammoArrow;
+            nextArrow = Items.AMMO_ARROW;
         }
         return nextArrow;
     }
@@ -1536,52 +1579,10 @@ public abstract class EntityPlayer extends EntityLiving
         }
         return false;
     }
-
-    public InventoryPlayer inventory;
-    public Container inventorySlots;
-    public Container craftingInventory;
-    public Gamemode gamemode = Gamemode.survival;
-    public byte field_9371_f;
-    public int score;
-    public List<String> messageHistory = new ArrayList<>();
-    public float cameraVelocityOld;
-    public float cameraVelocity;
-    public boolean isSwinging;
-    public int swingProgressInt;
-    public String username;
-    public int dimension;
-    public double xdO;
-    public double ydO;
-    public double zd0;
-    protected boolean sleeping;
-    public ChunkCoordinates bedChunkCoordinates;
-    private int sleepTimer;
-    public float field_22063_x;
-    public float field_22062_y;
-    public float field_22061_z;
-    private ChunkCoordinates playerSpawnCoordinate;
-    private ChunkCoordinates lastDeathCoordinate;
-    private ChunkCoordinates startMinecartRidingCoordinate;
-    public int timeUntilPortal;
-    protected boolean inPortal;
-    public int portalID;
-    public float timeInPortal;
-    public float prevTimeInPortal;
-    private final int damageRemainder;
-    public EntityBobber bobberEntity;
-    public volatile String skinURL;
-    public volatile String capeURL;
-    public boolean slimModel = false;
-
-    protected float baseSpeed = 0.1f;
-    protected float baseFlySpeed = 0.02f;
-    protected boolean isDwarf = false;
-    public int lastRenderTick = 0;
-    public float wobbleTimer = 0;
-    public static class SortByUsername implements Comparator<EntityPlayer> {
+    public static class SortByUsername implements Comparator<Player> {
 
         @Override
-        public int compare(EntityPlayer o1, EntityPlayer o2) {
+        public int compare(Player o1, Player o2) {
             return o1.username.compareTo(o2.username);
         }
     }
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityArrow.java b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectile.java
similarity index 80%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityArrow.java
rename to src/main/java/net/minecraft/core/entity/projectile/ArrowProjectile.java
index d8763e36a..dba79c5c7 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityArrow.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectile.java
@@ -1,26 +1,29 @@
 package net.minecraft.core.entity.projectile;
 
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, EntityPlayer, EntityLiving, MathHelper, 
+//            Entity, Player, Mob, MathHelper,
 //            World, Block, Vec3D, AxisAlignedBB, 
 //            MovingObjectPosition, NBTTagCompound, ItemStack, Item, 
 //            InventoryPlayer
 
-public class EntityArrow extends EntityProjectile
+public class ArrowProjectile extends Projectile
 {
+    public static final int TYPE_NORMAL = 0;
+    public static final int TYPE_PURPLE = 1;
+    public static final int TYPE_GOLDEN = 2;
     protected int xTile = -1;
     protected int yTile = -1;
     protected int zTile = -1;
@@ -28,7 +31,7 @@ public class EntityArrow extends EntityProjectile
     public int shake = 0;
     protected int inData = 0;
     protected int arrowType;
-    protected ItemStack stack = new ItemStack(Item.ammoArrow);
+    protected ItemStack stack = new ItemStack(Items.AMMO_ARROW);
     
     /*
      * I have reverted these to not be synced in multiplayer,
@@ -39,23 +42,23 @@ public class EntityArrow extends EntityProjectile
     protected boolean inGround = false;
     protected boolean doesArrowBelongToPlayer = false;
 
-	public EntityArrow(World world) {
-		this(world, 0);
+	public ArrowProjectile(World world) {
+		this(world, TYPE_NORMAL);
 	}
 	
-    public EntityArrow(World world, int arrowType)
+    public ArrowProjectile(World world, int arrowType)
     {
         super(world);
         this.arrowType = arrowType;
     }
 
-    public EntityArrow(World world, double d, double d1, double d2, int arrowType)
+    public ArrowProjectile(World world, double d, double d1, double d2, int arrowType)
     {
         super(world, d, d1, d2);
         this.arrowType = arrowType;
     }
 
-    public EntityArrow(World world, EntityLiving entityliving, boolean doesArrowBelongToPlayer, int arrowType)
+    public ArrowProjectile(World world, Mob entityliving, boolean doesArrowBelongToPlayer, int arrowType)
     {
         super(world, entityliving);
         setDoesArrowBelongToPlayer(doesArrowBelongToPlayer);
@@ -63,11 +66,10 @@ public class EntityArrow extends EntityProjectile
     }
 
     @Override
-	protected void init()
+	protected void initProjectile()
     {
-        super.init();
+        super.initProjectile();
         damage = 5;
-
     }
     
     public void setDoesArrowBelongToPlayer(boolean flag) {
@@ -94,7 +96,7 @@ public class EntityArrow extends EntityProjectile
         this.zd = zd;
         if(xRotO == 0.0F && yRotO == 0.0F)
         {
-            float f = MathHelper.sqrt_double(xd * xd + zd * zd);
+            float f = MathHelper.sqrt(xd * xd + zd * zd);
             yRot = (float) ((Math.atan2(xd, zd) * 180D) / Math.PI);
             xRot = (float) ((Math.atan2(yd, f) * 180D) / Math.PI);
             xRotO = xRot;
@@ -113,7 +115,7 @@ public class EntityArrow extends EntityProjectile
         }
         if(xRotO == 0.0F && yRotO == 0.0F)
         {
-            float f = MathHelper.sqrt_double(xd * xd + zd * zd);
+            float f = MathHelper.sqrt(xd * xd + zd * zd);
             yRotO = yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
             xRotO = xRot = (float)((Math.atan2(yd, f) * 180D) / Math.PI);
         }
@@ -122,7 +124,7 @@ public class EntityArrow extends EntityProjectile
         {
             block.setBlockBoundsBasedOnState(world, xTile, yTile, zTile);
             AABB axisalignedbb = block.getCollisionBoundingBoxFromPool(world, xTile, yTile, zTile);
-            if(axisalignedbb != null && axisalignedbb.isVecInside(Vec3d.createVector(x, y, z)))
+            if(axisalignedbb != null && axisalignedbb.contains(Vec3.getTempVec3(x, y, z)))
             {
                 setGrounded(true);
             }
@@ -148,7 +150,7 @@ public class EntityArrow extends EntityProjectile
             }
             return;
         }
-        else if(this instanceof EntityArrowGolden)
+        else if(this instanceof ArrowProjectileGolden)
         {
             world.spawnParticle("arrowtrail", x, y, z, xd * 0.05D, yd * 0.05D - 0.1D, zd * 0.05D, 0);
             world.spawnParticle("arrowtrail", x + xd * 0.5D, y + yd * 0.5D, z + zd * 0.5D, xd * 0.05D, yd * 0.05D - 0.1D, zd * 0.05D, 0);
@@ -156,8 +158,8 @@ public class EntityArrow extends EntityProjectile
         super.tick();
     }
     public HitResult getHitResult(){
-        Vec3d oldPosition = Vec3d.createVector(x, y, z);
-        Vec3d newPosition = Vec3d.createVector(x + xd, y + yd, z + zd);
+        Vec3 oldPosition = Vec3.getTempVec3(x, y, z);
+        Vec3 newPosition = Vec3.getTempVec3(x + xd, y + yd, z + zd);
         return world.checkBlockCollisionBetweenPoints(oldPosition, newPosition, false, true);
     }
     public void onHit(HitResult hitResult){
@@ -170,11 +172,11 @@ public class EntityArrow extends EntityProjectile
                 if(!world.isClientSide) {
                 	world.playSoundAtEntity(null, this, "random.drr", 1.0F, 1.2F / (random.nextFloat() * 0.2F + 0.9F));
                 }
-                if(!(this instanceof EntityArrowGolden))
+                if(!(this instanceof ArrowProjectileGolden))
                 {
                     remove();
                 }
-            } else if(!(this instanceof EntityArrowGolden))
+            } else if(!(this instanceof ArrowProjectileGolden))
             {
                 xd *= -0.1D;
                 yd *= -0.1D;
@@ -190,10 +192,10 @@ public class EntityArrow extends EntityProjectile
             zTile = hitResult.z;
             inTile = world.getBlockId(xTile, yTile, zTile);
             inData = world.getBlockMetadata(xTile, yTile, zTile);
-            xd = (float)(hitResult.location.xCoord - x);
-            yd = (float)(hitResult.location.yCoord - y);
-            zd = (float)(hitResult.location.zCoord - z);
-            float f1 = MathHelper.sqrt_double(xd * xd + yd * yd + zd * zd);
+            xd = (float)(hitResult.location.x - x);
+            yd = (float)(hitResult.location.y - y);
+            zd = (float)(hitResult.location.z - z);
+            float f1 = MathHelper.sqrt(xd * xd + yd * yd + zd * zd);
             x -= (xd / (double)f1) * 0.05D;
             y -= (yd / (double)f1) * 0.05D;
             z -= (zd / (double)f1) * 0.05D;
@@ -212,7 +214,7 @@ public class EntityArrow extends EntityProjectile
             world.playSoundAtEntity(null, this, "random.drr", 1.0F, 1.2F / (random.nextFloat() * 0.2F + 0.9F));
             for(int j = 0; j < 4; j++)
             {
-                world.spawnParticle("item", x, y, z, 0.0, 0.0D, 0.0D, Item.ammoArrow.id);
+                world.spawnParticle("item", x, y, z, 0.0, 0.0D, 0.0D, Items.AMMO_ARROW.id);
             }
             remove();
             return;
@@ -255,7 +257,7 @@ public class EntityArrow extends EntityProjectile
     }
 
     @Override
-	public void playerTouch(EntityPlayer player)
+	public void playerTouch(Player player)
     {
         if(world.isClientSide)
         {
@@ -266,7 +268,7 @@ public class EntityArrow extends EntityProjectile
         	player.inventory.insertItem(stack, true);
         	if(stack.stackSize <= 0) {
                 world.playSoundAtEntity(player, this, "random.pop", 0.2F, ((random.nextFloat() - random.nextFloat()) * 0.7F + 1.0F) * 2.0F);
-                player.onItemPickup(this, stack.itemID);
+                player.onItemPickup(this, stack);
                 remove();
         	}
         }
diff --git a/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectileGolden.java b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectileGolden.java
new file mode 100644
index 000000000..b22d2d99a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectileGolden.java
@@ -0,0 +1,56 @@
+package net.minecraft.core.entity.projectile;
+
+// Referenced classes of package net.minecraft.src:
+//            Entity, Player, Mob, MathHelper,
+//            World, Block, Vec3D, AxisAlignedBB, 
+//            MovingObjectPosition, NBTTagCompound, ItemStack, Item, 
+//            InventoryPlayer
+
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.world.World;
+
+public class ArrowProjectileGolden extends ArrowProjectile
+{
+
+    public ArrowProjectileGolden(World world)
+    {
+        super(world, TYPE_GOLDEN);
+        this.noPhysics = true;
+        stack = new ItemStack(Items.AMMO_ARROW_GOLD);
+    }
+
+    public ArrowProjectileGolden(World world, double x, double y, double z)
+    {
+        super(world, x, y, z, TYPE_GOLDEN);
+        this.noPhysics = true;
+        stack = new ItemStack(Items.AMMO_ARROW_GOLD);
+    }
+
+    public ArrowProjectileGolden(World world, Mob owner, boolean doesArrowBelongToPlayer)
+    {
+        super(world, owner, doesArrowBelongToPlayer, TYPE_GOLDEN);
+        this.noPhysics = true;
+        stack = new ItemStack(Items.AMMO_ARROW_GOLD);
+    }
+
+    @Override
+	protected void initProjectile()
+    {
+        super.initProjectile();
+        defaultGravity = 0.02F;
+        defaultProjectileSpeed = 1.0F;
+        damage = 2;
+    }
+
+    @Override
+	public void playerTouch(Player player)
+    {
+        if (arrowBelongsToPlayer()){
+            super.playerTouch(player);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityArrowPurple.java b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectilePurple.java
similarity index 55%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityArrowPurple.java
rename to src/main/java/net/minecraft/core/entity/projectile/ArrowProjectilePurple.java
index c11334787..f53610c9d 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityArrowPurple.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/ArrowProjectilePurple.java
@@ -1,37 +1,38 @@
 package net.minecraft.core.entity.projectile;
 
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, EntityPlayer, EntityLiving, MathHelper, 
+//            Entity, Player, Mob, MathHelper,
 //            World, Block, Vec3D, AxisAlignedBB, 
 //            MovingObjectPosition, NBTTagCompound, ItemStack, Item, 
 //            InventoryPlayer
 
-public class EntityArrowPurple extends EntityArrow
+public class ArrowProjectilePurple extends ArrowProjectile
 {
 
-    public EntityArrowPurple(World world)
+    public ArrowProjectilePurple(World world)
     {
-        super(world, 1);
+        super(world, TYPE_PURPLE);
     }
 
-    public EntityArrowPurple(World world, double d, double d1, double d2)
+    public ArrowProjectilePurple(World world, double x, double y, double z)
     {
-        super(world, d, d1, d2, 1);
+        super(world, x, y, z, TYPE_PURPLE);
     }
 
-    public EntityArrowPurple(World world, EntityLiving entityliving, boolean doesArrowBelongToPlayer)
+    public ArrowProjectilePurple(World world, Mob owner, boolean doesArrowBelongToPlayer)
     {
-        super(world, entityliving, doesArrowBelongToPlayer, 1);
+        super(world, owner, doesArrowBelongToPlayer, TYPE_PURPLE);
     }
 
     @Override
-	protected void init()
+	protected void initProjectile()
     {
-        super.init();
+        super.initProjectile();
         defaultGravity = 0.03F;
         defaultProjectileSpeed = 0.99F;
         damage = 2;
@@ -42,7 +43,7 @@ public class EntityArrowPurple extends EntityArrow
         world.playSoundAtEntity(null, this, "random.drr", 1.0F, 1.2F / (random.nextFloat() * 0.2F + 0.9F));
         for(int j = 0; j < 4; j++)
         {
-            world.spawnParticle("item", x, y, z, 0.0, 0.0D, 0.0D, Item.ammoArrowPurple.id);
+            world.spawnParticle("item", x, y, z, 0.0, 0.0D, 0.0D, Items.AMMO_ARROW_PURPLE.id);
         }
         remove();
     }
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityCannonballBouncy.java b/src/main/java/net/minecraft/core/entity/projectile/CannonballBouncyProjectile.java
similarity index 82%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityCannonballBouncy.java
rename to src/main/java/net/minecraft/core/entity/projectile/CannonballBouncyProjectile.java
index 92f72557d..eae86b8ac 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityCannonballBouncy.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/CannonballBouncyProjectile.java
@@ -1,136 +1,136 @@
-package net.minecraft.core.entity.projectile;
-
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.util.helper.Axis;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.world.World;
-
-import java.util.List;
-
-public class EntityCannonballBouncy extends EntityCannonball
-{
-    private int fuse = 50;
-
-    public EntityCannonballBouncy(World world, double x, double y, double z)
-    {
-        super(world, x, y, z);
-        this.defaultGravity = 0.06f;
-    }
-
-    public EntityCannonballBouncy(World world, EntityLiving owner)
-    {
-        super(world, owner);
-        x += xd;
-        y += yd;
-        z += zd;
-        setHeading(xd, yd, zd, 0.75F, 0.0F);
-        this.defaultGravity = 0.06f;
-    }
-
-    @Override
-    public void tick()
-    {
-        baseTick();
-        if(xRotO == 0.0F && yRotO == 0.0F)
-        {
-            float f = MathHelper.sqrt_double(xd * xd + zd * zd);
-            yRotO = yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
-            xRotO = xRot = (float)((Math.atan2(yd, f) * 180D) / Math.PI);
-        }
-
-        float velocity = MathHelper.sqrt_double(xd * xd + yd * yd + zd * zd);
-
-        // Check for block collision
-        Vec3d currentPos = Vec3d.createVector(x, y, z);
-        Vec3d nextPos = Vec3d.createVector(x + xd, y + yd - 0.25f, z + zd);
-        HitResult hit = world.checkBlockCollisionBetweenPoints(currentPos, nextPos, false, true);
-        if(hit != null)
-        {
-            if (hit.hitType == HitResult.HitType.TILE)
-            {
-                float bounceAxisScale = 0.4f;
-                float otherAxisScale = 0.6f;
-                float minVelocity = 0.2f;
-                Side side = hit.side;
-                if (side == Side.TOP && (Math.abs(yd) < 0.25f || velocity < minVelocity))
-                {
-                    yd = 0f;
-                    y = hit.y + 1f + 0.25f;
-                    xd = 0f;
-                    zd = 0f;
-                    return;
-                }
-                if (side.getAxis() == Axis.Y)
-                {
-                    yd = -yd * bounceAxisScale;
-                    xd *= otherAxisScale;
-                    zd *= otherAxisScale;
-                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
-                }
-                if (side.getAxis() == Axis.X)
-                {
-                    xd = -xd * bounceAxisScale;
-                    yd *= otherAxisScale;
-                    zd *= otherAxisScale;
-                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
-                }
-                if (side.getAxis() == Axis.Z)
-                {
-                    zd = -zd * bounceAxisScale;
-                    xd *= otherAxisScale;
-                    yd *= otherAxisScale;
-                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
-                }
-            }
-        }
-
-        // Check for entity collision
-        List<Entity> collidingEntities = world.getEntitiesWithinAABBExcludingEntity(this, this.bb.getOffsetBoundingBox(xd, yd, zd));
-        if ((collidingEntities != null && collidingEntities.size() > 0) || fuse <= 0)
-        {
-            if (!((collidingEntities != null && collidingEntities.size() == 1) && collidingEntities.get(0) == owner && tickCount < 4))
-            {
-                world.newExplosion(owner, x, y, z, 1.5F, false, true);
-                remove();
-                return;
-            }
-        }
-
-        // Update position
-        x += xd;
-        y += yd;
-        z += zd;
-
-        float velocityHorizontal = MathHelper.sqrt_double(xd * xd + zd * zd);
-        yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
-        for(xRot = (float)((Math.atan2(yd, velocityHorizontal) * 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 deceleration = 0.99F;
-        float gravity = 0.06F;
-        if(isInWater())
-        {
-            for(int i = 0; i < 4; i++)
-            {
-                double particleDistance = 0.25D;
-                world.spawnParticle("bubble", x - xd * particleDistance, y - yd * particleDistance, z - zd * particleDistance, xd, yd, zd, 0);
-            }
-
-            deceleration = 0.8F;
-        }
-        world.spawnParticle("largesmoke", x, y, z, 0.0D, 0.0D, 0.0D, 0);
-        xd *= deceleration;
-        yd *= deceleration;
-        zd *= deceleration;
-        yd -= gravity;
-        setPos(x, y, z);
-        fuse--;
-    }
-}
+package net.minecraft.core.entity.projectile;
+
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+
+import java.util.List;
+
+public class CannonballBouncyProjectile extends CannonballProjectile
+{
+    private int fuse = 50;
+
+    public CannonballBouncyProjectile(World world, Mob owner)
+    {
+        super(world, owner);
+        x += xd;
+        y += yd;
+        z += zd;
+        setHeading(xd, yd, zd, 0.75F, 0.0F);
+        this.defaultGravity = 0.06f;
+    }
+
+    public CannonballBouncyProjectile(World world, double x, double y, double z)
+    {
+        super(world, x, y, z);
+        this.defaultGravity = 0.06f;
+    }
+
+    @Override
+    public void tick()
+    {
+        baseTick();
+        if(xRotO == 0.0F && yRotO == 0.0F)
+        {
+            float f = MathHelper.sqrt(xd * xd + zd * zd);
+            yRotO = yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
+            xRotO = xRot = (float)((Math.atan2(yd, f) * 180D) / Math.PI);
+        }
+
+        float velocity = MathHelper.sqrt(xd * xd + yd * yd + zd * zd);
+
+        // Check for block collision
+        Vec3 currentPos = Vec3.getTempVec3(x, y, z);
+        Vec3 nextPos = Vec3.getTempVec3(x + xd, y + yd - 0.25f, z + zd);
+        HitResult hit = world.checkBlockCollisionBetweenPoints(currentPos, nextPos, false, true);
+        if(hit != null)
+        {
+            if (hit.hitType == HitResult.HitType.TILE)
+            {
+                float bounceAxisScale = 0.4f;
+                float otherAxisScale = 0.6f;
+                float minVelocity = 0.2f;
+                Side side = hit.side;
+                if (side == Side.TOP && (Math.abs(yd) < 0.25f || velocity < minVelocity))
+                {
+                    yd = 0f;
+                    y = hit.y + 1f + 0.25f;
+                    xd = 0f;
+                    zd = 0f;
+                    return;
+                }
+                if (side.getAxis() == Axis.Y)
+                {
+                    yd = -yd * bounceAxisScale;
+                    xd *= otherAxisScale;
+                    zd *= otherAxisScale;
+                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
+                }
+                if (side.getAxis() == Axis.X)
+                {
+                    xd = -xd * bounceAxisScale;
+                    yd *= otherAxisScale;
+                    zd *= otherAxisScale;
+                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
+                }
+                if (side.getAxis() == Axis.Z)
+                {
+                    zd = -zd * bounceAxisScale;
+                    xd *= otherAxisScale;
+                    yd *= otherAxisScale;
+                    world.playSoundAtEntity(null, this, "random.explode", 0.25f * velocity, 2.0f);
+                }
+            }
+        }
+
+        // Check for entity collision
+        List<Entity> collidingEntities = world.getEntitiesWithinAABBExcludingEntity(this, this.bb.cloneMove(xd, yd, zd));
+        if ((collidingEntities != null && collidingEntities.size() > 0) || fuse <= 0)
+        {
+            if (!((collidingEntities != null && collidingEntities.size() == 1) && collidingEntities.get(0) == owner && tickCount < 4))
+            {
+                world.newExplosion(owner, x, y, z, 1.5F, false, true);
+                remove();
+                return;
+            }
+        }
+
+        // Update position
+        x += xd;
+        y += yd;
+        z += zd;
+
+        float velocityHorizontal = MathHelper.sqrt(xd * xd + zd * zd);
+        yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
+        for(xRot = (float)((Math.atan2(yd, velocityHorizontal) * 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 deceleration = 0.99F;
+        float gravity = 0.06F;
+        if(isInWater())
+        {
+            for(int i = 0; i < 4; i++)
+            {
+                double particleDistance = 0.25D;
+                world.spawnParticle("bubble", x - xd * particleDistance, y - yd * particleDistance, z - zd * particleDistance, xd, yd, zd, 0);
+            }
+
+            deceleration = 0.8F;
+        }
+        world.spawnParticle("largesmoke", x, y, z, 0.0D, 0.0D, 0.0D, 0);
+        xd *= deceleration;
+        yd *= deceleration;
+        zd *= deceleration;
+        yd -= gravity;
+        setPos(x, y, z);
+        fuse--;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityCannonball.java b/src/main/java/net/minecraft/core/entity/projectile/CannonballProjectile.java
similarity index 67%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityCannonball.java
rename to src/main/java/net/minecraft/core/entity/projectile/CannonballProjectile.java
index d0db26ae8..c0438a8a5 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityCannonball.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/CannonballProjectile.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.entity.projectile;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.world.World;
 
-public class EntityCannonball extends EntityProjectile
+public class CannonballProjectile extends Projectile
 {
 
-    public EntityCannonball(World world)
+    public CannonballProjectile(World world)
     {
         super(world);
     }
-    
-    public EntityCannonball(World world, double x, double y, double z)
+
+    public CannonballProjectile(World world, Mob owner)
     {
-        super(world, x, y, z);
+        super(world, owner);
     }
-    
-    public EntityCannonball(World world, EntityLiving owner)
+
+    public CannonballProjectile(World world, double x, double y, double z)
     {
-        super(world, owner);
+        super(world, x, y, z);
     }
     @Override
-    public void init(){
+    public void initProjectile(){
         this.defaultGravity = 0.09f;
         this.defaultProjectileSpeed = 0.88f;
     }
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EggProjectile.java b/src/main/java/net/minecraft/core/entity/projectile/EggProjectile.java
new file mode 100644
index 000000000..4aba7d342
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/projectile/EggProjectile.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.entity.projectile;
+
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.ChickenMob;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.world.World;
+
+public class EggProjectile extends Projectile
+{
+
+    public EggProjectile(World world)
+    {
+        super(world);
+        this.modelItem = Items.EGG_CHICKEN;
+    }
+
+    public EggProjectile(World world, Mob owner)
+    {
+        super(world, owner);
+        this.modelItem = Items.EGG_CHICKEN;
+    }
+
+    public EggProjectile(World world, double x, double y, double z)
+    {
+        super(world, x, y, z);
+        this.modelItem = Items.EGG_CHICKEN;
+    }
+
+    @Override
+    public void onHit(HitResult hitResult){
+        if(!world.isClientSide && random.nextInt(8) == 0)
+        {
+            byte byte0 = 1;
+            if(random.nextInt(32) == 0)
+            {
+                byte0 = 4;
+            }
+            for(int k = 0; k < byte0; k++)
+            {
+                ChickenMob entitychicken = new ChickenMob(world);
+                entitychicken.moveTo(x, y, z, yRot, 0.0F);
+                world.entityJoinedWorld(entitychicken);
+            }
+
+        }
+        super.onHit(hitResult);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityArrowGolden.java b/src/main/java/net/minecraft/core/entity/projectile/EntityArrowGolden.java
deleted file mode 100644
index 339c87d7e..000000000
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityArrowGolden.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package net.minecraft.core.entity.projectile;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, EntityPlayer, EntityLiving, MathHelper, 
-//            World, Block, Vec3D, AxisAlignedBB, 
-//            MovingObjectPosition, NBTTagCompound, ItemStack, Item, 
-//            InventoryPlayer
-
-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 net.minecraft.core.world.World;
-
-public class EntityArrowGolden extends EntityArrow
-{
-
-    public EntityArrowGolden(World world)
-    {
-        super(world, 2);
-        this.noPhysics = true;
-        stack = new ItemStack(Item.ammoArrowGold);
-    }
-
-    public EntityArrowGolden(World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2, 2);
-        this.noPhysics = true;
-        stack = new ItemStack(Item.ammoArrowGold);
-    }
-
-    public EntityArrowGolden(World world, EntityLiving entityliving, boolean doesArrowBelongToPlayer)
-    {
-        super(world, entityliving, doesArrowBelongToPlayer, 2);
-        this.noPhysics = true;
-        stack = new ItemStack(Item.ammoArrowGold);
-    }
-
-    @Override
-	protected void init()
-    {
-        super.init();
-        defaultGravity = 0.02F;
-        defaultProjectileSpeed = 1.0F;
-        damage = 2;
-    }
-
-    @Override
-	public void playerTouch(EntityPlayer player)
-    {
-        if (arrowBelongsToPlayer()){
-            super.playerTouch(player);
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityEgg.java b/src/main/java/net/minecraft/core/entity/projectile/EntityEgg.java
deleted file mode 100644
index d798a18c2..000000000
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityEgg.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package net.minecraft.core.entity.projectile;
-
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityChicken;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, AxisAlignedBB, EntityLiving, MathHelper, 
-//            World, Vec3D, MovingObjectPosition, EntityChicken, 
-//            NBTTagCompound, EntityPlayer, ItemStack, Item, 
-//            InventoryPlayer
-
-public class EntityEgg extends EntityProjectile
-{
-
-    public EntityEgg(World world)
-    {
-        super(world);
-        this.modelItem = Item.eggChicken;
-    }
-
-    public EntityEgg(World world, EntityLiving entityliving)
-    {
-        super(world, entityliving);
-        this.modelItem = Item.eggChicken;
-    }
-
-    public EntityEgg(World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2);
-        this.modelItem = Item.eggChicken;
-    }
-
-    @Override
-    public void onHit(HitResult hitResult){
-        if(!world.isClientSide && random.nextInt(8) == 0)
-        {
-            byte byte0 = 1;
-            if(random.nextInt(32) == 0)
-            {
-                byte0 = 4;
-            }
-            for(int k = 0; k < byte0; k++)
-            {
-                EntityChicken entitychicken = new EntityChicken(world);
-                entitychicken.moveTo(x, y, z, yRot, 0.0F);
-                world.entityJoinedWorld(entitychicken);
-            }
-
-        }
-        super.onHit(hitResult);
-    }
-}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntitySnowball.java b/src/main/java/net/minecraft/core/entity/projectile/EntitySnowball.java
deleted file mode 100644
index 5ba527fe9..000000000
--- a/src/main/java/net/minecraft/core/entity/projectile/EntitySnowball.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.minecraft.core.entity.projectile;
-
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, AxisAlignedBB, EntityLiving, MathHelper, 
-//            World, Vec3D, MovingObjectPosition, NBTTagCompound, 
-//            EntityPlayer, ItemStack, Item, InventoryPlayer
-
-public class EntitySnowball extends EntityProjectile
-{
-
-    public EntitySnowball(World world)
-    {
-        super(world);
-        this.modelItem = Item.ammoSnowball;
-    }
-
-    public EntitySnowball(World world, EntityLiving entityliving)
-    {
-        super(world, entityliving);
-        this.modelItem = Item.ammoSnowball;
-    }
-
-    public EntitySnowball(World world, double d, double d1, double d2)
-    {
-        super(world, d, d1, d2);
-        this.modelItem = Item.ammoSnowball;
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityFireball.java b/src/main/java/net/minecraft/core/entity/projectile/FireballProjectile.java
similarity index 63%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityFireball.java
rename to src/main/java/net/minecraft/core/entity/projectile/FireballProjectile.java
index a23db3386..940c52802 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityFireball.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/FireballProjectile.java
@@ -1,28 +1,32 @@
 package net.minecraft.core.entity.projectile;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.monster.EntityGhast;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.monster.GhastMob;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.util.helper.DamageType;
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, AxisAlignedBB, MathHelper, EntityLiving, 
+//            Entity, AxisAlignedBB, MathHelper, Mob,
 //            World, Vec3D, MovingObjectPosition, NBTTagCompound
 
-public class EntityFireball extends EntityProjectile
+public class FireballProjectile extends Projectile
 {
+    public double xPower = 0;
+    public double yPower = 0;
+    public double zPower = 0;
 
-    public EntityFireball(World world)
+    public FireballProjectile(World world)
     {
         super(world);
         setSize(1.0F, 1.0F);
     }
-    public EntityFireball(World world, double x, double y, double z,
-            double vX, double vY, double vZ)
+
+    public FireballProjectile(World world, double x, double y, double z,
+                              double vX, double vY, double vZ)
     {
         super(world);
         setSize(1.0F, 1.0F);
@@ -31,12 +35,11 @@ public class EntityFireball extends EntityProjectile
         xd = yd = zd = 0.0D;
         setAccel(vX, vY, vZ);
     }
-
-    public EntityFireball(World world, EntityLiving entityliving, double vX, double vY, double vZ)
+    public FireballProjectile(World world, Mob owner, double vX, double vY, double vZ)
     {
         super(world);
         setSize(1.0F, 1.0F);
-        moveTo(entityliving.x, entityliving.y, entityliving.z, entityliving.yRot, entityliving.xRot);
+        moveTo(owner.x, owner.y, owner.z, owner.yRot, owner.xRot);
         setPos(x, y, z);
         heightOffset = 0.0F;
         xd = yd = zd = 0.0D;
@@ -46,25 +49,25 @@ public class EntityFireball extends EntityProjectile
         setAccel(vX, vY, vZ);
     }
     private void setAccel(double vX, double vY, double vZ){
-        double velocity = MathHelper.sqrt_double(vX * vX + vY * vY + vZ * vZ);
+        double velocity = MathHelper.sqrt(vX * vX + vY * vY + vZ * vZ);
         if (velocity != 0){
-            accelX = (vX / velocity) * 0.1D;
-            accelY = (vY / velocity) * 0.1D;
-            accelZ = (vZ / velocity) * 0.1D;
+            xPower = (vX / velocity) * 0.1D;
+            yPower = (vY / velocity) * 0.1D;
+            zPower = (vZ / velocity) * 0.1D;
         } else {
-            accelX = 0;
-            accelY = 0;
-            accelZ = 0;
+            xPower = 0;
+            yPower = 0;
+            zPower = 0;
         }
     }
+
     @Override
-    protected void init()
+    protected void initProjectile()
     {
         damage = 0;
         defaultGravity = 0.00f;
         defaultProjectileSpeed = 1f;
     }
-
     @Override
 	public void tick()
     {
@@ -79,7 +82,7 @@ public class EntityFireball extends EntityProjectile
             {
                 if(result.entity != null)
                 {
-                    if (result.entity instanceof EntityGhast){
+                    if (result.entity instanceof GhastMob){
                         result.entity.hurt(owner, 5, DamageType.COMBAT);
                     } else {
                         result.entity.hurt(owner, damage, DamageType.COMBAT);
@@ -92,11 +95,12 @@ public class EntityFireball extends EntityProjectile
     }
     public void afterTick(){
         super.afterTick();
-        xd += accelX;
-        yd += accelY;
-        zd += accelZ;
+        xd += xPower;
+        yd += yPower;
+        zd += zPower;
         world.spawnParticle("largesmoke", x, y, z, 0.0D, 0.0D, 0.0D, 0);
     }
+
     @Override
 	public boolean isPickable()
     {
@@ -108,25 +112,24 @@ public class EntityFireball extends EntityProjectile
     {
         return 1.0F;
     }
-
     @Override
     public boolean hurt(Entity entity, int i, DamageType type)
     {
         markHurt();
         if(entity != null)
         {
-            Vec3d vec3d = entity.getLookAngle();
-            if (entity instanceof EntityLiving){
-                this.owner = (EntityLiving) entity;
+            Vec3 lookAngle = entity.getLookAngle();
+            if (entity instanceof Mob){
+                this.owner = (Mob) entity;
             }
-            if(vec3d != null)
+            if(lookAngle != null)
             {
-                xd = vec3d.xCoord;
-                yd = vec3d.yCoord;
-                zd = vec3d.zCoord;
-                accelX = xd * 0.1D;
-                accelY = yd * 0.1D;
-                accelZ = zd * 0.1D;
+                xd = lookAngle.x;
+                yd = lookAngle.y;
+                zd = lookAngle.z;
+                xPower = xd * 0.1D;
+                yPower = yd * 0.1D;
+                zPower = zd * 0.1D;
             }
             return true;
         } else
@@ -141,7 +144,4 @@ public class EntityFireball extends EntityProjectile
         this.yd = yd;
         this.zd = zd;
     }
-    public double accelX = 0;
-    public double accelY = 0;
-    public double accelZ = 0;
 }
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityPebble.java b/src/main/java/net/minecraft/core/entity/projectile/PebbleProjectile.java
similarity index 62%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityPebble.java
rename to src/main/java/net/minecraft/core/entity/projectile/PebbleProjectile.java
index 6c61d43da..8ea779de1 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityPebble.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/PebbleProjectile.java
@@ -1,39 +1,39 @@
 package net.minecraft.core.entity.projectile;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, AxisAlignedBB, EntityLiving, MathHelper, 
+//            Entity, AxisAlignedBB, Mob, MathHelper,
 //            World, Vec3D, MovingObjectPosition, NBTTagCompound, 
-//            EntityPlayer, ItemStack, Item, InventoryPlayer
+//            Player, ItemStack, Item, InventoryPlayer
 
-public class EntityPebble extends EntityProjectile
+public class PebbleProjectile extends Projectile
 {
     private boolean firstBounce = true;
 
-    public EntityPebble(World world)
+    public PebbleProjectile(World world)
     {
         super(world);
     }
 
-    public EntityPebble(World world, EntityLiving entityliving)
+    public PebbleProjectile(World world, Mob owner)
     {
-        super(world, entityliving);
+        super(world, owner);
     }
 
-    public EntityPebble(World world, double d, double d1, double d2)
+    public PebbleProjectile(World world, double x, double y, double z)
     {
-        super(world, d, d1, d2);
+        super(world, x, y, z);
     }
     @Override
-    public void init(){
-        super.init();
+    public void initProjectile(){
+        super.initProjectile();
         this.damage = 1;
     }
     @Override
@@ -45,7 +45,7 @@ public class EntityPebble extends EntityProjectile
 
         if(!world.isClientSide)
         {
-            EntityItem item = new EntityItem(world, x, y, z, new ItemStack(Item.ammoPebble, 1));
+            ItemEntity item = new ItemEntity(world, x, y, z, new ItemStack(Items.AMMO_PEBBLE, 1));
             world.entityJoinedWorld(item);
         }
 
diff --git a/src/main/java/net/minecraft/core/entity/projectile/EntityProjectile.java b/src/main/java/net/minecraft/core/entity/projectile/Projectile.java
similarity index 80%
rename from src/main/java/net/minecraft/core/entity/projectile/EntityProjectile.java
rename to src/main/java/net/minecraft/core/entity/projectile/Projectile.java
index be5cb3aee..6c3e178ef 100644
--- a/src/main/java/net/minecraft/core/entity/projectile/EntityProjectile.java
+++ b/src/main/java/net/minecraft/core/entity/projectile/Projectile.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.entity.projectile;
 
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
 import java.util.List;
 
-public class EntityProjectile extends Entity {
-    public EntityLiving owner;
+public class Projectile extends Entity {
+    public Mob owner;
     protected int ticksInGround;
     protected int ticksInAir;
     public int damage;
@@ -23,13 +23,16 @@ public class EntityProjectile extends Entity {
     protected float gravity;
     protected float defaultProjectileSpeed;
     protected float projectileSpeed;
-    public EntityProjectile(World world)
+    public Projectile(World world)
     {
         super(world);
         ticksInAir = 0;
         setSize(0.25F, 0.25F);
+
+        initProjectile();
     }
-    public EntityProjectile(World world, EntityLiving owner)
+
+    public Projectile(World world, Mob owner)
     {
         super(world);
         ticksInAir = 0;
@@ -46,9 +49,11 @@ public class EntityProjectile extends Entity {
         zd = MathHelper.cos((yRot / 180F) * MathHelper.PI) * MathHelper.cos((xRot / 180F) * MathHelper.PI) * f;
         yd = -MathHelper.sin((xRot / 180F) * MathHelper.PI) * f;
         setHeading(xd, yd, zd, 1.5F, 1.0F);
+
+        initProjectile();
     }
 
-    public EntityProjectile(World world, double x, double y, double z)
+    public Projectile(World world, double x, double y, double z)
     {
         super(world);
         ticksInAir = 0;
@@ -56,11 +61,15 @@ public class EntityProjectile extends Entity {
         setSize(0.25F, 0.25F);
         setPos(x, y, z);
         heightOffset = 0.0F;
+
+        initProjectile();
     }
 
     @Override
-    protected void init()
-    {
+    protected void defineSynchedData() {
+
+    }
+    protected void initProjectile(){
         damage = 0;
         defaultGravity = 0.03f;
         defaultProjectileSpeed = 0.99f;
@@ -69,7 +78,7 @@ public class EntityProjectile extends Entity {
     @Override
     public boolean shouldRenderAtSqrDistance(double distance)
     {
-        double d1 = bb.getAverageEdgeLength() * 4D;
+        double d1 = bb.getSize() * 4D;
         d1 *= 64D;
         return distance < d1 * d1;
     }
@@ -86,7 +95,7 @@ public class EntityProjectile extends Entity {
 
     public void setHeading(double newMotionX, double newMotionY, double newMotionZ, float speed, float randomness)
     {
-        float velocity = MathHelper.sqrt_double(newMotionX * newMotionX + newMotionY * newMotionY + newMotionZ * newMotionZ);
+        float velocity = MathHelper.sqrt(newMotionX * newMotionX + newMotionY * newMotionY + newMotionZ * newMotionZ);
         newMotionX /= velocity;
         newMotionY /= velocity;
         newMotionZ /= velocity;
@@ -99,7 +108,7 @@ public class EntityProjectile extends Entity {
         xd = newMotionX;
         yd = newMotionY;
         zd = newMotionZ;
-        float f3 = MathHelper.sqrt_double(newMotionX * newMotionX + newMotionZ * newMotionZ);
+        float f3 = MathHelper.sqrt(newMotionX * newMotionX + newMotionZ * newMotionZ);
         yRotO = yRot = (float)((java.lang.Math.atan2(newMotionX, newMotionZ) * 180D) / Math.PI);
         xRotO = xRot = (float)((java.lang.Math.atan2(newMotionY, f3) * 180D) / Math.PI);
         ticksInGround = 0;
@@ -107,7 +116,7 @@ public class EntityProjectile extends Entity {
 
     public void setHeadingPrecise(double newMotionX, double newMotionY, double newMotionZ, float speed)
     {
-        float velocity = MathHelper.sqrt_double(newMotionX * newMotionX + newMotionY * newMotionY + newMotionZ * newMotionZ);
+        float velocity = MathHelper.sqrt(newMotionX * newMotionX + newMotionY * newMotionY + newMotionZ * newMotionZ);
         newMotionX /= velocity;
         newMotionY /= velocity;
         newMotionZ /= velocity;
@@ -117,7 +126,7 @@ public class EntityProjectile extends Entity {
         xd = newMotionX;
         yd = newMotionY;
         zd = newMotionZ;
-        float horizontalVelocity = MathHelper.sqrt_double(newMotionX * newMotionX + newMotionZ * newMotionZ);
+        float horizontalVelocity = MathHelper.sqrt(newMotionX * newMotionX + newMotionZ * newMotionZ);
         yRotO = yRot = (float)((Math.atan2(newMotionX, newMotionZ) * 180D) / Math.PI);
         xRotO = xRot = (float)((Math.atan2(newMotionY, horizontalVelocity) * 180D) / Math.PI);
         ticksInGround = 0;
@@ -132,7 +141,7 @@ public class EntityProjectile extends Entity {
         this.zd = zd;
         if(xRotO == 0.0F && yRotO == 0.0F)
         {
-            float f = MathHelper.sqrt_double(xd * xd + zd * zd);
+            float f = MathHelper.sqrt(xd * xd + zd * zd);
             yRotO = yRot = (float)((Math.atan2(xd, zd) * 180D) / Math.PI);
             xRotO = xRot = (float)((Math.atan2(yd, f) * 180D) / Math.PI);
         }
@@ -147,24 +156,24 @@ public class EntityProjectile extends Entity {
         ticksInAir++;
 
         HitResult movingobjectposition = getHitResult();
-        Vec3d oldPosition = Vec3d.createVector(x, y, z);
-        Vec3d newPosition = Vec3d.createVector(x + xd, y + yd, z + zd);
+        Vec3 oldPosition = Vec3.getTempVec3(x, y, z);
+        Vec3 newPosition = Vec3.getTempVec3(x + xd, y + yd, z + zd);
         if(movingobjectposition != null)
         {
-            newPosition = Vec3d.createVector(movingobjectposition.location.xCoord, movingobjectposition.location.yCoord, movingobjectposition.location.zCoord);
+            newPosition = Vec3.getTempVec3(movingobjectposition.location.x, movingobjectposition.location.y, movingobjectposition.location.z);
         }
         if(!world.isClientSide)
         {
             Entity entity = null;
-            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.addCoord(xd, yd, zd).expand(1.0D, 1.0D, 1.0D));
+            List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(xd, yd, zd).grow(1.0D, 1.0D, 1.0D));
             double d = 0.0D;
             for (Entity entity1 : list) {
                 if (!entity1.isPickable() || entity1 == owner && ticksInAir < 5) {
                     continue;
                 }
                 float f4 = 0.3F;
-                AABB axisalignedbb = entity1.bb.expand(f4, f4, f4);
-                HitResult movingobjectposition1 = axisalignedbb.func_1169_a(oldPosition, newPosition);
+                AABB axisalignedbb = entity1.bb.grow(f4, f4, f4);
+                HitResult movingobjectposition1 = axisalignedbb.clip(oldPosition, newPosition);
                 if (movingobjectposition1 == null) {
                     continue;
                 }
@@ -187,8 +196,8 @@ public class EntityProjectile extends Entity {
         afterTick();
     }
     public HitResult getHitResult(){
-        Vec3d oldPosition = Vec3d.createVector(x, y, z);
-        Vec3d newPosition = Vec3d.createVector(x + xd, y + yd, z + zd);
+        Vec3 oldPosition = Vec3.getTempVec3(x, y, z);
+        Vec3 newPosition = Vec3.getTempVec3(x + xd, y + yd, z + zd);
         return world.checkBlockCollisionBetweenPoints(oldPosition, newPosition);
     }
     public void onHit(HitResult hitResult){
@@ -208,7 +217,7 @@ public class EntityProjectile extends Entity {
         x += xd;
         y += yd;
         z += zd;
-        float f = MathHelper.sqrt_double(xd * xd + zd * zd);
+        float f = MathHelper.sqrt(xd * xd + zd * zd);
         yRot = (float)((java.lang.Math.atan2(xd, zd) * 180D) / Math.PI);
         xRot = (float)((Math.atan2(yd, f) * 180D) / Math.PI);
         while (xRot - xRotO < -180F) {
diff --git a/src/main/java/net/minecraft/core/entity/projectile/SnowballProjectile.java b/src/main/java/net/minecraft/core/entity/projectile/SnowballProjectile.java
new file mode 100644
index 000000000..31a6a1ae3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/projectile/SnowballProjectile.java
@@ -0,0 +1,34 @@
+package net.minecraft.core.entity.projectile;
+
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.world.World;
+
+// Referenced classes of package net.minecraft.src:
+//            Entity, AxisAlignedBB, Mob, MathHelper,
+//            World, Vec3D, MovingObjectPosition, NBTTagCompound, 
+//            Player, ItemStack, Item, InventoryPlayer
+
+public class SnowballProjectile extends Projectile
+{
+
+    public SnowballProjectile(World world)
+    {
+        super(world);
+        this.modelItem = Items.AMMO_SNOWBALL;
+    }
+
+    public SnowballProjectile(World world, Mob owner)
+    {
+        super(world, owner);
+        this.modelItem = Items.AMMO_SNOWBALL;
+    }
+
+    public SnowballProjectile(World world, double x, double y, double z)
+    {
+        super(world, x, y, z);
+        this.modelItem = Items.AMMO_SNOWBALL;
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java b/src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java
similarity index 79%
rename from src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java
rename to src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java
index 74e99b3bd..c5639823a 100644
--- a/src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java
+++ b/src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java
@@ -1,17 +1,18 @@
 package net.minecraft.core.entity.vehicle;
 
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.client.entity.player.EntityClientPlayerMP;
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlag;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.FlagBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.packet.Packet26BoatControl;
+import net.minecraft.core.net.packet.BoatControlPacket;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.BlockParticleHelper;
 import net.minecraft.core.util.helper.DamageType;
@@ -19,19 +20,43 @@ import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
 //            Entity, World, Block, Item, 
-//            AxisAlignedBB, Material, MathHelper, EntityPlayer, 
+//            AxisAlignedBB, Material, MathHelper, Player,
 //            NBTTagCompound
 
-public class EntityBoat extends Entity
+public class BoatEntity extends Entity
 {
+    private static final double MAX_BOAT_SPEED = 0.8D;
+    private static final double ACCELERATION = 0.0065D;
+    private static final float MAX_ROTATION_SPEED = 5f;
+    private static final float MIN_ROTATION_SPEED = 3f;
+    private static final double MAX_PACKET_SPEED_CHANGE = ACCELERATION * 8;
+    private static final double MAX_PACKET_ROTATION_CHANGE = MAX_ROTATION_SPEED * 4;
+    public int boatCurrentDamage;
+    public int boatTimeSinceHit;
+    public int boatRockDirection;
+    private int lerpTicks;
+    private double lerpX;
+    private double lerpY;
+    private double lerpZ;
+    private float lerpYRot;
+    private float boatPitch;
+    private double velocityX;
+    private double velocityY;
+    private double velocityZ;
+    private float pendingYRot;
+    private double pendingXDChange;
+    private double pendingZDChange;
+    private ItemStack flag = null;
+    public FlagBlockEntity tileEntityFlag = null;
+
 
-    public EntityBoat(World world)
+    public BoatEntity(World world)
     {
         super(world);
         boatCurrentDamage = 0;
@@ -46,7 +71,7 @@ public class EntityBoat extends Entity
     private void createTileEntity()
     {
         if (this.flag == null) return;
-        this.tileEntityFlag = new TileEntityFlag();
+        this.tileEntityFlag = new FlagBlockEntity();
         CompoundTag flagData = this.flag.getData().getCompoundOrDefault("FlagData", null);
         if (flagData != null)
         {
@@ -61,7 +86,7 @@ public class EntityBoat extends Entity
     }
 
     @Override
-	protected void init()
+	protected void defineSynchedData()
     {
     }
 
@@ -77,7 +102,7 @@ public class EntityBoat extends Entity
         return true;
     }
 
-    public EntityBoat(World world, double d, double d1, double d2)
+    public BoatEntity(World world, double d, double d1, double d2)
     {
         this(world);
         setPos(d, d1 + (double) heightOffset, d2);
@@ -94,21 +119,20 @@ public class EntityBoat extends Entity
     {
         return (double) bbHeight * 0.0D - 0.3D;
     }
-
     @Override
     public boolean hurt(Entity entity, int i, DamageType type)
     {
         int numParticles = random.nextInt(8) + 1;
         for (int q = 0; q < numParticles; q++)
         {
-            world.spawnParticle("block", x, y, z, xd, yd, zd, BlockParticleHelper.encodeBlockData(Block.planksOak.id, 0, Side.BOTTOM));
+            world.spawnParticle("block", x, y, z, xd, yd, zd, BlockParticleHelper.encodeBlockData(Blocks.PLANKS_OAK.id, 0, Side.BOTTOM));
         }
         if(world.isClientSide || removed)
         {
             return true;
         }
-        if(entity instanceof EntityPlayer) {
-        	if(((EntityPlayer) entity).getGamemode() == Gamemode.creative) {
+        if(entity instanceof Player) {
+        	if(((Player) entity).getGamemode() == Gamemode.creative) {
         		remove();
                 if (this.flag != null)
                 {
@@ -127,15 +151,15 @@ public class EntityBoat extends Entity
             {
                 passenger.startRiding(this);
             }
-            if(entity instanceof EntityPlayer){
-                spawnAtLocation(Item.boat.id, 1, 0.0F);
+            if(entity instanceof Player){
+                spawnAtLocation(Items.BOAT.id, 1, 0.0F);
             }else {
                 for (int j = 0; j < 3; j++) {
-                    spawnAtLocation(Block.planksOak.id, 1, 0.0F);
+                    spawnAtLocation(Blocks.PLANKS_OAK.id, 1, 0.0F);
                 }
 
                 for (int k = 0; k < 2; k++) {
-                    spawnAtLocation(Item.stick.id, 1, 0.0F);
+                    spawnAtLocation(Items.STICK.id, 1, 0.0F);
                 }
             }
             if (this.flag != null)
@@ -147,6 +171,7 @@ public class EntityBoat extends Entity
         }
         return true;
     }
+
     @Override
     public void remove(){
         Entity entity = passenger;
@@ -187,7 +212,7 @@ public class EntityBoat extends Entity
         boatPitch = xRot;
         lerpTicks = i;
         // Don't interpolate velocity from server when controlling the boat
-        if (passenger instanceof EntityPlayerSP) return;
+        if (passenger instanceof LocalPlayer) return;
         lerpYRot = yRot;
         xd = velocityX;
         yd = velocityY;
@@ -198,12 +223,11 @@ public class EntityBoat extends Entity
 	public void lerpMotion(double xd, double yd, double zd)
     {
         // Don't interpolate velocity from server when controlling the boat
-        if (passenger instanceof EntityPlayerSP) return;
+        if (passenger instanceof LocalPlayer) return;
         velocityX = this.xd = xd;
         velocityY = this.yd = yd;
         velocityZ = this.zd = zd;
     }
-
     @Override
 	public void tick()
     {
@@ -226,7 +250,7 @@ public class EntityBoat extends Entity
         {
             double minY = (bb.minY + ((bb.maxY - bb.minY) * (double)(i)) / (double)waterSections) - 0.125D;
             double maxY = (bb.minY + ((bb.maxY - bb.minY) * (double)(i + 1)) / (double)waterSections) - 0.125D;
-            AABB axisalignedbb = AABB.getBoundingBoxFromPool(bb.minX, minY, bb.minZ, bb.maxX, maxY, bb.maxZ);
+            AABB axisalignedbb = AABB.getTemporaryBB(bb.minX, minY, bb.minZ, bb.maxX, maxY, bb.maxZ);
             if(world.isAABBInMaterial(axisalignedbb, Material.water))
             {
                 bouyancy += 1.0D / (double)waterSections;
@@ -241,7 +265,7 @@ public class EntityBoat extends Entity
                 double lerpY = y + (this.lerpY - y) / (double) lerpTicks;
                 double lerpZ = z + (this.lerpZ - z) / (double) lerpTicks;
                 xRot += (boatPitch - xRot) / lerpTicks;
-                if (!(passenger instanceof EntityClientPlayerMP)){
+                if (!(passenger instanceof MultiplayerLocalPlayer)){
                     float lerpYRot;
                     lerpYRot = MathHelper.normalizeRotation(this.lerpYRot - yRot);
                     yRot += lerpYRot / lerpTicks;
@@ -309,7 +333,7 @@ public class EntityBoat extends Entity
 
         }
 
-        if (!(passenger instanceof EntityPlayerMP)){
+        if (!(passenger instanceof ServerPlayer)){
             xd *= 0.99D;
             yd *= 0.95D;
             zd *= 0.99D;
@@ -318,11 +342,11 @@ public class EntityBoat extends Entity
         xRot = 0.0F;
 
         // Push entities in bounding box
-        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(0.2D, 0.0D, 0.2D));
+        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.grow(0.2D, 0.0D, 0.2D));
         if(list != null && !list.isEmpty())
         {
             for (Entity entity : list) {
-                if (entity != passenger && entity.isPushable() && (entity instanceof EntityBoat)) {
+                if (entity != passenger && entity.isPushable() && (entity instanceof BoatEntity)) {
                     entity.push(this);
                 }
             }
@@ -332,9 +356,9 @@ public class EntityBoat extends Entity
         // Break snow layers on the ground
         for(int i = 0; i < 4; i++)
         {
-            int blockX = MathHelper.floor_double(x + ((double)(i % 2) - 0.5D) * 0.8D);
-            int blockY = MathHelper.floor_double(y);
-            int blockZ = MathHelper.floor_double(z + ((double)(i / 2) - 0.5D) * 0.8D);
+            int blockX = MathHelper.floor(x + ((double)(i % 2) - 0.5D) * 0.8D);
+            int blockY = MathHelper.floor(y);
+            int blockZ = MathHelper.floor(z + ((double)(i / 2) - 0.5D) * 0.8D);
             Block block = world.getBlock(blockX, blockY, blockZ);
             if(block != null && block.hasTag(BlockTags.BOAT_BREAKS))
             {
@@ -364,9 +388,9 @@ public class EntityBoat extends Entity
         double xdOff;
         double zdOff;
         currentBoatSpeed = Math.hypot(xd, zd);
-        if(passenger != null && passenger instanceof EntityPlayerSP)
+        if(passenger != null && passenger instanceof LocalPlayer)
         {
-            EntityPlayerSP sp = (EntityPlayerSP) passenger;
+            LocalPlayer sp = (LocalPlayer) passenger;
             controlBoat(-sp.input.moveForward, -sp.input.moveStrafe);
         }
         yRot += pendingYRot;
@@ -387,15 +411,15 @@ public class EntityBoat extends Entity
         xd += xdOff;
         zd += zdOff;
 
-        if (passenger instanceof EntityClientPlayerMP){
-            ((EntityClientPlayerMP)passenger).sendQueue.addToSendQueue(new Packet26BoatControl(this));
+        if (passenger instanceof MultiplayerLocalPlayer){
+            ((MultiplayerLocalPlayer)passenger).sendQueue.addToSendQueue(new BoatControlPacket(this));
         }
 
         // Cap max speed properly
         currentBoatSpeed = Math.hypot(xd, zd);
-        if (currentBoatSpeed > maxBoatSpeed){
-            xd = xd/currentBoatSpeed * maxBoatSpeed;
-            zd = zd/currentBoatSpeed * maxBoatSpeed;
+        if (currentBoatSpeed > MAX_BOAT_SPEED){
+            xd = xd/currentBoatSpeed * MAX_BOAT_SPEED;
+            zd = zd/currentBoatSpeed * MAX_BOAT_SPEED;
         }
 
         if(onGround)
@@ -405,18 +429,19 @@ public class EntityBoat extends Entity
             zd *= 0.5D;
         }
     }
+
     public void controlBoat(float forward, float strafe){
         double currentBoatSpeed = Math.hypot(xd, zd);
-        pendingYRot = (float) (strafe * (minRotSpeed + (maxRotSpeed - minRotSpeed) * Math.max(((maxBoatSpeed - (currentBoatSpeed * 1.5))/maxBoatSpeed), 0))); // I love interpolation
-        float velOff = (float) (forward * acceleration);
+        pendingYRot = (float) (strafe * (MIN_ROTATION_SPEED + (MAX_ROTATION_SPEED - MIN_ROTATION_SPEED) * Math.max(((MAX_BOAT_SPEED - (currentBoatSpeed * 1.5))/ MAX_BOAT_SPEED), 0))); // I love interpolation
+        float velOff = (float) (forward * ACCELERATION);
         pendingXDChange = Math.cos(Math.toRadians(yRot)) * velOff;
         pendingZDChange = Math.sin(Math.toRadians(yRot)) * velOff;
     }
 
     public void handleControlDirect(float xd, float zd, float yRot){
-        this.yRot = (float) MathHelper.clamp(yRot, this.yRot - maxSinglePacketRotationChange, this.yRot + maxSinglePacketRotationChange);
-        this.xd = MathHelper.clamp(xd, this.xd - maxSinglePacketSpeedChange, this.xd + maxSinglePacketSpeedChange);
-        this.zd = MathHelper.clamp(zd, this.zd - maxSinglePacketSpeedChange, this.zd + maxSinglePacketSpeedChange);
+        this.yRot = (float) MathHelper.clamp(yRot, this.yRot - MAX_PACKET_ROTATION_CHANGE, this.yRot + MAX_PACKET_ROTATION_CHANGE);
+        this.xd = MathHelper.clamp(xd, this.xd - MAX_PACKET_SPEED_CHANGE, this.xd + MAX_PACKET_SPEED_CHANGE);
+        this.zd = MathHelper.clamp(zd, this.zd - MAX_PACKET_SPEED_CHANGE, this.zd + MAX_PACKET_SPEED_CHANGE);
     }
 
     @Override
@@ -458,18 +483,18 @@ public class EntityBoat extends Entity
     }
 
     @Override
-	public boolean interact(EntityPlayer entityplayer)
+	public boolean interact(Player entityplayer)
     {
-        if(passenger != null && (passenger instanceof EntityPlayer) && passenger != entityplayer)
+        if(passenger != null && (passenger instanceof Player) && passenger != entityplayer)
         {
             return true;
         }
         if(!world.isClientSide)
         {
-            if (entityplayer.getHeldItem() != null && entityplayer.getHeldItem().itemID == Item.flag.id && flag == null)
+            if (entityplayer.getHeldItem() != null && entityplayer.getHeldItem().itemID == Items.FLAG.id && flag == null)
             {
                 this.flag = entityplayer.getHeldItem().copy();
-                entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
+                entityplayer.inventory.setItem(entityplayer.inventory.currentItem, null);
                 createTileEntity();
                 world.sendTrackedEntityDataPacket(this);
                 return true;
@@ -478,7 +503,6 @@ public class EntityBoat extends Entity
         }
         return true;
     }
-    
     @Override
     public Entity ejectRider() {
         Entity entity = passenger;
@@ -508,30 +532,7 @@ public class EntityBoat extends Entity
         }
         return entity;
     }
+
     @Override
-    protected void causeFallDamage(float f){}
-
-    private final double maxBoatSpeed = 0.8D;
-    private final double acceleration = 0.0065D;
-    private final float maxRotSpeed = 5f;
-    private final float minRotSpeed = 3f;
-    private final double maxSinglePacketSpeedChange = acceleration * 8;
-    private final double maxSinglePacketRotationChange = maxRotSpeed * 4;
-    public int boatCurrentDamage;
-    public int boatTimeSinceHit;
-    public int boatRockDirection;
-    private int lerpTicks;
-    private double lerpX;
-    private double lerpY;
-    private double lerpZ;
-    private float lerpYRot;
-    private float boatPitch;
-    private double velocityX;
-    private double velocityY;
-    private double velocityZ;
-    private float pendingYRot;
-    private double pendingXDChange;
-    private double pendingZDChange;
-    private ItemStack flag = null;
-    public TileEntityFlag tileEntityFlag = null;
+    protected void causeFallDamage(float distance){}
 }
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java b/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
deleted file mode 100644
index a19df97a5..000000000
--- a/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
+++ /dev/null
@@ -1,1061 +0,0 @@
-package net.minecraft.core.entity.vehicle;
-
-import net.minecraft.core.crafting.LookupFuelFurnace;
-import net.minecraft.core.player.inventory.InventorySorter;
-import net.minecraft.core.util.phys.Vec3d;
-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 net.minecraft.core.util.helper.MathHelper;
-import com.mojang.nbt.CompoundTag;
-import com.mojang.nbt.ListTag;
-import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.IInventory;
-import net.minecraft.core.world.World;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockRail;
-import net.minecraft.core.util.helper.DamageType;
-
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, IInventory, ItemStack, World, 
-//            Item, EntityItem, Block, MathHelper, 
-//            BlockRail, Vec3D, AxisAlignedBB, NBTTagCompound, 
-//            NBTTagList, EntityLiving, EntityPlayer, InventoryPlayer
-
-public class EntityMinecart extends Entity
-    implements IInventory
-{
-
-    public EntityMinecart(World world)
-    {
-        super(world);
-        cargoItems = new ItemStack[36];
-        minecartCurrentDamage = 0;
-        minecartTimeSinceHit = 0;
-        minecartRockDirection = 1;
-        field_856_i = false;
-        blocksBuilding = true;
-        setSize(0.98F, 0.7F);
-        heightOffset = bbHeight / 2.0F;
-    }
-
-    @Override
-	protected boolean makeStepSound()
-    {
-        return false;
-    }
-
-    @Override
-	protected void init()
-    {
-    }
-
-    @Override
-	public boolean isPushable()
-    {
-        return true;
-    }
-
-    public EntityMinecart(World world, double d, double d1, double d2, 
-            int i)
-    {
-        this(world);
-        setPos(d, d1 + (double) heightOffset, d2);
-        xd = 0.0D;
-        yd = 0.0D;
-        zd = 0.0D;
-        xo = d;
-        yo = d1;
-        zo = d2;
-        minecartType = i;
-    }
-
-    @Override
-    public Entity ejectRider() {
-        Entity entity = passenger;
-        if (entity == null) return null;
-
-        this.passenger = null;
-        entity.vehicle = null;
-
-        int x = MathHelper.floor_double(this.x);
-        int y = MathHelper.floor_double(this.y);
-        int z = MathHelper.floor_double(this.z);
-
-        if (isSafe(x - 1, y, z)) {
-            entity.moveTo(x - 0.5, y, z + 0.5, entity.yRot, entity.xRot);
-        } else if (isSafe(x + 1, y, z)) {
-            entity.moveTo(x + 1.5, y, z + 0.5, entity.yRot, entity.xRot);
-        } else if (isSafe(x, y, z - 1)) {
-            entity.moveTo(x + 0.5, y, z - 0.5, entity.yRot, entity.xRot);
-        } else if (isSafe(x, y, z + 1)) {
-            entity.moveTo(x + 0.5, y, z + 1.5, entity.yRot, entity.xRot);
-        } else {
-            entity.moveTo(x + 0.5, y + 1, z + 0.5, entity.yRot, entity.xRot);
-        }
-
-        return entity;
-    }
-
-    private boolean isSafe(int x, int y, int z) {
-        return !world.isBlockNormalCube(x, y, z) && !world.isBlockNormalCube(x, y + 1, z);
-    }
-
-    @Override
-	public double getRideHeight()
-    {
-        return (double) bbHeight * 0.0D - 0.3D;
-    }
-
-    @Override
-    public boolean hurt(Entity entity, int i, DamageType type)
-    {
-        if(world.isClientSide || removed)
-        {
-            return true;
-        }
-        if(entity instanceof EntityPlayer) {
-        	if(((EntityPlayer) entity).getGamemode() == Gamemode.creative) {
-        		remove();
-        		return true;
-        	}
-        }
-        minecartRockDirection = -minecartRockDirection;
-        minecartTimeSinceHit = 10;
-        markHurt();
-        minecartCurrentDamage += i * 10;
-        if(minecartCurrentDamage > 40)
-        {
-            if(passenger != null)
-            {
-                passenger.startRiding(this);
-            }
-            remove();
-            spawnAtLocation(Item.minecart.id, 1, 0.0F);
-            if(minecartType == 1)
-            {
-                EntityMinecart entityminecart = this;
-label0:
-                for(int j = 0; j < entityminecart.getSizeInventory(); j++)
-                {
-                    ItemStack itemstack = entityminecart.getStackInSlot(j);
-                    if(itemstack == null)
-                    {
-                        continue;
-                    }
-                    float f = random.nextFloat() * 0.8F + 0.1F;
-                    float f1 = random.nextFloat() * 0.8F + 0.1F;
-                    float f2 = random.nextFloat() * 0.8F + 0.1F;
-                    do
-                    {
-                        if(itemstack.stackSize <= 0)
-                        {
-                            continue label0;
-                        }
-                        int k = random.nextInt(21) + 10;
-                        if(k > itemstack.stackSize)
-                        {
-                            k = itemstack.stackSize;
-                        }
-                        itemstack.stackSize -= k;
-                        EntityItem entityitem = new EntityItem(world, x + (double)f, y + (double)f1, z + (double)f2, new ItemStack(itemstack.itemID, k, itemstack.getMetadata()));
-                        float f3 = 0.05F;
-                        entityitem.xd = (float) random.nextGaussian() * f3 * 0.5f;
-                        entityitem.yd = (float) random.nextGaussian() * f3 + 0.2F;
-                        entityitem.zd = (float) random.nextGaussian() * f3 * 0.5f;
-                        world.entityJoinedWorld(entityitem);
-                    } while(true);
-                }
-
-                spawnAtLocation(Block.chestPlanksOak.id, 1, 0.0F);
-            } else
-            if(minecartType == 2)
-            {
-                spawnAtLocation(Block.furnaceStoneIdle.id, 1, 0.0F);
-            }
-        }
-        return true;
-    }
-
-    @Override
-	public void animateHurt()
-    {
-        minecartRockDirection = -minecartRockDirection;
-        minecartTimeSinceHit = 10;
-        minecartCurrentDamage += minecartCurrentDamage * 10;
-    }
-
-    @Override
-	public boolean isPickable()
-    {
-        return !removed;
-    }
-
-    @Override
-	public void remove()
-    {
-label0:
-        for(int i = 0; i < getSizeInventory(); i++)
-        {
-            ItemStack itemstack = getStackInSlot(i);
-            if(itemstack == null)
-            {
-                continue;
-            }
-            float f = random.nextFloat() * 0.8F + 0.1F;
-            float f1 = random.nextFloat() * 0.8F + 0.1F;
-            float f2 = random.nextFloat() * 0.8F + 0.1F;
-            do
-            {
-                if(itemstack.stackSize <= 0)
-                {
-                    continue label0;
-                }
-                int j = random.nextInt(21) + 10;
-                if(j > itemstack.stackSize)
-                {
-                    j = itemstack.stackSize;
-                }
-                itemstack.stackSize -= j;
-                EntityItem entityitem = new EntityItem(world, x + (double)f, y + (double)f1, z + (double)f2, new ItemStack(itemstack.itemID, j, itemstack.getMetadata()));
-                float f3 = 0.05F;
-                entityitem.xd = (float) random.nextGaussian() * f3;
-                entityitem.yd = (float) random.nextGaussian() * f3 + 0.2F;
-                entityitem.zd = (float) random.nextGaussian() * f3;
-                world.entityJoinedWorld(entityitem);
-            } while(true);
-        }
-        ejectRider();
-        super.remove();
-    }
-    
-    @Override
-	public void tick() {
-        if(minecartTimeSinceHit > 0)
-        {
-            minecartTimeSinceHit--;
-        }
-        if(minecartCurrentDamage > 0)
-        {
-            minecartCurrentDamage--;
-        }
-        double _x = x;
-        double _y = y;
-        double _z = z;
-    	onUpdate2();
-    	onUpdate2();
-        this.xo = _x;
-        this.yo = _y;
-        this.zo = _z;
-    }
-
-    public void onUpdate2()
-    {
-        if(world.isClientSide && field_9415_k > 0)
-        {
-            if(field_9415_k > 0)
-            {
-                double d = x + (field_9414_l - x) / (double)field_9415_k;
-                double d1 = y + (field_9413_m - y) / (double)field_9415_k;
-                double d3 = z + (field_9412_n - z) / (double)field_9415_k;
-                double d4;
-                for(d4 = field_9411_o - (double) yRot; d4 < -180D; d4 += 360D) { }
-                for(; d4 >= 180D; d4 -= 360D) { }
-                yRot += d4 / (double)field_9415_k;
-                xRot += (field_9410_p - (double) xRot) / (double)field_9415_k;
-                field_9415_k--;
-                setPos(d, d1, d3);
-                setRot(yRot, xRot);
-            } else
-            {
-                setPos(x, y, z);
-                setRot(yRot, xRot);
-            }
-            return;
-        }
-        xo = x;
-        yo = y;
-        zo = z;
-        yd -= 0.04D;
-        int i = MathHelper.floor_double(x);
-        int j = MathHelper.floor_double(y);
-        int k = MathHelper.floor_double(z);
-        if(BlockRail.isRailBlockAt(world, i, j - 1, k))
-        {
-            j--;
-        }
-        double d2 = 0.4D;
-        boolean flag = false;
-        double d5 = 0.0078125D;
-        int l = world.getBlockId(i, j, k);
-        if(BlockRail.isRailBlock(l))
-        {
-            Vec3d vec3d = func_514_g(x, y, z);
-            int i1 = world.getBlockMetadata(i, j, k);
-            y = j;
-            boolean flag1 = false;
-            boolean flag2 = false;
-            if(l == Block.railPowered.id)
-            {
-                flag1 = (i1 & 8) != 0;
-                flag2 = !flag1;
-            }
-            if(((BlockRail)Block.blocksList[l]).getIsPowered())
-            {
-                i1 &= 7;
-            }
-            if(i1 >= 2 && i1 <= 5)
-            {
-                y = j + 1;
-            }
-            if(i1 == 2)
-            {
-                xd -= d5;
-            }
-            if(i1 == 3)
-            {
-                xd += d5;
-            }
-            if(i1 == 4)
-            {
-                zd += d5;
-            }
-            if(i1 == 5)
-            {
-                zd -= d5;
-            }
-            int ai[][] = field_855_j[i1];
-            double d9 = ai[1][0] - ai[0][0];
-            double d10 = ai[1][2] - ai[0][2];
-            double d11 = java.lang.Math.sqrt(d9 * d9 + d10 * d10);
-            double d12 = xd * d9 + zd * d10;
-            if(d12 < 0.0D)
-            {
-                d9 = -d9;
-                d10 = -d10;
-            }
-            double d13 = java.lang.Math.sqrt(xd * xd + zd * zd);
-            xd = (d13 * d9) / d11;
-            zd = (d13 * d10) / d11;
-            if(flag2)
-            {
-                double d16 = java.lang.Math.sqrt(xd * xd + zd * zd);
-                if(d16 < 0.029999999999999999D)
-                {
-                    xd *= 0.0D;
-                    yd *= 0.0D;
-                    zd *= 0.0D;
-                } else
-                {
-                    xd *= 0.5D;
-                    yd *= 0.0D;
-                    zd *= 0.5D;
-                }
-            }
-            double d17 = 0.0D;
-            double d18 = (double)i + 0.5D + (double)ai[0][0] * 0.5D;
-            double d19 = (double)k + 0.5D + (double)ai[0][2] * 0.5D;
-            double d20 = (double)i + 0.5D + (double)ai[1][0] * 0.5D;
-            double d21 = (double)k + 0.5D + (double)ai[1][2] * 0.5D;
-            d9 = d20 - d18;
-            d10 = d21 - d19;
-            if(d9 == 0.0D)
-            {
-                x = (double)i + 0.5D;
-                d17 = z - (double)k;
-            } else
-            if(d10 == 0.0D)
-            {
-                z = (double)k + 0.5D;
-                d17 = x - (double)i;
-            } else
-            {
-                double d22 = x - d18;
-                double d24 = z - d19;
-                double d26 = (d22 * d9 + d24 * d10) * 2D;
-                d17 = d26;
-            }
-            x = d18 + d9 * d17;
-            z = d19 + d10 * d17;
-            setPos(x, y + (double) heightOffset, z);
-            if(passenger != null && Math.hypot(xd, zd) < 0.01f) {
-                xd += passenger.xd * 0.05;
-                zd += passenger.zd * 0.05;
-            }
-            double d23 = xd;
-            double d25 = zd;
-            if(passenger != null)
-            {
-                d23 *= 0.75D;
-                d25 *= 0.75D;
-            }
-            if(d23 < -d2)
-            {
-                d23 = -d2;
-            }
-            if(d23 > d2)
-            {
-                d23 = d2;
-            }
-            if(d25 < -d2)
-            {
-                d25 = -d2;
-            }
-            if(d25 > d2)
-            {
-                d25 = d2;
-            }
-            move(d23, 0.0D, d25);
-            if(ai[0][1] != 0 && MathHelper.floor_double(x) - i == ai[0][0] && MathHelper.floor_double(z) - k == ai[0][2])
-            {
-                setPos(x, y + (double)ai[0][1], z);
-            } else
-            if(ai[1][1] != 0 && MathHelper.floor_double(x) - i == ai[1][0] && MathHelper.floor_double(z) - k == ai[1][2])
-            {
-                setPos(x, y + (double)ai[1][1], z);
-            }
-            if(passenger != null)
-            {
-                xd *= 0.997D;
-                yd *= 0.0D;
-                zd *= 0.997D;
-            } else
-            {
-                if(minecartType == 2)
-                {
-                    double d27 = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ);
-                    if(d27 > 0.01D)
-                    {
-                        flag = true;
-                        pushX /= d27;
-                        pushZ /= d27;
-                        double d29 = 0.04D;
-                        xd *= 0.8D;
-                        yd *= 0.0D;
-                        zd *= 0.8D;
-                        xd += pushX * d29;
-                        zd += pushZ * d29;
-                    } else
-                    {
-                        xd *= 0.9D;
-                        yd *= 0.0D;
-                        zd *= 0.9D;
-                    }
-                }
-                xd *= 0.96D;
-                yd *= 0.0D;
-                zd *= 0.96D;
-            }
-            Vec3d vec3d1 = func_514_g(x, y, z);
-            if(vec3d1 != null && vec3d != null)
-            {
-                double d28 = (vec3d.yCoord - vec3d1.yCoord) * 0.05D;
-                double d14 = java.lang.Math.sqrt(xd * xd + zd * zd);
-                if(d14 > 0.0D)
-                {
-                    xd = (xd / d14) * (d14 + d28);
-                    zd = (zd / d14) * (d14 + d28);
-                }
-                setPos(x, vec3d1.yCoord, z);
-            }
-            int k1 = MathHelper.floor_double(x);
-            int l1 = MathHelper.floor_double(z);
-            if(k1 != i || l1 != k)
-            {
-                double d15 = java.lang.Math.sqrt(xd * xd + zd * zd);
-                xd = d15 * (double)(k1 - i);
-                zd = d15 * (double)(l1 - k);
-            }
-            if(minecartType == 2)
-            {
-                double d30 = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ);
-                if(d30 > 0.01D && xd * xd + zd * zd > 0.001D)
-                {
-                    pushX = xd;
-                    pushZ = zd;
-                }
-            }
-            if(flag1)
-            {
-                double d31 = java.lang.Math.sqrt(xd * xd + zd * zd);
-                if(d31 > 0.01D)
-                {
-                    double d32 = 0.06D;
-                    xd += (xd / d31) * d32;
-                    zd += (zd / d31) * d32;
-                } else
-                if(i1 == 1)
-                {
-                    if(world.isBlockNormalCube(i - 1, j, k))
-                    {
-                        xd = 0.02D;
-                    } else
-                    if(world.isBlockNormalCube(i + 1, j, k))
-                    {
-                        xd = -0.02D;
-                    }
-                } else
-                if(i1 == 0)
-                {
-                    if(world.isBlockNormalCube(i, j, k - 1))
-                    {
-                        zd = 0.02D;
-                    } else
-                    if(world.isBlockNormalCube(i, j, k + 1))
-                    {
-                        zd = -0.02D;
-                    }
-                }
-            }
-        } else
-        {
-            if(xd < -d2)
-            {
-                xd = -d2;
-            }
-            if(xd > d2)
-            {
-                xd = d2;
-            }
-            if(zd < -d2)
-            {
-                zd = -d2;
-            }
-            if(zd > d2)
-            {
-                zd = d2;
-            }
-            if(onGround)
-            {
-                xd *= 0.5D;
-                yd *= 0.5D;
-                zd *= 0.5D;
-            }
-            move(xd, yd, zd);
-            if(!onGround)
-            {
-                xd *= 0.95D;
-                yd *= 0.95D;
-                zd *= 0.95D;
-            }
-        }
-        xRot = 0.0F;
-        double d6 = xo - x;
-        double d7 = zo - z;
-        if(d6 * d6 + d7 * d7 > 0.001D)
-        {
-            yRot = (float)((java.lang.Math.atan2(d7, d6) * 180D) / 3.1415926535897931D);
-            if(field_856_i)
-            {
-                yRot += 180F;
-            }
-        }
-        double d8;
-        for(d8 = yRot - yRotO; d8 >= 180D; d8 -= 360D) { }
-        for(; d8 < -180D; d8 += 360D) { }
-        if(d8 < -170D || d8 >= 170D)
-        {
-            yRot += 180F;
-            field_856_i = !field_856_i;
-        }
-        setRot(yRot, xRot);
-        List list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(0.2D, 0.0D, 0.2));
-        if(list != null && list.size() > 0)
-        {
-            for(int j1 = 0; j1 < list.size(); j1++)
-            {
-                Entity entity = (Entity)list.get(j1);
-                if(entity != passenger && entity.isPushable() && (entity instanceof EntityMinecart))
-                {
-                    entity.push(this);
-                }
-            }
-
-        }
-        if(passenger != null && passenger.removed)
-        {
-            passenger = null;
-        }
-        if(flag && random.nextInt(4) == 0)
-        {
-            fuel--;
-            if(fuel < 0)
-            {
-                pushX = pushZ = 0.0D;
-            }
-            world.spawnParticle("largesmoke", x, y + 0.8D, z, 0.0D, 0.0D, 0.0D, 0);
-        }
-    }
-
-    public Vec3d func_515_a(double d, double d1, double d2, double d3)
-    {
-        int i = MathHelper.floor_double(d);
-        int j = MathHelper.floor_double(d1);
-        int k = MathHelper.floor_double(d2);
-        if(BlockRail.isRailBlockAt(world, i, j - 1, k))
-        {
-            j--;
-        }
-        int l = world.getBlockId(i, j, k);
-        if(BlockRail.isRailBlock(l))
-        {
-            int i1 = world.getBlockMetadata(i, j, k);
-            if(((BlockRail)Block.blocksList[l]).getIsPowered())
-            {
-                i1 &= 7;
-            }
-            d1 = j;
-            if(i1 >= 2 && i1 <= 5)
-            {
-                d1 = j + 1;
-            }
-            int ai[][] = field_855_j[i1];
-            double d4 = ai[1][0] - ai[0][0];
-            double d5 = ai[1][2] - ai[0][2];
-            double d6 = java.lang.Math.sqrt(d4 * d4 + d5 * d5);
-            d4 /= d6;
-            d5 /= d6;
-            d += d4 * d3;
-            d2 += d5 * d3;
-            if(ai[0][1] != 0 && MathHelper.floor_double(d) - i == ai[0][0] && MathHelper.floor_double(d2) - k == ai[0][2])
-            {
-                d1 += ai[0][1];
-            } else
-            if(ai[1][1] != 0 && MathHelper.floor_double(d) - i == ai[1][0] && MathHelper.floor_double(d2) - k == ai[1][2])
-            {
-                d1 += ai[1][1];
-            }
-            return func_514_g(d, d1, d2);
-        } else
-        {
-            return null;
-        }
-    }
-
-    public Vec3d func_514_g(double d, double d1, double d2)
-    {
-        int i = MathHelper.floor_double(d);
-        int j = MathHelper.floor_double(d1);
-        int k = MathHelper.floor_double(d2);
-        if(BlockRail.isRailBlockAt(world, i, j - 1, k))
-        {
-            j--;
-        }
-        int l = world.getBlockId(i, j, k);
-        if(BlockRail.isRailBlock(l))
-        {
-            int i1 = world.getBlockMetadata(i, j, k);
-            d1 = j;
-            if(((BlockRail)Block.blocksList[l]).getIsPowered())
-            {
-                i1 &= 7;
-            }
-            if(i1 >= 2 && i1 <= 5)
-            {
-                d1 = j + 1;
-            }
-            int ai[][] = field_855_j[i1];
-            double d3 = 0.0D;
-            double d4 = (double)i + 0.5D + (double)ai[0][0] * 0.5D;
-            double d5 = (double)j + 0.5D + (double)ai[0][1] * 0.5D;
-            double d6 = (double)k + 0.5D + (double)ai[0][2] * 0.5D;
-            double d7 = (double)i + 0.5D + (double)ai[1][0] * 0.5D;
-            double d8 = (double)j + 0.5D + (double)ai[1][1] * 0.5D;
-            double d9 = (double)k + 0.5D + (double)ai[1][2] * 0.5D;
-            double d10 = d7 - d4;
-            double d11 = (d8 - d5) * 2D;
-            double d12 = d9 - d6;
-            if(d10 == 0.0D)
-            {
-                d = (double)i + 0.5D;
-                d3 = d2 - (double)k;
-            } else
-            if(d12 == 0.0D)
-            {
-                d2 = (double)k + 0.5D;
-                d3 = d - (double)i;
-            } else
-            {
-                double d13 = d - d4;
-                double d14 = d2 - d6;
-                double d15 = (d13 * d10 + d14 * d12) * 2D;
-                d3 = d15;
-            }
-            d = d4 + d10 * d3;
-            d1 = d5 + d11 * d3;
-            d2 = d6 + d12 * d3;
-            if(d11 < 0.0D)
-            {
-                d1++;
-            }
-            if(d11 > 0.0D)
-            {
-                d1 += 0.5D;
-            }
-            return Vec3d.createVector(d, d1, d2);
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-    public void addAdditionalSaveData(CompoundTag tag)
-    {
-        tag.putInt("Type", minecartType);
-        if(minecartType == 2)
-        {
-            tag.putDouble("PushX", pushX);
-            tag.putDouble("PushZ", pushZ);
-            tag.putShort("Fuel", (short)fuel);
-        } else
-        if(minecartType == 1)
-        {
-            ListTag nbttaglist = new ListTag();
-            for(int i = 0; i < cargoItems.length; i++)
-            {
-                if(cargoItems[i] != null)
-                {
-                    CompoundTag nbttagcompound1 = new CompoundTag();
-                    nbttagcompound1.putByte("Slot", (byte)i);
-                    cargoItems[i].writeToNBT(nbttagcompound1);
-                    nbttaglist.addTag(nbttagcompound1);
-                }
-            }
-
-            tag.put("Items", nbttaglist);
-        }
-    }
-
-    @Override
-	public void readAdditionalSaveData(CompoundTag tag)
-    {
-        minecartType = tag.getInteger("Type");
-        if(minecartType == 2)
-        {
-            pushX = tag.getDouble("PushX");
-            pushZ = tag.getDouble("PushZ");
-            fuel = tag.getShort("Fuel");
-        } else
-        if(minecartType == 1)
-        {
-            ListTag nbttaglist = tag.getList("Items");
-            cargoItems = new ItemStack[getSizeInventory()];
-            for(int i = 0; i < nbttaglist.tagCount(); i++)
-            {
-                CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
-                int j = nbttagcompound1.getByte("Slot") & 0xff;
-                if(j >= 0 && j < cargoItems.length)
-                {
-                    cargoItems[j] = ItemStack.readItemStackFromNbt(nbttagcompound1);
-                }
-            }
-
-        }
-    }
-
-    @Override
-	public float getShadowHeightOffs()
-    {
-        return 0.0F;
-    }
-
-    @Override
-	public void push(Entity entity)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        if(entity == passenger)
-        {
-            return;
-        }
-        if(!entity.isPushable())
-        {
-        	return;
-        }
-        if((entity instanceof EntityLiving) && !(entity instanceof EntityPlayer) && minecartType == 0 && xd * xd + zd * zd > 0.01D && passenger == null && entity.vehicle == null)
-        {
-            entity.startRiding(this);
-        }
-        final double n = entity.x - this.x;
-        final double n2 = entity.z - this.z;
-        final double n3 = n * n + n2 * n2;
-        if (n3 >= 9.999999747378752E-5) {
-            final double n4 = Math.sqrt(n3);
-            final double n5 = n / n4;
-            final double n6 = n2 / n4;
-            double n7 = 1.0 / n4;
-            if (n7 > 1.0) {
-                n7 = 1.0;
-            }
-            final double n8 = n5 * n7;
-            final double n9 = n6 * n7;
-            final double n10 = n8 * 0.10000000149011612;
-            final double n11 = n9 * 0.10000000149011612;
-            final double n12 = n10 * (1.0f - this.pushthrough);
-            final double n13 = n11 * (1.0f - this.pushthrough);
-            final double n14 = n12 * 0.5;
-            final double n15 = n13 * 0.5;
-            if (entity instanceof EntityMinecart) {
-                final double n16 = entity.xd + this.xd;
-                final double n17 = entity.zd + this.zd;
-                if (((EntityMinecart)entity).minecartType == 2 && this.minecartType != 2) {
-                    this.xd *= 0.20000000298023224;
-                    this.zd *= 0.20000000298023224;
-                    this.push(entity.xd - n14, 0.0, entity.zd - n15);
-                    entity.xd *= 0.699999988079071;
-                    entity.zd *= 0.699999988079071;
-                }
-                else if (((EntityMinecart)entity).minecartType != 2 && this.minecartType == 2) {
-                    entity.xd *= 0.20000000298023224;
-                    entity.zd *= 0.20000000298023224;
-                    entity.push(this.xd + n14, 0.0, this.zd + n15);
-                    this.xd *= 0.699999988079071;
-                    this.zd *= 0.699999988079071;
-                }
-                else {
-                    final double n18 = n16 / 2.0;
-                    final double n19 = n17 / 2.0;
-                    this.xd *= 0.20000000298023224;
-                    this.zd *= 0.20000000298023224;
-                    this.push(n18 - n14, 0.0, n19 - n15);
-                    entity.xd *= 0.20000000298023224;
-                    entity.zd *= 0.20000000298023224;
-                    entity.push(n18 + n14, 0.0, n19 + n15);
-                }
-            }
-            else {
-                this.push(-n14, 0.0, -n15);
-                entity.push(n14 / 4.0, 0.0, n15 / 4.0);
-            }
-        }
-    }
-
-    @Override
-	public int getSizeInventory()
-    {
-        return 27;
-    }
-
-    @Override
-	public ItemStack getStackInSlot(int i)
-    {
-        return cargoItems[i];
-    }
-
-    @Override
-	public ItemStack decrStackSize(int i, int j)
-    {
-        if(cargoItems[i] != null)
-        {
-            if(cargoItems[i].stackSize <= j)
-            {
-                ItemStack itemstack = cargoItems[i];
-                cargoItems[i] = null;
-                return itemstack;
-            }
-            ItemStack itemstack1 = cargoItems[i].splitStack(j);
-            if(cargoItems[i].stackSize <= 0)
-            {
-                cargoItems[i] = null;
-            }
-            return itemstack1;
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
-    {
-        cargoItems[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
-        {
-            itemstack.stackSize = getInventoryStackLimit();
-        }
-    }
-
-    @Override
-	public String getInvName()
-    {
-        return "Minecart";
-    }
-
-    @Override
-	public int getInventoryStackLimit()
-    {
-        return 64;
-    }
-
-    @Override
-	public void onInventoryChanged()
-    {
-    }
-
-    @Override
-	public boolean interact(EntityPlayer entityplayer)
-    {
-        if(minecartType == 0)
-        {
-            if(passenger != null && (passenger instanceof EntityPlayer) && passenger != entityplayer)
-            {
-                return true;
-            }
-            if(!world.isClientSide)
-            {
-                entityplayer.startRiding(this);
-            }
-        } else
-        if(minecartType == 1)
-        {
-            if(!world.isClientSide)
-            {
-                entityplayer.displayGUIChest(this);
-            }
-        } else
-        if(minecartType == 2)
-        {
-            ItemStack itemstack = entityplayer.inventory.getCurrentItem();
-            if(itemstack != null && LookupFuelFurnace.instance.getFuelYield(itemstack.itemID) > 0)
-            {
-                if(--itemstack.stackSize <= 0)
-                {
-                    entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
-                }
-                fuel += (int) ((LookupFuelFurnace.instance.getFuelYield(itemstack.itemID)/1600F) * 1200);
-            }
-            pushX = x - entityplayer.x;
-            pushZ = z - entityplayer.z;
-        }
-        return true;
-    }
-
-    @Override
-	public void lerpTo(double x, double y, double z, float yRot,
-                       float xRot, int i)
-    {
-        field_9414_l = x;
-        field_9413_m = y;
-        field_9412_n = z;
-        field_9411_o = yRot;
-        field_9410_p = xRot;
-        field_9415_k = i + 2;
-        xd = field_9409_q;
-        yd = field_9408_r;
-        zd = field_9407_s;
-    }
-
-    @Override
-	public void lerpMotion(double xd, double yd, double zd)
-    {
-        field_9409_q = this.xd = xd;
-        field_9408_r = this.yd = yd;
-        field_9407_s = this.zd = zd;
-    }
-
-    @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
-    {
-        if(removed)
-        {
-            return false;
-        }
-        return entityplayer.distanceToSqr(this) <= 64D;
-    }
-
-    @Override
-    public void sortInventory() {
-        InventorySorter.sortInventory(cargoItems);
-    }
-
-    private ItemStack cargoItems[];
-    public int minecartCurrentDamage;
-    public int minecartTimeSinceHit;
-    public int minecartRockDirection;
-    private boolean field_856_i;
-    public int minecartType;
-    public int fuel;
-    public double pushX;
-    public double pushZ;
-    private static final int field_855_j[][][] = {
-        {
-            {
-                0, 0, -1
-            }, {
-                0, 0, 1
-            }
-        }, {
-            {
-                -1, 0, 0
-            }, {
-                1, 0, 0
-            }
-        }, {
-            {
-                -1, -1, 0
-            }, {
-                1, 0, 0
-            }
-        }, {
-            {
-                -1, 0, 0
-            }, {
-                1, -1, 0
-            }
-        }, {
-            {
-                0, 0, -1
-            }, {
-                0, -1, 1
-            }
-        }, {
-            {
-                0, -1, -1
-            }, {
-                0, 0, 1
-            }
-        }, {
-            {
-                0, 0, 1
-            }, {
-                1, 0, 0
-            }
-        }, {
-            {
-                0, 0, 1
-            }, {
-                -1, 0, 0
-            }
-        }, {
-            {
-                0, 0, -1
-            }, {
-                -1, 0, 0
-            }
-        }, {
-            {
-                0, 0, -1
-            }, {
-                1, 0, 0
-            }
-        }
-    };
-    private int field_9415_k;
-    private double field_9414_l;
-    private double field_9413_m;
-    private double field_9412_n;
-    private double field_9411_o;
-    private double field_9410_p;
-    private double field_9409_q;
-    private double field_9408_r;
-    private double field_9407_s;
-
-}
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
new file mode 100644
index 000000000..85d4b5a35
--- /dev/null
+++ b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
@@ -0,0 +1,827 @@
+package net.minecraft.core.entity.vehicle;
+
+import com.mojang.nbt.CompoundTag;
+import com.mojang.nbt.ListTag;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RailBlock;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.logic.RailDirection;
+import net.minecraft.core.crafting.LookupFuelFurnace;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.player.gamemode.Gamemode;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.InventorySorter;
+import net.minecraft.core.util.helper.DamageType;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+public class MinecartEntity extends Entity implements Container {
+    public static final int PASSENGER_CART = 0;
+    public static final int CHEST_CART = 1;
+    public static final int FURNACE_CART = 2;
+    // 10 x 2 x 3 table of something
+    private static final int[][][] EXITS = {
+        {
+            {  0,  0, -1 }, // STRAIGHT_NS
+            {  0,  0,  1 }
+        },
+        {
+            { -1,  0,  0 }, // STRAIGHT_EW
+            {  1,  0,  0 }
+        },
+        {
+            { -1, -1,  0 }, // SLOPE_E
+            {  1,  0,  0 }
+        },
+        {
+            { -1,  0,  0 }, // SLOPE_W
+            {  1, -1,  0 }
+        },
+        {
+            {  0,  0, -1 }, // SLOPE_N
+            {  0, -1, 1  }
+        },
+        {
+            {  0, -1, -1 }, // SLOPE_S
+            {  0,  0,  1 }
+        },
+        {
+            {  0,  0,  1 }, // TURN_ES
+            {  1,  0,  0 }
+        },
+        {
+            {  0,  0,  1 }, // TURN_WS
+            { -1,  0,  0 }
+        },
+        {
+            {  0,  0, -1 }, // TURN_WN
+            { -1,  0,  0 }
+        },
+        {
+            {  0,  0, -1 }, // TURN_EN
+            {  1,  0,  0 }
+        }
+    };
+    private ItemStack[] items;
+    public int currentDamage;
+    public int timeSinceHit;
+    public int hurtDirection;
+    public boolean flipped;
+    public int type;
+    public int fuel;
+    public double xPush;
+    public double zPush;
+    private int lerpTicks;
+    private double lerpX;
+    private double lerpY;
+    private double lerpZ;
+    private double lerpYRot;
+    private double lerpXRot;
+    private double lerpXD;
+    private double lerpYD;
+    private double lerpZD;
+
+
+    public MinecartEntity(World world) {
+        super(world);
+        items = new ItemStack[36];
+        currentDamage = 0;
+        timeSinceHit = 0;
+        hurtDirection = 1;
+        flipped = false;
+        blocksBuilding = true;
+        setSize(0.98F, 0.7F);
+        heightOffset = bbHeight / 2.0F;
+    }
+    public MinecartEntity(World world, double x, double y, double z, int type) {
+        this(world);
+        setPos(x, y + (double) heightOffset, z);
+        xd = 0.0D;
+        yd = 0.0D;
+        zd = 0.0D;
+        xo = x;
+        yo = y;
+        zo = z;
+        this.type = type;
+    }
+    @Override
+    public float getShadowHeightOffs() {
+        return 0.0F;
+    }
+    @Override
+	protected boolean makeStepSound() {
+        return false;
+    }
+    @Override
+	protected void defineSynchedData() {
+    }
+    @Override
+	public boolean isPushable() {
+        return true;
+    }
+    @Override
+    public boolean isPickable() {
+        return !removed;
+    }
+    @Override
+    public double getRideHeight() {
+        return (double) bbHeight * 0.0D - 0.3D;
+    }
+
+    @Override
+    public Entity ejectRider() {
+        Entity entity = passenger;
+        if (entity == null) return null;
+
+        this.passenger = null;
+        entity.vehicle = null;
+
+        int blockX = MathHelper.floor(this.x);
+        int blockY = MathHelper.floor(this.y);
+        int blockZ = MathHelper.floor(this.z);
+
+        if (isSafe(blockX - 1, blockY, blockZ)) {
+            entity.moveTo(blockX - 0.5, blockY, blockZ + 0.5, entity.yRot, entity.xRot);
+        } else if (isSafe(blockX + 1, blockY, blockZ)) {
+            entity.moveTo(blockX + 1.5, blockY, blockZ + 0.5, entity.yRot, entity.xRot);
+        } else if (isSafe(blockX, blockY, blockZ - 1)) {
+            entity.moveTo(blockX + 0.5, blockY, blockZ - 0.5, entity.yRot, entity.xRot);
+        } else if (isSafe(blockX, blockY, blockZ + 1)) {
+            entity.moveTo(blockX + 0.5, blockY, blockZ + 1.5, entity.yRot, entity.xRot);
+        } else {
+            entity.moveTo(blockX + 0.5, blockY + 1, blockZ + 0.5, entity.yRot, entity.xRot);
+        }
+
+        return entity;
+    }
+
+    private boolean isSafe(int x, int y, int z) {
+        return !world.isBlockNormalCube(x, y, z) && !world.isBlockNormalCube(x, y + 1, z);
+    }
+
+    @Override
+    public boolean hurt(Entity entity, int baseDamage, DamageType type) {
+        if(world.isClientSide || removed) {
+            return true;
+        }
+        if(entity instanceof Player) {
+        	if(((Player) entity).getGamemode() == Gamemode.creative) {
+        		remove();
+        		return true;
+        	}
+        }
+        hurtDirection = -hurtDirection;
+        timeSinceHit = 10;
+        markHurt();
+        currentDamage += baseDamage * 10;
+        if(currentDamage > 40) {
+            if(passenger != null) {
+                passenger.startRiding(this);
+            }
+            if (!world.isClientSide){
+                spawnAtLocation(Items.MINECART.id, 1, 0.0F);
+                switch (this.type){
+                    case CHEST_CART:
+                        spawnAtLocation(Blocks.CHEST_PLANKS_OAK.id, 1, 0.0F);
+                        break;
+                    case FURNACE_CART:
+                        spawnAtLocation(Blocks.FURNACE_STONE_IDLE.id, 1, 0.0F);
+                        break;
+                }
+            }
+            remove();
+        }
+        return true;
+    }
+
+    @Override
+	public void animateHurt() {
+        hurtDirection = -hurtDirection;
+        timeSinceHit = 10;
+        currentDamage += currentDamage * 10;
+    }
+
+    @Override
+	public void remove() {
+        if (!world.isClientSide){
+            for(int j = 0; j < this.getContainerSize(); j++) {
+                ItemStack itemStack = this.getItem(j);
+                if(itemStack == null) continue;
+
+                final float range = 0.7F;
+                double x1 = (double) (random.nextFloat() * range) + (double) (1.0F - range) * 0.5D;
+                double y1 = (double) (random.nextFloat() * range) + (double) (1.0F - range) * 0.5D;
+                double z1 = (double) (random.nextFloat() * range) + (double) (1.0F - range) * 0.5D;
+                ItemEntity itemEntity = new ItemEntity(world, x + x1, y + y1, z + z1, itemStack);
+                itemEntity.pickupDelay = 10;
+                world.entityJoinedWorld(itemEntity);
+                itemEntity.xd *= 0.5;
+                itemEntity.yd *= 0.5;
+                itemEntity.zd *= 0.5;
+                itemEntity.pickupDelay = 0;
+            }
+        }
+
+        ejectRider();
+        super.remove();
+    }
+
+    @Override
+	public void tick() {
+        if(timeSinceHit > 0) timeSinceHit--;
+        if(currentDamage > 0) currentDamage--;
+
+        double _xo = x;
+        double _yo = y;
+        double _zo = z;
+        float _yRot = yRot;
+        float _xRot = xRot;
+        if (world.isClientSide){
+            if (lerpTicks > 0){
+                double newX = x + (lerpX - x) / (double) lerpTicks;
+                double newY = y + (lerpY - y) / (double) lerpTicks;
+                double newZ = z + (lerpZ - z) / (double) lerpTicks;
+
+                yRot += (float) (MathHelper.normalizeRotation(lerpYRot - (double) yRot) / lerpTicks);
+                xRot += (float) (MathHelper.normalizeRotation(lerpXRot - (double) xRot) / lerpTicks);
+
+                lerpTicks--;
+                setPos(newX, newY, newZ);
+                setRot(yRot, xRot);
+            }
+        } else {
+            motionIteration();
+            motionIteration();
+        }
+        this.xo = _xo;
+        this.yo = _yo;
+        this.zo = _zo;
+        this.yRotO = _yRot;
+        this.xRotO = _xRot;
+    }
+
+    public void motionIteration() {
+        xo = x;
+        yo = y;
+        zo = z;
+        yd -= 0.04D;
+        int blockX = MathHelper.floor(x);
+        int blockY = MathHelper.floor(y);
+        int blockZ = MathHelper.floor(z);
+        if(RailBlock.isRailBlockAt(world, blockX, blockY - 1, blockZ)) {
+            blockY--;
+        }
+        final double maxSpeed = 0.4D;
+        boolean didFurnacePush = false;
+        final double d5 = 0.0078125D;
+        Block block = world.getBlock(blockX, blockY, blockZ);
+        if(block instanceof RailBlock) {
+            RailBlock rail = (RailBlock) block;
+            Vec3 vec3d = getPos(x, y, z);
+            y = blockY;
+            boolean onPoweredPoweredRail = false;
+            boolean onUnpoweredPoweredRail = false;
+            if(rail.isPowered) {
+                onPoweredPoweredRail = (world.getBlockMetadata(blockX, blockY, blockZ) & 0b1000) != 0;
+                onUnpoweredPoweredRail = !onPoweredPoweredRail;
+            }
+            RailDirection railDirection = rail.getRailDirection(world, blockX, blockY, blockZ);
+
+            if(railDirection.isSloped()) {
+                y = blockY + 1;
+            }
+            if(railDirection == RailDirection.SLOPE_E) {
+                xd -= d5;
+            }
+            if(railDirection == RailDirection.SLOPE_W) {
+                xd += d5;
+            }
+            if(railDirection == RailDirection.SLOPE_N) {
+                zd += d5;
+            }
+            if(railDirection == RailDirection.SLOPE_S) {
+                zd -= d5;
+            }
+            int[][] nextRailTable = EXITS[railDirection.meta];
+            double d9 = nextRailTable[1][0] - nextRailTable[0][0];
+            double d10 = nextRailTable[1][2] - nextRailTable[0][2];
+            double d11 = Math.sqrt(d9 * d9 + d10 * d10);
+            double d12 = xd * d9 + zd * d10;
+            if(d12 < 0.0D) {
+                d9 = -d9;
+                d10 = -d10;
+            }
+
+            double vel = Math.hypot(xd, zd);
+            xd = (vel * d9) / d11;
+            zd = (vel * d10) / d11;
+            if(onUnpoweredPoweredRail) { // Speed penalty
+                // If current speed below threshold kill all motion
+                if(Math.hypot(xd, zd) < 0.03D) {
+                    xd *= 0.0D;
+                    yd *= 0.0D;
+                    zd *= 0.0D;
+                } else {
+                    xd *= 0.5D;
+                    yd *= 0.0D;
+                    zd *= 0.5D;
+                }
+            }
+            double d18 = (double)blockX + 0.5D + (double)nextRailTable[0][0] * 0.5D;
+            double d19 = (double)blockZ + 0.5D + (double)nextRailTable[0][2] * 0.5D;
+            double d20 = (double)blockX + 0.5D + (double)nextRailTable[1][0] * 0.5D;
+            double d21 = (double)blockZ + 0.5D + (double)nextRailTable[1][2] * 0.5D;
+            d9 = d20 - d18;
+            d10 = d21 - d19;
+            double d17;
+            if(d9 == 0.0D) {
+                d17 = z - (double)blockZ;
+            } else if(d10 == 0.0D) {
+                d17 = x - (double)blockX;
+            } else {
+                double d22 = x - d18;
+                double d24 = z - d19;
+                d17 = (d22 * d9 + d24 * d10) * 2D;
+            }
+            x = d18 + d9 * d17;
+            z = d19 + d10 * d17;
+            setPos(x, y + (double) heightOffset, z);
+
+            // Let passenger push minecart slowly
+            if(passenger != null && Math.hypot(xd, zd) < 0.01f) {
+                xd += passenger.xd * 0.05;
+                zd += passenger.zd * 0.05;
+            }
+            double _xd = xd;
+            double _zd = zd;
+            if(passenger != null) {
+                _xd *= 0.75D;
+                _zd *= 0.75D;
+            }
+            // Cap speed
+            _xd = MathHelper.clamp(_xd, -maxSpeed, maxSpeed);
+            _zd = MathHelper.clamp(_zd, -maxSpeed, maxSpeed);
+
+            move(_xd, 0.0D, _zd);
+            if(nextRailTable[0][1] != 0 && MathHelper.floor(x) - blockX == nextRailTable[0][0] && MathHelper.floor(z) - blockZ == nextRailTable[0][2]) {
+                setPos(x, y + (double)nextRailTable[0][1], z);
+            } else if(nextRailTable[1][1] != 0 && MathHelper.floor(x) - blockX == nextRailTable[1][0] && MathHelper.floor(z) - blockZ == nextRailTable[1][2]) {
+                setPos(x, y + (double)nextRailTable[1][1], z);
+            }
+            if(passenger != null) {
+                xd *= 0.997D;
+                yd *= 0.0D;
+                zd *= 0.997D;
+            } else {
+                if(type == FURNACE_CART) {
+                    vel = Math.hypot(xPush, zPush);
+                    if(vel > 0.01D) {
+                        didFurnacePush = true;
+                        xPush /= vel;
+                        zPush /= vel;
+                        xd *= 0.8D;
+                        yd *= 0.0D;
+                        zd *= 0.8D;
+                        final double pushScalar = 0.04D;
+                        xd += xPush * pushScalar;
+                        zd += zPush * pushScalar;
+                    } else {
+                        xd *= 0.9D;
+                        yd *= 0.0D;
+                        zd *= 0.9D;
+                    }
+                }
+                xd *= 0.96D;
+                yd *= 0.0D;
+                zd *= 0.96D;
+            }
+            Vec3 vec3d1 = getPos(x, y, z);
+            if(vec3d1 != null && vec3d != null) {
+                double slopeSpeedOffset = (vec3d.y - vec3d1.y) * 0.05D; // I think this give a speed buff/penalty for going up/down slopes
+                vel = Math.hypot(xd, zd);
+                if(vel > 0.0D) {
+                    xd = (xd / vel) * (vel + slopeSpeedOffset);
+                    zd = (zd / vel) * (vel + slopeSpeedOffset);
+                }
+                setPos(x, vec3d1.y, z);
+            }
+            int newBlockX = MathHelper.floor(x);
+            int newBlockZ = MathHelper.floor(z);
+            if(newBlockX != blockX || newBlockZ != blockZ) {
+                vel = Math.hypot(xd, zd);
+                xd = vel * (double)(newBlockX - blockX);
+                zd = vel * (double)(newBlockZ - blockZ);
+            }
+            if(type == FURNACE_CART) {
+                double pushMagnitude = Math.hypot(xPush, zPush);
+                if(pushMagnitude > 0.01D && Math.hypot(xd, zd) > 0.001D) {
+                    xPush = xd;
+                    zPush = zd;
+                }
+            }
+            if(onPoweredPoweredRail) { // Speed boost
+                vel = Math.hypot(xd, zd);
+                if(vel > 0.01D) {
+                    final double scalar = 0.06D;
+                    xd += (xd / vel) * scalar;
+                    zd += (zd / vel) * scalar;
+                } else if(railDirection == RailDirection.STRAIGHT_EW) {
+                    if(world.isBlockNormalCube(blockX - 1, blockY, blockZ)) {
+                        xd = 0.02D;
+                    } else if(world.isBlockNormalCube(blockX + 1, blockY, blockZ)) {
+                        xd = -0.02D;
+                    }
+                } else if(railDirection == RailDirection.STRAIGHT_NS) {
+                    if(world.isBlockNormalCube(blockX, blockY, blockZ - 1)) {
+                        zd = 0.02D;
+                    } else if(world.isBlockNormalCube(blockX, blockY, blockZ + 1)) {
+                        zd = -0.02D;
+                    }
+                }
+            }
+        } else {
+            xd = MathHelper.clamp(xd, -maxSpeed, maxSpeed);
+            zd = MathHelper.clamp(zd, -maxSpeed, maxSpeed);
+
+            if(onGround) {
+                xd *= 0.5D;
+                yd *= 0.5D;
+                zd *= 0.5D;
+            }
+            move(xd, yd, zd);
+            if(!onGround) {
+                xd *= 0.95D;
+                yd *= 0.95D;
+                zd *= 0.95D;
+            }
+        }
+        xRot = 0.0F;
+        double diffX = xo - x;
+        double diffZ = zo - z;
+        if(Math.hypot(diffX, diffZ) > 0.001D) {
+            yRot = (float) Math.toDegrees(Math.atan2(diffZ, diffX));
+            if(flipped) {
+                yRot += 180F;
+            }
+        }
+
+        double diffYRot = MathHelper.normalizeRotation(yRot - yRotO);
+
+        // Cause minecart to flip 180?
+        if(diffYRot < -170D || diffYRot >= 170D) {
+            yRot += 180F;
+            flipped = !flipped;
+        }
+
+        setRot(yRot, xRot);
+        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(this, bb.expand(0.2D, 0.0D, 0.2));
+        if(list != null && !list.isEmpty()) {
+            for (Entity entity : list) {
+                if ((entity instanceof MinecartEntity) && entity != passenger && entity.isPushable()) {
+                    entity.push(this);
+                }
+            }
+        }
+        if(passenger != null && passenger.removed) {
+            passenger = null;
+        }
+        if(didFurnacePush && random.nextInt(4) == 0) {
+            fuel--;
+            if(fuel < 0) {
+                xPush = 0.0D;
+                zPush = 0.0D;
+            }
+            world.spawnParticle("largesmoke", x, y + 0.8D, z, 0.0D, 0.0D, 0.0D, 0);
+        }
+    }
+
+    public Vec3 getPosOffs(final double x, final double y, final double z, final double scalar /*Not sure what this is for still*/) {
+        int blockX = MathHelper.floor(x);
+        int blockY = MathHelper.floor(y);
+        int blockZ = MathHelper.floor(z);
+        if(RailBlock.isRailBlockAt(world, blockX, blockY - 1, blockZ)) {
+            blockY--;
+        }
+
+        Block block = world.getBlock(blockX, blockY, blockZ);
+        if (!(block instanceof RailBlock)) { return null; }
+
+        RailBlock rail = (RailBlock) block;
+        int meta = world.getBlockMetadata(blockX, blockY, blockZ);
+        if(rail.getIsPowered()) {
+            meta &= 0b111;
+        }
+        if(meta >= 2 && meta <= 5) {
+            blockY += 1;
+        }
+        int[][] ai = EXITS[meta];
+        double d4 = ai[1][0] - ai[0][0];
+        double d5 = ai[1][2] - ai[0][2];
+        double d6 = Math.sqrt(d4 * d4 + d5 * d5);
+        d4 /= d6;
+        d5 /= d6;
+        double vecX = x + d4 * scalar;
+        double vecZ = z + d5 * scalar;
+        double vecY = blockY;
+        if(ai[0][1] != 0 && MathHelper.floor(x) - blockX == ai[0][0] && MathHelper.floor(z) - blockZ == ai[0][2]) {
+            vecY += ai[0][1];
+        } else if(ai[1][1] != 0 && MathHelper.floor(x) - blockX == ai[1][0] && MathHelper.floor(z) - blockZ == ai[1][2]) {
+            vecY += ai[1][1];
+        }
+        return getPos(vecX, vecY, vecZ);
+    }
+    /**
+     * @return null if not on rail otherwise ?
+     */
+    // If this gets fucked up then the animation looks wrong?
+    @Nullable
+    public Vec3 getPos(final double x, final double y, final double z) {
+        int blockX = MathHelper.floor(x);
+        int blockY = MathHelper.floor(y);
+        int blockZ = MathHelper.floor(z);
+
+        if(RailBlock.isRailBlockAt(world, blockX, blockY - 1, blockZ)) {
+            blockY--;
+        }
+        Block block = world.getBlock(blockX, blockY, blockZ);
+        if (!(block instanceof RailBlock)) { return null; }
+
+        RailBlock rail = (RailBlock) block;
+        RailDirection direction = rail.getRailDirection(world, blockX, blockY, blockZ);
+
+        int[][] offsetMap = EXITS[direction.meta];
+        double x1 = (double)blockX + 0.5D + (double)offsetMap[0][0] * 0.5D;
+        double y1 = (double)blockY + 0.5D + (double)offsetMap[0][1] * 0.5D;
+        double z1 = (double)blockZ + 0.5D + (double)offsetMap[0][2] * 0.5D;
+        double x2 = (double)blockX + 0.5D + (double)offsetMap[1][0] * 0.5D;
+        double y2 = (double)blockY + 0.5D + (double)offsetMap[1][1] * 0.5D;
+        double z2 = (double)blockZ + 0.5D + (double)offsetMap[1][2] * 0.5D;
+
+        double railsDX = x2 - x1;
+        double railsDY = (y2 - y1) * 2D;
+        double railsDZ = z2 - z1;
+
+        double proximity; // ?
+        if(railsDX == 0.0D) { // If rail axis is aligned NorthSouth
+            proximity = z - (double)blockZ;
+        } else if(railsDZ == 0.0D) { // If rail axis is aligned EastWest
+            proximity = x - (double)blockX;
+        } else { // If Rail Curves?
+            double targetDX = x - x1;
+            double targetDZ = z - z1;
+            proximity = (targetDX * railsDX + targetDZ * railsDZ) * 2D;
+        }
+
+        double vecX = x1 + railsDX * proximity;
+        double vecY = y1 + railsDY * proximity;
+        double vecZ = z1 + railsDZ * proximity;
+        if(railsDY < 0.0D) {
+            vecY++;
+        }
+
+        if(railsDY > 0.0D) {
+            vecY += 0.5D;
+        }
+        return Vec3.getTempVec3(vecX, vecY, vecZ);
+    }
+
+    @Override
+    public void lerpTo(double x, double y, double z, float yRot, float xRot, int ticks) {
+        lerpX = x;
+        lerpY = y;
+        lerpZ = z;
+        lerpYRot = yRot;
+        lerpXRot = xRot;
+        lerpTicks = 2;
+        xd = lerpXD;
+        yd = lerpYD;
+        zd = lerpZD;
+    }
+
+    @Override
+    public void lerpMotion(double xd, double yd, double zd) {
+        lerpXD = this.xd = xd;
+        lerpYD = this.yd = yd;
+        lerpZD = this.zd = zd;
+    }
+
+    @Override
+	public void push(Entity entity) {
+        if(world.isClientSide) {
+            return;
+        }
+        if(entity == passenger) {
+            return;
+        }
+        if(!entity.isPushable()) {
+        	return;
+        }
+        if(type == PASSENGER_CART && (entity instanceof Mob) && !(entity instanceof Player) && xd * xd + zd * zd > 0.01D && passenger == null && entity.vehicle == null) {
+            entity.startRiding(this);
+        }
+        final double diffX = entity.x - this.x;
+        final double diffZ = entity.z - this.z;
+        final double distSqr = diffX * diffX + diffZ * diffZ;
+        if (distSqr >= 0.0001) {
+            final double distance = Math.sqrt(distSqr);
+            final double unitX = diffX / distance;
+            final double unitZ = diffZ / distance;
+            double n7 = 1.0 / distance;
+            if (n7 > 1.0) {
+                n7 = 1.0;
+            }
+            final double n8 = unitX * n7;
+            final double n9 = unitZ * n7;
+            final double n10 = n8 * 0.1;
+            final double n11 = n9 * 0.1;
+            final double n12 = n10 * (1.0f - this.pushthrough);
+            final double n13 = n11 * (1.0f - this.pushthrough);
+            final double xForce = n12 * 0.5;
+            final double zForce = n13 * 0.5;
+            if (entity instanceof MinecartEntity) {
+                if (((MinecartEntity)entity).type == FURNACE_CART && this.type != FURNACE_CART) {
+                    this.xd *= 0.2;
+                    this.zd *= 0.2;
+                    this.push(entity.xd - xForce, 0.0, entity.zd - zForce);
+                    entity.xd *= 0.7;
+                    entity.zd *= 0.7;
+                }
+                else if (((MinecartEntity)entity).type != FURNACE_CART && this.type == FURNACE_CART) {
+                    entity.xd *= 0.2;
+                    entity.zd *= 0.2;
+                    entity.push(this.xd + xForce, 0.0, this.zd + zForce);
+                    this.xd *= 0.7;
+                    this.zd *= 0.7;
+                }
+                else {
+                    final double avgXD = (entity.xd + this.xd) / 2.0;
+                    final double avgZD = (entity.zd + this.zd) / 2.0;
+                    this.xd *= 0.2;
+                    this.zd *= 0.2;
+                    this.push(avgXD - xForce, 0.0, avgZD - zForce);
+                    entity.xd *= 0.2;
+                    entity.zd *= 0.2;
+                    entity.push(avgXD + xForce, 0.0, avgZD + zForce);
+                }
+            }
+            else {
+                this.push(-xForce, 0.0, -zForce);
+                entity.push(xForce / 4.0, 0.0, zForce / 4.0);
+            }
+        }
+    }
+
+    @Override
+    public boolean stillValid(Player player) {
+        if(isRemoved()) {
+            return false;
+        }
+        return player.distanceToSqr(this) <= 64D; // Can interact within 8 blocks
+    }
+
+    @Override
+	public boolean interact(Player player) {
+        switch (type){
+            case PASSENGER_CART:
+                if(passenger != null && (passenger instanceof Player) && passenger != player) {
+                    return true;
+                }
+                if(!world.isClientSide) {
+                    player.startRiding(this);
+                }
+                break;
+            case CHEST_CART:
+                if(!world.isClientSide) {
+                    player.displayGUIChest(this);
+                }
+                break;
+            case FURNACE_CART:
+                ItemStack itemstack = player.inventory.getCurrentItem();
+                if(itemstack != null && LookupFuelFurnace.instance.getFuelYield(itemstack.itemID) > 0) {
+                    if(--itemstack.stackSize <= 0)
+                    {
+                        player.inventory.setItem(player.inventory.currentItem, null);
+                    }
+                    fuel += (int) ((LookupFuelFurnace.instance.getFuelYield(itemstack.itemID)/1600F) * 1200);
+                }
+                xPush = x - player.x;
+                zPush = z - player.z;
+                break;
+        }
+        return true;
+    }
+
+    @Override
+    public void addAdditionalSaveData(CompoundTag tag) {
+        tag.putInt("Type", type);
+        switch (type){
+            case CHEST_CART:
+                ListTag nbttaglist = new ListTag();
+                for(int i = 0; i < items.length; i++) {
+                    if(items[i] != null) {
+                        CompoundTag nbttagcompound1 = new CompoundTag();
+                        nbttagcompound1.putByte("Slot", (byte)i);
+                        items[i].writeToNBT(nbttagcompound1);
+                        nbttaglist.addTag(nbttagcompound1);
+                    }
+                }
+                tag.put("Items", nbttaglist);
+                break;
+            case FURNACE_CART:
+                tag.putDouble("PushX", xPush);
+                tag.putDouble("PushZ", zPush);
+                tag.putShort("Fuel", (short)fuel);
+                break;
+        }
+    }
+
+    @Override
+    public void readAdditionalSaveData(CompoundTag tag) {
+        type = tag.getInteger("Type");
+        switch (type){
+            case CHEST_CART:
+                ListTag nbttaglist = tag.getList("Items");
+                items = new ItemStack[getContainerSize()];
+                for(int i = 0; i < nbttaglist.tagCount(); i++) {
+                    CompoundTag nbttagcompound1 = (CompoundTag)nbttaglist.tagAt(i);
+                    int j = nbttagcompound1.getByte("Slot") & 0xff;
+                    if(j < items.length) {
+                        items[j] = ItemStack.readItemStackFromNbt(nbttagcompound1);
+                    }
+                }
+                break;
+            case FURNACE_CART:
+                xPush = tag.getDouble("PushX");
+                zPush = tag.getDouble("PushZ");
+                fuel = tag.getShort("Fuel");
+                break;
+        }
+    }
+    // Inventory Stuff
+
+
+    @Override
+    public String getName() {
+        return "Minecart";
+    }
+
+    @Override
+    public int getMaxStackSize() {
+        return 64;
+    }
+
+    @Override
+    public int getContainerSize() {
+        return 27;
+    }
+
+    @Override
+    public ItemStack getItem(int index) {
+        return items[index];
+    }
+
+    @Override
+    public ItemStack removeItem(int index, int takeAmount) {
+        if(items[index] != null) {
+            if(items[index].stackSize <= takeAmount) {
+                ItemStack itemstack = items[index];
+                items[index] = null;
+                return itemstack;
+            }
+            ItemStack itemstack1 = items[index].splitStack(takeAmount);
+            if(items[index].stackSize <= 0) {
+                items[index] = null;
+            }
+            return itemstack1;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public void setItem(int index, ItemStack itemstack) {
+        items[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize()) {
+            itemstack.stackSize = getMaxStackSize();
+        }
+    }
+
+    @Override
+    public void setChanged() {
+    }
+
+    @Override
+    public void sortContainer() {
+        InventorySorter.sortInventory(items);
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/enums/EnumCreatureType.java b/src/main/java/net/minecraft/core/enums/EnumCreatureType.java
deleted file mode 100644
index eb969b927..000000000
--- a/src/main/java/net/minecraft/core/enums/EnumCreatureType.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.minecraft.core.enums;
-
-import net.minecraft.core.entity.animal.EntityAnimal;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.animal.EntityWaterAnimal;
-import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.monster.IEnemy;
-
-public enum EnumCreatureType {
-
-	monster("monster", 0, IEnemy.class, 70, Material.air, false),
-    creature("creature", 1, EntityAnimal.class, 15, Material.air, true),
-    waterCreature("waterCreature", 2, EntityWaterAnimal.class, 5, Material.water, true),
-    ambientCreature("ambient", 3, EntityFireflyCluster.class, 2, Material.air, true);
-	
-	private final Class<?> creatureClass;
-	private final int maxNumberOfCreature;
-	private final Material creatureMaterial;
-	private final boolean isPeacefulCreature;
-
-	private EnumCreatureType(String name, int id, Class<?> entityClass, int maxNumberOfCreature, Material materialToSpawnIn, boolean isPeacefulCreature) {
-		creatureClass = entityClass;
-		this.maxNumberOfCreature = maxNumberOfCreature;
-		creatureMaterial = materialToSpawnIn;
-		this.isPeacefulCreature = isPeacefulCreature;
-	}
-
-	public Class<?> getCreatureClass() {
-		return creatureClass;
-	}
-
-	public int getMaxNumberOfCreature() {
-		return maxNumberOfCreature;
-	}
-
-	public Material getCreatureMaterial() {
-		return creatureMaterial;
-	}
-
-	public boolean getPeacefulCreature() {
-		return isPeacefulCreature;
-	}
-}
diff --git a/src/main/java/net/minecraft/core/enums/EnumSignPicture.java b/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
index f99667a57..1b342c853 100644
--- a/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
+++ b/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
@@ -2,59 +2,57 @@ package net.minecraft.core.enums;
 
 public enum EnumSignPicture
 {
-    NONE(0, "sign.image.none", 48 * 0, 24 * 0),
-    ARROW_RIGHT(1, "sign.image.arrow_right", 48 * 1, 24 * 0),
-    ARROW_LEFT(2, "sign.image.arrow_left", 48 * 2, 24 * 0),
-    ARROW_DOWN(3, "sign.image.arrow_down", 48 * 3, 24 * 0),
-    ARROW_UP(4, "sign.image.arrow_up", 48 * 4, 24 * 0),
-    CAUTION(5, "sign.image.caution", 48 * 5, 24 * 0),
-    MOBS(6, "sign.image.mobs", 48 * 6, 24 * 0),
-    TREES(7, "sign.image.trees", 48 * 7, 24 * 0),
-    CHEST(8, "sign.image.chest", 48 * 8, 24 * 0),
-    PICKAXE(9, "sign.image.pickaxe", 48 * 9, 24 * 0),
-    WOLF(10, "sign.image.wolf", 48 * 10, 24 * 0),
-    SWORD(11, "sign.image.sword", 48 * 11, 24 * 0),
-    HOE(12, "sign.image.hoe", 48 * 12, 24 * 0),
-    AXE(13, "sign.image.axe", 48 * 13, 24 * 0),
-    SHOVEL(14, "sign.image.shovel", 48 * 14, 24 * 0),
-    BOWL(15, "sign.image.bowl", 48 * 15, 24 * 0),
-    TNT(16, "sign.image.tnt", 48 * 0, 24 * 1),
-    MOB_FARM(17, "sign.image.mob_farm", 48 * 1, 24 * 1),
-    MINE(18, "sign.image.mine", 48 * 2, 24 * 1),
-    REDSTONE(19, "sign.image.redstone", 48 * 3, 24 * 1),
-    FARM(20, "sign.image.farm", 48 * 4, 24 * 1),
-    BARRICADE(21, "sign.image.barricade", 48 * 5, 24 * 1),
-    QUESTION_MARK(22, "sign.image.question_mark", 48 * 6, 24 * 1),
-    FACE_SMILE(23, "sign.image.face_smile", 48 * 7, 24 * 1),
-    FACE_SAD(24, "sign.image.face_sad", 48 * 8, 24 * 1),
-    FACE_CRYING(25, "sign.image.face_crying", 48 * 9, 24 * 1),
-    FACE_GASP(26, "sign.image.face_gasp", 48 * 10, 24 * 1),
-    FACE_THINKING(27, "sign.image.face_thinking", 48 * 11, 24 * 1),
-    FACE_CONFUSED(28, "sign.image.face_confused", 48 * 12, 24 * 1),
-    BIG_SIGN(29, "sign.image.big_sign", 48 * 13, 24 * 1),
-    MOB_ZOMBIE(30, "sign.image.mob_zombie", 48 * 14, 24 * 1),
-    MOB_SKELETON(31, "sign.image.mob_skeleton", 48 * 15, 24 * 1),
-    MOB_CREEPER(32, "sign.image.mob_creeper", 48 * 0, 24 * 2),
-    ONE_PLAYER(33, "sign.image.one_player", 48 * 1, 24 * 2),
-    TWO_PLAYERS(34, "sign.image.two_players", 48 * 2, 24 * 2),
-    THREE_PLAYERS(35, "sign.image.three_players", 48 * 3, 24 * 2),
-    CROSS(36, "sign.image.cross", 48 * 4, 24 * 2),
-    CRAFT(37, "sign.image.craft", 48 * 5, 24 * 2),
-    AFK(38, "sign.image.afk", 48 * 6, 24 * 2),
-    BRB(39, "sign.image.brb", 48 * 7, 24 * 2),
-    HEART(40, "sign.image.heart", 48 * 8, 24 * 2);
+    NONE            (0,  "sign.image.none",          "minecraft:sign/none"),
+    ARROW_RIGHT     (1,  "sign.image.arrow_right",   "minecraft:sign/arrow_right"),
+    ARROW_LEFT      (2,  "sign.image.arrow_left",    "minecraft:sign/arrow_left"),
+    ARROW_DOWN      (3,  "sign.image.arrow_down",    "minecraft:sign/arrow_down"),
+    ARROW_UP        (4,  "sign.image.arrow_up",      "minecraft:sign/arrow_up"),
+    CAUTION         (5,  "sign.image.caution",       "minecraft:sign/caution"),
+    MOBS            (6,  "sign.image.mobs",          "minecraft:sign/mobs"),
+    TREES           (7,  "sign.image.trees",         "minecraft:sign/trees"),
+    CHEST           (8,  "sign.image.chest",         "minecraft:sign/chest"),
+    PICKAXE         (9,  "sign.image.pickaxe",       "minecraft:sign/pickaxe"),
+    WOLF            (10, "sign.image.wolf",          "minecraft:sign/wolf"),
+    SWORD           (11, "sign.image.sword",         "minecraft:sign/sword"),
+    HOE             (12, "sign.image.hoe",           "minecraft:sign/hoe"),
+    AXE             (13, "sign.image.axe",           "minecraft:sign/axe"),
+    SHOVEL          (14, "sign.image.shovel",        "minecraft:sign/shovel"),
+    BOWL            (15, "sign.image.bowl",          "minecraft:sign/bowl"),
+    TNT             (16, "sign.image.tnt",           "minecraft:sign/tnt"),
+    MOB_FARM        (17, "sign.image.mob_farm",      "minecraft:sign/mob_farm"),
+    MINE            (18, "sign.image.mine",          "minecraft:sign/mine"),
+    REDSTONE        (19, "sign.image.redstone",      "minecraft:sign/redstone"),
+    FARM            (20, "sign.image.farm",          "minecraft:sign/farm"),
+    BARRICADE       (21, "sign.image.barricade",     "minecraft:sign/barricade"),
+    QUESTION_MARK   (22, "sign.image.question_mark", "minecraft:sign/question_mark"),
+    FACE_SMILE      (23, "sign.image.face_smile",    "minecraft:sign/face_smile"),
+    FACE_SAD        (24, "sign.image.face_sad",      "minecraft:sign/face_sad"),
+    FACE_CRYING     (25, "sign.image.face_crying",   "minecraft:sign/face_crying"),
+    FACE_GASP       (26, "sign.image.face_gasp",     "minecraft:sign/face_gasp"),
+    FACE_THINKING   (27, "sign.image.face_thinking", "minecraft:sign/face_thinking"),
+    FACE_CONFUSED   (28, "sign.image.face_confused", "minecraft:sign/face_confused"),
+    BIG_SIGN        (29, "sign.image.big_sign",      "minecraft:sign/big_sign"),
+    MOB_ZOMBIE      (30, "sign.image.mob_zombie",    "minecraft:sign/mob_zombie"),
+    MOB_SKELETON    (31, "sign.image.mob_skeleton",  "minecraft:sign/mob_skeleton"),
+    MOB_CREEPER     (32, "sign.image.mob_creeper",   "minecraft:sign/mob_creeper"),
+    ONE_PLAYER      (33, "sign.image.one_player",    "minecraft:sign/one_player"),
+    TWO_PLAYERS     (34, "sign.image.two_players",   "minecraft:sign/two_players"),
+    THREE_PLAYERS   (35, "sign.image.three_players", "minecraft:sign/three_players"),
+    CROSS           (36, "sign.image.cross",         "minecraft:sign/cross"),
+    CRAFT           (37, "sign.image.craft",         "minecraft:sign/craft"),
+    AFK             (38, "sign.image.afk",           "minecraft:sign/afk"),
+    BRB             (39, "sign.image.brb",           "minecraft:sign/brb"),
+    HEART           (40, "sign.image.heart",         "minecraft:sign/heart");
 
     private final int id;
     private final String languageKey;
-    private final int u;
-    private final int v;
+    private final String texKey;
 
-    EnumSignPicture(int id, String languageKey, int u, int v)
+    EnumSignPicture(int id, String languageKey, String textureKey)
     {
         this.id = id;
         this.languageKey = languageKey;
-        this.u = u;
-        this.v = v;
+        this.texKey = textureKey;
     }
 
     public int getId()
@@ -67,13 +65,8 @@ public enum EnumSignPicture
         return languageKey;
     }
 
-    public int getU()
+    public String getTextureKey()
     {
-        return u;
-    }
-
-    public int getV()
-    {
-        return v;
+        return texKey;
     }
 }
diff --git a/src/main/java/net/minecraft/core/enums/MobCategory.java b/src/main/java/net/minecraft/core/enums/MobCategory.java
new file mode 100644
index 000000000..4ac9289a7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/enums/MobCategory.java
@@ -0,0 +1,43 @@
+package net.minecraft.core.enums;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.animal.Animal;
+import net.minecraft.core.entity.animal.WaterAnimal;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.monster.Enemy;
+
+public enum MobCategory {
+
+	monster("monster", 0, Enemy.class, 70, Material.air, false),
+    creature("creature", 1, Animal.class, 15, Material.air, true),
+    waterCreature("waterCreature", 2, WaterAnimal.class, 5, Material.water, true),
+    ambientCreature("ambient", 3, Entity.class, 2, Material.air, true);
+	
+	private final Class<?> baseClass;
+	private final int maxPerChunk;
+	private final Material spawnMaterial;
+	private final boolean isPeaceful;
+
+	MobCategory(String name, int id, Class<?> baseClass, int maxPerChunk, Material spawnMaterial, boolean isPeaceful) {
+		this.baseClass = baseClass;
+		this.maxPerChunk = maxPerChunk;
+		this.spawnMaterial = spawnMaterial;
+		this.isPeaceful = isPeaceful;
+	}
+
+	public Class<?> getBaseClass() {
+		return baseClass;
+	}
+
+	public int getMaxCreaturesPerChunk() {
+		return maxPerChunk;
+	}
+
+	public Material getSpawnMaterial() {
+		return spawnMaterial;
+	}
+
+	public boolean isPeaceful() {
+		return isPeaceful;
+	}
+}
diff --git a/src/main/java/net/minecraft/core/item/ArmorItem.java b/src/main/java/net/minecraft/core/item/ArmorItem.java
new file mode 100644
index 000000000..7f86ad5b6
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/ArmorItem.java
@@ -0,0 +1,27 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.item.material.ArmorMaterial;
+
+public class ArmorItem extends Item implements IArmorItem {
+	private final ArmorMaterial material;
+	private final int armorPiece;
+	public ArmorItem(String name, String namespaceId, int id, ArmorMaterial material, int armorPiece) {
+		super(name, namespaceId, id);
+		this.material = material;
+		this.armorPiece = armorPiece;
+		
+		setMaxDamage((int)(ARMOR_PIECE_DURABILITY_MODIFIERS[armorPiece] * material.durability));
+		
+		maxStackSize = 1;
+	}
+	@Override
+	public ArmorMaterial getArmorMaterial() {
+		return material;
+	}
+
+	@Override
+	public int getArmorPiece() {
+		return armorPiece;
+	}
+
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemBed.java b/src/main/java/net/minecraft/core/item/BedItem.java
similarity index 76%
rename from src/main/java/net/minecraft/core/item/ItemBed.java
rename to src/main/java/net/minecraft/core/item/BedItem.java
index 380fc57de..910657533 100644
--- a/src/main/java/net/minecraft/core/item/ItemBed.java
+++ b/src/main/java/net/minecraft/core/item/BedItem.java
@@ -1,34 +1,34 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockBed;
+import net.minecraft.core.block.BedBlock;
+import net.minecraft.core.block.Blocks;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, Block, BlockBed, EntityPlayer, 
+//            Item, Block, BedBlock, Player,
 //            MathHelper, World, ItemStack
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemBed extends Item
+public class BedItem extends Item
 {
 
-    public ItemBed(String name, int id)
+    public BedItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player 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();
     	}
-        BlockBed blockbed = (BlockBed) Block.bed;
+        BedBlock blockbed = (BedBlock) Blocks.BED;
         int i1 = entityplayer.getHorizontalPlacementDirection(null).getOpposite().getHorizontalIndex();
         byte byte0 = 0;
         byte byte1 = 0;
diff --git a/src/main/java/net/minecraft/core/item/ItemBoat.java b/src/main/java/net/minecraft/core/item/BoatItem.java
similarity index 66%
rename from src/main/java/net/minecraft/core/item/ItemBoat.java
rename to src/main/java/net/minecraft/core/item/BoatItem.java
index cbea601c3..3dbe8f6b4 100644
--- a/src/main/java/net/minecraft/core/item/ItemBoat.java
+++ b/src/main/java/net/minecraft/core/item/BoatItem.java
@@ -2,29 +2,29 @@ package net.minecraft.core.item;
 
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, Vec3D, MathHelper, 
+//            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Block, 
-//            EntityBoat, ItemStack
+//            BoatEntity, ItemStack
 
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.HitResult;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
-public class ItemBoat extends Item
+public class BoatItem extends Item
 {
 
-    public ItemBoat(String name, int id)
+    public BoatItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 1;
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
@@ -32,16 +32,16 @@ public class ItemBoat extends Item
         double d = entityplayer.xo + (entityplayer.x - entityplayer.xo) * (double)f;
         double d1 = (entityplayer.yo + (entityplayer.y - entityplayer.yo) * (double)f + 1.62D) - (double)entityplayer.heightOffset;
         double d2 = entityplayer.zo + (entityplayer.z - entityplayer.zo) * (double)f;
-        Vec3d vec3d = Vec3d.createVector(d, d1, d2);
-        float f3 = MathHelper.cos(-f2 * 0.01745329F - 3.141593F);
-        float f4 = MathHelper.sin(-f2 * 0.01745329F - 3.141593F);
+        Vec3 vec3 = Vec3.getTempVec3(d, d1, d2);
+        float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
+        float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
         float f5 = -MathHelper.cos(-f1 * 0.01745329F);
         float f6 = MathHelper.sin(-f1 * 0.01745329F);
         float f7 = f4 * f5;
         float f9 = f3 * f5;
         double d3 = 5D;
-        Vec3d vec3d1 = vec3d.addVector((double)f7 * d3, (double) f6 * d3, (double)f9 * d3);
-        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1, true);
+        Vec3 vec31 = vec3.add((double)f7 * d3, (double) f6 * d3, (double)f9 * d3);
+        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3, vec31, true);
         if(movingobjectposition == null)
         {
             return itemstack;
@@ -53,11 +53,11 @@ public class ItemBoat extends Item
             int k = movingobjectposition.z;
             if(!world.isClientSide)
             {
-                if(world.getBlockId(i, j, k) == Block.layerSnow.id)
+                if(world.getBlockId(i, j, k) == Blocks.LAYER_SNOW.id)
                 {
                     j--;
                 }
-                EntityBoat boat = new EntityBoat(world, (float)i + 0.5F, (float)j + 1.0F, (float)k + 0.5F);
+                BoatEntity boat = new BoatEntity(world, (float)i + 0.5F, (float)j + 1.0F, (float)k + 0.5F);
                 boat.setRot(entityplayer.yRot - 90, 0);
                 world.entityJoinedWorld(boat);
             }
diff --git a/src/main/java/net/minecraft/core/item/ItemBow.java b/src/main/java/net/minecraft/core/item/BowItem.java
similarity index 58%
rename from src/main/java/net/minecraft/core/item/ItemBow.java
rename to src/main/java/net/minecraft/core/item/BowItem.java
index ccedc20be..a1a7260f8 100644
--- a/src/main/java/net/minecraft/core/item/ItemBow.java
+++ b/src/main/java/net/minecraft/core/item/BowItem.java
@@ -2,60 +2,60 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, InventoryPlayer, World, 
-//            EntityArrow, ItemStack
+//            Item, Player, InventoryPlayer, World,
+//            ArrowProjectile, ItemStack
 
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityArrowPurple;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.entity.projectile.ArrowProjectileGolden;
+import net.minecraft.core.entity.projectile.ArrowProjectilePurple;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
-public class ItemBow extends Item
+public class BowItem extends Item
 {
 
-    public ItemBow(String name, int id)
+    public BowItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 1;
         setMaxDamage(384);
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         ItemStack quiverSlot = entityplayer.inventory.armorItemInSlot(2);
-        if(quiverSlot != null && quiverSlot.itemID == Item.armorQuiver.id && quiverSlot.getMetadata() < quiverSlot.getMaxDamage()){
+        if(quiverSlot != null && quiverSlot.itemID == Items.ARMOR_QUIVER.id && quiverSlot.getMetadata() < quiverSlot.getMaxDamage()){
             entityplayer.inventory.armorItemInSlot(2).damageItem(1, entityplayer);
             itemstack.damageItem(1, entityplayer);
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3f, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
             if (!world.isClientSide) {
-                world.entityJoinedWorld(new EntityArrow(world, entityplayer, true, 0));
+                world.entityJoinedWorld(new ArrowProjectile(world, entityplayer, true, 0));
             }
         }
-        else if(quiverSlot != null && quiverSlot.itemID == Item.armorQuiverGold.id){
+        else if(quiverSlot != null && quiverSlot.itemID == Items.ARMOR_QUIVER_GOLD.id){
             itemstack.damageItem(1, entityplayer);
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3f, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
             if (!world.isClientSide) {
-                world.entityJoinedWorld(new EntityArrowPurple(world, entityplayer, false));
+                world.entityJoinedWorld(new ArrowProjectilePurple(world, entityplayer, false));
             }
         }
-        else if (entityplayer.inventory.consumeInventoryItem(Item.ammoArrowGold.id))
+        else if (entityplayer.inventory.consumeInventoryItem(Items.AMMO_ARROW_GOLD.id))
         {
             itemstack.damageItem(1, entityplayer);
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3f, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
             if(!world.isClientSide)
             {
-                world.entityJoinedWorld(new EntityArrowGolden(world, entityplayer, true));
+                world.entityJoinedWorld(new ArrowProjectileGolden(world, entityplayer, true));
             }
         }
-        else if(entityplayer.inventory.consumeInventoryItem(Item.ammoArrow.id))
+        else if(entityplayer.inventory.consumeInventoryItem(Items.AMMO_ARROW.id))
         {
             itemstack.damageItem(1, entityplayer);
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3f, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
             if(!world.isClientSide)
             {
-                world.entityJoinedWorld(new EntityArrow(world, entityplayer, true, 0));
+                world.entityJoinedWorld(new ArrowProjectile(world, entityplayer, true, 0));
             }
         }
         return itemstack;
diff --git a/src/main/java/net/minecraft/core/item/ItemBucket.java b/src/main/java/net/minecraft/core/item/BucketItem.java
similarity index 74%
rename from src/main/java/net/minecraft/core/item/ItemBucket.java
rename to src/main/java/net/minecraft/core/item/BucketItem.java
index 5c8e2672b..b457c85eb 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucket.java
+++ b/src/main/java/net/minecraft/core/item/BucketItem.java
@@ -1,29 +1,30 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, Vec3D, MathHelper, 
+//            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Material, 
-//            ItemStack, WorldProvider, Block, EntityCow
+//            ItemStack, WorldProvider, Block, CowMob
 
-import net.minecraft.core.HitResult;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
-public class ItemBucket extends Item
+public class BucketItem extends Item
 {
 
-    public ItemBucket(String name, int id, Block blockToPlace)
+    public BucketItem(String name, String namespaceId, int id, Block blockToPlace)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 1;
         if (blockToPlace == null)
         {
@@ -36,15 +37,15 @@ public class ItemBucket extends Item
     }
 
     @Override
-	public ItemStack onUseItem(ItemStack stack, World world, EntityPlayer player) {
+	public ItemStack onUseItem(ItemStack stack, World world, Player player) {
 		float f = 1.0F;
 		float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
 		float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
 		double posX = player.xo + (player.x - player.xo) * (double) f;
-		float yOff = player instanceof EntityPlayerMP ? player.getHeightOffset() : 0;
+		float yOff = player instanceof ServerPlayer ? player.getHeightOffset() : 0;
 		double posY = (player.yo + (player.y - player.yo)) + yOff;
 		double posZ = player.zo + (player.z - player.zo) * (double) f;
-		Vec3d vec3d = Vec3d.createVector(posX, posY, posZ);
+		Vec3 vec3 = Vec3.getTempVec3(posX, posY, posZ);
 		float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
 		float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
 		float f5 = -MathHelper.cos(-f1 * 0.01745329F);
@@ -53,8 +54,8 @@ public class ItemBucket extends Item
 		float f8 = f6;
 		float f9 = f3 * f5;
 		double reachDistance = player.getGamemode().getBlockReachDistance();
-		Vec3d vec3d1 = vec3d.addVector((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
-		HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1, idToPlace == 0);
+		Vec3 vec31 = vec3.add((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
+		HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3, vec31, idToPlace == 0);
 		
 		if(rayTraceResult == null || rayTraceResult.hitType != HitResult.HitType.TILE) {
 			return stack;
@@ -70,7 +71,7 @@ public class ItemBucket extends Item
 		
 		if(idToPlace < 0) {
 			// Milk
-			return new ItemStack(Item.bucket);
+			return new ItemStack(Items.BUCKET);
 		}
 		
 		Block block = world.getBlock(x, y, z);
@@ -86,13 +87,13 @@ public class ItemBucket extends Item
 		}
 		
 		if(world.isAirBlock(x, y, z) || !world.getBlockMaterial(x, y, z).isSolid()) {
-			if(world.dimension == Dimension.nether && idToPlace == Block.fluidWaterFlowing.id) {
+			if(world.dimension == Dimension.nether && idToPlace == Blocks.FLUID_WATER_FLOWING.id) {
 				world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, z + 0.5, y + 0.5, x + 0.5, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
 				for (int l = 0; l < 8; l++) {
 					world.spawnParticle("largesmoke", x + Math.random(), y + Math.random(), z + Math.random(), 0.0D, 0.0D, 0.0D, 0);
 				}
 			} else {
-				if(idToPlace == Block.fluidWaterFlowing.id) {
+				if(idToPlace == Blocks.FLUID_WATER_FLOWING.id) {
 					world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x + 0.5F, y + 0.5F, z + 0.5F, "liquid.splash", 0.5f, 1.0f);
 				}
 				player.swingItem();
@@ -103,7 +104,7 @@ public class ItemBucket extends Item
 				world.setBlockAndMetadataWithNotify(x, y, z, idToPlace, 0);
 			}
 			if(player.getGamemode().consumeBlocks()) {
-				return new ItemStack(Item.bucket);
+				return new ItemStack(Items.BUCKET);
 			}
 		}
 
diff --git a/src/main/java/net/minecraft/core/item/ItemCoal.java b/src/main/java/net/minecraft/core/item/CoalItem.java
similarity index 76%
rename from src/main/java/net/minecraft/core/item/ItemCoal.java
rename to src/main/java/net/minecraft/core/item/CoalItem.java
index 4a291ee56..02a9136fe 100644
--- a/src/main/java/net/minecraft/core/item/ItemCoal.java
+++ b/src/main/java/net/minecraft/core/item/CoalItem.java
@@ -4,12 +4,12 @@ package net.minecraft.core.item;
 // Referenced classes of package net.minecraft.src:
 //            Item, ItemStack
 
-public class ItemCoal extends Item
+public class CoalItem extends Item
 {
 
-    public ItemCoal(String name, int id)
+    public CoalItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setHasSubtypes(true);
         setMaxDamage(0);
     }
diff --git a/src/main/java/net/minecraft/core/item/ItemDoor.java b/src/main/java/net/minecraft/core/item/DoorItem.java
similarity index 86%
rename from src/main/java/net/minecraft/core/item/ItemDoor.java
rename to src/main/java/net/minecraft/core/item/DoorItem.java
index c2db036d9..1f09354a2 100644
--- a/src/main/java/net/minecraft/core/item/ItemDoor.java
+++ b/src/main/java/net/minecraft/core/item/DoorItem.java
@@ -4,28 +4,28 @@ import net.minecraft.core.block.Block;
 import net.minecraft.core.block.material.Material;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, Material, Block, EntityPlayer, 
+//            Item, Material, Block, Player,
 //            MathHelper, World, ItemStack
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 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 ItemDoor extends Item {
+public class DoorItem extends Item {
 	protected final Block doorBlockBottom;
 	protected final Block doorBlockTop;
 
-	public ItemDoor(String name, int id, Block doorBlockBottom, Block doorBlockTop) {
-		super(name, id);
+	public DoorItem(String name, String namespaceId, int id, Block doorBlockBottom, Block doorBlockTop) {
+		super(name, namespaceId, id);
 		maxStackSize = 64;
         this.doorBlockBottom = doorBlockBottom;
         this.doorBlockTop = doorBlockTop;
     }
 
 	@Override
-	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack itemstack, Player 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();
diff --git a/src/main/java/net/minecraft/core/item/ItemDye.java b/src/main/java/net/minecraft/core/item/DyeItem.java
similarity index 70%
rename from src/main/java/net/minecraft/core/item/ItemDye.java
rename to src/main/java/net/minecraft/core/item/DyeItem.java
index 59af2e1dc..b05a59dca 100644
--- a/src/main/java/net/minecraft/core/item/ItemDye.java
+++ b/src/main/java/net/minecraft/core/item/DyeItem.java
@@ -2,25 +2,26 @@ package net.minecraft.core.item;
 
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockWool;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntitySheep;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.SheepMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.type.WorldTypes;
 
-public class ItemDye extends Item
+public class DyeItem extends Item
 {
 
-    public ItemDye(String name, int id)
+    public DyeItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setHasSubtypes(true);
         setMaxDamage(0);
     }
@@ -28,18 +29,18 @@ public class ItemDye extends Item
     @Override
     public String getLanguageKey(ItemStack itemstack)
     {
-        return super.getKey() + "." + dyeColors[itemstack.getMetadata()];
+        return super.getKey() + "." + DyeColor.colorFromItemMeta(itemstack.getMetadata()).colorID;
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
-        if (world.getBlockId(blockX, blockY, blockZ) == Block.signPostPlanksOak.id || world.getBlockId(blockX, blockY, blockZ) == Block.signWallPlanksOak.id)
+        if (world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_POST_PLANKS_OAK.id || world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_WALL_PLANKS_OAK.id)
         {
-            TileEntitySign sign = (TileEntitySign) world.getBlockTileEntity(blockX, blockY, blockZ);
-            if ((15 - itemstack.getMetadata()) != sign.getColor().id)
+            SignBlockEntity sign = (SignBlockEntity) world.getBlockEntity(blockX, blockY, blockZ);
+            if ((DyeColor.WHITE.itemMeta - itemstack.getMetadata()) != sign.getColor().id)
             {
-                sign.setColor(TextFormatting.get(15 - itemstack.getMetadata()));
+                sign.setColor(TextFormatting.get(DyeColor.WHITE.itemMeta - itemstack.getMetadata()));
                 if (entityplayer.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
@@ -48,7 +49,7 @@ public class ItemDye extends Item
             }
             return false;
         }
-        if(itemstack.getMetadata() == 15)
+        if(itemstack.getMetadata() == DyeColor.WHITE.itemMeta)
         {
             int id = world.getBlockId(blockX, blockY, blockZ);
             Block block = Block.blocksList[id];
@@ -57,14 +58,14 @@ public class ItemDye extends Item
                    return true;
                }
             }
-            if(id == Block.dirt.id)
+            if(id == Blocks.DIRT.id)
             {
                 if(!world.isClientSide)
                 {
                     if(Block.lightBlock[world.getBlockId(blockX, blockY + 1, blockZ)] <= 2) {
-                    	int grass = Block.grass.id;
+                    	int grass = Blocks.GRASS.id;
                     	if(world.dimensionData.getWorldType() == WorldTypes.OVERWORLD_RETRO) {
-                    		grass = Block.grassRetro.id;
+                    		grass = Blocks.GRASS_RETRO.id;
                     	}
                         world.setBlockWithNotify(blockX, blockY, blockZ, grass);
                         if (entityplayer.getGamemode().consumeBlocks())
@@ -75,12 +76,12 @@ public class ItemDye extends Item
                 }
                 return true;
             }
-            if(id == Block.dirtScorched.id)
+            if(id == Blocks.DIRT_SCORCHED.id)
             {
                 if (!world.isClientSide)
                 {
                     if(Block.lightBlock[world.getBlockId(blockX, blockY + 1, blockZ)] <= 2) {
-                        int grass = Block.grassScorched.id;
+                        int grass = Blocks.GRASS_SCORCHED.id;
                         world.setBlockWithNotify(blockX, blockY, blockZ, grass);
                         if (entityplayer.getGamemode().consumeBlocks())
                         {
@@ -123,27 +124,27 @@ label0:
                         }
                         if(itemRand.nextInt(10) != 0)
                         {
-                            if(world.getBlockId(k1, l1-1, i2) == Block.dirtScorched.id ||
-                                    world.getBlockId(k1, l1-1, i2) == Block.dirtScorchedRich.id)
-                                world.setBlockWithNotify(k1, l1, i2, Block.spinifex.id);
+                            if(world.getBlockId(k1, l1-1, i2) == Blocks.DIRT_SCORCHED.id ||
+                                    world.getBlockId(k1, l1-1, i2) == Blocks.DIRT_SCORCHED_RICH.id)
+                                world.setBlockWithNotify(k1, l1, i2, Blocks.SPINIFEX.id);
                             else
-                                world.setBlockWithNotify(k1, l1, i2, Block.tallgrass.id);
+                                world.setBlockWithNotify(k1, l1, i2, Blocks.TALLGRASS.id);
                             continue;
                         }
                         int r = itemRand.nextInt(12);
                         Biome biome = world.getBlockBiome(k1, l1, i2);
                         if (r < 1){
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerYellow.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_YELLOW.id);
                         } else if (r < 2) {
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerRed.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_RED.id);
                         } else if (r < 4 && (biome == Biomes.OVERWORLD_BIRCH_FOREST || biome == Biomes.OVERWORLD_SEASONAL_FOREST)) {
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerPink.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_PINK.id);
                         } else if (r < 6 && (biome == Biomes.OVERWORLD_MEADOW || biome == Biomes.OVERWORLD_BOREAL_FOREST || biome == Biomes.OVERWORLD_SHRUBLAND)) {
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerPurple.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_PURPLE.id);
                         } else if (r < 8 && (biome == Biomes.OVERWORLD_FOREST || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_RAINFOREST || biome == Biomes.OVERWORLD_GRASSLANDS || biome == Biomes.OVERWORLD_CAATINGA)) {
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerLightBlue.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_LIGHT_BLUE.id);
                         } else if (r < 10 && (biome == Biomes.OVERWORLD_PLAINS || biome == Biomes.OVERWORLD_GRASSLANDS || biome == Biomes.OVERWORLD_OUTBACK || biome == Biomes.OVERWORLD_OUTBACK_GRASSY)) {
-                            world.setBlockWithNotify(k1, l1, i2, Block.flowerOrange.id);
+                            world.setBlockWithNotify(k1, l1, i2, Blocks.FLOWER_ORANGE.id);
                         }
                     }
                 }
@@ -154,28 +155,19 @@ label0:
     }
 
     @Override
-    public boolean useItemOnEntity(ItemStack itemstack, EntityLiving entityliving, EntityPlayer entityPlayer)
+    public boolean useItemOnEntity(ItemStack itemstack, Mob mob, Player entityPlayer)
     {
-        if(entityliving instanceof EntitySheep)
+        if(mob instanceof SheepMob)
         {
-            EntitySheep entitysheep = (EntitySheep)entityliving;
-            int i = BlockWool.func_21034_c(itemstack.getMetadata());
-            if(entitysheep.getFleeceColor() != i && itemstack.consumeItem(entityPlayer))
+            SheepMob sheepMob = (SheepMob)mob;
+            DyeColor woolColor = DyeColor.colorFromItemMeta(itemstack.getMetadata());
+            if(sheepMob.getFleeceColor() != woolColor && itemstack.consumeItem(entityPlayer))
             {
-                entitysheep.setFleeceColor(i);
+                sheepMob.setFleeceColor(woolColor);
                 return true;
             }
         }
         return false;
     }
 
-    public static final String dyeColors[] = {
-        "black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", 
-        "lime", "yellow", "lightblue", "magenta", "orange", "white"
-    };
-    public static final int field_31002_bk[] = {
-        0x1e1b1b, 0xb3312c, 0x3b511a, 0x51301a, 0x253192, 0x7b2fbe, 0x287697, 0x287697, 0x434343, 0xd88198, 
-        0x41cd34, 0xdecf2a, 0x6689d3, 0xc354cd, 0xeb8844, 0xf0f0f0
-    };
-
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemEgg.java b/src/main/java/net/minecraft/core/item/EggItem.java
similarity index 55%
rename from src/main/java/net/minecraft/core/item/ItemEgg.java
rename to src/main/java/net/minecraft/core/item/EggItem.java
index 07f939637..4c7771690 100644
--- a/src/main/java/net/minecraft/core/item/ItemEgg.java
+++ b/src/main/java/net/minecraft/core/item/EggItem.java
@@ -1,42 +1,42 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, World, EntityEgg, 
-//            EntityPlayer
+//            Item, ItemStack, World, EggProjectile,
+//            Player
 
-import net.minecraft.core.entity.projectile.EntityEgg;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.projectile.EggProjectile;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class ItemEgg
+public class EggItem
     extends Item
     implements IDispensable
 {
 
-    public ItemEgg(String name, int id)
+    public EggItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 16;
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
         if(!world.isClientSide)
         {
-            world.entityJoinedWorld(new EntityEgg(world, entityplayer));
+            world.entityJoinedWorld(new EggProjectile(world, entityplayer));
         }
         return itemstack;
     }
 
     @Override
     public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
-        EntityEgg egg = new EntityEgg(world, x, y, z);
-        egg.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
-        world.entityJoinedWorld(egg);
+        EggProjectile eggProjectile = new EggProjectile(world, x, y, z);
+        eggProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+        world.entityJoinedWorld(eggProjectile);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
similarity index 71%
rename from src/main/java/net/minecraft/core/item/ItemBucketEmpty.java
rename to src/main/java/net/minecraft/core/item/EmptyBucketItem.java
index a69352c07..db4931281 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java
+++ b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
@@ -1,38 +1,38 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, Vec3D, MathHelper,
+//            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Material,
-//            ItemStack, WorldProvider, Block, EntityCow
+//            ItemStack, WorldProvider, Block, CowMob
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
-public class ItemBucketEmpty extends Item
+public class EmptyBucketItem extends Item
 {
 
-    public ItemBucketEmpty(String name, int id)
+    public EmptyBucketItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 64;
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
         float f2 = entityplayer.yRotO + (entityplayer.yRot - entityplayer.yRotO) * f;
         double d = entityplayer.xo + (entityplayer.x - entityplayer.xo) * (double)f;
-        float yOff = entityplayer instanceof EntityPlayerMP ? entityplayer.getHeightOffset() : 0;
+        float yOff = entityplayer instanceof ServerPlayer ? entityplayer.getHeightOffset() : 0;
         double d1 = (entityplayer.yo + (entityplayer.y - entityplayer.yo)) + yOff;
         double d2 = entityplayer.zo + (entityplayer.z - entityplayer.zo) * (double)f;
-        Vec3d vec3d = Vec3d.createVector(d, d1, d2);
+        Vec3 vec3 = Vec3.getTempVec3(d, d1, d2);
         float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
         float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
         float f5 = -MathHelper.cos(-f1 * 0.01745329F);
@@ -41,8 +41,8 @@ public class ItemBucketEmpty extends Item
         float f8 = f6;
         float f9 = f3 * f5;
         double reachDistance = entityplayer.getGamemode().getBlockReachDistance();
-        Vec3d vec3d1 = vec3d.addVector((double)f7 * reachDistance, (double)f8 * reachDistance, (double)f9 * reachDistance);
-        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1, true);
+        Vec3 vec31 = vec3.add((double)f7 * reachDistance, (double)f8 * reachDistance, (double)f9 * reachDistance);
+        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3, vec31, true);
         if(movingobjectposition == null)
         {
             return itemstack;
@@ -59,14 +59,14 @@ public class ItemBucketEmpty extends Item
 
             else if(world.getBlockMaterial(i, j, k) == Material.water && world.getBlockMetadata(i, j, k) == 0)
             {
-                if(useBucket(entityplayer, new ItemStack(Item.bucketWater))){
+                if(useBucket(entityplayer, new ItemStack(Items.BUCKET_WATER))){
                     world.setBlockWithNotify(i, j, k, 0);
                     entityplayer.swingItem();
                 }
             }
             else if(world.getBlockMaterial(i, j, k) == Material.lava && world.getBlockMetadata(i, j, k) == 0)
             {
-                if(useBucket(entityplayer, new ItemStack(Item.bucketLava))){
+                if(useBucket(entityplayer, new ItemStack(Items.BUCKET_LAVA))){
                     world.setBlockWithNotify(i, j, k, 0);
                     entityplayer.swingItem();
                 }
@@ -75,9 +75,9 @@ public class ItemBucketEmpty extends Item
         return itemstack;
     }
 
-    public static boolean useBucket(EntityPlayer player, ItemStack itemToGive) {
+    public static boolean useBucket(Player player, ItemStack itemToGive) {
         if(player.inventory.getCurrentItem().stackSize <= 1) {
-            player.inventory.setInventorySlotContents(player.inventory.currentItem, itemToGive);
+            player.inventory.setItem(player.inventory.currentItem, itemToGive);
             return true;
         } else {
         	player.inventory.insertItem(itemToGive, true);
diff --git a/src/main/java/net/minecraft/core/item/EndlessQuiverItem.java b/src/main/java/net/minecraft/core/item/EndlessQuiverItem.java
new file mode 100644
index 000000000..544739e60
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/EndlessQuiverItem.java
@@ -0,0 +1,29 @@
+package net.minecraft.core.item;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Item, Block, BlockLeaves, ItemStack,
+//            Mob
+
+
+import net.minecraft.core.item.material.ArmorMaterial;
+
+public class EndlessQuiverItem extends Item implements IArmorItem
+{
+
+    public EndlessQuiverItem(String name, String namespaceId, int id)
+    {
+        super(name, namespaceId, id);
+        setMaxStackSize(1);
+    }
+
+    @Override
+    public ArmorMaterial getArmorMaterial() {
+        return null;
+    }
+
+    @Override
+    public int getArmorPiece() {
+        return PIECE_CHEST;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemFirestriker.java b/src/main/java/net/minecraft/core/item/FireStrikerItem.java
similarity index 66%
rename from src/main/java/net/minecraft/core/item/ItemFirestriker.java
rename to src/main/java/net/minecraft/core/item/FireStrikerItem.java
index 1b56bec82..bfd478a53 100644
--- a/src/main/java/net/minecraft/core/item/ItemFirestriker.java
+++ b/src/main/java/net/minecraft/core/item/FireStrikerItem.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, World, Block, BlockFire, 
-//            ItemStack, EntityPlayer
+//            Item, World, Block, FireBlock,
+//            ItemStack, Player
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
-public class ItemFirestriker extends Item
+public class FireStrikerItem extends Item
 {
 
-    public ItemFirestriker(String name, int id)
+    public FireStrikerItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 1;
         setMaxDamage(ToolMaterial.iron.getDurability()/2);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	blockX += side.getOffsetX();
     	blockY += side.getOffsetY();
@@ -30,7 +30,7 @@ public class ItemFirestriker extends Item
         int i1 = world.getBlockId(blockX, blockY, blockZ);
         if(i1 == 0)
         {
-            if(world.setBlockWithNotify(blockX, blockY, blockZ, Block.fire.id)){
+            if(world.setBlockWithNotify(blockX, blockY, blockZ, Blocks.FIRE.id)){
                 world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
                 itemstack.damageItem(1, entityplayer);
                 return true;
diff --git a/src/main/java/net/minecraft/core/item/ItemFishingRod.java b/src/main/java/net/minecraft/core/item/FishingRodItem.java
similarity index 65%
rename from src/main/java/net/minecraft/core/item/ItemFishingRod.java
rename to src/main/java/net/minecraft/core/item/FishingRodItem.java
index 74a2070d7..da9b28e1f 100644
--- a/src/main/java/net/minecraft/core/item/ItemFishingRod.java
+++ b/src/main/java/net/minecraft/core/item/FishingRodItem.java
@@ -1,25 +1,25 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, EntityFish, ItemStack, 
+//            Item, Player, EntityFish, ItemStack,
 //            World
 
-import net.minecraft.core.entity.EntityBobber;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.FishingBobberEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
-public class ItemFishingRod extends Item
+public class FishingRodItem extends Item
 {
 
-    public ItemFishingRod(String name, int id)
+    public FishingRodItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setMaxDamage(196);
         setMaxStackSize(1);
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         if(entityplayer.bobberEntity != null)
         {
@@ -30,7 +30,7 @@ public class ItemFishingRod extends Item
             world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
             if(!world.isClientSide)
             {
-                world.entityJoinedWorld(new EntityBobber(world, entityplayer));
+                world.entityJoinedWorld(new FishingBobberEntity(world, entityplayer));
             }
         }
         entityplayer.swingItem();
diff --git a/src/main/java/net/minecraft/core/item/ItemFlag.java b/src/main/java/net/minecraft/core/item/FlagItem.java
similarity index 77%
rename from src/main/java/net/minecraft/core/item/ItemFlag.java
rename to src/main/java/net/minecraft/core/item/FlagItem.java
index dcabac23f..b7b6fe05e 100644
--- a/src/main/java/net/minecraft/core/item/ItemFlag.java
+++ b/src/main/java/net/minecraft/core/item/FlagItem.java
@@ -3,19 +3,19 @@ package net.minecraft.core.item;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemFlag extends Item
+public class FlagItem extends Item
 {
-    public ItemFlag(String name, int id)
+    public FlagItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setMaxStackSize(1);
     }
 
@@ -28,11 +28,11 @@ public class ItemFlag extends Item
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack stack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         // copy flag data to empty flag
-		if (world.getBlockId(blockX, blockY, blockZ) == Block.flag.id && !entityplayer.isSneaking()) {
-			TileEntityFlag flag = (TileEntityFlag) world.getBlockTileEntity(blockX, blockY, blockZ);
+		if (world.getBlockId(blockX, blockY, blockZ) == Blocks.FLAG.id && !entityplayer.isSneaking()) {
+			FlagBlockEntity flag = (FlagBlockEntity) world.getBlockEntity(blockX, blockY, blockZ);
 			if (flag != null) {
 				CompoundTag flagData = stack.getData().getCompoundOrDefault("FlagData", new CompoundTag());
 				if (hasFlagBeenDrawnOn(stack) && doesFlagContainDyes(stack)) {
@@ -64,16 +64,16 @@ public class ItemFlag extends Item
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
         	return false;
         }
-        if(!Block.signPostPlanksOak.canPlaceBlockAt(world, blockX, blockY, blockZ))
+        if(!Blocks.SIGN_POST_PLANKS_OAK.canPlaceBlockAt(world, blockX, blockY, blockZ))
         {
             return false;
         }
 
-        world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.flag, EnumBlockSoundEffectType.PLACE);
-        world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.flag.id, 0);
+        world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.FLAG, EnumBlockSoundEffectType.PLACE);
+        world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.FLAG.id, 0);
         
         stack.consumeItem(entityplayer);
-        TileEntityFlag tileentityflag = (TileEntityFlag) world.getBlockTileEntity(blockX, blockY, blockZ);
+        FlagBlockEntity tileentityflag = (FlagBlockEntity) world.getBlockEntity(blockX, blockY, blockZ);
         if(tileentityflag != null)
         {
             CompoundTag flagData = stack.getData().getCompoundOrDefault("FlagData", null);
diff --git a/src/main/java/net/minecraft/core/item/ItemFood.java b/src/main/java/net/minecraft/core/item/FoodItem.java
similarity index 78%
rename from src/main/java/net/minecraft/core/item/ItemFood.java
rename to src/main/java/net/minecraft/core/item/FoodItem.java
index a4ff0d6c3..a13f3b984 100644
--- a/src/main/java/net/minecraft/core/item/ItemFood.java
+++ b/src/main/java/net/minecraft/core/item/FoodItem.java
@@ -1,17 +1,17 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
-public class ItemFood extends Item
+public class FoodItem extends Item
 {
     private final int healAmount;
     private final boolean isWolfsFavoriteMeat;
     private final int ticksPerHeal;
 
-    public ItemFood(String name, int id, int healAmount, int ticksPerHeal, boolean favouriteWolfMeat, int maxStackSize)
+    public FoodItem(String name, String namespaceId, int id, int healAmount, int ticksPerHeal, boolean favouriteWolfMeat, int maxStackSize)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         this.healAmount = healAmount;
         this.ticksPerHeal = ticksPerHeal;
         this.isWolfsFavoriteMeat = favouriteWolfMeat;
@@ -20,7 +20,7 @@ public class ItemFood extends Item
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         if(entityplayer.getHealth() < entityplayer.getMaxHealth()
                 && entityplayer.getHealth() + entityplayer.getTotalHealingRemaining() < entityplayer.getMaxHealth()
diff --git a/src/main/java/net/minecraft/core/item/IArmorItem.java b/src/main/java/net/minecraft/core/item/IArmorItem.java
new file mode 100644
index 000000000..fd4f9e21a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/IArmorItem.java
@@ -0,0 +1,26 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.item.material.ArmorMaterial;
+import org.jetbrains.annotations.Nullable;
+
+public interface IArmorItem {
+    int PIECE_HEAD = 0;
+    int PIECE_CHEST = 1;
+    int PIECE_LEGS = 2;
+    int PIECE_BOOTS = 3;
+    int[] ARMOR_PIECE_PROTECTION_VALUES = new int[] {3, 8, 6, 3};
+
+    float[] ARMOR_PIECE_DURABILITY_MODIFIERS = new float[] {0.91f, 1.0f, 0.97f, 0.94f};
+    Item asItem(); // Ensure this has the same signature as Item's Item.asItem
+    @Nullable
+    ArmorMaterial getArmorMaterial();
+    int getArmorPiece();
+    default int armorPieceProtection() {
+        return ARMOR_PIECE_PROTECTION_VALUES[getArmorPiece()];
+    }
+
+    default float getArmorPieceProtectionPercentage() {
+        return armorPieceProtection() / 20.0f;
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/item/IBonemealable.java b/src/main/java/net/minecraft/core/item/IBonemealable.java
index 0e2bc51ad..936ebb1e8 100644
--- a/src/main/java/net/minecraft/core/item/IBonemealable.java
+++ b/src/main/java/net/minecraft/core/item/IBonemealable.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public interface IBonemealable {
-    boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced);
+    boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced);
 }
diff --git a/src/main/java/net/minecraft/core/item/IComplexItem.java b/src/main/java/net/minecraft/core/item/IComplexItem.java
new file mode 100644
index 000000000..f44036c3c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/IComplexItem.java
@@ -0,0 +1,15 @@
+package net.minecraft.core.item;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Item
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.world.World;
+
+public interface IComplexItem
+{
+    Packet sendPacketData(ItemStack itemstack, World world, Player entityplayer);
+
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java b/src/main/java/net/minecraft/core/item/IceCreamBucketItem.java
similarity index 51%
rename from src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
rename to src/main/java/net/minecraft/core/item/IceCreamBucketItem.java
index 43c34952f..5bf631975 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
+++ b/src/main/java/net/minecraft/core/item/IceCreamBucketItem.java
@@ -1,21 +1,21 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
-public class ItemBucketIceCream extends ItemFood {
+public class IceCreamBucketItem extends FoodItem {
 
-    public ItemBucketIceCream(String name, int id, int healAmount, int ticksPerHeal)
+    public IceCreamBucketItem(String name, String namespaceId, int id, int healAmount, int ticksPerHeal)
     {
-        super(name, id, healAmount, ticksPerHeal, false, 1);
+        super(name, namespaceId, id, healAmount, ticksPerHeal, false, 1);
         maxStackSize = 1;
     }
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         if (entityplayer.getHealth() < entityplayer.getMaxHealth()){
             super.onUseItem(itemstack, world, entityplayer);
-            return new ItemStack(Item.bucket);
+            return new ItemStack(Items.BUCKET);
         }
         return itemstack;
     }
diff --git a/src/main/java/net/minecraft/core/item/IceSkatesItem.java b/src/main/java/net/minecraft/core/item/IceSkatesItem.java
new file mode 100644
index 000000000..88781f334
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/IceSkatesItem.java
@@ -0,0 +1,21 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.item.material.ArmorMaterial;
+import org.jetbrains.annotations.Nullable;
+
+public class IceSkatesItem extends Item implements IArmorItem{
+    public IceSkatesItem(String translationKey, String namespaceId, int id) {
+        super(translationKey, namespaceId, id);
+        setMaxStackSize(1);
+    }
+
+    @Override
+    public @Nullable ArmorMaterial getArmorMaterial() {
+        return null;
+    }
+
+    @Override
+    public int getArmorPiece() {
+        return PIECE_BOOTS;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index 376f847eb..7bc1ce125 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -1,68 +1,137 @@
 package net.minecraft.core.item;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
 import com.mojang.nbt.CompoundTag;
-
+import net.minecraft.core.achievement.stat.Stat;
+import net.minecraft.core.achievement.stat.StatItem;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.data.tag.ITaggable;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.material.ArmorMaterial;
-import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.tag.ItemTags;
-import net.minecraft.core.item.tool.ItemToolAxe;
-import net.minecraft.core.item.tool.ItemToolHoe;
-import net.minecraft.core.item.tool.ItemToolPickaxe;
-import net.minecraft.core.item.tool.ItemToolShovel;
-import net.minecraft.core.item.tool.ItemToolSword;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.inventory.slot.Slot;
+import net.minecraft.core.util.HardIllegalArgumentException;
+import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, StatCollector, ItemSpade, EnumToolMaterial, 
-//            ItemPickaxe, ItemAxe, ItemFlintAndSteel, ItemFood, 
-//            ItemBow, ItemCoal, ItemSword, ItemSoup, 
-//            ItemHoe, ItemSeeds, Block, ItemArmor, 
-//            ItemPainting, ItemSign, ItemDoor, Material, 
-//            ItemBucket, ItemMinecart, ItemSaddle, ItemRedstone, 
-//            ItemSnowball, ItemBoat, ItemReed, ItemEgg, 
-//            ItemFishingRod, ItemDye, ItemBed, ItemCookie, 
-//            ItemMap, ItemShears, ItemRecord, StatList, 
-//            EntityPlayer, World, EntityLiving, Entity
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.Supplier;
 
 @SuppressWarnings("unchecked")
-public class Item
-    implements ITaggable<Item>, IItemConvertible
+public class Item implements ITaggable<Item>, IItemConvertible
 {
+    protected static final Random itemRand = new Random();
+    public static final Map<String, Integer> nameToIdMap = new HashMap<>();
+
+    public static final @Nullable Item @NotNull [] itemsList = new Item[32768];
+    public static final Map<NamespaceID, Item> itemsMap = new LinkedHashMap<>();
+    public static int highestItemId = 0;
+    public final int id;
+    public final NamespaceID namespaceID;
+    protected int maxStackSize;
+    private int maxDamage;
+    protected boolean hasSubtypes;
+    private Item containerItem;
+    private @Nullable Supplier<@NotNull IItemConvertible> statParent = null;
+    private String key;
 
-    public Item(int id)
+    protected static final Map<String, List<Stat>> statsInCategory = new HashMap<>();
+    protected final Map<String, Stat> stats = new HashMap<>();
+
+    // Made this take an actual NamespaceID in the constructor to actually throw errors for modders when they update their mods, otherwise would be mistaken for the old lang key + item id constructor
+
+    public Item(NamespaceID namespaceId, int id)
     {
         maxStackSize = 64;
         maxDamage = 0;
         hasSubtypes = false;
         containerItem = null;
         this.id = id;
-        if (itemsList[this.id] != null)
-        {
-            System.out.println("CONFLICT @ " + this.id);
+        this.namespaceID = namespaceId;
+        if (itemsList[id] != null) {
+            throw new IllegalArgumentException("Item slot '" + id + "' is already occupied by '" + itemsList[id] + "' when adding " + this);
+        }
+        if (itemsMap.containsKey(this.namespaceID)){
+            throw new IllegalArgumentException("Item id '" + namespaceID + "' is already used by '" + itemsMap.get(this.namespaceID) + "' when adding " + this);
         }
+
         itemsList[this.id] = this;
+        itemsMap.put(this.namespaceID, this);
+
         if (this.id > highestItemId)
             highestItemId = this.id;
     }
-
-    public Item(String name, int id)
+    public Item(String translationKey, String namespaceId, int id)
     {
-        this(id);
-        setKey(name);
+        this(makeNamespaceID(namespaceId), id);
+        setKey(translationKey);
+    }
+
+    private static NamespaceID makeNamespaceID(String string){ // This exists because java is idiotic
+        try {
+            return new NamespaceID(string);
+        } catch (HardIllegalArgumentException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+    public Stat createStat(String statID, String nameKey){
+        if (getStat(statID) != null) return getStat(statID);
+
+        Stat stat;
+        if (StatList.replacementMap.containsKey(id)){
+            Item replaceItem = Item.getItem(StatList.replacementMap.get(id));
+            stat = replaceItem.getStat(statID);
+            if (stat == null){
+                stat = replaceItem.createStat(statID, nameKey);
+            }
+        } else {
+            stat = new StatItem(new NamespaceID(namespaceID.namespace, namespaceID.value + "_" + statID), nameKey, id).registerStat();
+        }
+
+        putStat(statID, stat);
+        return stat;
+    }
+
+    public void putStat(String statID, Stat stat){
+        stats.put(statID, stat);
+        statsInCategory.putIfAbsent(statID, new ArrayList<>());
+        if (!statsInCategory.get(statID).contains(stat)){
+            statsInCategory.get(statID).add(stat);
+        }
+    }
+
+    @Nullable
+    public Stat getStat(String statID){
+        return stats.get(statID);
+    }
+
+    public Item setStatParent(@NotNull Supplier<@NotNull IItemConvertible> icon){
+        this.statParent = icon;
+        return this;
+    }
+
+    @Nullable
+    public Item getStatParent(){
+        if (statParent != null){
+            return statParent.get().asItem();
+        }
+        return null;
+    }
+
+    @Nullable
+    public static List<Stat> getStats(String statID){
+        return statsInCategory.get(statID);
     }
 
     public Item withTags(Tag<Item>... tags)
@@ -86,7 +155,7 @@ public class Item
         return this;
     }
 
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         return false;
     }
@@ -96,7 +165,7 @@ public class Item
         return 1.0F;
     }
 
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         return itemstack;
     }
@@ -138,20 +207,20 @@ public class Item
         return maxDamage > 0 && !hasSubtypes;
     }
 
-    public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
+    public boolean hitEntity(ItemStack itemstack, Mob entityliving, Mob entityliving1)
     {
         return false;
     }
-    
+
     /**
-     * Called before a block is destroyed with this item. If the return value is false, the block won't be destroyed 
+     * Called before a block is destroyed with this item. If the return value is false, the block won't be destroyed
      */
-    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, Player player)
     {
     	return true;
     }
-    
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int removedBlockId, int x, int y, int z, Side side, EntityLiving entityliving)
+
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int removedBlockId, int x, int y, int z, Side side, Mob entityliving)
     {
         return false;
     }
@@ -161,12 +230,12 @@ public class Item
         return 1;
     }
 
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return false;
     }
 
-    public boolean useItemOnEntity(ItemStack itemstack, EntityLiving entityliving, EntityPlayer entityPlayer)
+    public boolean useItemOnEntity(ItemStack itemstack, Mob entityliving, Player entityPlayer)
     {
         return false;
     }
@@ -187,10 +256,10 @@ public class Item
     {
         return key;
     }
-
     public String getTranslatedName(ItemStack itemstack) {
         return I18n.getInstance().translateKey(itemstack.getItemKey() + ".name");
     }
+
     public String getTranslatedDescription(ItemStack itemstack) {
         return I18n.getInstance().translateKey(itemstack.getItemKey() + ".desc");
     }
@@ -230,28 +299,23 @@ public class Item
     {
     }
 
-    public void onCraftedBy(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public void onCraftedBy(ItemStack itemstack, World world, Player entityplayer)
     {
     }
 
-    public boolean isComplex()
-    {
-        return false;
-    }
-    
     public boolean isSilkTouch()
     {
         return this.hasTag(ItemTags.IS_SILK_TOUCH);
     }
-    
+
     public boolean hasInventoryInteraction() {
     	return false;
     }
-    
-    public ItemStack onInventoryInteract(EntityPlayer player, Slot slot, ItemStack stackInSlot, boolean isItemGrabbed) {
+
+    public ItemStack onInventoryInteract(Player player, Slot slot, ItemStack stackInSlot, boolean isItemGrabbed) {
     	return stackInSlot;
     }
-    
+
     public boolean showFullDurability() {
     	return false;
     }
@@ -270,201 +334,15 @@ public class Item
     public ItemStack getDefaultStack() {
         return new ItemStack(this);
     }
-    
-    protected static Random itemRand = new Random();
-    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, 8, false, 8));
-    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.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.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.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, 16));
-    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));
-    public static Item string = (new Item("string", 16415));
-    public static Item featherChicken = (new Item("feather.chicken", 16416));
-    public static Item sulphur = (new Item("sulphur", 16417));
-    public static Item toolHoeWood = (new ItemToolHoe("tool.hoe.wood", 16418, ToolMaterial.wood));
-    public static Item toolHoeStone = (new ItemToolHoe("tool.hoe.stone", 16419, ToolMaterial.stone));
-    public static Item toolHoeIron = (new ItemToolHoe("tool.hoe.iron", 16420, ToolMaterial.iron));
-    public static Item toolHoeDiamond = (new ItemToolHoe("tool.hoe.diamond", 16421, ToolMaterial.diamond));
-    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, 12, false, 8));
-
-    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));
-    public static Item armorLeggingsLeather = (new ItemArmor("armor.leggings.leather", 16428, ArmorMaterial.LEATHER, 2));
-    public static Item armorBootsLeather = (new ItemArmor("armor.boots.leather", 16429, ArmorMaterial.LEATHER, 3));
-
-    public static Item armorHelmetChainmail = (new ItemArmor("armor.helmet.chainmail", 16430, ArmorMaterial.CHAINMAIL, 0));
-    public static Item armorChestplateChainmail = (new ItemArmor("armor.chestplate.chainmail", 16431, ArmorMaterial.CHAINMAIL, 1));
-    public static Item armorLeggingsChainmail = (new ItemArmor("armor.leggings.chainmail", 16432, ArmorMaterial.CHAINMAIL, 2));
-    public static Item armorBootsChainmail = (new ItemArmor("armor.boots.chainmail", 16433, ArmorMaterial.CHAINMAIL, 3));
-
-    public static Item armorHelmetIron = (new ItemArmor("armor.helmet.iron", 16434, ArmorMaterial.IRON, 0));
-    public static Item armorChestplateIron = (new ItemArmor("armor.chestplate.iron", 16435, ArmorMaterial.IRON, 1));
-    public static Item armorLeggingsIron = (new ItemArmor("armor.leggings.iron", 16436, ArmorMaterial.IRON, 2));
-    public static Item armorBootsIron = (new ItemArmor("armor.boots.iron", 16437, ArmorMaterial.IRON, 3));
-
-    public static Item armorHelmetDiamond = (new ItemArmor("armor.helmet.diamond", 16438, ArmorMaterial.DIAMOND, 0));
-    public static Item armorChestplateDiamond = (new ItemArmor("armor.chestplate.diamond", 16439, ArmorMaterial.DIAMOND, 1));
-    public static Item armorLeggingsDiamond = (new ItemArmor("armor.leggings.diamond", 16440, ArmorMaterial.DIAMOND, 2));
-    public static Item armorBootsDiamond = (new ItemArmor("armor.boots.diamond", 16441, ArmorMaterial.DIAMOND, 3));
-
-    public static Item armorHelmetGold = (new ItemArmor("armor.helmet.gold", 16442, ArmorMaterial.GOLD, 0));
-    public static Item armorChestplateGold = (new ItemArmor("armor.chestplate.gold", 16443, ArmorMaterial.GOLD, 1));
-    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, 16, true, 4));
-    public static Item foodPorkchopCooked = (new ItemFood("food.porkchop.cooked", 16448, 8, 16, true, 4));
-    public static Item painting = (new ItemPainting("painting", 16449));
-    public static Item foodAppleGold = (new ItemFood("food.apple.gold", 16450, 42, 0, false, 1));
-    public static Item sign = (new ItemSign("sign", 16451));
-    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, 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));
-    public static Item leather = (new Item("leather", 16462));
-    public static Item bucketMilk = (new ItemBucket("bucket.milk", 16463, null)).setContainerItem(bucket);
-    public static Item brickClay = (new Item("brick.clay", 16464));
-    public static Item clay = (new Item("clay", 16465));
-    public static Item sugarcane = (new ItemPlaceable("sugarcane", 16466, Block.sugarcane));
-    public static Item paper = (new Item("paper", 16467));
-    public static Item book = (new Item("book", 16468));
-    public static Item slimeball = (new Item("slimeball", 16469));
-    public static Item minecartChest = (new ItemMinecart("minecart.chest", 16470, 1));
-    public static Item minecartFurnace = (new ItemMinecart("minecart.furnace", 16471, 2));
-    public static Item eggChicken = (new ItemEgg("egg.chicken", 16472));
-    public static Item toolCompass = (new Item("tool.compass", 16473));
-    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 ItemFood("food.fish.raw", 16477, 2, 12, false, 8));
-    public static Item foodFishCooked = (new ItemFood("food.fish.cooked", 16478, 5, 12, false, 8));
-    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 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", "C418"));
-    public static Item recordCat = (new ItemRecord("record.cat", 18385, "cat", "C418"));
-    public static Item recordBlocks = (new ItemRecord("record.blocks", 18386, "blocks", "C418"));
-    public static Item recordChirp = (new ItemRecord("record.chirp", 18387, "chirp", "C418"));
-    public static Item recordFar = (new ItemRecord("record.far", 18388, "far", "C418"));
-    public static Item recordMall = (new ItemRecord("record.mall", 18389, "mall", "C418"));
-    public static Item recordMellohi = (new ItemRecord("record.mellohi", 18390, "mellohi", "C418"));
-    public static Item recordStal = (new ItemRecord("record.stal", 18391, "stal", "C418"));
-    public static Item recordStrad = (new ItemRecord("record.strad", 18392, "strad", "C418"));
-    public static Item recordWard = (new ItemRecord("record.ward", 18393, "ward", "C418"));
-    public static Item recordWait = (new ItemRecord("record.wait", 18394, "wait", "C418"));
-    public static Item recordDog = (new ItemRecord("record.dog", 18395, "dog", "C418"));
-    public static Item nethercoal = (new Item("nethercoal", 16488));
-    public static Item armorHelmetSteel = (new ItemArmor("armor.helmet.steel", 16489, ArmorMaterial.STEEL, 0));
-    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.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));
-    public static Item toolHoeSteel = (new ItemToolHoe("tool.hoe.steel", 16497, ToolMaterial.steel));
-    
-    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)).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)).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));
-    public static Item oreRawGold = (new Item("ore.raw.gold", 16510));
-    public static Item oreRawIron = (new Item("ore.raw.iron", 16511));
-    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 foodCherry = (new ItemFood("food.cherry", 16515, 2, 2, false, 8));
-    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));
-    public static Item lanternFireflyBlue = (new ItemPlaceable("lantern.firefly.blue", 16521, Block.lanternFireflyBlue));
-    public static Item lanternFireflyOrange = (new ItemPlaceable("lantern.firefly.orange", 16522, Block.lanternFireflyOrange));
-    public static Item lanternFireflyRed = (new ItemPlaceable("lantern.firefly.red", 16523, Block.lanternFireflyRed));
-//    public static Item candleSoulwax = new ItemPlaceable("candle.soulwax", 16524, Block.candleSoulwax).setIconCoord(5, 10);
-    public static Item basket = new ItemPlaceable("basket", 16525, Block.basket);
-    public static Item flag = new ItemFlag("flag", 16526);
-    public static Item armorBootsIceskates = new Item("armor.boots.iceskates", 16527).setMaxStackSize(1);
-    public static ItemToolShears toolShearsSteel = (ItemToolShears)(new ItemToolShears("tool.shears.steel", 16528, ToolMaterial.steel)).setMaxDamage(ToolMaterial.steel.getDurability());
-    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 ItemRope("rope", 16534, Block.rope);
-    public static Item foodPumpkinPie = (new ItemPlaceable("food.pumpkin_pie", 16535, Block.pumpkinPie)).setMaxStackSize(1);
-    public static Item wandMonsterSpawner = (new ItemWandSpawner("wand.monster", 16536)).setMaxStackSize(1);
-
-    public static int highestItemId = 0;
-    public int id;
-    protected int maxStackSize;
-    private int maxDamage;
-    protected boolean hasSubtypes;
-    private Item containerItem;
-    private String key;
-    
-    public static void initializeItems(){
-        StatList.onItemInit();
-    }
-    
     public static boolean hasTag(ItemStack itemStack, Tag<Item> tag) {
     	if(itemStack == null) {
     		return false;
     	}
     	return tag.appliesTo(itemsList[itemStack.itemID]);
     }
+    @Nullable
+    public static Item getItem(int id) {
+        return itemsList[Math.max(id, 0)];
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemArmor.java b/src/main/java/net/minecraft/core/item/ItemArmor.java
deleted file mode 100644
index 05425d3ac..000000000
--- a/src/main/java/net/minecraft/core/item/ItemArmor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package net.minecraft.core.item;
-
-import net.minecraft.core.item.material.ArmorMaterial;
-
-public class ItemArmor extends Item {
-	
-	public static final int[] armorPieceProtectionValues = new int[] {3, 8, 6, 3};
-	
-	private static final float[] armorPieceDurabilityModifiers = new float[] {0.91f, 1.0f, 0.97f, 0.94f};
-	
-	public final ArmorMaterial material;
-	public final int armorPiece;
-
-	public ItemArmor(String name, int id, ArmorMaterial material, int armorPiece) {
-		super(name, id);
-		this.material = material;
-		this.armorPiece = armorPiece;
-		
-		setMaxDamage((int)(armorPieceDurabilityModifiers[armorPiece] * material.durability));
-		
-		maxStackSize = 1;
-	}
-	
-	public int armorPieceProtection() {
-		return armorPieceProtectionValues[armorPiece];
-	}
-	
-	public float getArmorPieceProtectionPercentage() {
-		return armorPieceProtection() / 20.0f;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemComplex.java b/src/main/java/net/minecraft/core/item/ItemComplex.java
deleted file mode 100644
index 4a2fa6ccc..000000000
--- a/src/main/java/net/minecraft/core/item/ItemComplex.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.minecraft.core.item;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.world.World;
-
-public class ItemComplex extends Item
-{
-
-    protected ItemComplex(String name, int id)
-    {
-        super(name, id);
-    }
-    
-    @Override
-    public boolean isComplex()
-    {
-        return true;
-    }
-
-    public Packet sendPacketData(ItemStack itemstack, World world, EntityPlayer entityplayer)
-    {
-        return null;
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java b/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java
deleted file mode 100644
index 7dc08561d..000000000
--- a/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.minecraft.core.item;
-
-// Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, InventoryPlayer, World,
-//            EntityArrow, ItemStack
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.world.World;
-
-public class ItemHandCannonUnloaded extends Item
-{
-
-    public ItemHandCannonUnloaded(String name, int id)
-    {
-        super(name, id);
-        setMaxDamage(100);
-        maxStackSize = 1;
-    }
-
-    @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
-    {
-        if (entityplayer.inventory.consumeInventoryItem(Item.ammoChargeExplosive.id))
-        {
-            world.playSoundAtEntity(entityplayer, entityplayer, "random.click", 1.0F, 1.9F / (itemRand.nextFloat() * 0.2F + 0.4F));
-            return new ItemStack(Item.handcannonLoaded, 1, itemstack.getMetadata(), itemstack.getData());
-        }
-        return itemstack;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemMap.java b/src/main/java/net/minecraft/core/item/ItemMap.java
deleted file mode 100644
index b40c8de75..000000000
--- a/src/main/java/net/minecraft/core/item/ItemMap.java
+++ /dev/null
@@ -1,293 +0,0 @@
-package net.minecraft.core.item;
-
-import net.minecraft.core.block.Block;
-
-// Referenced classes of package net.minecraft.src:
-//            ItemMapBase, MapData, World, ItemStack, 
-//            WorldInfo, WorldProvider, Entity, MathHelper, 
-//            Block, Chunk, Material, MapColor, 
-//            EntityPlayer
-
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet131MapData;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.chunk.Chunk;
-import net.minecraft.core.block.material.MaterialColor;
-import net.minecraft.core.world.saveddata.maps.ItemMapSavedData;
-
-public class ItemMap extends ItemComplex
-{
-
-    protected ItemMap(String name, int id)
-    {
-        super(name, id);
-    }
-
-    public static ItemMapSavedData getOrCreateSavedData(short word0, World world)
-    {
-        String s = "map_" + word0;
-        ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, "map_" + word0);
-        if(mapData == null)
-        {
-            int mapId = world.getUniqueDataId("map");
-            String stringId = "map_" + mapId;
-            mapData = new ItemMapSavedData(stringId);
-            world.setSavedData(stringId, mapData);
-        }
-        return mapData;
-    }
-
-    public ItemMapSavedData getOrCreateSavedData(ItemStack stack, World world)
-    {
-        String s = "map_" + stack.getMetadata();
-        ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, "map_" + stack.getMetadata());
-        if(mapData == null)
-        {
-            stack.setMetadata(world.getUniqueDataId("map"));
-            String s1 = "map_" + stack.getMetadata();
-            mapData = new ItemMapSavedData(s1);
-            mapData.x = world.getLevelData().getSpawnX();
-            mapData.z = world.getLevelData().getSpawnZ();
-            mapData.scale = 3;
-            mapData.dimension = (byte)world.dimension.id;
-            mapData.setDirty();
-            world.setSavedData(s1, mapData);
-        }
-        return mapData;
-    }
-
-	@Override
-	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
-		if (world.getBlockId(blockX, blockY, blockZ) == Block.flag.id) {
-			ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, "map_" + itemstack.getMetadata());
-			TileEntityFlag flag = (TileEntityFlag) world.getBlockTileEntity(blockX, blockY, blockZ);
-			boolean canCreateMap = mapData.createNewWaypoint(flag);
-			if(!canCreateMap)
-				entityplayer.sendTranslatedChatMessage("flag.full");
-			return canCreateMap;
-		}
-		return false;
-	}
-
-	public void update(World world, Entity entity, ItemMapSavedData data) {
-		if(world.dimension.id != data.dimension) {
-			return;
-		}
-		
-		final int mapWidth = 128;
-		final int mapHeight = 128;
-		final int blocksPerPixel = 1 << data.scale;
-		final int mapCenterX = data.x;
-		final int mapCenterZ = data.z;
-
-		int entityOnMapX = MathHelper.floor_double(entity.x - (double) mapCenterX) / blocksPerPixel + mapWidth / 2;
-		int entityOnMapZ = MathHelper.floor_double(entity.z - (double) mapCenterZ) / blocksPerPixel + mapHeight / 2;
-
-		int discoverRadius = 128 / blocksPerPixel;
-		if(world.worldType.hasCeiling()) {
-			discoverRadius /= 2;
-		}
-		
-		data.step++;
-		
-		for (int x = (entityOnMapX - discoverRadius) + 1; x < entityOnMapX + discoverRadius; x++) {
-			if((x & 0xf) != (data.step & 0xf)) {
-				continue;
-			}
-			int minZ = 255;
-			int maxZ = 0;
-			double previousPixelHeight = 0.0;
-			
-			// Pixel brightness changes depending on the height of the above pixel
-			// Make sure we know the height of the above pixel when drawing this one,
-			// Otherwise there will be lines on borders from loaded to unloaded chunks
-			boolean previousChunkLoaded = false;
-			
-			for (int z = entityOnMapZ - discoverRadius - 1; z < entityOnMapZ + discoverRadius; z++) {
-				if(x < 0 || z < -1 || x >= mapWidth || z >= mapHeight) {
-					continue;
-				}
-				int distX = x - entityOnMapX;
-				int distZ = z - entityOnMapZ;
-				boolean flag = distX * distX + distZ * distZ > (discoverRadius - 2) * (discoverRadius - 2);
-				
-				int blockX = ((mapCenterX / blocksPerPixel + x) - mapWidth / 2) * blocksPerPixel;
-				int blockZ = ((mapCenterZ / blocksPerPixel + z) - mapHeight / 2) * blocksPerPixel;
-				
-				// Make sure to only draw loaded chunks, otherwise the map disappears around the player when the server view distance is low
-				if(!world.isBlockLoaded(blockX, world.getHeightBlocks() / 2, blockZ)) {
-					previousChunkLoaded = false;
-					continue;
-				}
-				
-				int[] blockCounts = new int[Block.blocksList.length];
-				Chunk chunk = world.getChunkFromBlockCoords(blockX, blockZ);
-				
-				
-				int blockInChunkX = blockX & 0xf;
-				int blockInChunkZ = blockZ & 0xf;
-				
-				int waterDepth = 0;
-				double pixelHeight = 0.0D;
-				
-				if(world.worldType.hasCeiling()) {
-					//Determine Color (Nether)
-					int rand = blockX + blockZ * 0x389bf;
-					rand = rand * rand * 0x1dd6751 + rand * 11;
-					if((rand >> 20 & 1) == 0) {
-						blockCounts[Block.dirt.id] += 10;
-					} else {
-						blockCounts[Block.stone.id] += 10;
-					}
-					pixelHeight = 100D;
-				} else {
-					//Determine Color (Not Nether)
-					for (int i = 0; i < blocksPerPixel; i++) {
-						for (int j = 0; j < blocksPerPixel; j++) {
-							int height = chunk.getHeightValue(i + blockInChunkX, j + blockInChunkZ) + 1;
-							int id = 0;
-							if(height > 1) {
-								boolean flag1 = false;
-								do {
-									flag1 = true;
-									id = chunk.getBlockID(i + blockInChunkX, height - 1, j + blockInChunkZ);
-									if(id == 0) {
-										flag1 = false;
-									} else if(height > 0 && id > 0 && Block.blocksList[id].blockMaterial.color == MaterialColor.none) {
-										flag1 = false;
-									}
-									if(!flag1) {
-										height--;
-										id = chunk.getBlockID(i + blockInChunkX, height - 1, j + blockInChunkZ);
-									}
-								} while (!flag1);
-								if(id != 0 && Block.blocksList[id].blockMaterial.isLiquid()) {
-									int i7 = height - 1;
-									int k7 = 0;
-									do {
-										k7 = chunk.getBlockID(i + blockInChunkX, i7--, j + blockInChunkZ);
-										waterDepth++;
-									} while (i7 > 0 && k7 != 0 && Block.blocksList[k7].blockMaterial.isLiquid());
-								}
-							}
-							pixelHeight += (double) height / (double) (blocksPerPixel * blocksPerPixel);
-							blockCounts[id]++;
-						}
-
-					}
-
-				}
-				waterDepth /= blocksPerPixel * blocksPerPixel;
-				
-				int max = 0;
-				int id = 0;
-				for (int i = 0; i < Block.blocksList.length; i++) {
-					if(blockCounts[i] > max) {
-						id = i;
-						max = blockCounts[i];
-					}
-				}
-
-				double heightDifference = ((pixelHeight - previousPixelHeight) * 4D) / (double) (blocksPerPixel + 4) + ((double) (x + z & 1) - 0.5D) * 0.4D;
-				byte brightness = 1;
-				if(heightDifference > 0.6D) brightness = 2;
-				if(heightDifference < -0.6D) brightness = 0;
-				
-				int colorIndex = 0;
-				if(id > 0) {
-					MaterialColor mapcolor = Block.blocksList[id].blockMaterial.color;
-					if(mapcolor == MaterialColor.water) {
-						double d3 = (double) waterDepth * 0.1D + (double) (x + z & 1) * 0.2D;
-						brightness = 1;
-						if(d3 < 0.5D) {
-							brightness = 2;
-						}
-						if(d3 > 0.9D) {
-							brightness = 0;
-						}
-					}
-					colorIndex = mapcolor.id;
-				}
-				previousPixelHeight = pixelHeight;
-				if(!previousChunkLoaded) {
-					previousChunkLoaded = true;
-					continue;
-				}
-				if(z < 0 || distX * distX + distZ * distZ >= discoverRadius * discoverRadius || flag && (x + z & 1) == 0) {
-					continue;
-				}
-				byte currentColor = data.colors[x + z * mapWidth];
-				byte finalColor = (byte) (colorIndex * 4 + brightness);
-				if(currentColor == finalColor) {
-					continue;
-				}
-				
-				if(minZ > z) minZ = z;
-				if(maxZ < z) maxZ = z;
-				data.colors[x + z * mapWidth] = finalColor;
-			}
-
-			if(minZ <= maxZ) {
-				data.setDirty(x, minZ, maxZ);
-			}
-		}
-
-	}
-
-    @Override
-    public void inventoryTick(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        ItemMapSavedData mapData = getOrCreateSavedData(itemstack, world);
-        if(entity instanceof EntityPlayer)
-        {
-            EntityPlayer entityplayer = (EntityPlayer)entity;
-            mapData.tickCarriedBy(entityplayer, itemstack);
-        }
-        if(flag)
-        {
-            update(world, entity, mapData);
-        }
-    }
-
-    @Override
-    public void onCraftedBy(ItemStack itemstack, World world, EntityPlayer entityplayer)
-    {
-        itemstack.setMetadata(world.getUniqueDataId("map"));
-        String s = "map_" + itemstack.getMetadata();
-        ItemMapSavedData mapdata = new ItemMapSavedData(s);
-        world.setSavedData(s, mapdata);
-        mapdata.x = MathHelper.floor_double(entityplayer.x);
-        mapdata.z = MathHelper.floor_double(entityplayer.z);
-        mapdata.scale = 3;
-        mapdata.dimension = (byte)world.dimension.id;
-        mapdata.setDirty();
-    }
-
-    @Override
-	public Packet sendPacketData(ItemStack itemstack, World world, EntityPlayer entityplayer)
-    {
-		ItemMapSavedData itemMapSavedData = getOrCreateSavedData(itemstack, world);
-        byte[] mapDataBytes = itemMapSavedData.getMapDataBytes(itemstack, world, entityplayer);
-        if(mapDataBytes == null)
-        {
-            return null;
-        } else
-        {
-            return new Packet131MapData((short)Item.map.id, (short)itemstack.getMetadata(), mapDataBytes, itemMapSavedData.mapWaypoints);
-        }
-    }
-    
-    @Override
-    public String getTranslatedName(ItemStack itemstack) {
-    	return super.getTranslatedName(itemstack) + " #" + itemstack.getMetadata();
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemMinecart.java b/src/main/java/net/minecraft/core/item/ItemMinecart.java
deleted file mode 100644
index 88c497351..000000000
--- a/src/main/java/net/minecraft/core/item/ItemMinecart.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.minecraft.core.item;
-
-
-import net.minecraft.core.block.BlockRail;
-import net.minecraft.core.entity.player.EntityPlayer;
-
-// Referenced classes of package net.minecraft.src:
-//            Item, World, BlockRail, EntityMinecart, 
-//            ItemStack, EntityPlayer
-
-import net.minecraft.core.entity.vehicle.EntityMinecart;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.world.World;
-
-public class ItemMinecart extends Item
-{
-
-    public ItemMinecart(String name, int id, int j)
-    {
-        super(name, id);
-        maxStackSize = 1;
-        minecartType = j;
-    }
-
-    @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
-    {
-        int i1 = world.getBlockId(blockX, blockY, blockZ);
-        if(BlockRail.isRailBlock(i1))
-        {
-            if(!world.isClientSide)
-            {
-                world.entityJoinedWorld(new EntityMinecart(world, (float) blockX + 0.5F, (float) blockY + 0.5F, (float) blockZ + 0.5F, minecartType));
-            }
-            if (entityplayer.getGamemode().consumeBlocks())
-            {
-            	itemstack.stackSize--;        	
-            }
-            return true;
-        } else
-        {
-            return false;
-        }
-    }
-
-    public int minecartType;
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemQuiverEndless.java b/src/main/java/net/minecraft/core/item/ItemQuiverEndless.java
deleted file mode 100644
index 6517fd967..000000000
--- a/src/main/java/net/minecraft/core/item/ItemQuiverEndless.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.minecraft.core.item;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item, Block, BlockLeaves, ItemStack,
-//            EntityLiving
-
-public class ItemQuiverEndless extends Item
-{
-
-    public ItemQuiverEndless(String name, int id)
-    {
-        super(name, id);
-        setMaxStackSize(1);
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemRecord.java b/src/main/java/net/minecraft/core/item/ItemRecord.java
deleted file mode 100644
index 1ed624050..000000000
--- a/src/main/java/net/minecraft/core/item/ItemRecord.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package net.minecraft.core.item;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item, World, Block, BlockJukeBox, 
-//            ItemStack, EntityPlayer
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockJukeBox;
-import net.minecraft.core.world.World;
-
-public class ItemRecord extends Item
-{
-    public final String recordName;
-    public final String recordAuthor;
-
-
-    public ItemRecord(String name, int id, String recordName, String recordAuthor)
-    {
-        super(name, id);
-        this.recordName = recordName;
-        this.recordAuthor = recordAuthor;
-        maxStackSize = 1;
-    }
-
-    @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
-    {
-        if(world.getBlockId(blockX, blockY, blockZ) == Block.jukebox.id && world.getBlockMetadata(blockX, blockY, blockZ) == 0)
-        {
-            if (!world.isClientSide) {
-                ((BlockJukeBox) Block.jukebox).playRecord(world, blockX, blockY, blockZ, id);
-                world.playSoundEffect(null, 1005, blockX, blockY, blockZ, id);
-                itemstack.consumeItem(entityplayer);
-            }
-            return true;
-        } else
-        {
-            return false;
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemSaddle.java b/src/main/java/net/minecraft/core/item/ItemSaddle.java
deleted file mode 100644
index 357c90a22..000000000
--- a/src/main/java/net/minecraft/core/item/ItemSaddle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.minecraft.core.item;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item, EntityPig, ItemStack, EntityLiving
-
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityPig;
-import net.minecraft.core.entity.player.EntityPlayer;
-
-public class ItemSaddle extends Item
-{
-
-    public ItemSaddle(String name, int id)
-    {
-        super(name, id);
-        maxStackSize = 1;
-    }
-
-    @Override
-    public boolean useItemOnEntity(ItemStack itemstack, EntityLiving entityliving, EntityPlayer entityPlayer)
-    {
-        if(entityliving instanceof EntityPig && itemstack.consumeItem(entityPlayer))
-        {
-            EntityPig entitypig = (EntityPig)entityliving;
-            if(!entitypig.getSaddled())
-            {
-                entitypig.setSaddled(true);
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemSoup.java b/src/main/java/net/minecraft/core/item/ItemSoup.java
deleted file mode 100644
index 71c70cee6..000000000
--- a/src/main/java/net/minecraft/core/item/ItemSoup.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.minecraft.core.item;
-
-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 healAmount, int ticksPerHeal)
-    {
-        super(name, id, healAmount, ticksPerHeal, false, 1);
-    }
-
-    @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
-    {
-        ItemStack stack = super.onUseItem(itemstack, world, entityplayer);
-        return stack.stackSize <= 0 ? Item.bowl.getDefaultStack() : stack;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/ItemStack.java b/src/main/java/net/minecraft/core/item/ItemStack.java
index 3a2701f5d..291847976 100644
--- a/src/main/java/net/minecraft/core/item/ItemStack.java
+++ b/src/main/java/net/minecraft/core/item/ItemStack.java
@@ -4,25 +4,27 @@ import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.Global;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.TextFormatting;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.save.conversion.ChunkConverter;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-public final class ItemStack
-{
+
+public final class ItemStack {
     public static ItemStack NO_ITEM = new ItemStack();
 
     public int stackSize;
     public int animationsToGo;
     public int itemID;
     private int metadata;
+
     @NotNull
     private CompoundTag tag;
 
@@ -120,12 +122,12 @@ public final class ItemStack
         return Item.itemsList[itemID];
     }
 
-    public boolean useItem(EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean useItem(Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         boolean flag = getItem().onUseItemOnBlock(this, entityplayer, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
         if(flag)
         {
-            entityplayer.addStat(StatList.usedItemStats[itemID], 1);
+            entityplayer.addStat(getItem().getStat(StatList.STAT_USED), 1);
         }
         return flag;
     }
@@ -135,7 +137,7 @@ public final class ItemStack
         return getItem().getStrVsBlock(this, block);
     }
 
-    public ItemStack useItemRightClick(World world, EntityPlayer entityplayer)
+    public ItemStack useItemRightClick(World world, Player entityplayer)
     {
         return getItem().onUseItem(this, world, entityplayer);
     }
@@ -189,7 +191,7 @@ public final class ItemStack
 			Thread.dumpStack();
 			tag.getValue().remove("overrideColor");
 		}
-		if(tag.getBoolean("overrideName") && (!tag.containsKey("name") || tag.getString("name").length() == 0)) {
+		if(tag.getBoolean("overrideName") && (!tag.containsKey("name") || tag.getString("name").isEmpty())) {
 			System.err.println("Item has override name tag but no custom name!");
 			Thread.dumpStack();
 			tag.getValue().remove("overrideName");
@@ -199,8 +201,8 @@ public final class ItemStack
 			itemID = 0;
 		}
 		
-		if(itemID == Block.chestLegacy.id) itemID = Block.chestPlanksOak.id;
-		if(itemID == Block.chestLegacyPainted.id) itemID = Block.chestPlanksOakPainted.id;
+		if(itemID == Blocks.CHEST_LEGACY.id) itemID = Blocks.CHEST_PLANKS_OAK.id;
+		if(itemID == Blocks.CHEST_LEGACY_PAINTED.id) itemID = Blocks.CHEST_PLANKS_OAK_PAINTED.id;
 	}
 
     public int getMaxStackSize()
@@ -208,7 +210,7 @@ public final class ItemStack
         return getItem().getItemStackLimit();
     }
 
-    public int getMaxStackSize(IInventory inv)
+    public int getMaxStackSize(Container inv)
     {
         return getMaxStackSize();
     }
@@ -256,8 +258,8 @@ public final class ItemStack
 
     public void damageItem(int i, Entity entity)
     {
-        if (entity instanceof EntityPlayer) {
-            if (!((EntityPlayer)entity).getGamemode().toolDurability()) return;
+        if (entity instanceof Player) {
+            if (!((Player)entity).getGamemode().toolDurability()) return;
         }
         if(!isItemStackDamageable())
         {
@@ -266,9 +268,9 @@ public final class ItemStack
         metadata += i;
         if(metadata > getMaxDamage())
         {
-            if(entity instanceof EntityPlayer)
+            if(entity instanceof Player)
             {
-                ((EntityPlayer)entity).addStat(StatList.breakItemStats[itemID], 1);
+                ((Player)entity).addStat(getItem().getStat(StatList.STAT_DEPLETED), 1);
             }
             stackSize--;
             if(stackSize < 0)
@@ -290,30 +292,30 @@ public final class ItemStack
         metadata -= i;
     }
 
-    public void hitEntity(EntityLiving entityliving, EntityPlayer entityplayer)
+    public void hitEntity(Mob entityliving, Player entityplayer)
     {
         boolean flag = Item.itemsList[itemID].hitEntity(this, entityliving, entityplayer);
         if(flag)
         {
-            entityplayer.addStat(StatList.usedItemStats[itemID], 1);
+            entityplayer.addStat(getItem().getStat(StatList.STAT_USED), 1);
         }
     }
     
-    public boolean beforeDestroyBlock(World world, int id, int x, int y, int z, Side side, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, int id, int x, int y, int z, Side side, Player player)
     {
     	return getItem().beforeDestroyBlock(world, this, id, x, y, z, side, player);
     }
 
-    public void onDestroyBlock(World world, int id, int x, int y, int z, Side side, EntityPlayer entityplayer)
+    public void onDestroyBlock(World world, int id, int x, int y, int z, Side side, Player entityplayer)
     {
         boolean flag = Item.itemsList[itemID].onBlockDestroyed(world, this, id, x, y, z, side, entityplayer);
         if(flag)
         {
-            entityplayer.addStat(StatList.usedItemStats[itemID], 1);
+            entityplayer.addStat(getItem().getStat(StatList.STAT_USED), 1);
         }
     }
 
-    public boolean consumeItem(EntityPlayer entityplayer){
+    public boolean consumeItem(Player entityplayer){
         if(stackSize <= 0)
             return false;
         if (entityplayer.getGamemode().consumeBlocks()) {
@@ -327,12 +329,12 @@ public final class ItemStack
         return Item.itemsList[itemID].getDamageVsEntity(entity);
     }
 
-    public boolean canHarvestBlock(EntityLiving entityLiving, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, Block block)
     {
         return Item.itemsList[itemID].canHarvestBlock(entityLiving, this, block);
     }
 
-    public boolean useItemOnEntity(EntityLiving entityliving, EntityPlayer entityPlayer)
+    public boolean useItemOnEntity(Mob entityliving, Player entityPlayer)
     {
         return Item.itemsList[itemID].useItemOnEntity(this, entityliving, entityPlayer);
     }
@@ -403,9 +405,9 @@ public final class ItemStack
         Item.itemsList[itemID].inventoryTick(this, world, entity, i, flag);
     }
 
-    public void onCrafting(World world, EntityPlayer entityplayer)
+    public void onCrafting(World world, Player entityplayer)
     {
-        entityplayer.addStat(StatList.craftedItemStats[itemID], stackSize);
+        entityplayer.addStat(getItem().getStat(StatList.STAT_CRAFTED), stackSize);
         Item.itemsList[itemID].onCraftedBy(this, world, entityplayer);
     }
 
@@ -443,11 +445,11 @@ public final class ItemStack
     }
 
     public boolean hasCustomName() {
-    	return tag.getBoolean("overrideName");
+        return tag.getBoolean("overrideName");
     }
     
     public boolean hasCustomColor() {
-    	return tag.getBoolean("overrideColor");
+        return tag.getBoolean("overrideColor");
     }
     
     public String getCustomName() {
@@ -477,13 +479,13 @@ public final class ItemStack
     	}
     	return 0;
     }
-    
+
     public void setCustomName(@Nullable String name) {
-    	if(name == null || name.length() == 0) {
+        if(name == null || name.isEmpty()) {
     		removeCustomName();
     		return;
     	}
-    	tag.putBoolean("overrideName", true);
+        tag.putBoolean("overrideName", true);
     	tag.putString("name", name);
     }
     
@@ -492,17 +494,17 @@ public final class ItemStack
     		removeCustomColor();
     		return;
     	}
-    	tag.putBoolean("overrideColor", true);
+        tag.putBoolean("overrideColor", true);
     	tag.putByte("color", color);
     }
     
     public void removeCustomName() {
-		tag.getValue().remove("overrideName");
+        tag.getValue().remove("overrideName");
 		tag.getValue().remove("name");
     }
     
     public void removeCustomColor() {
-		tag.getValue().remove("overrideColor");
+        tag.getValue().remove("overrideColor");
 		tag.getValue().remove("color");
     }
 
diff --git a/src/main/java/net/minecraft/core/item/Items.java b/src/main/java/net/minecraft/core/item/Items.java
new file mode 100644
index 000000000..33d079d8b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/Items.java
@@ -0,0 +1,395 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.achievement.stat.Stat;
+import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
+import net.minecraft.core.item.material.ArmorMaterial;
+import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.item.tag.ItemTags;
+import net.minecraft.core.item.tool.AxeToolItem;
+import net.minecraft.core.item.tool.HoeToolItem;
+import net.minecraft.core.item.tool.PickaxeToolItem;
+import net.minecraft.core.item.tool.ShovelToolItem;
+import net.minecraft.core.item.tool.SwordToolItem;
+
+public final class Items {
+    public static Item TOOL_SHOVEL_IRON;
+    public static Item TOOL_PICKAXE_IRON;
+    public static Item TOOL_AXE_IRON;
+    public static Item TOOL_FIRESTRIKER_IRON;
+    public static Item FOOD_APPLE;
+    public static Item TOOL_BOW;
+    public static Item AMMO_ARROW;
+    public static Item COAL;
+    public static Item DIAMOND;
+    public static Item INGOT_IRON;
+    public static Item INGOT_GOLD;
+    public static Item TOOL_SWORD_IRON;
+    public static Item TOOL_SWORD_WOOD;
+    public static Item TOOL_SHOVEL_WOOD;
+    public static Item TOOL_PICKAXE_WOOD;
+    public static Item TOOL_AXE_WOOD;
+    public static Item TOOL_SWORD_STONE;
+    public static Item TOOL_SHOVEL_STONE;
+    public static Item TOOL_PICKAXE_STONE;
+    public static Item TOOL_AXE_STONE;
+    public static Item TOOL_SWORD_DIAMOND;
+    public static Item TOOL_SHOVEL_DIAMOND;
+    public static Item TOOL_PICKAXE_DIAMOND;
+    public static Item TOOL_AXE_DIAMOND;
+    public static Item STICK;
+    public static Item BOWL;
+    public static Item FOOD_STEW_MUSHROOM;
+    public static Item TOOL_SWORD_GOLD;
+    public static Item TOOL_SHOVEL_GOLD;
+    public static Item TOOL_PICKAXE_GOLD;
+    public static Item TOOL_AXE_GOLD;
+    public static Item STRING;
+    public static Item FEATHER_CHICKEN;
+    public static Item SULPHUR;
+    public static Item TOOL_HOE_WOOD;
+    public static Item TOOL_HOE_STONE;
+    public static Item TOOL_HOE_IRON;
+    public static Item TOOL_HOE_DIAMOND;
+    public static Item TOOL_HOE_GOLD;
+    public static Item SEEDS_WHEAT;
+    public static Item WHEAT;
+    public static Item FOOD_BREAD;
+
+    public static Item ARMOR_HELMET_LEATHER;
+    public static Item ARMOR_CHESTPLATE_LEATHER;
+    public static Item ARMOR_LEGGINGS_LEATHER;
+    public static Item ARMOR_BOOTS_LEATHER;
+
+    public static Item ARMOR_HELMET_CHAINMAIL;
+    public static Item ARMOR_CHESTPLATE_CHAINMAIL;
+    public static Item ARMOR_LEGGINGS_CHAINMAIL;
+    public static Item ARMOR_BOOTS_CHAINMAIL;
+
+    public static Item ARMOR_HELMET_IRON;
+    public static Item ARMOR_CHESTPLATE_IRON;
+    public static Item ARMOR_LEGGINGS_IRON;
+    public static Item ARMOR_BOOTS_IRON;
+
+    public static Item ARMOR_HELMET_DIAMOND;
+    public static Item ARMOR_CHESTPLATE_DIAMOND;
+    public static Item ARMOR_LEGGINGS_DIAMOND;
+    public static Item ARMOR_BOOTS_DIAMOND;
+
+    public static Item ARMOR_HELMET_GOLD;
+    public static Item ARMOR_CHESTPLATE_GOLD;
+    public static Item ARMOR_LEGGINGS_GOLD;
+    public static Item ARMOR_BOOTS_GOLD;
+    public static Item FLINT;
+    public static Item FOOD_PORKCHOP_RAW;
+    public static Item FOOD_PORKCHOP_COOKED;
+    public static Item PAINTING;
+    public static Item FOOD_APPLE_GOLD;
+    public static Item SIGN;
+    public static Item DOOR_OAK;
+    public static Item BUCKET;
+    public static Item BUCKET_WATER;
+    public static Item BUCKET_LAVA;
+    public static Item MINECART;
+    public static Item SADDLE;
+    public static Item DOOR_IRON;
+    public static Item DUST_REDSTONE;
+    public static Item AMMO_SNOWBALL;
+    public static Item BOAT;
+    public static Item LEATHER;
+    public static Item BUCKET_MILK;
+    public static Item BRICK_CLAY;
+    public static Item CLAY;
+    public static Item SUGARCANE;
+    public static Item PAPER;
+    public static Item BOOK;
+    public static Item SLIMEBALL;
+    public static Item MINECART_CHEST;
+    public static Item MINECART_FURNACE;
+    public static Item EGG_CHICKEN;
+    public static Item TOOL_COMPASS;
+    public static Item TOOL_FISHINGROD;
+    public static Item TOOL_CLOCK;
+    public static Item DUST_GLOWSTONE;
+    public static Item FOOD_FISH_RAW;
+    public static Item FOOD_FISH_COOKED;
+    public static Item DYE;
+    public static Item BONE;
+    public static Item DUST_SUGAR;
+    public static Item FOOD_CAKE;
+    public static Item BED;
+    public static Item REPEATER;
+    public static Item FOOD_COOKIE;
+    public static MapItem MAP;
+    public static ToolShearsItem TOOL_SHEARS;
+    public static Item RECORD_13;
+    public static Item RECORD_CAT;
+    public static Item RECORD_BLOCKS;
+    public static Item RECORD_CHIRP;
+    public static Item RECORD_FAR;
+    public static Item RECORD_MALL;
+    public static Item RECORD_MELLOHI;
+    public static Item RECORD_STAL;
+    public static Item RECORD_STRAD;
+    public static Item RECORD_WARD;
+    public static Item RECORD_WAIT;
+    public static Item RECORD_DOG;
+    public static Item NETHERCOAL;
+    public static Item ARMOR_HELMET_STEEL;
+    public static Item ARMOR_CHESTPLATE_STEEL;
+    public static Item ARMOR_LEGGINGS_STEEL;
+    public static Item ARMOR_BOOTS_STEEL;
+
+    public static Item TOOL_SWORD_STEEL;
+    public static Item TOOL_SHOVEL_STEEL;
+    public static Item TOOL_PICKAXE_STEEL;
+    public static Item TOOL_AXE_STEEL;
+    public static Item TOOL_HOE_STEEL;
+
+    public static Item INGOT_STEEL;
+    public static Item INGOT_STEEL_CRUDE;
+    public static Item AMMO_FIREBALL;
+    public static Item ARMOR_QUIVER_GOLD;
+    public static Item HANDCANNON_UNLOADED;
+    public static Item CHAINLINK;
+    public static Item CLOTH;
+    public static Item AMMO_CHARGE_EXPLOSIVE;
+    public static Item HANDCANNON_LOADED;
+    public static Item AMMO_ARROW_GOLD;
+    public static Item ARMOR_QUIVER;
+    public static Item TOOL_CALENDAR;
+    public static Item ORE_RAW_GOLD;
+    public static Item ORE_RAW_IRON;
+    public static Item QUARTZ;
+    public static Item OLIVINE;
+    public static Item AMMO_PEBBLE;
+    public static Item FOOD_CHERRY;
+    public static Item BUCKET_ICECREAM;
+    public static Item AMMO_ARROW_PURPLE;
+    public static Item LABEL;
+    public static Item JAR;
+    public static Item LANTERN_FIREFLY_GREEN;
+    public static Item LANTERN_FIREFLY_BLUE;
+    public static Item LANTERN_FIREFLY_ORANGE;
+    public static Item LANTERN_FIREFLY_RED;
+    //    public static Item candleSoulwax;
+    public static Item BASKET;
+    public static Item FLAG;
+    public static Item ARMOR_BOOTS_ICESKATES;
+    public static ToolShearsItem TOOL_SHEARS_STEEL;
+    public static Item TOOL_FIRESTRIKER_STEEL;
+    public static Item SEEDS_PUMPKIN;
+    public static Item SEAT;
+    public static Item DOOR_OAK_PAINTED;
+    public static Item DOOR_GLASS;
+    public static Item ROPE;
+    public static Item FOOD_PUMPKIN_PIE;
+    public static Item WAND_MONSTER_SPAWNER;
+    public static void init(){
+        setupItems();
+        initStats();
+    }
+
+    private static void initStats(){
+        StatList.initReplaceMap();
+
+        for (int i = 0; i < Item.itemsList.length; i++) {
+            Item item = Item.getItem(i);
+            if (item == null) continue;
+            if (i < Block.blocksList.length && !Block.getBlock(i).getEnableStats()){
+                continue;
+            }
+
+            item.createStat(StatList.STAT_PICKED_UP, "");
+            Stat used = item.createStat(StatList.STAT_USED, "stat.useItem");
+            if (i >= Block.blocksList.length){
+                StatList.usedItemStats.add(used);
+            }
+
+            if (item.isDamagable()){
+                item.createStat(StatList.STAT_DEPLETED, "stat.breakItem");
+            }
+
+            if (i < Block.blocksList.length){
+                item.createStat(StatList.STAT_MINED, "stat.mineBlock");
+            }
+        }
+    }
+
+    private static void setupItems(){
+        TOOL_SHOVEL_IRON = (new ShovelToolItem("tool.shovel.iron", "minecraft:item/tool_shovel_iron", 16384, ToolMaterial.iron));
+        TOOL_PICKAXE_IRON = (new PickaxeToolItem("tool.pickaxe.iron", "minecraft:item/tool_pickaxe_iron", 16385, ToolMaterial.iron));
+        TOOL_AXE_IRON = (new AxeToolItem("tool.axe.iron", "minecraft:item/tool_axe_iron", 16386, ToolMaterial.iron));
+        TOOL_FIRESTRIKER_IRON = (new FireStrikerItem("tool.firestriker", "minecraft:item/tool_firestriker_iron", 16387));
+        FOOD_APPLE = (new FoodItem("food.apple", "minecraft:item/food_apple", 16388, 4, 8, false, 8));
+        TOOL_BOW = (new BowItem("tool.bow", "minecraft:item/tool_bow", 16389));
+        AMMO_ARROW = (new Item("ammo.arrow", "minecraft:item/ammo_arrow", 16390));
+        COAL = (new CoalItem("coal", "minecraft:item/coal", 16391));
+        DIAMOND = (new Item("diamond", "minecraft:item/diamond", 16392));
+        INGOT_IRON = (new Item("ingot.iron", "minecraft:item/ingot_iron", 16393));
+        INGOT_GOLD = (new Item("ingot.gold", "minecraft:item/ingot_gold", 16394));
+        TOOL_SWORD_IRON = (new SwordToolItem("tool.sword.iron", "minecraft:item/tool_sword_iron", 16395, ToolMaterial.iron)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SWORD_WOOD = (new SwordToolItem("tool.sword.wood", "minecraft:item/tool_sword_wood", 16396, ToolMaterial.wood)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SHOVEL_WOOD = (new ShovelToolItem("tool.shovel.wood", "minecraft:item/tool_shovel_wood", 16397, ToolMaterial.wood));
+        TOOL_PICKAXE_WOOD = (new PickaxeToolItem("tool.pickaxe.wood", "minecraft:item/tool_pickaxe_wood", 16398, ToolMaterial.wood));
+        TOOL_AXE_WOOD = (new AxeToolItem("tool.axe.wood", "minecraft:item/tool_axe_wood", 16399, ToolMaterial.wood));
+        TOOL_SWORD_STONE = (new SwordToolItem("tool.sword.stone", "minecraft:item/tool_sword_stone", 16400, ToolMaterial.stone)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SHOVEL_STONE = (new ShovelToolItem("tool.shovel.stone", "minecraft:item/tool_shovel_tone", 16401, ToolMaterial.stone));
+        TOOL_PICKAXE_STONE = (new PickaxeToolItem("tool.pickaxe.stone", "minecraft:item/tool_pickaxe_stone", 16402, ToolMaterial.stone));
+        TOOL_AXE_STONE = (new AxeToolItem("tool.axe.stone", "minecraft:item/tool_axe_stone", 16403, ToolMaterial.stone));
+        TOOL_SWORD_DIAMOND = (new SwordToolItem("tool.sword.diamond", "minecraft:item/tool_sword_diamond", 16404, ToolMaterial.diamond)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SHOVEL_DIAMOND = (new ShovelToolItem("tool.shovel.diamond", "minecraft:item/tool_shovel_diamond", 16405, ToolMaterial.diamond));
+        TOOL_PICKAXE_DIAMOND = (new PickaxeToolItem("tool.pickaxe.diamond", "minecraft:item/tool_pickaxe_diamond", 16406, ToolMaterial.diamond));
+        TOOL_AXE_DIAMOND = (new AxeToolItem("tool.axe.diamond", "minecraft:item/tool_axe_diamond", 16407, ToolMaterial.diamond));
+        STICK = (new Item("stick", "minecraft:item/stick", 16408));
+        BOWL = (new Item("bowl", "minecraft:item/bowl", 16409));
+        FOOD_STEW_MUSHROOM = (new SoupItem("food.stew.mushroom", "minecraft:item/food_stew_mushroom", 16410, 10, 16));
+        TOOL_SWORD_GOLD = (new SwordToolItem("tool.sword.gold", "minecraft:item/tool_sword_gold", 16411, ToolMaterial.gold)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SHOVEL_GOLD = (new ShovelToolItem("tool.shovel.gold", "minecraft:item/tool_shovel_gold", 16412, ToolMaterial.gold));
+        TOOL_PICKAXE_GOLD = (new PickaxeToolItem("tool.pickaxe.gold", "minecraft:item/tool_pickaxe_gold", 16413, ToolMaterial.gold));
+        TOOL_AXE_GOLD = (new AxeToolItem("tool.axe.gold", "minecraft:item/tool_axe_gold", 16414, ToolMaterial.gold));
+        STRING = (new Item("string", "minecraft:item/string", 16415));
+        FEATHER_CHICKEN = (new Item("feather.chicken", "minecraft:item/feather_chicken", 16416));
+        SULPHUR = (new Item("sulphur", "minecraft:item/sulphur", 16417));
+        TOOL_HOE_WOOD = (new HoeToolItem("tool.hoe.wood", "minecraft:item/tool_hoe_wood", 16418, ToolMaterial.wood));
+        TOOL_HOE_STONE = (new HoeToolItem("tool.hoe.stone", "minecraft:item/tool_hoe_stone", 16419, ToolMaterial.stone));
+        TOOL_HOE_IRON = (new HoeToolItem("tool.hoe.iron", "minecraft:item/tool_hoe_iron", 16420, ToolMaterial.iron));
+        TOOL_HOE_DIAMOND = (new HoeToolItem("tool.hoe.diamond", "minecraft:item/tool_hoe_diamond", 16421, ToolMaterial.diamond));
+        TOOL_HOE_GOLD = (new HoeToolItem("tool.hoe.gold", "minecraft:item/tool_hoe_gold", 16422, ToolMaterial.gold));
+        SEEDS_WHEAT = (new SeedsItem("seeds.wheat", "minecraft:item/seeds_wheat", 16423, Blocks.CROPS_WHEAT));
+        WHEAT = (new Item("wheat", "minecraft:item/wheat", 16424));
+        FOOD_BREAD = (new FoodItem("food.bread", "minecraft:item/food_bread", 16425, 5, 12, false, 8));
+
+        ARMOR_HELMET_LEATHER = (new ArmorItem("armor.helmet.leather", "minecraft:item/armor_helmet_leather", 16426, ArmorMaterial.LEATHER, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_LEATHER = (new ArmorItem("armor.chestplate.leather", "minecraft:item/armor_chestplate_leather", 16427, ArmorMaterial.LEATHER, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_LEATHER = (new ArmorItem("armor.leggings.leather", "minecraft:item/armor_leggings_leather", 16428, ArmorMaterial.LEATHER, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_LEATHER = (new ArmorItem("armor.boots.leather", "minecraft:item/armor_boots_leather", 16429, ArmorMaterial.LEATHER, IArmorItem.PIECE_BOOTS));
+
+        ARMOR_HELMET_CHAINMAIL = (new ArmorItem("armor.helmet.chainmail", "minecraft:item/armor_helmet_chainmail", 16430, ArmorMaterial.CHAINMAIL, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_CHAINMAIL = (new ArmorItem("armor.chestplate.chainmail", "minecraft:item/armor_chestplate_chainmail", 16431, ArmorMaterial.CHAINMAIL, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_CHAINMAIL = (new ArmorItem("armor.leggings.chainmail", "minecraft:item/armor_leggings_chainmail", 16432, ArmorMaterial.CHAINMAIL, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_CHAINMAIL = (new ArmorItem("armor.boots.chainmail", "minecraft:item/armor_boots_chainmail", 16433, ArmorMaterial.CHAINMAIL, IArmorItem.PIECE_BOOTS));
+
+        ARMOR_HELMET_IRON = (new ArmorItem("armor.helmet.iron", "minecraft:item/armor_helmet_iron", 16434, ArmorMaterial.IRON, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_IRON = (new ArmorItem("armor.chestplate.iron", "minecraft:item/armor_chestplate_iron", 16435, ArmorMaterial.IRON, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_IRON = (new ArmorItem("armor.leggings.iron", "minecraft:item/armor_leggings_iron", 16436, ArmorMaterial.IRON, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_IRON = (new ArmorItem("armor.boots.iron", "minecraft:item/armor_boots_iron", 16437, ArmorMaterial.IRON, IArmorItem.PIECE_BOOTS));
+
+        ARMOR_HELMET_DIAMOND = (new ArmorItem("armor.helmet.diamond", "minecraft:item/armor_helmet_diamond", 16438, ArmorMaterial.DIAMOND, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_DIAMOND = (new ArmorItem("armor.chestplate.diamond", "minecraft:item/armor_chestplate_diamond", 16439, ArmorMaterial.DIAMOND, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_DIAMOND = (new ArmorItem("armor.leggings.diamond", "minecraft:item/armor_leggings_diamond", 16440, ArmorMaterial.DIAMOND, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_DIAMOND = (new ArmorItem("armor.boots.diamond", "minecraft:item/armor_boots_diamond", 16441, ArmorMaterial.DIAMOND, IArmorItem.PIECE_BOOTS));
+
+        ARMOR_HELMET_GOLD = (new ArmorItem("armor.helmet.gold", "minecraft:item/armor_helmet_gold", 16442, ArmorMaterial.GOLD, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_GOLD = (new ArmorItem("armor.chestplate.gold", "minecraft:item/armor_chestplate_gold", 16443, ArmorMaterial.GOLD, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_GOLD = (new ArmorItem("armor.leggings.gold", "minecraft:item/armor_leggings_gold", 16444, ArmorMaterial.GOLD, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_GOLD = (new ArmorItem("armor.boots.gold", "minecraft:item/armor_boots_gold", 16445, ArmorMaterial.GOLD, IArmorItem.PIECE_BOOTS));
+        FLINT = (new Item("flint", "minecraft:item/flint", 16446));
+        FOOD_PORKCHOP_RAW = (new FoodItem("food.porkchop.raw", "minecraft:item/food_porkchop_raw", 16447, 3, 16, true, 4));
+        FOOD_PORKCHOP_COOKED = (new FoodItem("food.porkchop.cooked", "minecraft:item/food_porkchop_cooked", 16448, 8, 16, true, 4));
+        PAINTING = (new PaintingItem("painting", "minecraft:item/painting", 16449));
+        FOOD_APPLE_GOLD = (new FoodItem("food.apple.gold", "minecraft:item/food_apple_gold", 16450, 42, 0, false, 1));
+        SIGN = (new SignItem("sign", "minecraft:item/sign", 16451));
+        DOOR_OAK = (new DoorItem("door.oak", "minecraft:item/door_oak", 16452, Blocks.DOOR_PLANKS_OAK_BOTTOM, Blocks.DOOR_PLANKS_OAK_TOP));
+        BUCKET = (new EmptyBucketItem("bucket", "minecraft:item/bucket", 16453));
+        BUCKET_WATER = (new BucketItem("bucket.water", "minecraft:item/bucket_water", 16454, Blocks.FLUID_WATER_FLOWING)).setContainerItem(BUCKET);
+        BUCKET_LAVA = (new BucketItem("bucket.lava", "minecraft:item/bucket_lava", 16455, Blocks.FLUID_LAVA_FLOWING)).setContainerItem(BUCKET);
+        MINECART = (new MinecartItem("minecart", "minecraft:item/minecart", 16456, MinecartEntity.PASSENGER_CART));
+        SADDLE = (new SaddleItem("saddle", "minecraft:item/saddle", 16457));
+        DOOR_IRON = (new DoorItem("door.iron", "minecraft:item/door_iron", 16458, Blocks.DOOR_IRON_BOTTOM, Blocks.DOOR_IRON_TOP));
+        DUST_REDSTONE = (new PlaceableItem("dust.redstone", "minecraft:item/dust_redstone", 16459, Blocks.WIRE_REDSTONE));
+        AMMO_SNOWBALL = (new SnowballItem("ammo.snowball", "minecraft:item/ammo_snowball", 16460));
+        BOAT = (new BoatItem("boat", "minecraft:item/boat", 16461));
+        LEATHER = (new Item("leather", "minecraft:item/leather", 16462));
+        BUCKET_MILK = (new BucketItem("bucket.milk", "minecraft:item/bucket_milk", 16463, null)).setContainerItem(BUCKET);
+        BRICK_CLAY = (new Item("brick.clay", "minecraft:item/brick_clay", 16464));
+        CLAY = (new Item("clay", "minecraft:item/clay", 16465));
+        SUGARCANE = (new PlaceableItem("sugarcane", "minecraft:item/sugarcane", 16466, Blocks.SUGARCANE));
+        PAPER = (new Item("paper", "minecraft:item/paper", 16467));
+        BOOK = (new Item("book", "minecraft:item/book", 16468));
+        SLIMEBALL = (new Item("slimeball", "minecraft:item/slimeball", 16469));
+        MINECART_CHEST = (new MinecartItem("minecart.chest", "minecraft:item/minecart_chest", 16470, MinecartEntity.CHEST_CART));
+        MINECART_FURNACE = (new MinecartItem("minecart.furnace", "minecraft:item/minecart_furnace", 16471, MinecartEntity.FURNACE_CART));
+        EGG_CHICKEN = (new EggItem("egg.chicken", "minecraft:item/egg_chicken", 16472));
+        TOOL_COMPASS = (new Item("tool.compass", "minecraft:item/tool_compass", 16473));
+        TOOL_FISHINGROD = (new FishingRodItem("tool.fishingrod", "minecraft:item/tool_fishingrod", 16474));
+        TOOL_CLOCK = (new Item("tool.clock", "minecraft:item/tool_clock", 16475));
+        DUST_GLOWSTONE = (new Item("dust.glowstone", "minecraft:item/dust_glowstone", 16476));
+        FOOD_FISH_RAW = (new FoodItem("food.fish.raw", "minecraft:item/food_fish_raw", 16477, 2, 12, false, 8));
+        FOOD_FISH_COOKED = (new FoodItem("food.fish.cooked", "minecraft:item/food_fish_cooked", 16478, 5, 12, false, 8));
+        DYE = (new DyeItem("dye", "minecraft:item/dye", 16479));
+        BONE = (new Item("bone", "minecraft:item/bone", 16480));
+        DUST_SUGAR = (new Item("dust.sugar", "minecraft:item/dust_sugar", 16481));
+        FOOD_CAKE = (new PlaceableItem("food.cake", "minecraft:item/food_cake", 16482, Blocks.CAKE)).setMaxStackSize(1);
+        BED = (new BedItem("bed", "minecraft:item/bed", 16483)).setMaxStackSize(1);
+        REPEATER = (new PlaceableItem("repeater", "minecraft:item/repeater", 16484, Blocks.REPEATER_IDLE));
+        FOOD_COOKIE = (new FoodItem("food.cookie", "minecraft:item/food_cookie", 16485, 1, 0, false, 16));
+        MAP = new MapItem("map", "minecraft:item/map", 16486);
+        TOOL_SHEARS = new ToolShearsItem("tool.shears", "minecraft:item/tool_shears", 16487, ToolMaterial.iron);
+        RECORD_13 = (new MusicDiscItem("record.13", "minecraft:item/record_13", 18384, "13", "C418"));
+        RECORD_CAT = (new MusicDiscItem("record.cat", "minecraft:item/record_cat", 18385, "cat", "C418"));
+        RECORD_BLOCKS = (new MusicDiscItem("record.blocks", "minecraft:item/record_blocks", 18386, "blocks", "C418"));
+        RECORD_CHIRP = (new MusicDiscItem("record.chirp", "minecraft:item/record_chirp", 18387, "chirp", "C418"));
+        RECORD_FAR = (new MusicDiscItem("record.far", "minecraft:item/record_far", 18388, "far", "C418"));
+        RECORD_MALL = (new MusicDiscItem("record.mall", "minecraft:item/record_mall", 18389, "mall", "C418"));
+        RECORD_MELLOHI = (new MusicDiscItem("record.mellohi", "minecraft:item/record_mellohi", 18390, "mellohi", "C418"));
+        RECORD_STAL = (new MusicDiscItem("record.stal", "minecraft:item/record_stal", 18391, "stal", "C418"));
+        RECORD_STRAD = (new MusicDiscItem("record.strad", "minecraft:item/record_strad", 18392, "strad", "C418"));
+        RECORD_WARD = (new MusicDiscItem("record.ward", "minecraft:item/record_ward", 18393, "ward", "C418"));
+        RECORD_WAIT = (new MusicDiscItem("record.wait", "minecraft:item/record_wait", 18394, "wait", "C418"));
+        RECORD_DOG = (new MusicDiscItem("record.dog", "minecraft:item/record_dog", 18395, "dog", "C418"));
+        NETHERCOAL = (new Item("nethercoal", "minecraft:item/nethercoal", 16488));
+        ARMOR_HELMET_STEEL = (new ArmorItem("armor.helmet.steel", "minecraft:item/armor_helmet_steel", 16489, ArmorMaterial.STEEL, IArmorItem.PIECE_HEAD));
+        ARMOR_CHESTPLATE_STEEL = (new ArmorItem("armor.chestplate.steel", "minecraft:item/armor_chestplate_steel", 16490, ArmorMaterial.STEEL, IArmorItem.PIECE_CHEST));
+        ARMOR_LEGGINGS_STEEL = (new ArmorItem("armor.leggings.steel", "minecraft:item/armor_leggings_steel", 16491, ArmorMaterial.STEEL, IArmorItem.PIECE_LEGS));
+        ARMOR_BOOTS_STEEL = (new ArmorItem("armor.boots.steel", "minecraft:item/armor_boots_steel", 16492, ArmorMaterial.STEEL, IArmorItem.PIECE_BOOTS));
+
+        TOOL_SWORD_STEEL = (new SwordToolItem("tool.sword.steel", "minecraft:item/tool_sword_steel", 16493, ToolMaterial.steel)).withTags(ItemTags.PREVENT_CREATIVE_MINING);
+        TOOL_SHOVEL_STEEL = (new ShovelToolItem("tool.shovel.steel", "minecraft:item/tool_shovel_steel", 16494, ToolMaterial.steel));
+        TOOL_PICKAXE_STEEL = (new PickaxeToolItem("tool.pickaxe.steel", "minecraft:item/tool_pickaxe_steel", 16495, ToolMaterial.steel));
+        TOOL_AXE_STEEL = (new AxeToolItem("tool.axe.steel", "minecraft:item/tool_axe_steel", 16496, ToolMaterial.steel));
+        TOOL_HOE_STEEL = (new HoeToolItem("tool.hoe.steel", "minecraft:item/tool_hoe_steel", 16497, ToolMaterial.steel));
+
+        INGOT_STEEL = (new Item("ingot.steel", "minecraft:item/ingot_steel", 16498));
+        INGOT_STEEL_CRUDE = (new Item("ingot.steel.crude", "minecraft:item/ingot_steel_crude", 16499));
+        AMMO_FIREBALL = (new Item("ammo.fireball", "minecraft:item/ammo_fireball", 16500)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
+        ARMOR_QUIVER_GOLD = (new EndlessQuiverItem("armor.quiver.gold", "minecraft:item/armor_quiver_gold", 16501));
+        HANDCANNON_UNLOADED = (new UnloadedHandCannonItem("handcannon.unloaded", "minecraft:item/handcannon_unloaded", 16502));
+        CHAINLINK = (new Item("chainlink", "minecraft:item/chainlink", 16503));
+        CLOTH = (new Item("cloth", "minecraft:item/cloth", 16504));
+        AMMO_CHARGE_EXPLOSIVE = (new Item("ammo.charge.explosive", "minecraft:item/ammo_charge_explosive", 16505)).setMaxStackSize(16);
+        HANDCANNON_LOADED = (new LoadedHandCannonItem("handcannon.loaded", "minecraft:item/handcannon_loaded", 16506)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
+        AMMO_ARROW_GOLD = (new Item("ammo.arrow.gold", "minecraft:item/ammo_arrow_gold", 16507));
+        ARMOR_QUIVER = (new QuiverItem("armor.quiver", "minecraft:item/armor_quiver", 16508));
+        TOOL_CALENDAR = (new Item("tool.calendar", "minecraft:item/tool_calendar", 16509));
+        ORE_RAW_GOLD = (new Item("ore.raw.gold", "minecraft:item/ore_raw_gold", 16510));
+        ORE_RAW_IRON = (new Item("ore.raw.iron", "minecraft:item/ore_raw_iron", 16511));
+        QUARTZ = (new Item("quartz", "minecraft:item/quartz", 16512));
+        OLIVINE = (new Item("olivine", "minecraft:item/olivine", 16513));
+        AMMO_PEBBLE = (new PebbleItem("ammo.pebble", "minecraft:item/ammo_pebble", 16514));
+        FOOD_CHERRY = (new FoodItem("food.cherry", "minecraft:item/food_cherry", 16515, 2, 2, false, 8));
+        BUCKET_ICECREAM = (new IceCreamBucketItem("bucket.icecream", "minecraft:item/bucket_icecream", 16516, 10, 4)).setContainerItem(BUCKET);
+        AMMO_ARROW_PURPLE = (new Item("ammo.arrow.purple", "minecraft:item/ammo_arrow_purple", 16517)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
+        LABEL = (new LabelItem("label", "minecraft:item/label", 16518));
+        JAR = (new JarItem("jar", "minecraft:item/jar", 16519));
+        LANTERN_FIREFLY_GREEN = (new PlaceableItem("lantern.firefly.green", "minecraft:item/lantern_firefly_green", 16520, Blocks.LANTERN_FIREFLY_GREEN));
+        LANTERN_FIREFLY_BLUE = (new PlaceableItem("lantern.firefly.blue", "minecraft:item/lantern_firefly_blue", 16521, Blocks.LANTERN_FIREFLY_BLUE));
+        LANTERN_FIREFLY_ORANGE = (new PlaceableItem("lantern.firefly.orange", "minecraft:item/lantern_firefly_orange", 16522, Blocks.LANTERN_FIREFLY_ORANGE));
+        LANTERN_FIREFLY_RED = (new PlaceableItem("lantern.firefly.red", "minecraft:item/lantern_firefly_red", 16523, Blocks.LANTERN_FIREFLY_RED));
+        //    candleSoulwax = new PlaceableItem("candle.soulwax", 16524, Block.candleSoulwax).setIconCoord(5, 10);
+        BASKET = new PlaceableItem("basket", "minecraft:item/basket", 16525, Blocks.BASKET);
+        FLAG = new FlagItem("flag", "minecraft:item/flag", 16526);
+        ARMOR_BOOTS_ICESKATES = new IceSkatesItem("armor.boots.iceskates", "minecraft:item/armor_boots_iceskates", 16527);
+        TOOL_SHEARS_STEEL = (ToolShearsItem)(new ToolShearsItem("tool.shears.steel", "minecraft:item/tool_shears_steel", 16528, ToolMaterial.steel)).setMaxDamage(ToolMaterial.steel.getDurability());
+        TOOL_FIRESTRIKER_STEEL = (new FireStrikerItem("tool.firestriker.steel", "minecraft:item/tool_firestriker_steel", 16529)).setMaxDamage(ToolMaterial.steel.getDurability());
+        SEEDS_PUMPKIN = (new SeedsItem("seeds.pumpkin", "minecraft:item/seeds_pumpkin", 16530, Blocks.CROPS_PUMPKIN));
+        SEAT = new PlaceableItem("seat", "minecraft:item/seat", 16531, Blocks.SEAT).setMaxStackSize(64);
+        DOOR_OAK_PAINTED = (new PaintedDoorItem("door.oak.painted", "minecraft:item/door_oak_painted", 16532, Blocks.DOOR_PLANKS_PAINTED_BOTTOM, Blocks.DOOR_PLANKS_PAINTED_TOP));
+        DOOR_GLASS = (new DoorItem("door.glass", "minecraft:item/door_glass", 16533, Blocks.DOOR_GLASS_BOTTOM, Blocks.DOOR_GLASS_TOP));
+        ROPE = new RopeItem("rope", "minecraft:item/rope", 16534, Blocks.ROPE);
+        FOOD_PUMPKIN_PIE = (new PlaceableItem("food.pumpkin_pie", "minecraft:item/food_pumpkin_pie", 16535, Blocks.PUMPKIN_PIE)).setMaxStackSize(1);
+        WAND_MONSTER_SPAWNER = (new SpawnerWandItem("wand.monster", "minecraft:item/wand_monster", 16536)).setMaxStackSize(1);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemJar.java b/src/main/java/net/minecraft/core/item/JarItem.java
similarity index 59%
rename from src/main/java/net/minecraft/core/item/ItemJar.java
rename to src/main/java/net/minecraft/core/item/JarItem.java
index 2bafe100a..55eb7b9fc 100644
--- a/src/main/java/net/minecraft/core/item/ItemJar.java
+++ b/src/main/java/net/minecraft/core/item/JarItem.java
@@ -1,27 +1,25 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import java.util.List;
 
-import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+public class JarItem extends PlaceableItem {
 
-public class ItemJar extends ItemPlaceable{
 
-    protected ItemJar(String name, int id) {
-        super(name, id, Block.jarGlass);
+
+    protected JarItem(String name, String namespaceId, int id) {
+        super(name, namespaceId, id, Blocks.JAR_GLASS);
         setMaxStackSize(64);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if (player.isSneaking()) {
             return super.onUseItemOnBlock(stack, player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
         }
@@ -34,30 +32,30 @@ public class ItemJar extends ItemPlaceable{
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         if (entityplayer.isSneaking()) {
             return itemstack;
         }
-        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entityplayer,entityplayer.bb.expand(2, 2, 2));
-        
+        List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entityplayer,entityplayer.bb.grow(2, 2, 2));
+
         for(Entity entity : list){
-            if(entity instanceof EntityFireflyCluster) {
-                EntityFireflyCluster fireflyCluster = (EntityFireflyCluster) entity;
-                EntityFireflyCluster.FireflyColor colour = fireflyCluster.getColor();
+            if(entity instanceof FireflyClusterMob) {
+                FireflyClusterMob fireflyCluster = (FireflyClusterMob) entity;
+                FireflyClusterMob.FireflyColor colour = fireflyCluster.getColor();
 
                 boolean didFillJar;
-                if(colour == EntityFireflyCluster.FireflyColor.BLUE){
-                    didFillJar = fillJar(entityplayer, new ItemStack(Item.lanternFireflyBlue, 1));
+                if(colour == FireflyClusterMob.FireflyColor.BLUE){
+                    didFillJar = fillJar(entityplayer, new ItemStack(Items.LANTERN_FIREFLY_BLUE, 1));
                 }
-                else if(colour == EntityFireflyCluster.FireflyColor.ORANGE){
-                    didFillJar = fillJar(entityplayer, new ItemStack(Item.lanternFireflyOrange, 1));
+                else if(colour == FireflyClusterMob.FireflyColor.ORANGE){
+                    didFillJar = fillJar(entityplayer, new ItemStack(Items.LANTERN_FIREFLY_ORANGE, 1));
                 }
-                else if(colour == EntityFireflyCluster.FireflyColor.RED){
-                    didFillJar = fillJar(entityplayer, new ItemStack(Item.lanternFireflyRed, 1));
+                else if(colour == FireflyClusterMob.FireflyColor.RED){
+                    didFillJar = fillJar(entityplayer, new ItemStack(Items.LANTERN_FIREFLY_RED, 1));
                 }
                 else{
-                    didFillJar = fillJar(entityplayer, new ItemStack(Item.lanternFireflyGreen, 1));
+                    didFillJar = fillJar(entityplayer, new ItemStack(Items.LANTERN_FIREFLY_GREEN, 1));
                 }
 
                 if(!world.isClientSide && didFillJar) {
@@ -74,9 +72,9 @@ public class ItemJar extends ItemPlaceable{
     }
 
 
-    public static boolean fillJar(EntityPlayer player, ItemStack itemToGive){
+    public static boolean fillJar(Player player, ItemStack itemToGive){
         if(player.inventory.getCurrentItem().stackSize <= 1) {
-            player.inventory.setInventorySlotContents(player.inventory.currentItem, itemToGive);
+            player.inventory.setItem(player.inventory.currentItem, itemToGive);
         } else {
         	player.inventory.insertItem(itemToGive, true);
         }
diff --git a/src/main/java/net/minecraft/core/item/ItemLabel.java b/src/main/java/net/minecraft/core/item/LabelItem.java
similarity index 70%
rename from src/main/java/net/minecraft/core/item/ItemLabel.java
rename to src/main/java/net/minecraft/core/item/LabelItem.java
index d0f953fe8..dbcdd36e5 100644
--- a/src/main/java/net/minecraft/core/item/ItemLabel.java
+++ b/src/main/java/net/minecraft/core/item/LabelItem.java
@@ -1,17 +1,17 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
-public class ItemLabel extends Item
+public class LabelItem extends Item
 {
-    protected ItemLabel(String name, int id) {
-        super(name, id);
+    protected LabelItem(String name, String namespaceId, int id) {
+        super(name, namespaceId, id);
         setMaxStackSize(1);
     }
 
 	@Override
-	public ItemStack onUseItem(final ItemStack stack, final World world, final EntityPlayer player) {
+	public ItemStack onUseItem(final ItemStack stack, final World world, final Player player) {
 		if(stack.hasCustomName()) {
 			return stack;
 		}
diff --git a/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java b/src/main/java/net/minecraft/core/item/LoadedHandCannonItem.java
similarity index 50%
rename from src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java
rename to src/main/java/net/minecraft/core/item/LoadedHandCannonItem.java
index 6822ceb7c..8a636b15c 100644
--- a/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java
+++ b/src/main/java/net/minecraft/core/item/LoadedHandCannonItem.java
@@ -1,36 +1,36 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, InventoryPlayer, World,
-//            EntityArrow, ItemStack
+//            Item, Player, InventoryPlayer, World,
+//            ArrowProjectile, ItemStack
 
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityCannonball;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.CannonballProjectile;
 import net.minecraft.core.world.World;
 
-public class ItemHandCannonLoaded extends Item
+public class LoadedHandCannonItem extends Item
 {
 
-    public ItemHandCannonLoaded(String name, int id)
+    public LoadedHandCannonItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setMaxDamage(100);
         maxStackSize = 1;
     }
 
 	@Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
 		world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3F, 1.0F / (itemRand.nextFloat() * -0.2F + -0.4F));
 
 		if(!world.isClientSide)
 		{
 			itemstack.damageItem(1, entityplayer);
-			world.entityJoinedWorld(new EntityCannonball(world, entityplayer));
+			world.entityJoinedWorld(new CannonballProjectile(world, entityplayer));
 			if(itemstack.stackSize <= 0) {
 				return null;
 			}
-			return new ItemStack(Item.handcannonUnloaded, 1, itemstack.getMetadata(), itemstack.getData());
+			return new ItemStack(Items.HANDCANNON_UNLOADED, 1, itemstack.getMetadata(), itemstack.getData());
 		}
         return itemstack;
     }
diff --git a/src/main/java/net/minecraft/core/item/MapItem.java b/src/main/java/net/minecraft/core/item/MapItem.java
new file mode 100644
index 000000000..ceff4dace
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/MapItem.java
@@ -0,0 +1,398 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+
+// Referenced classes of package net.minecraft.src:
+//            ItemMapBase, MapData, World, ItemStack, 
+//            WorldInfo, WorldProvider, Entity, MathHelper, 
+//            Block, Chunk, Material, MapColor, 
+//            EntityPlayer
+
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.net.packet.MapDataPacket;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.chunk.Chunk;
+import net.minecraft.core.block.material.MaterialColor;
+import net.minecraft.core.world.saveddata.maps.ItemMapSavedData;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class MapItem extends Item implements IComplexItem
+{
+	private static final Map<Integer, Map<Integer, Integer>> blockCounts = new HashMap<>();
+    protected MapItem(String name, String namespaceId, int id)
+    {
+        super(name, namespaceId, id);
+    }
+
+    public static ItemMapSavedData getOrCreateSavedData(short meta, byte scale, World world)
+    {
+		String s = String.format("map_%s_scale_%s", meta, scale);
+        ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, s);
+        if(mapData == null)
+        {
+			if (scale == 3){
+				mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, String.format("map_%s", meta));
+				if (mapData != null) {
+					for (byte i = 0; i <= ItemMapSavedData.MAX_SCALE; i++) {
+						String _s = String.format("map_%s_scale_%s", meta, i);
+						if (i == 3) {
+							world.setSavedData(_s, mapData);
+							continue;
+						}
+						ItemMapSavedData d = new ItemMapSavedData(_s);
+						d.x = mapData.x;
+						d.z = mapData.z;
+						d.scale = i;
+						d.dimension = mapData.dimension;
+						d.setDirty();
+						world.setSavedData(_s, d);
+					}
+					return mapData;
+				}
+			}
+            mapData = new ItemMapSavedData(s);
+			mapData.x = world.getLevelData().getSpawnX();
+			mapData.z = world.getLevelData().getSpawnZ();
+			mapData.scale = scale;
+			mapData.dimension = (byte)world.dimension.id;
+			mapData.setDirty();
+            world.setSavedData(s, mapData);
+        }
+        return mapData;
+    }
+
+	public static boolean hasInitialized(ItemStack stack){
+		return stack.getData().getBooleanOrDefault("initialized", false);
+	}
+	@Nullable
+    public ItemMapSavedData getOrCreateSavedData(ItemStack stack, World world)
+    {
+		if (!hasInitialized(stack)) return null;
+		byte scale = getScale(stack);
+		int meta = stack.getMetadata();
+        String s = String.format("map_%s_scale_%s", meta, scale);
+        ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, s);
+        if(mapData == null)
+        {
+			if (scale == 3){
+				mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, String.format("map_%s", meta));
+				if (mapData != null) {
+					for (byte i = 0; i <= ItemMapSavedData.MAX_SCALE; i++) {
+						String _s = String.format("map_%s_scale_%s", meta, i);
+						if (i == 3) {
+							world.setSavedData(_s, mapData);
+							continue;
+						}
+						ItemMapSavedData d = new ItemMapSavedData(_s);
+						d.x = mapData.x;
+						d.z = mapData.z;
+						d.scale = i;
+						d.dimension = mapData.dimension;
+						d.setDirty();
+						world.setSavedData(_s, d);
+					}
+					return mapData;
+				}
+			}
+            mapData = new ItemMapSavedData(s);
+            mapData.x = world.getLevelData().getSpawnX();
+            mapData.z = world.getLevelData().getSpawnZ();
+            mapData.scale = scale;
+            mapData.dimension = (byte)world.dimension.id;
+            mapData.setDirty();
+            world.setSavedData(s, mapData);
+        }
+        return mapData;
+    }
+	@Override
+	public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
+	{
+		if (!hasInitialized(itemstack)){
+			initMap(itemstack, world, entityplayer);
+		} else {
+			setScale(itemstack, (byte) (getScale(itemstack) + (entityplayer.isSneaking() ? 1 : -1)));
+		}
+		return itemstack;
+	}
+	@Override
+	public boolean onUseItemOnBlock(ItemStack itemstack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+		if (world.getBlockId(blockX, blockY, blockZ) == Blocks.FLAG.id) {
+			ItemMapSavedData mapData = getOrCreateSavedData(itemstack, world);
+			if (mapData != null){
+				FlagBlockEntity flag = (FlagBlockEntity) world.getBlockEntity(blockX, blockY, blockZ);
+				boolean canCreateMap = mapData.createNewWaypoint(flag);
+				if(!canCreateMap)
+					player.sendTranslatedChatMessage("flag.full");
+				return canCreateMap;
+			}
+		}
+		return false;
+	}
+
+	public void update(World world, Entity entity, ItemMapSavedData data) {
+		if(world.dimension.id != data.dimension) {
+			return;
+		}
+		
+		final int mapWidth = 128;
+		final int mapHeight = 128;
+		final int blocksPerPixel = 1 << data.scale;
+		final int mapCenterX = data.x;
+		final int mapCenterZ = data.z;
+
+		final int entityOnMapX = MathHelper.floor(entity.x - (double) mapCenterX) / blocksPerPixel + mapWidth / 2;
+		final int entityOnMapZ = MathHelper.floor(entity.z - (double) mapCenterZ) / blocksPerPixel + mapHeight / 2;
+
+		int discoverRadius = 128 / blocksPerPixel;
+		if(world.worldType.hasCeiling()) {
+			discoverRadius /= 2;
+		}
+		
+		data.step++;
+		
+		for (int x = (entityOnMapX - discoverRadius) + 1; x < entityOnMapX + discoverRadius; x++) {
+			if((x & 0xf) != (data.step & 0xf)) {
+				continue;
+			}
+			int minZ = 255;
+			int maxZ = 0;
+			double previousPixelHeight = 0.0;
+			
+			// Pixel brightness changes depending on the height of the above pixel
+			// Make sure we know the height of the above pixel when drawing this one,
+			// Otherwise there will be lines on borders from loaded to unloaded chunks
+			boolean previousChunkLoaded = false;
+			
+			for (int z = entityOnMapZ - discoverRadius - 1; z < entityOnMapZ + discoverRadius; z++) {
+				if(x < 0 || z < -1 || x >= mapWidth || z >= mapHeight) {
+					continue;
+				}
+				int distX = x - entityOnMapX;
+				int distZ = z - entityOnMapZ;
+				boolean flag = distX * distX + distZ * distZ > (discoverRadius - 2) * (discoverRadius - 2);
+				
+				int blockX = ((mapCenterX / blocksPerPixel + x) - mapWidth / 2) * blocksPerPixel;
+				int blockZ = ((mapCenterZ / blocksPerPixel + z) - mapHeight / 2) * blocksPerPixel;
+				
+				// Make sure to only draw loaded chunks, otherwise the map disappears around the player when the server view distance is low
+				if(!world.isBlockLoaded(blockX, world.getHeightBlocks() / 2, blockZ)) {
+					previousChunkLoaded = false;
+					continue;
+				}
+
+				blockCounts.clear();
+				Chunk chunk = world.getChunkFromBlockCoords(blockX, blockZ);
+				
+				
+				int blockInChunkX = blockX & 0xf;
+				int blockInChunkZ = blockZ & 0xf;
+				
+				int waterDepth = 0;
+				double pixelHeight = 0.0D;
+				
+				if(world.worldType.hasCeiling()) {
+					//Determine Color (Nether)
+					int rand = blockX + blockZ * 0x389bf;
+					rand = rand * rand * 0x1dd6751 + rand * 11;
+					if((rand >> 20 & 1) == 0) {
+						blockCounts.putIfAbsent(Blocks.DIRT.id, new HashMap<>());
+						blockCounts.get(Blocks.DIRT.id).put(-1, blockCounts.get(Blocks.DIRT.id).getOrDefault(-1, 0) + 10);
+					} else {
+						blockCounts.putIfAbsent(Blocks.STONE.id, new HashMap<>());
+						blockCounts.get(Blocks.STONE.id).put(-1, blockCounts.get(Blocks.STONE.id).getOrDefault(-1, 0) + 10);
+					}
+					pixelHeight = 100D;
+				} else {
+					//Determine Color (Not Nether)
+					for (int _x = 0; _x < blocksPerPixel; _x++) {
+						for (int _z = 0; _z < blocksPerPixel; _z++) {
+							int height = chunk.getHeightValue(_x + blockInChunkX, _z + blockInChunkZ);
+							int id = 0;
+                            if(height > 0) {
+								boolean runLoop;
+								do {
+									runLoop = false;
+									id = chunk.getBlockID(_x + blockInChunkX, height, _z + blockInChunkZ);
+									if(id <= 0 || (height > 0 && Block.blocksList[id].blockMaterial.color == MaterialColor.none)) {
+										runLoop = true;
+										height--;
+									}
+								} while (runLoop);
+								if(Block.blocksList[id].blockMaterial == Material.water) {
+									int _y = height;
+                                    int _blockID = chunk.getBlockID(_x + blockInChunkX, _y--, _z + blockInChunkZ);
+                                    waterDepth++;
+                                    while (_y > 0 && _blockID > 0 && Block.blocksList[_blockID].blockMaterial == Material.water) {
+                                        _blockID = chunk.getBlockID(_x + blockInChunkX, _y--, _z + blockInChunkZ);
+                                        waterDepth++;
+                                    }
+								}
+							}
+							pixelHeight += (double) height / (double) (blocksPerPixel * blocksPerPixel);
+                            int meta = chunk.getBlockMetadata(_x + blockInChunkX, height, _z + blockInChunkZ);
+							blockCounts.putIfAbsent(id, new HashMap<>());
+							blockCounts.get(id).put(-1, blockCounts.get(id).getOrDefault(-1, 0) + 1);
+							blockCounts.get(id).put(meta, blockCounts.get(id).getOrDefault(meta, 0) + 1);
+						}
+
+					}
+
+				}
+				waterDepth /= blocksPerPixel * blocksPerPixel;
+				
+				int max = 0;
+				int id = 0;
+				for (Map.Entry<Integer, Map<Integer, Integer>> e : blockCounts.entrySet()){
+					if (e.getValue().getOrDefault(-1, -1) > max){
+						id = e.getKey();
+						max = e.getValue().get(-1);
+					}
+				}
+
+				int meta = 0;
+				max = 0;
+				for (int i = 0; i < 256; i++) {
+					if (blockCounts.get(id).getOrDefault(i, -1) > max){
+						meta = i;
+						max = blockCounts.get(id).get(i);
+					}
+				}
+
+				double heightDifference = ((pixelHeight - previousPixelHeight) * 4D) / (double) (blocksPerPixel + 4) + ((double) (x + z & 1) - 0.5D) * 0.4D;
+				byte brightness = 1;
+				if(heightDifference > 0.6D) brightness = 2;
+				if(heightDifference < -0.6D) brightness = 0;
+				
+				int colorIndex = 0;
+				if(id > 0) {
+					MaterialColor mapcolor = Block.blocksList[id].blockMaterial.color;
+					if(mapcolor == MaterialColor.water) {
+						double d3 = (double) waterDepth * 0.1D + (double) (x + z & 1) * 0.2D;
+						brightness = 1;
+						if(d3 < 0.5D) {
+							brightness = 2;
+						}
+						if(d3 > 0.9D) {
+							brightness = 0;
+						}
+					}
+					colorIndex = MaterialColor.getColorIndexFromBlock(Block.blocksList[id], meta);
+				}
+				previousPixelHeight = pixelHeight;
+				if(!previousChunkLoaded) {
+					previousChunkLoaded = true;
+					continue;
+				}
+				if(z < 0 || distX * distX + distZ * distZ >= discoverRadius * discoverRadius || flag && (x + z & 1) == 0) {
+					continue;
+				}
+				byte currentColor = data.colors[x + z * mapWidth];
+				byte finalColor = (byte) (colorIndex << 2 | brightness & 0b11);
+				if(currentColor == finalColor) {
+					continue;
+				}
+				
+				if(minZ > z) minZ = z;
+				if(maxZ < z) maxZ = z;
+				data.colors[x + z * mapWidth] = finalColor;
+			}
+
+			if(minZ <= maxZ) {
+				data.setDirty(x, minZ, maxZ);
+			}
+		}
+
+	}
+
+    @Override
+    public void inventoryTick(ItemStack itemstack, World world, Entity entity, int i, boolean flag)
+    {
+        if(world.isClientSide)
+        {
+            return;
+        }
+        ItemMapSavedData mapData = getOrCreateSavedData(itemstack, world);
+        if (mapData != null){
+			if(entity instanceof Player)
+			{
+				Player player = (Player)entity;
+				mapData.tickCarriedBy(player, itemstack);
+			}
+			if(flag)
+			{
+				update(world, entity, mapData);
+			}
+		}
+    }
+
+
+    public void initMap(ItemStack itemstack, World world, Player player)
+    {
+		boolean insert = itemstack.stackSize > 1;
+		if (insert){
+			itemstack.stackSize -= 1;
+			itemstack = itemstack.copy();
+			itemstack.stackSize = 1;
+		}
+        itemstack.setMetadata(world.getUniqueDataId("map"));
+		for (byte i = 0; i <= ItemMapSavedData.MAX_SCALE; i++) {
+			String s = "map_" + itemstack.getMetadata() + "_scale_" + i;
+			ItemMapSavedData mapdata = new ItemMapSavedData(s);
+			world.setSavedData(s, mapdata);
+			mapdata.x = (MathHelper.floor(player.x) >> 4) << 4;
+			mapdata.z = (MathHelper.floor(player.z) >> 4) << 4;
+			mapdata.scale = i;
+			mapdata.dimension = (byte)world.dimension.id;
+			mapdata.setDirty();
+		}
+		itemstack.getData().putBoolean("initialized", true);
+		if (insert){
+			player.inventory.insertItem(itemstack, true);
+		}
+    }
+
+    @Override
+	public Packet sendPacketData(ItemStack itemstack, World world, Player player)
+    {
+		ItemMapSavedData itemMapSavedData = getOrCreateSavedData(itemstack, world);
+        if (itemMapSavedData != null){
+			byte[] mapDataBytes = itemMapSavedData.getMapDataBytes(itemstack, world, player);
+			if(mapDataBytes == null)
+			{
+				return null;
+			} else
+			{
+				return new MapDataPacket((short)Items.MAP.id, (short)itemstack.getMetadata(), getScale(itemstack), mapDataBytes, itemMapSavedData.mapWaypoints);
+			}
+		}
+		return null;
+    }
+    
+    @Override
+    public String getTranslatedName(ItemStack itemstack) {
+		if (!hasInitialized(itemstack)) return I18n.getInstance().translateKey(itemstack.getItemKey() + ".blank.name");
+    	return super.getTranslatedName(itemstack) + " #" + itemstack.getMetadata();
+    }
+	private byte getScale(ItemStack itemStack){
+		return itemStack.getData().getByteOrDefault("scale", (byte) 3);
+	}
+	private void setScale(ItemStack itemStack, byte scale){
+		byte currentScale = getScale(itemStack);
+		while (scale < 0) scale += 5;
+		if (currentScale == scale) return;
+		scale %= 5;
+		itemStack.getData().putByte("scale", scale);
+	}
+}
diff --git a/src/main/java/net/minecraft/core/item/MinecartItem.java b/src/main/java/net/minecraft/core/item/MinecartItem.java
new file mode 100644
index 000000000..0735d2dd6
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/MinecartItem.java
@@ -0,0 +1,33 @@
+package net.minecraft.core.item;
+
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RailBlock;
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class MinecartItem extends Item {
+    public final int minecartType;
+    public MinecartItem(String name, String namespaceId, int id, int type) {
+        super(name, namespaceId, id);
+        setMaxStackSize(1);
+        minecartType = type;
+    }
+
+    @Override
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+        Block block = world.getBlock(blockX, blockY, blockZ);
+        if (!(block instanceof RailBlock)) { return false; }
+
+        if(!world.isClientSide) {
+            world.entityJoinedWorld(new MinecartEntity(world, (float) blockX + 0.5F, (float) blockY + 0.5F, (float) blockZ + 0.5F, minecartType));
+        }
+        if (entityplayer.getGamemode().consumeBlocks()) {
+            itemstack.stackSize--;
+        }
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/MusicDiscItem.java b/src/main/java/net/minecraft/core/item/MusicDiscItem.java
new file mode 100644
index 000000000..3b7f2cff8
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/MusicDiscItem.java
@@ -0,0 +1,44 @@
+package net.minecraft.core.item;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Item, World, Block, JukeboxBlock,
+//            ItemStack, Player
+
+import net.minecraft.core.block.JukeboxBlock;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.World;
+
+public class MusicDiscItem extends Item
+{
+    public final String recordName;
+    public final String recordAuthor;
+
+
+    public MusicDiscItem(String name, String namespaceId, int id, String recordName, String recordAuthor)
+    {
+        super(name, namespaceId, id);
+        this.recordName = recordName;
+        this.recordAuthor = recordAuthor;
+        maxStackSize = 1;
+    }
+
+    @Override
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    {
+        if(world.getBlockId(blockX, blockY, blockZ) == Blocks.JUKEBOX.id && world.getBlockMetadata(blockX, blockY, blockZ) == 0)
+        {
+            if (!world.isClientSide) {
+                ((JukeboxBlock) Blocks.JUKEBOX).playRecord(world, blockX, blockY, blockZ, id);
+                world.playSoundEffect(null, 1005, blockX, blockY, blockZ, id);
+                itemstack.consumeItem(entityplayer);
+            }
+            return true;
+        } else
+        {
+            return false;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemDoorPainted.java b/src/main/java/net/minecraft/core/item/PaintedDoorItem.java
similarity index 82%
rename from src/main/java/net/minecraft/core/item/ItemDoorPainted.java
rename to src/main/java/net/minecraft/core/item/PaintedDoorItem.java
index c283b0002..3219b1b5a 100644
--- a/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
+++ b/src/main/java/net/minecraft/core/item/PaintedDoorItem.java
@@ -1,19 +1,19 @@
 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.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.DyeColor;
 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);
+public class PaintedDoorItem extends DoorItem {
+    public PaintedDoorItem(String name, String namespaceId, int id, Block doorBottom, Block doorTopId) {
+        super(name, namespaceId, id, doorBottom, doorTopId);
     }
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player 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();
@@ -60,6 +60,6 @@ public class ItemDoorPainted extends ItemDoor{
     @Override
     public String getLanguageKey(ItemStack itemstack)
     {
-        return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[itemstack.getMetadata() & 0xF]).toString();
+        return super.getKey() + "." + DyeColor.colorFromItemMeta(itemstack.getMetadata()).colorID;
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemPainting.java b/src/main/java/net/minecraft/core/item/PaintingItem.java
similarity index 63%
rename from src/main/java/net/minecraft/core/item/ItemPainting.java
rename to src/main/java/net/minecraft/core/item/PaintingItem.java
index 1ee4e066b..d5bf9bcdc 100644
--- a/src/main/java/net/minecraft/core/item/ItemPainting.java
+++ b/src/main/java/net/minecraft/core/item/PaintingItem.java
@@ -2,26 +2,26 @@ package net.minecraft.core.item;
 
 
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPainting, World, ItemStack, 
-//            EntityPlayer
+//            Item, PaintingEntity, World, ItemStack,
+//            Player
 
-import net.minecraft.core.entity.EntityPainting;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.PaintingEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemPainting extends Item
+public class PaintingItem extends Item
 {
 
-    public ItemPainting(String name, int id)
+    public PaintingItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         if (!world.isClientSide && !entityplayer.isSneaking())
         {
@@ -32,7 +32,7 @@ public class ItemPainting extends Item
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int sideHit = side.getId();
         if(sideHit == 0)
@@ -56,14 +56,14 @@ public class ItemPainting extends Item
         {
             direction = 3;
         }
-        EntityPainting entity = new EntityPainting(world, blockX, blockY, blockZ, direction, entityplayer.getSelectedArt().key);
-        if(entity.canFitPainting())
+        PaintingEntity entity = new PaintingEntity(world, blockX, blockY, blockZ, direction, entityplayer.getSelectedArt().key);
+        if(entity.canStay())
         {
             if(!world.isClientSide)
             {
                 world.entityJoinedWorld(entity);
             }
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.planksOak, EnumBlockSoundEffectType.PLACE);
+            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.PLANKS_OAK, EnumBlockSoundEffectType.PLACE);
             itemstack.consumeItem(entityplayer);
         }
         return true;
diff --git a/src/main/java/net/minecraft/core/item/ItemPebble.java b/src/main/java/net/minecraft/core/item/PebbleItem.java
similarity index 58%
rename from src/main/java/net/minecraft/core/item/ItemPebble.java
rename to src/main/java/net/minecraft/core/item/PebbleItem.java
index abe1f861e..69ded824f 100644
--- a/src/main/java/net/minecraft/core/item/ItemPebble.java
+++ b/src/main/java/net/minecraft/core/item/PebbleItem.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, World, EntitySnowball, 
-//            EntityPlayer
+//            Item, ItemStack, World, SnowballProjectile,
+//            Player
 
-import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityPebble;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.PebbleProjectile;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
@@ -16,37 +16,37 @@ import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class ItemPebble
+public class PebbleItem
     extends Item
     implements IDispensable
 {
 
-    public ItemPebble(String name, int id)
+    public PebbleItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 64;
     }
 
 
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
         if(!world.isClientSide)
         {
-            world.entityJoinedWorld(new EntityPebble(world, entityplayer));
+            world.entityJoinedWorld(new PebbleProjectile(world, entityplayer));
         }
         return itemstack;
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
-        if (id != Block.overlayPebbles.id && Block.blocksList[id] != null && Block.blocksList[id].hasTag(BlockTags.PLACE_OVERWRITES))
+        if (id != Blocks.OVERLAY_PEBBLES.id && Block.blocksList[id] != null && Block.blocksList[id].hasTag(BlockTags.PLACE_OVERWRITES))
         {
             id = 0;
             meta = 0;
@@ -55,13 +55,13 @@ public class ItemPebble
         {
             return false;
         }
-        if (blockY == world.getHeightBlocks() - 1 && Block.overlayPebbles.blockMaterial.isSolid())
+        if (blockY == world.getHeightBlocks() - 1 && Blocks.OVERLAY_PEBBLES.blockMaterial.isSolid())
         {
             return false;
         }
 
         // Check if we're placing "inside" a layer
-        if (id == Block.overlayPebbles.id && side == Side.TOP)
+        if (id == Blocks.OVERLAY_PEBBLES.id && side == Side.TOP)
         {
 
             final int newMeta = meta + 1;
@@ -72,8 +72,8 @@ public class ItemPebble
 
             if (newMeta < 3)
             {
-                world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.overlayPebbles.id, newMeta);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.overlayPebbles, EnumBlockSoundEffectType.PLACE);
+                world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, newMeta);
+                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
                 itemstack.consumeItem(entityplayer);
                 return true;
             }
@@ -92,11 +92,11 @@ public class ItemPebble
         }
 
         // Check if the block we're placing into is a layer
-        if (id == Block.overlayPebbles.id)
+        if (id == Blocks.OVERLAY_PEBBLES.id)
         {
             final int newMeta = meta + 1;
 
-            final AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
+            final AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
             if (!world.checkIfAABBIsClear(bbBox) || !world.isBlockOpaqueCube(blockX, blockY - 1, blockZ))
             {
                 return false;
@@ -104,8 +104,8 @@ public class ItemPebble
 
             if (newMeta < 3)
             {
-                world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.overlayPebbles.id, newMeta);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.overlayPebbles, EnumBlockSoundEffectType.PLACE);
+                world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, newMeta);
+                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
                 itemstack.consumeItem(entityplayer);
                 return true;
             }
@@ -113,13 +113,13 @@ public class ItemPebble
         }
 
         // Regular placement, as all else fails
-        if (world.canBlockBePlacedAt(Block.overlayPebbles.id, blockX, blockY, blockZ, false, side) && world.isBlockOpaqueCube(blockX, blockY - 1, blockZ))
+        if (world.canBlockBePlacedAt(Blocks.OVERLAY_PEBBLES.id, blockX, blockY, blockZ, false, side) && world.isBlockOpaqueCube(blockX, blockY - 1, blockZ))
         {
-            final Block block = Block.overlayPebbles;
-            if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.overlayPebbles.id, getPlacedBlockMetadata(itemstack.getMetadata())))
+            final Block block = Blocks.OVERLAY_PEBBLES;
+            if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, getPlacedBlockMetadata(itemstack.getMetadata())))
             {
-                Block.overlayPebbles.onBlockPlaced(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.overlayPebbles, EnumBlockSoundEffectType.PLACE);
+                Blocks.OVERLAY_PEBBLES.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
+                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
                 itemstack.consumeItem(entityplayer);
             }
             return true;
@@ -130,8 +130,8 @@ public class ItemPebble
 
     @Override
     public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
-        EntityPebble pebble = new EntityPebble(world, x, y, z);
-        pebble.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
-        world.entityJoinedWorld(pebble);
+        PebbleProjectile pebbleProjectile = new PebbleProjectile(world, x, y, z);
+        pebbleProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+        world.entityJoinedWorld(pebbleProjectile);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemPlaceable.java b/src/main/java/net/minecraft/core/item/PlaceableItem.java
similarity index 71%
rename from src/main/java/net/minecraft/core/item/ItemPlaceable.java
rename to src/main/java/net/minecraft/core/item/PlaceableItem.java
index 02ce828c2..994e9ebc0 100644
--- a/src/main/java/net/minecraft/core/item/ItemPlaceable.java
+++ b/src/main/java/net/minecraft/core/item/PlaceableItem.java
@@ -1,26 +1,26 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
-public class ItemPlaceable extends Item {
+public class PlaceableItem extends Item {
 	
 	public Block blockToPlace;
 	
-	public ItemPlaceable(String name, int id, Block blockToPlace) {
-		super(name, id);
+	public PlaceableItem(String name, String namespaceId, int id, Block blockToPlace) {
+		super(name, namespaceId, id);
 		
 		this.blockToPlace = blockToPlace;
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -31,7 +31,7 @@ public class ItemPlaceable extends Item {
 			blockZ += side.getOffsetZ();
 		}
 		Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-		boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+		boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
 
 		if(blockY < 0 || blockY >= world.getHeightBlocks()) {
 			return false;
@@ -41,7 +41,7 @@ public class ItemPlaceable extends Item {
 				world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
 			}
 			if(world.setBlockWithNotify(blockX, blockY, blockZ, blockToPlace.id)) {
-				blockToPlace.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
+				blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
 				world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockToPlace, EnumBlockSoundEffectType.PLACE);
 			}
 			return true;
diff --git a/src/main/java/net/minecraft/core/item/ItemQuiver.java b/src/main/java/net/minecraft/core/item/QuiverItem.java
similarity index 74%
rename from src/main/java/net/minecraft/core/item/ItemQuiver.java
rename to src/main/java/net/minecraft/core/item/QuiverItem.java
index 9ca2a1c34..202b81b0c 100644
--- a/src/main/java/net/minecraft/core/item/ItemQuiver.java
+++ b/src/main/java/net/minecraft/core/item/QuiverItem.java
@@ -1,18 +1,20 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.material.ArmorMaterial;
 import net.minecraft.core.player.inventory.slot.Slot;
+import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, BlockLeaves, ItemStack,
-//            EntityLiving
+//            Mob
 
-public class ItemQuiver extends Item
+public class QuiverItem extends Item implements IArmorItem
 {
 
-    public ItemQuiver(String name, int id)
+    public QuiverItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setMaxStackSize(1);
         setMaxDamage(192);
 
@@ -24,7 +26,7 @@ public class ItemQuiver extends Item
     }
     
     @Override
-    public ItemStack onInventoryInteract(EntityPlayer player, Slot slot, ItemStack stackInSlot, boolean isItemGrabbed) {
+    public ItemStack onInventoryInteract(Player player, Slot slot, ItemStack stackInSlot, boolean isItemGrabbed) {
     	ItemStack quiverItem;
     	if(isItemGrabbed) {
     		quiverItem = player.inventory.getHeldItemStack();
@@ -41,14 +43,14 @@ public class ItemQuiver extends Item
     			// Put arrows from quiver in slot
     			int amount = Math.min(64, arrowCount);
     			if(amount > 0) {
-    				ItemStack arrowStack = new ItemStack(Item.ammoArrow, amount, 0);
+    				ItemStack arrowStack = new ItemStack(Items.AMMO_ARROW, amount, 0);
     				
-    				if(slot.canPutStackInSlot(arrowStack)) {
+    				if(slot.mayPlace(arrowStack)) {
     					setArrowCount(quiverItem, arrowCount - amount);
     					stackInSlot = arrowStack;
     				}
     			}
-    		}else if(stackInSlot != null && stackInSlot.itemID == Item.ammoArrow.id) {
+    		}else if(stackInSlot != null && stackInSlot.itemID == Items.AMMO_ARROW.id) {
     			// Put arrows from slot in quiver
     			int amount = Math.min(freeSpace, stackInSlot.stackSize);
     			if(amount > 0) {
@@ -59,7 +61,7 @@ public class ItemQuiver extends Item
     	}else {
         	ItemStack grabbedItem = player.inventory.getHeldItemStack();
         	
-        	if(grabbedItem != null && grabbedItem.itemID == Item.ammoArrow.id) {
+        	if(grabbedItem != null && grabbedItem.itemID == Items.AMMO_ARROW.id) {
         		// Put grabbed arrows into quiver
         		int amount = Math.min(grabbedItem.stackSize, freeSpace);
         		if(amount > 0) {
@@ -75,7 +77,7 @@ public class ItemQuiver extends Item
         		int amount = Math.min(64, arrowCount);
         		if(amount > 0) {
             		setArrowCount(quiverItem, arrowCount - amount);
-            		player.inventory.setHeldItemStack(new ItemStack(Item.ammoArrow, amount, 0));
+            		player.inventory.setHeldItemStack(new ItemStack(Items.AMMO_ARROW, amount, 0));
         		}
         	}
     	}
@@ -96,4 +98,13 @@ public class ItemQuiver extends Item
     	return true;
     }
 
+	@Override
+	public @Nullable ArmorMaterial getArmorMaterial() {
+		return null;
+	}
+
+	@Override
+	public int getArmorPiece() {
+		return PIECE_CHEST;
+	}
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemRope.java b/src/main/java/net/minecraft/core/item/RopeItem.java
similarity index 78%
rename from src/main/java/net/minecraft/core/item/ItemRope.java
rename to src/main/java/net/minecraft/core/item/RopeItem.java
index 1dc653271..f3dd0d599 100644
--- a/src/main/java/net/minecraft/core/item/ItemRope.java
+++ b/src/main/java/net/minecraft/core/item/RopeItem.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
-public class ItemRope extends ItemPlaceable{
-    public ItemRope(String name, int id, Block blockToPlace) {
-        super(name, id, blockToPlace);
+public class RopeItem extends PlaceableItem {
+    public RopeItem(String name, String namespaceId, int id, Block blockToPlace) {
+        super(name, namespaceId, id, blockToPlace);
     }
     @Override
-    public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(stack.stackSize <= 0) {
             return false;
         }
@@ -39,7 +39,7 @@ public class ItemRope extends ItemPlaceable{
             blockZ += side.getOffsetZ();
         }
         Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-        boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+        boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
 
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
             return false;
@@ -49,7 +49,7 @@ public class ItemRope extends ItemPlaceable{
                 world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
             }
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockToPlace.id, placeOnSide ? 0b1000_0000 : 0)) {
-                blockToPlace.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
+                blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
                 world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockToPlace, EnumBlockSoundEffectType.PLACE);
             }
             return true;
diff --git a/src/main/java/net/minecraft/core/item/SaddleItem.java b/src/main/java/net/minecraft/core/item/SaddleItem.java
new file mode 100644
index 000000000..b7642c4b1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/SaddleItem.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.item;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Item, PigMob, ItemStack, Mob
+
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.PigMob;
+import net.minecraft.core.entity.player.Player;
+
+public class SaddleItem extends Item
+{
+
+    public SaddleItem(String name, String namespaceId, int id)
+    {
+        super(name, namespaceId, id);
+        maxStackSize = 1;
+    }
+
+    @Override
+    public boolean useItemOnEntity(ItemStack itemstack, Mob entityliving, Player entityPlayer)
+    {
+        if(entityliving instanceof PigMob && itemstack.consumeItem(entityPlayer))
+        {
+            PigMob entitypig = (PigMob)entityliving;
+            if(!entitypig.getSaddled())
+            {
+                entitypig.setSaddled(true);
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemSeeds.java b/src/main/java/net/minecraft/core/item/SeedsItem.java
similarity index 58%
rename from src/main/java/net/minecraft/core/item/ItemSeeds.java
rename to src/main/java/net/minecraft/core/item/SeedsItem.java
index 3c55af613..a81fc1920 100644
--- a/src/main/java/net/minecraft/core/item/ItemSeeds.java
+++ b/src/main/java/net/minecraft/core/item/SeedsItem.java
@@ -1,28 +1,29 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemSeeds extends Item {
+public class SeedsItem extends Item {
 	private int cropsId;
 
-	public ItemSeeds(String name, int id, Block cropsBlock) {
-		super(name, id);
+	public SeedsItem(String name, String namespaceId, int id, Block cropsBlock) {
+		super(name, namespaceId, id);
 		cropsId = cropsBlock.id;
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack itemstack, Player 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(world.getBlockId(blockX, blockY - 1, blockZ) == Block.farmlandDirt.id && world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
+		if(world.getBlockId(blockX, blockY - 1, blockZ) == Blocks.FARMLAND_DIRT.id && world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
 			world.setBlockWithNotify(blockX, blockY, blockZ, cropsId);
 			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.blocksList[cropsId], EnumBlockSoundEffectType.PLACE);
 			itemstack.consumeItem(entityplayer);
diff --git a/src/main/java/net/minecraft/core/item/ItemSign.java b/src/main/java/net/minecraft/core/item/SignItem.java
similarity index 58%
rename from src/main/java/net/minecraft/core/item/ItemSign.java
rename to src/main/java/net/minecraft/core/item/SignItem.java
index a8914be56..7d80dd70c 100644
--- a/src/main/java/net/minecraft/core/item/ItemSign.java
+++ b/src/main/java/net/minecraft/core/item/SignItem.java
@@ -1,29 +1,29 @@
 package net.minecraft.core.item;
 
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.SignBlockEntity;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, World, Material, Block, 
-//            EntityPlayer, MathHelper, ItemStack, TileEntitySign
+//            Player, MathHelper, ItemStack, SignBlockEntity
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemSign extends Item
+public class SignItem extends Item
 {
 
-    public ItemSign(String name, int id)
+    public SignItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int sideHit = side.getId();
         if(side == Side.BOTTOM)
@@ -43,21 +43,21 @@ public class ItemSign extends Item
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
         	return false;
         }
-        if(!Block.signPostPlanksOak.canPlaceBlockAt(world, blockX, blockY, blockZ))
+        if(!Blocks.SIGN_POST_PLANKS_OAK.canPlaceBlockAt(world, blockX, blockY, blockZ))
         {
             return false;
         }
         if(sideHit == 1)
         {
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.signPostPlanksOak, EnumBlockSoundEffectType.PLACE);
-            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.signPostPlanksOak.id, MathHelper.floor_double((double)(((entityplayer.yRot + 180F) * 16F) / 360F) + 0.5D) & 0xf);
+            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.SIGN_POST_PLANKS_OAK, EnumBlockSoundEffectType.PLACE);
+            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.SIGN_POST_PLANKS_OAK.id, MathHelper.floor((double)(((entityplayer.yRot + 180F) * 16F) / 360F) + 0.5D) & 0xf);
         } else
         {
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.signWallPlanksOak, EnumBlockSoundEffectType.PLACE);
-            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Block.signWallPlanksOak.id, sideHit);
+            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.SIGN_WALL_PLANKS_OAK, EnumBlockSoundEffectType.PLACE);
+            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.SIGN_WALL_PLANKS_OAK.id, sideHit);
         }
         itemstack.consumeItem(entityplayer);
-        TileEntitySign tileentitysign = (TileEntitySign)world.getBlockTileEntity(blockX, blockY, blockZ);
+        SignBlockEntity tileentitysign = (SignBlockEntity)world.getBlockEntity(blockX, blockY, blockZ);
         if(tileentitysign != null)
         {
             tileentitysign.setOwner(entityplayer);
diff --git a/src/main/java/net/minecraft/core/item/ItemSnowball.java b/src/main/java/net/minecraft/core/item/SnowballItem.java
similarity index 62%
rename from src/main/java/net/minecraft/core/item/ItemSnowball.java
rename to src/main/java/net/minecraft/core/item/SnowballItem.java
index fd3ee37fb..80f1c6ba1 100644
--- a/src/main/java/net/minecraft/core/item/ItemSnowball.java
+++ b/src/main/java/net/minecraft/core/item/SnowballItem.java
@@ -1,41 +1,41 @@
 package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, World, EntitySnowball, 
-//            EntityPlayer
+//            Item, ItemStack, World, SnowballProjectile,
+//            Player
 
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntitySnowball;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.SnowballProjectile;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class ItemSnowball
+public class SnowballItem
     extends Item
     implements IDispensable
 {
 
-    public ItemSnowball(String name, int id)
+    public SnowballItem(String name, String namespaceId, int id)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 64;
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
         if(!world.isClientSide)
         {
-            world.entityJoinedWorld(new EntitySnowball(world, entityplayer));
+            world.entityJoinedWorld(new SnowballProjectile(world, entityplayer));
         }
         return itemstack;
     }
 
     @Override
     public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
-        EntitySnowball entitysnowball = new EntitySnowball(world, x, y, z);
+        SnowballProjectile entitysnowball = new SnowballProjectile(world, x, y, z);
         entitysnowball.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
         world.entityJoinedWorld(entitysnowball);
     }
diff --git a/src/main/java/net/minecraft/core/item/SoupItem.java b/src/main/java/net/minecraft/core/item/SoupItem.java
new file mode 100644
index 000000000..fe16aa866
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/SoupItem.java
@@ -0,0 +1,20 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.world.World;
+
+public class SoupItem extends FoodItem
+{
+
+    public SoupItem(String name, String namespaceId, int id, int healAmount, int ticksPerHeal)
+    {
+        super(name, namespaceId, id, healAmount, ticksPerHeal, false, 1);
+    }
+
+    @Override
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
+    {
+        ItemStack stack = super.onUseItem(itemstack, world, entityplayer);
+        return stack.stackSize <= 0 ? Items.BOWL.getDefaultStack() : stack;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/ItemWandSpawner.java b/src/main/java/net/minecraft/core/item/SpawnerWandItem.java
similarity index 72%
rename from src/main/java/net/minecraft/core/item/ItemWandSpawner.java
rename to src/main/java/net/minecraft/core/item/SpawnerWandItem.java
index f6abf76b3..019446cbd 100644
--- a/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
+++ b/src/main/java/net/minecraft/core/item/SpawnerWandItem.java
@@ -1,29 +1,27 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.HitResult;
-import net.minecraft.core.block.BlockDispenser;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.Random;
 
-public class ItemWandSpawner
+public class SpawnerWandItem
     extends Item
     implements IDispensable
 {
-    public ItemWandSpawner(String name, int id) {
-        super(name, id);
+    public SpawnerWandItem(String name, String namespaceId, int id) {
+        super(name, namespaceId, id);
     }
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer player)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player player)
     {
         if (player.gamemode != Gamemode.creative){
             player.sendTranslatedChatMessage("wand.wrongmode");
@@ -35,10 +33,10 @@ public class ItemWandSpawner
             float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
             float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
             double posX = player.xo + (player.x - player.xo) * (double) f;
-            float yOff = player instanceof EntityPlayerMP ? player.getHeightOffset() : 0;
+            float yOff = player instanceof ServerPlayer ? player.getHeightOffset() : 0;
             double posY = (player.yo + (player.y - player.yo)) + yOff;
             double posZ = player.zo + (player.z - player.zo) * (double) f;
-            Vec3d vec3d = Vec3d.createVector(posX, posY, posZ);
+            Vec3 vec3 = Vec3.getTempVec3(posX, posY, posZ);
             float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
             float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
             float f5 = -MathHelper.cos(-f1 * 0.01745329F);
@@ -47,12 +45,12 @@ public class ItemWandSpawner
             float f8 = f6;
             float f9 = f3 * f5;
             double reachDistance = player.getGamemode().getBlockReachDistance();
-            Vec3d vec3d1 = vec3d.addVector((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
-            HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1, false);
+            Vec3 vec31 = vec3.add((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
+            HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3, vec31, false);
 
             if (rayTraceResult != null){
                 if (!world.isClientSide){
-                    spawnEntity(itemstack, world, rayTraceResult.location.xCoord, rayTraceResult.location.yCoord, rayTraceResult.location.zCoord);
+                    spawnEntity(itemstack, world, rayTraceResult.location.x, rayTraceResult.location.y, rayTraceResult.location.z);
                 }
                 return itemstack;
             }
@@ -75,8 +73,8 @@ public class ItemWandSpawner
         if (entity != null){
             entity.setPos(x, y, z);
             entity.spawnInit();
-            if (itemStack.hasCustomName() && entity instanceof EntityLiving){
-                ((EntityLiving)entity).setNickname(itemStack.getCustomName());
+            if (itemStack.hasCustomName() && entity instanceof Mob){
+                ((Mob)entity).setNickname(itemStack.getCustomName());
             }
             world.entityJoinedWorld(entity);
         }
diff --git a/src/main/java/net/minecraft/core/item/ItemToolShears.java b/src/main/java/net/minecraft/core/item/ToolShearsItem.java
similarity index 59%
rename from src/main/java/net/minecraft/core/item/ItemToolShears.java
rename to src/main/java/net/minecraft/core/item/ToolShearsItem.java
index cf978f6cf..811380791 100644
--- a/src/main/java/net/minecraft/core/item/ItemToolShears.java
+++ b/src/main/java/net/minecraft/core/item/ToolShearsItem.java
@@ -3,30 +3,31 @@ package net.minecraft.core.item;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, BlockLeaves, ItemStack, 
-//            EntityLiving
+//            Mob
 
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
+import net.minecraft.core.block.Blocks;
 
-public class ItemToolShears extends Item
+public class ToolShearsItem extends Item
 {
 
-    public ItemToolShears(String name, int id, ToolMaterial material)
+    public ToolShearsItem(String name, String namespaceId, int id, ToolMaterial material)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         setMaxStackSize(1);
         setMaxDamage(material.getDurability());
     }
     
-    public void onBlockSheared(EntityLiving entity, ItemStack itemStack) {
+    public void onBlockSheared(Mob entity, ItemStack itemStack) {
     	itemStack.damageItem(1, entity);
     }
 
     @Override
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return block.hasTag(BlockTags.MINEABLE_BY_SHEARS);
     }
@@ -34,7 +35,7 @@ public class ItemToolShears extends Item
     @Override
     public float getStrVsBlock(ItemStack itemstack, Block block)
     {
-        if(block.id == Block.cobweb.id || block instanceof BlockLeavesBase)
+        if(block.id == Blocks.COBWEB.id || block instanceof BaseLeavesBlock)
         {
             return 15F;
         }
diff --git a/src/main/java/net/minecraft/core/item/UnloadedHandCannonItem.java b/src/main/java/net/minecraft/core/item/UnloadedHandCannonItem.java
new file mode 100644
index 000000000..82c8d0a37
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/UnloadedHandCannonItem.java
@@ -0,0 +1,30 @@
+package net.minecraft.core.item;
+
+// Referenced classes of package net.minecraft.src:
+//            Item, Player, InventoryPlayer, World,
+//            ArrowProjectile, ItemStack
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.world.World;
+
+public class UnloadedHandCannonItem extends Item
+{
+
+    public UnloadedHandCannonItem(String name, String namespaceId, int id)
+    {
+        super(name, namespaceId, id);
+        setMaxDamage(100);
+        maxStackSize = 1;
+    }
+
+    @Override
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
+    {
+        if (entityplayer.inventory.consumeInventoryItem(Items.AMMO_CHARGE_EXPLOSIVE.id))
+        {
+            world.playSoundAtEntity(entityplayer, entityplayer, "random.click", 1.0F, 1.9F / (itemRand.nextFloat() * 0.2F + 0.4F));
+            return new ItemStack(Items.HANDCANNON_LOADED, 1, itemstack.getMetadata(), itemstack.getData());
+        }
+        return itemstack;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java b/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
similarity index 66%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
rename to src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
index fa0e47a1a..95871617b 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
+++ b/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
@@ -1,23 +1,24 @@
 package net.minecraft.core.item.block;
 // Referenced classes of package net.minecraft.src:
-//            Item, EntityPlayer, Vec3D, MathHelper, 
+//            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Block, 
-//            EntityBoat, ItemStack
+//            BoatEntity, ItemStack
 
-import net.minecraft.core.HitResult;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
-public class ItemBlockAlgae extends ItemBlock
+public class AlgaeBlockItem extends BlockItem
 {
 
-    public ItemBlockAlgae(Block block)
+    public AlgaeBlockItem(Block block)
     {
         super(block);
         setMaxDamage(0);
@@ -25,13 +26,13 @@ public class ItemBlockAlgae extends ItemBlock
     }
     
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	return false;
     }
     
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
@@ -39,17 +40,17 @@ public class ItemBlockAlgae extends ItemBlock
         double d = entityplayer.xo + (entityplayer.x - entityplayer.xo) * (double)f;
         double d1 = (entityplayer.yo + (entityplayer.y - entityplayer.yo) * (double)f + 1.62D) - (double)entityplayer.heightOffset;
         double d2 = entityplayer.zo + (entityplayer.z - entityplayer.zo) * (double)f;
-        Vec3d vec3d = Vec3d.createVector(d, d1, d2);
-        float f3 = MathHelper.cos(-f2 * 0.01745329F - 3.141593F);
-        float f4 = MathHelper.sin(-f2 * 0.01745329F - 3.141593F);
+        Vec3 vec3 = Vec3.getTempVec3(d, d1, d2);
+        float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
+        float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
         float f5 = -MathHelper.cos(-f1 * 0.01745329F);
         float f6 = MathHelper.sin(-f1 * 0.01745329F);
         float f7 = f4 * f5;
         float f8 = f6;
         float f9 = f3 * f5;
         double d3 = 5D;
-        Vec3d vec3d1 = vec3d.addVector((double)f7 * d3, (double)f8 * d3, (double)f9 * d3);
-        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3d, vec3d1, true);
+        Vec3 vec31 = vec3.add((double)f7 * d3, (double)f8 * d3, (double)f9 * d3);
+        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3, vec31, true);
         if(movingobjectposition == null)
         {
             return itemstack;
@@ -60,7 +61,7 @@ public class ItemBlockAlgae extends ItemBlock
             int j = movingobjectposition.y;
             int k = movingobjectposition.z;
 
-            if(world.getBlockId(i, j, k) == Block.fluidWaterStill.id)
+            if(world.getBlockId(i, j, k) == Blocks.FLUID_WATER_STILL.id)
             {
                 j++;
             }
@@ -70,10 +71,10 @@ public class ItemBlockAlgae extends ItemBlock
 
             if(world.getBlockId(i, j, k) != 0)
                 return itemstack;
-            Block block = Block.blocksList[Block.algae.id];
-            if(itemstack.consumeItem(entityplayer) && world.setBlockAndMetadataWithNotify(i, j, k, Block.algae.id, 0))
+            Block block = Block.blocksList[Blocks.ALGAE.id];
+            if(itemstack.consumeItem(entityplayer) && world.setBlockAndMetadataWithNotify(i, j, k, Blocks.ALGAE.id, 0))
             {
-                block.onBlockPlaced(world, i, j, k, null, entityplayer, 0.0);
+                block.onBlockPlacedByMob(world, i, j, k, null, entityplayer, 0.0);
                 world.playBlockSoundEffect(entityplayer, i + 0.5F, j + 0.5F, k + 0.5F, block, EnumBlockSoundEffectType.PLACE);
                 entityplayer.swingItem();
             }
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlock.java b/src/main/java/net/minecraft/core/item/block/BlockItem.java
similarity index 79%
rename from src/main/java/net/minecraft/core/item/block/ItemBlock.java
rename to src/main/java/net/minecraft/core/item/block/BlockItem.java
index 6489ee451..d91d457c5 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlock.java
+++ b/src/main/java/net/minecraft/core/item/block/BlockItem.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -13,16 +13,16 @@ import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, World, ItemStack, 
-//            Material, StepSound, EntityPlayer
+//            Material, StepSound, Player
 
-public class ItemBlock extends Item
+public class BlockItem extends Item
 {
 
     protected int blockID;
 
-    public ItemBlock(Block block)
+    public BlockItem(Block block)
     {
-        super(block.id);
+        super(block.namespaceID, block.id);
         blockID = block.id;
         setKey(block.getKey());
     }
@@ -33,7 +33,7 @@ public class ItemBlock extends Item
     }
 
     @Override
-	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -43,7 +43,7 @@ public class ItemBlock extends Item
 			blockZ += side.getOffsetZ();
 		}
         Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-        boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+        boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
 
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
         	return false;
@@ -54,7 +54,7 @@ public class ItemBlock extends Item
                 world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
             }
 			if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(stack.getMetadata()))) {
-				block.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
+				block.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
 				world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
 
 			}
diff --git a/src/main/java/net/minecraft/core/item/block/BlockItemStairsPainted.java b/src/main/java/net/minecraft/core/item/block/BlockItemStairsPainted.java
new file mode 100644
index 000000000..0e8b4d768
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/block/BlockItemStairsPainted.java
@@ -0,0 +1,27 @@
+package net.minecraft.core.item.block;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
+
+public class BlockItemStairsPainted extends BlockItem
+{
+
+    public BlockItemStairsPainted(Block block)
+    {
+        super(block);
+        setMaxDamage(0);
+        setHasSubtypes(true);
+    }
+
+    @Override
+    public int getPlacedBlockMetadata(int i)
+    {
+        return i;
+    }
+
+    @Override
+    public String getLanguageKey(ItemStack itemstack) {
+        return super.getKey() + "." + DyeColor.colorFromBlockMeta((itemstack.getMetadata() & 0xF0) >> 4).colorID;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLeaves.java b/src/main/java/net/minecraft/core/item/block/ItemBlockLeaves.java
deleted file mode 100644
index c0dfd0cc2..000000000
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLeaves.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.minecraft.core.item.block;
-
-import net.minecraft.core.block.Block;
-
-public class ItemBlockLeaves extends ItemBlock
-{
-    public ItemBlockLeaves(Block block)
-    {
-        super(block);
-    }
-
-    @Override
-    public int getPlacedBlockMetadata(int i)
-    {
-        return super.getPlacedBlockMetadata(i) | 0b00000001;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockPainted.java b/src/main/java/net/minecraft/core/item/block/ItemBlockPainted.java
deleted file mode 100644
index 187337f4c..000000000
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockPainted.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.minecraft.core.item.block;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemBlock, Block, BlockCloth, ItemDye, 
-//            ItemStack
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockWool;
-import net.minecraft.core.item.ItemDye;
-import net.minecraft.core.item.ItemStack;
-
-public class ItemBlockPainted extends ItemBlock
-{
-	private boolean upperMetadata;
-	
-    public ItemBlockPainted(Block block, boolean upperMetadata)
-    {
-        super(block);
-        setMaxDamage(0);
-        setHasSubtypes(true);
-        this.upperMetadata = upperMetadata;
-    }
-
-    @Override
-    public int getPlacedBlockMetadata(int i)
-    {
-        return i;
-    }
-
-    @Override
-    public String getLanguageKey(ItemStack itemstack)
-    {
-    	if (upperMetadata)
-    	{
-    		return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[BlockWool.func_21034_c((itemstack.getMetadata() & 0xF0) >> 4)]).toString();
-    	}
-    	else
-    	{
-    		return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[BlockWool.func_21034_c(itemstack.getMetadata())]).toString();
-    	}
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockSlabPainted.java b/src/main/java/net/minecraft/core/item/block/ItemBlockSlabPainted.java
deleted file mode 100644
index 9203a7f7a..000000000
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockSlabPainted.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.minecraft.core.item.block;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemBlock, Block, BlockCloth, ItemDye, 
-//            ItemStack
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockWool;
-import net.minecraft.core.item.ItemDye;
-import net.minecraft.core.item.ItemStack;
-
-public class ItemBlockSlabPainted extends ItemBlockSlab
-{
-	private boolean upperMetadata;
-	
-    public ItemBlockSlabPainted(Block block)
-    {
-        super(block);
-        setMaxDamage(0);
-        setHasSubtypes(true);
-        this.upperMetadata = true;
-    }
-
-    @Override
-    public int getPlacedBlockMetadata(int i)
-    {
-        return i;
-    }
-
-    @Override
-    public String getLanguageKey(ItemStack itemstack)
-    {
-    	if (upperMetadata)
-    	{
-    		return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[BlockWool.func_21034_c((itemstack.getMetadata() & 0xF0) >> 4)]).toString();
-    	}
-    	else
-    	{
-    		return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[BlockWool.func_21034_c(itemstack.getMetadata())]).toString();
-    	}
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockStairsPainted.java b/src/main/java/net/minecraft/core/item/block/ItemBlockStairsPainted.java
deleted file mode 100644
index 985817113..000000000
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockStairsPainted.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package net.minecraft.core.item.block;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemBlock, Block, BlockCloth, ItemDye,
-//            ItemStack
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockWool;
-import net.minecraft.core.item.ItemDye;
-import net.minecraft.core.item.ItemStack;
-
-public class ItemBlockStairsPainted extends ItemBlock
-{
-
-    public ItemBlockStairsPainted(Block block)
-    {
-        super(block);
-        setMaxDamage(0);
-        setHasSubtypes(true);
-    }
-
-    @Override
-    public int getPlacedBlockMetadata(int i)
-    {
-        return i;
-    }
-
-    @Override
-    public String getLanguageKey(ItemStack itemstack)
-    {
-        return (new StringBuilder()).append(super.getKey()).append(".").append(ItemDye.dyeColors[BlockWool.func_21034_c((itemstack.getMetadata() & 0xF0) >> 4)]).toString();
-    }
-}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java b/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
similarity index 54%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java
rename to src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
index 4fde46643..f0e9a6904 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java
+++ b/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.block.BlockLadder;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.LadderBlock;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -11,25 +11,25 @@ import net.minecraft.core.world.World;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
-public class ItemBlockLadder extends ItemBlock {
+public class LadderBlockItem extends BlockItem {
 
-	private BlockLadder blockLadder;
+	private LadderBlock ladderBlock;
 	
-	public ItemBlockLadder(BlockLadder block) {
+	public LadderBlockItem(LadderBlock block) {
 		super(block);
 		
-		this.blockLadder = block;
+		this.ladderBlock = block;
 	}
 	
 	@Override
-	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		Block clickedBlock = world.getBlock(x, y, z);
 		
-		if(clickedBlock == blockLadder && !player.isSneaking()) {
-			Side clickedLadderSide = blockLadder.getSideFromMeta(world.getBlockMetadata(x, y, z));
-			while(world.getBlock(x, y, z) == blockLadder && blockLadder.getSideFromMeta(world.getBlockMetadata(x, y, z)) == clickedLadderSide) y--;
-			int meta = blockLadder.getMetaForSide(clickedLadderSide);
-			if(blockLadder.canExistAt(world, x, y, z, meta)) {
+		if(clickedBlock == ladderBlock && !player.isSneaking()) {
+			Side clickedLadderSide = ladderBlock.getSideFromMeta(world.getBlockMetadata(x, y, z));
+			while(world.getBlock(x, y, z) == ladderBlock && ladderBlock.getSideFromMeta(world.getBlockMetadata(x, y, z)) == clickedLadderSide) y--;
+			int meta = ladderBlock.getMetaForSide(clickedLadderSide);
+			if(ladderBlock.canExistAt(world, x, y, z, meta)) {
 				return placeBlock(world, x, y, z, meta, player, stack, clickedLadderSide, 0.5);
 			}
 			
@@ -42,28 +42,28 @@ public class ItemBlockLadder extends ItemBlock {
 			z += side.getOffsetZ();
 		}
 		
-		Side sideForPlacement = blockLadder.getSideForPlacement(world, x, y, z, side);
+		Side sideForPlacement = ladderBlock.getSideForPlacement(world, x, y, z, side);
 		if(sideForPlacement == null) {
 			return false;
 		}
 		
-		int meta = blockLadder.getMetaForSide(sideForPlacement);
-		if(blockLadder.canExistAt(world, x, y, z, meta)) {
+		int meta = ladderBlock.getMetaForSide(sideForPlacement);
+		if(ladderBlock.canExistAt(world, x, y, z, meta)) {
 			return placeBlock(world, x, y, z, meta, player, stack, sideForPlacement, yPlaced);
 		}
 		
 		return false;
 	}
 	
-	public boolean placeBlock(World world, int x, int y, int z, int meta, EntityPlayer player, ItemStack stack, Side side, double sideHeight) {
+	public boolean placeBlock(World world, int x, int y, int z, int meta, Player player, ItemStack stack, Side side, double sideHeight) {
 		Block currentBlock = world.getBlock(x, y, z);
 		if(world.canPlaceInsideBlock(x, y, z) && world.canBlockBePlacedAt(blockID, x, y, z, false, side) && stack.consumeItem(player)) {
-			if (currentBlock != null && !(currentBlock instanceof BlockFluid) && !world.isClientSide){
+			if (currentBlock != null && !(currentBlock instanceof FluidBlock) && !world.isClientSide){
 				world.playSoundEffect(EVENT_BLOCK_BREAK, x, y, z, world.getBlockId(x, y, z));
 			}
 			if(world.setBlockAndMetadataWithNotify(x, y, z, blockID, meta)) {
-				Block.getBlock(blockID).onBlockPlaced(world, x, y, z, side, player, sideHeight);
-				world.playBlockSoundEffect(player, x + 0.5f, y + 0.5f, z + 0.5f, blockLadder, EnumBlockSoundEffectType.PLACE);
+				Block.getBlock(blockID).onBlockPlacedByMob(world, x, y, z, side, player, sideHeight);
+				world.playBlockSoundEffect(player, x + 0.5f, y + 0.5f, z + 0.5f, ladderBlock, EnumBlockSoundEffectType.PLACE);
 				return true;
 			}
 		}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLamp.java b/src/main/java/net/minecraft/core/item/block/LampBlockItem.java
similarity index 57%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockLamp.java
rename to src/main/java/net/minecraft/core/item/block/LampBlockItem.java
index 7cd68a24a..7ae72fe8b 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLamp.java
+++ b/src/main/java/net/minecraft/core/item/block/LampBlockItem.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLamp;
-import net.minecraft.core.item.ItemDye;
+import net.minecraft.core.block.LampBlock;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
 
-public class ItemBlockLamp extends ItemBlock
+public class LampBlockItem extends BlockItem
 {
 
-    public ItemBlockLamp(Block block)
+    public LampBlockItem(Block block)
     {
         super(block);
         setMaxDamage(0);
@@ -24,6 +24,6 @@ public class ItemBlockLamp extends ItemBlock
     @Override
     public String getLanguageKey(ItemStack itemstack)
     {
-        return super.getKey() + "." + ItemDye.dyeColors[BlockLamp.getMetadataForColour(itemstack.getMetadata())];
+        return super.getKey() + "." + DyeColor.colorFromBlockMeta(itemstack.getMetadata()).colorID;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java b/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
similarity index 78%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java
rename to src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
index 844e1d42b..3ccbb592f 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java
+++ b/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
@@ -2,14 +2,13 @@ package net.minecraft.core.item.block;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, World, ItemStack,
-//            Material, StepSound, EntityPlayer
+//            Material, StepSound, Player
 
-import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.block.BlockLayerBase;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.BaseLayerBlock;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -19,15 +18,15 @@ import net.minecraft.core.world.World;
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
 
-public class ItemBlockLayer extends ItemBlock
+public class LayerBlockItem extends BlockItem
 {
-	public ItemBlockLayer(Block block)
+	public LayerBlockItem(Block block)
 	{
 		super(block);
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final Player entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -49,11 +48,11 @@ public class ItemBlockLayer extends ItemBlock
 		if (id == blockID && side == Side.TOP)
 		{
 
-			final BlockLayerBase blockLayer = (BlockLayerBase) Block.blocksList[blockID];
+			final BaseLayerBlock blockLayer = (BaseLayerBlock) Block.blocksList[blockID];
 
 			final int newMeta = meta + 1;
 
-			final AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
+			final AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
 			if (!world.checkIfAABBIsClear(bbBox))
 			{
 				return false;
@@ -94,11 +93,11 @@ public class ItemBlockLayer extends ItemBlock
 		if (id == blockID)
 		{
 
-			final BlockLayerBase blockLayer = (BlockLayerBase) Block.blocksList[blockID];
+			final BaseLayerBlock blockLayer = (BaseLayerBlock) Block.blocksList[blockID];
 
 			final int newMeta = meta + 1;
 
-			final AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
+			final AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
 			if (!world.checkIfAABBIsClear(bbBox))
 			{
 				return false;
@@ -129,13 +128,13 @@ public class ItemBlockLayer extends ItemBlock
 		{
 			final Block block = Block.blocksList[blockID];
 			Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-			boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+			boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
 			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(itemstack.getMetadata())))
 			{
 				if (placedInside && !world.isClientSide){
 					world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
 				}
-				Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
+				Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
 				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
 				itemstack.consumeItem(entityplayer);
 			}
diff --git a/src/main/java/net/minecraft/core/item/block/LeavesBlockItem.java b/src/main/java/net/minecraft/core/item/block/LeavesBlockItem.java
new file mode 100644
index 000000000..ac574477f
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/block/LeavesBlockItem.java
@@ -0,0 +1,18 @@
+package net.minecraft.core.item.block;
+
+import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.block.Block;
+
+public class LeavesBlockItem extends BlockItem
+{
+    public LeavesBlockItem(Block block)
+    {
+        super(block);
+    }
+
+    @Override
+    public int getPlacedBlockMetadata(int i)
+    {
+        return BaseLeavesBlock.setPermanent(super.getPlacedBlockMetadata(i), true);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java b/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
similarity index 70%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java
rename to src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
index 22bd7337f..8d69ece0b 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java
+++ b/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
@@ -2,14 +2,13 @@
 package net.minecraft.core.item.block;
 
 
-import net.minecraft.core.Global;
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.block.BlockLayerBase;
-import net.minecraft.core.block.BlockLayerLeaves;
-import net.minecraft.core.block.BlockLeavesBase;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.BaseLayerBlock;
+import net.minecraft.core.block.LeavesLayerBlock;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -18,15 +17,15 @@ import net.minecraft.core.world.World;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
-public class ItemBlockLayerLeaves extends ItemBlock
+public class LeavesLayerBlockItem extends BlockItem
 {
-	public ItemBlockLayerLeaves(Block block)
+	public LeavesLayerBlockItem(Block block)
 	{
 		super(block);
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final Player entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -48,11 +47,11 @@ public class ItemBlockLayerLeaves extends ItemBlock
 		if (id == blockID && side == Side.TOP)
 		{
 
-			final BlockLayerBase blockLayer = (BlockLayerBase) Block.blocksList[blockID];
+			final BaseLayerBlock blockLayer = (BaseLayerBlock) Block.blocksList[blockID];
 
 			final int newMeta = meta + 1;
 
-			final AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
+			final AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
 			if (!world.checkIfAABBIsClear(bbBox))
 			{
 				return false;
@@ -60,17 +59,17 @@ public class ItemBlockLayerLeaves extends ItemBlock
 
 			if ((newMeta & 0b00001111) < 7)
 			{
-				world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, BlockLayerLeaves.setPermanent(newMeta, true));
+				world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, LeavesLayerBlock.setPermanent(newMeta, true));
 			}
 			else
 			{
 				if (blockLayer.fullBlockID != -1)
 				{
-					world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockLayer.fullBlockID, BlockLeavesBase.setPermanent(0, true));
+					world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockLayer.fullBlockID, BaseLeavesBlock.setPermanent(0, true));
 				}
 				else
 				{
-					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, BlockLayerLeaves.setPermanent(0, true));
+					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, LeavesLayerBlock.setPermanent(0, true));
 				}
 			}
 			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
@@ -93,11 +92,11 @@ public class ItemBlockLayerLeaves extends ItemBlock
 		if (id == blockID)
 		{
 
-			final BlockLayerBase blockLayer = (BlockLayerBase) Block.blocksList[blockID];
+			final BaseLayerBlock blockLayer = (BaseLayerBlock) Block.blocksList[blockID];
 
 			final int newMeta = meta + 1;
 
-			final AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
+			final AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1f, blockY + (2 * (newMeta + 1)) / 16.0f, blockZ + 1f);
 			if (!world.checkIfAABBIsClear(bbBox))
 			{
 				return false;
@@ -105,17 +104,17 @@ public class ItemBlockLayerLeaves extends ItemBlock
 
 			if ((newMeta & 0b00001111) < 7)
 			{
-				world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, BlockLayerLeaves.setPermanent(newMeta, true));
+				world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, LeavesLayerBlock.setPermanent(newMeta, true));
 			}
 			else
 			{
 				if (blockLayer.fullBlockID != -1)
 				{
-					world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockLayer.fullBlockID, BlockLeavesBase.setPermanent(0, true));
+					world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockLayer.fullBlockID, BaseLeavesBlock.setPermanent(0, true));
 				}
 				else
 				{
-					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, BlockLayerLeaves.setPermanent(0, true));
+					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, LeavesLayerBlock.setPermanent(0, true));
 				}
 			}
 			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
@@ -128,13 +127,13 @@ public class ItemBlockLayerLeaves extends ItemBlock
 		{
 			final Block block = Block.blocksList[blockID];
 			Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-			boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
-			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, BlockLayerLeaves.setPermanent(getPlacedBlockMetadata(itemstack.getMetadata()), true)))
+			boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
+			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, LeavesLayerBlock.setPermanent(getPlacedBlockMetadata(itemstack.getMetadata()), true)))
 			{
 				if (placedInside && !world.isClientSide){
 					world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
 				}
-				Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
+				Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
 				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
 				itemstack.consumeItem(entityplayer);
 			}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockChestLegacy.java b/src/main/java/net/minecraft/core/item/block/LegacyChestBlockItem.java
similarity index 65%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockChestLegacy.java
rename to src/main/java/net/minecraft/core/item/block/LegacyChestBlockItem.java
index b0bea6015..3bf3a0c9b 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockChestLegacy.java
+++ b/src/main/java/net/minecraft/core/item/block/LegacyChestBlockItem.java
@@ -3,9 +3,9 @@ package net.minecraft.core.item.block;
 import net.minecraft.core.block.Block;
 
 @Deprecated
-public class ItemBlockChestLegacy extends ItemBlock{
+public class LegacyChestBlockItem extends BlockItem {
 
-	public ItemBlockChestLegacy(Block block) {
+	public LegacyChestBlockItem(Block block) {
 		super(block);
 	}
 	
diff --git a/src/main/java/net/minecraft/core/item/block/PaintedBlockItem.java b/src/main/java/net/minecraft/core/item/block/PaintedBlockItem.java
new file mode 100644
index 000000000..2114d28ab
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/block/PaintedBlockItem.java
@@ -0,0 +1,44 @@
+package net.minecraft.core.item.block;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BlockItem, Block, BlockCloth, DyeItem,
+//            ItemStack
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.WoolBlock;
+import net.minecraft.core.item.DyeItem;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
+
+public class PaintedBlockItem extends BlockItem
+{
+	private final boolean upperMetadata;
+	
+    public PaintedBlockItem(Block block, boolean upperMetadata)
+    {
+        super(block);
+        setMaxDamage(0);
+        setHasSubtypes(true);
+        this.upperMetadata = upperMetadata;
+    }
+
+    @Override
+    public int getPlacedBlockMetadata(int i)
+    {
+        return i;
+    }
+
+    @Override
+    public String getLanguageKey(ItemStack itemstack)
+    {
+    	if (upperMetadata)
+    	{
+    		return super.getKey() + "." + DyeColor.colorFromBlockMeta((itemstack.getMetadata() & 0xF0) >> 4).colorID;
+    	}
+    	else
+    	{
+    		return super.getKey() + "." + DyeColor.colorFromBlockMeta(itemstack.getMetadata() & 0xF).colorID;
+    	}
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/block/PaintedSlabBlockItem.java b/src/main/java/net/minecraft/core/item/block/PaintedSlabBlockItem.java
new file mode 100644
index 000000000..072e58c9c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/block/PaintedSlabBlockItem.java
@@ -0,0 +1,44 @@
+package net.minecraft.core.item.block;
+
+
+// Referenced classes of package net.minecraft.src:
+//            BlockItem, Block, BlockCloth, DyeItem,
+//            ItemStack
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.WoolBlock;
+import net.minecraft.core.item.DyeItem;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
+
+public class PaintedSlabBlockItem extends SlabBlockItem
+{
+	private final boolean upperMetadata;
+	
+    public PaintedSlabBlockItem(Block block)
+    {
+        super(block);
+        setMaxDamage(0);
+        setHasSubtypes(true);
+        this.upperMetadata = true;
+    }
+
+    @Override
+    public int getPlacedBlockMetadata(int i)
+    {
+        return i;
+    }
+
+    @Override
+    public String getLanguageKey(ItemStack itemstack)
+    {
+        if (upperMetadata)
+        {
+            return super.getKey() + "." + DyeColor.colorFromBlockMeta((itemstack.getMetadata() & 0xF0) >> 4).colorID;
+        }
+        else
+        {
+            return super.getKey() + "." + DyeColor.colorFromBlockMeta(itemstack.getMetadata() & 0xF).colorID;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockPiston.java b/src/main/java/net/minecraft/core/item/block/PistonBlockItem.java
similarity index 70%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockPiston.java
rename to src/main/java/net/minecraft/core/item/block/PistonBlockItem.java
index 34836bbaf..47d747497 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockPiston.java
+++ b/src/main/java/net/minecraft/core/item/block/PistonBlockItem.java
@@ -2,14 +2,14 @@ package net.minecraft.core.item.block;
 
 
 // Referenced classes of package net.minecraft.src:
-//            ItemBlock
+//            BlockItem
 
 import net.minecraft.core.block.Block;
 
-public class ItemBlockPiston extends ItemBlock
+public class PistonBlockItem extends BlockItem
 {
 
-    public ItemBlockPiston(Block block)
+    public PistonBlockItem(Block block)
     {
         super(block);
     }
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java b/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
similarity index 81%
rename from src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java
rename to src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
index f5f72bd45..741b98835 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java
+++ b/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
@@ -1,10 +1,9 @@
 package net.minecraft.core.item.block;
 
-import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
+import net.minecraft.core.block.FluidBlock;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
@@ -12,22 +11,16 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Item, Block, World, ItemStack, 
-//            Material, StepSound, EntityPlayer
-
-public class ItemBlockSlab extends ItemBlock
+public class SlabBlockItem extends BlockItem
 {
 
-    public ItemBlockSlab(Block block)
+    public SlabBlockItem(Block block)
     {
         super(block);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int id = world.getBlockId(blockX, blockY, blockZ);
     	int meta = world.getBlockMetadata(blockX, blockY, blockZ) & 0x3;
@@ -51,7 +44,7 @@ public class ItemBlockSlab extends ItemBlock
         {
         	if ((side == Side.TOP && meta == 0) || (side == Side.BOTTOM && meta == 2))
         	{
-                AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX +1f, blockY +1f, blockZ +1f);
+                AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX +1f, blockY +1f, blockZ +1f);
                 if(!world.checkIfAABBIsClear(bbBox))
                     return false;
 
@@ -79,7 +72,7 @@ public class ItemBlockSlab extends ItemBlock
         {
         	if ((yPlaced > 0.5f && meta == 0) || (yPlaced <= 0.5f && meta == 2) || (side == Side.BOTTOM && meta == 0) || (side == Side.TOP && meta == 2))
         	{
-                AABB bbBox = AABB.getBoundingBoxFromPool(blockX, blockY, blockZ, blockX +1f, blockY +1f, blockZ +1f);
+                AABB bbBox = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX +1f, blockY +1f, blockZ +1f);
                 if(!world.checkIfAABBIsClear(bbBox))
                     return false;
 
@@ -96,13 +89,13 @@ public class ItemBlockSlab extends ItemBlock
         {
             Block block = Block.blocksList[blockID];
             Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-            boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+            boolean placedInside = currentBlock != null && !(currentBlock instanceof FluidBlock);
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(itemstack.getMetadata())))
             {
                 if (placedInside && !world.isClientSide){
                     world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
                 }
-            	Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
+            	Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
                 world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
                 itemstack.consumeItem(entityplayer);
             }
diff --git a/src/main/java/net/minecraft/core/item/material/ArmorMaterial.java b/src/main/java/net/minecraft/core/item/material/ArmorMaterial.java
index 36e513964..d3dd6792a 100644
--- a/src/main/java/net/minecraft/core/item/material/ArmorMaterial.java
+++ b/src/main/java/net/minecraft/core/item/material/ArmorMaterial.java
@@ -27,13 +27,11 @@ public class ArmorMaterial {
 
 	public final NamespaceID identifier;
 	public final int durability;
-	public final int renderIndex;
 	
 	private final Map<DamageType, Float> protection = new HashMap<>();
 	
-	public ArmorMaterial(NamespaceID identifier, int renderIndex, int durability) {
+	public ArmorMaterial(NamespaceID identifier, int durability) {
 		this.identifier = identifier;
-		this.renderIndex = renderIndex;
 		this.durability = durability;
 
 		ARMOR_MATERIALS.add(this);
@@ -52,37 +50,37 @@ public class ArmorMaterial {
 		return this;
 	}
 	
-	public static final ArmorMaterial LEATHER = register(new ArmorMaterial(new NamespaceID("minecraft", "cloth"), 0, 180)
+	public static final ArmorMaterial LEATHER = register(new ArmorMaterial(new NamespaceID("minecraft", "cloth"), 180)
 		.withProtectionPercentage(COMBAT, 20.0f)
 		.withProtectionPercentage(BLAST, 20.0f)
 		.withProtectionPercentage(FIRE, 20.0f)
 		.withProtectionPercentage(FALL, 120.0f)
 	);
-	public static final ArmorMaterial CHAINMAIL = register(new ArmorMaterial(new NamespaceID("minecraft", "chain"), 1, 240)
+	public static final ArmorMaterial CHAINMAIL = register(new ArmorMaterial(new NamespaceID("minecraft", "chain"), 240)
 		.withProtectionPercentage(COMBAT, 120.0f)
 		.withProtectionPercentage(BLAST, 35.0f)
 		.withProtectionPercentage(FIRE, 35.0f)
 		.withProtectionPercentage(FALL, 35.0f)
 	);
-	public static final ArmorMaterial IRON = register(new ArmorMaterial(new NamespaceID("minecraft", "iron"), 2, 200)
+	public static final ArmorMaterial IRON = register(new ArmorMaterial(new NamespaceID("minecraft", "iron"), 200)
 		.withProtectionPercentage(COMBAT, 45.0f)
 		.withProtectionPercentage(BLAST, 45.0f)
 		.withProtectionPercentage(FIRE, 45.0f)
 		.withProtectionPercentage(FALL, 45.0f)
 	);
-	public static final ArmorMaterial GOLD = register(new ArmorMaterial(new NamespaceID("minecraft", "gold"), 4, 120)
+	public static final ArmorMaterial GOLD = register(new ArmorMaterial(new NamespaceID("minecraft", "gold"), 120)
 		.withProtectionPercentage(COMBAT, 70.0f)
 		.withProtectionPercentage(BLAST, 70.0f)
 		.withProtectionPercentage(FIRE, 70.0f)
 		.withProtectionPercentage(FALL, 70.0f)
 	);
-	public static final ArmorMaterial DIAMOND = register(new ArmorMaterial(new NamespaceID("minecraft", "diamond"), 3, 800)
+	public static final ArmorMaterial DIAMOND = register(new ArmorMaterial(new NamespaceID("minecraft", "diamond"), 800)
 		.withProtectionPercentage(COMBAT, 66.0f)
 		.withProtectionPercentage(BLAST, 66.0f)
 		.withProtectionPercentage(FIRE, 124.0f)
 		.withProtectionPercentage(FALL, 66.0f)
 	);
-	public static final ArmorMaterial STEEL = register(new ArmorMaterial(new NamespaceID("minecraft", "steel"), 5, 1200)
+	public static final ArmorMaterial STEEL = register(new ArmorMaterial(new NamespaceID("minecraft", "steel"), 1200)
 		.withProtectionPercentage(COMBAT, 55.0f)
 		.withProtectionPercentage(BLAST, 150.0f)
 		.withProtectionPercentage(FIRE, 55.0f)
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 7114b752b..66e2e1847 100644
--- a/src/main/java/net/minecraft/core/item/tag/ItemTags.java
+++ b/src/main/java/net/minecraft/core/item/tag/ItemTags.java
@@ -2,6 +2,7 @@ package net.minecraft.core.item.tag;
 
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java b/src/main/java/net/minecraft/core/item/tool/AxeToolItem.java
similarity index 61%
rename from src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java
rename to src/main/java/net/minecraft/core/item/tool/AxeToolItem.java
index a5847e3f0..12ce33833 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java
+++ b/src/main/java/net/minecraft/core/item/tool/AxeToolItem.java
@@ -1,37 +1,37 @@
 package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLog;
+import net.minecraft.core.block.LogBlock;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.data.gamerule.TreecapitatorHelper;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemToolAxe extends ItemTool
+public class AxeToolItem extends ToolItem
 {
 
-    public ItemToolAxe(String name, int id, ToolMaterial enumtoolmaterial)
+    public AxeToolItem(String name, String namespaceId, int id, ToolMaterial enumtoolmaterial)
     {
-        super(name, id, 3, enumtoolmaterial, BlockTags.MINEABLE_BY_AXE);
+        super(name, namespaceId, id, 3, enumtoolmaterial, BlockTags.MINEABLE_BY_AXE);
     }
 
     @Override
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return block.hasTag(BlockTags.MINEABLE_BY_AXE);
     }
     
     @Override
-    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, Player player)
     {
     	if(!world.isClientSide && world.getGameRuleValue(GameRules.TREECAPITATOR) && !player.isSneaking()) {
     		int id = world.getBlockId(x, y, z);
-    		if(Block.getBlock(id) instanceof BlockLog) {
+    		if(Block.getBlock(id) instanceof LogBlock) {
             	return !new TreecapitatorHelper(world, x, y, z, player).chopTree();
     		}
     	}
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java b/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
similarity index 61%
rename from src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
rename to src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
index 24b69dcaa..293c65566 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
+++ b/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
@@ -1,11 +1,13 @@
 package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.util.helper.Side;
@@ -13,39 +15,39 @@ import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, EnumToolMaterial, World, Block, 
-//            BlockGrass, StepSound, ItemStack, EntityPlayer
+//            GrassBlock, StepSound, ItemStack, Player
 
-public class ItemToolHoe extends ItemTool
+public class HoeToolItem extends ToolItem
 {
-    public ItemToolHoe(String name, int id, ToolMaterial enumtoolmaterial)
+    public HoeToolItem(String name, String namespaceId, int id, ToolMaterial enumtoolmaterial)
     {
-        super(name, id, 3, enumtoolmaterial, BlockTags.MINEABLE_BY_HOE);
+        super(name, namespaceId, id, 3, enumtoolmaterial, BlockTags.MINEABLE_BY_HOE);
         maxStackSize = 1;
         setMaxDamage(enumtoolmaterial.getDurability());
     }
 
     @Override
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return block.hasTag(BlockTags.MINEABLE_BY_HOE);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
-        if(side != Side.BOTTOM && j1 == 0 && (id == Block.grass.id || id == Block.dirt.id || id == Block.pathDirt.id || id == Block.grassRetro.id || id == Block.mud.id))
+        if(side != Side.BOTTOM && j1 == 0 && (id == Blocks.GRASS.id || id == Blocks.DIRT.id || id == Blocks.PATH_DIRT.id || id == Blocks.GRASS_RETRO.id || id == Blocks.MUD.id))
         {
             int meta = 0;
-            if(id == Block.mud.id)
+            if(id == Blocks.MUD.id)
                 meta = 1;
-            Block block = Block.farmlandDirt;
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.dirt, EnumBlockSoundEffectType.MINE);
+            Block block = Blocks.FARMLAND_DIRT;
+            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.DIRT, EnumBlockSoundEffectType.MINE);
             if(!world.isClientSide) {
-                if(id == Block.grass.id || id == Block.grassRetro.id || id == Block.grassScorched.id) {
+                if(id == Blocks.GRASS.id || id == Blocks.GRASS_RETRO.id || id == Blocks.GRASS_SCORCHED.id) {
                 	if(world.rand.nextInt(5) == 0) {
-                		world.dropItem(blockX, blockY + 1, blockZ, new ItemStack(Item.seedsWheat));
+                		world.dropItem(blockX, blockY + 1, blockZ, new ItemStack(Items.SEEDS_WHEAT));
                 	}
                 }
             }
@@ -65,15 +67,15 @@ public class ItemToolHoe extends ItemTool
     }
     
     @Override
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int id, int x, int y, int z, Side side, EntityLiving entity) {
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int id, int x, int y, int z, Side side, Mob entity) {
     	if(entity != null && !entity.world.isClientSide) {
-        	if(id == Block.tallgrass.id || id == Block.tallgrassFern.id) {
+        	if(id == Blocks.TALLGRASS.id || id == Blocks.TALLGRASS_FERN.id) {
         		if(this.material.isSilkTouch()) {
         			entity.world.dropItem(x, y, z, new ItemStack(Item.itemsList[id]));
             		itemstack.damageItem(1, entity);
         		}else {
         			if(entity.world.rand.nextInt(4) == 0) {
-            			entity.world.dropItem(x, y, z, new ItemStack(Item.seedsWheat));
+            			entity.world.dropItem(x, y, z, new ItemStack(Items.SEEDS_WHEAT));
                 		itemstack.damageItem(1, entity);	
         			}
         		}
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java b/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java
deleted file mode 100644
index 0aced0924..000000000
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolPickaxe.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package net.minecraft.core.item.tool;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.material.ToolMaterial;
-
-public class ItemToolPickaxe extends ItemTool {
-	
-	public static Map<Block, Integer> miningLevels = new HashMap<>();
-	
-	static {
-		miningLevels.put(Block.obsidian, 3);
-		
-		miningLevels.put(Block.blockDiamond, 2);
-		miningLevels.put(Block.oreDiamondStone, 2);
-		miningLevels.put(Block.oreDiamondBasalt, 2);
-		miningLevels.put(Block.oreDiamondGranite, 2);
-		miningLevels.put(Block.oreDiamondLimestone, 2);
-		
-		miningLevels.put(Block.blockGold, 2);
-		miningLevels.put(Block.oreGoldStone, 2);
-		miningLevels.put(Block.oreGoldBasalt, 2);
-		miningLevels.put(Block.oreGoldGranite, 2);
-		miningLevels.put(Block.oreGoldLimestone, 2);
-		
-		miningLevels.put(Block.blockIron, 1);
-		miningLevels.put(Block.oreIronStone, 1);
-		miningLevels.put(Block.oreIronBasalt, 1);
-		miningLevels.put(Block.oreIronGranite, 1);
-		miningLevels.put(Block.oreIronLimestone, 1);
-		
-		miningLevels.put(Block.blockSteel, 2);
-		
-		miningLevels.put(Block.oreNethercoalNetherrack, 2);
-		
-		miningLevels.put(Block.blockLapis, 1);
-		miningLevels.put(Block.oreLapisStone, 1);
-		miningLevels.put(Block.oreLapisBasalt, 1);
-		miningLevels.put(Block.oreLapisGranite, 1);
-		miningLevels.put(Block.oreLapisLimestone, 1);
-		
-		miningLevels.put(Block.blockRedstone, 2);
-		miningLevels.put(Block.oreRedstoneStone, 2);
-		miningLevels.put(Block.oreRedstoneBasalt, 2);
-		miningLevels.put(Block.oreRedstoneGranite, 2);
-		miningLevels.put(Block.oreRedstoneLimestone, 2);
-		miningLevels.put(Block.oreRedstoneGlowingStone, 2);
-		miningLevels.put(Block.oreRedstoneGlowingBasalt, 2);
-		miningLevels.put(Block.oreRedstoneGlowingGranite, 2);
-		miningLevels.put(Block.oreRedstoneGlowingLimestone, 2);
-	}
-	
-	public ItemToolPickaxe(String name, int id, ToolMaterial enumtoolmaterial) {
-		super(name, id, 2, enumtoolmaterial, BlockTags.MINEABLE_BY_PICKAXE);
-	}
-
-	@Override
-	public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
-	{
-		Integer miningLevel = miningLevels.get(block);
-		if(miningLevel != null) return material.getMiningLevel() >= miningLevel;
-		
-		return block.hasTag(BlockTags.MINEABLE_BY_PICKAXE);
-	}
-}
diff --git a/src/main/java/net/minecraft/core/item/tool/PickaxeToolItem.java b/src/main/java/net/minecraft/core/item/tool/PickaxeToolItem.java
new file mode 100644
index 000000000..9a78639d1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/tool/PickaxeToolItem.java
@@ -0,0 +1,71 @@
+package net.minecraft.core.item.tool;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.material.ToolMaterial;
+
+public class PickaxeToolItem extends ToolItem {
+	
+	public static Map<Block, Integer> miningLevels = new HashMap<>();
+	
+	static {
+		miningLevels.put(Blocks.OBSIDIAN, 3);
+		
+		miningLevels.put(Blocks.BLOCK_DIAMOND, 2);
+		miningLevels.put(Blocks.ORE_DIAMOND_STONE, 2);
+		miningLevels.put(Blocks.ORE_DIAMOND_BASALT, 2);
+		miningLevels.put(Blocks.ORE_DIAMOND_GRANITE, 2);
+		miningLevels.put(Blocks.ORE_DIAMOND_LIMESTONE, 2);
+		
+		miningLevels.put(Blocks.BLOCK_GOLD, 2);
+		miningLevels.put(Blocks.ORE_GOLD_STONE, 2);
+		miningLevels.put(Blocks.ORE_GOLD_BASALT, 2);
+		miningLevels.put(Blocks.ORE_GOLD_GRANITE, 2);
+		miningLevels.put(Blocks.ORE_GOLD_LIMESTONE, 2);
+		
+		miningLevels.put(Blocks.BLOCK_IRON, 1);
+		miningLevels.put(Blocks.ORE_IRON_STONE, 1);
+		miningLevels.put(Blocks.ORE_IRON_BASALT, 1);
+		miningLevels.put(Blocks.ORE_IRON_GRANITE, 1);
+		miningLevels.put(Blocks.ORE_IRON_LIMESTONE, 1);
+		
+		miningLevels.put(Blocks.BLOCK_STEEL, 2);
+		
+		miningLevels.put(Blocks.ORE_NETHERCOAL_NETHERRACK, 2);
+		
+		miningLevels.put(Blocks.BLOCK_LAPIS, 1);
+		miningLevels.put(Blocks.ORE_LAPIS_STONE, 1);
+		miningLevels.put(Blocks.ORE_LAPIS_BASALT, 1);
+		miningLevels.put(Blocks.ORE_LAPIS_GRANITE, 1);
+		miningLevels.put(Blocks.ORE_LAPIS_LIMESTONE, 1);
+		
+		miningLevels.put(Blocks.BLOCK_REDSTONE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_STONE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_BASALT, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_GRANITE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_LIMESTONE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_GLOWING_STONE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_GLOWING_BASALT, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_GLOWING_GRANITE, 2);
+		miningLevels.put(Blocks.ORE_REDSTONE_GLOWING_LIMESTONE, 2);
+	}
+	
+	public PickaxeToolItem(String name, String namespaceId, int id, ToolMaterial enumtoolmaterial) {
+		super(name, namespaceId, id, 2, enumtoolmaterial, BlockTags.MINEABLE_BY_PICKAXE);
+	}
+
+	@Override
+	public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
+	{
+		Integer miningLevel = miningLevels.get(block);
+		if(miningLevel != null) return material.getMiningLevel() >= miningLevel;
+		
+		return block.hasTag(BlockTags.MINEABLE_BY_PICKAXE);
+	}
+}
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java b/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
similarity index 56%
rename from src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java
rename to src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
index 61037b618..9a2da802b 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java
+++ b/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
@@ -1,9 +1,10 @@
 package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
@@ -11,29 +12,29 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
-//            ItemTool, Block, EnumToolMaterial
+//            ToolItem, Block, EnumToolMaterial
 //updated
-public class ItemToolShovel extends ItemTool
+public class ShovelToolItem extends ToolItem
 {
-    public ItemToolShovel(String name, int id, ToolMaterial enumtoolmaterial)
+    public ShovelToolItem(String name, String namespaceId, int id, ToolMaterial enumtoolmaterial)
     {
-        super(name, id, 1, enumtoolmaterial, BlockTags.MINEABLE_BY_SHOVEL);
+        super(name, namespaceId, id, 1, enumtoolmaterial, BlockTags.MINEABLE_BY_SHOVEL);
     }
 
     @Override
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return block.hasTag(BlockTags.MINEABLE_BY_SHOVEL);
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int i1 = world.getBlockId(blockX, blockY, blockZ);
         int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
-        if(side != Side.BOTTOM && j1 == 0 && (i1 == Block.grass.id || i1 == Block.dirt.id || i1 == Block.grassRetro.id || i1 == Block.farmlandDirt.id))
+        if(side != Side.BOTTOM && j1 == 0 && (i1 == Blocks.GRASS.id || i1 == Blocks.DIRT.id || i1 == Blocks.GRASS_RETRO.id || i1 == Blocks.FARMLAND_DIRT.id))
         {
-            Block block = Block.pathDirt;
+            Block block = Blocks.PATH_DIRT;
             world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.blocksList[i1], EnumBlockSoundEffectType.PLACE);
             if (!world.isClientSide) {
                 world.setBlockWithNotify(blockX, blockY, blockZ, block.id);
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java b/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
similarity index 73%
rename from src/main/java/net/minecraft/core/item/tool/ItemToolSword.java
rename to src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
index 265c0ac15..edfc7c33c 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java
+++ b/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
@@ -2,8 +2,9 @@ package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
@@ -12,14 +13,14 @@ import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, EnumToolMaterial, Block, ItemStack, 
-//            EntityLiving, Entity
+//            Mob, Entity
 
-public class ItemToolSword extends Item
+public class SwordToolItem extends Item
 {
 
-    public ItemToolSword(String name, int id, ToolMaterial enumtoolmaterial)
+    public SwordToolItem(String name, String namespaceId, int id, ToolMaterial enumtoolmaterial)
     {
-        super(name, id);
+        super(name, namespaceId, id);
         maxStackSize = 1;
         setMaxDamage(enumtoolmaterial.getDurability());
         weaponDamage = 4 + enumtoolmaterial.getDamage() * 2;
@@ -29,18 +30,18 @@ public class ItemToolSword extends Item
     @Override
     public float getStrVsBlock(ItemStack itemstack, Block block)
     {
-        return block.id != Block.cobweb.id ? 1.5F : 15F;
+        return block.id != Blocks.COBWEB.id ? 1.5F : 15F;
     }
 
     @Override
-    public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
+    public boolean hitEntity(ItemStack itemstack, Mob entityliving, Mob entityliving1)
     {
         itemstack.damageItem(1, entityliving1);
         return true;
     }
 
     @Override
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, EntityLiving entityliving)
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, Mob entityliving)
     {
         Block block = Block.blocksList[i];
         if(block != null) {
@@ -58,7 +59,7 @@ public class ItemToolSword extends Item
     }
 
     @Override
-    public boolean canHarvestBlock(EntityLiving entityLiving, ItemStack itemStack, Block block)
+    public boolean canHarvestBlock(Mob entityLiving, ItemStack itemStack, Block block)
     {
         return block.hasTag(BlockTags.MINEABLE_BY_SWORD);
     }
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemTool.java b/src/main/java/net/minecraft/core/item/tool/ToolItem.java
similarity index 79%
rename from src/main/java/net/minecraft/core/item/tool/ItemTool.java
rename to src/main/java/net/minecraft/core/item/tool/ToolItem.java
index 811b0b735..9e6f61d77 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemTool.java
+++ b/src/main/java/net/minecraft/core/item/tool/ToolItem.java
@@ -2,7 +2,7 @@ package net.minecraft.core.item.tool;
 
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
@@ -11,7 +11,7 @@ import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
-public class ItemTool extends Item
+public class ToolItem extends Item
 {
 
 	private final Tag<Block> tagEffectiveAgainst;
@@ -19,8 +19,8 @@ public class ItemTool extends Item
 	protected ToolMaterial material;
 
 	@SuppressWarnings("unchecked")
-	protected ItemTool(String name, int id, int damageDealt, ToolMaterial toolMaterial, Tag<Block> tagEffectiveAgainst) {
-		super(name, id);
+	protected ToolItem(String name, String namespaceId, int id, int damageDealt, ToolMaterial toolMaterial, Tag<Block> tagEffectiveAgainst) {
+		super(name, namespaceId, id);
 		this.material = toolMaterial;
 		this.tagEffectiveAgainst = tagEffectiveAgainst;
 		withTags(ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS);
@@ -39,13 +39,13 @@ public class ItemTool extends Item
 	}
 
 	@Override
-	public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1) {
+	public boolean hitEntity(ItemStack itemstack, Mob entityliving, Mob entityliving1) {
 		itemstack.damageItem(2, entityliving1);
 		return true;
 	}
 
 	@Override
-	public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, EntityLiving entityliving) {
+	public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, Mob entityliving) {
 		Block block = Block.blocksList[i];
 		if(block != null) {
 			if(block.getHardness() > 0.0f || isSilkTouch()) {
diff --git a/src/main/java/net/minecraft/core/net/ICommandListener.java b/src/main/java/net/minecraft/core/net/ICommandListener.java
index 67a64d940..4afafd945 100644
--- a/src/main/java/net/minecraft/core/net/ICommandListener.java
+++ b/src/main/java/net/minecraft/core/net/ICommandListener.java
@@ -4,7 +4,7 @@ package net.minecraft.core.net;
 public interface ICommandListener
 {
 
-    public abstract void log(String s);
+    void log(String s);
 
-    public abstract String getUsername();
+    String getUsername();
 }
diff --git a/src/main/java/net/minecraft/core/net/NetworkManager.java b/src/main/java/net/minecraft/core/net/NetworkManager.java
index f81bc770f..7cf24ffd7 100644
--- a/src/main/java/net/minecraft/core/net/NetworkManager.java
+++ b/src/main/java/net/minecraft/core/net/NetworkManager.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.net.packet.Packet;
 
 import java.io.*;
@@ -8,7 +8,7 @@ import java.net.*;
 import java.util.*;
 
 // Referenced classes of package net.minecraft.src:
-//            NetworkReaderThread, NetworkWriterThread, Packet, NetHandler, 
+//            NetworkReaderThread, NetworkWriterThread, Packet, PacketHandler,
 //            NetworkMasterThread, ThreadCloseConnection
 
 public class NetworkManager
@@ -16,31 +16,55 @@ public class NetworkManager
 	private final boolean silent;
 	public static int PACKET_DELAY = 100;
 
-    public NetworkManager(Socket socket, String s, NetHandler nethandler)
+    public static final Object threadCounterLock = new Object();
+    public static int readThreads;
+    public static int writeThreads;
+    private final Object writeLock;
+    private Socket socket;
+    private final SocketAddress address;
+    private DataInputStream dis;
+    private DataOutputStream dos;
+    private boolean running;
+    private final List<Packet> incoming;
+    private final List<Packet> outgoing;
+    private final List<Packet> outgoingSlow;
+    private PacketHandler packetListener;
+    private boolean quitting;
+    private final Thread writeThread;
+    private final Thread readThread;
+    private boolean disconnected;
+    private String disconnectReason;
+    private Object[] disconnectReasonObjects;
+    private int noInputTicks;
+    private int estimatedRemaining;
+    public int fakeLag;
+    private int slowWriteDelay;
+
+    public NetworkManager(Socket socket, String s, PacketHandler nethandler)
         throws IOException
     {
         this(socket, s, nethandler, false);
     }
 
-    public NetworkManager(Socket socket, String s, NetHandler nethandler, boolean silent)
+    public NetworkManager(Socket socket, String s, PacketHandler nethandler, boolean silent)
         throws IOException
     {
         this.silent = silent;
-        sendQueueLock = new Object();
-        isRunning = true;
-        readPackets = Collections.synchronizedList(new ArrayList<>());
-        dataPackets = Collections.synchronizedList(new ArrayList<>());
-        chunkDataPackets = Collections.synchronizedList(new ArrayList<>());
-        isServerTerminating = false;
-        isTerminating = false;
-        terminationReason = "";
-        timeSinceLastRead = 0;
-        sendQueueByteLength = 0;
-        packetSendDelay = 0;
-        initialChunkDataDelay = 0;
-        networkSocket = socket;
-        remoteSocketAddress = socket.getRemoteSocketAddress();
-        netHandler = nethandler;
+        writeLock = new Object();
+        running = true;
+        incoming = Collections.synchronizedList(new ArrayList<>());
+        outgoing = Collections.synchronizedList(new ArrayList<>());
+        outgoingSlow = Collections.synchronizedList(new ArrayList<>());
+        quitting = false;
+        disconnected = false;
+        disconnectReason = "";
+        noInputTicks = 0;
+        estimatedRemaining = 0;
+        fakeLag = 0;
+        slowWriteDelay = 0;
+        this.socket = socket;
+        address = socket.getRemoteSocketAddress();
+        packetListener = nethandler;
         try
         {
             socket.setSoTimeout(30000);
@@ -50,16 +74,16 @@ public class NetworkManager
         {
             if (!silent) System.err.println(socketexception.getMessage());
         }
-        socketInputStream = new DataInputStream(socket.getInputStream());
-        socketOutputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream(), 0x10000));
+        dis = new DataInputStream(socket.getInputStream());
+        dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream(), 0x10000));
         readThread = new Thread(s + " read thread") {
             @Override
             public void run() {
-                synchronized(threadSyncObject) {
-                    numReadThreads++;
+                synchronized(threadCounterLock) {
+                    readThreads++;
                 }
                 try {
-                    while(isRunning && !isServerTerminating) {
+                    while(running && !quitting) {
                         while(readPacket());
                         try {
                             sleep(PACKET_DELAY);
@@ -68,8 +92,8 @@ public class NetworkManager
                     }
                 }
                 finally {
-                    synchronized(threadSyncObject) {
-                        numReadThreads--;
+                    synchronized(threadCounterLock) {
+                        readThreads--;
                     }
                 }
             }
@@ -77,22 +101,22 @@ public class NetworkManager
         writeThread = new Thread(s + " write thread") {
             @Override
             public void run() {
-                synchronized(threadSyncObject) {
-                    numWriteThreads++;
+                synchronized(threadCounterLock) {
+                    writeThreads++;
                 }
                 try
                 {
-                    while (isRunning) {
+                    while (running) {
                         while (sendPacket());
                         try {
                             sleep(PACKET_DELAY);
                         } catch (InterruptedException e) { }
                         try {
-                            if (socketOutputStream != null) {
-                                socketOutputStream.flush();
+                            if (dos != null) {
+                                dos.flush();
                             }
                         } catch (IOException e) {
-                            if (!isTerminating) {
+                            if (!disconnected) {
                                 onNetworkError(e);
                             }
                             e.printStackTrace();
@@ -100,8 +124,8 @@ public class NetworkManager
                     }
                 }
                 finally {
-                    synchronized(threadSyncObject) {
-                        numWriteThreads--;
+                    synchronized(threadCounterLock) {
+                        writeThreads--;
                     }
                 }
             }
@@ -110,26 +134,26 @@ public class NetworkManager
         writeThread.start();
     }
     
-    public void setNetHandler(NetHandler nethandler)
+    public void setNetHandler(PacketHandler nethandler)
     {
-        netHandler = nethandler;
+        packetListener = nethandler;
     }
 
     public void addToSendQueue(Packet packet)
     {
-        if(isServerTerminating)
+        if(quitting)
         {
             return;
         }
-        synchronized(sendQueueLock)
+        synchronized(writeLock)
         {
-            sendQueueByteLength += packet.getPacketSize() + 1;
+            estimatedRemaining += packet.getEstimatedSize() + 1;
             if(packet.isChunkDataPacket)
             {
-                chunkDataPackets.add(packet);
+                outgoingSlow.add(packet);
             } else
             {
-                dataPackets.add(packet);
+                outgoing.add(packet);
             }
         }
     }
@@ -139,33 +163,33 @@ public class NetworkManager
         boolean hasWrittenPacket = false;
         try
         {
-            if(!dataPackets.isEmpty() && (packetSendDelay == 0 || System.currentTimeMillis() - dataPackets.get(0).creationTimeMillis >= (long) packetSendDelay))
+            if(!outgoing.isEmpty() && (fakeLag == 0 || System.currentTimeMillis() - outgoing.get(0).creationTimeMillis >= (long) fakeLag))
             {
                 Packet packet;
-                synchronized(sendQueueLock)
+                synchronized(writeLock)
                 {
-                    packet = dataPackets.remove(0);
-                    sendQueueByteLength -= packet.getPacketSize() + 1;
+                    packet = outgoing.remove(0);
+                    estimatedRemaining -= packet.getEstimatedSize() + 1;
                 }
-                Packet.writePacket(packet, socketOutputStream);
+                Packet.writePacket(packet, dos);
                 hasWrittenPacket = true;
             }
-            if(initialChunkDataDelay-- <= 0 && !chunkDataPackets.isEmpty() && (packetSendDelay == 0 || (System.currentTimeMillis() - chunkDataPackets.get(0).creationTimeMillis) >= (long) packetSendDelay))
+            if(slowWriteDelay-- <= 0 && !outgoingSlow.isEmpty() && (fakeLag == 0 || (System.currentTimeMillis() - outgoingSlow.get(0).creationTimeMillis) >= (long) fakeLag))
             {
                 Packet packet;
-                synchronized(sendQueueLock)
+                synchronized(writeLock)
                 {
-                    packet = chunkDataPackets.remove(0);
-                    sendQueueByteLength -= packet.getPacketSize() + 1;
+                    packet = outgoingSlow.remove(0);
+                    estimatedRemaining -= packet.getEstimatedSize() + 1;
                 }
-                Packet.writePacket(packet, socketOutputStream);
-                initialChunkDataDelay = 0;
+                Packet.writePacket(packet, dos);
+                slowWriteDelay = 0;
                 hasWrittenPacket = true;
             }
         }
         catch(Exception exception)
         {
-            if(!isTerminating)
+            if(!disconnected)
             {
                 onNetworkError(exception);
             }
@@ -185,10 +209,10 @@ public class NetworkManager
         boolean hasReadPacket = false;
         try
         {
-            Packet packet = Packet.readPacket(socketInputStream, netHandler.isServerHandler());
+            Packet packet = Packet.readPacket(dis, packetListener.isServerHandler());
             if(packet != null)
             {
-                readPackets.add(packet);
+                incoming.add(packet);
                 hasReadPacket = true;
             } else
             {
@@ -197,7 +221,7 @@ public class NetworkManager
         }
         catch(Exception exception)
         {
-            if(!isTerminating)
+            if(!disconnected)
             {
                 onNetworkError(exception);
             }
@@ -216,13 +240,13 @@ public class NetworkManager
 
     public void networkShutdown(String s, Object[] aobj)
     {
-        if(!isRunning)
+        if(!running)
         {
             return;
         }
-        isTerminating = true;
-        terminationReason = s;
-        field_20101_t = aobj;
+        disconnected = true;
+        disconnectReason = s;
+        disconnectReasonObjects = aobj;
         new Thread(() -> {
             try
             {
@@ -250,71 +274,71 @@ public class NetworkManager
             }
 
         }).start();
-        isRunning = false;
+        running = false;
         try
         {
-            socketInputStream.close();
-            socketInputStream = null;
+            dis.close();
+            dis = null;
         }
         catch(Throwable throwable) { }
         try
         {
-            socketOutputStream.close();
-            socketOutputStream = null;
+            dos.close();
+            dos = null;
         }
         catch(Throwable throwable1) { }
         try
         {
-            networkSocket.close();
-            networkSocket = null;
+            socket.close();
+            socket = null;
         }
         catch(Throwable throwable2) { }
     }
 
     public void processReadPackets()
     {
-        if(sendQueueByteLength > 0x100000)
+        if(estimatedRemaining > 0x100000)
         {
             networkShutdown("disconnect.overflow", new Object[0]);
         }
-        if(readPackets.isEmpty())
+        if(incoming.isEmpty())
         {
-            if(timeSinceLastRead++ == 1200)
+            if(noInputTicks++ == 1200)
             {
                 networkShutdown("disconnect.timeout", new Object[0]);
             }
         } else
         {
-            timeSinceLastRead = 0;
+            noInputTicks = 0;
         }
-        for(int i = 100; !readPackets.isEmpty() && i >= 0; i--)
+        for(int i = 100; !incoming.isEmpty() && i >= 0; i--)
         {
-            Packet packet = readPackets.remove(0);
-            packet.processPacket(netHandler);
+            Packet packet = incoming.remove(0);
+            packet.handlePacket(packetListener);
         }
 
         wakeThreads();
-        if(isTerminating && readPackets.isEmpty())
+        if(disconnected && incoming.isEmpty())
         {
-            netHandler.handleErrorMessage(terminationReason, field_20101_t);
+            packetListener.handleErrorMessage(disconnectReason, disconnectReasonObjects);
         }
     }
     
     public SocketAddress getRemoteAddress()
     {
-        return remoteSocketAddress;
+        return address;
     }
 
     public void serverShutdown()
     {
         wakeThreads();
-        isServerTerminating = true;
+        quitting = true;
         readThread.interrupt();
         new Thread(() -> {
             try
             {
                 Thread.sleep(2000L);
-                if(isRunning)
+                if(running)
                 {
                     writeThread.interrupt();
                     networkShutdown("disconnect.closed", new Object[0]);
@@ -329,30 +353,6 @@ public class NetworkManager
     
     public int getNumChunkDataPackets()
     {
-        return chunkDataPackets.size();
+        return outgoingSlow.size();
     }
-
-    public static final Object threadSyncObject = new Object();
-    public static int numReadThreads;
-    public static int numWriteThreads;
-    private final Object sendQueueLock;
-    private Socket networkSocket;
-    private final SocketAddress remoteSocketAddress;
-    private DataInputStream socketInputStream;
-    private DataOutputStream socketOutputStream;
-    private boolean isRunning;
-    private final List<Packet> readPackets;
-    private final List<Packet> dataPackets;
-    private final List<Packet> chunkDataPackets;
-    private NetHandler netHandler;
-    private boolean isServerTerminating;
-    private final Thread writeThread;
-    private final Thread readThread;
-    private boolean isTerminating;
-    private String terminationReason;
-    private Object[] field_20101_t;
-    private int timeSinceLastRead;
-    private int sendQueueByteLength;
-    public int packetSendDelay;
-    private int initialChunkDataDelay;
 }
diff --git a/src/main/java/net/minecraft/core/net/ServerCommand.java b/src/main/java/net/minecraft/core/net/ServerCommandEntry.java
similarity index 72%
rename from src/main/java/net/minecraft/core/net/ServerCommand.java
rename to src/main/java/net/minecraft/core/net/ServerCommandEntry.java
index 5e0c06b8f..f82f4f246 100644
--- a/src/main/java/net/minecraft/core/net/ServerCommand.java
+++ b/src/main/java/net/minecraft/core/net/ServerCommandEntry.java
@@ -3,11 +3,10 @@ package net.minecraft.core.net;
 
 // Referenced classes of package net.minecraft.src:
 //            ICommandListener
-
-public class ServerCommand
+public class ServerCommandEntry
 {
 
-    public ServerCommand(String s, ICommandListener icommandlistener)
+    public ServerCommandEntry(String s, ICommandListener icommandlistener)
     {
         command = s;
         commandListener = icommandlistener;
diff --git a/src/main/java/net/minecraft/core/net/command/ClientCommandHandler.java b/src/main/java/net/minecraft/core/net/command/ClientCommandHandler.java
index 9063c475a..fd15d7c8b 100644
--- a/src/main/java/net/minecraft/core/net/command/ClientCommandHandler.java
+++ b/src/main/java/net/minecraft/core/net/command/ClientCommandHandler.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.net.command;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.Nullable;
 
@@ -28,7 +28,7 @@ public class ClientCommandHandler implements CommandHandler{
 	}
 
 	@Override
-	public @Nullable EntityPlayer getPlayer(String name) {
+	public @Nullable Player getPlayer(String name) {
 		if(minecraft.thePlayer.username.equalsIgnoreCase(name)) {
 			return minecraft.thePlayer;
 		}else {
@@ -37,7 +37,7 @@ public class ClientCommandHandler implements CommandHandler{
 	}
 
 	@Override
-	public void sendMessageToPlayer(EntityPlayer player, String msg) {
+	public void sendMessageToPlayer(Player player, String msg) {
 		if(player == minecraft.thePlayer) {
 			minecraft.ingameGUI.addChatMessage(msg);
 		}
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 91b3c525a..18846ffa7 100644
--- a/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/ClientPlayerCommandSender.java
@@ -1,16 +1,16 @@
 package net.minecraft.core.net.command;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.client.entity.player.LocalPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
-import net.minecraft.client.entity.player.EntityPlayerSP;
 
 public class ClientPlayerCommandSender extends PlayerCommandSender{
 	
 	public final Minecraft minecraft;
-	public final EntityPlayerSP player;
+	public final LocalPlayer player;
 	
-	public ClientPlayerCommandSender(Minecraft minecraft, EntityPlayerSP player) {
+	public ClientPlayerCommandSender(Minecraft minecraft, LocalPlayer player) {
 		if(minecraft == null) throw new NullPointerException();
 		
 		this.minecraft = minecraft;
@@ -28,7 +28,7 @@ public class ClientPlayerCommandSender extends PlayerCommandSender{
 	}
 
 	@Override
-	public EntityPlayer getPlayer() {
+	public Player getPlayer() {
 		return player;
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/command/CommandHandler.java b/src/main/java/net/minecraft/core/net/command/CommandHandler.java
index f6a3b30c9..60f9564f6 100644
--- a/src/main/java/net/minecraft/core/net/command/CommandHandler.java
+++ b/src/main/java/net/minecraft/core/net/command/CommandHandler.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.command;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.Nullable;
 
@@ -15,16 +15,16 @@ public interface CommandHandler {
 	
 	void sendMessageToAllPlayers(String msg);
 	
-	void sendMessageToPlayer(EntityPlayer player, String messsage);
+	void sendMessageToPlayer(Player player, String messsage);
 
-	@Nullable EntityPlayer getPlayer(String name);
+	@Nullable Player getPlayer(String name);
 	
 	boolean playerExists(String name);
 	
 	World getWorld(int dimension);
 
 	
-	default World getWorld(EntityPlayer player) {
+	default World getWorld(Player player) {
 		return getWorld(player.dimension);
 	}
 	
diff --git a/src/main/java/net/minecraft/core/net/command/CommandSender.java b/src/main/java/net/minecraft/core/net/command/CommandSender.java
index f91de575f..791a0c467 100644
--- a/src/main/java/net/minecraft/core/net/command/CommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/CommandSender.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.net.command;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 
 public interface CommandSender {
 	
 	public boolean isAdmin();
 	
-	public EntityPlayer getPlayer();
+	public Player getPlayer();
 	
 	public World getWorld();
 
diff --git a/src/main/java/net/minecraft/core/net/command/Commands.java b/src/main/java/net/minecraft/core/net/command/Commands.java
index 1d80ffa80..3a28ad487 100644
--- a/src/main/java/net/minecraft/core/net/command/Commands.java
+++ b/src/main/java/net/minecraft/core/net/command/Commands.java
@@ -2,6 +2,26 @@ package net.minecraft.core.net.command;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.core.net.command.commands.*;
+import net.minecraft.core.net.command.servercommands.BanCommand;
+import net.minecraft.core.net.command.servercommands.BanIpCommand;
+import net.minecraft.core.net.command.servercommands.ColorCommand;
+import net.minecraft.core.net.command.servercommands.DeopCommand;
+import net.minecraft.core.net.command.servercommands.DifficultyCommand;
+import net.minecraft.core.net.command.servercommands.EmotesCommand;
+import net.minecraft.core.net.command.servercommands.KickCommand;
+import net.minecraft.core.net.command.servercommands.ListCommand;
+import net.minecraft.core.net.command.servercommands.MeCommand;
+import net.minecraft.core.net.command.servercommands.NicknameCommand;
+import net.minecraft.core.net.command.servercommands.OpCommand;
+import net.minecraft.core.net.command.servercommands.PardonCommand;
+import net.minecraft.core.net.command.servercommands.PardonIpCommand;
+import net.minecraft.core.net.command.servercommands.SaveCommand;
+import net.minecraft.core.net.command.servercommands.SayCommand;
+import net.minecraft.core.net.command.servercommands.ScoreCommand;
+import net.minecraft.core.net.command.servercommands.ScoreboardCommand;
+import net.minecraft.core.net.command.servercommands.StopCommand;
+import net.minecraft.core.net.command.servercommands.WhitelistCommand;
+import net.minecraft.core.net.command.servercommands.WhoisCommand;
 import net.minecraft.server.MinecraftServer;
 
 import java.util.ArrayList;
@@ -41,7 +61,9 @@ public final class Commands {
 		if(commands.size() > 0) throw new RuntimeException();
 		
 		initCommands();
-		
+
+		commands.add(new BanCommand(server));
+		commands.add(new BanIpCommand(server));
 		commands.add(new StopCommand(server));
 		commands.add(new OpCommand(server));
 		commands.add(new DeopCommand(server));
@@ -53,7 +75,13 @@ public final class Commands {
 		commands.add(new ScoreCommand(server));
 		commands.add(new MeCommand(server));
 		commands.add(new EmotesCommand(server));
-		commands.add(new BiomeCommand());
+		commands.add(new WhitelistCommand(server));
+		commands.add(new SaveCommand(server));
+		commands.add(new PardonCommand(server));
+		commands.add(new PardonIpCommand(server));
+		commands.add(new KickCommand(server));
+		commands.add(new SayCommand(server));
+		commands.add(new ScoreboardCommand(server));
 	}
 	
 	public static void initClientCommands(Minecraft minecraft) {
diff --git a/src/main/java/net/minecraft/core/net/command/ConsoleCommandSender.java b/src/main/java/net/minecraft/core/net/command/ConsoleCommandSender.java
index 98695cb71..3c6d4e34e 100644
--- a/src/main/java/net/minecraft/core/net/command/ConsoleCommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/ConsoleCommandSender.java
@@ -2,7 +2,7 @@ package net.minecraft.core.net.command;
 
 import org.apache.log4j.Logger;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.LogPrintStream;
 import net.minecraft.core.world.World;
 import net.minecraft.server.MinecraftServer;
@@ -23,7 +23,7 @@ public class ConsoleCommandSender implements CommandSender{
 	}
 
 	@Override
-	public EntityPlayer getPlayer() {
+	public Player getPlayer() {
 		return null;
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/command/LocationTarget.java b/src/main/java/net/minecraft/core/net/command/LocationTarget.java
index ae8f090b4..67b3d1d7c 100644
--- a/src/main/java/net/minecraft/core/net/command/LocationTarget.java
+++ b/src/main/java/net/minecraft/core/net/command/LocationTarget.java
@@ -3,7 +3,7 @@ package net.minecraft.core.net.command;
 import static net.minecraft.core.util.helper.Utils.*;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 
@@ -49,7 +49,7 @@ public class LocationTarget {
 	public int parse(String[] args, int offset) {
 		try {
 			if(!isNumber(args[offset])) {
-				EntityPlayer player = handler.getPlayer(args[offset]);
+				Player player = handler.getPlayer(args[offset]);
 				
 				if(player != null) {
 					setLocation(player);
@@ -137,29 +137,29 @@ public class LocationTarget {
 	public int getBlockX() {
 		checkPosition();
 		
-		return MathHelper.floor_double(x);
+		return MathHelper.floor(x);
 	}
 	
 	public int getBlockY() {
 		checkPosition();
 		
-		return MathHelper.floor_double(y);
+		return MathHelper.floor(y);
 	}
 	
 	public int getBlockZ() {
 		checkPosition();
 		
-		return MathHelper.floor_double(z);
+		return MathHelper.floor(z);
 	}
 	
 	public boolean isLocationEntity() {
-		return locationEntity != null && locationEntity instanceof EntityPlayer;
+		return locationEntity != null && locationEntity instanceof Player;
 	}
 	
 	public String getLocationEntityName() {
 		if(locationEntity == null) return null;
-		if(locationEntity instanceof EntityPlayer) {
-			EntityPlayer entityPlayer = (EntityPlayer) locationEntity;
+		if(locationEntity instanceof Player) {
+			Player entityPlayer = (Player) locationEntity;
 			return entityPlayer.username;
 		}
 		return null;
diff --git a/src/main/java/net/minecraft/core/net/command/PlayerCommandSender.java b/src/main/java/net/minecraft/core/net/command/PlayerCommandSender.java
index edccc167e..2a7877ab2 100644
--- a/src/main/java/net/minecraft/core/net/command/PlayerCommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/PlayerCommandSender.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.command;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 
 public abstract class PlayerCommandSender implements CommandSender{
 	
 	public PlayerCommandSender() {}
 
 	@Override
-	public abstract EntityPlayer getPlayer();
+	public abstract Player getPlayer();
 	
 }
diff --git a/src/main/java/net/minecraft/core/net/command/ServerCommand.java b/src/main/java/net/minecraft/core/net/command/ServerCommand.java
index 96a5e1d81..f9cc29a89 100644
--- a/src/main/java/net/minecraft/core/net/command/ServerCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/ServerCommand.java
@@ -12,4 +12,11 @@ public abstract class ServerCommand extends Command{
 		this.server = server;
 	}
 
+	public void sendNoticeToOps(String name, String message)
+	{
+		String formattedMessage = name + TextFormatting.LIGHT_GRAY +  ": " + message;
+		server.playerList.sendChatMessageToAllOps(TextFormatting.LIGHT_GRAY + "(" + formattedMessage + ")");
+		MinecraftServer.logger.info(formattedMessage);
+	}
+
 }
diff --git a/src/main/java/net/minecraft/core/net/command/ServerCommandHandler.java b/src/main/java/net/minecraft/core/net/command/ServerCommandHandler.java
index 27a177b64..c9b8f8800 100644
--- a/src/main/java/net/minecraft/core/net/command/ServerCommandHandler.java
+++ b/src/main/java/net/minecraft/core/net/command/ServerCommandHandler.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.net.command;
 
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.net.packet.ChatPacket;
 import net.minecraft.core.util.helper.AES;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.net.packet.Packet3Chat;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.Nullable;
 
@@ -21,7 +21,7 @@ public class ServerCommandHandler implements CommandHandler{
 	}
 
 	@Override
-	public @Nullable EntityPlayer getPlayer(String name) {
+	public @Nullable Player getPlayer(String name) {
 		return minecraftServer.playerList.getPlayerEntity(name);
 	}
 
@@ -31,8 +31,8 @@ public class ServerCommandHandler implements CommandHandler{
 	}
 
 	@Override
-	public void sendMessageToPlayer(EntityPlayer player, String messsage) {
-		minecraftServer.playerList.sendPacketToPlayer(player.username, new Packet3Chat(messsage, AES.keyChain.get(player.username)));
+	public void sendMessageToPlayer(Player player, String messsage) {
+		minecraftServer.playerList.sendPacketToPlayer(player.username, new ChatPacket(messsage, AES.keyChain.get(player.username)));
 	}
 
 	@Override
@@ -46,7 +46,7 @@ public class ServerCommandHandler implements CommandHandler{
 		
 		String message2 = "\2477" + sender.getName() + ": " + message;
 		
-		for(EntityPlayer p : minecraftServer.playerList.playerEntities) {
+		for(Player p : minecraftServer.playerList.playerEntities) {
 			if(minecraftServer.playerList.isOp(p.username)) {
 				if(sender.getPlayer() == null || sender.getPlayer() != p) {
 					sendMessageToPlayer(p, message2);
diff --git a/src/main/java/net/minecraft/core/net/command/ServerPlayerCommandSender.java b/src/main/java/net/minecraft/core/net/command/ServerPlayerCommandSender.java
index eea4757e6..88b6cbfb7 100644
--- a/src/main/java/net/minecraft/core/net/command/ServerPlayerCommandSender.java
+++ b/src/main/java/net/minecraft/core/net/command/ServerPlayerCommandSender.java
@@ -1,18 +1,18 @@
 package net.minecraft.core.net.command;
 
+import net.minecraft.core.net.packet.ChatPacket;
 import net.minecraft.core.util.helper.AES;
 import net.minecraft.core.world.World;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet3Chat;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 public class ServerPlayerCommandSender extends PlayerCommandSender{
 
 	public final MinecraftServer server;
-	public final EntityPlayerMP player;
+	public final ServerPlayer player;
 	
-	public ServerPlayerCommandSender(MinecraftServer server, EntityPlayerMP player) {
+	public ServerPlayerCommandSender(MinecraftServer server, ServerPlayer player) {
 		this.player = player;
 		this.server = server;
 	}
@@ -24,15 +24,15 @@ public class ServerPlayerCommandSender extends PlayerCommandSender{
 
 	@Override
 	public void sendMessage(String string) {
-		player.playerNetServerHandler.sendPacket(new Packet3Chat(string, AES.keyChain.get(player.username)));
+		player.playerNetServerHandler.sendPacket(new ChatPacket(string, AES.keyChain.get(player.username)));
 	}
 
 	@Override
-	public EntityPlayer getPlayer() {
+	public Player getPlayer() {
 		return player;
 	}
 	
-	public EntityPlayerMP getPlayerMP() {
+	public ServerPlayer getPlayerMP() {
 		return player;
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/command/commands/BiomeCommand.java b/src/main/java/net/minecraft/core/net/command/commands/BiomeCommand.java
index a1e68a7b3..389259946 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/BiomeCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/BiomeCommand.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.net.command.commands;
 
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.*;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
@@ -17,7 +17,7 @@ extends Command {
     @Override
     public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
         if (args.length == 0 && sender instanceof PlayerCommandSender) {
-            EntityPlayer p = sender.getPlayer();
+            Player p = sender.getPlayer();
             World world = p.world;
             Biome biome = world.getBlockBiome((int) p.x, (int) p.y, (int) p.z);
             sender.sendMessage("Current biome: " + Registries.BIOMES.getKey(biome));
@@ -109,7 +109,7 @@ extends Command {
         }
     }
 
-    private int[] getBiomeCoords(Biome biome, EntityPlayer source) {
+    private int[] getBiomeCoords(Biome biome, Player source) {
         int[] xPattern = new int[] { 0, 1, 0, -1 };
         int[] zPattern = new int[] { 1, 0, -1, 0 };
         int runLength = 2;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/ClearCommand.java b/src/main/java/net/minecraft/core/net/command/commands/ClearCommand.java
index 18d519976..af5c9e909 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/ClearCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/ClearCommand.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.CommandHandler;
@@ -17,7 +17,7 @@ public class ClearCommand extends Command{
 
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
-		EntityPlayer player = null;
+		Player player = null;
 		
 		if(args.length == 0) {
 			player = sender.getPlayer();
@@ -28,8 +28,8 @@ public class ClearCommand extends Command{
 		
 		if(player == null) throw new CommandError("Must be used by a player, or define a player name!");
 		
-		for(int i=0; i < player.inventory.getSizeInventory(); i++) {
-			player.inventory.setInventorySlotContents(i, null);
+		for(int i = 0; i < player.inventory.getContainerSize(); i++) {
+			player.inventory.setItem(i, null);
 		}
 		Arrays.fill(player.inventory.armorInventory, null);
 		
diff --git a/src/main/java/net/minecraft/core/net/command/commands/GamemodeCommand.java b/src/main/java/net/minecraft/core/net/command/commands/GamemodeCommand.java
index 206711398..537f6b502 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/GamemodeCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/GamemodeCommand.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.net.command.PlayerCommandSender;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -20,7 +21,7 @@ public class GamemodeCommand extends Command{
 		String gamemodeString = args[0];
 		
 		Gamemode gamemode;
-		EntityPlayer player;
+		Player player;
 		
 		try {
 			gamemode = Gamemode.gamemodesList[Integer.parseInt(gamemodeString)];
@@ -52,6 +53,9 @@ public class GamemodeCommand extends Command{
 
 	@Override
 	public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+		if (sender instanceof PlayerCommandSender){
+			sender.sendMessage("/gamemode <gamemode>");
+		}
 		sender.sendMessage("/gamemode <gamemode> <player>");
 	}
 	
diff --git a/src/main/java/net/minecraft/core/net/command/commands/GameruleCommand.java b/src/main/java/net/minecraft/core/net/command/commands/GameruleCommand.java
index 38cc02556..ebab270f7 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/GameruleCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/GameruleCommand.java
@@ -4,7 +4,7 @@ import net.minecraft.core.data.gamerule.GameRule;
 import net.minecraft.core.data.gamerule.GameRuleCollection;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.net.command.*;
-import net.minecraft.core.net.packet.Packet74GameRule;
+import net.minecraft.core.net.packet.GameRulePacket;
 
 public class GameruleCommand
     extends Command
@@ -67,7 +67,7 @@ public class GameruleCommand
             if (handler.isServer())
             {
                 ServerCommandHandler serverHandler = (ServerCommandHandler) handler;
-                serverHandler.minecraftServer.playerList.sendPacketToAllPlayers(new Packet74GameRule(gameRules));
+                serverHandler.minecraftServer.playerList.sendPacketToAllPlayers(new GameRulePacket(gameRules));
             }
 
             return true;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/GenerateCommand.java b/src/main/java/net/minecraft/core/net/command/commands/GenerateCommand.java
index 108c68288..77dade245 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/GenerateCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/GenerateCommand.java
@@ -2,7 +2,7 @@ package net.minecraft.core.net.command.commands;
 
 import com.b100.utils.Utils;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.CommandHandler;
@@ -34,7 +34,7 @@ public class GenerateCommand extends Command {
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
 		if(!sender.isPlayer()) throw new CommandError("Must be used by a player!");
-		EntityPlayer player = sender.getPlayer();
+		Player player = sender.getPlayer();
 		
 		if(args.length < 1) return false;
 
@@ -128,7 +128,7 @@ public class GenerateCommand extends Command {
 		}
 		
 		WorldFeature feature = createWorldFeature(worldFeatureClass, constructor, featureArgs);
-		if(!feature.generate(handler.getWorld(player), new Random(), MathHelper.floor_double(player.x), MathHelper.floor_double(player.y), MathHelper.floor_double(player.z))) {
+		if(!feature.place(handler.getWorld(player), new Random(), MathHelper.floor(player.x), MathHelper.floor(player.y), MathHelper.floor(player.z))) {
 			throw new CommandError("Could not spawn feature here!");
 		}
 
diff --git a/src/main/java/net/minecraft/core/net/command/commands/GiveCommand.java b/src/main/java/net/minecraft/core/net/command/commands/GiveCommand.java
index 80582a346..777a6bc47 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/GiveCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/GiveCommand.java
@@ -1,9 +1,10 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.client.entity.player.LocalPlayer;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -19,7 +20,7 @@ public class GiveCommand extends Command{
 
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
-		EntityPlayer player;
+		Player player;
 		Item item;
 		int count = 1;
 		int meta = 0;
@@ -94,18 +95,18 @@ public class GiveCommand extends Command{
 		return Item.itemsList[id];
 	}
 	
-	public static boolean givePlayerItem(CommandHandler handler, CommandSender sender, EntityPlayer player, ItemStack item) {
-		if(player instanceof EntityPlayerSP) {
+	public static boolean givePlayerItem(CommandHandler handler, CommandSender sender, Player player, ItemStack item) {
+		if(player instanceof LocalPlayer) {
 			player.inventory.insertItem(item, true);
 			if(item.stackSize > 0) {
 				player.dropPlayerItem(item);
 			}
 			return true;
 		}
-		if(player instanceof EntityPlayerMP) {
+		if(player instanceof ServerPlayer) {
 			handler.sendCommandFeedback(sender, "Gave "+item.stackSize+" of "+ item.getItemKey() +" to "+player.getDisplayName());
 			
-			EntityPlayerMP playerMP = (EntityPlayerMP) player;
+			ServerPlayer playerMP = (ServerPlayer) player;
 			playerMP.dropPlayerItem(item);
 			return true;
 		}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/HarmCommand.java b/src/main/java/net/minecraft/core/net/command/commands/HarmCommand.java
index a2a21d812..112d1f5a0 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/HarmCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/HarmCommand.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.CommandHandler;
@@ -18,7 +18,7 @@ public class HarmCommand extends Command
     {
         if (args.length == 0)
         {
-            EntityPlayer player = sender.getPlayer();
+            Player player = sender.getPlayer();
             player.hurt(player, 1, DamageType.GENERIC);
 
             sender.sendMessage("Harmed player " + player.getDisplayName() + "for 1");
@@ -26,7 +26,7 @@ public class HarmCommand extends Command
         }
         else if (args.length == 1)
         {
-            EntityPlayer player = handler.getPlayer(args[0]);
+            Player player = handler.getPlayer(args[0]);
             if (player == null) return false;
 
             player.hurt(player, 1, DamageType.GENERIC);
@@ -35,7 +35,7 @@ public class HarmCommand extends Command
         }
         else if (args.length == 2)
         {
-            EntityPlayer player = handler.getPlayer(args[0]);
+            Player player = handler.getPlayer(args[0]);
             int damageAmount = parseInt(args[1]);
             if (player == null) return false;
 
diff --git a/src/main/java/net/minecraft/core/net/command/commands/HelpCommand.java b/src/main/java/net/minecraft/core/net/command/commands/HelpCommand.java
index 32a059080..b8e7bc8e0 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/HelpCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/HelpCommand.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.command.commands;
 
+import net.minecraft.core.net.command.ConsoleCommandSender;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -7,6 +8,10 @@ import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
 import net.minecraft.core.net.command.Commands;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
 public class HelpCommand extends Command{
 
 	public HelpCommand() {
@@ -43,10 +48,18 @@ public class HelpCommand extends Command{
 		}
 		
 		StringBuilder commandsString = new StringBuilder();
-		
-		for(Command command : Commands.commands) {
+
+		List<Command> commandList = new ArrayList<>(Commands.commands);
+		commandList.sort(Comparator.comparing(Command::getName)); // Sort commands by name
+
+		for(Command command : commandList) {
 			if(sender.isAdmin() || !command.opRequired(null)) {
-				commandsString.append(", ").append(command.getName());
+				if (sender instanceof ConsoleCommandSender) {
+					commandsString.append("\n").append("*    ");
+				} else {
+					commandsString.append(", ");
+				}
+				commandsString.append(command.getName());
 			}
 		}
 		
diff --git a/src/main/java/net/minecraft/core/net/command/commands/KillCommand.java b/src/main/java/net/minecraft/core/net/command/commands/KillCommand.java
index 2701bb2a0..dbcbd88cf 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/KillCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/KillCommand.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
@@ -16,7 +16,7 @@ public class KillCommand extends Command
     {
         if (args.length == 0)
         {
-            EntityPlayer player = sender.getPlayer();
+            Player player = sender.getPlayer();
             player.killPlayer();
 
             sender.sendMessage("Killed player " + player.getDisplayName());
@@ -24,7 +24,7 @@ public class KillCommand extends Command
         }
         else if (args.length == 1)
         {
-            EntityPlayer player = handler.getPlayer(args[0]);
+            Player player = handler.getPlayer(args[0]);
             if (player == null) return false;
 
             player.killPlayer();
diff --git a/src/main/java/net/minecraft/core/net/command/commands/PlaySoundCommand.java b/src/main/java/net/minecraft/core/net/command/commands/PlaySoundCommand.java
index 5fbcad6df..4f0997f3d 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/PlaySoundCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/PlaySoundCommand.java
@@ -6,7 +6,7 @@ import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
 import net.minecraft.core.net.command.ServerCommandHandler;
-import net.minecraft.core.net.packet.Packet62PlaySoundDirect;
+import net.minecraft.core.net.packet.PlaySoundEffectDirectPacket;
 import net.minecraft.core.sound.SoundTypes;
 import net.minecraft.core.sound.SoundCategory;
 
@@ -50,9 +50,9 @@ public class PlaySoundCommand extends Command {
         		throw new CommandError("Invalid Sound: '" + soundPath + "'!");
         	}
             if (handler instanceof ServerCommandHandler){
-                ((ServerCommandHandler) handler).minecraftServer.playerList.sendPacketToPlayersAroundPoint(x, y,z, 128f, dimension, new Packet62PlaySoundDirect(soundId, soundType, x, y, z, volume, pitch));
+                ((ServerCommandHandler) handler).minecraftServer.playerList.sendPacketToPlayersAroundPoint(x, y,z, 128f, dimension, new PlaySoundEffectDirectPacket(soundId, soundType, x, y, z, volume, pitch));
             } else if (handler instanceof ClientCommandHandler){
-                ((ClientCommandHandler) handler).minecraft.sndManager.playSound(soundPath, soundType, x, y, z, volume, pitch);
+                ((ClientCommandHandler) handler).minecraft.sndManager.playSoundAt(soundPath, soundType, x, y, z, volume, pitch);
             }
             return true;
         }
diff --git a/src/main/java/net/minecraft/core/net/command/commands/SetBlockCommand.java b/src/main/java/net/minecraft/core/net/command/commands/SetBlockCommand.java
index 3bf5a4772..f57fd4e2b 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/SetBlockCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/SetBlockCommand.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.net.command.commands;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.CommandHandler;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/SetSpawnCommand.java b/src/main/java/net/minecraft/core/net/command/commands/SetSpawnCommand.java
index 4baf98ba4..e59663dbb 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/SetSpawnCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/SetSpawnCommand.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.net.command.commands;
 
 import net.minecraft.core.world.chunk.ChunkCoordinates;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.World;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -17,7 +17,7 @@ public class SetSpawnCommand extends Command{
 
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
-		EntityPlayer player = sender.getPlayer();
+		Player player = sender.getPlayer();
 		
 		int x, y, z;
 		
diff --git a/src/main/java/net/minecraft/core/net/command/commands/SpawnCommand.java b/src/main/java/net/minecraft/core/net/command/commands/SpawnCommand.java
index acfd41d16..86927b514 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/SpawnCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/SpawnCommand.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.net.command.commands;
 
 import net.minecraft.core.world.chunk.ChunkCoordinates;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.core.world.World;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -19,7 +19,7 @@ public class SpawnCommand extends Command{
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
 		if(sender instanceof PlayerCommandSender) {
-			EntityPlayer player = sender.getPlayer();
+			Player player = sender.getPlayer();
 			
 			World world = handler.getWorld(player);
 			
@@ -27,8 +27,8 @@ public class SpawnCommand extends Command{
 			
 			sender.sendMessage("Teleporting to spawn...");
 			
-			if(player instanceof EntityPlayerMP) {
-				EntityPlayerMP playerMP = (EntityPlayerMP) player;
+			if(player instanceof ServerPlayer) {
+				ServerPlayer playerMP = (ServerPlayer) player;
 				if(playerMP.dimension != 0) {
 					playerMP.mcServer.playerList.sendPlayerToOtherDimension(playerMP, 0, false);
 				}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/SpawnParticleCommand.java b/src/main/java/net/minecraft/core/net/command/commands/SpawnParticleCommand.java
index aeffaf830..74a1cd079 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/SpawnParticleCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/SpawnParticleCommand.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.client.entity.fx.ParticleDispatcher;
+import net.minecraft.client.entity.particle.ParticleDispatcher;
 import net.minecraft.core.net.command.ClientCommandHandler;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
 import net.minecraft.core.net.command.ServerCommandHandler;
-import net.minecraft.core.net.packet.Packet63SpawnParticleEffect;
+import net.minecraft.core.net.packet.AddParticlePacket;
 
 public class SpawnParticleCommand extends Command {
     public SpawnParticleCommand() {
@@ -62,7 +62,7 @@ public class SpawnParticleCommand extends Command {
         }
         if (particleKey != null && x != null){
             if (handler instanceof ServerCommandHandler){
-                ((ServerCommandHandler) handler).minecraftServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, maxDistance == null ? 16 : maxDistance, dimension, new Packet63SpawnParticleEffect(particleKey, x, y, z, motionX, motionY, motionZ, data));
+                ((ServerCommandHandler) handler).minecraftServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, maxDistance == null ? 16 : maxDistance, dimension, new AddParticlePacket(particleKey, x, y, z, motionX, motionY, motionZ, data));
             } else if (handler instanceof ClientCommandHandler){
                 if (maxDistance == null){
                     ((ClientCommandHandler) handler).minecraft.renderGlobal.addParticle(particleKey, x, y, z, motionX, motionY, motionZ, data);
diff --git a/src/main/java/net/minecraft/core/net/command/commands/TeleportCommand.java b/src/main/java/net/minecraft/core/net/command/commands/TeleportCommand.java
index 910d7dc38..f60a7f9dd 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/TeleportCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/TeleportCommand.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
@@ -27,8 +27,8 @@ public class TeleportCommand extends Command{
 		
 		if(args.length > 0) {
 			if(args.length <= 2) {
-				EntityPlayer from = null;
-				EntityPlayer to = null;
+				Player from = null;
+				Player to = null;
 				
 				if(args.length == 1) {
 					if(sentByPlayer) {
@@ -47,7 +47,7 @@ public class TeleportCommand extends Command{
 				return true;
 			}
 			
-			EntityPlayer player = null;
+			Player player = null;
 			double x = 0.0;
 			double y = 0.0;
 			double z = 0.0;
@@ -82,8 +82,8 @@ public class TeleportCommand extends Command{
 		}
 	}
 	
-	public EntityPlayer getPlayer(CommandHandler handler, String name) {
-		EntityPlayer player = handler.getPlayer(name);
+	public Player getPlayer(CommandHandler handler, String name) {
+		Player player = handler.getPlayer(name);
 		if(player == null) throw new CommandError("Player not found: "+name);
 		return player;
 	}
@@ -104,10 +104,10 @@ public class TeleportCommand extends Command{
 		return true;
 	}
 	
-	public static void teleport(CommandHandler handler, CommandSender sender, EntityPlayer p1, Integer dimension, double x, double y, double z, double yaw, double pitch, EntityPlayer p2) {
-		if(p1 instanceof EntityPlayerMP) {
+	public static void teleport(CommandHandler handler, CommandSender sender, Player p1, Integer dimension, double x, double y, double z, double yaw, double pitch, Player p2) {
+		if(p1 instanceof ServerPlayer) {
 			
-			EntityPlayerMP p1MP = (EntityPlayerMP) p1;
+			ServerPlayer p1MP = (ServerPlayer) p1;
 			if(dimension != null && p1MP.dimension != dimension && handler instanceof ServerCommandHandler) {
 				ServerCommandHandler serverCommandHandler = (ServerCommandHandler) handler;
 				serverCommandHandler.minecraftServer.playerList.sendPlayerToOtherDimension(p1MP, dimension, false);
@@ -124,7 +124,7 @@ public class TeleportCommand extends Command{
 		}
 	}
 	
-	public static void teleport(CommandHandler handler, CommandSender sender, EntityPlayer p1, EntityPlayer p2) {
+	public static void teleport(CommandHandler handler, CommandSender sender, Player p1, Player p2) {
 		teleport(handler, sender, p1, p2.dimension, p2.x, p2.y, p2.z, p2.yRot, p2.xRot, p2);
 	}
 	
diff --git a/src/main/java/net/minecraft/core/net/command/commands/WeatherCommand.java b/src/main/java/net/minecraft/core/net/command/commands/WeatherCommand.java
index 99e2cdb82..33acbc9fa 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/WeatherCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/WeatherCommand.java
@@ -7,6 +7,7 @@ import net.minecraft.core.net.command.CommandSender;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 public class WeatherCommand extends Command{
 
@@ -26,7 +27,7 @@ public class WeatherCommand extends Command{
 			weatherString.append(TextFormatting.LIGHT_GRAY + "Available weathers: " + TextFormatting.WHITE);
 			weatherString.append("clear");
 			
-			for(Weather weather : Weather.weatherList) {
+			for(Weather weather : Weathers.WEATHERS) {
 				if(weather != null) {
 					weatherString.append(", ");
 					weatherString.append(weather.languageKey.substring(8));
@@ -94,7 +95,7 @@ public class WeatherCommand extends Command{
 	
 	public static Weather getWeather(String string, World world) {
 		try {
-			return Weather.getWeather(Integer.parseInt(string));
+			return Weathers.getWeather(Integer.parseInt(string));
 		}catch (NumberFormatException e) {}
 
 		if(string.equalsIgnoreCase("clear")) {
@@ -105,7 +106,7 @@ public class WeatherCommand extends Command{
 			return weather;
 		}
 		
-		return Weather.getWeatherByLanguageKey(string);
+		return Weathers.getWeatherByLanguageKey(string);
 	}
 
 }
diff --git a/src/main/java/net/minecraft/core/net/command/commands/WhisperCommand.java b/src/main/java/net/minecraft/core/net/command/commands/WhisperCommand.java
index 43efc15ad..eb6a16c54 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/WhisperCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/commands/WhisperCommand.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.command.commands;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandHandler;
@@ -17,7 +17,7 @@ public class WhisperCommand extends Command{
 		if(args.length < 2) {
 			return false;
 		}
-		EntityPlayer player = handler.getPlayer(args[0]);
+		Player player = handler.getPlayer(args[0]);
 		
 		StringBuilder builder = new StringBuilder();
 		
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/BanCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/BanCommand.java
new file mode 100644
index 000000000..d4c04e74a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/BanCommand.java
@@ -0,0 +1,42 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.client.entity.player.RemotePlayer;
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.entity.player.ServerPlayer;
+
+public class BanCommand extends ServerCommand {
+    public BanCommand(MinecraftServer server) {
+        super(server, "ban");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length != 1) return false;
+        String senderName = sender.getName();
+
+        String nameToBan = args[0];
+
+        server.playerList.banPlayer(nameToBan);
+        sendNoticeToOps(senderName, "Banning " + nameToBan);
+        ServerPlayer player = server.playerList.getPlayerEntity(nameToBan);
+        if(player != null)
+        {
+            player.playerNetServerHandler.kickPlayer("Banned by admin");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/ban <username>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/BanIpCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/BanIpCommand.java
new file mode 100644
index 000000000..9e990b52f
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/BanIpCommand.java
@@ -0,0 +1,42 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.entity.player.ServerPlayer;
+
+public class BanIpCommand extends ServerCommand {
+    public BanIpCommand(MinecraftServer server) {
+        super(server, "ban-ip");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length != 1) return false;
+        String senderName = sender.getName();
+
+        String nameToBan = args[0];
+        server.playerList.banIP(nameToBan);
+        
+        sendNoticeToOps(senderName, "Banning ip " + nameToBan);
+
+        ServerPlayer player = server.playerList.getPlayerEntity(nameToBan);
+        if(player != null)
+        {
+            player.playerNetServerHandler.kickPlayer("Banned by admin");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/ban-ip <username>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/ColorCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/ColorCommand.java
similarity index 83%
rename from src/main/java/net/minecraft/core/net/command/commands/ColorCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/ColorCommand.java
index 5ae3852be..5c11a6ea7 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/ColorCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/ColorCommand.java
@@ -1,8 +1,8 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
 import net.minecraft.core.net.command.*;
 
 public class ColorCommand extends ServerCommand {
@@ -14,7 +14,7 @@ public class ColorCommand extends ServerCommand {
 	@Override
 	public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
 		if(!sender.isPlayer()) throw new CommandError("Must be used by a player!");
-		EntityPlayerMP player = (EntityPlayerMP) sender.getPlayer();
+		ServerPlayer player = (ServerPlayer) sender.getPlayer();
 		
 		if(args.length == 0) {
 			{
@@ -57,7 +57,7 @@ public class ColorCommand extends ServerCommand {
 		newColor = (byte) color.id;
 		player.chatColor = newColor;
 		player.hadNicknameSet = true;
-		player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, newColor, true, player.isOperator()));
+		player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, newColor, true, player.isOperator()));
 		sender.sendMessage(TextFormatting.LIGHT_GRAY + "You changed your color to " + color + color.getNames()[0]);
 		return true;
 	}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/DeopCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/DeopCommand.java
similarity index 72%
rename from src/main/java/net/minecraft/core/net/command/commands/DeopCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/DeopCommand.java
index 1bffff740..282120958 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/DeopCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/DeopCommand.java
@@ -1,8 +1,8 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
@@ -27,10 +27,10 @@ public class DeopCommand extends ServerCommand{
 			handler.sendCommandFeedback(sender, "De-opping "+name);
 		}
 
-		EntityPlayerMP player = (EntityPlayerMP) handler.getPlayer(name);
+		ServerPlayer player = (ServerPlayer) handler.getPlayer(name);
 		if(player != null && playerWasOp) {
 			handler.sendMessageToPlayer(player, TextFormatting.YELLOW + "You are no longer op!");
-			player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+			player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
 		}
 		
 		return true;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/DifficultyCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/DifficultyCommand.java
similarity index 96%
rename from src/main/java/net/minecraft/core/net/command/commands/DifficultyCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/DifficultyCommand.java
index b326353f2..323fd18be 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/DifficultyCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/DifficultyCommand.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.core.world.World;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/EmotesCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/EmotesCommand.java
similarity index 96%
rename from src/main/java/net/minecraft/core/net/command/commands/EmotesCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/EmotesCommand.java
index 01d8f3a78..c925a40fe 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/EmotesCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/EmotesCommand.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/KickCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/KickCommand.java
new file mode 100644
index 000000000..7613689a8
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/KickCommand.java
@@ -0,0 +1,50 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.entity.player.ServerPlayer;
+
+public class KickCommand extends ServerCommand {
+    public KickCommand(MinecraftServer server) {
+        super(server, "kick");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length != 1) return false;
+        String senderName = sender.getName();
+
+        String nameToKick = args[0];
+
+        ServerPlayer playerToKick = null;
+        for (ServerPlayer playerMP : server.playerList.playerEntities){
+            if(playerMP.username.equalsIgnoreCase(nameToKick))
+            {
+                playerToKick = playerMP;
+                break;
+            }
+        }
+
+        if(playerToKick != null)
+        {
+            playerToKick.playerNetServerHandler.kickPlayer("Kicked by admin");
+            sendNoticeToOps(senderName, "Kicking " + playerToKick.getDisplayName());
+        } else
+        {
+            server.log("Can't find user " + nameToKick + ". No kick attempted.");
+        }
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/kick <username>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/ListCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/ListCommand.java
similarity index 95%
rename from src/main/java/net/minecraft/core/net/command/commands/ListCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/ListCommand.java
index f00b7ab4c..34ad7f6f1 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/ListCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/ListCommand.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.core.net.command.CommandHandler;
diff --git a/src/main/java/net/minecraft/core/net/command/MeCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/MeCommand.java
similarity index 70%
rename from src/main/java/net/minecraft/core/net/command/MeCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/MeCommand.java
index a6b4ee3c1..ab3c7fa2c 100644
--- a/src/main/java/net/minecraft/core/net/command/MeCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/MeCommand.java
@@ -1,8 +1,12 @@
-package net.minecraft.core.net.command;
+package net.minecraft.core.net.command.servercommands;
 
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.server.MinecraftServer;
 
-public class MeCommand extends ServerCommand{
+public class MeCommand extends ServerCommand {
 	
 	public MeCommand(MinecraftServer server) {
 		super(server, "me");
diff --git a/src/main/java/net/minecraft/core/net/command/commands/NicknameCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/NicknameCommand.java
similarity index 85%
rename from src/main/java/net/minecraft/core/net/command/commands/NicknameCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/NicknameCommand.java
index acee986f0..e95b3881e 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/NicknameCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/NicknameCommand.java
@@ -1,8 +1,8 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
 import net.minecraft.core.net.command.*;
 
 public class NicknameCommand extends ServerCommand
@@ -18,7 +18,7 @@ public class NicknameCommand extends ServerCommand
         }
 
 
-        EntityPlayerMP player = (EntityPlayerMP) sender.getPlayer();
+        ServerPlayer player = (ServerPlayer) sender.getPlayer();
 
         if (args[0].equalsIgnoreCase("set"))
         {
@@ -34,7 +34,7 @@ public class NicknameCommand extends ServerCommand
 
             player.nickname = enteredNickname;
             player.hadNicknameSet = true;
-            player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+            player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
             sender.sendMessage("You set your nickname to " + player.getDisplayName());
             return true;
         }
@@ -51,13 +51,13 @@ public class NicknameCommand extends ServerCommand
             if (args.length != 1) return false;
             player.nickname = "";
             player.hadNicknameSet = true;
-            player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+            player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
             sender.sendMessage("You cleared your nickname.");
             return true;
         }
         else
         {
-            player = (EntityPlayerMP)handler.getPlayer(args[0]);
+            player = (ServerPlayer)handler.getPlayer(args[0]);
             if (player == null) throw new CommandError("Unknown username!");
             if (args.length < 2) return false;
             if (!sender.isAdmin() && !sender.isConsole()) return false;
@@ -74,7 +74,7 @@ public class NicknameCommand extends ServerCommand
 
                 player.nickname = enteredNickname;
                 player.hadNicknameSet = true;
-                player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+                player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
                 sender.sendMessage("Set " + player.username + "'s nickname to " + player.getDisplayName());
                 handler.sendMessageToPlayer(player, "Your nickname was set to " + player.getDisplayName());
                 return true;
@@ -90,7 +90,7 @@ public class NicknameCommand extends ServerCommand
                 if (args.length != 2) return false;
                 player.nickname = "";
                 player.hadNicknameSet = true;
-                player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+                player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
                 sender.sendMessage("Cleared " + player.username + "'s nickname.");
                 handler.sendMessageToPlayer(player, "Your nickname was cleared.");
                 return true;
diff --git a/src/main/java/net/minecraft/core/net/command/commands/OpCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/OpCommand.java
similarity index 69%
rename from src/main/java/net/minecraft/core/net/command/commands/OpCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/OpCommand.java
index ca7e26058..026b6c8f8 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/OpCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/OpCommand.java
@@ -1,8 +1,8 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
@@ -22,10 +22,10 @@ public class OpCommand extends ServerCommand{
 		server.playerList.opPlayer(name);
 		handler.sendCommandFeedback(sender, "Opping "+name);
 		
-		EntityPlayerMP player = (EntityPlayerMP) handler.getPlayer(name);
+		ServerPlayer player = (ServerPlayer) handler.getPlayer(name);
 		if(player != null) {
 			handler.sendMessageToPlayer(player, TextFormatting.YELLOW + "You are now op!");
-			player.mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+			player.mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
 		}
 
 		return true;
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/PardonCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/PardonCommand.java
new file mode 100644
index 000000000..b15372123
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/PardonCommand.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+
+public class PardonCommand extends ServerCommand {
+    public PardonCommand(MinecraftServer server) {
+        super(server, "pardon");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length != 1) return false;
+        String senderName = sender.getName();
+
+        String nameToPardon = args[0];
+
+        server.playerList.pardonPlayer(nameToPardon);
+        sendNoticeToOps(senderName, "Pardoning " + nameToPardon);
+
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/pardon <username>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/PardonIpCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/PardonIpCommand.java
new file mode 100644
index 000000000..cfdb32836
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/PardonIpCommand.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+
+public class PardonIpCommand extends ServerCommand {
+    public PardonIpCommand(MinecraftServer server) {
+        super(server, "pardon-ip");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length != 1) return false;
+        String senderName = sender.getName();
+
+        String nameToPardon = args[0];
+
+        server.playerList.pardonIP(nameToPardon);
+        sendNoticeToOps(senderName, "Pardoning ip " + nameToPardon);
+
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/pardon-ip <username>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/SaveCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/SaveCommand.java
new file mode 100644
index 000000000..2d95ff2b8
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/SaveCommand.java
@@ -0,0 +1,91 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.world.WorldServer;
+
+public class SaveCommand extends ServerCommand {
+    public SaveCommand(MinecraftServer server) {
+        super(server, "save");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        String senderName = sender.getName();
+        if(args.length < 1)
+        {
+            return false;
+        }
+        String subCommand = args[0].toLowerCase();
+
+        switch (subCommand){
+            case "all":
+                sendNoticeToOps(senderName, "Forcing save..");
+                if(server.playerList != null) {
+                    server.playerList.savePlayerStates();
+                }
+                for(int i = 0; i < server.dimensionWorlds.length; i++) {
+                    WorldServer worldserver = server.dimensionWorlds[i];
+                    worldserver.saveWorld(true, null, i == 0);
+                }
+
+                sendNoticeToOps(senderName, "Save complete.");
+                return true;
+            case "on":
+                sendNoticeToOps(senderName, "Enabling level saving..");
+                for(int k = 0; k < server.dimensionWorlds.length; k++)
+                {
+                    WorldServer worldserver2 = server.dimensionWorlds[k];
+                    worldserver2.levelSaving = false;
+                }
+                return true;
+            case "off":
+                sendNoticeToOps(senderName, "Disabling level saving..");
+                for(int j = 0; j < server.dimensionWorlds.length; j++)
+                {
+                    WorldServer worldserver1 = server.dimensionWorlds[j];
+                    worldserver1.levelSaving = true;
+                }
+                return true;
+            case "interval":
+                if (args.length < 2) {
+                    sender.sendMessage("Current save interval is " + server.propertyManager.getIntProperty("autosaveInterval", server.autoSaveInterval));
+                    return true;
+                }
+                int interval = Integer.parseInt(args[1]);
+                server.propertyManager.setProperty("autosaveInterval", interval);
+                server.autoSaveInterval = interval;
+                sendNoticeToOps(senderName, "Setting save interval to " + interval);
+                return true;
+            case "amount":
+                if (args.length < 2) {
+                    sender.sendMessage("Current chunks saved per autosave is " + server.propertyManager.getIntProperty("maxChunksSavedPerAutosave", server.chunksSavedPerAutosave));
+                    return true;
+                }
+                int amount = Integer.parseInt(args[1]);
+                server.propertyManager.setProperty("maxChunksSavedPerAutosave", amount);
+                server.chunksSavedPerAutosave = amount;
+                sendNoticeToOps(senderName, "Setting max chunks saved to " + amount);
+                return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/save on");
+        sender.sendMessage("/save off");
+        sender.sendMessage("/save all");
+        sender.sendMessage("/save interval");
+        sender.sendMessage("/save interval <seconds>");
+        sender.sendMessage("/save amount");
+        sender.sendMessage("/save amount <chunks>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/SayCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/SayCommand.java
new file mode 100644
index 000000000..92ad1a49b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/SayCommand.java
@@ -0,0 +1,42 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.net.packet.ChatPacket;
+import net.minecraft.server.MinecraftServer;
+
+public class SayCommand extends ServerCommand {
+    public SayCommand(MinecraftServer server) {
+        super(server, "say");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        if (args.length < 1) return false;
+
+        String senderName = sender.getName();
+
+        StringBuilder messageBuilder = new StringBuilder();
+        for (String arg : args){
+            messageBuilder.append(arg).append(" ");
+        }
+        String message = messageBuilder.toString().trim();
+
+        MinecraftServer.logger.info("[" + senderName + "] " + message);
+        server.playerList.sendPacketToAllPlayers(new ChatPacket(TextFormatting.PINK + "[Server] " + message));
+
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/say <message>");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/ScoreCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/ScoreCommand.java
similarity index 76%
rename from src/main/java/net/minecraft/core/net/command/commands/ScoreCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/ScoreCommand.java
index 5ced7d023..29f7c88a4 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/ScoreCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/ScoreCommand.java
@@ -1,8 +1,8 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
@@ -19,7 +19,7 @@ public class ScoreCommand extends ServerCommand
     public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
         if (args.length < 2) return false;
 
-        EntityPlayerMP player = (EntityPlayerMP)handler.getPlayer(args[0]);
+        ServerPlayer player = (ServerPlayer)handler.getPlayer(args[0]);
         if (player == null) return false;
 
         if (args[1].equalsIgnoreCase("set"))
@@ -29,7 +29,7 @@ public class ScoreCommand extends ServerCommand
             int newScore = Integer.parseInt(args[2]);
 
             player.score = newScore;
-            server.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+            server.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
             sender.sendMessage("Set " + player.getDisplayName() + TextFormatting.WHITE + "'s score to " + player.score);
             handler.sendMessageToPlayer(player, "Your score was set to " + player.score);
             return true;
@@ -42,7 +42,7 @@ public class ScoreCommand extends ServerCommand
         if (args[1].equalsIgnoreCase("reset"))
         {
             player.score = 0;
-            server.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
+            server.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(player.username, player.nickname, player.score, player.chatColor, true, player.isOperator()));
             sender.sendMessage("Set " + player.getDisplayName() + TextFormatting.WHITE + "'s score to " + player.score);
             handler.sendMessageToPlayer(player, "Your score was set to " + player.score);
             return true;
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/ScoreboardCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/ScoreboardCommand.java
new file mode 100644
index 000000000..12fdc4110
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/ScoreboardCommand.java
@@ -0,0 +1,47 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.entity.player.ServerPlayer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ScoreboardCommand extends ServerCommand {
+    public ScoreboardCommand(MinecraftServer server) {
+        super(server, "scoreboard");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        StringBuilder scoreBoardMessage = new StringBuilder();
+        List<ServerPlayer> players = new ArrayList<>(server.playerList.playerEntities);
+
+        players.sort((o1, o2) -> o2.score - o1.score);
+
+        for (int i = 0; i < players.size(); i++)
+        {
+            if (i > 0)
+            {
+                scoreBoardMessage.append(", ");
+            }
+            ServerPlayer player = players.get(i);
+            scoreBoardMessage.append(player.getDisplayName()).append(": ").append(TextFormatting.YELLOW).append(player.score).append("pts").append(TextFormatting.WHITE);
+        }
+        sender.sendMessage(scoreBoardMessage.toString());
+        return true;
+    }
+
+    @Override
+    public boolean opRequired(String[] args) {
+        return false;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/scoreboard");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/StopCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/StopCommand.java
similarity index 94%
rename from src/main/java/net/minecraft/core/net/command/commands/StopCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/StopCommand.java
index 07029ad93..b951f4f16 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/StopCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/StopCommand.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.core.net.command.CommandHandler;
diff --git a/src/main/java/net/minecraft/core/net/command/servercommands/WhitelistCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/WhitelistCommand.java
new file mode 100644
index 000000000..004979ab6
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/WhitelistCommand.java
@@ -0,0 +1,80 @@
+package net.minecraft.core.net.command.servercommands;
+
+import net.minecraft.core.net.command.CommandHandler;
+import net.minecraft.core.net.command.CommandSender;
+import net.minecraft.core.net.command.ServerCommand;
+import net.minecraft.server.MinecraftServer;
+
+import java.util.Set;
+
+public class WhitelistCommand extends ServerCommand {
+    public WhitelistCommand(MinecraftServer server) {
+        super(server, "whitelist");
+    }
+
+    @Override
+    public boolean execute(CommandHandler handler, CommandSender sender, String[] args) {
+        String senderName = sender.getName();
+        if(args.length < 1)
+        {
+            return false;
+        }
+        String subCommand = args[0].toLowerCase();
+
+        switch (subCommand){
+            case "on":
+                sendNoticeToOps(senderName, "Turned on white-listing");
+                server.propertyManager.setProperty("white-list", true);
+                return true;
+            case "off":
+                sendNoticeToOps(senderName, "Turned off white-listing");
+                server.propertyManager.setProperty("white-list", false);
+                return true;
+            case "list":
+                Set<String> set = server.playerList.getWhitelist();
+                StringBuilder builder = new StringBuilder();
+                for (String s6 : set) {
+                    builder.append("\"").append(s6).append("\"").append(", ");
+                }
+
+                String message = builder.toString();
+                if (message.endsWith(", ")){
+                    message = message.substring(0, message.length()-2);
+                }
+
+                sender.sendMessage("White-listed players: " + message);
+                return true;
+            case "add":
+                if (args.length != 2) return false;
+                String nameToAdd = args[1].toLowerCase();
+                server.playerList.addToWhiteList(nameToAdd);
+                sendNoticeToOps(senderName, "Added " + nameToAdd + " to white-list");
+                return true;
+            case "remove":
+                if (args.length != 2) return false;
+                String nameToRemove = args[1].toLowerCase();
+                server.playerList.removeFromWhiteList(nameToRemove);
+                sendNoticeToOps(senderName, "Removed " + nameToRemove + " from white-list");
+                return true;
+            case "reload":
+                server.playerList.reloadWhiteList();
+                sendNoticeToOps(senderName, "Reloaded white-list from file");
+                return true;
+        }
+        return false;
+    }
+    @Override
+    public boolean opRequired(String[] args) {
+        return true;
+    }
+
+    @Override
+    public void sendCommandSyntax(CommandHandler handler, CommandSender sender) {
+        sender.sendMessage("/whitelist on");
+        sender.sendMessage("/whitelist off");
+        sender.sendMessage("/whitelist list");
+        sender.sendMessage("/whitelist add <player>");
+        sender.sendMessage("/whitelist remove <player>");
+        sender.sendMessage("/whitelist reload");
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/command/commands/WhoisCommand.java b/src/main/java/net/minecraft/core/net/command/servercommands/WhoisCommand.java
similarity index 89%
rename from src/main/java/net/minecraft/core/net/command/commands/WhoisCommand.java
rename to src/main/java/net/minecraft/core/net/command/servercommands/WhoisCommand.java
index 3414e48af..57e6cc5ce 100644
--- a/src/main/java/net/minecraft/core/net/command/commands/WhoisCommand.java
+++ b/src/main/java/net/minecraft/core/net/command/servercommands/WhoisCommand.java
@@ -1,7 +1,7 @@
-package net.minecraft.core.net.command.commands;
+package net.minecraft.core.net.command.servercommands;
 
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.CommandHandler;
 import net.minecraft.core.net.command.CommandSender;
@@ -24,7 +24,7 @@ public class WhoisCommand extends ServerCommand {
         String enteredNickname = enteredNicknameStr.substring(0, enteredNicknameStr.length() - 1);
         if (enteredNickname.length() > 16) enteredNickname = enteredNickname.substring(0, 16);
 
-        for (EntityPlayerMP player : server.playerList.playerEntities)
+        for (ServerPlayer player : server.playerList.playerEntities)
         {
             String name = TextFormatting.removeAllFormatting(player.getDisplayName());
             if (name.equals(enteredNickname))
diff --git a/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java b/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
index ca2eca917..f2aa675a9 100644
--- a/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.net.entity;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTrackerEntry;
 
 public interface IVehicleEntry<T> extends IPacketEntry<T> {
     Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner);
-    Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, T trackedObject);
+    AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, T trackedObject);
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java b/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java
index 1f32af28f..63ea1ec02 100644
--- a/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java
+++ b/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java
@@ -18,7 +18,6 @@ import net.minecraft.core.net.entity.entries.SnowballNetEntry;
 import net.minecraft.core.net.entity.entries.SquidNetEntry;
 import net.minecraft.core.net.entity.entries.TNTNetEntry;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java
index c512115ad..93dc18279 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.IAnimal;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.Creature;
 import net.minecraft.core.net.entity.IPacketEntry;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet24MobSpawn;
+import net.minecraft.core.net.packet.AddMobPacket;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class AnimalNetEntry<T extends IAnimal> implements IPacketEntry<T>, ITrackedEntry<T> {
+public class AnimalNetEntry<T extends Creature> implements IPacketEntry<T>, ITrackedEntry<T> {
     @Override
     public @NotNull Class<T> getAppliedClass() {
-        return (Class<T>) IAnimal.class;
+        return (Class<T>) Creature.class;
     }
 
     @Override
@@ -32,12 +32,12 @@ public class AnimalNetEntry<T extends IAnimal> implements IPacketEntry<T>, ITrac
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, IAnimal trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, Creature trackedObject) {
 
     }
 
     @Override
-    public Packet getSpawnPacket(EntityTrackerEntry tracker, IAnimal trackedObject) {
-        return new Packet24MobSpawn((EntityLiving) trackedObject);
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, Creature trackedObject) {
+        return new AddMobPacket((Mob) trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java
index 2e025486c..86ebf4325 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java
@@ -1,23 +1,22 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityArrowPurple;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
+import net.minecraft.core.entity.projectile.ArrowProjectileGolden;
+import net.minecraft.core.entity.projectile.ArrowProjectilePurple;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class ArrowNetEntry implements IVehicleEntry<EntityArrow>, ITrackedEntry<EntityArrow> {
+public class ArrowNetEntry implements IVehicleEntry<ArrowProjectile>, ITrackedEntry<ArrowProjectile> {
     @Override
-    public @NotNull Class<EntityArrow> getAppliedClass() {
-        return EntityArrow.class;
+    public @NotNull Class<ArrowProjectile> getAppliedClass() {
+        return ArrowProjectile.class;
     }
 
     @Override
@@ -36,25 +35,25 @@ public class ArrowNetEntry implements IVehicleEntry<EntityArrow>, ITrackedEntry<
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityArrow trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, ArrowProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
         if (metadata == 2) {
-            return new EntityArrowGolden(world, x, y, z);
+            return new ArrowProjectileGolden(world, x, y, z);
         } else if (metadata == 1) {
-            return new EntityArrowPurple(world, x, y, z);
+            return new ArrowProjectilePurple(world, x, y, z);
         } else {
-            return new EntityArrow(world, x, y, z, metadata);
+            return new ArrowProjectile(world, x, y, z, metadata);
         }
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityArrow trackedObject) {
-        EntityLiving entityliving = trackedObject.owner;
-        return new Packet23VehicleSpawn(trackedObject,
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, ArrowProjectile trackedObject) {
+        Mob entityliving = trackedObject.owner;
+        return new AddEntityPacket(trackedObject,
             trackedObject.getArrowType(), entityliving == null ? -1 : entityliving.id,
             trackedObject.xd, trackedObject.yd, trackedObject.zd);
     }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java
index 5dae1d34e..2adf2535c 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class BoatNetEntry implements IVehicleEntry<EntityBoat>, ITrackedEntry<EntityBoat> {
+public class BoatNetEntry implements IVehicleEntry<BoatEntity>, ITrackedEntry<BoatEntity> {
     @Override
-    public @NotNull Class<EntityBoat> getAppliedClass() {
-        return EntityBoat.class;
+    public @NotNull Class<BoatEntity> getAppliedClass() {
+        return BoatEntity.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class BoatNetEntry implements IVehicleEntry<EntityBoat>, ITrackedEntry<En
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityBoat trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, BoatEntity trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityBoat(world, x, y, z);
+        return new BoatEntity(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityBoat trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, BoatEntity trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java
index 77cce06c3..7ed14118a 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityBobber;
+import net.minecraft.core.entity.FishingBobberEntity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class BobberEntry implements IVehicleEntry<EntityBobber>, ITrackedEntry<EntityBobber> {
+public class BobberEntry implements IVehicleEntry<FishingBobberEntity>, ITrackedEntry<FishingBobberEntity> {
     @Override
-    public @NotNull Class<EntityBobber> getAppliedClass() {
-        return EntityBobber.class;
+    public @NotNull Class<FishingBobberEntity> getAppliedClass() {
+        return FishingBobberEntity.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class BobberEntry implements IVehicleEntry<EntityBobber>, ITrackedEntry<E
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityBobber trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, FishingBobberEntity trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityBobber(world, x, y, z);
+        return new FishingBobberEntity(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityBobber trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, FishingBobberEntity trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java
index b6c80012b..605d42e09 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java
@@ -1,21 +1,20 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.projectile.EntityCannonball;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.projectile.CannonballProjectile;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class CannonballEntry implements IVehicleEntry<EntityCannonball>, ITrackedEntry<EntityCannonball> {
+public class CannonballEntry implements IVehicleEntry<CannonballProjectile>, ITrackedEntry<CannonballProjectile> {
     @Override
-    public @NotNull Class<EntityCannonball> getAppliedClass() {
-        return EntityCannonball.class;
+    public @NotNull Class<CannonballProjectile> getAppliedClass() {
+        return CannonballProjectile.class;
     }
 
     @Override
@@ -34,19 +33,19 @@ public class CannonballEntry implements IVehicleEntry<EntityCannonball>, ITracke
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityCannonball trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, CannonballProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityCannonball(world, x, y, z);
+        return new CannonballProjectile(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityCannonball trackedObject) {
-        EntityLiving entityliving = trackedObject.owner;
-        return new Packet23VehicleSpawn(trackedObject, -1,
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, CannonballProjectile trackedObject) {
+        Mob entityliving = trackedObject.owner;
+        return new AddEntityPacket(trackedObject, -1,
             entityliving == null ? -1 : entityliving.id,
             trackedObject.xd, trackedObject.yd, trackedObject.zd);
     }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java
index 0f28b1408..ada44ecc5 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityEgg;
+import net.minecraft.core.entity.projectile.EggProjectile;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class EggNetEntry implements IVehicleEntry<EntityEgg>, ITrackedEntry<EntityEgg> {
+public class EggNetEntry implements IVehicleEntry<EggProjectile>, ITrackedEntry<EggProjectile> {
     @Override
-    public @NotNull Class<EntityEgg> getAppliedClass() {
-        return EntityEgg.class;
+    public @NotNull Class<EggProjectile> getAppliedClass() {
+        return EggProjectile.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class EggNetEntry implements IVehicleEntry<EntityEgg>, ITrackedEntry<Enti
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityEgg trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EggProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityEgg(world, x, y, z);
+        return new EggProjectile(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityEgg trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, EggProjectile trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java
index c7368b4d2..640492592 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java
@@ -2,21 +2,20 @@ package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityFallingSand;
+import net.minecraft.core.entity.FallingBlockEntity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class FallingSandNetEntry implements IVehicleEntry<EntityFallingSand>, ITrackedEntry<EntityFallingSand> {
+public class FallingSandNetEntry implements IVehicleEntry<FallingBlockEntity>, ITrackedEntry<FallingBlockEntity> {
     @Override
-    public @NotNull Class<EntityFallingSand> getAppliedClass() {
-        return EntityFallingSand.class;
+    public @NotNull Class<FallingBlockEntity> getAppliedClass() {
+        return FallingBlockEntity.class;
     }
 
     @Override
@@ -35,17 +34,17 @@ public class FallingSandNetEntry implements IVehicleEntry<EntityFallingSand>, IT
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityFallingSand trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, FallingBlockEntity trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityFallingSand(world, x, y, z, MathHelper.clamp(metadata, 0, Block.blocksList.length));
+        return new FallingBlockEntity(world, x, y, z, MathHelper.clamp(metadata, 0, Block.blocksList.length));
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityFallingSand trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject, trackedObject.blockID);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, FallingBlockEntity trackedObject) {
+        return new AddEntityPacket(trackedObject, trackedObject.blockID);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java
index 879fdf2b3..1efec894c 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityFireball;
+import net.minecraft.core.entity.projectile.FireballProjectile;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class FireballNetEntry implements IVehicleEntry<EntityFireball>, ITrackedEntry<EntityFireball> {
+public class FireballNetEntry implements IVehicleEntry<FireballProjectile>, ITrackedEntry<FireballProjectile> {
     @Override
-    public @NotNull Class<EntityFireball> getAppliedClass() {
-        return EntityFireball.class;
+    public @NotNull Class<FireballProjectile> getAppliedClass() {
+        return FireballProjectile.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class FireballNetEntry implements IVehicleEntry<EntityFireball>, ITracked
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityFireball trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, FireballProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityFireball(world, x, y, z, xd, yd, zd);
+        return new FireballProjectile(world, x, y, z, xd, yd, zd);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityFireball trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject, -1, -1, trackedObject.accelX, trackedObject.accelY, trackedObject.accelZ);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, FireballProjectile trackedObject) {
+        return new AddEntityPacket(trackedObject, -1, -1, trackedObject.xPower, trackedObject.yPower, trackedObject.zPower);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java
index e1eacd0dd..73f14b243 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.entity.entries;
 
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import org.jetbrains.annotations.NotNull;
 
-public class FireflyNetEntry extends AnimalNetEntry<EntityFireflyCluster>{
+public class FireflyNetEntry extends AnimalNetEntry<FireflyClusterMob>{
     @Override
-    public @NotNull Class<EntityFireflyCluster> getAppliedClass() {
-        return EntityFireflyCluster.class;
+    public @NotNull Class<FireflyClusterMob> getAppliedClass() {
+        return FireflyClusterMob.class;
     }
     @Override
     public int getPacketDelay() {
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java
index 6bf51138d..5932262a1 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java
@@ -1,18 +1,18 @@
 package net.minecraft.core.net.entity.entries;
 
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.net.entity.IPacketEntry;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet21PickupSpawn;
+import net.minecraft.core.net.packet.AddItemEntityPacket;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class ItemNetEntry implements IPacketEntry<EntityItem>, ITrackedEntry<EntityItem> {
+public class ItemNetEntry implements IPacketEntry<ItemEntity>, ITrackedEntry<ItemEntity> {
     @Override
-    public @NotNull Class<EntityItem> getAppliedClass() {
-        return EntityItem.class;
+    public @NotNull Class<ItemEntity> getAppliedClass() {
+        return ItemEntity.class;
     }
 
     @Override
@@ -31,16 +31,16 @@ public class ItemNetEntry implements IPacketEntry<EntityItem>, ITrackedEntry<Ent
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityItem trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, ItemEntity trackedObject) {
 
     }
 
     @Override
-    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityItem trackedObject) {
-        Packet21PickupSpawn packet21pickupspawn = new Packet21PickupSpawn(trackedObject);
-        trackedObject.x = packet21pickupspawn.xPosition / 32D;
-        trackedObject.y = packet21pickupspawn.yPosition / 32D;
-        trackedObject.z = packet21pickupspawn.zPosition / 32D;
-        return packet21pickupspawn;
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, ItemEntity trackedObject) {
+        AddItemEntityPacket addItemEntityPacket21Pickupspawn = new AddItemEntityPacket(trackedObject);
+        trackedObject.x = addItemEntityPacket21Pickupspawn.xPosition / 32D;
+        trackedObject.y = addItemEntityPacket21Pickupspawn.yPosition / 32D;
+        trackedObject.z = addItemEntityPacket21Pickupspawn.zPosition / 32D;
+        return addItemEntityPacket21Pickupspawn;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java
index cbbb7ae7c..32ed74a76 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class MinecartNetEntry implements IVehicleEntry<EntityMinecart>, ITrackedEntry<EntityMinecart> {
+public class MinecartNetEntry implements IVehicleEntry<MinecartEntity>, ITrackedEntry<MinecartEntity> {
     @Override
-    public @NotNull Class<EntityMinecart> getAppliedClass() {
-        return EntityMinecart.class;
+    public @NotNull Class<MinecartEntity> getAppliedClass() {
+        return MinecartEntity.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class MinecartNetEntry implements IVehicleEntry<EntityMinecart>, ITracked
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityMinecart trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, MinecartEntity trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityMinecart(world, x, y, z, metadata);
+        return new MinecartEntity(world, x, y, z, metadata);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityMinecart trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject, trackedObject.minecartType);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, MinecartEntity trackedObject) {
+        return new AddEntityPacket(trackedObject, trackedObject.type);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java
index 9f3994db1..cfbced100 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java
@@ -1,18 +1,18 @@
 package net.minecraft.core.net.entity.entries;
 
-import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.entity.PaintingEntity;
 import net.minecraft.core.net.entity.IPacketEntry;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet25EntityPainting;
+import net.minecraft.core.net.packet.AddPaintingPacket;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class PaintingNetEntry implements IPacketEntry<EntityPainting>, ITrackedEntry<EntityPainting> {
+public class PaintingNetEntry implements IPacketEntry<PaintingEntity>, ITrackedEntry<PaintingEntity> {
     @Override
-    public @NotNull Class<EntityPainting> getAppliedClass() {
-        return EntityPainting.class;
+    public @NotNull Class<PaintingEntity> getAppliedClass() {
+        return PaintingEntity.class;
     }
 
     @Override
@@ -31,12 +31,12 @@ public class PaintingNetEntry implements IPacketEntry<EntityPainting>, ITrackedE
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPainting trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, PaintingEntity trackedObject) {
 
     }
 
     @Override
-    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityPainting trackedObject) {
-        return new Packet25EntityPainting(trackedObject);
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, PaintingEntity trackedObject) {
+        return new AddPaintingPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java
index 342911034..fc2315521 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java
@@ -1,20 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityPebble;
+import net.minecraft.core.entity.projectile.PebbleProjectile;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class PebbleEntry implements IVehicleEntry<EntityPebble>, ITrackedEntry<EntityPebble> {
+public class PebbleEntry implements IVehicleEntry<PebbleProjectile>, ITrackedEntry<PebbleProjectile> {
     @Override
-    public @NotNull Class<EntityPebble> getAppliedClass() {
-        return EntityPebble.class;
+    public @NotNull Class<PebbleProjectile> getAppliedClass() {
+        return PebbleProjectile.class;
     }
 
     @Override
@@ -33,17 +32,17 @@ public class PebbleEntry implements IVehicleEntry<EntityPebble>, ITrackedEntry<E
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPebble trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, PebbleProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityPebble(world, x, y, z);
+        return new PebbleProjectile(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityPebble trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, PebbleProjectile trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java
index 092ecd0cb..1576f2d51 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java
@@ -3,16 +3,16 @@ package net.minecraft.core.net.entity.entries;
 import net.minecraft.core.net.entity.IPacketEntry;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet20NamedEntitySpawn;
+import net.minecraft.core.net.packet.AddPlayerPacket;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import org.jetbrains.annotations.NotNull;
 
-public class PlayerMPNetEntry implements IPacketEntry<EntityPlayerMP>, ITrackedEntry<EntityPlayerMP> {
+public class PlayerMPNetEntry implements IPacketEntry<ServerPlayer>, ITrackedEntry<ServerPlayer> {
     @Override
-    public @NotNull Class<EntityPlayerMP> getAppliedClass() {
-        return EntityPlayerMP.class;
+    public @NotNull Class<ServerPlayer> getAppliedClass() {
+        return ServerPlayer.class;
     }
 
     @Override
@@ -31,7 +31,7 @@ public class PlayerMPNetEntry implements IPacketEntry<EntityPlayerMP>, ITrackedE
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPlayerMP trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, ServerPlayer trackedObject) {
         for (EntityTrackerEntry entitytrackerentry : tracker.trackedEntitySet) {
             if (entitytrackerentry.trackedEntity != trackedObject) {
                 entitytrackerentry.updatePlayerEntity(trackedObject);
@@ -40,7 +40,7 @@ public class PlayerMPNetEntry implements IPacketEntry<EntityPlayerMP>, ITrackedE
     }
 
     @Override
-    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityPlayerMP trackedObject) {
-        return new Packet20NamedEntitySpawn(trackedObject);
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, ServerPlayer trackedObject) {
+        return new AddPlayerPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java
index 946d33e55..bcc36c0da 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntitySnowball;
+import net.minecraft.core.entity.projectile.SnowballProjectile;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class SnowballNetEntry implements IVehicleEntry<EntitySnowball>, ITrackedEntry<EntitySnowball> {
+public class SnowballNetEntry implements IVehicleEntry<SnowballProjectile>, ITrackedEntry<SnowballProjectile> {
     @Override
-    public @NotNull Class<EntitySnowball> getAppliedClass() {
-        return EntitySnowball.class;
+    public @NotNull Class<SnowballProjectile> getAppliedClass() {
+        return SnowballProjectile.class;
     }
 
     @Override
@@ -32,17 +32,17 @@ public class SnowballNetEntry implements IVehicleEntry<EntitySnowball>, ITracked
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntitySnowball trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, SnowballProjectile trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntitySnowball(world, x, y, z);
+        return new SnowballProjectile(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntitySnowball trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, SnowballProjectile trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java
index fab9a5cd7..e7c6450d7 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.entity.entries;
 
-import net.minecraft.core.entity.animal.EntitySquid;
+import net.minecraft.core.entity.animal.SquidMob;
 import org.jetbrains.annotations.NotNull;
 
-public class SquidNetEntry extends AnimalNetEntry<EntitySquid>{
+public class SquidNetEntry extends AnimalNetEntry<SquidMob>{
     @Override
-    public @NotNull Class<EntitySquid> getAppliedClass() {
-        return EntitySquid.class;
+    public @NotNull Class<SquidMob> getAppliedClass() {
+        return SquidMob.class;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java
index 8842f9e15..76d865504 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java
@@ -1,19 +1,19 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.entity.TNTPrimedEntity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.IVehicleEntry;
-import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.net.packet.AddEntityPacket;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class TNTNetEntry implements IVehicleEntry<EntityTNT>, ITrackedEntry<EntityTNT> {
+public class TNTNetEntry implements IVehicleEntry<TNTPrimedEntity>, ITrackedEntry<TNTPrimedEntity> {
     @Override
-    public @NotNull Class<EntityTNT> getAppliedClass() {
-        return EntityTNT.class;
+    public @NotNull Class<TNTPrimedEntity> getAppliedClass() {
+        return TNTPrimedEntity.class;
     }
 
     @Override
@@ -32,17 +32,17 @@ public class TNTNetEntry implements IVehicleEntry<EntityTNT>, ITrackedEntry<Enti
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityTNT trackedObject) {
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, TNTPrimedEntity trackedObject) {
 
     }
 
     @Override
     public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityTNT(world, x, y, z);
+        return new TNTPrimedEntity(world, x, y, z);
     }
 
     @Override
-    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityTNT trackedObject) {
-        return new Packet23VehicleSpawn(trackedObject);
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, TNTPrimedEntity trackedObject) {
+        return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/handler/NetHandler.java b/src/main/java/net/minecraft/core/net/handler/NetHandler.java
deleted file mode 100644
index d2efb9049..000000000
--- a/src/main/java/net/minecraft/core/net/handler/NetHandler.java
+++ /dev/null
@@ -1,381 +0,0 @@
-package net.minecraft.core.net.handler;
-
-import net.minecraft.core.net.packet.*;
-
-public abstract class NetHandler
-{
-
-    public NetHandler()
-    {
-    }
-
-    public abstract boolean isServerHandler();
-
-    public void handleMapChunk(Packet51MapChunk packet51mapchunk)
-    {
-    }
-
-    public void handleInvalidPacket(Packet packet)
-    {
-    }
-
-    public void handleErrorMessage(String s, Object[] aobj)
-    {
-    }
-
-    public void handleKickDisconnect(Packet255KickDisconnect packet255kickdisconnect)
-    {
-        handleInvalidPacket(packet255kickdisconnect);
-    }
-
-    public void handleLogin(Packet1Login packet1login)
-    {
-        handleInvalidPacket(packet1login);
-    }
-
-    public void handleFlying(Packet10Flying packet10flying)
-    {
-        handleInvalidPacket(packet10flying);
-    }
-
-    public void handleMultiBlockChange(Packet52MultiBlockChange packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handleBlockDig(Packet14BlockDig packet14blockdig)
-    {
-        handleInvalidPacket(packet14blockdig);
-    }
-
-    public void handleBlockChange(Packet53BlockChange packet53blockchange)
-    {
-        handleInvalidPacket(packet53blockchange);
-    }
-
-    public void handlePreChunk(Packet50PreChunk packet50prechunk)
-    {
-        handleInvalidPacket(packet50prechunk);
-    }
-
-    public void handleNamedEntitySpawn(Packet20NamedEntitySpawn packet20namedentityspawn)
-    {
-        handleInvalidPacket(packet20namedentityspawn);
-    }
-
-    public void handleEntity(Packet30Entity packet30entity)
-    {
-        handleInvalidPacket(packet30entity);
-    }
-
-    public void handleEntityTeleport(Packet34EntityTeleport packet34entityteleport)
-    {
-        handleInvalidPacket(packet34entityteleport);
-    }
-
-    public void handlePlace(Packet15Place packet15place)
-    {
-        handleInvalidPacket(packet15place);
-    }
-
-    public void handleBlockItemSwitch(Packet16BlockItemSwitch packet16blockitemswitch)
-    {
-        handleInvalidPacket(packet16blockitemswitch);
-    }
-
-    public void handleDestroyEntity(Packet29DestroyEntity packet29destroyentity)
-    {
-        handleInvalidPacket(packet29destroyentity);
-    }
-
-    public void handleSetPaintingMotive(Packet139SetPaintingMotive packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handlePickupSpawn(Packet21PickupSpawn packet21pickupspawn)
-    {
-        handleInvalidPacket(packet21pickupspawn);
-    }
-
-    public void handleCollect(Packet22Collect packet22collect)
-    {
-        handleInvalidPacket(packet22collect);
-    }
-
-    public void handleChat(Packet3Chat packet3chat)
-    {
-        handleInvalidPacket(packet3chat);
-    }
-
-    public void handleVehicleSpawn(Packet23VehicleSpawn packet23vehiclespawn)
-    {
-        handleInvalidPacket(packet23vehiclespawn);
-    }
-
-    public void handleAnimation(Packet18Animation packet18animation)
-    {
-        handleInvalidPacket(packet18animation);
-    }
-
-    public void handleEntityAction(Packet19EntityAction packet19entityaction)
-    {
-        handleInvalidPacket(packet19entityaction);
-    }
-
-    public void handleHandshake(Packet2Handshake packet2handshake)
-    {
-        handleInvalidPacket(packet2handshake);
-    }
-
-    public void handleMobSpawn(Packet24MobSpawn packet24mobspawn)
-    {
-        handleInvalidPacket(packet24mobspawn);
-    }
-
-    public void handleUpdateTime(Packet4UpdateTime packet4updatetime)
-    {
-        handleInvalidPacket(packet4updatetime);
-    }
-
-    public void handleSpawnPosition(Packet6SpawnPosition packet6spawnposition)
-    {
-        handleInvalidPacket(packet6spawnposition);
-    }
-
-    public void handleEntityVelocity(Packet28EntityVelocity packet28entityvelocity)
-    {
-        handleInvalidPacket(packet28entityvelocity);
-    }
-
-    public void handleEntityMetadata(Packet40EntityMetadata packet40entitymetadata)
-    {
-        handleInvalidPacket(packet40entitymetadata);
-    }
-
-    public void handleAttachEntity(Packet39AttachEntity packet39attachentity)
-    {
-        handleInvalidPacket(packet39attachentity);
-    }
-
-    public void handleUseEntity(Packet7UseEntity packet7useentity)
-    {
-        handleInvalidPacket(packet7useentity);
-    }
-
-    public void handleEntityStatus(Packet38EntityStatus packet38entitystatus)
-    {
-        handleInvalidPacket(packet38entitystatus);
-    }
-
-    public void handleEntityTagData(Packet42EntityTagData packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handleUpdateHealth(Packet8UpdateHealth packet8updatehealth)
-    {
-        handleInvalidPacket(packet8updatehealth);
-    }
-
-    public void handleUpdatePlayerProfile(Packet72UpdatePlayerProfile packet72UpdatePlayerProfile)
-    {
-        handleInvalidPacket(packet72UpdatePlayerProfile);
-    }
-
-    public void handleRespawn(Packet9Respawn packet9respawn)
-    {
-        handleInvalidPacket(packet9respawn);
-    }
-
-    public void handleExplosion(Packet60Explosion packet60explosion)
-    {
-        handleInvalidPacket(packet60explosion);
-    }
-
-    public void handleOpenWindow(Packet100OpenWindow packet100openwindow)
-    {
-        handleInvalidPacket(packet100openwindow);
-    }
-
-    public void handleCloseWindow(Packet101CloseWindow packet101closewindow)
-    {
-        handleInvalidPacket(packet101closewindow);
-    }
-
-    public void handleWindowClick(Packet102WindowClick packet102windowclick)
-    {
-        handleInvalidPacket(packet102windowclick);
-    }
-
-    public void handleTileEntityData(Packet140TileEntityData packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handleSetSlot(Packet103SetSlot packet103setslot)
-    {
-        handleInvalidPacket(packet103setslot);
-    }
-
-    public void handleWindowItems(Packet104WindowItems packet104windowitems)
-    {
-        handleInvalidPacket(packet104windowitems);
-    }
-
-    public void handleUpdateSign(Packet130UpdateSign packet130updatesign)
-    {
-        handleInvalidPacket(packet130updatesign);
-    }
-
-    public void handleSetMobSpawner(Packet132SetMobSpawner packet132SetMobSpawner)
-    {
-        handleInvalidPacket(packet132SetMobSpawner);
-    }
-    
-    public void handleUpdateProgressbar(Packet105UpdateProgressbar packet105updateprogressbar)
-    {
-        handleInvalidPacket(packet105updateprogressbar);
-    }
-
-    public void handlePlayerInventory(Packet5PlayerInventory packet5playerinventory)
-    {
-        handleInvalidPacket(packet5playerinventory);
-    }
-
-    public void handleTransaction(Packet106Transaction packet106transaction)
-    {
-        handleInvalidPacket(packet106transaction);
-    }
-
-    public void handleEntityPainting(Packet25EntityPainting packet25entitypainting)
-    {
-        handleInvalidPacket(packet25entitypainting);
-    }
-    public void handleBoatControl(Packet26BoatControl packet26BoatControl)
-    {
-        handleInvalidPacket(packet26BoatControl);
-    }
-
-    public void handlePlayNoteBlock(Packet54PlayNoteBlock packet54playnoteblock)
-    {
-        handleInvalidPacket(packet54playnoteblock);
-    }
-
-    public void handleStatistic(Packet200Statistic packet200statistic)
-    {
-        handleInvalidPacket(packet200statistic);
-    }
-
-    public void handleSleep(Packet17Sleep packet17sleep)
-    {
-        handleInvalidPacket(packet17sleep);
-    }
-
-    public void handlePosition(Packet27Position packet27position)
-    {
-        handleInvalidPacket(packet27position);
-    }
-
-    public void handleBed(Packet70Bed packet70bed)
-    {
-        handleInvalidPacket(packet70bed);
-    }
-
-    public void handleWeather(Packet71Weather packet71weather)
-    {
-        handleInvalidPacket(packet71weather);
-    }
-
-    public void handleMapData(Packet131MapData packet131mapdata)
-    {
-        handleInvalidPacket(packet131mapdata);
-    }
-
-    public void handlePlaySoundEffect(Packet61PlaySoundEffect packet61doorchange)
-    {
-        handleInvalidPacket(packet61doorchange);
-    }
-    public void handlePlaySoundDirectly(Packet62PlaySoundDirect packet62PlaySoundDirect)
-    {
-        handleInvalidPacket(packet62PlaySoundDirect);
-    }
-    public void handleSpawnParticle(Packet63SpawnParticleEffect packet63SpawnParticleEffect)
-    {
-        handleInvalidPacket(packet63SpawnParticleEffect);
-    }
-
-    public void handleEntityPlayerGamemode(Packet41EntityPlayerGamemode packet41EntityPlayerGamemode)
-    {
-        handleInvalidPacket(packet41EntityPlayerGamemode);
-    }
-
-    public void handleUpdateCreativeInventory(Packet107UpdateCreativeInventory packet107UpdateCreativeInventory)
-    {
-        handleInvalidPacket(packet107UpdateCreativeInventory);
-    }
-
-    public void handleWeatherStatus(Packet73WeatherStatus packet73WeatherStatus)
-    {
-        handleInvalidPacket(packet73WeatherStatus);
-    }
-
-    public void handleOpenGuidebook(Packet133OpenGuidebook packet133OpenGuidebook)
-    {
-        handleInvalidPacket(packet133OpenGuidebook);
-    }
-
-    public void handleSetHotbarOffset(Packet108SetHotbarOffset packet108SetHotbarOffset)
-    {
-        handleInvalidPacket(packet108SetHotbarOffset);
-    }
-
-    public void handleEntityNickname(Packet35EntityNickname packet35EntityNickname)
-    {
-        handleInvalidPacket(packet35EntityNickname);
-    }
-
-    public void handleSendKey(Packet136SendKey packet136SendKey)
-    {
-        handleInvalidPacket(packet136SendKey);
-    }
-
-    public void handleItemName(Packet137SetItemName packet137SetItemName)
-    {
-        handleInvalidPacket(packet137SetItemName);
-    }
-    public void handlePlayerList(Packet138PlayerList packet138PlayerList)
-    {
-        handleInvalidPacket(packet138PlayerList);
-    }
-
-    public void handleOpenFlagWindow(Packet142OpenFlagWindow packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handlePhotoMode(Packet143PhotoMode packet)
-    {
-        handleInvalidPacket(packet);
-    }
-
-    public void handlePingHandshake(Packet254PingHandshake packet) {
-        handleInvalidPacket(packet);
-    }
-
-    public void handleGameRule(Packet74GameRule packet74GameRule) {
-        handleInvalidPacket(packet74GameRule);
-    }
-
-    public void handleSyncedRecipe(Packet75RecipeSync packet75RecipeSync) {
-        handleInvalidPacket(packet75RecipeSync);
-    }
-    
-    public void handleIds(Packet201Ids packet) {
-    	handleInvalidPacket(packet);
-    }
-    
-    public void handleCustomPayload(Packet250CustomPayload packet) {
-    	handleInvalidPacket(packet);
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/handler/PacketHandler.java b/src/main/java/net/minecraft/core/net/handler/PacketHandler.java
new file mode 100644
index 000000000..842280c2c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/handler/PacketHandler.java
@@ -0,0 +1,375 @@
+package net.minecraft.core.net.handler;
+
+import net.minecraft.core.net.packet.*;
+
+public abstract class PacketHandler
+{
+
+    public PacketHandler()
+    {
+    }
+
+    public abstract boolean isServerHandler();
+
+    public void handleMapChunk(BlockRegionUpdatePacket blockRegionUpdatePacket51Mapchunk)
+    {
+    }
+
+    public void handleInvalidPacket(Packet packet)
+    {
+    }
+
+    public void handleErrorMessage(String s, Object[] aobj)
+    {
+    }
+
+    public void handleKickDisconnect(DisconnectPacket packet255KickdisconnectPacket)
+    {
+        handleInvalidPacket(packet255KickdisconnectPacket);
+    }
+
+    public void handleLogin(LoginPacket loginPacket)
+    {
+        handleInvalidPacket(loginPacket);
+    }
+
+    public void handleFlying(MovePlayerPacket movePlayerPacket)
+    {
+        handleInvalidPacket(movePlayerPacket);
+    }
+
+    public void handleMultiBlockChange(ChunkBlocksUpdatePacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handleBlockDig(PlayerActionPacket playerActionPacket14Blockdig)
+    {
+        handleInvalidPacket(playerActionPacket14Blockdig);
+    }
+
+    public void handleBlockChange(BlockUpdatePacket blockchange)
+    {
+        handleInvalidPacket(blockchange);
+    }
+
+    public void handlePreChunk(ChunkVisibilityPacket packet50PrechunkVisibilityPacket)
+    {
+        handleInvalidPacket(packet50PrechunkVisibilityPacket);
+    }
+
+    public void handleNamedEntitySpawn(AddPlayerPacket addPlayerPacket20Namedentityspawn)
+    {
+        handleInvalidPacket(addPlayerPacket20Namedentityspawn);
+    }
+
+    public void handleEntity(MoveEntityPacket moveEntityPacket)
+    {
+        handleInvalidPacket(moveEntityPacket);
+    }
+
+    public void handleEntityTeleport(TeleportEntityPacket packet34EntityteleportEntityPacket)
+    {
+        handleInvalidPacket(packet34EntityteleportEntityPacket);
+    }
+
+    public void handlePlace(UseItemPacket useItemPacket)
+    {
+        handleInvalidPacket(useItemPacket);
+    }
+
+    public void handleBlockItemSwitch(SetCarriedItemPacket packet16blockitemswitch)
+    {
+        handleInvalidPacket(packet16blockitemswitch);
+    }
+
+    public void handleDestroyEntity(RemoveEntityPacket packet29DestroyentityPacket)
+    {
+        handleInvalidPacket(packet29DestroyentityPacket);
+    }
+
+    public void handleSetPaintingMotive(SetPaintingArtPacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handlePickupSpawn(AddItemEntityPacket addItemEntityPacket21Pickupspawn)
+    {
+        handleInvalidPacket(addItemEntityPacket21Pickupspawn);
+    }
+
+    public void handleCollect(TakeItemEntityPacket takeItemEntityPacket)
+    {
+        handleInvalidPacket(takeItemEntityPacket);
+    }
+
+    public void handleChat(ChatPacket chatPacket)
+    {
+        handleInvalidPacket(chatPacket);
+    }
+
+    public void handleVehicleSpawn(AddEntityPacket addEntityPacket23Vehiclespawn)
+    {
+        handleInvalidPacket(addEntityPacket23Vehiclespawn);
+    }
+
+    public void handleAnimation(AnimatePacket animatePacket)
+    {
+        handleInvalidPacket(animatePacket);
+    }
+
+    public void handleEntityAction(PlayerCommandPacket packet19entityaction)
+    {
+        handleInvalidPacket(packet19entityaction);
+    }
+
+    public void handleHandshake(PreLoginPacket preLoginPacket)
+    {
+        handleInvalidPacket(preLoginPacket);
+    }
+
+    public void handleMobSpawn(AddMobPacket addMobspawn)
+    {
+        handleInvalidPacket(addMobspawn);
+    }
+
+    public void handleUpdateTime(SetTimePacket packet4UpdatetimePacket)
+    {
+        handleInvalidPacket(packet4UpdatetimePacket);
+    }
+
+    public void handleSpawnPosition(SetSpawnPositionPacket setSpawnpositionPacket)
+    {
+        handleInvalidPacket(setSpawnpositionPacket);
+    }
+
+    public void handleEntityVelocity(SetEntityMotionPacket setEntityvelocity)
+    {
+        handleInvalidPacket(setEntityvelocity);
+    }
+
+    public void handleEntityMetadata(SetEntityDataPacket entitymetadata)
+    {
+        handleInvalidPacket(entitymetadata);
+    }
+
+    public void handleAttachEntity(SetRidingPacket setRidingPacket39Attachentity)
+    {
+        handleInvalidPacket(setRidingPacket39Attachentity);
+    }
+
+    public void handleUseEntity(InteractPacket interactPacket7Useentity)
+    {
+        handleInvalidPacket(interactPacket7Useentity);
+    }
+
+    public void handleEntityStatus(EnitityEventPacket enitityEventPacket38Entitystatus)
+    {
+        handleInvalidPacket(enitityEventPacket38Entitystatus);
+    }
+
+    public void handleEntityTagData(EntityTagDataPacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handleUpdateHealth(SetHealthPacket packet8UpdatehealthPacket)
+    {
+        handleInvalidPacket(packet8UpdatehealthPacket);
+    }
+
+    public void handleUpdatePlayerProfile(UpdatePlayerProfilePacket updatePlayerProfilePacket)
+    {
+        handleInvalidPacket(updatePlayerProfilePacket);
+    }
+
+    public void handleRespawn(RespawnPacket respawnPacket)
+    {
+        handleInvalidPacket(respawnPacket);
+    }
+
+    public void handleExplosion(ExplosionPacket explosionPacket)
+    {
+        handleInvalidPacket(explosionPacket);
+    }
+
+    public void handleOpenWindow(ContainerOpenPacket containerOpenwindow)
+    {
+        handleInvalidPacket(containerOpenwindow);
+    }
+
+    public void handleCloseWindow(ContainerClosePacket containerClosewindow)
+    {
+        handleInvalidPacket(containerClosewindow);
+    }
+
+    public void handleWindowClick(ContainerClickPacket packet102WindowclickPacket)
+    {
+        handleInvalidPacket(packet102WindowclickPacket);
+    }
+
+    public void handleTileEntityData(BlockEntityDataPacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handleSetSlot(ContainerSetSlotPacket containerSetslotPacket)
+    {
+        handleInvalidPacket(containerSetslotPacket);
+    }
+
+    public void handleWindowItems(ContainerSetContentPacket containerSetContentPacket104Windowitems)
+    {
+        handleInvalidPacket(containerSetContentPacket104Windowitems);
+    }
+
+    public void handleUpdateSign(SignUpdatePacket packet130UpdatesignUpdatePacket)
+    {
+        handleInvalidPacket(packet130UpdatesignUpdatePacket);
+    }
+
+    public void handleSetMobSpawner(SetMobSpawnerPacket setMobSpawnerPacket)
+    {
+        handleInvalidPacket(setMobSpawnerPacket);
+    }
+    
+    public void handleUpdateProgressbar(ContainerSetDataPacket containerSetDataPacket105Updateprogressbar)
+    {
+        handleInvalidPacket(containerSetDataPacket105Updateprogressbar);
+    }
+
+    public void handlePlayerInventory(SetEquippedItemPacket setEquippedItemPacket5Playerinventory)
+    {
+        handleInvalidPacket(setEquippedItemPacket5Playerinventory);
+    }
+
+    public void handleTransaction(ContainerAckPacket containerAckPacket)
+    {
+        handleInvalidPacket(containerAckPacket);
+    }
+
+    public void handleEntityPainting(AddPaintingPacket packet25EntitypaintingPacket)
+    {
+        handleInvalidPacket(packet25EntitypaintingPacket);
+    }
+    public void handleBoatControl(BoatControlPacket boatControlPacket)
+    {
+        handleInvalidPacket(boatControlPacket);
+    }
+
+    public void handlePlayNoteBlock(BlockEventPacket packet54PlaynoteblockEventPacket)
+    {
+        handleInvalidPacket(packet54PlaynoteblockEventPacket);
+    }
+
+    public void handleStatistic(StatisticPacket statisticPacket)
+    {
+        handleInvalidPacket(statisticPacket);
+    }
+
+    public void handleSleep(SleepPacket sleepPacket)
+    {
+        handleInvalidPacket(sleepPacket);
+    }
+    public void handleBed(BedMessagePacket bedMessagePacket)
+    {
+        handleInvalidPacket(bedMessagePacket);
+    }
+
+    public void handleWeather(WeatherEffectPacket weatherEffectPacket)
+    {
+        handleInvalidPacket(weatherEffectPacket);
+    }
+
+    public void handleMapData(MapDataPacket mapdataPacket)
+    {
+        handleInvalidPacket(mapdataPacket);
+    }
+
+    public void handlePlaySoundEffect(PlaySoundEffectPacket packet61doorchange)
+    {
+        handleInvalidPacket(packet61doorchange);
+    }
+    public void handlePlaySoundDirectly(PlaySoundEffectDirectPacket playSoundEffectDirectPacket)
+    {
+        handleInvalidPacket(playSoundEffectDirectPacket);
+    }
+    public void handleSpawnParticle(AddParticlePacket addParticlePacket)
+    {
+        handleInvalidPacket(addParticlePacket);
+    }
+
+    public void handleEntityPlayerGamemode(PlayerGamemodePacket playerGamemodePacket)
+    {
+        handleInvalidPacket(playerGamemodePacket);
+    }
+
+    public void handleUpdateCreativeInventory(UpdateCreativeInventoryPacket updateCreativeInventoryPacket)
+    {
+        handleInvalidPacket(updateCreativeInventoryPacket);
+    }
+
+    public void handleWeatherStatus(WeatherStatusPacket weatherStatusPacket)
+    {
+        handleInvalidPacket(weatherStatusPacket);
+    }
+
+    public void handleOpenGuidebook(GuidebookPacket guidebookPacket)
+    {
+        handleInvalidPacket(guidebookPacket);
+    }
+
+    public void handleSetHotbarOffset(SetHotbarOffsetPacket setHotbarOffsetPacket)
+    {
+        handleInvalidPacket(setHotbarOffsetPacket);
+    }
+
+    public void handleEntityNickname(EntityNicknamePacket entityNicknamePacket)
+    {
+        handleInvalidPacket(entityNicknamePacket);
+    }
+
+    public void handleSendKey(AESSendKeyPacket AESSendKeyPacket)
+    {
+        handleInvalidPacket(AESSendKeyPacket);
+    }
+
+    public void handleItemName(SetItemNamePacket setItemNamePacket)
+    {
+        handleInvalidPacket(setItemNamePacket);
+    }
+    public void handlePlayerList(PlayerListPacket playerListPacket)
+    {
+        handleInvalidPacket(playerListPacket);
+    }
+
+    public void handleOpenFlagWindow(FlagOpenPacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handlePhotoMode(PhotoModePacket packet)
+    {
+        handleInvalidPacket(packet);
+    }
+
+    public void handlePingHandshake(PingHandshakePacket packet) {
+        handleInvalidPacket(packet);
+    }
+
+    public void handleGameRule(GameRulePacket gameRulePacket) {
+        handleInvalidPacket(gameRulePacket);
+    }
+
+    public void handleSyncedRecipe(RecipeSyncPacket recipeSyncPacket) {
+        handleInvalidPacket(recipeSyncPacket);
+    }
+    
+    public void handleIds(SyncIDsPacket packet) {
+    	handleInvalidPacket(packet);
+    }
+    
+    public void handleCustomPayload(CustomPayloadPacket packet) {
+    	handleInvalidPacket(packet);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet136SendKey.java b/src/main/java/net/minecraft/core/net/packet/AESSendKeyPacket.java
similarity index 55%
rename from src/main/java/net/minecraft/core/net/packet/Packet136SendKey.java
rename to src/main/java/net/minecraft/core/net/packet/AESSendKeyPacket.java
index 4b1cebc1a..c0027feda 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet136SendKey.java
+++ b/src/main/java/net/minecraft/core/net/packet/AESSendKeyPacket.java
@@ -1,49 +1,49 @@
 
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet136SendKey extends Packet
+public class AESSendKeyPacket extends Packet
 {
 
-    public Packet136SendKey()
+    public AESSendKeyPacket()
     {
     }
 
-    public Packet136SendKey(String KEY)
+    public AESSendKeyPacket(String KEY)
     {
         this.KEY = KEY;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
             throws IOException
     {
         KEY = readString(dis, 344);
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
             throws IOException
     {
         writeString(KEY, dos);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleSendKey(this);
+        packetHandler.handleSendKey(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 128;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java b/src/main/java/net/minecraft/core/net/packet/AddEntityPacket.java
similarity index 75%
rename from src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java
rename to src/main/java/net/minecraft/core/net/packet/AddEntityPacket.java
index 26008562e..4d3c990e0 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddEntityPacket.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.MathHelper;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet23VehicleSpawn extends Packet {
+public class AddEntityPacket extends Packet {
     public int entityId;
     public int xPosition;
     public int yPosition;
@@ -22,18 +22,18 @@ public class Packet23VehicleSpawn extends Packet {
     public short type = -1;
     public int ownerId = -1;
     public int metaData = -1;
-    public Packet23VehicleSpawn() {}
-    public Packet23VehicleSpawn(Entity entity)
+    public AddEntityPacket() {}
+    public AddEntityPacket(Entity entity)
     {
         this(entity, -1, -1, null, null, null);
     }
-    public Packet23VehicleSpawn(Entity entity, int metaData){ this(entity, metaData, -1, null, null, null); }
-    public Packet23VehicleSpawn(Entity entity, int metaData, int ownerId){ this(entity, metaData, ownerId, null, null, null); }
-    public Packet23VehicleSpawn(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity) {
+    public AddEntityPacket(Entity entity, int metaData){ this(entity, metaData, -1, null, null, null); }
+    public AddEntityPacket(Entity entity, int metaData, int ownerId){ this(entity, metaData, ownerId, null, null, null); }
+    public AddEntityPacket(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity) {
         this.entityId = entity.id;
-        this.xPosition = MathHelper.floor_double(entity.x * 32D);
-        this.yPosition = MathHelper.floor_double(entity.y * 32D);
-        this.zPosition = MathHelper.floor_double(entity.z * 32D);
+        this.xPosition = MathHelper.floor(entity.x * 32D);
+        this.yPosition = MathHelper.floor(entity.y * 32D);
+        this.zPosition = MathHelper.floor(entity.z * 32D);
         this.pitch = entity.xRot;
         this.yaw = entity.yRot;
         this.metaData = metaData;
@@ -47,14 +47,14 @@ public class Packet23VehicleSpawn extends Packet {
             this.hasVelocity = false;
         }
     }
-    public Packet23VehicleSpawn setType(int type){
+    public AddEntityPacket setType(int type){
         this.type = (short) type;
         return this;
     }
 
 
     @Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
         type = dis.readShort();
         xPosition = dis.readInt();
@@ -79,7 +79,7 @@ public class Packet23VehicleSpawn extends Packet {
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos) throws IOException {
+	public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
         dos.writeShort(type);
         dos.writeInt(xPosition);
@@ -126,13 +126,13 @@ public class Packet23VehicleSpawn extends Packet {
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleVehicleSpawn(this);
+        packetHandler.handleVehicleSpawn(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 21 + ownerId <= 0 ? 0 : 6;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java b/src/main/java/net/minecraft/core/net/packet/AddItemEntityPacket.java
similarity index 69%
rename from src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java
rename to src/main/java/net/minecraft/core/net/packet/AddItemEntityPacket.java
index 1bcbea2a4..c89b2c854 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddItemEntityPacket.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.ItemEntity;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.MathHelper;
 
 import java.io.*;
 
-public class Packet21PickupSpawn extends Packet {
+public class AddItemEntityPacket extends Packet {
     public int entityId;
     public int xPosition;
     public int yPosition;
@@ -20,24 +20,24 @@ public class Packet21PickupSpawn extends Packet {
     public int itemDamage;
     public CompoundTag tag;
 
-    public Packet21PickupSpawn() {}
+    public AddItemEntityPacket() {}
 
-    public Packet21PickupSpawn(EntityItem entityitem) {
+    public AddItemEntityPacket(ItemEntity entityitem) {
         entityId = entityitem.id;
         itemID = entityitem.item.itemID;
         count = entityitem.item.stackSize;
         itemDamage = entityitem.item.getMetadata();
         tag = entityitem.item.getData();
-        xPosition = MathHelper.floor_double(entityitem.x * 32D);
-        yPosition = MathHelper.floor_double(entityitem.y * 32D);
-        zPosition = MathHelper.floor_double(entityitem.z * 32D);
+        xPosition = MathHelper.floor(entityitem.x * 32D);
+        yPosition = MathHelper.floor(entityitem.y * 32D);
+        zPosition = MathHelper.floor(entityitem.z * 32D);
         xd = (byte)(int)(entityitem.xd * 128D);
         yd = (byte)(int)(entityitem.yd * 128D);
         zd = (byte)(int)(entityitem.zd * 128D);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
         itemID = dis.readShort();
         count = dis.readByte();
@@ -52,7 +52,7 @@ public class Packet21PickupSpawn extends Packet {
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos) throws IOException {
+	public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
         dos.writeShort(itemID);
         dos.writeByte(count);
@@ -67,13 +67,13 @@ public class Packet21PickupSpawn extends Packet {
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePickupSpawn(this);
+        packetHandler.handlePickupSpawn(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 24;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet24MobSpawn.java b/src/main/java/net/minecraft/core/net/packet/AddMobPacket.java
similarity index 52%
rename from src/main/java/net/minecraft/core/net/packet/Packet24MobSpawn.java
rename to src/main/java/net/minecraft/core/net/packet/AddMobPacket.java
index 105329bb5..19bbec4b7 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet24MobSpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddMobPacket.java
@@ -1,32 +1,43 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.world.data.SynchedEntityData;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, EntityLiving, EntityList, MathHelper, 
-//            DataWatcher, NetHandler
+//            Packet, Mob, EntityList, MathHelper,
+//            DataWatcher, PacketHandler
 
-public class Packet24MobSpawn extends Packet
+public class AddMobPacket extends Packet
 {
+    public int id;
+    public short type;
+    public int x;
+    public int y;
+    public int z;
+    public byte yaw;
+    public byte pitch;
+    private SynchedEntityData metaData;
+    private List<SynchedEntityData.DataItem<?>> unpackedData;
+    public String nickname;
+    public byte chatColor;
 
-    public Packet24MobSpawn()
+    public AddMobPacket()
     {
     }
 
-    public Packet24MobSpawn(EntityLiving entityliving)
+    public AddMobPacket(Mob entityliving)
     {
-        entityId = entityliving.id;
+        id = entityliving.id;
         type = (short) EntityDispatcher.getEntityID(entityliving);
-        xPosition = MathHelper.floor_double(entityliving.x * 32D);
-        yPosition = MathHelper.floor_double(entityliving.y * 32D);
-        zPosition = MathHelper.floor_double(entityliving.z * 32D);
+        x = MathHelper.floor(entityliving.x * 32D);
+        y = MathHelper.floor(entityliving.y * 32D);
+        z = MathHelper.floor(entityliving.z * 32D);
         yaw = (byte)(int)((entityliving.yRot * 256F) / 360F);
         pitch = (byte)(int)((entityliving.xRot * 256F) / 360F);
         metaData = entityliving.getEntityData();
@@ -35,30 +46,30 @@ public class Packet24MobSpawn extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
-        entityId = dis.readInt();
+        id = dis.readInt();
         type = dis.readShort();
-        xPosition = dis.readInt();
-        yPosition = dis.readInt();
-        zPosition = dis.readInt();
+        x = dis.readInt();
+        y = dis.readInt();
+        z = dis.readInt();
         yaw = dis.readByte();
         pitch = dis.readByte();
-        receivedMetadata = SynchedEntityData.unpack(dis);
+        unpackedData = SynchedEntityData.unpack(dis);
         nickname = readString(dis, 32);
         chatColor = dis.readByte();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
-        dos.writeInt(entityId);
+        dos.writeInt(id);
         dos.writeShort(type);
-        dos.writeInt(xPosition);
-        dos.writeInt(yPosition);
-        dos.writeInt(zPosition);
+        dos.writeInt(x);
+        dos.writeInt(y);
+        dos.writeInt(z);
         dos.writeByte(yaw);
         dos.writeByte(pitch);
         metaData.packAll(dos);
@@ -67,31 +78,21 @@ public class Packet24MobSpawn extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleMobSpawn(this);
+        packetHandler.handleMobSpawn(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 21;
     }
 
-    public List getMetadata()
+    public List<SynchedEntityData.DataItem<?>> getUnpackedData()
     {
-        return receivedMetadata;
+        return unpackedData;
     }
 
-    public int entityId;
-    public short type;
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-    public byte yaw;
-    public byte pitch;
-    private SynchedEntityData metaData;
-    private List receivedMetadata;
-    public String nickname;
-    public byte chatColor;
+
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet25EntityPainting.java b/src/main/java/net/minecraft/core/net/packet/AddPaintingPacket.java
similarity index 68%
rename from src/main/java/net/minecraft/core/net/packet/Packet25EntityPainting.java
rename to src/main/java/net/minecraft/core/net/packet/AddPaintingPacket.java
index 9357a5591..ae2ac326a 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet25EntityPainting.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddPaintingPacket.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.entity.PaintingEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, EntityPainting, ArtType, NetHandler
+//            Packet, PaintingEntity, ArtType, PacketHandler
 
-public class Packet25EntityPainting extends Packet
+public class AddPaintingPacket extends Packet
 {
 
-    public Packet25EntityPainting()
+    public AddPaintingPacket()
     {
     }
 
-    public Packet25EntityPainting(EntityPainting entitypainting)
+    public AddPaintingPacket(PaintingEntity entitypainting)
     {
         entityId = entitypainting.id;
-        xPosition = entitypainting.xPosition;
-        yPosition = entitypainting.yPosition;
-        zPosition = entitypainting.zPosition;
+        xPosition = entitypainting.blockX;
+        yPosition = entitypainting.blockY;
+        zPosition = entitypainting.blockZ;
         direction = entitypainting.direction;
         key = entitypainting.art.key;
         itemID = -1;
@@ -35,7 +35,7 @@ public class Packet25EntityPainting extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -49,7 +49,7 @@ public class Packet25EntityPainting extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -63,13 +63,13 @@ public class Packet25EntityPainting extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleEntityPainting(this);
+        packetHandler.handleEntityPainting(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 24;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet63SpawnParticleEffect.java b/src/main/java/net/minecraft/core/net/packet/AddParticlePacket.java
similarity index 69%
rename from src/main/java/net/minecraft/core/net/packet/Packet63SpawnParticleEffect.java
rename to src/main/java/net/minecraft/core/net/packet/AddParticlePacket.java
index a239b82b5..914100b7c 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet63SpawnParticleEffect.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddParticlePacket.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet63SpawnParticleEffect extends Packet{
+public class AddParticlePacket extends Packet{
     public String particleKey;
     public double x;
     public double y;
@@ -25,24 +25,24 @@ public class Packet63SpawnParticleEffect extends Packet{
     public float randMotionY;
     public float randMotionZ;
 
-    public Packet63SpawnParticleEffect(){
+    public AddParticlePacket(){
 
     }
-    public Packet63SpawnParticleEffect(String particleKey, double x, double y, double z,
-                                       double motionX, double motionY, double motionZ, int data){
+    public AddParticlePacket(String particleKey, double x, double y, double z,
+                             double motionX, double motionY, double motionZ, int data){
         this(particleKey, x, y, z, motionX, motionY, motionZ, data, 16D);
     }
-    public Packet63SpawnParticleEffect(String particleKey, double x, double y, double z,
-                                       double motionX, double motionY, double motionZ, int data, double maxDistance){
+    public AddParticlePacket(String particleKey, double x, double y, double z,
+                             double motionX, double motionY, double motionZ, int data, double maxDistance){
         this(particleKey, x, y, z, motionX, motionY, motionZ, data,
                 maxDistance, (byte) -1, 0, 0, 0, 0, 0, 0);
 
     }
-    public Packet63SpawnParticleEffect(String particleKey, double x, double y, double z,
-                                       double motionX, double motionY, double motionZ,
-                                       int data, double maxDistance, byte amount, float randOffX,
-                                       float randOffY, float randOffZ, float randMotionX,
-                                       float randMotionY, float randMotionZ){
+    public AddParticlePacket(String particleKey, double x, double y, double z,
+                             double motionX, double motionY, double motionZ,
+                             int data, double maxDistance, byte amount, float randOffX,
+                             float randOffY, float randOffZ, float randMotionX,
+                             float randMotionY, float randMotionZ){
         this.particleKey = particleKey;
         this.x = x;
         this.y = y;
@@ -64,7 +64,7 @@ public class Packet63SpawnParticleEffect extends Packet{
         }
     }
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         this.particleKey = dis.readUTF();
         this.x = dis.readDouble();
         this.y = dis.readDouble();
@@ -88,7 +88,7 @@ public class Packet63SpawnParticleEffect extends Packet{
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeUTF(particleKey);
         dos.writeDouble(x);
         dos.writeDouble(y);
@@ -110,12 +110,12 @@ public class Packet63SpawnParticleEffect extends Packet{
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleSpawnParticle(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleSpawnParticle(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 40;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet20NamedEntitySpawn.java b/src/main/java/net/minecraft/core/net/packet/AddPlayerPacket.java
similarity index 69%
rename from src/main/java/net/minecraft/core/net/packet/Packet20NamedEntitySpawn.java
rename to src/main/java/net/minecraft/core/net/packet/AddPlayerPacket.java
index 20cb02494..fcbcfce32 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet20NamedEntitySpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/AddPlayerPacket.java
@@ -1,30 +1,30 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.net.handler.NetHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, EntityPlayer, MathHelper, InventoryPlayer, 
-//            ItemStack, NetHandler
+//            Packet, Player, MathHelper, InventoryPlayer,
+//            ItemStack, PacketHandler
 
-public class Packet20NamedEntitySpawn extends Packet
+public class AddPlayerPacket extends Packet
 {
 
-    public Packet20NamedEntitySpawn()
+    public AddPlayerPacket()
     {
     }
 
-    public Packet20NamedEntitySpawn(EntityPlayer entityplayer)
+    public AddPlayerPacket(Player entityplayer)
     {
         entityId = entityplayer.id;
         name = entityplayer.username;
-        xPosition = MathHelper.floor_double(entityplayer.x * 32D);
-        yPosition = MathHelper.floor_double(entityplayer.y * 32D);
-        zPosition = MathHelper.floor_double(entityplayer.z * 32D);
+        xPosition = MathHelper.floor(entityplayer.x * 32D);
+        yPosition = MathHelper.floor(entityplayer.y * 32D);
+        zPosition = MathHelper.floor(entityplayer.z * 32D);
         rotation = (byte)(int)((entityplayer.yRot * 256F) / 360F);
         pitch = (byte)(int)((entityplayer.xRot * 256F) / 360F);
         ItemStack itemstack = entityplayer.inventory.getCurrentItem();
@@ -34,7 +34,7 @@ public class Packet20NamedEntitySpawn extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -50,7 +50,7 @@ public class Packet20NamedEntitySpawn extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -66,13 +66,13 @@ public class Packet20NamedEntitySpawn extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleNamedEntitySpawn(this);
+        packetHandler.handleNamedEntitySpawn(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 28;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet18Animation.java b/src/main/java/net/minecraft/core/net/packet/AnimatePacket.java
similarity index 57%
rename from src/main/java/net/minecraft/core/net/packet/Packet18Animation.java
rename to src/main/java/net/minecraft/core/net/packet/AnimatePacket.java
index f2ea269b7..1a6656f8f 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet18Animation.java
+++ b/src/main/java/net/minecraft/core/net/packet/AnimatePacket.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, Entity, NetHandler
+//            Packet, Entity, PacketHandler
 
-public class Packet18Animation extends Packet
+public class AnimatePacket extends Packet
 {
 
-    public Packet18Animation()
+    public AnimatePacket()
     {
     }
 
-    public Packet18Animation(Entity entity, int i)
+    public AnimatePacket(Entity entity, int i)
     {
         entityId = entity.id;
         animate = i;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -30,7 +30,7 @@ public class Packet18Animation extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -38,13 +38,13 @@ public class Packet18Animation extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleAnimation(this);
+        packetHandler.handleAnimation(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 5;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/BedMessagePacket.java b/src/main/java/net/minecraft/core/net/packet/BedMessagePacket.java
new file mode 100644
index 000000000..5b2efa0b9
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/BedMessagePacket.java
@@ -0,0 +1,53 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class BedMessagePacket extends Packet
+{
+
+    public BedMessagePacket()
+    {
+    }
+    
+    public BedMessagePacket(int state)
+    {
+    	bedState = state;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        bedState = dis.readByte();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeByte(bedState);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleBed(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 1;
+    }
+
+    public static final String[] BED_MESSAGE_KEYS = {
+        "bed.notValid", null, null
+    };
+    public int bedState;
+
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet140TileEntityData.java b/src/main/java/net/minecraft/core/net/packet/BlockEntityDataPacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet140TileEntityData.java
rename to src/main/java/net/minecraft/core/net/packet/BlockEntityDataPacket.java
index 7428ac138..fe9288124 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet140TileEntityData.java
+++ b/src/main/java/net/minecraft/core/net/packet/BlockEntityDataPacket.java
@@ -1,52 +1,51 @@
 package net.minecraft.core.net.packet;
 
 import com.mojang.nbt.CompoundTag;
-import com.mojang.nbt.NbtIo;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
-public class Packet140TileEntityData
+public class BlockEntityDataPacket
     extends Packet
 {
     public CompoundTag tag;
 
-    public Packet140TileEntityData()
+    public BlockEntityDataPacket()
     {
         isChunkDataPacket = true;
     }
 
-    public Packet140TileEntityData(TileEntity tileEntity)
+    public BlockEntityDataPacket(BlockEntity blockEntity)
     {
         this();
 
         tag = new CompoundTag();
-        tileEntity.writeToNBT(tag);
+        blockEntity.writeToNBT(tag);
     }
 
     @Override
-    public void readPacketData(DataInputStream dis)
+    public void read(DataInputStream dis)
             throws IOException
     {
         tag = readCompressedCompoundTag(dis);
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos)
+    public void write(DataOutputStream dos)
             throws IOException
     {
         writeCompressedCompoundTag(tag, dos);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler)
+    public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleTileEntityData(this);
+        packetHandler.handleTileEntityData(this);
     }
 
     @Override
-    public int getPacketSize()
+    public int getEstimatedSize()
     {
         return 0;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet54PlayNoteBlock.java b/src/main/java/net/minecraft/core/net/packet/BlockEventPacket.java
similarity index 66%
rename from src/main/java/net/minecraft/core/net/packet/Packet54PlayNoteBlock.java
rename to src/main/java/net/minecraft/core/net/packet/BlockEventPacket.java
index 14e7e3fd7..9bb9a2cad 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet54PlayNoteBlock.java
+++ b/src/main/java/net/minecraft/core/net/packet/BlockEventPacket.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet54PlayNoteBlock extends Packet
+public class BlockEventPacket extends Packet
 {
 
-    public Packet54PlayNoteBlock()
+    public BlockEventPacket()
     {
     }
     
-    public Packet54PlayNoteBlock(int i, int j, int k, int l, int i1)
+    public BlockEventPacket(int i, int j, int k, int l, int i1)
     {
         xLocation = i;
         yLocation = j;
@@ -24,7 +24,7 @@ public class Packet54PlayNoteBlock extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xLocation = dis.readInt();
@@ -35,7 +35,7 @@ public class Packet54PlayNoteBlock extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xLocation);
@@ -46,13 +46,13 @@ public class Packet54PlayNoteBlock extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePlayNoteBlock(this);
+        packetHandler.handlePlayNoteBlock(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 12;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet51MapChunk.java b/src/main/java/net/minecraft/core/net/packet/BlockRegionUpdatePacket.java
similarity index 82%
rename from src/main/java/net/minecraft/core/net/packet/Packet51MapChunk.java
rename to src/main/java/net/minecraft/core/net/packet/BlockRegionUpdatePacket.java
index e4b1e53b8..6c91d1f01 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet51MapChunk.java
+++ b/src/main/java/net/minecraft/core/net/packet/BlockRegionUpdatePacket.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.net.packet;
 
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.world.World;
-import net.minecraft.core.net.handler.NetHandler;
 
 import java.io.*;
 import java.util.zip.DataFormatException;
@@ -9,17 +9,17 @@ import java.util.zip.Deflater;
 import java.util.zip.Inflater;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet51MapChunk extends Packet
+public class BlockRegionUpdatePacket extends Packet
 {
 
-    public Packet51MapChunk()
+    public BlockRegionUpdatePacket()
     {
         isChunkDataPacket = true;
     }
     
-    public Packet51MapChunk(int xPosition, int yPosition, int zPosition, int xSize, int ySize, int zSize, World world)
+    public BlockRegionUpdatePacket(int xPosition, int yPosition, int zPosition, int xSize, int ySize, int zSize, World world)
     {
         isChunkDataPacket = true;
 
@@ -46,7 +46,7 @@ public class Packet51MapChunk extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         // Read data
@@ -79,7 +79,7 @@ public class Packet51MapChunk extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xPosition);
@@ -93,13 +93,13 @@ public class Packet51MapChunk extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleMapChunk(this);
+        packetHandler.handleMapChunk(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 4 + 2 + 4 + 1 + 1 + 1 + 4 + chunkSize;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet53BlockChange.java b/src/main/java/net/minecraft/core/net/packet/BlockUpdatePacket.java
similarity index 70%
rename from src/main/java/net/minecraft/core/net/packet/Packet53BlockChange.java
rename to src/main/java/net/minecraft/core/net/packet/BlockUpdatePacket.java
index 3b3e75f36..e98e62071 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet53BlockChange.java
+++ b/src/main/java/net/minecraft/core/net/packet/BlockUpdatePacket.java
@@ -1,22 +1,22 @@
 package net.minecraft.core.net.packet;
 
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.world.World;
-import net.minecraft.core.net.handler.NetHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet53BlockChange extends Packet
+public class BlockUpdatePacket extends Packet
 {
 
-    public Packet53BlockChange()
+    public BlockUpdatePacket()
     {
         isChunkDataPacket = true;
     }
     
-    public Packet53BlockChange(int i, int j, int k, World world)
+    public BlockUpdatePacket(int i, int j, int k, World world)
     {
         isChunkDataPacket = true;
         xPosition = i;
@@ -27,7 +27,7 @@ public class Packet53BlockChange extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xPosition = dis.readInt();
@@ -38,7 +38,7 @@ public class Packet53BlockChange extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xPosition);
@@ -49,13 +49,13 @@ public class Packet53BlockChange extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleBlockChange(this);
+        packetHandler.handleBlockChange(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 11;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet26BoatControl.java b/src/main/java/net/minecraft/core/net/packet/BoatControlPacket.java
similarity index 63%
rename from src/main/java/net/minecraft/core/net/packet/Packet26BoatControl.java
rename to src/main/java/net/minecraft/core/net/packet/BoatControlPacket.java
index b9b9a1808..0e4762e4a 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet26BoatControl.java
+++ b/src/main/java/net/minecraft/core/net/packet/BoatControlPacket.java
@@ -1,26 +1,26 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet26BoatControl extends Packet{
+public class BoatControlPacket extends Packet{
     public int entityId;
     public float targetXD;
     public float targetZD;
     public float targetYRot;
-    public Packet26BoatControl(){}
-    public Packet26BoatControl(Entity entity){
+    public BoatControlPacket(){}
+    public BoatControlPacket(Entity entity){
         entityId = entity.id;
         targetXD = (float) entity.xd;
         targetZD = (float) entity.zd;
         targetYRot = entity.yRot;
     }
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
         targetXD = dis.readFloat();
         targetZD = dis.readFloat();
@@ -28,7 +28,7 @@ public class Packet26BoatControl extends Packet{
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
         dos.writeFloat(targetXD);
         dos.writeFloat(targetZD);
@@ -36,12 +36,12 @@ public class Packet26BoatControl extends Packet{
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleBoatControl(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleBoatControl(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 12;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet3Chat.java b/src/main/java/net/minecraft/core/net/packet/ChatPacket.java
similarity index 70%
rename from src/main/java/net/minecraft/core/net/packet/Packet3Chat.java
rename to src/main/java/net/minecraft/core/net/packet/ChatPacket.java
index 73bd3618c..2067a6458 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet3Chat.java
+++ b/src/main/java/net/minecraft/core/net/packet/ChatPacket.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.AES;
 
 import java.io.*;
 import java.security.Key;
 
-public class Packet3Chat extends Packet {
+public class ChatPacket extends Packet {
 	
 	public static final String ENCRYPTION_ERROR_MESSAGE = "This crash is caused by outdated Java, please update to 8u161 or newer! If your Java version is out of date due to a technical requirement, please add the JCE Unlimited Strength Jurisdiction Policy Files to your installation. https://www.oracle.com/java/technologies/javase-jce-all-downloads.html";
 	
@@ -14,19 +14,19 @@ public class Packet3Chat extends Packet {
 	public int type;
 	public boolean encrypted;
 
-	public Packet3Chat() {
+	public ChatPacket() {
 		
 	}
 
-	public Packet3Chat(String string) {
+	public ChatPacket(String string) {
 		this(string, 0, null);
 	}
 
-	public Packet3Chat(String string, Key key) {
+	public ChatPacket(String string, Key key) {
 		this(string, 0, key);
 	}
 	
-	public Packet3Chat(String string, int type, Key key) {
+	public ChatPacket(String string, int type, Key key) {
 		if(string.length() > 512) {
 			string = string.substring(0, 512);
 		}
@@ -45,26 +45,26 @@ public class Packet3Chat extends Packet {
 	}
 
 	@Override
-	public void readPacketData(DataInputStream in) throws IOException {
+	public void read(DataInputStream in) throws IOException {
 		type = in.readByte();
 		message = readString(in, 1024);
 		encrypted = in.readBoolean();
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream out) throws IOException {
+	public void write(DataOutputStream out) throws IOException {
 		out.writeByte(type);
 		writeString(message, out);
 		out.writeBoolean(encrypted);
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleChat(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleChat(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return message.length() + 1;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet52MultiBlockChange.java b/src/main/java/net/minecraft/core/net/packet/ChunkBlocksUpdatePacket.java
similarity index 81%
rename from src/main/java/net/minecraft/core/net/packet/Packet52MultiBlockChange.java
rename to src/main/java/net/minecraft/core/net/packet/ChunkBlocksUpdatePacket.java
index b6d5ccd3c..82db24948 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet52MultiBlockChange.java
+++ b/src/main/java/net/minecraft/core/net/packet/ChunkBlocksUpdatePacket.java
@@ -2,22 +2,22 @@ package net.minecraft.core.net.packet;
 
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet52MultiBlockChange extends Packet
+public class ChunkBlocksUpdatePacket extends Packet
 {
 
-    public Packet52MultiBlockChange()
+    public ChunkBlocksUpdatePacket()
     {
         isChunkDataPacket = true;
     }
     
-    public Packet52MultiBlockChange(int xChunk, int zChunk, int[] blocksToUpdate, int numBlocksToUpdate, World world)
+    public ChunkBlocksUpdatePacket(int xChunk, int zChunk, int[] blocksToUpdate, int numBlocksToUpdate, World world)
     {
         isChunkDataPacket = true;
         this.xChunk = xChunk;
@@ -40,7 +40,7 @@ public class Packet52MultiBlockChange extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xChunk = dis.readInt();
@@ -62,7 +62,7 @@ public class Packet52MultiBlockChange extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xChunk);
@@ -81,13 +81,13 @@ public class Packet52MultiBlockChange extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleMultiBlockChange(this);
+        packetHandler.handleMultiBlockChange(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 10 + size * 4;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet50PreChunk.java b/src/main/java/net/minecraft/core/net/packet/ChunkVisibilityPacket.java
similarity index 62%
rename from src/main/java/net/minecraft/core/net/packet/Packet50PreChunk.java
rename to src/main/java/net/minecraft/core/net/packet/ChunkVisibilityPacket.java
index af1a8da88..6521a39ef 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet50PreChunk.java
+++ b/src/main/java/net/minecraft/core/net/packet/ChunkVisibilityPacket.java
@@ -1,21 +1,21 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet50PreChunk extends Packet
+public class ChunkVisibilityPacket extends Packet
 {
 
-    public Packet50PreChunk()
+    public ChunkVisibilityPacket()
     {
         isChunkDataPacket = false;
     }
     
-    public Packet50PreChunk(int i, int j, boolean flag)
+    public ChunkVisibilityPacket(int i, int j, boolean flag)
     {
         isChunkDataPacket = false;
         xPosition = i;
@@ -24,7 +24,7 @@ public class Packet50PreChunk extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xPosition = dis.readInt();
@@ -33,7 +33,7 @@ public class Packet50PreChunk extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xPosition);
@@ -42,13 +42,13 @@ public class Packet50PreChunk extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePreChunk(this);
+        packetHandler.handlePreChunk(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 9;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/ContainerAckPacket.java b/src/main/java/net/minecraft/core/net/packet/ContainerAckPacket.java
new file mode 100644
index 000000000..4b29d83ce
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerAckPacket.java
@@ -0,0 +1,57 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class ContainerAckPacket extends Packet
+{
+
+    public ContainerAckPacket()
+    {
+    }
+
+    public ContainerAckPacket(int i, short word0, boolean flag)
+    {
+        windowId = i;
+        shortWindowId = word0;
+        accepted = flag;
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleTransaction(this);
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        windowId = dis.readByte();
+        shortWindowId = dis.readShort();
+        accepted = dis.readByte() != 0;
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeByte(windowId);
+        dos.writeShort(shortWindowId);
+        dos.writeByte(accepted ? 1 : 0);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 4;
+    }
+
+    public int windowId;
+    public short shortWindowId;
+    public boolean accepted;
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet102WindowClick.java b/src/main/java/net/minecraft/core/net/packet/ContainerClickPacket.java
similarity index 79%
rename from src/main/java/net/minecraft/core/net/packet/Packet102WindowClick.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerClickPacket.java
index 1d7ab4e66..d4785fcdb 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet102WindowClick.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerClickPacket.java
@@ -2,19 +2,19 @@ package net.minecraft.core.net.packet;
 
 import net.minecraft.core.InventoryAction;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler, ItemStack
+//            Packet, PacketHandler, ItemStack
 
-public class Packet102WindowClick extends Packet {
+public class ContainerClickPacket extends Packet {
 
-	public Packet102WindowClick() {
+	public ContainerClickPacket() {
 	}
 
-	public Packet102WindowClick(int windowId, InventoryAction action, int[] args, ItemStack itemstack, short actionId) {
+	public ContainerClickPacket(int windowId, InventoryAction action, int[] args, ItemStack itemstack, short actionId) {
 		this.window_Id = windowId;
 		this.action = action;
 		this.args = args;
@@ -23,12 +23,12 @@ public class Packet102WindowClick extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleWindowClick(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleWindowClick(this);
 	}
 
 	@Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
 		window_Id = dis.readByte();
 		action = InventoryAction.get(dis.readByte());
 		
@@ -50,7 +50,7 @@ public class Packet102WindowClick extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(window_Id);
@@ -85,7 +85,7 @@ public class Packet102WindowClick extends Packet {
     }
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return 7 + (args != null ? args.length : 0);
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet101CloseWindow.java b/src/main/java/net/minecraft/core/net/packet/ContainerClosePacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet101CloseWindow.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerClosePacket.java
index e3da6f484..d58b8aeb2 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet101CloseWindow.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerClosePacket.java
@@ -1,46 +1,46 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet101CloseWindow extends Packet
+public class ContainerClosePacket extends Packet
 {
 
-    public Packet101CloseWindow()
+    public ContainerClosePacket()
     {
     }
 
-    public Packet101CloseWindow(int i)
+    public ContainerClosePacket(int i)
     {
         windowId = i;
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleCloseWindow(this);
+        packetHandler.handleCloseWindow(this);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 1;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet100OpenWindow.java b/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
similarity index 65%
rename from src/main/java/net/minecraft/core/net/packet/Packet100OpenWindow.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
index 62e1d5da7..2b585519f 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet100OpenWindow.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet100OpenWindow extends Packet
+public class ContainerOpenPacket extends Packet
 {
 
-    public Packet100OpenWindow()
+    public ContainerOpenPacket()
     {
     }
     
-    public Packet100OpenWindow(int i, int j, String s, int k)
+    public ContainerOpenPacket(int i, int j, String s, int k)
     {
         windowId = i;
         inventoryType = j;
@@ -23,13 +23,13 @@ public class Packet100OpenWindow extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleOpenWindow(this);
+        packetHandler.handleOpenWindow(this);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
@@ -39,7 +39,7 @@ public class Packet100OpenWindow extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
@@ -49,7 +49,7 @@ public class Packet100OpenWindow extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 3 + windowTitle.length();
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet104WindowItems.java b/src/main/java/net/minecraft/core/net/packet/ContainerSetContentPacket.java
similarity index 82%
rename from src/main/java/net/minecraft/core/net/packet/Packet104WindowItems.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerSetContentPacket.java
index f329755fa..67ad7c452 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet104WindowItems.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerSetContentPacket.java
@@ -3,25 +3,25 @@ package net.minecraft.core.net.packet;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, ItemStack, NetHandler
+//            Packet, ItemStack, PacketHandler
 
-public class Packet104WindowItems extends Packet
+public class ContainerSetContentPacket extends Packet
 {
     public int windowId;
     public ItemStack[] stackList;
 
 
-    public Packet104WindowItems()
+    public ContainerSetContentPacket()
     {
     }
 
-    public Packet104WindowItems(int i, List<ItemStack> list)
+    public ContainerSetContentPacket(int i, List<ItemStack> list)
     {
         windowId = i;
         stackList = new ItemStack[list.size()];
@@ -34,7 +34,7 @@ public class Packet104WindowItems extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
@@ -57,7 +57,7 @@ public class Packet104WindowItems extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
@@ -81,13 +81,13 @@ public class Packet104WindowItems extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleWindowItems(this);
+        packetHandler.handleWindowItems(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 3 + stackList.length * 5;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet105UpdateProgressbar.java b/src/main/java/net/minecraft/core/net/packet/ContainerSetDataPacket.java
similarity index 60%
rename from src/main/java/net/minecraft/core/net/packet/Packet105UpdateProgressbar.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerSetDataPacket.java
index 42c07fb03..f2fcccc86 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet105UpdateProgressbar.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerSetDataPacket.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet105UpdateProgressbar extends Packet
+public class ContainerSetDataPacket extends Packet
 {
 
-    public Packet105UpdateProgressbar()
+    public ContainerSetDataPacket()
     {
     }
 
-    public Packet105UpdateProgressbar(int windowId, int progressBar, int progressBarValue)
+    public ContainerSetDataPacket(int windowId, int progressBar, int progressBarValue)
     {
         this.windowId = windowId;
         this.progressBar = progressBar;
@@ -22,13 +22,13 @@ public class Packet105UpdateProgressbar extends Packet
     }
     
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdateProgressbar(this);
+        packetHandler.handleUpdateProgressbar(this);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
@@ -37,7 +37,7 @@ public class Packet105UpdateProgressbar extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
@@ -46,7 +46,7 @@ public class Packet105UpdateProgressbar extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 7;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet103SetSlot.java b/src/main/java/net/minecraft/core/net/packet/ContainerSetSlotPacket.java
similarity index 75%
rename from src/main/java/net/minecraft/core/net/packet/Packet103SetSlot.java
rename to src/main/java/net/minecraft/core/net/packet/ContainerSetSlotPacket.java
index 938335573..d32a79e9b 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet103SetSlot.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerSetSlotPacket.java
@@ -2,27 +2,27 @@ package net.minecraft.core.net.packet;
 
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler, ItemStack
+//            Packet, PacketHandler, ItemStack
 
-public class Packet103SetSlot extends Packet
+public class ContainerSetSlotPacket extends Packet
 {
 
-    public Packet103SetSlot()
+    public ContainerSetSlotPacket()
     {
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleSetSlot(this);
+        packetHandler.handleSetSlot(this);
     }
     
-    public Packet103SetSlot(int i, int j, ItemStack itemstack)
+    public ContainerSetSlotPacket(int i, int j, ItemStack itemstack)
     {
         windowId = i;
         itemSlot = j;
@@ -30,7 +30,7 @@ public class Packet103SetSlot extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
@@ -49,7 +49,7 @@ public class Packet103SetSlot extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
@@ -67,7 +67,7 @@ public class Packet103SetSlot extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 8;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet250CustomPayload.java b/src/main/java/net/minecraft/core/net/packet/CustomPayloadPacket.java
similarity index 62%
rename from src/main/java/net/minecraft/core/net/packet/Packet250CustomPayload.java
rename to src/main/java/net/minecraft/core/net/packet/CustomPayloadPacket.java
index 2884238ed..941706a31 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet250CustomPayload.java
+++ b/src/main/java/net/minecraft/core/net/packet/CustomPayloadPacket.java
@@ -4,18 +4,18 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
-public class Packet250CustomPayload extends Packet {
+public class CustomPayloadPacket extends Packet {
 	
 	public String channel;
 	public byte[] data;
 	
-	public Packet250CustomPayload() {
+	public CustomPayloadPacket() {
 		
 	}
 	
-	public Packet250CustomPayload(String channel, byte[] data) {
+	public CustomPayloadPacket(String channel, byte[] data) {
 		this.channel = channel;
 		
 		if(data != null) {
@@ -27,7 +27,7 @@ public class Packet250CustomPayload extends Packet {
 	}
 	
 	@Override
-	public void readPacketData(DataInputStream in) throws IOException {
+	public void read(DataInputStream in) throws IOException {
 		this.channel = readString(in, 20);
 		int length = in.readInt();
 		
@@ -38,7 +38,7 @@ public class Packet250CustomPayload extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream out) throws IOException {
+	public void write(DataOutputStream out) throws IOException {
 		writeString(channel, out);
 		if(data != null) {
 			out.writeInt(data.length);
@@ -49,12 +49,12 @@ public class Packet250CustomPayload extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleCustomPayload(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleCustomPayload(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return channel.length() + 4 + data.length;
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet255KickDisconnect.java b/src/main/java/net/minecraft/core/net/packet/DisconnectPacket.java
similarity index 53%
rename from src/main/java/net/minecraft/core/net/packet/Packet255KickDisconnect.java
rename to src/main/java/net/minecraft/core/net/packet/DisconnectPacket.java
index a60b3b05f..17b81d8a5 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet255KickDisconnect.java
+++ b/src/main/java/net/minecraft/core/net/packet/DisconnectPacket.java
@@ -1,37 +1,36 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
-import java.nio.charset.StandardCharsets;
 
-public class Packet255KickDisconnect extends Packet
+public class DisconnectPacket extends Packet
 {
 
-    public Packet255KickDisconnect()
+    public DisconnectPacket()
     {
     }
 
-    public Packet255KickDisconnect(String s)
+    public DisconnectPacket(String s)
     {
         this(s, null);
     }
 
-    public Packet255KickDisconnect(String s, byte[] image)
+    public DisconnectPacket(String s, byte[] image)
     {
         reason = s;
         this.image = image;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         reason = readUTF16BEString(dis, 255);
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         writeUTF16BEString(reason, dos);
@@ -42,13 +41,13 @@ public class Packet255KickDisconnect extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleKickDisconnect(this);
+        packetHandler.handleKickDisconnect(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return reason.length();
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet38EntityStatus.java b/src/main/java/net/minecraft/core/net/packet/EnitityEventPacket.java
similarity index 61%
rename from src/main/java/net/minecraft/core/net/packet/Packet38EntityStatus.java
rename to src/main/java/net/minecraft/core/net/packet/EnitityEventPacket.java
index b617cd9a8..ec4b04a19 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet38EntityStatus.java
+++ b/src/main/java/net/minecraft/core/net/packet/EnitityEventPacket.java
@@ -1,27 +1,27 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet38EntityStatus extends Packet
+public class EnitityEventPacket extends Packet
 {
 
-    public Packet38EntityStatus()
+    public EnitityEventPacket()
     {
     }
     
-    public Packet38EntityStatus(int entityId, byte entityStatus)
+    public EnitityEventPacket(int entityId, byte entityStatus)
     {
         this.entityId = entityId;
         this.entityStatus = entityStatus;
         attackedAtYaw = 0;
     }
 
-    public Packet38EntityStatus(int entityId, byte entityStatus, float attackedAtYaw)
+    public EnitityEventPacket(int entityId, byte entityStatus, float attackedAtYaw)
     {
         this.entityId = entityId;
         this.entityStatus = entityStatus;
@@ -29,7 +29,7 @@ public class Packet38EntityStatus extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -38,7 +38,7 @@ public class Packet38EntityStatus extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -47,13 +47,13 @@ public class Packet38EntityStatus extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleEntityStatus(this);
+        packetHandler.handleEntityStatus(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 9;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/EntityNicknamePacket.java b/src/main/java/net/minecraft/core/net/packet/EntityNicknamePacket.java
new file mode 100644
index 000000000..659b3906c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/EntityNicknamePacket.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class EntityNicknamePacket extends Packet
+{
+    public int entityId;
+    public String nickname;
+    public byte chatColor;
+    public EntityNicknamePacket()
+    {
+    }
+
+    public EntityNicknamePacket(int entityId, String nickname, byte chatColor)
+    {
+        this.entityId = entityId;
+        this.nickname = nickname;
+        this.chatColor = chatColor;
+    }
+
+    @Override
+    public int getEstimatedSize()
+    {
+        return 4 + nickname.length() + 1;
+    }
+
+    @Override
+    public void read(DataInputStream dis) throws IOException
+    {
+        nickname = readString(dis, 32);
+        chatColor = dis.readByte();
+    }
+
+    @Override
+    public void write(DataOutputStream dos) throws IOException
+    {
+        writeString(nickname, dos);
+        dos.writeByte(chatColor);
+    }
+
+    @Override
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleEntityNickname(this);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet42EntityTagData.java b/src/main/java/net/minecraft/core/net/packet/EntityTagDataPacket.java
similarity index 60%
rename from src/main/java/net/minecraft/core/net/packet/Packet42EntityTagData.java
rename to src/main/java/net/minecraft/core/net/packet/EntityTagDataPacket.java
index be43a397e..a871bc41a 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet42EntityTagData.java
+++ b/src/main/java/net/minecraft/core/net/packet/EntityTagDataPacket.java
@@ -2,21 +2,21 @@ package net.minecraft.core.net.packet;
 
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet42EntityTagData extends Packet {
+public class EntityTagDataPacket extends Packet {
     public int entityId;
     public CompoundTag tag;
 
-    public Packet42EntityTagData() {
+    public EntityTagDataPacket() {
         super();
     }
 
-    public Packet42EntityTagData(Entity entity) {
+    public EntityTagDataPacket(Entity entity) {
         super();
         this.entityId = entity.id;
         this.tag = new CompoundTag();
@@ -24,24 +24,24 @@ public class Packet42EntityTagData extends Packet {
     }
 
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         this.entityId = dis.readInt();
         this.tag = Packet.readCompressedCompoundTag(dis);
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(this.entityId);
         Packet.writeCompressedCompoundTag(this.tag, dos);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleEntityTagData(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleEntityTagData(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 0;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet60Explosion.java b/src/main/java/net/minecraft/core/net/packet/ExplosionPacket.java
similarity index 79%
rename from src/main/java/net/minecraft/core/net/packet/Packet60Explosion.java
rename to src/main/java/net/minecraft/core/net/packet/ExplosionPacket.java
index 73844ba60..53d990e94 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet60Explosion.java
+++ b/src/main/java/net/minecraft/core/net/packet/ExplosionPacket.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.world.chunk.ChunkPosition;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 import java.util.*;
 
-public class Packet60Explosion extends Packet
+public class ExplosionPacket extends Packet
 {
 
     public double explosionX;
@@ -16,11 +16,11 @@ public class Packet60Explosion extends Packet
     public Set<ChunkPosition> destroyedBlockPositions;
     public boolean isCannonball;
 
-    public Packet60Explosion()
+    public ExplosionPacket()
     {
     }
 
-    public Packet60Explosion(double d, double d1, double d2, float f, Set<ChunkPosition> set, boolean isCannonball)
+    public ExplosionPacket(double d, double d1, double d2, float f, Set<ChunkPosition> set, boolean isCannonball)
     {
         explosionX = d;
         explosionY = d1;
@@ -31,7 +31,7 @@ public class Packet60Explosion extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis) throws IOException
+	public void read(DataInputStream dis) throws IOException
     {
         explosionX = dis.readDouble();
         explosionY = dis.readDouble();
@@ -54,7 +54,7 @@ public class Packet60Explosion extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos) throws IOException
+	public void write(DataOutputStream dos) throws IOException
     {
         dos.writeDouble(explosionX);
         dos.writeDouble(explosionY);
@@ -75,13 +75,13 @@ public class Packet60Explosion extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleExplosion(this);
+        packetHandler.handleExplosion(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 32 + (destroyedBlockPositions.size() * 3) + 1;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet142OpenFlagWindow.java b/src/main/java/net/minecraft/core/net/packet/FlagOpenPacket.java
similarity index 63%
rename from src/main/java/net/minecraft/core/net/packet/Packet142OpenFlagWindow.java
rename to src/main/java/net/minecraft/core/net/packet/FlagOpenPacket.java
index c613f1d18..8797f400f 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet142OpenFlagWindow.java
+++ b/src/main/java/net/minecraft/core/net/packet/FlagOpenPacket.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet142OpenFlagWindow
+public class FlagOpenPacket
     extends Packet
 {
     public int windowId;
@@ -14,9 +14,9 @@ public class Packet142OpenFlagWindow
     public int y;
     public int z;
 
-    public Packet142OpenFlagWindow() { }
+    public FlagOpenPacket() { }
 
-    public Packet142OpenFlagWindow(int windowId, int x, int y, int z)
+    public FlagOpenPacket(int windowId, int x, int y, int z)
     {
         this.windowId = windowId;
         this.x = x;
@@ -25,7 +25,7 @@ public class Packet142OpenFlagWindow
     }
 
     @Override
-    public void readPacketData(DataInputStream dis)
+    public void read(DataInputStream dis)
             throws IOException
     {
         windowId = dis.readByte();
@@ -35,7 +35,7 @@ public class Packet142OpenFlagWindow
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos)
+    public void write(DataOutputStream dos)
             throws IOException
     {
         dos.writeByte(windowId);
@@ -45,13 +45,13 @@ public class Packet142OpenFlagWindow
     }
 
     @Override
-    public void processPacket(NetHandler netHandler)
+    public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleOpenFlagWindow(this);
+        packetHandler.handleOpenFlagWindow(this);
     }
 
     @Override
-    public int getPacketSize()
+    public int getEstimatedSize()
     {
         return 1 + 4 + 2 + 4;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet74GameRule.java b/src/main/java/net/minecraft/core/net/packet/GameRulePacket.java
similarity index 64%
rename from src/main/java/net/minecraft/core/net/packet/Packet74GameRule.java
rename to src/main/java/net/minecraft/core/net/packet/GameRulePacket.java
index ef7e72bb0..ce75056b2 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet74GameRule.java
+++ b/src/main/java/net/minecraft/core/net/packet/GameRulePacket.java
@@ -7,17 +7,17 @@ import java.io.IOException;
 import com.mojang.nbt.CompoundTag;
 
 import net.minecraft.core.data.gamerule.GameRuleCollection;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
-public class Packet74GameRule
+public class GameRulePacket
     extends Packet {
     private GameRuleCollection gameRules;
 
-    public Packet74GameRule() {
+    public GameRulePacket() {
         gameRules = null;
     }
 
-    public Packet74GameRule(GameRuleCollection gameRules) {
+    public GameRulePacket(GameRuleCollection gameRules) {
         this.gameRules = gameRules;
     }
 
@@ -26,25 +26,25 @@ public class Packet74GameRule
     }
 
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         CompoundTag tag = readCompressedCompoundTag(dis);
         gameRules = GameRuleCollection.readFromNBT(tag);
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         CompoundTag tag = new CompoundTag();
         GameRuleCollection.writeToNBT(tag, gameRules);
         writeCompressedCompoundTag(tag, dos);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleGameRule(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleGameRule(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 0;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet133OpenGuidebook.java b/src/main/java/net/minecraft/core/net/packet/GuidebookPacket.java
similarity index 55%
rename from src/main/java/net/minecraft/core/net/packet/Packet133OpenGuidebook.java
rename to src/main/java/net/minecraft/core/net/packet/GuidebookPacket.java
index 45f1e9d05..2550b69ef 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet133OpenGuidebook.java
+++ b/src/main/java/net/minecraft/core/net/packet/GuidebookPacket.java
@@ -1,44 +1,44 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet133OpenGuidebook extends Packet{
+public class GuidebookPacket extends Packet{
 
-    public Packet133OpenGuidebook()
+    public GuidebookPacket()
     {
     }
 
-    public Packet133OpenGuidebook(boolean i)
+    public GuidebookPacket(boolean i)
     {
         isGuidebookOpen = i;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
             throws IOException
     {
         isGuidebookOpen = dis.readBoolean();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
             throws IOException
     {
         dos.writeBoolean(isGuidebookOpen);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleOpenGuidebook(this);
+        packetHandler.handleOpenGuidebook(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 1;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/InteractPacket.java b/src/main/java/net/minecraft/core/net/packet/InteractPacket.java
new file mode 100644
index 000000000..03bb57665
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/InteractPacket.java
@@ -0,0 +1,59 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class InteractPacket extends Packet
+{
+    public static final int ACTION_INTERACT = 0;
+    public static final int ACTION_ATTACK = 1;
+    public int sourceEntityID;
+    public int targetEntityID;
+    public int action;
+
+
+    public InteractPacket()
+    {
+    }
+
+    public InteractPacket(int source, int target, int action)
+    {
+        sourceEntityID = source;
+        targetEntityID = target;
+        this.action = action;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        sourceEntityID = dis.readInt();
+        targetEntityID = dis.readInt();
+        action = dis.readByte();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(sourceEntityID);
+        dos.writeInt(targetEntityID);
+        dos.writeByte(action);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleUseEntity(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 9;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/KeepAlivePacket.java b/src/main/java/net/minecraft/core/net/packet/KeepAlivePacket.java
new file mode 100644
index 000000000..449891ac5
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/KeepAlivePacket.java
@@ -0,0 +1,39 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class KeepAlivePacket extends Packet
+{
+
+    public KeepAlivePacket()
+    {
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 0;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet1Login.java b/src/main/java/net/minecraft/core/net/packet/LoginPacket.java
similarity index 72%
rename from src/main/java/net/minecraft/core/net/packet/Packet1Login.java
rename to src/main/java/net/minecraft/core/net/packet/LoginPacket.java
index dc5646db0..70005a373 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet1Login.java
+++ b/src/main/java/net/minecraft/core/net/packet/LoginPacket.java
@@ -1,20 +1,27 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet1Login extends Packet
+public class LoginPacket extends Packet
 {
+    public int playerEntityIdAndProtocolVersion;
+    public String username;
+    public long worldSeed;
+    public byte dimensionId;
+    public byte worldTypeId;
+    public int packetDelay;
+    public String publicKey;
 
-    public Packet1Login()
+    public LoginPacket()
     {
     }
 
-    public Packet1Login(String username, int playerEntityIdOrProtocolVersion, long worldSeed, byte dimensionId, byte worldTypeId, int packetDelay, String publicKey)
+    public LoginPacket(String username, int playerEntityIdOrProtocolVersion, long worldSeed, byte dimensionId, byte worldTypeId, int packetDelay, String publicKey)
     {
         this.username = username;
         this.playerEntityIdAndProtocolVersion = playerEntityIdOrProtocolVersion;
@@ -25,7 +32,7 @@ public class Packet1Login extends Packet
         this.publicKey = publicKey;
     }
 
-    public Packet1Login(String s, int i, String p)
+    public LoginPacket(String s, int i, String p)
     {
         username = s;
         playerEntityIdAndProtocolVersion = i;
@@ -33,7 +40,7 @@ public class Packet1Login extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         playerEntityIdAndProtocolVersion = dis.readInt();
@@ -46,7 +53,7 @@ public class Packet1Login extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(playerEntityIdAndProtocolVersion);
@@ -59,22 +66,14 @@ public class Packet1Login extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleLogin(this);
+        packetHandler.handleLogin(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 4 + username.length() + 8 + 1 + 1 + 1;
     }
-
-    public int playerEntityIdAndProtocolVersion;
-    public String username;
-    public long worldSeed;
-    public byte dimensionId;
-    public byte worldTypeId;
-    public int packetDelay;
-    public String publicKey;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet131MapData.java b/src/main/java/net/minecraft/core/net/packet/MapDataPacket.java
similarity index 64%
rename from src/main/java/net/minecraft/core/net/packet/Packet131MapData.java
rename to src/main/java/net/minecraft/core/net/packet/MapDataPacket.java
index b6e55672a..e7d752ddc 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet131MapData.java
+++ b/src/main/java/net/minecraft/core/net/packet/MapDataPacket.java
@@ -1,35 +1,39 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.world.saveddata.maps.MapWaypoint;
 
 import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
 
-public class Packet131MapData extends Packet {
+public class MapDataPacket extends Packet {
 
 	public short itemId;
 	public short meta;
+	public byte scale;
 	public byte[] mapData;
 	public List<MapWaypoint> waypoints;
 
-	public Packet131MapData() {
+	public MapDataPacket() {
 		this.isChunkDataPacket = true;
 	}
 
-	public Packet131MapData(short itemId, short meta, byte[] mapData, List<MapWaypoint> waypoints) {
+	public MapDataPacket(short itemId, short meta, byte scale, byte[] mapData, List<MapWaypoint> waypoints) {
 		this.isChunkDataPacket = true;
 		this.itemId = itemId;
+		this.scale = scale;
 		this.meta = meta;
 		this.waypoints = waypoints;
 		this.mapData = mapData;
+		this.scale = scale;
 	}
 
 	@Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
 		this.itemId = dis.readShort();
 		this.meta = dis.readShort();
+		this.scale = dis.readByte();
 
 		int wayPointAmount = dis.readByte();
 		this.waypoints = new ArrayList<>();
@@ -42,10 +46,11 @@ public class Packet131MapData extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream dos) throws IOException {
+	public void write(DataOutputStream dos) throws IOException {
 		dos.writeShort(itemId);
 		dos.writeShort(meta);
-		
+		dos.writeByte(scale);
+
 		dos.writeByte(waypoints.size());
 		for (int i = 0; i < ((byte)waypoints.size()); i++) {
 			waypoints.get(i).writeToOutputStream(dos);
@@ -56,12 +61,12 @@ public class Packet131MapData extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleMapData(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleMapData(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return 4 + mapData.length;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/MoveEntityPacket.java b/src/main/java/net/minecraft/core/net/packet/MoveEntityPacket.java
new file mode 100644
index 000000000..2fc7c642b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/MoveEntityPacket.java
@@ -0,0 +1,188 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class MoveEntityPacket extends Packet
+{
+    public int id;
+    public byte x;
+    public byte y;
+    public byte z;
+    public byte yaw;
+    public byte pitch;
+    public boolean rotating;
+
+    public MoveEntityPacket()
+    {
+        rotating = false;
+    }
+    
+    public MoveEntityPacket(int i)
+    {
+        rotating = false;
+        id = i;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        id = dis.readInt();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(id);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleEntity(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 4;
+    }
+
+    public static class Pos extends MoveEntityPacket
+    {
+
+        public Pos()
+        {
+        }
+
+        public Pos(int i, byte byte0, byte byte1, byte byte2)
+        {
+            super(i);
+            x = byte0;
+            y = byte1;
+            z = byte2;
+        }
+
+        @Override
+        public void read(DataInputStream dis)
+            throws IOException
+        {
+            super.read(dis);
+            x = dis.readByte();
+            y = dis.readByte();
+            z = dis.readByte();
+        }
+
+        @Override
+        public void write(DataOutputStream dos)
+            throws IOException
+        {
+            super.write(dos);
+            dos.writeByte(x);
+            dos.writeByte(y);
+            dos.writeByte(z);
+        }
+
+        @Override
+        public int getEstimatedSize()
+        {
+            return 7;
+        }
+    }
+
+    public static class Rot extends MoveEntityPacket
+    {
+
+        public Rot()
+        {
+            rotating = true;
+        }
+
+        public Rot(int i, byte byte0, byte byte1)
+        {
+            super(i);
+            yaw = byte0;
+            pitch = byte1;
+            rotating = true;
+        }
+
+        @Override
+        public void read(DataInputStream dis)
+            throws IOException
+        {
+            super.read(dis);
+            yaw = dis.readByte();
+            pitch = dis.readByte();
+        }
+
+        @Override
+        public void write(DataOutputStream dos)
+            throws IOException
+        {
+            super.write(dos);
+            dos.writeByte(yaw);
+            dos.writeByte(pitch);
+        }
+
+        @Override
+        public int getEstimatedSize()
+        {
+            return 6;
+        }
+    }
+    public static class PosRot extends MoveEntityPacket
+    {
+
+        public PosRot()
+        {
+            rotating = true;
+        }
+
+        public PosRot(int i, byte byte0, byte byte1, byte byte2, byte byte3, byte byte4)
+        {
+            super(i);
+            x = byte0;
+            y = byte1;
+            z = byte2;
+            yaw = byte3;
+            pitch = byte4;
+            rotating = true;
+        }
+
+        @Override
+        public void read(DataInputStream dis)
+            throws IOException
+        {
+            super.read(dis);
+            x = dis.readByte();
+            y = dis.readByte();
+            z = dis.readByte();
+            yaw = dis.readByte();
+            pitch = dis.readByte();
+        }
+
+        @Override
+        public void write(DataOutputStream dos)
+            throws IOException
+        {
+            super.write(dos);
+            dos.writeByte(x);
+            dos.writeByte(y);
+            dos.writeByte(z);
+            dos.writeByte(yaw);
+            dos.writeByte(pitch);
+        }
+
+        @Override
+        public int getEstimatedSize()
+        {
+            return 9;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/MovePlayerPacket.java b/src/main/java/net/minecraft/core/net/packet/MovePlayerPacket.java
new file mode 100644
index 000000000..33765f9d1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/MovePlayerPacket.java
@@ -0,0 +1,174 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class MovePlayerPacket extends Packet
+{
+    public double x;
+    public double y;
+    public double z;
+    public double yView;
+    public float yaw;
+    public float pitch;
+    public boolean onGround;
+    public boolean hasPosition;
+    public boolean hasRotation;
+    public MovePlayerPacket()
+    {
+    }
+
+    public MovePlayerPacket(boolean flag)
+    {
+        onGround = flag;
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleFlying(this);
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        onGround = dis.read() != 0;
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.write(onGround ? 1 : 0);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 1;
+    }
+
+    public static class Rot extends MovePlayerPacket
+    {
+        public Rot() {
+            this.hasRotation = true;
+        }
+
+        public Rot(final float yaw, final float pitch, final boolean onGround) {
+            this.yaw = yaw;
+            this.pitch = pitch;
+            this.onGround = onGround;
+            this.hasRotation = true;
+        }
+
+        @Override
+        public void read(final DataInputStream dataInputStream) throws IOException {
+            this.yaw = dataInputStream.readFloat();
+            this.pitch = dataInputStream.readFloat();
+            super.read(dataInputStream);
+        }
+
+        @Override
+        public void write(final DataOutputStream dataOutputStream) throws IOException {
+            dataOutputStream.writeFloat(this.yaw);
+            dataOutputStream.writeFloat(this.pitch);
+            super.write(dataOutputStream);
+        }
+
+        @Override
+        public int getEstimatedSize() {
+            return 9;
+        }
+    }
+
+    public static class Pos extends MovePlayerPacket
+    {
+        public Pos() {
+            this.hasPosition = true;
+        }
+
+        public Pos(final double x, final double y, final double yView, final double z, final boolean onGround) {
+            this.x = x;
+            this.y = y;
+            this.yView = yView;
+            this.z = z;
+            this.onGround = onGround;
+            this.hasPosition = true;
+        }
+
+        @Override
+        public void read(final DataInputStream dataInputStream) throws IOException {
+            this.x = dataInputStream.readDouble();
+            this.y = dataInputStream.readDouble();
+            this.yView = dataInputStream.readDouble();
+            this.z = dataInputStream.readDouble();
+            super.read(dataInputStream);
+        }
+
+        @Override
+        public void write(final DataOutputStream dataOutputStream) throws IOException {
+            dataOutputStream.writeDouble(this.x);
+            dataOutputStream.writeDouble(this.y);
+            dataOutputStream.writeDouble(this.yView);
+            dataOutputStream.writeDouble(this.z);
+            super.write(dataOutputStream);
+        }
+
+        @Override
+        public int getEstimatedSize() {
+            return 33;
+        }
+    }
+
+    public static class PosRot extends MovePlayerPacket
+    {
+        public PosRot() {
+            this.hasRotation = true;
+            this.hasPosition = true;
+        }
+
+        public PosRot(final double x, final double y, final double yView, final double z, final float yaw, final float pitch, final boolean onGround) {
+            this.x = x;
+            this.y = y;
+            this.yView = yView;
+            this.z = z;
+            this.yaw = yaw;
+            this.pitch = pitch;
+            this.onGround = onGround;
+            this.hasRotation = true;
+            this.hasPosition = true;
+        }
+
+        @Override
+        public void read(final DataInputStream dataInputStream) throws IOException {
+            this.x = dataInputStream.readDouble();
+            this.y = dataInputStream.readDouble();
+            this.yView = dataInputStream.readDouble();
+            this.z = dataInputStream.readDouble();
+            this.yaw = dataInputStream.readFloat();
+            this.pitch = dataInputStream.readFloat();
+            super.read(dataInputStream);
+        }
+
+        @Override
+        public void write(final DataOutputStream dataOutputStream) throws IOException {
+            dataOutputStream.writeDouble(this.x);
+            dataOutputStream.writeDouble(this.y);
+            dataOutputStream.writeDouble(this.yView);
+            dataOutputStream.writeDouble(this.z);
+            dataOutputStream.writeFloat(this.yaw);
+            dataOutputStream.writeFloat(this.pitch);
+            super.write(dataOutputStream);
+        }
+
+        @Override
+        public int getEstimatedSize() {
+            return 41;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet.java b/src/main/java/net/minecraft/core/net/packet/Packet.java
index 3a82f0dba..bca82d732 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet.java
+++ b/src/main/java/net/minecraft/core/net/packet/Packet.java
@@ -3,7 +3,7 @@ package net.minecraft.core.net.packet;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.NbtIo;
 import net.minecraft.core.Global;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -23,64 +23,58 @@ import java.util.Set;
 public abstract class Packet
 {
     private static final List<Integer> INTERESTING_PACKETS = Arrays.asList(50, 51, 52);
+    private static final Map<Integer, Class<? extends Packet>> packetIdToClassMap = new HashMap<>();
+    private static final Map<Class<? extends Packet>, Integer> packetClassToIdMap = new HashMap<>();
+    private static final Set<Integer> clientBoundPacketIds = new HashSet<>();
+    private static final Set<Integer> serverBoundPacketIds = new HashSet<>();
+    public final long creationTimeMillis = System.currentTimeMillis();
+    public boolean isChunkDataPacket;
 
     public Packet()
     {
         isChunkDataPacket = false;
     }
 
-    public static void addIdClassMapping(int id, boolean clientbound, boolean serverbound, Class<? extends Packet> packetClass)
-    {
-        if (packetIdToClassMap.containsKey(id))
-        {
+    public static void addMapping(int id, boolean clientBound, boolean serverBound, Class<? extends Packet> packetClass) {
+        if (packetIdToClassMap.containsKey(id)) {
             throw new IllegalArgumentException("Duplicate packet id:" + id);
         }
-        if (packetClassToIdMap.containsKey(packetClass))
-        {
+        if (packetClassToIdMap.containsKey(packetClass)) {
             throw new IllegalArgumentException("Duplicate packet class:" + packetClass);
         }
         packetIdToClassMap.put(id, packetClass);
         packetClassToIdMap.put(packetClass, id);
-        if (clientbound)
-        {
+        if (clientBound) {
             clientBoundPacketIds.add(id);
         }
-        if (serverbound)
-        {
+        if (serverBound) {
             serverBoundPacketIds.add(id);
         }
     }
 
-    public static Packet getNewPacket(int id)
-    {
-        try
-        {
+    public static Packet getNewPacket(int id) {
+        try {
             Class<? extends Packet> packetClass = packetIdToClassMap.get(id);
-            if (packetClass == null)
-            {
+            if (packetClass == null) {
                 return null;
             }
-            else
-            {
+            else {
                 return packetClass.newInstance();
             }
         }
-        catch (Exception exception)
-        {
+        catch (Exception exception) {
             exception.printStackTrace();
         }
         System.out.println("Skipping packet with id " + id);
         return null;
     }
 
-    public final int getPacketId()
+    public final int getId()
     {
         return packetClassToIdMap.get(getClass());
     }
 
-    public static Packet readPacket(DataInputStream dis, boolean isServer)
-            throws IOException
-    {
+    public static Packet readPacket(DataInputStream dis, boolean isServer) throws IOException {
         Packet packet;
         try
         {
@@ -104,7 +98,7 @@ public abstract class Packet
                     System.out.println("Packet " + id + " took " + (System.currentTimeMillis() - sendTime) + "ms to arrive");
                 }
             }
-            packet.readPacketData(dis);
+            packet.read(dis);
         }
         catch (EOFException eofexception)
         {
@@ -114,14 +108,12 @@ public abstract class Packet
         return packet;
     }
 
-    public static void writePacket(Packet packet, DataOutputStream dos)
-            throws IOException
-    {
-        dos.write(packet.getPacketId());
+    public static void writePacket(Packet packet, DataOutputStream dos) throws IOException {
+        dos.write(packet.getId());
         if (Global.NET_DEBUG) {
             dos.writeLong(System.currentTimeMillis());
         }
-        packet.writePacketData(dos);
+        packet.write(dos);
     }
 
     public static void writeString(String string, DataOutputStream dos)
@@ -226,105 +218,97 @@ public abstract class Packet
         return Collections.unmodifiableMap(packetIdToClassMap);
     }
 
-    public abstract void readPacketData(DataInputStream dis)
+    public abstract void read(DataInputStream dis)
             throws IOException;
 
-    public abstract void writePacketData(DataOutputStream dos)
+    public abstract void write(DataOutputStream dos)
             throws IOException;
 
-    public abstract void processPacket(NetHandler netHandler);
+    public abstract void handlePacket(PacketHandler packetHandler);
 
-    public abstract int getPacketSize();
-
-    private static final Map<Integer, Class<? extends Packet>> packetIdToClassMap = new HashMap<>();
-    private static final Map<Class<? extends Packet>, Integer> packetClassToIdMap = new HashMap<>();
-    private static final Set<Integer> clientBoundPacketIds = new HashSet<>();
-    private static final Set<Integer> serverBoundPacketIds = new HashSet<>();
-    public final long creationTimeMillis = System.currentTimeMillis();
-    public boolean isChunkDataPacket;
+    public abstract int getEstimatedSize();
 
     static
     {
-        addIdClassMapping(0, true, true, Packet0KeepAlive.class);
-        addIdClassMapping(1, true, true, Packet1Login.class);
-        addIdClassMapping(2, true, true, Packet2Handshake.class);
-        addIdClassMapping(3, true, true, Packet3Chat.class);
-        addIdClassMapping(4, true, false, Packet4UpdateTime.class);
-        addIdClassMapping(5, true, false, Packet5PlayerInventory.class);
-        addIdClassMapping(6, true, false, Packet6SpawnPosition.class);
-        addIdClassMapping(7, false, true, Packet7UseEntity.class);
-        addIdClassMapping(8, true, false, Packet8UpdateHealth.class);
-        addIdClassMapping(9, true, true, Packet9Respawn.class);
-        addIdClassMapping(10, true, true, Packet10Flying.class);
-        addIdClassMapping(11, true, true, Packet11PlayerPosition.class);
-        addIdClassMapping(12, true, true, Packet12PlayerLook.class);
-        addIdClassMapping(13, true, true, Packet13PlayerLookMove.class);
-        addIdClassMapping(14, false, true, Packet14BlockDig.class);
-        addIdClassMapping(15, false, true, Packet15Place.class);
-        addIdClassMapping(16, true, true, Packet16BlockItemSwitch.class);
-        addIdClassMapping(17, true, false, Packet17Sleep.class);
-        addIdClassMapping(18, true, true, Packet18Animation.class);
-        addIdClassMapping(19, false, true, Packet19EntityAction.class);
-        addIdClassMapping(20, true, false, Packet20NamedEntitySpawn.class);
-        addIdClassMapping(21, true, false, Packet21PickupSpawn.class);
-        addIdClassMapping(22, true, false, Packet22Collect.class);
-        addIdClassMapping(23, true, false, Packet23VehicleSpawn.class);
-        addIdClassMapping(24, true, false, Packet24MobSpawn.class);
-        addIdClassMapping(25, true, false, Packet25EntityPainting.class);
-        addIdClassMapping(26, true, true, Packet26BoatControl.class);
-        addIdClassMapping(27, false, true, Packet27Position.class);
-        addIdClassMapping(28, true, false, Packet28EntityVelocity.class);
-        addIdClassMapping(29, true, false, Packet29DestroyEntity.class);
-        addIdClassMapping(30, true, false, Packet30Entity.class);
-        addIdClassMapping(31, true, false, Packet31RelEntityMove.class);
-        addIdClassMapping(32, true, false, Packet32EntityLook.class);
-        addIdClassMapping(33, true, false, Packet33RelEntityMoveLook.class);
-        addIdClassMapping(34, true, false, Packet34EntityTeleport.class);
-        addIdClassMapping(35, true, true, Packet35EntityNickname.class);
-        addIdClassMapping(38, true, false, Packet38EntityStatus.class);
-        addIdClassMapping(39, true, false, Packet39AttachEntity.class);
-        addIdClassMapping(40, true, false, Packet40EntityMetadata.class);
-        addIdClassMapping(41, true, false, Packet41EntityPlayerGamemode.class);
-        addIdClassMapping(42, true, false, Packet42EntityTagData.class);
-        addIdClassMapping(50, true, false, Packet50PreChunk.class);
-        addIdClassMapping(51, true, false, Packet51MapChunk.class);
-        addIdClassMapping(52, true, false, Packet52MultiBlockChange.class);
-        addIdClassMapping(53, true, false, Packet53BlockChange.class);
-        addIdClassMapping(54, true, false, Packet54PlayNoteBlock.class);
-        addIdClassMapping(60, true, false, Packet60Explosion.class);
-        addIdClassMapping(61, true, false, Packet61PlaySoundEffect.class);
-        addIdClassMapping(62, true, false, Packet62PlaySoundDirect.class);
-        addIdClassMapping(63, true, false, Packet63SpawnParticleEffect.class);
-        addIdClassMapping(70, true, false, Packet70Bed.class);
-        addIdClassMapping(71, true, false, Packet71Weather.class);
-        addIdClassMapping(72, true, false, Packet72UpdatePlayerProfile.class);
-        addIdClassMapping(73, true, false, Packet73WeatherStatus.class);
-        addIdClassMapping(74, true, false, Packet74GameRule.class);
-        addIdClassMapping(75, true, false, Packet75RecipeSync.class);
-        addIdClassMapping(100, true, false, Packet100OpenWindow.class);
-        addIdClassMapping(101, true, true, Packet101CloseWindow.class);
-        addIdClassMapping(102, false, true, Packet102WindowClick.class);
-        addIdClassMapping(103, true, false, Packet103SetSlot.class);
-        addIdClassMapping(104, true, false, Packet104WindowItems.class);
-        addIdClassMapping(105, true, false, Packet105UpdateProgressbar.class);
-        addIdClassMapping(106, true, true, Packet106Transaction.class);
-        addIdClassMapping(107, false, true, Packet107UpdateCreativeInventory.class);
-        addIdClassMapping(108, false, true, Packet108SetHotbarOffset.class);
-        addIdClassMapping(130, false, true, Packet130UpdateSign.class);
-        addIdClassMapping(131, true, false, Packet131MapData.class);
-        addIdClassMapping(132, true, true, Packet132SetMobSpawner.class);
-        addIdClassMapping(133, false, true, Packet133OpenGuidebook.class);
-        addIdClassMapping(136, true, false, Packet136SendKey.class);
-        addIdClassMapping(137, false, true, Packet137SetItemName.class);
-        addIdClassMapping(138, true, false, Packet138PlayerList.class);
-        addIdClassMapping(139, false, true, Packet139SetPaintingMotive.class);
-        addIdClassMapping(140, true, false, Packet140TileEntityData.class);
-        addIdClassMapping(142, true, false, Packet142OpenFlagWindow.class);
-        addIdClassMapping(143, true, false, Packet143PhotoMode.class);
-        addIdClassMapping(200, true, false, Packet200Statistic.class);
-        addIdClassMapping(201, true, false, Packet201Ids.class);
-        addIdClassMapping(250, true, true, Packet250CustomPayload.class);
-        addIdClassMapping(254, false, true, Packet254PingHandshake.class);
-        addIdClassMapping(255, true, true, Packet255KickDisconnect.class);
+        addMapping(0, true, true, KeepAlivePacket.class);
+        addMapping(1, true, true, LoginPacket.class);
+        addMapping(2, true, true, PreLoginPacket.class);
+        addMapping(3, true, true, ChatPacket.class);
+        addMapping(4, true, false, SetTimePacket.class);
+        addMapping(5, true, false, SetEquippedItemPacket.class);
+        addMapping(6, true, false, SetSpawnPositionPacket.class);
+        addMapping(7, false, true, InteractPacket.class);
+        addMapping(8, true, false, SetHealthPacket.class);
+        addMapping(9, true, true, RespawnPacket.class);
+        addMapping(10, true, true, MovePlayerPacket.class);
+        addMapping(11, true, true, MovePlayerPacket.Pos.class);
+        addMapping(12, true, true, MovePlayerPacket.Rot.class);
+        addMapping(13, true, true, MovePlayerPacket.PosRot.class);
+        addMapping(14, false, true, PlayerActionPacket.class);
+        addMapping(15, false, true, UseItemPacket.class);
+        addMapping(16, true, true, SetCarriedItemPacket.class);
+        addMapping(17, true, false, SleepPacket.class);
+        addMapping(18, true, true, AnimatePacket.class);
+        addMapping(19, false, true, PlayerCommandPacket.class);
+        addMapping(20, true, false, AddPlayerPacket.class);
+        addMapping(21, true, false, AddItemEntityPacket.class);
+        addMapping(22, true, false, TakeItemEntityPacket.class);
+        addMapping(23, true, false, AddEntityPacket.class);
+        addMapping(24, true, false, AddMobPacket.class);
+        addMapping(25, true, false, AddPaintingPacket.class);
+        addMapping(26, true, true, BoatControlPacket.class);
+        addMapping(28, true, false, SetEntityMotionPacket.class);
+        addMapping(29, true, false, RemoveEntityPacket.class);
+        addMapping(30, true, false, MoveEntityPacket.class);
+        addMapping(31, true, false, MoveEntityPacket.Pos.class);
+        addMapping(32, true, false, MoveEntityPacket.Rot.class);
+        addMapping(33, true, false, MoveEntityPacket.PosRot.class);
+        addMapping(34, true, false, TeleportEntityPacket.class);
+        addMapping(35, true, true, EntityNicknamePacket.class);
+        addMapping(38, true, false, EnitityEventPacket.class);
+        addMapping(39, true, false, SetRidingPacket.class);
+        addMapping(40, true, false, SetEntityDataPacket.class);
+        addMapping(41, true, false, PlayerGamemodePacket.class);
+        addMapping(42, true, false, EntityTagDataPacket.class);
+        addMapping(50, true, false, ChunkVisibilityPacket.class);
+        addMapping(51, true, false, BlockRegionUpdatePacket.class);
+        addMapping(52, true, false, ChunkBlocksUpdatePacket.class);
+        addMapping(53, true, false, BlockUpdatePacket.class);
+        addMapping(54, true, false, BlockEventPacket.class);
+        addMapping(60, true, false, ExplosionPacket.class);
+        addMapping(61, true, false, PlaySoundEffectPacket.class);
+        addMapping(62, true, false, PlaySoundEffectDirectPacket.class);
+        addMapping(63, true, false, AddParticlePacket.class);
+        addMapping(70, true, false, BedMessagePacket.class);
+        addMapping(71, true, false, WeatherEffectPacket.class);
+        addMapping(72, true, false, UpdatePlayerProfilePacket.class);
+        addMapping(73, true, false, WeatherStatusPacket.class);
+        addMapping(74, true, false, GameRulePacket.class);
+        addMapping(75, true, false, RecipeSyncPacket.class);
+        addMapping(100, true, false, ContainerOpenPacket.class);
+        addMapping(101, true, true, ContainerClosePacket.class);
+        addMapping(102, false, true, ContainerClickPacket.class);
+        addMapping(103, true, false, ContainerSetSlotPacket.class);
+        addMapping(104, true, false, ContainerSetContentPacket.class);
+        addMapping(105, true, false, ContainerSetDataPacket.class);
+        addMapping(106, true, true, ContainerAckPacket.class);
+        addMapping(107, false, true, UpdateCreativeInventoryPacket.class);
+        addMapping(108, false, true, SetHotbarOffsetPacket.class);
+        addMapping(130, false, true, SignUpdatePacket.class);
+        addMapping(131, true, false, MapDataPacket.class);
+        addMapping(132, true, true, SetMobSpawnerPacket.class);
+        addMapping(133, false, true, GuidebookPacket.class);
+        addMapping(136, true, false, AESSendKeyPacket.class);
+        addMapping(137, false, true, SetItemNamePacket.class);
+        addMapping(138, true, false, PlayerListPacket.class);
+        addMapping(139, false, true, SetPaintingArtPacket.class);
+        addMapping(140, true, false, BlockEntityDataPacket.class);
+        addMapping(142, true, false, FlagOpenPacket.class);
+        addMapping(143, true, false, PhotoModePacket.class);
+        addMapping(200, true, false, StatisticPacket.class);
+        addMapping(201, true, false, SyncIDsPacket.class);
+        addMapping(250, true, true, CustomPayloadPacket.class);
+        addMapping(254, false, true, PingHandshakePacket.class);
+        addMapping(255, true, true, DisconnectPacket.class);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet0KeepAlive.java b/src/main/java/net/minecraft/core/net/packet/Packet0KeepAlive.java
deleted file mode 100644
index 8c53e4ee1..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet0KeepAlive.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet0KeepAlive extends Packet
-{
-
-    public Packet0KeepAlive()
-    {
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 0;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet106Transaction.java b/src/main/java/net/minecraft/core/net/packet/Packet106Transaction.java
deleted file mode 100644
index 5772fd122..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet106Transaction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet106Transaction extends Packet
-{
-
-    public Packet106Transaction()
-    {
-    }
-
-    public Packet106Transaction(int i, short word0, boolean flag)
-    {
-        windowId = i;
-        shortWindowId = word0;
-        field_20030_c = flag;
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleTransaction(this);
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        windowId = dis.readByte();
-        shortWindowId = dis.readShort();
-        field_20030_c = dis.readByte() != 0;
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeByte(windowId);
-        dos.writeShort(shortWindowId);
-        dos.writeByte(field_20030_c ? 1 : 0);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 4;
-    }
-
-    public int windowId;
-    public short shortWindowId;
-    public boolean field_20030_c;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet108SetHotbarOffset.java b/src/main/java/net/minecraft/core/net/packet/Packet108SetHotbarOffset.java
deleted file mode 100644
index 087b9cc03..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet108SetHotbarOffset.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-public class Packet108SetHotbarOffset extends Packet
-{
-    public int hotbarOffset;
-
-    public Packet108SetHotbarOffset(int hotbarOffset)
-    {
-        this.hotbarOffset = hotbarOffset;
-    }
-
-    public Packet108SetHotbarOffset()
-    {
-    }
-
-    @Override
-    public void readPacketData(DataInputStream dis) throws IOException
-    {
-        hotbarOffset = dis.readByte();
-    }
-
-    @Override
-    public void writePacketData(DataOutputStream dos) throws IOException
-    {
-        dos.writeByte(hotbarOffset);
-    }
-
-    @Override
-    public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleSetHotbarOffset(this);
-    }
-
-    @Override
-    public int getPacketSize() {
-        return 0;
-    }
-
-
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet10Flying.java b/src/main/java/net/minecraft/core/net/packet/Packet10Flying.java
deleted file mode 100644
index 1f6ba12f7..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet10Flying.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet10Flying extends Packet
-{
-
-    public Packet10Flying()
-    {
-    }
-
-    public Packet10Flying(boolean flag)
-    {
-        onGround = flag;
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleFlying(this);
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        onGround = dis.read() != 0;
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.write(onGround ? 1 : 0);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 1;
-    }
-
-    public double xPosition;
-    public double yPosition;
-    public double zPosition;
-    public double stance;
-    public float yaw;
-    public float pitch;
-    public boolean onGround;
-    public boolean moving;
-    public boolean rotating;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet11PlayerPosition.java b/src/main/java/net/minecraft/core/net/packet/Packet11PlayerPosition.java
deleted file mode 100644
index d2d39728f..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet11PlayerPosition.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet10Flying
-
-public class Packet11PlayerPosition extends Packet10Flying
-{
-
-    public Packet11PlayerPosition()
-    {
-        moving = true;
-    }
-
-    public Packet11PlayerPosition(double d, double d1, double d2, double d3, boolean flag)
-    {
-        xPosition = d;
-        yPosition = d1;
-        stance = d2;
-        zPosition = d3;
-        onGround = flag;
-        moving = true;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        xPosition = dis.readDouble();
-        yPosition = dis.readDouble();
-        stance = dis.readDouble();
-        zPosition = dis.readDouble();
-        super.readPacketData(dis);
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeDouble(xPosition);
-        dos.writeDouble(yPosition);
-        dos.writeDouble(stance);
-        dos.writeDouble(zPosition);
-        super.writePacketData(dos);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 33;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet12PlayerLook.java b/src/main/java/net/minecraft/core/net/packet/Packet12PlayerLook.java
deleted file mode 100644
index 929e48176..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet12PlayerLook.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet10Flying
-
-public class Packet12PlayerLook extends Packet10Flying
-{
-
-    public Packet12PlayerLook()
-    {
-        rotating = true;
-    }
-
-    public Packet12PlayerLook(float f, float f1, boolean flag)
-    {
-        yaw = f;
-        pitch = f1;
-        onGround = flag;
-        rotating = true;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        yaw = dis.readFloat();
-        pitch = dis.readFloat();
-        super.readPacketData(dis);
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeFloat(yaw);
-        dos.writeFloat(pitch);
-        super.writePacketData(dos);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 9;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet13PlayerLookMove.java b/src/main/java/net/minecraft/core/net/packet/Packet13PlayerLookMove.java
deleted file mode 100644
index 7d224ea5d..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet13PlayerLookMove.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet10Flying
-
-public class Packet13PlayerLookMove extends Packet10Flying
-{
-
-    public Packet13PlayerLookMove()
-    {
-        rotating = true;
-        moving = true;
-    }
-
-    public Packet13PlayerLookMove(double d, double d1, double d2, double d3, float f, float f1, boolean flag)
-    {
-        xPosition = d;
-        yPosition = d1;
-        stance = d2;
-        zPosition = d3;
-        yaw = f;
-        pitch = f1;
-        onGround = flag;
-        rotating = true;
-        moving = true;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        xPosition = dis.readDouble();
-        yPosition = dis.readDouble();
-        stance = dis.readDouble();
-        zPosition = dis.readDouble();
-        yaw = dis.readFloat();
-        pitch = dis.readFloat();
-        super.readPacketData(dis);
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeDouble(xPosition);
-        dos.writeDouble(yPosition);
-        dos.writeDouble(stance);
-        dos.writeDouble(zPosition);
-        dos.writeFloat(yaw);
-        dos.writeFloat(pitch);
-        super.writePacketData(dos);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 41;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet16BlockItemSwitch.java b/src/main/java/net/minecraft/core/net/packet/Packet16BlockItemSwitch.java
deleted file mode 100644
index b67aac334..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet16BlockItemSwitch.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet16BlockItemSwitch extends Packet
-{
-
-    public Packet16BlockItemSwitch()
-    {
-    }
-
-    public Packet16BlockItemSwitch(int i)
-    {
-        id = i;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        id = dis.readShort();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeShort(id);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleBlockItemSwitch(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 2;
-    }
-
-    public int id;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet200Statistic.java b/src/main/java/net/minecraft/core/net/packet/Packet200Statistic.java
deleted file mode 100644
index 26c417a12..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet200Statistic.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet200Statistic extends Packet
-{
-
-    public Packet200Statistic()
-    {
-    }
-    
-    public Packet200Statistic(int i, int j)
-    {
-        field_27052_a = i;
-        field_27051_b = j;
-    }
-
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleStatistic(this);
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        field_27052_a = dis.readInt();
-        field_27051_b = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(field_27052_a);
-        dos.writeByte(field_27051_b);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 6;
-    }
-
-    public int field_27052_a;
-    public int field_27051_b;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet27Position.java b/src/main/java/net/minecraft/core/net/packet/Packet27Position.java
deleted file mode 100644
index 39d44bdbb..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet27Position.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet27Position extends Packet
-{
-
-    public Packet27Position()
-    {
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        strafeMovement = dis.readFloat();
-        forwardMovement = dis.readFloat();
-        pitchRotation = dis.readFloat();
-        yawRotation = dis.readFloat();
-        field_22043_c = dis.readBoolean();
-        isInJump = dis.readBoolean();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeFloat(strafeMovement);
-        dos.writeFloat(forwardMovement);
-        dos.writeFloat(pitchRotation);
-        dos.writeFloat(yawRotation);
-        dos.writeBoolean(field_22043_c);
-        dos.writeBoolean(isInJump);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handlePosition(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 18;
-    }
-    
-    public float func_22031_c()
-    {
-        return strafeMovement;
-    }
-
-    public float func_22029_d()
-    {
-        return pitchRotation;
-    }
-
-    public float func_22028_e()
-    {
-        return forwardMovement;
-    }
-
-    public float func_22033_f()
-    {
-        return yawRotation;
-    }
-
-    public boolean func_22032_g()
-    {
-        return field_22043_c;
-    }
-
-    public boolean func_22030_h()
-    {
-        return isInJump;
-    }
-
-
-    private float strafeMovement;
-    private float forwardMovement;
-    private boolean field_22043_c;
-    private boolean isInJump;
-    private float pitchRotation;
-    private float yawRotation;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet30Entity.java b/src/main/java/net/minecraft/core/net/packet/Packet30Entity.java
deleted file mode 100644
index e5e6665a7..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet30Entity.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet30Entity extends Packet
-{
-
-    public Packet30Entity()
-    {
-        rotating = false;
-    }
-    
-    public Packet30Entity(int i)
-    {
-        rotating = false;
-        entityId = i;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        entityId = dis.readInt();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(entityId);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleEntity(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 4;
-    }
-
-    public int entityId;
-    public byte xPosition;
-    public byte yPosition;
-    public byte zPosition;
-    public byte yaw;
-    public byte pitch;
-    public boolean rotating;
-    public String nickname;
-    public byte chatColor;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet31RelEntityMove.java b/src/main/java/net/minecraft/core/net/packet/Packet31RelEntityMove.java
deleted file mode 100644
index 41bced8cd..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet31RelEntityMove.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet30Entity
-
-public class Packet31RelEntityMove extends Packet30Entity
-{
-
-    public Packet31RelEntityMove()
-    {
-    }
-    
-    public Packet31RelEntityMove(int i, byte byte0, byte byte1, byte byte2)
-    {
-        super(i);
-        xPosition = byte0;
-        yPosition = byte1;
-        zPosition = byte2;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        super.readPacketData(dis);
-        xPosition = dis.readByte();
-        yPosition = dis.readByte();
-        zPosition = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        super.writePacketData(dos);
-        dos.writeByte(xPosition);
-        dos.writeByte(yPosition);
-        dos.writeByte(zPosition);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 7;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet32EntityLook.java b/src/main/java/net/minecraft/core/net/packet/Packet32EntityLook.java
deleted file mode 100644
index 721d2c707..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet32EntityLook.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet30Entity
-
-public class Packet32EntityLook extends Packet30Entity
-{
-
-    public Packet32EntityLook()
-    {
-        rotating = true;
-    }
-    
-    public Packet32EntityLook(int i, byte byte0, byte byte1)
-    {
-        super(i);
-        yaw = byte0;
-        pitch = byte1;
-        rotating = true;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        super.readPacketData(dis);
-        yaw = dis.readByte();
-        pitch = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        super.writePacketData(dos);
-        dos.writeByte(yaw);
-        dos.writeByte(pitch);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 6;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet33RelEntityMoveLook.java b/src/main/java/net/minecraft/core/net/packet/Packet33RelEntityMoveLook.java
deleted file mode 100644
index 356c66777..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet33RelEntityMoveLook.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet30Entity
-
-public class Packet33RelEntityMoveLook extends Packet30Entity
-{
-
-    public Packet33RelEntityMoveLook()
-    {
-        rotating = true;
-    }
-    
-    public Packet33RelEntityMoveLook(int i, byte byte0, byte byte1, byte byte2, byte byte3, byte byte4)
-    {
-        super(i);
-        xPosition = byte0;
-        yPosition = byte1;
-        zPosition = byte2;
-        yaw = byte3;
-        pitch = byte4;
-        rotating = true;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        super.readPacketData(dis);
-        xPosition = dis.readByte();
-        yPosition = dis.readByte();
-        zPosition = dis.readByte();
-        yaw = dis.readByte();
-        pitch = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        super.writePacketData(dos);
-        dos.writeByte(xPosition);
-        dos.writeByte(yPosition);
-        dos.writeByte(zPosition);
-        dos.writeByte(yaw);
-        dos.writeByte(pitch);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 9;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet34EntityTeleport.java b/src/main/java/net/minecraft/core/net/packet/Packet34EntityTeleport.java
deleted file mode 100644
index 5e4d6ea12..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet34EntityTeleport.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, Entity, MathHelper, NetHandler
-
-public class Packet34EntityTeleport extends Packet
-{
-
-    public Packet34EntityTeleport()
-    {
-    }
-
-    public Packet34EntityTeleport(Entity entity)
-    {
-        entityId = entity.id;
-        xPosition = MathHelper.floor_double(entity.x * 32D);
-        yPosition = MathHelper.floor_double(entity.y * 32D);
-        zPosition = MathHelper.floor_double(entity.z * 32D);
-        yaw = (byte)(int)((entity.yRot * 256F) / 360F);
-        pitch = (byte)(int)((entity.xRot * 256F) / 360F);
-    }
-    
-    public Packet34EntityTeleport(int i, int j, int k, int l, byte byte0, byte byte1)
-    {
-        entityId = i;
-        xPosition = j;
-        yPosition = k;
-        zPosition = l;
-        yaw = byte0;
-        pitch = byte1;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        entityId = dis.readInt();
-        xPosition = dis.readInt();
-        yPosition = dis.readInt();
-        zPosition = dis.readInt();
-        yaw = (byte) dis.read();
-        pitch = (byte) dis.read();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(entityId);
-        dos.writeInt(xPosition);
-        dos.writeInt(yPosition);
-        dos.writeInt(zPosition);
-        dos.write(yaw);
-        dos.write(pitch);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleEntityTeleport(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 34;
-    }
-
-    public int entityId;
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-    public byte yaw;
-    public byte pitch;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet35EntityNickname.java b/src/main/java/net/minecraft/core/net/packet/Packet35EntityNickname.java
deleted file mode 100644
index 060be02d8..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet35EntityNickname.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-public class Packet35EntityNickname extends Packet30Entity
-{
-    public Packet35EntityNickname()
-    {
-    }
-
-    public Packet35EntityNickname(int entityId, String nickname, byte chatColor)
-    {
-        this.entityId = entityId;
-        this.nickname = nickname;
-        this.chatColor = chatColor;
-    }
-
-    @Override
-    public int getPacketSize()
-    {
-        return 4 + nickname.length() + 1;
-    }
-
-    @Override
-    public void readPacketData(DataInputStream dis) throws IOException
-    {
-        super.readPacketData(dis);
-        nickname = readString(dis, 32);
-        chatColor = dis.readByte();
-    }
-
-    @Override
-    public void writePacketData(DataOutputStream dos) throws IOException
-    {
-        super.writePacketData(dos);
-        writeString(nickname, dos);
-        dos.writeByte(chatColor);
-    }
-
-    @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleEntityNickname(this);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet40EntityMetadata.java b/src/main/java/net/minecraft/core/net/packet/Packet40EntityMetadata.java
deleted file mode 100644
index f60544697..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet40EntityMetadata.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.world.data.SynchedEntityData;
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, DataWatcher, NetHandler
-
-public class Packet40EntityMetadata extends Packet
-{
-
-    public Packet40EntityMetadata()
-    {
-    }
-    
-    public Packet40EntityMetadata(int i, SynchedEntityData datawatcher)
-    {
-        entityId = i;
-        field_21048_b = datawatcher.packDirty();
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        entityId = dis.readInt();
-        field_21048_b = SynchedEntityData.unpack(dis);
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(entityId);
-        SynchedEntityData.pack(field_21048_b, dos);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleEntityMetadata(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 5;
-    }
-
-    public List func_21047_b()
-    {
-        return field_21048_b;
-    }
-
-    public int entityId;
-    private List field_21048_b;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet6SpawnPosition.java b/src/main/java/net/minecraft/core/net/packet/Packet6SpawnPosition.java
deleted file mode 100644
index e904d35f2..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet6SpawnPosition.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet6SpawnPosition extends Packet
-{
-
-    public Packet6SpawnPosition()
-    {
-    }
-    
-    public Packet6SpawnPosition(int i, int j, int k)
-    {
-        xPosition = i;
-        yPosition = j;
-        zPosition = k;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        xPosition = dis.readInt();
-        yPosition = dis.readInt();
-        zPosition = dis.readInt();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(xPosition);
-        dos.writeInt(yPosition);
-        dos.writeInt(zPosition);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleSpawnPosition(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 12;
-    }
-
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet70Bed.java b/src/main/java/net/minecraft/core/net/packet/Packet70Bed.java
deleted file mode 100644
index 12622f6c0..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet70Bed.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet70Bed extends Packet
-{
-
-    public Packet70Bed()
-    {
-    }
-    
-    public Packet70Bed(int i)
-    {
-    	field_25019_b = i;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        field_25019_b = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeByte(field_25019_b);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleBed(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 1;
-    }
-
-    public static final String field_25020_a[] = {
-        "bed.notValid", null, null
-    };
-    public int field_25019_b;
-
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet71Weather.java b/src/main/java/net/minecraft/core/net/packet/Packet71Weather.java
deleted file mode 100644
index 88071083e..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet71Weather.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLightningBolt;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, Entity, MathHelper, EntityLightningBolt, 
-//            NetHandler
-
-public class Packet71Weather extends Packet
-{
-
-    public Packet71Weather()
-    {
-    }
-
-    public Packet71Weather(Entity entity)
-    {
-        field_27054_a = entity.id;
-        field_27053_b = MathHelper.floor_double(entity.x * 32D);
-        field_27057_c = MathHelper.floor_double(entity.y * 32D);
-        field_27056_d = MathHelper.floor_double(entity.z * 32D);
-        if(entity instanceof EntityLightningBolt)
-        {
-            field_27055_e = 1;
-        }
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        field_27054_a = dis.readInt();
-        field_27055_e = dis.readByte();
-        field_27053_b = dis.readInt();
-        field_27057_c = dis.readInt();
-        field_27056_d = dis.readInt();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(field_27054_a);
-        dos.writeByte(field_27055_e);
-        dos.writeInt(field_27053_b);
-        dos.writeInt(field_27057_c);
-        dos.writeInt(field_27056_d);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleWeather(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 17;
-    }
-
-    public int field_27054_a;
-    public int field_27053_b;
-    public int field_27057_c;
-    public int field_27056_d;
-    public int field_27055_e;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet7UseEntity.java b/src/main/java/net/minecraft/core/net/packet/Packet7UseEntity.java
deleted file mode 100644
index 4f3cab28e..000000000
--- a/src/main/java/net/minecraft/core/net/packet/Packet7UseEntity.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.core.net.packet;
-
-import net.minecraft.core.net.handler.NetHandler;
-
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet7UseEntity extends Packet
-{
-
-    public Packet7UseEntity()
-    {
-    }
-
-    public Packet7UseEntity(int i, int j, int k)
-    {
-        playerEntityId = i;
-        targetEntity = j;
-        isLeftClick = k;
-    }
-
-    @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
-        playerEntityId = dis.readInt();
-        targetEntity = dis.readInt();
-        isLeftClick = dis.readByte();
-    }
-
-    @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
-        dos.writeInt(playerEntityId);
-        dos.writeInt(targetEntity);
-        dos.writeByte(isLeftClick);
-    }
-
-    @Override
-	public void processPacket(NetHandler netHandler)
-    {
-        netHandler.handleUseEntity(this);
-    }
-
-    @Override
-	public int getPacketSize()
-    {
-        return 9;
-    }
-
-    public int playerEntityId;
-    public int targetEntity;
-    public int isLeftClick;
-}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet143PhotoMode.java b/src/main/java/net/minecraft/core/net/packet/PhotoModePacket.java
similarity index 55%
rename from src/main/java/net/minecraft/core/net/packet/Packet143PhotoMode.java
rename to src/main/java/net/minecraft/core/net/packet/PhotoModePacket.java
index 3bfd007b9..c5027acef 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet143PhotoMode.java
+++ b/src/main/java/net/minecraft/core/net/packet/PhotoModePacket.java
@@ -1,45 +1,45 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet143PhotoMode
+public class PhotoModePacket
     extends Packet
 {
     public boolean disabled = false;
 
-    public Packet143PhotoMode() { }
+    public PhotoModePacket() { }
 
-    public Packet143PhotoMode(boolean disabled)
+    public PhotoModePacket(boolean disabled)
     {
         this.disabled = disabled;
     }
 
     @Override
-    public void readPacketData(DataInputStream dis)
+    public void read(DataInputStream dis)
             throws IOException
     {
         disabled = dis.readBoolean();
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos)
+    public void write(DataOutputStream dos)
             throws IOException
     {
         dos.writeBoolean(disabled);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler)
+    public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePhotoMode(this);
+        packetHandler.handlePhotoMode(this);
     }
 
     @Override
-    public int getPacketSize()
+    public int getEstimatedSize()
     {
         return 1;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet254PingHandshake.java b/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
similarity index 66%
rename from src/main/java/net/minecraft/core/net/packet/Packet254PingHandshake.java
rename to src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
index edc3319a9..08c7ac107 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet254PingHandshake.java
+++ b/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.client.net.handler.NetPingHandler;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.client.net.handler.PingPacketHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
-public class Packet254PingHandshake
+public class PingHandshakePacket
     extends Packet {
     public int payload;
     public int identifier;
@@ -17,10 +17,10 @@ public class Packet254PingHandshake
     public String hostname;
     public int port;
 
-    public Packet254PingHandshake() {
+    public PingHandshakePacket() {
     }
 
-    public Packet254PingHandshake(int payload, int identifier, String pingHostString, int protocolVersion, String hostname, int port) {
+    public PingHandshakePacket(int payload, int identifier, String pingHostString, int protocolVersion, String hostname, int port) {
         this.payload = payload;
         this.identifier = identifier;
         this.pingHostString = pingHostString;
@@ -30,7 +30,7 @@ public class Packet254PingHandshake
     }
 
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         payload = dis.readUnsignedByte();
         identifier = dis.readUnsignedByte();
         pingHostString = readUTF16BEString(dis, 255);
@@ -41,7 +41,7 @@ public class Packet254PingHandshake
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeByte(payload);
         dos.writeByte(identifier);
         writeUTF16BEString(pingHostString, dos);
@@ -49,16 +49,16 @@ public class Packet254PingHandshake
         dos.writeByte(protocolVersion);
         writeUTF16BEString(hostname, dos);
         dos.writeInt(port);
-        NetPingHandler.startTime = System.currentTimeMillis();
+        PingPacketHandler.startTime = System.currentTimeMillis();
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handlePingHandshake(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handlePingHandshake(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 0;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet62PlaySoundDirect.java b/src/main/java/net/minecraft/core/net/packet/PlaySoundEffectDirectPacket.java
similarity index 68%
rename from src/main/java/net/minecraft/core/net/packet/Packet62PlaySoundDirect.java
rename to src/main/java/net/minecraft/core/net/packet/PlaySoundEffectDirectPacket.java
index 1cf7e36f9..37b125ed5 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet62PlaySoundDirect.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlaySoundEffectDirectPacket.java
@@ -1,13 +1,13 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.sound.SoundCategory;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet62PlaySoundDirect extends Packet {
+public class PlaySoundEffectDirectPacket extends Packet {
 	public int soundId;
     public SoundCategory soundType;
     public double x;
@@ -16,11 +16,11 @@ public class Packet62PlaySoundDirect extends Packet {
     public float volume;
     public float pitch;
 
-    public Packet62PlaySoundDirect()
+    public PlaySoundEffectDirectPacket()
     {
     }
 
-    public Packet62PlaySoundDirect(int soundId, SoundCategory soundType, double x, double y, double z, float volume, float pitch)
+    public PlaySoundEffectDirectPacket(int soundId, SoundCategory soundType, double x, double y, double z, float volume, float pitch)
     {
     	this.soundId = soundId;
         this.soundType = soundType;
@@ -31,7 +31,7 @@ public class Packet62PlaySoundDirect extends Packet {
         this.pitch = pitch;
     }
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         this.soundId = dis.readShort() & 0xFFFF;
         this.soundType = SoundCategory.values()[dis.readByte()];
         this.x = dis.readFloat();
@@ -42,7 +42,7 @@ public class Packet62PlaySoundDirect extends Packet {
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeShort(soundId);
         dos.writeByte(soundType.ordinal());
         dos.writeFloat((float) x);
@@ -53,12 +53,12 @@ public class Packet62PlaySoundDirect extends Packet {
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handlePlaySoundDirectly(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handlePlaySoundDirectly(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 23;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet61PlaySoundEffect.java b/src/main/java/net/minecraft/core/net/packet/PlaySoundEffectPacket.java
similarity index 54%
rename from src/main/java/net/minecraft/core/net/packet/Packet61PlaySoundEffect.java
rename to src/main/java/net/minecraft/core/net/packet/PlaySoundEffectPacket.java
index 2083badfc..90e70ee37 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet61PlaySoundEffect.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlaySoundEffectPacket.java
@@ -1,31 +1,31 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet61PlaySoundEffect extends Packet
+public class PlaySoundEffectPacket extends Packet
 {
 
-    public Packet61PlaySoundEffect()
+    public PlaySoundEffectPacket()
     {
     }
     
-    public Packet61PlaySoundEffect(int i, int j, int k, int l, int i1)
+    public PlaySoundEffectPacket(int soundId, int x, int y, int z, int data)
     {
-        soundID = i;
-        x = j;
-        y = k;
-        z = l;
-        data = i1;
+        soundID = soundId;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        this.data = data;
     }
 
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         soundID = dis.readInt();
@@ -36,7 +36,7 @@ public class Packet61PlaySoundEffect extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(soundID);
@@ -47,13 +47,13 @@ public class Packet61PlaySoundEffect extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePlaySoundEffect(this);
+        packetHandler.handlePlaySoundEffect(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 20;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java b/src/main/java/net/minecraft/core/net/packet/PlayerActionPacket.java
similarity index 72%
rename from src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java
rename to src/main/java/net/minecraft/core/net/packet/PlayerActionPacket.java
index 21251c43f..5edc6d209 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlayerActionPacket.java
@@ -4,20 +4,20 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.Side;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet14BlockDig extends Packet
+public class PlayerActionPacket extends Packet
 {
 
-    public Packet14BlockDig()
+    public PlayerActionPacket()
     {
     }
 
-    public Packet14BlockDig(int i, int j, int k, int l, Side side, double xHit, double yHit)
+    public PlayerActionPacket(int i, int j, int k, int l, Side side, double xHit, double yHit)
     {
         status = i;
         xPosition = j;
@@ -29,7 +29,7 @@ public class Packet14BlockDig extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         status = dis.read();
@@ -42,7 +42,7 @@ public class Packet14BlockDig extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.write(status);
@@ -55,13 +55,13 @@ public class Packet14BlockDig extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleBlockDig(this);
+        packetHandler.handleBlockDig(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 19;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet19EntityAction.java b/src/main/java/net/minecraft/core/net/packet/PlayerCommandPacket.java
similarity index 56%
rename from src/main/java/net/minecraft/core/net/packet/Packet19EntityAction.java
rename to src/main/java/net/minecraft/core/net/packet/PlayerCommandPacket.java
index 60ad3037e..03dfce762 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet19EntityAction.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlayerCommandPacket.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, Entity, NetHandler
+//            Packet, Entity, PacketHandler
 
-public class Packet19EntityAction extends Packet
+public class PlayerCommandPacket extends Packet
 {
 
-    public Packet19EntityAction()
+    public PlayerCommandPacket()
     {
     }
 
-    public Packet19EntityAction(Entity entity, int i)
+    public PlayerCommandPacket(Entity entity, int i)
     {
         entityId = entity.id;
         state = i;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -30,7 +30,7 @@ public class Packet19EntityAction extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -38,13 +38,13 @@ public class Packet19EntityAction extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleEntityAction(this);
+        packetHandler.handleEntityAction(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 5;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet41EntityPlayerGamemode.java b/src/main/java/net/minecraft/core/net/packet/PlayerGamemodePacket.java
similarity index 54%
rename from src/main/java/net/minecraft/core/net/packet/Packet41EntityPlayerGamemode.java
rename to src/main/java/net/minecraft/core/net/packet/PlayerGamemodePacket.java
index b66936686..c632cc47b 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet41EntityPlayerGamemode.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlayerGamemodePacket.java
@@ -1,27 +1,27 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, DataWatcher, NetHandler
+//            Packet, DataWatcher, PacketHandler
 
-public class Packet41EntityPlayerGamemode extends Packet
+public class PlayerGamemodePacket extends Packet
 {
 
-    public Packet41EntityPlayerGamemode()
+    public PlayerGamemodePacket()
     {
     }
     
-    public Packet41EntityPlayerGamemode(int entityId, int gamemodeId)
+    public PlayerGamemodePacket(int entityId, int gamemodeId)
     {
         this.entityId = entityId;
         this.gamemodeId = gamemodeId;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -29,7 +29,7 @@ public class Packet41EntityPlayerGamemode extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -37,13 +37,13 @@ public class Packet41EntityPlayerGamemode extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleEntityPlayerGamemode(this);
+        packetHandler.handleEntityPlayerGamemode(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 5;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet138PlayerList.java b/src/main/java/net/minecraft/core/net/packet/PlayerListPacket.java
similarity index 67%
rename from src/main/java/net/minecraft/core/net/packet/Packet138PlayerList.java
rename to src/main/java/net/minecraft/core/net/packet/PlayerListPacket.java
index 34430e211..0fc74c371 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet138PlayerList.java
+++ b/src/main/java/net/minecraft/core/net/packet/PlayerListPacket.java
@@ -1,12 +1,12 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet138PlayerList extends Packet {
+public class PlayerListPacket extends Packet {
 	
 	public String[] players;
 	/**
@@ -15,18 +15,18 @@ public class Packet138PlayerList extends Packet {
 	public String[] scores;
 	public int count;
 	
-	public Packet138PlayerList() {
+	public PlayerListPacket() {
 		
 	}
 
-	public Packet138PlayerList(int playerCount, String[] players, String[] scores) {
+	public PlayerListPacket(int playerCount, String[] players, String[] scores) {
 		this.count = playerCount;
 		this.players = players;
 		this.scores = scores;
 	}
 
 	@Override
-	public void readPacketData(DataInputStream in) throws IOException {
+	public void read(DataInputStream in) throws IOException {
 		count = in.readInt();
 		players = new String[count];
 		scores = new String[count];
@@ -38,7 +38,7 @@ public class Packet138PlayerList extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream out) throws IOException {
+	public void write(DataOutputStream out) throws IOException {
 		out.writeInt(count);
 		
 		for(int i=0; i < count; i++) {
@@ -48,12 +48,12 @@ public class Packet138PlayerList extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handlePlayerList(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handlePlayerList(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		int size = 4;
 
 		for(int i=0; i < scores.length; i++) {
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet2Handshake.java b/src/main/java/net/minecraft/core/net/packet/PreLoginPacket.java
similarity index 53%
rename from src/main/java/net/minecraft/core/net/packet/Packet2Handshake.java
rename to src/main/java/net/minecraft/core/net/packet/PreLoginPacket.java
index 42cfef02d..c071a84dc 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet2Handshake.java
+++ b/src/main/java/net/minecraft/core/net/packet/PreLoginPacket.java
@@ -1,49 +1,49 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet2Handshake extends Packet
+public class PreLoginPacket extends Packet
 {
+    public String username;
+
 
-    public Packet2Handshake()
+    public PreLoginPacket()
     {
     }
 
-    public Packet2Handshake(String s)
+    public PreLoginPacket(String s)
     {
         username = s;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         username = readString(dis, 32);
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         writeString(username, dos);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleHandshake(this);
+        packetHandler.handleHandshake(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 4 + username.length() + 4;
     }
-
-    public String username;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet75RecipeSync.java b/src/main/java/net/minecraft/core/net/packet/RecipeSyncPacket.java
similarity index 54%
rename from src/main/java/net/minecraft/core/net/packet/Packet75RecipeSync.java
rename to src/main/java/net/minecraft/core/net/packet/RecipeSyncPacket.java
index e2ebd2030..98e234ffb 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet75RecipeSync.java
+++ b/src/main/java/net/minecraft/core/net/packet/RecipeSyncPacket.java
@@ -2,45 +2,44 @@ package net.minecraft.core.net.packet;
 
 import net.minecraft.core.data.DataLoader;
 import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
-import net.minecraft.core.data.registry.recipe.RecipeRegistry;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet75RecipeSync extends Packet {
+public class RecipeSyncPacket extends Packet {
 
     public String recipe;
     public long maxRecipes;
 
-    public Packet75RecipeSync(RecipeEntryBase<?,?,?> recipe, long maxRecipes) {
+    public RecipeSyncPacket(RecipeEntryBase<?,?,?> recipe, long maxRecipes) {
         this.recipe = DataLoader.serializeRecipe(recipe);
         this.maxRecipes = maxRecipes;
     }
 
-    public Packet75RecipeSync(){}
+    public RecipeSyncPacket(){}
 
 
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         recipe = dis.readUTF();
         maxRecipes = dis.readLong();
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeUTF(recipe);
         dos.writeLong(maxRecipes);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleSyncedRecipe(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleSyncedRecipe(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return recipe.getBytes().length;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet29DestroyEntity.java b/src/main/java/net/minecraft/core/net/packet/RemoveEntityPacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet29DestroyEntity.java
rename to src/main/java/net/minecraft/core/net/packet/RemoveEntityPacket.java
index cc7dc302a..7988e9688 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet29DestroyEntity.java
+++ b/src/main/java/net/minecraft/core/net/packet/RemoveEntityPacket.java
@@ -1,46 +1,46 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet29DestroyEntity extends Packet
+public class RemoveEntityPacket extends Packet
 {
 
-    public Packet29DestroyEntity()
+    public RemoveEntityPacket()
     {
     }
     
-    public Packet29DestroyEntity(int i)
+    public RemoveEntityPacket(int i)
     {
         entityId = i;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleDestroyEntity(this);
+        packetHandler.handleDestroyEntity(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 4;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet9Respawn.java b/src/main/java/net/minecraft/core/net/packet/RespawnPacket.java
similarity index 60%
rename from src/main/java/net/minecraft/core/net/packet/Packet9Respawn.java
rename to src/main/java/net/minecraft/core/net/packet/RespawnPacket.java
index a6f4e35f8..51773fe6f 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet9Respawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/RespawnPacket.java
@@ -1,33 +1,36 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet9Respawn extends Packet
+public class RespawnPacket extends Packet
 {
+    public byte respawnDimensionId;
+    public byte respawnWorldTypeId;
+
 
-    public Packet9Respawn()
+    public RespawnPacket()
     {
     }
 
-    public Packet9Respawn(byte respawnDimensionId, byte respawnWorldTypeId)
+    public RespawnPacket(byte respawnDimensionId, byte respawnWorldTypeId)
     {
         this.respawnDimensionId = respawnDimensionId;
         this.respawnWorldTypeId = respawnWorldTypeId;
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleRespawn(this);
+        packetHandler.handleRespawn(this);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         respawnDimensionId = dis.readByte();
@@ -35,7 +38,7 @@ public class Packet9Respawn extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(respawnDimensionId);
@@ -43,11 +46,8 @@ public class Packet9Respawn extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 2;
     }
-
-    public byte respawnDimensionId;
-    public byte respawnWorldTypeId;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/SetCarriedItemPacket.java b/src/main/java/net/minecraft/core/net/packet/SetCarriedItemPacket.java
new file mode 100644
index 000000000..a4bae91e8
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/SetCarriedItemPacket.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class SetCarriedItemPacket extends Packet
+{
+
+    public SetCarriedItemPacket()
+    {
+    }
+
+    public SetCarriedItemPacket(int i)
+    {
+        id = i;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        id = dis.readShort();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeShort(id);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleBlockItemSwitch(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 2;
+    }
+
+    public int id;
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/SetEntityDataPacket.java b/src/main/java/net/minecraft/core/net/packet/SetEntityDataPacket.java
new file mode 100644
index 000000000..29653a156
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/SetEntityDataPacket.java
@@ -0,0 +1,60 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.world.data.SynchedEntityData;
+
+import java.io.*;
+import java.util.List;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, DataWatcher, PacketHandler
+
+public class SetEntityDataPacket extends Packet
+{
+
+    public SetEntityDataPacket()
+    {
+    }
+    
+    public SetEntityDataPacket(int i, SynchedEntityData datawatcher)
+    {
+        entityId = i;
+        packedItems = datawatcher.packDirty();
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        entityId = dis.readInt();
+        packedItems = SynchedEntityData.unpack(dis);
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(entityId);
+        SynchedEntityData.pack(packedItems, dos);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleEntityMetadata(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 5;
+    }
+
+    public List<SynchedEntityData.DataItem<?>> getUnpackedData()
+    {
+        return packedItems;
+    }
+
+    public int entityId;
+    private List<SynchedEntityData.DataItem<?>> packedItems;
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet28EntityVelocity.java b/src/main/java/net/minecraft/core/net/packet/SetEntityMotionPacket.java
similarity index 71%
rename from src/main/java/net/minecraft/core/net/packet/Packet28EntityVelocity.java
rename to src/main/java/net/minecraft/core/net/packet/SetEntityMotionPacket.java
index 951c1b430..3daddafcf 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet28EntityVelocity.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetEntityMotionPacket.java
@@ -1,26 +1,26 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, Entity, NetHandler
+//            Packet, Entity, PacketHandler
 
-public class Packet28EntityVelocity extends Packet
+public class SetEntityMotionPacket extends Packet
 {
 
-    public Packet28EntityVelocity()
+    public SetEntityMotionPacket()
     {
     }
 
-    public Packet28EntityVelocity(Entity entity)
+    public SetEntityMotionPacket(Entity entity)
     {
         this(entity.id, entity.xd, entity.yd, entity.zd);
     }
 
-    public Packet28EntityVelocity(int i, double d, double d1, double d2)
+    public SetEntityMotionPacket(int i, double d, double d1, double d2)
     {
         entityId = i;
         double d3 = 3.8999999999999999D;
@@ -54,7 +54,7 @@ public class Packet28EntityVelocity extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityId = dis.readInt();
@@ -64,7 +64,7 @@ public class Packet28EntityVelocity extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityId);
@@ -74,13 +74,13 @@ public class Packet28EntityVelocity extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleEntityVelocity(this);
+        packetHandler.handleEntityVelocity(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 10;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet5PlayerInventory.java b/src/main/java/net/minecraft/core/net/packet/SetEquippedItemPacket.java
similarity index 62%
rename from src/main/java/net/minecraft/core/net/packet/Packet5PlayerInventory.java
rename to src/main/java/net/minecraft/core/net/packet/SetEquippedItemPacket.java
index 7846acc14..c04a9f500 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet5PlayerInventory.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetEquippedItemPacket.java
@@ -2,74 +2,74 @@ package net.minecraft.core.net.packet;
 
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet5PlayerInventory extends Packet
+public class SetEquippedItemPacket extends Packet
 {
+    public int entityID;
+    public int slot;
+    public int itemID;
+    public int itemMeta;
+    public CompoundTag itemData;
+
 
-    public Packet5PlayerInventory()
+    public SetEquippedItemPacket()
     {
     }
-    
-    public Packet5PlayerInventory(int entityID, int slot, ItemStack itemstack)
+
+    public SetEquippedItemPacket(int entityID, int slot, ItemStack itemstack)
     {
         this.entityID = entityID;
         this.slot = slot;
         if(itemstack == null)
         {
             itemID = -1;
-            itemDamage = 0;
+            itemMeta = 0;
             itemData = new CompoundTag();
         } else
         {
             itemID = itemstack.itemID;
-            itemDamage = itemstack.getMetadata();
+            itemMeta = itemstack.getMetadata();
             itemData = itemstack.getData();
         }
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         entityID = dis.readInt();
         slot = dis.readShort();
         itemID = dis.readShort();
-        itemDamage = dis.readShort();
+        itemMeta = dis.readShort();
         itemData = readCompressedCompoundTag(dis);
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(entityID);
         dos.writeShort(slot);
         dos.writeShort(itemID);
-        dos.writeShort(itemDamage);
+        dos.writeShort(itemMeta);
         writeCompressedCompoundTag(itemData, dos);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePlayerInventory(this);
+        packetHandler.handlePlayerInventory(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 8;
     }
-
-    public int entityID;
-    public int slot;
-    public int itemID;
-    public int itemDamage;
-    public CompoundTag itemData;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet8UpdateHealth.java b/src/main/java/net/minecraft/core/net/packet/SetHealthPacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet8UpdateHealth.java
rename to src/main/java/net/minecraft/core/net/packet/SetHealthPacket.java
index 2c771138b..06c6d2524 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet8UpdateHealth.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetHealthPacket.java
@@ -1,49 +1,49 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet8UpdateHealth extends Packet
+public class SetHealthPacket extends Packet
 {
+    public int healthMP;
+
 
-    public Packet8UpdateHealth()
+    public SetHealthPacket()
     {
     }
-    
-    public Packet8UpdateHealth(int i)
+
+    public SetHealthPacket(int i)
     {
         healthMP = i;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         healthMP = dis.readShort();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeShort(healthMP);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdateHealth(this);
+        packetHandler.handleUpdateHealth(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 2;
     }
-
-    public int healthMP;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/SetHotbarOffsetPacket.java b/src/main/java/net/minecraft/core/net/packet/SetHotbarOffsetPacket.java
new file mode 100644
index 000000000..e67e7ca9c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/SetHotbarOffsetPacket.java
@@ -0,0 +1,46 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class SetHotbarOffsetPacket extends Packet
+{
+    public int hotbarOffset;
+
+    public SetHotbarOffsetPacket(int hotbarOffset)
+    {
+        this.hotbarOffset = hotbarOffset;
+    }
+
+    public SetHotbarOffsetPacket()
+    {
+    }
+
+    @Override
+    public void read(DataInputStream dis) throws IOException
+    {
+        hotbarOffset = dis.readByte();
+    }
+
+    @Override
+    public void write(DataOutputStream dos) throws IOException
+    {
+        dos.writeByte(hotbarOffset);
+    }
+
+    @Override
+    public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleSetHotbarOffset(this);
+    }
+
+    @Override
+    public int getEstimatedSize() {
+        return 0;
+    }
+
+
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet137SetItemName.java b/src/main/java/net/minecraft/core/net/packet/SetItemNamePacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet137SetItemName.java
rename to src/main/java/net/minecraft/core/net/packet/SetItemNamePacket.java
index 3571295f7..b0b7a5870 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet137SetItemName.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetItemNamePacket.java
@@ -1,40 +1,40 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet137SetItemName extends Packet{
+public class SetItemNamePacket extends Packet{
     public int slot;
     public String name;
-    public Packet137SetItemName() { }
+    public SetItemNamePacket() { }
 
-    public Packet137SetItemName(int slot, String name)
+    public SetItemNamePacket(int slot, String name)
     {
         this.slot = slot;
         this.name = name;
     }
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException {
+    public void read(DataInputStream dis) throws IOException {
         this.slot = dis.readInt();
         this.name = dis.readUTF();
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException {
+    public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(slot);
         dos.writeUTF(name);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler) {
-        netHandler.handleItemName(this);
+    public void handlePacket(PacketHandler packetHandler) {
+        packetHandler.handleItemName(this);
     }
 
     @Override
-    public int getPacketSize() {
+    public int getEstimatedSize() {
         return 2;
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet132SetMobSpawner.java b/src/main/java/net/minecraft/core/net/packet/SetMobSpawnerPacket.java
similarity index 64%
rename from src/main/java/net/minecraft/core/net/packet/Packet132SetMobSpawner.java
rename to src/main/java/net/minecraft/core/net/packet/SetMobSpawnerPacket.java
index bef1bd3d3..6fd51377a 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet132SetMobSpawner.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetMobSpawnerPacket.java
@@ -1,22 +1,22 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet132SetMobSpawner extends Packet {
+public class SetMobSpawnerPacket extends Packet {
     public int xPosition;
     public int yPosition;
     public int zPosition;
     public String spawnType;
 
-    public Packet132SetMobSpawner() {
+    public SetMobSpawnerPacket() {
         isChunkDataPacket = true;
     }
 
-    public Packet132SetMobSpawner(int x, int y, int z, String spawnType) {
+    public SetMobSpawnerPacket(int x, int y, int z, String spawnType) {
         isChunkDataPacket = true;
         this.xPosition = x;
         this.yPosition = y;
@@ -26,7 +26,7 @@ public class Packet132SetMobSpawner extends Packet {
     }
 
     @Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
         xPosition = dis.readInt();
         yPosition = dis.readShort();
         zPosition = dis.readInt();
@@ -34,7 +34,7 @@ public class Packet132SetMobSpawner extends Packet {
     }
 
     @Override
-	public void writePacketData (DataOutputStream dos) throws IOException {
+	public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(xPosition);
         dos.writeShort(yPosition);
         dos.writeInt(zPosition);
@@ -42,12 +42,12 @@ public class Packet132SetMobSpawner extends Packet {
     }
 
     @Override
-	public void processPacket (NetHandler netHandler){
-        netHandler.handleSetMobSpawner(this);
+	public void handlePacket(PacketHandler packetHandler){
+        packetHandler.handleSetMobSpawner(this);
     }
 
     @Override
-	public int getPacketSize () {
+	public int getEstimatedSize() {
         return 12 + spawnType.length();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet139SetPaintingMotive.java b/src/main/java/net/minecraft/core/net/packet/SetPaintingArtPacket.java
similarity index 51%
rename from src/main/java/net/minecraft/core/net/packet/Packet139SetPaintingMotive.java
rename to src/main/java/net/minecraft/core/net/packet/SetPaintingArtPacket.java
index a046c1e61..90ac9ac75 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet139SetPaintingMotive.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetPaintingArtPacket.java
@@ -1,46 +1,46 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.enums.ArtType;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
-public class Packet139SetPaintingMotive
+public class SetPaintingArtPacket
     extends Packet
 {
     public int motive;
 
-    public Packet139SetPaintingMotive()
+    public SetPaintingArtPacket()
     {
     }
 
-    public Packet139SetPaintingMotive(ArtType art)
+    public SetPaintingArtPacket(ArtType art)
     {
         this.motive = ArtType.values.indexOf(art);
     }
 
     @Override
-    public void readPacketData(DataInputStream dis) throws IOException
+    public void read(DataInputStream dis) throws IOException
     {
         motive = dis.readInt();
     }
 
     @Override
-    public void writePacketData(DataOutputStream dos) throws IOException
+    public void write(DataOutputStream dos) throws IOException
     {
         dos.writeInt(motive);
     }
 
     @Override
-    public void processPacket(NetHandler netHandler)
+    public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleSetPaintingMotive(this);
+        packetHandler.handleSetPaintingMotive(this);
     }
 
     @Override
-    public int getPacketSize()
+    public int getEstimatedSize()
     {
         return 0;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet39AttachEntity.java b/src/main/java/net/minecraft/core/net/packet/SetRidingPacket.java
similarity index 71%
rename from src/main/java/net/minecraft/core/net/packet/Packet39AttachEntity.java
rename to src/main/java/net/minecraft/core/net/packet/SetRidingPacket.java
index 0711500c1..abca2c753 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet39AttachEntity.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetRidingPacket.java
@@ -1,28 +1,28 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet39AttachEntity extends Packet
+public class SetRidingPacket extends Packet
 {
 
-    public Packet39AttachEntity()
+    public SetRidingPacket()
     {
     }
     
-    public Packet39AttachEntity(Entity passenger, Entity vehicle)
+    public SetRidingPacket(Entity passenger, Entity vehicle)
     {
         passengerId = passenger.id;
         vehicleId = vehicle == null ? -1 : vehicle.id;
         isTileEntity = false;
     }
 
-    public Packet39AttachEntity(Entity passenger, int x, int y, int z)
+    public SetRidingPacket(Entity passenger, int x, int y, int z)
     {
         passengerId = passenger.id;
         this.x = x;
@@ -32,13 +32,13 @@ public class Packet39AttachEntity extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 8;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         passengerId = dis.readInt();
@@ -53,7 +53,7 @@ public class Packet39AttachEntity extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(passengerId);
@@ -68,9 +68,9 @@ public class Packet39AttachEntity extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleAttachEntity(this);
+        packetHandler.handleAttachEntity(this);
     }
 
     public int passengerId;
diff --git a/src/main/java/net/minecraft/core/net/packet/SetSpawnPositionPacket.java b/src/main/java/net/minecraft/core/net/packet/SetSpawnPositionPacket.java
new file mode 100644
index 000000000..1b2c175cb
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/SetSpawnPositionPacket.java
@@ -0,0 +1,57 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class SetSpawnPositionPacket extends Packet
+{
+    public int x;
+    public int y;
+    public int z;
+
+
+    public SetSpawnPositionPacket()
+    {
+    }
+
+    public SetSpawnPositionPacket(int x, int y, int z)
+    {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        x = dis.readInt();
+        y = dis.readInt();
+        z = dis.readInt();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(x);
+        dos.writeInt(y);
+        dos.writeInt(z);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleSpawnPosition(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 12;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet4UpdateTime.java b/src/main/java/net/minecraft/core/net/packet/SetTimePacket.java
similarity index 50%
rename from src/main/java/net/minecraft/core/net/packet/Packet4UpdateTime.java
rename to src/main/java/net/minecraft/core/net/packet/SetTimePacket.java
index dade2fa0b..99e04c377 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet4UpdateTime.java
+++ b/src/main/java/net/minecraft/core/net/packet/SetTimePacket.java
@@ -1,49 +1,49 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet4UpdateTime extends Packet
+public class SetTimePacket extends Packet
 {
+    public long time;
+
 
-    public Packet4UpdateTime()
+    public SetTimePacket()
     {
     }
-    
-    public Packet4UpdateTime(long l)
+
+    public SetTimePacket(long l)
     {
         time = l;
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         time = dis.readLong();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeLong(time);
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdateTime(this);
+        packetHandler.handleUpdateTime(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 8;
     }
-
-    public long time;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet130UpdateSign.java b/src/main/java/net/minecraft/core/net/packet/SignUpdatePacket.java
similarity index 74%
rename from src/main/java/net/minecraft/core/net/packet/Packet130UpdateSign.java
rename to src/main/java/net/minecraft/core/net/packet/SignUpdatePacket.java
index c598d60ae..c3c0fb1af 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet130UpdateSign.java
+++ b/src/main/java/net/minecraft/core/net/packet/SignUpdatePacket.java
@@ -1,21 +1,21 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet130UpdateSign extends Packet
+public class SignUpdatePacket extends Packet
 {
 
-    public Packet130UpdateSign()
+    public SignUpdatePacket()
     {
         isChunkDataPacket = true;
     }
 
-    public Packet130UpdateSign(int x, int y, int z, String[] lines, int picture, int color)
+    public SignUpdatePacket(int x, int y, int z, String[] lines, int picture, int color)
     {
         isChunkDataPacket = true;
         xPosition = x;
@@ -27,7 +27,7 @@ public class Packet130UpdateSign extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xPosition = dis.readInt();
@@ -43,7 +43,7 @@ public class Packet130UpdateSign extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xPosition);
@@ -58,13 +58,13 @@ public class Packet130UpdateSign extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdateSign(this);
+        packetHandler.handleUpdateSign(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         int i = 0;
         for(int j = 0; j < 4; j++)
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet17Sleep.java b/src/main/java/net/minecraft/core/net/packet/SleepPacket.java
similarity index 57%
rename from src/main/java/net/minecraft/core/net/packet/Packet17Sleep.java
rename to src/main/java/net/minecraft/core/net/packet/SleepPacket.java
index af0c1f3b5..cd5486f41 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet17Sleep.java
+++ b/src/main/java/net/minecraft/core/net/packet/SleepPacket.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
-public class Packet17Sleep extends Packet {
+public class SleepPacket extends Packet {
 
 	public int entityID;
 	public int x;
@@ -13,9 +13,9 @@ public class Packet17Sleep extends Packet {
 	public int z;
 	public int field_22046_e;
 
-	public Packet17Sleep() {}
+	public SleepPacket() {}
 
-	public Packet17Sleep(Entity entity, int i, int x, int y, int z) {
+	public SleepPacket(Entity entity, int i, int x, int y, int z) {
 		this.field_22046_e = i;
 		this.x = x;
 		this.y = y;
@@ -24,7 +24,7 @@ public class Packet17Sleep extends Packet {
 	}
 
 	@Override
-	public void readPacketData(DataInputStream dis) throws IOException {
+	public void read(DataInputStream dis) throws IOException {
 		entityID = dis.readInt();
 		field_22046_e = dis.readByte();
 		x = dis.readInt();
@@ -33,7 +33,7 @@ public class Packet17Sleep extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream dos) throws IOException {
+	public void write(DataOutputStream dos) throws IOException {
 		dos.writeInt(entityID);
 		dos.writeByte(field_22046_e);
 		dos.writeInt(x);
@@ -42,12 +42,12 @@ public class Packet17Sleep extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleSleep(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleSleep(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return 17;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/StatisticPacket.java b/src/main/java/net/minecraft/core/net/packet/StatisticPacket.java
new file mode 100644
index 000000000..aef0545f3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/StatisticPacket.java
@@ -0,0 +1,60 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.util.HardIllegalArgumentException;
+import net.minecraft.core.util.collection.NamespaceID;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, PacketHandler
+
+public class StatisticPacket extends Packet
+{
+    public NamespaceID statID;
+    public int valueChange;
+
+
+    public StatisticPacket()
+    {
+    }
+
+    public StatisticPacket(NamespaceID statID, int change)
+    {
+        this.statID = statID;
+        valueChange = change;
+    }
+
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleStatistic(this);
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        try {
+            statID = new NamespaceID(readString(dis, Integer.MAX_VALUE));
+        } catch (HardIllegalArgumentException e) {
+            statID = null;
+        }
+        valueChange = dis.readByte();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        writeString(statID.toString(), dos);
+        dos.writeByte(valueChange);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 6;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet201Ids.java b/src/main/java/net/minecraft/core/net/packet/SyncIDsPacket.java
similarity index 79%
rename from src/main/java/net/minecraft/core/net/packet/Packet201Ids.java
rename to src/main/java/net/minecraft/core/net/packet/SyncIDsPacket.java
index 88a3eb838..b5abb0235 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet201Ids.java
+++ b/src/main/java/net/minecraft/core/net/packet/SyncIDsPacket.java
@@ -7,16 +7,16 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.sound.SoundTypes;
 
-public class Packet201Ids extends Packet {
+public class SyncIDsPacket extends Packet {
 
 	public Map<String, Integer> soundIds;
 	private int packetSize;
 	
 	@Override
-	public void readPacketData(DataInputStream in) throws IOException {
+	public void read(DataInputStream in) throws IOException {
 		int size = 0;
 		
 		size += readSoundIds(in);
@@ -25,7 +25,7 @@ public class Packet201Ids extends Packet {
 	}
 
 	@Override
-	public void writePacketData(DataOutputStream out) throws IOException {
+	public void write(DataOutputStream out) throws IOException {
 		int size = 0;
 		
 		size += writeSoundIds(out);
@@ -67,12 +67,12 @@ public class Packet201Ids extends Packet {
 	}
 
 	@Override
-	public void processPacket(NetHandler netHandler) {
-		netHandler.handleIds(this);
+	public void handlePacket(PacketHandler packetHandler) {
+		packetHandler.handleIds(this);
 	}
 
 	@Override
-	public int getPacketSize() {
+	public int getEstimatedSize() {
 		return packetSize;
 	}
 
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet22Collect.java b/src/main/java/net/minecraft/core/net/packet/TakeItemEntityPacket.java
similarity index 59%
rename from src/main/java/net/minecraft/core/net/packet/Packet22Collect.java
rename to src/main/java/net/minecraft/core/net/packet/TakeItemEntityPacket.java
index 25cb1873c..66ad9f834 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet22Collect.java
+++ b/src/main/java/net/minecraft/core/net/packet/TakeItemEntityPacket.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet22Collect extends Packet
+public class TakeItemEntityPacket extends Packet
 {
 
-    public Packet22Collect()
+    public TakeItemEntityPacket()
     {
     }
     
-    public Packet22Collect(int i, int j)
+    public TakeItemEntityPacket(int i, int j)
     {
         collectedEntityId = i;
         collectorEntityId = j;
@@ -22,7 +22,7 @@ public class Packet22Collect extends Packet
 
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         collectedEntityId = dis.readInt();
@@ -30,7 +30,7 @@ public class Packet22Collect extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(collectedEntityId);
@@ -38,13 +38,13 @@ public class Packet22Collect extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleCollect(this);
+        packetHandler.handleCollect(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 8;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/TeleportEntityPacket.java b/src/main/java/net/minecraft/core/net/packet/TeleportEntityPacket.java
new file mode 100644
index 000000000..ae9f23aae
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/TeleportEntityPacket.java
@@ -0,0 +1,81 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.net.handler.PacketHandler;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, Entity, MathHelper, PacketHandler
+
+public class TeleportEntityPacket extends Packet
+{
+    public int id;
+    public int x;
+    public int y;
+    public int z;
+    public byte yaw;
+    public byte pitch;
+
+    public TeleportEntityPacket()
+    {
+    }
+
+    public TeleportEntityPacket(Entity entity)
+    {
+        id = entity.id;
+        x = MathHelper.floor(entity.x * 32D);
+        y = MathHelper.floor(entity.y * 32D);
+        z = MathHelper.floor(entity.z * 32D);
+        yaw = (byte)(int)((entity.yRot * 256F) / 360F);
+        pitch = (byte)(int)((entity.xRot * 256F) / 360F);
+    }
+    
+    public TeleportEntityPacket(int id, int x, int y, int z, byte yaw, byte pitch)
+    {
+        this.id = id;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        this.yaw = yaw;
+        this.pitch = pitch;
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        id = dis.readInt();
+        x = dis.readInt();
+        y = dis.readInt();
+        z = dis.readInt();
+        yaw = (byte) dis.read();
+        pitch = (byte) dis.read();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(id);
+        dos.writeInt(x);
+        dos.writeInt(y);
+        dos.writeInt(z);
+        dos.write(yaw);
+        dos.write(pitch);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleEntityTeleport(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 34;
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet107UpdateCreativeInventory.java b/src/main/java/net/minecraft/core/net/packet/UpdateCreativeInventoryPacket.java
similarity index 58%
rename from src/main/java/net/minecraft/core/net/packet/Packet107UpdateCreativeInventory.java
rename to src/main/java/net/minecraft/core/net/packet/UpdateCreativeInventoryPacket.java
index 3a4d06e7d..72332b072 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet107UpdateCreativeInventory.java
+++ b/src/main/java/net/minecraft/core/net/packet/UpdateCreativeInventoryPacket.java
@@ -1,20 +1,20 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet107UpdateCreativeInventory extends Packet
+public class UpdateCreativeInventoryPacket extends Packet
 {
 
-    public Packet107UpdateCreativeInventory()
+    public UpdateCreativeInventoryPacket()
     {
     }
 
-    public Packet107UpdateCreativeInventory(int windowId, int page, String searchText)
+    public UpdateCreativeInventoryPacket(int windowId, int page, String searchText)
     {
         this.windowId = windowId;
         this.page = page;
@@ -22,13 +22,13 @@ public class Packet107UpdateCreativeInventory extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdateCreativeInventory(this);
+        packetHandler.handleUpdateCreativeInventory(this);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         windowId = dis.readByte();
@@ -37,7 +37,7 @@ public class Packet107UpdateCreativeInventory extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeByte(windowId);
@@ -46,7 +46,7 @@ public class Packet107UpdateCreativeInventory extends Packet
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 4 + 4 + searchText.length() * 2;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet72UpdatePlayerProfile.java b/src/main/java/net/minecraft/core/net/packet/UpdatePlayerProfilePacket.java
similarity index 70%
rename from src/main/java/net/minecraft/core/net/packet/Packet72UpdatePlayerProfile.java
rename to src/main/java/net/minecraft/core/net/packet/UpdatePlayerProfilePacket.java
index af4ab47ac..6d50b13b8 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet72UpdatePlayerProfile.java
+++ b/src/main/java/net/minecraft/core/net/packet/UpdatePlayerProfilePacket.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.server.util.helper.PlayerList;
 
 import java.io.DataInputStream;
@@ -8,16 +8,16 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
+//            Packet, PacketHandler
 
-public class Packet72UpdatePlayerProfile extends Packet
+public class UpdatePlayerProfilePacket extends Packet
 {
 
-    public Packet72UpdatePlayerProfile()
+    public UpdatePlayerProfilePacket()
     {
     }
 
-    public Packet72UpdatePlayerProfile(String username, String nickname, int score, byte chatColor, boolean isOnline, boolean isOperator)
+    public UpdatePlayerProfilePacket(String username, String nickname, int score, byte chatColor, boolean isOnline, boolean isOperator)
     {
         this.username = username;
         this.nickname = nickname;
@@ -29,7 +29,7 @@ public class Packet72UpdatePlayerProfile extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
             throws IOException
     {
         username = readString(dis, 16);
@@ -41,7 +41,7 @@ public class Packet72UpdatePlayerProfile extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
             throws IOException
     {
         writeString(username, dos);
@@ -53,13 +53,13 @@ public class Packet72UpdatePlayerProfile extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleUpdatePlayerProfile(this);
+        packetHandler.handleUpdatePlayerProfile(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 6 + 4 + this.username.length() + 4;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet15Place.java b/src/main/java/net/minecraft/core/net/packet/UseItemPacket.java
similarity index 81%
rename from src/main/java/net/minecraft/core/net/packet/Packet15Place.java
rename to src/main/java/net/minecraft/core/net/packet/UseItemPacket.java
index 9a9c35e9e..1747885cd 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet15Place.java
+++ b/src/main/java/net/minecraft/core/net/packet/UseItemPacket.java
@@ -5,20 +5,20 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.Direction;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, ItemStack, NetHandler
+//            Packet, ItemStack, PacketHandler
 
-public class Packet15Place extends Packet
+public class UseItemPacket extends Packet
 {
 
-    public Packet15Place()
+    public UseItemPacket()
     {
     }
 
-    public Packet15Place(int i, int j, int k, Direction direction, ItemStack itemstack, double xPlaced, double yPlaced)
+    public UseItemPacket(int i, int j, int k, Direction direction, ItemStack itemstack, double xPlaced, double yPlaced)
     {
         xPosition = i;
         yPosition = j;
@@ -30,7 +30,7 @@ public class Packet15Place extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
         xPosition = dis.readInt();
@@ -52,7 +52,7 @@ public class Packet15Place extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
         dos.writeInt(xPosition);
@@ -73,13 +73,13 @@ public class Packet15Place extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handlePlace(this);
+        packetHandler.handlePlace(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 19;
     }
diff --git a/src/main/java/net/minecraft/core/net/packet/WeatherEffectPacket.java b/src/main/java/net/minecraft/core/net/packet/WeatherEffectPacket.java
new file mode 100644
index 000000000..86e7a71d2
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/packet/WeatherEffectPacket.java
@@ -0,0 +1,73 @@
+package net.minecraft.core.net.packet;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.util.helper.MathHelper;
+
+import java.io.*;
+
+// Referenced classes of package net.minecraft.src:
+//            Packet, Entity, MathHelper, LightningEntity,
+//            PacketHandler
+
+public class WeatherEffectPacket extends Packet
+{
+    public static final int EFFECT_LIGHTNING = 1;
+    public int id;
+    public int x;
+    public int y;
+    public int z;
+    public int effectId;
+    public WeatherEffectPacket()
+    {
+    }
+
+    public WeatherEffectPacket(Entity entity)
+    {
+        id = entity.id;
+        x = MathHelper.floor(entity.x * 32D);
+        y = MathHelper.floor(entity.y * 32D);
+        z = MathHelper.floor(entity.z * 32D);
+        if(entity instanceof LightningEntity)
+        {
+            effectId = EFFECT_LIGHTNING;
+        }
+    }
+
+    @Override
+	public void read(DataInputStream dis)
+        throws IOException
+    {
+        id = dis.readInt();
+        effectId = dis.readByte();
+        x = dis.readInt();
+        y = dis.readInt();
+        z = dis.readInt();
+    }
+
+    @Override
+	public void write(DataOutputStream dos)
+        throws IOException
+    {
+        dos.writeInt(id);
+        dos.writeByte(effectId);
+        dos.writeInt(x);
+        dos.writeInt(y);
+        dos.writeInt(z);
+    }
+
+    @Override
+	public void handlePacket(PacketHandler packetHandler)
+    {
+        packetHandler.handleWeather(this);
+    }
+
+    @Override
+	public int getEstimatedSize()
+    {
+        return 17;
+    }
+
+
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet73WeatherStatus.java b/src/main/java/net/minecraft/core/net/packet/WeatherStatusPacket.java
similarity index 64%
rename from src/main/java/net/minecraft/core/net/packet/Packet73WeatherStatus.java
rename to src/main/java/net/minecraft/core/net/packet/WeatherStatusPacket.java
index b72aedbcf..13b74cafd 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet73WeatherStatus.java
+++ b/src/main/java/net/minecraft/core/net/packet/WeatherStatusPacket.java
@@ -1,21 +1,27 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.*;
 
 // Referenced classes of package net.minecraft.src:
-//            Packet, Entity, MathHelper, EntityLightningBolt, 
-//            NetHandler
+//            Packet, Entity, MathHelper, LightningEntity,
+//            PacketHandler
 
-public class Packet73WeatherStatus extends Packet
+public class WeatherStatusPacket extends Packet
 {
+    public int dimId;
+    public int id;
+    public int newId;
+    public long duration;
+    public float intensity;
+    public float power;
 
-    public Packet73WeatherStatus()
+    public WeatherStatusPacket()
     {
     }
 
-    public Packet73WeatherStatus(int dimId, int id, int newId, long duration, float intensity, float power)
+    public WeatherStatusPacket(int dimId, int id, int newId, long duration, float intensity, float power)
     {
     	this.dimId = dimId;
         this.id = id;
@@ -26,7 +32,7 @@ public class Packet73WeatherStatus extends Packet
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
+	public void read(DataInputStream dis)
         throws IOException
     {
     	dimId = dis.readInt();
@@ -38,7 +44,7 @@ public class Packet73WeatherStatus extends Packet
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
+	public void write(DataOutputStream dos)
         throws IOException
     {
     	dos.writeInt(dimId);
@@ -50,21 +56,14 @@ public class Packet73WeatherStatus extends Packet
     }
 
     @Override
-	public void processPacket(NetHandler netHandler)
+	public void handlePacket(PacketHandler packetHandler)
     {
-        netHandler.handleWeatherStatus(this);
+        packetHandler.handleWeatherStatus(this);
     }
 
     @Override
-	public int getPacketSize()
+	public int getEstimatedSize()
     {
         return 28;
     }
-
-    public int dimId;
-    public int id;
-    public int newId;
-    public long duration;
-    public float intensity;
-    public float power;
 }
diff --git a/src/main/java/net/minecraft/core/player/Session.java b/src/main/java/net/minecraft/core/player/Session.java
index c901c2176..faca8af03 100644
--- a/src/main/java/net/minecraft/core/player/Session.java
+++ b/src/main/java/net/minecraft/core/player/Session.java
@@ -1,53 +1,15 @@
 package net.minecraft.core.player;
 
-import net.minecraft.core.block.Block;
-
-import java.util.ArrayList;
-import java.util.List;
-
 public class Session
 {
 
+    public String username;
+    public String sessionId;
     public Session(String username, String sessionId)
     {
         this.username = username;
         this.sessionId = sessionId;
     }
 
-    public static List<Block> registeredBlocksList;
-    public String username;
-    public String sessionId;
-
-    static
-    {
-        registeredBlocksList = new ArrayList<>();
-        registeredBlocksList.add(Block.stone);
-        registeredBlocksList.add(Block.cobbleStone);
-        registeredBlocksList.add(Block.brickClay);
-        registeredBlocksList.add(Block.dirt);
-        registeredBlocksList.add(Block.planksOak);
-        registeredBlocksList.add(Block.logOak);
-        registeredBlocksList.add(Block.leavesOak);
-        registeredBlocksList.add(Block.torchCoal);
-        registeredBlocksList.add(Block.glass);
-        registeredBlocksList.add(Block.cobbleStoneMossy);
-        registeredBlocksList.add(Block.saplingOak);
-        registeredBlocksList.add(Block.flowerYellow);
-        registeredBlocksList.add(Block.flowerRed);
-        registeredBlocksList.add(Block.mushroomBrown);
-        registeredBlocksList.add(Block.mushroomRed);
-        registeredBlocksList.add(Block.sand);
-        registeredBlocksList.add(Block.gravel);
-        registeredBlocksList.add(Block.spongeDry);
-        registeredBlocksList.add(Block.wool);
-        registeredBlocksList.add(Block.oreCoalStone);
-        registeredBlocksList.add(Block.oreIronStone);
-        registeredBlocksList.add(Block.oreGoldStone);
-        registeredBlocksList.add(Block.blockIron);
-        registeredBlocksList.add(Block.blockGold);
-        registeredBlocksList.add(Block.bookshelfPlanksOak);
-        registeredBlocksList.add(Block.tnt);
-        registeredBlocksList.add(Block.obsidian);
-    }
 
 }
diff --git a/src/main/java/net/minecraft/core/player/gamemode/Gamemode.java b/src/main/java/net/minecraft/core/player/gamemode/Gamemode.java
index 5de567958..df96fb598 100644
--- a/src/main/java/net/minecraft/core/player/gamemode/Gamemode.java
+++ b/src/main/java/net/minecraft/core/player/gamemode/Gamemode.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.player.gamemode;
 
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -184,7 +184,7 @@ public abstract class Gamemode
 		return this;
 	}
 
-	public abstract ContainerPlayer getContainer(InventoryPlayer inventory, boolean isNotClientSide);
+	public abstract InventoryMenu getContainer(Inventory inventory, boolean isNotClientSide);
 
 	public static final Gamemode[] gamemodesList = new Gamemode[5];
 	public static List<Gamemode> getPublicGamemodes(){
diff --git a/src/main/java/net/minecraft/core/player/gamemode/GamemodeCreative.java b/src/main/java/net/minecraft/core/player/gamemode/GamemodeCreative.java
index 6fd0fedf8..60a319647 100644
--- a/src/main/java/net/minecraft/core/player/gamemode/GamemodeCreative.java
+++ b/src/main/java/net/minecraft/core/player/gamemode/GamemodeCreative.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.player.gamemode;
 
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.ContainerPlayerCreative;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.menu.CreativeInventoryMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 
 public class GamemodeCreative extends Gamemode
 {
@@ -13,8 +13,8 @@ public class GamemodeCreative extends Gamemode
 	}
 
 	@Override
-	public ContainerPlayer getContainer(InventoryPlayer inventory, boolean isNotClientSide)
+	public InventoryMenu getContainer(Inventory inventory, boolean isNotClientSide)
 	{
-		return new ContainerPlayerCreative(inventory, isNotClientSide);
+		return new CreativeInventoryMenu(inventory, isNotClientSide);
 	}
 }
diff --git a/src/main/java/net/minecraft/core/player/gamemode/GamemodeSurvival.java b/src/main/java/net/minecraft/core/player/gamemode/GamemodeSurvival.java
index 5661f2944..905892c68 100644
--- a/src/main/java/net/minecraft/core/player/gamemode/GamemodeSurvival.java
+++ b/src/main/java/net/minecraft/core/player/gamemode/GamemodeSurvival.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.player.gamemode;
 
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 
 public class GamemodeSurvival extends Gamemode
 {
@@ -12,8 +12,8 @@ public class GamemodeSurvival extends Gamemode
 	}
 
 	@Override
-	public ContainerPlayer getContainer(InventoryPlayer inventory, boolean isNotClientSide)
+	public InventoryMenu getContainer(Inventory inventory, boolean isNotClientSide)
 	{
-		return new ContainerPlayer(inventory, isNotClientSide);
+		return new InventoryMenu(inventory, isNotClientSide);
 	}
 }
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerFurnace.java b/src/main/java/net/minecraft/core/player/inventory/ContainerFurnace.java
deleted file mode 100644
index 459be8d8e..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerFurnace.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import java.util.List;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.entity.TileEntityFurnace;
-import net.minecraft.core.crafting.ICrafting;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotFurnace;
-
-public class ContainerFurnace extends Container {
-
-	public TileEntityFurnace tileEntity;
-	private int currentCookTime;
-	private int currentBurnTime;
-	private int itemBurnTime;
-	private int itemCookTime;
-
-	public ContainerFurnace(InventoryPlayer inventoryplayer, TileEntityFurnace tileentityfurnace) {
-		currentCookTime = 0;
-		currentBurnTime = 0;
-		itemCookTime = 0;
-		itemBurnTime = 0;
-		tileEntity = tileentityfurnace;
-		addSlot(new Slot(tileentityfurnace, 0, 56, 17));
-		addSlot(new Slot(tileentityfurnace, 1, 56, 53));
-		addSlot(new SlotFurnace(inventoryplayer.player, tileentityfurnace, 2, 116, 35));
-		for (int i = 0; i < 3; i++) {
-			for (int k = 0; k < 9; k++) {
-				addSlot(new Slot(inventoryplayer, k + i * 9 + 9, 8 + k * 18, 84 + i * 18));
-			}
-
-		}
-
-		for (int j = 0; j < 9; j++) {
-			addSlot(new Slot(inventoryplayer, j, 8 + j * 18, 142));
-		}
-
-	}
-
-	@Override
-	public void updateInventory() {
-		super.updateInventory();
-		for (Object crafter : crafters) {
-			ICrafting icrafting = (ICrafting) crafter;
-			if(currentCookTime != tileEntity.currentCookTime) {
-				icrafting.updateCraftingInventoryInfo(this, 0, tileEntity.currentCookTime);
-			}
-			if(currentBurnTime != tileEntity.currentBurnTime) {
-				icrafting.updateCraftingInventoryInfo(this, 1, tileEntity.currentBurnTime);
-			}
-			if(itemCookTime != tileEntity.maxCookTime) {
-				icrafting.updateCraftingInventoryInfo(this, 2, tileEntity.maxCookTime);
-			}
-			if(itemBurnTime != tileEntity.maxBurnTime) {
-				icrafting.updateCraftingInventoryInfo(this, 3, tileEntity.maxBurnTime);
-			}
-		}
-
-		this.currentCookTime = tileEntity.currentCookTime;
-		this.currentBurnTime = tileEntity.currentBurnTime;
-		itemCookTime = tileEntity.maxCookTime;
-		itemBurnTime = tileEntity.maxBurnTime;
-	}
-
-	@Override
-	public void updateClientProgressBar(int id, int value) {
-		if(id == 0) {
-			tileEntity.currentCookTime = value;
-		}
-		if(id == 1) {
-			tileEntity.currentBurnTime = value;
-		}
-		if(id == 2) {
-			tileEntity.maxCookTime = value;
-		}
-		if(id == 3) {
-			tileEntity.maxBurnTime = value;
-		}
-	}
-
-	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
-		return tileEntity.canInteractWith(entityplayer);
-	}
-
-	/**
-	 *  0 Input
-	 *  1 Fuel
-	 *  2 Output
-	 *  3 - 29 Main Inventory (27x)
-	 * 30 - 38 Hotbar (9x)
-	 */
-
-	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 0 && slot.id <= 3) return getSlots(slot.id, 1, false);
-
-		if(action == InventoryAction.MOVE_ALL) {
-			if(slot.id >= 3 && slot.id <= 30) {
-				// Main Inventory
-				return getSlots(3, 27, false);
-			}
-			if(slot.id >= 30 && slot.id <= 38) {
-				// Hotbar
-				return getSlots(30, 9, false);
-			}
-		}
-		if(slot.id >= 3 && slot.id <= 38) {
-			// Full Inventory
-			return getSlots(3, 36, false);
-		}
-		return null;
-	}
-
-	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 3 && slot.id <= 39) {
-			// Full Inventory
-			if(action != InventoryAction.MOVE_ALL) {
-				if(target == 1) {
-					return getSlots(0, 1, false); // Into Ingredient Slot
-				}
-				if(target == 2) {
-					return getSlots(1, 1, false); // Into Fuel Slot
-				}
-			}
-			if(slot.id >= 3 && slot.id <= 29) {
-				// Main Inventory
-				return getSlots(30, 9, false); // Into Hotbar
-			}
-			if(slot.id >= 31 && slot.id <= 38) {
-				// Hotbar
-				return getSlots(3, 27, false); // Into Main Inventory
-			}
-		}
-		if(slot.id >= 0 && slot.id <= 2) {
-			if(slot.id == 2) {
-				// Output
-				return getSlots(3, 36, true);
-			}else {
-				// Input and Fuel
-				return getSlots(3, 36, false);
-			}
-		}
-
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java b/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java
deleted file mode 100644
index cb16461da..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerGuidebook.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.achievement.stat.StatsCounter;
-import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotGuidebook;
-
-import java.util.List;
-
-public class ContainerGuidebook extends Container
-{
-
-	@Override
-	public boolean isUsableByPlayer(final EntityPlayer entityplayer)
-	{
-		return true;
-	}
-
-	@Override
-	public ItemStack clickInventorySlot(InventoryAction action, int[] args, EntityPlayer player) {
-		return null;
-	}
-
-	@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/IInvBasic.java b/src/main/java/net/minecraft/core/player/inventory/IInvBasic.java
deleted file mode 100644
index f1788b42b..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/IInvBasic.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-
-// Referenced classes of package net.minecraft.src:
-//            InventoryBasic
-
-import net.minecraft.core.player.inventory.InventoryBasic;
-
-public interface IInvBasic
-{
-
-    public abstract void func_20134_a(InventoryBasic inventorybasic);
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/IInventory.java b/src/main/java/net/minecraft/core/player/inventory/IInventory.java
deleted file mode 100644
index b12c7e5f0..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/IInventory.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ItemStack, EntityPlayer
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-public interface IInventory
-{
-
-    int getSizeInventory();
-
-    ItemStack getStackInSlot(int i);
-
-    ItemStack decrStackSize(int i, int j);
-
-    void setInventorySlotContents(int i, ItemStack itemstack);
-
-    String getInvName();
-
-    int getInventoryStackLimit();
-
-    void onInventoryChanged();
-
-    boolean canInteractWith(EntityPlayer entityplayer);
-
-    void sortInventory();
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryBasic.java b/src/main/java/net/minecraft/core/player/inventory/InventoryBasic.java
deleted file mode 100644
index dccef1208..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryBasic.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            IInventory, ItemStack, IInvBasic, EntityPlayer
-
-public class InventoryBasic
-    implements IInventory
-{
-
-    public InventoryBasic(String s, int i)
-    {
-        inventoryTitle = s;
-        slotsCount = i;
-        inventoryContents = new ItemStack[i];
-    }
-
-    @Override
-	public ItemStack getStackInSlot(int i)
-    {
-        return inventoryContents[i];
-    }
-
-    @Override
-	public ItemStack decrStackSize(int i, int j)
-    {
-        if(inventoryContents[i] != null)
-        {
-            if(inventoryContents[i].stackSize <= j)
-            {
-                ItemStack itemstack = inventoryContents[i];
-                inventoryContents[i] = null;
-                onInventoryChanged();
-                return itemstack;
-            }
-            ItemStack itemstack1 = inventoryContents[i].splitStack(j);
-            if(inventoryContents[i].stackSize <= 0)
-            {
-                inventoryContents[i] = null;
-            }
-            onInventoryChanged();
-            return itemstack1;
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
-    {
-        inventoryContents[i] = itemstack;
-        if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
-        {
-            itemstack.stackSize = getInventoryStackLimit();
-        }
-        onInventoryChanged();
-    }
-
-    @Override
-	public int getSizeInventory()
-    {
-        return slotsCount;
-    }
-
-    @Override
-	public String getInvName()
-    {
-        return inventoryTitle;
-    }
-
-    @Override
-	public int getInventoryStackLimit()
-    {
-        return 64;
-    }
-
-    @Override
-	public void onInventoryChanged()
-    {
-        if(field_20073_d != null)
-        {
-            for(int i = 0; i < field_20073_d.size(); i++)
-            {
-                ((IInvBasic)field_20073_d.get(i)).func_20134_a(this);
-            }
-
-        }
-    }
-
-    @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
-    {
-        return true;
-    }
-
-    @Override
-    public void sortInventory() {
-        InventorySorter.sortInventory(inventoryContents);
-    }
-
-    private String inventoryTitle;
-    private int slotsCount;
-    private ItemStack inventoryContents[];
-    private List field_20073_d;
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryCraftResult.java b/src/main/java/net/minecraft/core/player/inventory/InventoryCraftResult.java
deleted file mode 100644
index 064c8b9be..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryCraftResult.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-
-// Referenced classes of package net.minecraft.src:
-//            IInventory, ItemStack, EntityPlayer
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-public class InventoryCraftResult
-    implements IInventory
-{
-
-    public InventoryCraftResult()
-    {
-        stackResult = new ItemStack[1];
-    }
-
-    @Override
-	public int getSizeInventory()
-    {
-        return 1;
-    }
-
-    @Override
-	public ItemStack getStackInSlot(int i)
-    {
-        return stackResult[i];
-    }
-
-    @Override
-	public String getInvName()
-    {
-        return "Result";
-    }
-
-    @Override
-	public ItemStack decrStackSize(int i, int j)
-    {
-        if(stackResult[i] != null)
-        {
-            ItemStack itemstack = stackResult[i];
-            stackResult[i] = null;
-            return itemstack;
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
-    {
-        stackResult[i] = itemstack;
-    }
-
-
-    @Override
-	public int getInventoryStackLimit()
-    {
-        return 64;
-    }
-
-    @Override
-	public void onInventoryChanged()
-    {
-    }
-
-    @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
-    {
-        return true;
-    }
-
-    @Override
-    public void sortInventory() {
-        // Do nothing
-    }
-
-    private ItemStack stackResult[];
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryCrafting.java b/src/main/java/net/minecraft/core/player/inventory/InventoryCrafting.java
deleted file mode 100644
index 341bc9001..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryCrafting.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-
-// Referenced classes of package net.minecraft.src:
-//            IInventory, ItemStack, Container, EntityPlayer
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-public class InventoryCrafting
-    implements IInventory
-{
-
-    public InventoryCrafting(Container container, int i, int j)
-    {
-        int k = i * j;
-        stackList = new ItemStack[k];
-        eventHandler = container;
-        field_21104_b = i;
-    }
-
-    @Override
-	public int getSizeInventory()
-    {
-        return stackList.length;
-    }
-
-    @Override
-	public ItemStack getStackInSlot(int i)
-    {
-        if(i >= getSizeInventory())
-        {
-            return null;
-        } else
-        {
-            return stackList[i];
-        }
-    }
-
-    public ItemStack getItemStackAt(int i, int j)
-    {
-        if(i < 0 || i >= field_21104_b)
-        {
-            return null;
-        } else
-        {
-            int k = i + j * field_21104_b;
-            return getStackInSlot(k);
-        }
-    }
-
-    public void setSlotContentsAt(int i, int j, ItemStack itemStack)
-    {
-        if(i < 0 || i >= field_21104_b)
-        {
-            return;
-        } else
-        {
-            int k = i + j * field_21104_b;
-            setInventorySlotContents(k, itemStack);
-        }
-    }
-
-    @Override
-	public String getInvName()
-    {
-        return "Crafting";
-    }
-
-    @Override
-	public ItemStack decrStackSize(int i, int j)
-    {
-        if(stackList[i] != null)
-        {
-            if(stackList[i].stackSize <= j)
-            {
-                ItemStack itemstack = stackList[i];
-                stackList[i] = null;
-                eventHandler.onCraftMatrixChanged(this);
-                return itemstack;
-            }
-            ItemStack itemstack1 = stackList[i].splitStack(j);
-            if(stackList[i].stackSize <= 0)
-            {
-                stackList[i] = null;
-            }
-            eventHandler.onCraftMatrixChanged(this);
-            return itemstack1;
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
-    {
-        stackList[i] = itemstack;
-        eventHandler.onCraftMatrixChanged(this);
-    }
-
-    @Override
-	public int getInventoryStackLimit()
-    {
-        return 64;
-    }
-
-    @Override
-	public void onInventoryChanged()
-    {
-        eventHandler.onCraftMatrixChanged(this);
-    }
-
-    @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
-    {
-        return true;
-    }
-
-    @Override
-    public void sortInventory() {
-        // Do nothing
-    }
-
-    private ItemStack stackList[];
-    private int field_21104_b;
-    private Container eventHandler;
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryLargeChest.java b/src/main/java/net/minecraft/core/player/inventory/InventoryLargeChest.java
deleted file mode 100644
index 0e30de23a..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryLargeChest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package net.minecraft.core.player.inventory;
-
-
-// Referenced classes of package net.minecraft.src:
-//            IInventory, ItemStack, EntityPlayer
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-
-public class InventoryLargeChest
-    implements IInventory
-{
-
-    public InventoryLargeChest(String s, IInventory iinventory, IInventory iinventory1)
-    {
-        name = s;
-        upperChest = iinventory;
-        lowerChest = iinventory1;
-    }
-
-    @Override
-	public int getSizeInventory()
-    {
-        return upperChest.getSizeInventory() + lowerChest.getSizeInventory();
-    }
-
-    @Override
-	public String getInvName()
-    {
-        return name;
-    }
-
-    @Override
-	public ItemStack getStackInSlot(int i)
-    {
-        if(i >= upperChest.getSizeInventory())
-        {
-            return lowerChest.getStackInSlot(i - upperChest.getSizeInventory());
-        } else
-        {
-            return upperChest.getStackInSlot(i);
-        }
-    }
-
-    @Override
-	public ItemStack decrStackSize(int i, int j)
-    {
-        if(i >= upperChest.getSizeInventory())
-        {
-            return lowerChest.decrStackSize(i - upperChest.getSizeInventory(), j);
-        } else
-        {
-            return upperChest.decrStackSize(i, j);
-        }
-    }
-
-    @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
-    {
-        if(i >= upperChest.getSizeInventory())
-        {
-            lowerChest.setInventorySlotContents(i - upperChest.getSizeInventory(), itemstack);
-        } else
-        {
-            upperChest.setInventorySlotContents(i, itemstack);
-        }
-    }
-
-    @Override
-	public int getInventoryStackLimit()
-    {
-        return upperChest.getInventoryStackLimit();
-    }
-
-    @Override
-	public void onInventoryChanged()
-    {
-        upperChest.onInventoryChanged();
-        lowerChest.onInventoryChanged();
-    }
-
-    @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
-    {
-        return upperChest.canInteractWith(entityplayer) && lowerChest.canInteractWith(entityplayer);
-    }
-
-    @Override
-    public void sortInventory() {
-        ItemStack[] itemStacks = new ItemStack[getSizeInventory()];
-        for (int i = 0; i < itemStacks.length; i++) {
-            itemStacks[i] = getStackInSlot(i);
-        }
-        InventorySorter.sortInventory(itemStacks);
-        for (int i = 0; i < itemStacks.length; i++) {
-            setInventorySlotContents(i, itemStacks[i]);
-        }
-    }
-
-    private String name;
-    private IInventory upperChest;
-    private IInventory lowerChest;
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/container/CompoundContainer.java b/src/main/java/net/minecraft/core/player/inventory/container/CompoundContainer.java
new file mode 100644
index 000000000..a70b6ad7a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/container/CompoundContainer.java
@@ -0,0 +1,103 @@
+package net.minecraft.core.player.inventory.container;
+
+
+// Referenced classes of package net.minecraft.src:
+//            IInventory, ItemStack, Player
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.InventorySorter;
+
+public class CompoundContainer
+    implements Container
+{
+    private String name;
+    private Container c1;
+    private Container c2;
+
+    public CompoundContainer(String s, Container c1, Container c2)
+    {
+        name = s;
+        this.c1 = c1;
+        this.c2 = c2;
+    }
+
+    @Override
+	public int getContainerSize()
+    {
+        return c1.getContainerSize() + c2.getContainerSize();
+    }
+
+    @Override
+	public String getName()
+    {
+        return name;
+    }
+
+    @Override
+	public ItemStack getItem(int index)
+    {
+        if(index >= c1.getContainerSize())
+        {
+            return c2.getItem(index - c1.getContainerSize());
+        } else
+        {
+            return c1.getItem(index);
+        }
+    }
+
+    @Override
+	public ItemStack removeItem(int index, int takeAmount)
+    {
+        if(index >= c1.getContainerSize())
+        {
+            return c2.removeItem(index - c1.getContainerSize(), takeAmount);
+        } else
+        {
+            return c1.removeItem(index, takeAmount);
+        }
+    }
+
+    @Override
+	public void setItem(int index, ItemStack itemstack)
+    {
+        if(index >= c1.getContainerSize())
+        {
+            c2.setItem(index - c1.getContainerSize(), itemstack);
+        } else
+        {
+            c1.setItem(index, itemstack);
+        }
+    }
+
+    @Override
+	public int getMaxStackSize()
+    {
+        return c1.getMaxStackSize();
+    }
+
+    @Override
+	public void setChanged()
+    {
+        c1.setChanged();
+        c2.setChanged();
+    }
+
+    @Override
+	public boolean stillValid(Player entityplayer)
+    {
+        return c1.stillValid(entityplayer) && c2.stillValid(entityplayer);
+    }
+
+    @Override
+    public void sortContainer() {
+        ItemStack[] itemStacks = new ItemStack[getContainerSize()];
+        for (int i = 0; i < itemStacks.length; i++) {
+            itemStacks[i] = getItem(i);
+        }
+        InventorySorter.sortInventory(itemStacks);
+        for (int i = 0; i < itemStacks.length; i++) {
+            setItem(i, itemStacks[i]);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/container/Container.java b/src/main/java/net/minecraft/core/player/inventory/container/Container.java
new file mode 100644
index 000000000..e88398b1a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/container/Container.java
@@ -0,0 +1,30 @@
+package net.minecraft.core.player.inventory.container;
+
+
+// Referenced classes of package net.minecraft.src:
+//            ItemStack, Player
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+
+public interface Container
+{
+
+    int getContainerSize();
+
+    ItemStack getItem(int index);
+
+    ItemStack removeItem(int index, int takeAmount);
+
+    void setItem(int index, ItemStack itemstack);
+
+    String getName();
+
+    int getMaxStackSize();
+
+    void setChanged();
+
+    boolean stillValid(Player entityplayer);
+
+    void sortContainer();
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/container/CraftingContainer.java b/src/main/java/net/minecraft/core/player/inventory/container/CraftingContainer.java
new file mode 100644
index 000000000..be1d4a537
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/container/CraftingContainer.java
@@ -0,0 +1,128 @@
+package net.minecraft.core.player.inventory.container;
+
+
+// Referenced classes of package net.minecraft.src:
+//            IInventory, ItemStack, Container, Player
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.menu.AbstractContainerMenu;
+
+public class CraftingContainer
+    implements Container
+{
+    private ItemStack[] items;
+    private int width;
+    private AbstractContainerMenu menu;
+
+    public CraftingContainer(AbstractContainerMenu container, int width, int n)
+    {
+        int k = width * n;
+        items = new ItemStack[k];
+        menu = container;
+        this.width = width;
+    }
+
+    @Override
+	public int getContainerSize()
+    {
+        return items.length;
+    }
+
+    @Override
+	public ItemStack getItem(int index)
+    {
+        if(index >= getContainerSize())
+        {
+            return null;
+        } else
+        {
+            return items[index];
+        }
+    }
+
+    public ItemStack getItemStackAt(int i, int j)
+    {
+        if(i < 0 || i >= width)
+        {
+            return null;
+        } else
+        {
+            int k = i + j * width;
+            return getItem(k);
+        }
+    }
+
+    public void setSlotContentsAt(int i, int j, ItemStack itemStack)
+    {
+        if(i < 0 || i >= width)
+        {
+            return;
+        } else
+        {
+            int k = i + j * width;
+            setItem(k, itemStack);
+        }
+    }
+
+    @Override
+	public String getName()
+    {
+        return "Crafting";
+    }
+
+    @Override
+	public ItemStack removeItem(int index, int takeAmount)
+    {
+        if(items[index] != null)
+        {
+            if(items[index].stackSize <= takeAmount)
+            {
+                ItemStack itemstack = items[index];
+                items[index] = null;
+                menu.slotsChanged(this);
+                return itemstack;
+            }
+            ItemStack itemstack1 = items[index].splitStack(takeAmount);
+            if(items[index].stackSize <= 0)
+            {
+                items[index] = null;
+            }
+            menu.slotsChanged(this);
+            return itemstack1;
+        } else
+        {
+            return null;
+        }
+    }
+
+    @Override
+	public void setItem(int index, ItemStack itemstack)
+    {
+        items[index] = itemstack;
+        menu.slotsChanged(this);
+    }
+
+    @Override
+	public int getMaxStackSize()
+    {
+        return 64;
+    }
+
+    @Override
+	public void setChanged()
+    {
+        menu.slotsChanged(this);
+    }
+
+    @Override
+	public boolean stillValid(Player entityplayer)
+    {
+        return true;
+    }
+
+    @Override
+    public void sortContainer() {
+        // Do nothing
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java b/src/main/java/net/minecraft/core/player/inventory/container/Inventory.java
similarity index 82%
rename from src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java
rename to src/main/java/net/minecraft/core/player/inventory/container/Inventory.java
index f23e1b4ce..53abeeead 100644
--- a/src/main/java/net/minecraft/core/player/inventory/InventoryPlayer.java
+++ b/src/main/java/net/minecraft/core/player/inventory/container/Inventory.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.container;
 
 
 import com.mojang.nbt.CompoundTag;
@@ -7,25 +7,27 @@ import com.mojang.nbt.ListTag;
 import net.minecraft.core.block.Block;
 
 // Referenced classes of package net.minecraft.src:
-//            IInventory, ItemStack, EntityPlayer, NBTTagCompound, 
-//            NBTTagList, Block, Material, ItemArmor, 
+//            IInventory, ItemStack, Player, NBTTagCompound,
+//            NBTTagList, Block, Material, ArmorItem,
 //            Entity
 
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.IArmorItem;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemArmor;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.material.ArmorMaterial;
 import net.minecraft.core.item.tag.ItemTags;
+import net.minecraft.core.player.inventory.InventorySorter;
 import net.minecraft.core.util.helper.DamageType;
 import org.jetbrains.annotations.Nullable;
 
-public class InventoryPlayer
-    implements IInventory
+public class Inventory
+    implements Container
 {
 
-    public InventoryPlayer(EntityPlayer player)
+    public Inventory(Player player)
     {
         mainInventory = new ItemStack[36];
         armorInventory = new ItemStack[4];
@@ -72,7 +74,7 @@ public class InventoryPlayer
                     mainInventory[i].itemID == itemstack.itemID &&
                     mainInventory[i].isStackable() &&
                     mainInventory[i].stackSize < mainInventory[i].getMaxStackSize() &&
-                    mainInventory[i].stackSize < getInventoryStackLimit() &&
+                    mainInventory[i].stackSize < getMaxStackSize() &&
                     (!mainInventory[i].getHasSubtypes() || mainInventory[i].getMetadata() == itemstack.getMetadata())
             )
             {
@@ -201,26 +203,26 @@ public class InventoryPlayer
     }
     
     @Override
-	public ItemStack decrStackSize(int i, int j)
+	public ItemStack removeItem(int index, int takeAmount)
     {
         ItemStack aitemstack[] = mainInventory;
-        if(i >= mainInventory.length)
+        if(index >= mainInventory.length)
         {
             aitemstack = armorInventory;
-            i -= mainInventory.length;
+            index -= mainInventory.length;
         }
-        if(aitemstack[i] != null)
+        if(aitemstack[index] != null)
         {
-            if(aitemstack[i].stackSize <= j)
+            if(aitemstack[index].stackSize <= takeAmount)
             {
-                ItemStack itemstack = aitemstack[i];
-                aitemstack[i] = null;
+                ItemStack itemstack = aitemstack[index];
+                aitemstack[index] = null;
                 return itemstack;
             }
-            ItemStack itemstack1 = aitemstack[i].splitStack(j);
-            if(aitemstack[i].stackSize <= 0)
+            ItemStack itemstack1 = aitemstack[index].splitStack(takeAmount);
+            if(aitemstack[index].stackSize <= 0)
             {
-                aitemstack[i] = null;
+                aitemstack[index] = null;
             }
             return itemstack1;
         } else
@@ -230,15 +232,15 @@ public class InventoryPlayer
     }
 
     @Override
-	public void setInventorySlotContents(int i, ItemStack itemstack)
+	public void setItem(int index, ItemStack itemstack)
     {
         ItemStack aitemstack[] = mainInventory;
-        if(i >= aitemstack.length)
+        if(index >= aitemstack.length)
         {
-            i -= aitemstack.length;
+            index -= aitemstack.length;
             aitemstack = armorInventory;
         }
-        aitemstack[i] = itemstack;
+        aitemstack[index] = itemstack;
     }
 
     public float getStrVsBlock(Block block)
@@ -304,38 +306,38 @@ public class InventoryPlayer
     }
 
     @Override
-	public int getSizeInventory()
+	public int getContainerSize()
     {
         return mainInventory.length + 4;
     }
 
     @Override
-	public ItemStack getStackInSlot(int i)
+	public ItemStack getItem(int index)
     {
         ItemStack aitemstack[] = mainInventory;
-        if(i >= aitemstack.length)
+        if(index >= aitemstack.length)
         {
-            i -= aitemstack.length;
+            index -= aitemstack.length;
             aitemstack = armorInventory;
         }
-        return aitemstack[i];
+        return aitemstack[index];
     }
 
     @Override
-	public String getInvName()
+	public String getName()
     {
         return "Inventory";
     }
 
     @Override
-	public int getInventoryStackLimit()
+	public int getMaxStackSize()
     {
         return 64;
     }
 
     public int getDamageVsEntity(Entity entity)
     {
-        ItemStack itemstack = getStackInSlot(currentItem);
+        ItemStack itemstack = getItem(currentItem);
         if(itemstack != null)
         {
             return itemstack.getDamageVsEntity(entity);
@@ -352,7 +354,7 @@ public class InventoryPlayer
         {
             return true;
         }
-        ItemStack itemstack = getStackInSlot(currentItem);
+        ItemStack itemstack = getItem(currentItem);
         if(itemstack != null)
         {
             return itemstack.canHarvestBlock(player, block);
@@ -373,8 +375,8 @@ public class InventoryPlayer
     	
     	for(int armorPiece=0; armorPiece < armorInventory.length; armorPiece++) {
     		ItemStack itemStack = armorInventory[armorPiece];
-    		if(itemStack != null && itemStack.getItem() instanceof ItemArmor) {
-    			ItemArmor armor = (ItemArmor) itemStack.getItem();
+    		if(itemStack != null && itemStack.getItem() instanceof IArmorItem) {
+                Item armor = itemStack.getItem();
     			
     			maxDurability += armor.getMaxDamage();
     			armorDurability += armor.getMaxDamage() - itemStack.getMetadata();
@@ -386,14 +388,16 @@ public class InventoryPlayer
 
     public float getTotalProtectionAmount(DamageType damageType) {
     	float protectionPercentage = 0.0f;
-    	
-    	for(int i=0; i < armorInventory.length; i++) {
-			if(armorInventory[i] != null && armorInventory[i].getItem() instanceof ItemArmor) {
-				ItemArmor armor = (ItemArmor) armorInventory[i].getItem();
-				
-				protectionPercentage += armor.material.getProtection(damageType) * armor.getArmorPieceProtectionPercentage();
-			}
-    	}
+
+        for (ItemStack itemStack : armorInventory) {
+            if (itemStack != null && itemStack.getItem() instanceof IArmorItem) {
+                IArmorItem armor = (IArmorItem) itemStack.getItem();
+                ArmorMaterial material = armor.getArmorMaterial();
+                if (material != null) {
+                    protectionPercentage += material.getProtection(damageType) * armor.getArmorPieceProtectionPercentage();
+                }
+            }
+        }
     	
     	return protectionPercentage;
     }
@@ -402,7 +406,7 @@ public class InventoryPlayer
     {
         for(int j = 0; j < armorInventory.length; j++)
         {
-            if(armorInventory[j] == null || !(armorInventory[j].getItem() instanceof ItemArmor))
+            if(armorInventory[j] == null || !(armorInventory[j].getItem() instanceof IArmorItem))
             {
                 continue;
             }
@@ -451,7 +455,7 @@ public class InventoryPlayer
     }
 
     @Override
-	public void onInventoryChanged()
+	public void setChanged()
     {
         inventoryChanged = true;
     }
@@ -469,7 +473,7 @@ public class InventoryPlayer
     }
 
     @Override
-	public boolean canInteractWith(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
         if(player.removed)
         {
@@ -500,19 +504,19 @@ public class InventoryPlayer
     }
 
     @Override
-    public void sortInventory() {
+    public void sortContainer() {
         InventorySorter.sortInventory(mainInventory, 9, mainInventory.length - 1);
     }
 	
-	public void transferAllContents(InventoryPlayer inventoryPlayer) {
+	public void transferAllContents(Inventory inventory) {
 		for(int i=0; i < mainInventory.length; i++) {
-			this.mainInventory[i] = inventoryPlayer.mainInventory[i];
-			inventoryPlayer.mainInventory[i] = null;
+			this.mainInventory[i] = inventory.mainInventory[i];
+			inventory.mainInventory[i] = null;
 		}
 		
 		for(int i=0; i < armorInventory.length; i++) {
-			this.armorInventory[i] = inventoryPlayer.armorInventory[i];
-			inventoryPlayer.armorInventory[i] = null;
+			this.armorInventory[i] = inventory.armorInventory[i];
+			inventory.armorInventory[i] = null;
 		}
 	}
 
@@ -520,7 +524,7 @@ public class InventoryPlayer
     public ItemStack[] mainInventory;
     public ItemStack[] armorInventory;
     public int currentItem;
-    public EntityPlayer player;
+    public Player player;
     private ItemStack heldItem;
     public boolean inventoryChanged;
 }
diff --git a/src/main/java/net/minecraft/core/player/inventory/container/ResultContainer.java b/src/main/java/net/minecraft/core/player/inventory/container/ResultContainer.java
new file mode 100644
index 000000000..db8a365c0
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/container/ResultContainer.java
@@ -0,0 +1,80 @@
+package net.minecraft.core.player.inventory.container;
+
+
+// Referenced classes of package net.minecraft.src:
+//            IInventory, ItemStack, Player
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+
+public class ResultContainer
+    implements Container
+{
+    private ItemStack[] items;
+
+    public ResultContainer()
+    {
+        items = new ItemStack[1];
+    }
+
+    @Override
+	public int getContainerSize()
+    {
+        return 1;
+    }
+
+    @Override
+	public ItemStack getItem(int index)
+    {
+        return items[index];
+    }
+
+    @Override
+	public String getName()
+    {
+        return "Result";
+    }
+
+    @Override
+	public ItemStack removeItem(int index, int takeAmount)
+    {
+        if(items[index] != null)
+        {
+            ItemStack itemstack = items[index];
+            items[index] = null;
+            return itemstack;
+        } else
+        {
+            return null;
+        }
+    }
+
+    @Override
+	public void setItem(int index, ItemStack itemstack)
+    {
+        items[index] = itemstack;
+    }
+
+
+    @Override
+	public int getMaxStackSize()
+    {
+        return 64;
+    }
+
+    @Override
+	public void setChanged()
+    {
+    }
+
+    @Override
+	public boolean stillValid(Player entityplayer)
+    {
+        return true;
+    }
+
+    @Override
+    public void sortContainer() {
+        // Do nothing
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/container/SimpleContainer.java b/src/main/java/net/minecraft/core/player/inventory/container/SimpleContainer.java
new file mode 100644
index 000000000..f4a0eae9c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/container/SimpleContainer.java
@@ -0,0 +1,99 @@
+package net.minecraft.core.player.inventory.container;
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.InventorySorter;
+
+// Referenced classes of package net.minecraft.src:
+//            IInventory, ItemStack, IInvBasic, Player
+
+public class SimpleContainer
+    implements Container
+{
+    private String name;
+    private int size;
+    private ItemStack[] items;
+
+    public SimpleContainer(String name, int size)
+    {
+        this.name = name;
+        this.size = size;
+        items = new ItemStack[size];
+    }
+
+    @Override
+	public ItemStack getItem(int index)
+    {
+        return items[index];
+    }
+
+    @Override
+	public ItemStack removeItem(int index, int takeAmount)
+    {
+        if(items[index] != null)
+        {
+            if(items[index].stackSize <= takeAmount)
+            {
+                ItemStack itemstack = items[index];
+                items[index] = null;
+                setChanged();
+                return itemstack;
+            }
+            ItemStack itemstack1 = items[index].splitStack(takeAmount);
+            if(items[index].stackSize <= 0)
+            {
+                items[index] = null;
+            }
+            setChanged();
+            return itemstack1;
+        } else
+        {
+            return null;
+        }
+    }
+
+    @Override
+	public void setItem(int index, ItemStack itemstack)
+    {
+        items[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
+        {
+            itemstack.stackSize = getMaxStackSize();
+        }
+        setChanged();
+    }
+
+    @Override
+	public int getContainerSize()
+    {
+        return size;
+    }
+
+    @Override
+	public String getName()
+    {
+        return name;
+    }
+
+    @Override
+	public int getMaxStackSize()
+    {
+        return 64;
+    }
+
+    @Override
+	public void setChanged()
+    {
+    }
+
+    @Override
+	public boolean stillValid(Player entityplayer)
+    {
+        return true;
+    }
+
+    @Override
+    public void sortContainer() {
+        InventorySorter.sortInventory(items);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/Container.java b/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
similarity index 71%
rename from src/main/java/net/minecraft/core/player/inventory/Container.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
index c8a1b5766..dcc408947 100644
--- a/src/main/java/net/minecraft/core/player/inventory/Container.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
@@ -1,85 +1,86 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 import java.util.*;
 
 import net.minecraft.core.InventoryAction;
 import net.minecraft.core.Global;
-import net.minecraft.core.crafting.ICrafting;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.crafting.ContainerListener;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.IArmorItem;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemArmor;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
-import net.minecraft.core.util.helper.Listener;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
 import net.minecraft.core.util.helper.MathHelper;
 
-public abstract class Container
+public abstract class AbstractContainerMenu
 {
 
-	public List<ItemStack> inventoryItemStacks;
-	public List<Slot> inventorySlots;
-	public int windowId;
-	private short lastActionId;
-	protected List<ICrafting> crafters;
-	private final Set<EntityPlayer> field_20918_b;
-	public Listener<Slot> slotUpdateListener;
+	public List<ItemStack> lastSlots;
+	public List<Slot> slots;
+	public int containerId;
+	private short changeUid;
+	protected List<ContainerListener> containerListeners;
+	private final Set<Player> unSynchedPlayers;
 
-	public Container()
+	public AbstractContainerMenu()
 	{
-		inventoryItemStacks = new ArrayList<>();
-		inventorySlots = new ArrayList<>();
-		windowId = 0;
-		lastActionId = 0;
-		crafters = new ArrayList<>();
-		field_20918_b = new HashSet<>();
+		lastSlots = new ArrayList<>();
+		slots = new ArrayList<>();
+		containerId = 0;
+		changeUid = 0;
+		containerListeners = new ArrayList<>();
+		unSynchedPlayers = new HashSet<>();
 	}
 
 	protected void addSlot(Slot slot)
 	{
-		slot.id = inventorySlots.size();
-		inventorySlots.add(slot);
-		inventoryItemStacks.add(null);
+		slot.index = slots.size();
+		slots.add(slot);
+		lastSlots.add(null);
 	}
 
-	public void onContainerInit(ICrafting icrafting)
+	public void addSlotListener(ContainerListener containerListener)
 	{
-		if(crafters.contains(icrafting))
+		if(containerListeners.contains(containerListener))
 		{
 			throw new IllegalArgumentException("Listener already listening");
-		} else
+		}
+		else
 		{
-			crafters.add(icrafting);
-			icrafting.updateCraftingInventory(this, func_28127_b());
-			updateInventory();
+			containerListeners.add(containerListener);
+			containerListener.updateCraftingInventory(this, func_28127_b());
+			broadcastChanges();
 		}
 	}
 
 	public List<ItemStack> func_28127_b()
 	{
 		List<ItemStack> arraylist = new ArrayList<>();
-		for (Slot inventorySlot : inventorySlots) {
-			arraylist.add(inventorySlot.getStack());
+		for (Slot inventorySlot : slots) {
+			arraylist.add(inventorySlot.getItem());
 		}
 
 		return arraylist;
 	}
 
 
-	public void updateInventory()
+	public void broadcastChanges()
 	{
-		for(int i = 0; i < inventorySlots.size(); i++)
+		for(int i = 0; i < slots.size(); i++)
 		{
 
-			ItemStack itemstack = ((Slot)inventorySlots.get(i)).getStack();
-			ItemStack itemstack1 = (ItemStack)inventoryItemStacks.get(i);
+			ItemStack itemstack = ((Slot) slots.get(i)).getItem();
+			ItemStack itemstack1 = (ItemStack) lastSlots.get(i);
 			if(ItemStack.areItemStacksEqual(itemstack1, itemstack))
 			{
 				continue;
 			}
 			itemstack1 = itemstack != null ? itemstack.copy() : null;
-			inventoryItemStacks.set(i, itemstack1);
-			for (ICrafting crafter : crafters) {
+			lastSlots.set(i, itemstack1);
+			for (ContainerListener crafter : containerListeners) {
 				crafter.updateInventorySlot(this, i, itemstack1);
 			}
 
@@ -87,12 +88,11 @@ public abstract class Container
 
 	}
 
-	public Slot func_20127_a(IInventory iinventory, int i)
+	public Slot getSlotFor(Container container, int i)
 	{
-		for (Slot inventorySlot : inventorySlots) {
-			Slot slot = inventorySlot;
-			if (slot.isHere(iinventory, i)) {
-				return slot;
+		for (Slot inventorySlot : slots) {
+            if (inventorySlot.isAt(container, i)) {
+				return inventorySlot;
 			}
 		}
 
@@ -103,7 +103,7 @@ public abstract class Container
 	public Slot getSlot(int i)
 	{
 		try{
-			return (Slot) inventorySlots.get(i);
+			return (Slot) slots.get(i);
 		}catch (Exception e) {
 			return null;
 		}
@@ -114,7 +114,7 @@ public abstract class Container
 	 * The returned ItemStack is used to check if the client has the same items as the server.
 	 * If they are different, the server sends the inventory again.
 	 */
-	public ItemStack clickInventorySlot(InventoryAction action, int[] args, EntityPlayer player) {
+	public ItemStack clicked(InventoryAction action, int[] args, Player player) {
 		if(action.requireCreative()) {
 			if(player.getGamemode().consumeBlocks()) {
 				System.out.println("Player "+player.username+" used a creative inventory action but is not in creative mode!");
@@ -122,7 +122,7 @@ public abstract class Container
 			}
 		}
 		
-		InventoryPlayer inventory = player.inventory;
+		Inventory inventory = player.inventory;
 
 		//Drop Item
 		if(action == InventoryAction.DROP_HELD_SINGLE || action == InventoryAction.DROP_HELD_STACK) {
@@ -138,7 +138,7 @@ public abstract class Container
 					}
 				}
 			}
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return null;
 		}
 
@@ -153,7 +153,7 @@ public abstract class Container
 			}else {
 				dragItemsAcrossSlots(player, action, args);
 			}
-			onCraftMatrixChanged(player.inventory);
+			slotsChanged(player.inventory);
 			return controlStack;
 		}
 
@@ -163,13 +163,13 @@ public abstract class Container
 		int slotId = args[0];
 		Slot slot = getSlot(slotId);
 		if(slot == null) {
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return null;
 		}
 
 		//Used in multiplayer to check if the item the player clicked is the same item on the server
 		ItemStack controlStack = null;
-		ItemStack stackInSlot = slot.getStack();
+		ItemStack stackInSlot = slot.getItem();
 		Item itemInSlot = stackInSlot != null ? stackInSlot.getItem() : null;
 		
 		if(stackInSlot != null) {
@@ -198,33 +198,33 @@ public abstract class Container
 			if(result != null && result.stackSize <= 0) {
 				result = null;
 			}
-			slot.putStack(result);
+			slot.set(result);
 			
 			grabbedItem = player.inventory.getHeldItemStack();
 			if(grabbedItem != null && grabbedItem.stackSize <= 0) {
 				player.inventory.setHeldItemStack(null);
 			}
 			
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return controlStack;
 		}
 		
 		if(action == InventoryAction.EQUIP_ARMOR) {
 			handleArmorEquip(slot, player);
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return controlStack;
 		}
 		
 		if(action == InventoryAction.HOTBAR_ITEM_SWAP) {
 			handleHotbarSwap(args, player);
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return controlStack;
 		}
 
 		if(action == InventoryAction.MOVE_STACK || action == InventoryAction.MOVE_SINGLE_ITEM || action == InventoryAction.MOVE_SIMILAR || action == InventoryAction.MOVE_ALL) {
 			int target = args.length > 1 ? args[1] : 0;
 			handleItemMove(action, slot, target, player);
-			onCraftMatrixChanged(player.inventory);
+			slotsChanged(player.inventory);
 			return controlStack;
 		}
 
@@ -233,12 +233,12 @@ public abstract class Container
 				return null;
 			}
 			handleSort(args, player);
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return controlStack;
 		}
 
 		//Regular Press
-		slot.onSlotChanged();
+		slot.setChanged();
 		ItemStack stackInHand = inventory.getHeldItemStack();
 
 		if(action == InventoryAction.DROP) {
@@ -247,13 +247,13 @@ public abstract class Container
 			}
 			int amount = args.length > 1 ? args[1] : 1;
 			amount = Math.min(amount, stackInSlot.stackSize);
-			ItemStack dropStack = slot.decrStackSize(amount);
+			ItemStack dropStack = slot.remove(amount);
 			if(stackInSlot.stackSize <= 0) {
-				slot.putStack(null);
+				slot.set(null);
 			}
-			slot.onPickupFromSlot(dropStack);
+			slot.onTake(dropStack);
 			player.dropPlayerItem(dropStack);
-			onCraftMatrixChanged(inventory);
+			slotsChanged(inventory);
 			return controlStack;
 		}
 
@@ -265,7 +265,7 @@ public abstract class Container
 				for(int i=0; i < count; i++) {
 					Slot slot1 = getSlot(slotId + i);
 					if(slot1 != null) {
-						slot1.putStack(null);
+						slot1.set(null);
 					}
 				}
 			}else {
@@ -278,7 +278,7 @@ public abstract class Container
 				if(action == InventoryAction.CREATIVE_GRAB) {
 					ItemStack stack;
 					if(amount > 0) {
-						stack = slot.getStack().copy();
+						stack = slot.getItem().copy();
 						stack.stackSize = amount;
 					}else {
 						stack = null;
@@ -287,25 +287,25 @@ public abstract class Container
 				}
 				if(action == InventoryAction.CREATIVE_MOVE) {
 					if(amount > 0) {
-						ItemStack stack = slot.getStack().copy();
+						ItemStack stack = slot.getItem().copy();
 						stack.stackSize = amount;
 						player.inventory.insertItem(stack, false);
 					}
 				}
 			}
-			onCraftMatrixChanged(player.inventory);
+			slotsChanged(player.inventory);
 			return controlStack;
 		}
 
 		//Clicked Empty Slot
 		if(stackInSlot == null) {
 			//Slot is Empty
-			if(stackInHand != null && slot.canPutStackInSlot(stackInHand)) {
+			if(stackInHand != null && slot.mayPlace(stackInHand)) {
 				int i1 = action != InventoryAction.CLICK_LEFT ? 1 : stackInHand.stackSize;
-				if(i1 > slot.getSlotStackLimit()) {
-					i1 = slot.getSlotStackLimit();
+				if(i1 > slot.getMaxStackSize()) {
+					i1 = slot.getMaxStackSize();
 				}
-				slot.putStack(stackInHand.splitStack(i1));
+				slot.set(stackInHand.splitStack(i1));
 				if(stackInHand.stackSize <= 0) {
 					inventory.setHeldItemStack(null);
 				}
@@ -313,25 +313,25 @@ public abstract class Container
 		} else if(stackInHand == null) {
 			//Not Holding Anything
 			int j1 = action != InventoryAction.CLICK_LEFT ? (stackInSlot.stackSize + 1) / 2 : stackInSlot.stackSize;
-			ItemStack itemstack5 = slot.decrStackSize(j1);
+			ItemStack itemstack5 = slot.remove(j1);
 			inventory.setHeldItemStack(itemstack5);
 			if(stackInSlot.stackSize <= 0) {
-				slot.putStack(null);
+				slot.set(null);
 			}
-			slot.onPickupFromSlot(inventory.getHeldItemStack());
-		} else if(slot.canPutStackInSlot(stackInHand)) {
+			slot.onTake(inventory.getHeldItemStack());
+		} else if(slot.mayPlace(stackInHand)) {
 			//Can Put Stack in Slot
 			if(!stackInSlot.canStackWith(stackInHand)) {
 				//Swap Items
-				if(stackInHand.stackSize <= slot.getSlotStackLimit()) {
-					slot.putStack(stackInHand);
+				if(stackInHand.stackSize <= slot.getMaxStackSize()) {
+					slot.set(stackInHand);
 					inventory.setHeldItemStack(stackInSlot);
 				}
 			} else {
 				//Combine Stacks
 				int splitSize = action != InventoryAction.CLICK_LEFT ? 1 : stackInHand.stackSize;
-				if(splitSize > slot.getSlotStackLimit() - stackInSlot.stackSize) {
-					splitSize = slot.getSlotStackLimit() - stackInSlot.stackSize;
+				if(splitSize > slot.getMaxStackSize() - stackInSlot.stackSize) {
+					splitSize = slot.getMaxStackSize() - stackInSlot.stackSize;
 				}
 				if(splitSize > stackInHand.getMaxStackSize() - stackInSlot.stackSize) {
 					splitSize = stackInHand.getMaxStackSize() - stackInSlot.stackSize;
@@ -345,11 +345,11 @@ public abstract class Container
 		} else if(stackInSlot.canStackWith(stackInHand)) {
 			//Pickup Item
 			if(stackInSlot.stackSize + stackInHand.stackSize <= stackInHand.getMaxStackSize()) {
-				slot.putStack(null);
+				slot.set(null);
 
 				//This is currently used for maps, and for Crafting Statistics / Achievements
 				//This might modify the stack
-				slot.onPickupFromSlot(stackInSlot);
+				slot.onTake(stackInSlot);
 
 				if(stackInSlot.canStackWith(stackInHand) && stackInHand.stackSize + stackInSlot.stackSize <= stackInHand.getMaxStackSize()) {
 					stackInHand.stackSize += stackInSlot.stackSize;
@@ -364,48 +364,48 @@ public abstract class Container
 			inventory.setHeldItemStack(null);
 		}
 
-		onCraftMatrixChanged(player.inventory);
+		slotsChanged(player.inventory);
 
 		return controlStack;
 	}
 	
-	public void handleArmorEquip(Slot slot, EntityPlayer player) {
-		ItemStack stackInSlot = slot.getStack();
+	public void handleArmorEquip(Slot slot, Player player) {
+		ItemStack stackInSlot = slot.getItem();
 		if(stackInSlot == null) {
 			return;
 		}
 		
 		Item itemInSlot = stackInSlot.getItem();
-		ItemArmor itemArmor;
+		IArmorItem armorItem;
 		
 		// Check if item is armor
-		if(itemInSlot instanceof ItemArmor) {
-			itemArmor = (ItemArmor) itemInSlot;
+		if(itemInSlot instanceof IArmorItem) {
+			armorItem = (IArmorItem) itemInSlot;
 		}else {
 			return;
 		}
 		
-		int armorSlot = 3 - itemArmor.armorPiece;
+		int armorSlot = 3 - armorItem.getArmorPiece();
 		
 		// Take new armor
 		ItemStack newArmor = stackInSlot;
-		slot.putStack(null);
-		slot.onPickupFromSlot(stackInSlot);
-		slot.onSlotChanged();
+		slot.set(null);
+		slot.onTake(stackInSlot);
+		slot.setChanged();
 		
 		// Equip new armor
 		ItemStack oldArmor = player.inventory.armorInventory[armorSlot];
 		player.inventory.armorInventory[armorSlot] = newArmor;
 		
 		// Put old armor in slot, or drop if not possible
-		mergeItems(oldArmor, slot.id);
+		mergeItems(oldArmor, slot.index);
 		storeOrDropItem(player, oldArmor);
 	}
 
 	/*
 	 * Handle the SORT action
 	 */
-	public void handleSort(int[] args, EntityPlayer player) {
+	public void handleSort(int[] args, Player player) {
 		if (args.length < 1) {
 			return;
 		}
@@ -420,7 +420,7 @@ public abstract class Container
 	/**
 	 * Handle the HOTBAR_ITEM_SWAP action
 	 */
-	public void handleHotbarSwap(int[] args, EntityPlayer player) {
+	public void handleHotbarSwap(int[] args, Player player) {
 		if(args.length < 2) {
 			return;
 		}
@@ -436,36 +436,36 @@ public abstract class Container
 			return;
 		}
 
-		ItemStack slotStack = slot.getStack();
-		ItemStack hotbarStack = hotbarSlot.getStack();
+		ItemStack slotStack = slot.getItem();
+		ItemStack hotbarStack = hotbarSlot.getItem();
 
 		if(slotStack != null) {
-			slot.putStack(null);
-			slot.onPickupFromSlot(slotStack);
+			slot.set(null);
+			slot.onTake(slotStack);
 		}
 		if(hotbarStack != null) {
-			hotbarSlot.putStack(null);
-			hotbarSlot.onPickupFromSlot(hotbarStack);
+			hotbarSlot.set(null);
+			hotbarSlot.onTake(hotbarStack);
 		}
 
-		mergeItems(slotStack, hotbarSlot.id);
+		mergeItems(slotStack, hotbarSlot.index);
 		storeOrDropItem(player, slotStack);
 
-		mergeItems(hotbarStack, slot.id);
+		mergeItems(hotbarStack, slot.index);
 		storeOrDropItem(player, hotbarStack);
 
-		slot.onSlotChanged();
-		hotbarSlot.onSlotChanged();
+		slot.setChanged();
+		hotbarSlot.setChanged();
 	}
 
 	/**
 	 * Handles all MOVE actions
 	 */
-	public void handleItemMove(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		ItemStack stackInSlot = slot.getStack();
+	public void handleItemMove(InventoryAction action, Slot slot, int target, Player player) {
+		ItemStack stackInSlot = slot.getItem();
 
-		if(slot instanceof SlotCrafting) {
-			handleCrafting(action, (SlotCrafting) slot, target, player);
+		if(slot instanceof ResultSlot) {
+			handleCrafting(action, (ResultSlot) slot, target, player);
 			return;
 		}
 
@@ -482,7 +482,7 @@ public abstract class Container
 			if(action == InventoryAction.MOVE_STACK) item = stackInSlot.splitStack(stackInSlot.stackSize);
 			if(item == null) return;
 			
-			slot.onPickupFromSlot(item);
+			slot.onTake(item);
 			
 			mergeItems(item, targetSlots);
 
@@ -492,7 +492,7 @@ public abstract class Container
 			}
 
 			if(stackInSlot.stackSize <= 0) {
-				slot.putStack(null);
+				slot.set(null);
 			}
 
 			return;
@@ -515,17 +515,17 @@ public abstract class Container
 				if(slot1 == null) {
 					continue;
 				}
-				ItemStack item = slot1.getStack();
+				ItemStack item = slot1.getItem();
 				if(compare(compareStack, item)) {
 					int freeSpace = getFreeSpace(item, targetSlots);
 					if(freeSpace > 0) {
 						int amount = Math.min(freeSpace, item.stackSize);
 						ItemStack takenItem = item.splitStack(amount);
-						slot.onPickupFromSlot(takenItem);
+						slot.onTake(takenItem);
 						
 						mergeItems(takenItem, targetSlots);
 						if(item.stackSize <= 0) {
-							slot1.putStack(null);
+							slot1.set(null);
 						}
 						if(takenItem.stackSize > 0) {
 							player.dropPlayerItem(takenItem);
@@ -548,8 +548,8 @@ public abstract class Container
 	/**
 	 * Handle MOVE actions on crafting result slots
 	 */
-	public void handleCrafting(InventoryAction action, SlotCrafting slot, int target, EntityPlayer player) {
-		ItemStack itemToCraft = slot.getStack();
+	public void handleCrafting(InventoryAction action, ResultSlot slot, int target, Player player) {
+		ItemStack itemToCraft = slot.getItem();
 
 		if(itemToCraft == null) {
 			return;
@@ -573,7 +573,7 @@ public abstract class Container
 		}
 
 		for(int i=0; i < craftCount; i++) {
-			itemToCraft = slot.getStack();
+			itemToCraft = slot.getItem();
 
 			if(itemToCraft == null) {
 				break;
@@ -586,9 +586,9 @@ public abstract class Container
 			int space = getFreeSpace(itemToCraft, resultSlots);
 
 			if(space >= itemToCraft.stackSize) {
-				slot.putStack(null);
-				slot.onPickupFromSlot(itemToCraft);
-				onCraftMatrixChanged(player.inventory);
+				slot.set(null);
+				slot.onTake(itemToCraft);
+				slotsChanged(player.inventory);
 				mergeItems(itemToCraft, resultSlots);
 				if(itemToCraft.stackSize > 0) {
 					storeOrDropItem(player, itemToCraft);
@@ -609,7 +609,7 @@ public abstract class Container
 			Slot slot = getSlotFromList(slots, i);
 			if(slot == null) continue;
 
-			ItemStack stackInSlot = slot.getStack();
+			ItemStack stackInSlot = slot.getItem();
 			if(stackInSlot == null) {
 				return max;
 			}
@@ -630,25 +630,25 @@ public abstract class Container
 	 * Slots to move items from when using MOVE_ALL or MOVE_SIMILAR.
 	 * If the return value is null, MOVE_ALL and MOVE_SIMILAR won't do anything!
 	 */
-	public abstract List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player);
+	public abstract List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player);
 
 	/**
 	 * Slots to move items to when using any MOVE action.
 	 * If the return value is null, all MOVE actions won't do anything!
 	 */
-	public abstract List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player);
+	public abstract List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player);
 
 	/**
 	 * Pick up all items similar to the one the player is holding.
 	 * Full stacks are not picked up.
 	 */
-	public void pickupSimilarItems(EntityPlayer player) {
+	public void pickupSimilarItems(Player player) {
 		ItemStack item = player.inventory.getHeldItemStack();
 		if(item == null) {
 			return;
 		}
 
-		List<Slot> slots = inventorySlots;
+		List<Slot> slots = this.slots;
 		for(int i=0; i < slots.size(); i++) {
 			Slot slot1 = slots.get(i);
 
@@ -656,7 +656,7 @@ public abstract class Container
 				continue;
 			}
 
-			ItemStack slotStack = slot1.getStack();
+			ItemStack slotStack = slot1.getItem();
 			if(slotStack == null) {
 				continue;
 			}
@@ -672,7 +672,7 @@ public abstract class Container
 					item.stackSize += amount;
 
 					if(slotStack.stackSize <= 0) {
-						slot1.putStack(null);
+						slot1.set(null);
 					}
 				}
 			}
@@ -684,19 +684,19 @@ public abstract class Container
 	/**
 	 * Spread the Item the player is holding across all provided slots.
 	 */
-	public void dragItemsAcrossSlots(EntityPlayer player, InventoryAction action, int[] slots) {
+	public void dragItemsAcrossSlots(Player player, InventoryAction action, int[] slots) {
 		ItemStack draggingItemStack = player.inventory.getHeldItemStack();
 		
 		if(action == InventoryAction.CREATIVE_DRAG) {
 			for(int i=0; i < slots.length; i++) {
 				Slot slot = getSlot(slots[i]);
-				if(slot == null || !slot.enableDragAndPickup() || !slot.canPutStackInSlot(draggingItemStack) || slot.getStack() != null) {
+				if(slot == null || !slot.enableDragAndPickup() || !slot.mayPlace(draggingItemStack) || slot.getItem() != null) {
 					continue;
 				}
 				ItemStack stack = draggingItemStack.copy();
 				stack.stackSize = stack.getMaxStackSize();
-				slot.putStack(stack);
-				slot.onSlotChanged();
+				slot.set(stack);
+				slot.setChanged();
 			}
 			player.inventory.setHeldItemStack(null);
 			return;
@@ -718,13 +718,13 @@ public abstract class Container
 
 		for(int i=0; i < slots.length; i++) {
 			Slot slot = getSlot(slots[i]);
-			if(slot == null || !slot.enableDragAndPickup() || !slot.canPutStackInSlot(draggingItemStack)) {
+			if(slot == null || !slot.enableDragAndPickup() || !slot.mayPlace(draggingItemStack)) {
 				continue;
 			}
-			ItemStack stackInSlot = slot.getStack();
+			ItemStack stackInSlot = slot.getItem();
 
 			int amount = itemsPerSlot;
-			amount = Math.min(amount, slot.getSlotStackLimit());
+			amount = Math.min(amount, slot.getMaxStackSize());
 			if(stackInSlot != null) {
 				amount = Math.min(amount, stackInSlot.getMaxStackSize() - stackInSlot.stackSize);
 			}
@@ -734,7 +734,7 @@ public abstract class Container
 			}
 
 			if(stackInSlot == null) {
-				slot.putStack(draggingItemStack.splitStack(amount));
+				slot.set(draggingItemStack.splitStack(amount));
 			}else if(stackInSlot.canStackWith(draggingItemStack)) {
 				draggingItemStack.stackSize -= amount;
 
@@ -750,8 +750,8 @@ public abstract class Container
 		}
 	}
 
-	public void onCraftGuiClosed(EntityPlayer player) {
-		InventoryPlayer inventory = player.inventory;
+	public void onCraftGuiClosed(Player player) {
+		Inventory inventory = player.inventory;
 		if(inventory.getHeldItemStack() != null) {
 			ItemStack stack = inventory.getHeldItemStack();
 			inventory.setHeldItemStack(null);
@@ -764,71 +764,71 @@ public abstract class Container
 	 * If the inventory does not have enough space, drop the item.
 	 * If the stack size is already less than or zero nothing happens
 	 */
-	public void storeOrDropItem(EntityPlayer player, ItemStack stack) {
+	public void storeOrDropItem(Player player, ItemStack stack) {
 		if(stack == null || stack.stackSize <= 0) {
 			return;
 		}
-		InventoryPlayer inventory = player.inventory;
+		Inventory inventory = player.inventory;
 		inventory.insertItem(stack, false);
 		if(stack.stackSize > 0) {
 			player.dropPlayerItem(stack);
 		}
 	}
 
-	public void onCraftMatrixChanged(IInventory iinventory)
+	public void slotsChanged(Container iinventory)
 	{
-		updateInventory();
+		broadcastChanges();
 	}
 
-	public boolean getCanCraft(EntityPlayer entityplayer)
+	public boolean isSynched(Player entityplayer)
 	{
-		return !field_20918_b.contains(entityplayer);
+		return !unSynchedPlayers.contains(entityplayer);
 	}
 
-	public void setCanCraft(EntityPlayer entityplayer, boolean flag)
+	public void setSynched(Player entityplayer, boolean flag)
 	{
 		if(flag)
 		{
-			field_20918_b.remove(entityplayer);
+			unSynchedPlayers.remove(entityplayer);
 		} else
 		{
-			field_20918_b.add(entityplayer);
+			unSynchedPlayers.add(entityplayer);
 		}
 	}
 
-	public void putStackInSlot(int i, ItemStack itemstack)
+	public void setItem(int i, ItemStack itemstack)
 	{
-		getSlot(i).putStack(itemstack);
+		getSlot(i).set(itemstack);
 	}
 
-	public void putStacksInSlots(ItemStack[] aitemstack)
+	public void setAll(ItemStack[] aitemstack)
 	{
 		for(int i = 0; i < aitemstack.length; i++)
 		{
-			getSlot(i).putStack(aitemstack[i]);
+			getSlot(i).set(aitemstack[i]);
 		}
 
 	}
 
-	public void updateClientProgressBar(int id, int value)
+	public void setData(int id, int value)
 	{
 	}
 
-	public short getActionId(InventoryPlayer inventoryplayer)
+	public short backup(Inventory inventoryplayer)
 	{
-		lastActionId++;
-		return lastActionId;
+		changeUid++;
+		return changeUid;
 	}
 
-	public void func_20113_a(short word0)
+	public void deleteBackup(short word0)
 	{
 	}
 
-	public void func_20110_b(short word0)
+	public void rollbackToBackup(short word0)
 	{
 	}
 
-	public abstract boolean isUsableByPlayer(EntityPlayer entityplayer);
+	public abstract boolean stillValid(Player entityplayer);
 
 	/**
 	 * Merge the given ItemStack into the given slots.
@@ -840,17 +840,17 @@ public abstract class Container
 		for(int i = 0; i < targetSlots.size(); i++) {
 			Slot slot = getSlotFromList(targetSlots, i);
 			if(slot == null) continue;
-			ItemStack stackInSlot = slot.getStack();
+			ItemStack stackInSlot = slot.getItem();
 
-			if(stackInSlot == null || !slot.canPutStackInSlot(stack) || !stack.canStackWith(stackInSlot)) continue;
+			if(stackInSlot == null || !slot.mayPlace(stack) || !stack.canStackWith(stackInSlot)) continue;
 
-			int amount = Math.min(stack.stackSize, stack.getMaxStackSize(slot.getInventory()) - stackInSlot.stackSize);
-			amount = Math.min(amount, slot.getSlotStackLimit() - stackInSlot.stackSize);
+			int amount = Math.min(stack.stackSize, stack.getMaxStackSize(slot.getContainer()) - stackInSlot.stackSize);
+			amount = Math.min(amount, slot.getMaxStackSize() - stackInSlot.stackSize);
 			if(amount <= 0) continue;
 
 			stack.stackSize -= amount;
 			stackInSlot.stackSize += amount;
-			slot.onSlotChanged();
+			slot.setChanged();
 
 			if(stack.stackSize == 0) return;
 		}
@@ -858,16 +858,16 @@ public abstract class Container
 		for(int i = 0; i < targetSlots.size(); i++) {
 			Slot slot = getSlotFromList(targetSlots, i);
 			if(slot == null) continue;
-			ItemStack stackInSlot = slot.getStack();
+			ItemStack stackInSlot = slot.getItem();
 
-			if(stackInSlot != null || !slot.canPutStackInSlot(stack)) continue;
+			if(stackInSlot != null || !slot.mayPlace(stack)) continue;
 
-			int amount = Math.min(stack.stackSize, stack.getMaxStackSize(slot.getInventory()));
-			amount = Math.min(amount, slot.getSlotStackLimit());
+			int amount = Math.min(stack.stackSize, stack.getMaxStackSize(slot.getContainer()));
+			amount = Math.min(amount, slot.getMaxStackSize());
 			if(amount <= 0) continue;
 
-			slot.putStack(stack.splitStack(amount));
-			slot.onSlotChanged();
+			slot.set(stack.splitStack(amount));
+			slot.setChanged();
 
 			if(stack.stackSize <= 0) return;
 		}
@@ -908,6 +908,6 @@ public abstract class Container
 	}
 
 	public int getHotbarSlotId(int number) {
-		return inventorySlots.size() - 10 + number;
+		return slots.size() - 10 + number;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerChest.java b/src/main/java/net/minecraft/core/player/inventory/menu/ContainerMenu.java
similarity index 52%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerChest.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/ContainerMenu.java
index efad28dab..5ed9aa4bf 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerChest.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/ContainerMenu.java
@@ -1,65 +1,66 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 import java.util.List;
 
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.player.inventory.slot.Slot;
 
-public class ContainerChest extends Container {
+public class ContainerMenu extends AbstractContainerMenu {
 	
-	private IInventory field_20125_a;
+	private Container container;
 	private int numberOfRows;
 	
-	public ContainerChest(IInventory iinventory, IInventory iinventory1) {
-		field_20125_a = iinventory1;
-		numberOfRows = iinventory1.getSizeInventory() / 9;
+	public ContainerMenu(Container playerContainer, Container container) {
+		this.container = container;
+		numberOfRows = container.getContainerSize() / 9;
 		int i = (numberOfRows - 4) * 18;
 		for (int j = 0; j < numberOfRows; j++) {
 			for (int i1 = 0; i1 < 9; i1++) {
-				addSlot(new Slot(iinventory1, i1 + j * 9, 8 + i1 * 18, 18 + j * 18));
+				addSlot(new Slot(container, i1 + j * 9, 8 + i1 * 18, 18 + j * 18));
 			}
 
 		}
 
 		for (int k = 0; k < 3; k++) {
 			for (int j1 = 0; j1 < 9; j1++) {
-				addSlot(new Slot(iinventory, j1 + k * 9 + 9, 8 + j1 * 18, 103 + k * 18 + i));
+				addSlot(new Slot(playerContainer, j1 + k * 9 + 9, 8 + j1 * 18, 103 + k * 18 + i));
 			}
 
 		}
 
 		for (int l = 0; l < 9; l++) {
-			addSlot(new Slot(iinventory, l, 8 + l * 18, 161 + i));
+			addSlot(new Slot(playerContainer, l, 8 + l * 18, 161 + i));
 		}
 
 	}
 
 	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
-		return field_20125_a.canInteractWith(entityplayer);
+	public boolean stillValid(Player entityplayer) {
+		return container.stillValid(entityplayer);
 	}
 	
 	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
 		int chestSize = numberOfRows * 9;
 		
-		if(slot.id >= 0 && slot.id < chestSize) {
+		if(slot.index >= 0 && slot.index < chestSize) {
 			// Chest inventory
 			return getSlots(0, chestSize, false); 
 		}
 		
 		if(action == InventoryAction.MOVE_ALL) {
-			if(slot.id >= chestSize && slot.id < chestSize + 27) {
+			if(slot.index >= chestSize && slot.index < chestSize + 27) {
 				// Main Inventory
 				return getSlots(chestSize, 27, false);
 			}
-			if(slot.id >= chestSize + 27 && slot.id < chestSize + 36) {
+			if(slot.index >= chestSize + 27 && slot.index < chestSize + 36) {
 				// Hotbar
 				return getSlots(chestSize + 27, 9, false);
 			}
 		}else {
-			if(slot.id >= chestSize && slot.id < chestSize + 36) {
+			if(slot.index >= chestSize && slot.index < chestSize + 36) {
 				// Full Inventory
 				return getSlots(chestSize, 36, false);
 			}
@@ -69,10 +70,10 @@ public class ContainerChest extends Container {
 	}
 
 	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
 		int chestSize = numberOfRows * 9;
 		
-		if(slot.id < chestSize) {
+		if(slot.index < chestSize) {
 			// Clicked chest
 			return getSlots(chestSize, 36, true); // Inventory
 		}else {
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerWorkbench.java b/src/main/java/net/minecraft/core/player/inventory/menu/CraftingMenu.java
similarity index 52%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerWorkbench.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/CraftingMenu.java
index 2b6119f2f..9041c2412 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerWorkbench.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/CraftingMenu.java
@@ -1,38 +1,48 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 // Referenced classes of package net.minecraft.src:
 //            Container, InventoryCrafting, InventoryCraftResult, SlotCrafting, 
 //            InventoryPlayer, Slot, CraftingManager, IInventory, 
-//            World, EntityPlayer, Block, ItemStack
+//            World, Player, Block, ItemStack
 
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.container.ResultContainer;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
 import net.minecraft.core.world.World;
 
 import java.util.List;
 
-public class ContainerWorkbench extends Container
+public class CraftingMenu extends AbstractContainerMenu
 {
+	public CraftingContainer craftSlots;
+	public Container resultSlots;
+	private World world;
+	private int x;
+	private int y;
+	private int z;
 
-    public ContainerWorkbench(InventoryPlayer inventoryplayer, World world, int i, int j, int k)
+    public CraftingMenu(Inventory inventory, World world, int x, int y, int z)
     {
-        craftMatrix = new InventoryCrafting(this, 3, 3);
-        craftResult = new InventoryCraftResult();
-        field_20133_c = world;
-        field_20132_h = i;
-        field_20131_i = j;
-        field_20130_j = k;
-        addSlot(new SlotCrafting(inventoryplayer.player, craftMatrix, craftResult, 0, 124, 35));
+        craftSlots = new CraftingContainer(this, 3, 3);
+        resultSlots = new ResultContainer();
+        this.world = world;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        addSlot(new ResultSlot(inventory.player, craftSlots, resultSlots, 0, 124, 35));
         for(int l = 0; l < 3; l++)
         {
             for(int k1 = 0; k1 < 3; k1++)
             {
-                addSlot(new Slot(craftMatrix, k1 + l * 3, 30 + k1 * 18, 17 + l * 18));
+                addSlot(new Slot(craftSlots, k1 + l * 3, 30 + k1 * 18, 17 + l * 18));
             }
 
         }
@@ -41,31 +51,31 @@ public class ContainerWorkbench extends Container
         {
             for(int l1 = 0; l1 < 9; l1++)
             {
-                addSlot(new Slot(inventoryplayer, l1 + i1 * 9 + 9, 8 + l1 * 18, 84 + i1 * 18));
+                addSlot(new Slot(inventory, l1 + i1 * 9 + 9, 8 + l1 * 18, 84 + i1 * 18));
             }
 
         }
 
         for(int j1 = 0; j1 < 9; j1++)
         {
-            addSlot(new Slot(inventoryplayer, j1, 8 + j1 * 18, 142));
+            addSlot(new Slot(inventory, j1, 8 + j1 * 18, 142));
         }
 
-        onCraftMatrixChanged(craftMatrix);
+        slotsChanged(craftSlots);
     }
 
     @Override
-	public void onCraftMatrixChanged(IInventory iinventory)
+	public void slotsChanged(Container iinventory)
     {
-		craftResult.setInventorySlotContents(0, Registries.RECIPES.findMatchingRecipe(craftMatrix));
+		resultSlots.setItem(0, Registries.RECIPES.findMatchingRecipe(craftSlots));
     }
 
 	@Override
-	public void onCraftGuiClosed(EntityPlayer player) {
+	public void onCraftGuiClosed(Player player) {
 		super.onCraftGuiClosed(player);
 		boolean insert = false;
 		for (int i = 0; i < 9; i++) {
-			ItemStack itemstack = craftMatrix.getStackInSlot(i);
+			ItemStack itemstack = craftSlots.getItem(i);
 			if(itemstack != null) {
 				storeOrDropItem(player, itemstack);
 				insert = true;
@@ -77,13 +87,13 @@ public class ContainerWorkbench extends Container
 	}
 
     @Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer)
+	public boolean stillValid(Player entityplayer)
     {
-        if(field_20133_c.getBlockId(field_20132_h, field_20131_i, field_20130_j) != Block.workbench.id)
+        if(world.getBlockId(x, y, z) != Blocks.WORKBENCH.id)
         {
             return false;
         }
-        return entityplayer.distanceToSqr((double)field_20132_h + 0.5D, (double)field_20131_i + 0.5D, (double)field_20130_j + 0.5D) <= 64D;
+        return entityplayer.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) <= 64D;
     }
     
     /*
@@ -94,26 +104,26 @@ public class ContainerWorkbench extends Container
      */
     
     @Override
-    public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-    	if(slot.id == 0) {
+    public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+    	if(slot.index == 0) {
     		// Craft Result
     		return getSlots(0, 1, false);
     	}
-    	if(slot.id >= 1 && slot.id < 9) {
+    	if(slot.index >= 1 && slot.index < 9) {
     		// Crafting Grid
     		return getSlots(1, 9, false);
     	}
     	if(action == InventoryAction.MOVE_SIMILAR) {
-    		if(slot.id >= 10 && slot.id <= 45) {
+    		if(slot.index >= 10 && slot.index <= 45) {
     			// Full Inventory
     			return getSlots(10, 36, false);
     		}
     	}else {
-    		if(slot.id >= 10 && slot.id <= 36) {
+    		if(slot.index >= 10 && slot.index <= 36) {
     			// Main Inventory
     			return getSlots(10, 27, false);
     		}
-    		if(slot.id >= 37 && slot.id <= 45) {
+    		if(slot.index >= 37 && slot.index <= 45) {
     			// Hotbar
     			return getSlots(37, 9, false);
     		}
@@ -122,23 +132,23 @@ public class ContainerWorkbench extends Container
     }
     
     @Override
-    public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-    	if(slot.id >= 10 && slot.id <= 45) {
+    public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+    	if(slot.index >= 10 && slot.index <= 45) {
     		// Full Inventory
     		if(target == 1) {
     			return getSlots(1, 9, false); // To Crafting Grid
     		}
-    		if(slot.id >= 10 && slot.id <= 36) {
+    		if(slot.index >= 10 && slot.index <= 36) {
     			// Main Inventory
     			return getSlots(37, 9, false); // To Hotbar
     		}
-    		if(slot.id >= 37 && slot.id <= 45) {
+    		if(slot.index >= 37 && slot.index <= 45) {
     			// Hotbar
     			return getSlots(10, 27, false); // To Main Inventory
     		}
     	}else {
     		// Crafting grid or result
-    		if(slot.id == 0) {
+    		if(slot.index == 0) {
     			// Crafting Result
     			return getSlots(10, 36, true);
     		}else {
@@ -149,11 +159,4 @@ public class ContainerWorkbench extends Container
     	
     	return null;
     }
-    
-    public InventoryCrafting craftMatrix;
-    public IInventory craftResult;
-    private World field_20133_c;
-    private int field_20132_h;
-    private int field_20131_i;
-    private int field_20130_j;
 }
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java b/src/main/java/net/minecraft/core/player/inventory/menu/CreativeInventoryMenu.java
similarity index 70%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/CreativeInventoryMenu.java
index 7848bdbdb..b07072708 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayerCreative.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/CreativeInventoryMenu.java
@@ -1,17 +1,20 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 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.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.player.inventory.slot.SlotCreative;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.slot.CreativeSlot;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class ContainerPlayerCreative extends ContainerPlayer
+public class CreativeInventoryMenu extends InventoryMenu
 {
 	public int page = 0;
 	public int maxPage;
@@ -19,16 +22,16 @@ public class ContainerPlayerCreative extends ContainerPlayer
 	protected List<ItemStack> searchedItems = new ArrayList<ItemStack>();
 	public String searchText = "";
 	
-	public ContainerPlayerCreative(InventoryPlayer inventoryplayer)
+	public CreativeInventoryMenu(Inventory inventoryplayer)
 	{
 		this(inventoryplayer, true);
 	}
 	
-	public ContainerPlayerCreative(InventoryPlayer inventoryplayer, boolean isNotClientSide)
+	public CreativeInventoryMenu(Inventory inventoryplayer, boolean isNotClientSide)
 	{
 		super(inventoryplayer, isNotClientSide);
 		
-		creativeSlotsStart = this.inventorySlots.size();
+		creativeSlotsStart = this.slots.size();
 		
 		// Add creative slots
 		for (int i = 0; i < 36; i++)
@@ -36,7 +39,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 			int x = i % 6;
 			int y = i / 6;
 			
-			addSlot(new SlotCreative(creativeSlotsStart + i, 184 + (x * 18), 30 + (y * 18), creativeItems.get(i)));
+			addSlot(new CreativeSlot(creativeSlotsStart + i, 184 + (x * 18), 30 + (y * 18), creativeItems.get(i)));
 		}
 		
 		searchPage("");
@@ -100,15 +103,15 @@ public class ContainerPlayerCreative extends ContainerPlayer
 		{
 			if (i + (page * 36) >= searchedItems.size())
 			{
-				((SlotCreative)this.inventorySlots.get(creativeSlotsStart + i)).item = null;
+				((CreativeSlot)this.slots.get(creativeSlotsStart + i)).item = null;
 			}
 			else
 			{
-				((SlotCreative)this.inventorySlots.get(creativeSlotsStart + i)).item = searchedItems.get(i + (page * 36));				
+				((CreativeSlot)this.slots.get(creativeSlotsStart + i)).item = searchedItems.get(i + (page * 36));
 			}			
 		}
 		
-		playerInv.player.updateCreativeInventory(page, searchText);
+		inventory.player.updateCreativeInventory(page, searchText);
 	}
 
 	public String getSearchText(){
@@ -134,7 +137,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 				creativeItems.add(new ItemStack(Block.blocksList[id]));
 				count++;
 				
-				if (id == Block.wool.id || id == Block.planksOakPainted.id || id == Block.lampIdle.id || id == Block.fencePlanksOakPainted.id)
+				if (id == Blocks.WOOL.id || id == Blocks.PLANKS_OAK_PAINTED.id || id == Blocks.LAMP_IDLE.id || id == Blocks.FENCE_PLANKS_OAK_PAINTED.id)
 				{
 					for (int i = 1; i < 16; i++)
 					{
@@ -142,9 +145,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 || id == Block.doorPlanksOakPaintedBottom.id || id == Block.doorPlanksOakPaintedTop.id
-					  || id == Block.trapdoorPlanksOakPainted.id)
+				else if (id == Blocks.CHEST_PLANKS_OAK_PAINTED.id || id == Blocks.SLAB_PLANKS_PAINTED.id || id == Blocks.FENCE_GATE_PLANKS_OAK_PAINTED.id
+					  || id == Blocks.STAIRS_PLANKS_PAINTED.id || id == Blocks.DOOR_PLANKS_PAINTED_BOTTOM.id || id == Blocks.DOOR_PLANKS_PAINTED_TOP.id
+					  || id == Blocks.TRAPDOOR_PLANKS_PAINTED.id)
 				{
 					for (int i = 0x10; i < 0x100; i += 0x10)
 					{
@@ -162,7 +165,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 				creativeItems.add(new ItemStack(Item.itemsList[i]));
 				count++;
 
-				if (i == Item.coal.id)
+				if (i == Items.COAL.id)
 				{
 					for (int j = 1; j < 2; j++)
 					{
@@ -171,7 +174,7 @@ public class ContainerPlayerCreative extends ContainerPlayer
 					}
 				}
 
-				if (i == Item.dye.id || i == Item.doorOakPainted.id)
+				if (i == Items.DYE.id || i == Items.DOOR_OAK_PAINTED.id)
 				{
 					for (int j = 1; j < 16; j++)
 					{
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerFlag.java b/src/main/java/net/minecraft/core/player/inventory/menu/FlagMenu.java
similarity index 56%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerFlag.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/FlagMenu.java
index a3ca971a2..c30009e30 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerFlag.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/FlagMenu.java
@@ -1,75 +1,76 @@
-package net.minecraft.core.player.inventory;
-
-import java.util.List;
-
-import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotDye;
-
-public class ContainerFlag extends Container {
-	public TileEntityFlag tileEntity;
-
-	public ContainerFlag(IInventory inv, TileEntityFlag flag) {
-		this.tileEntity = flag;
-
-		// Dye slots
-		addSlot(new SlotDye(flag, 36, 129, 10));
-		addSlot(new SlotDye(flag, 37, 129, 32));
-		addSlot(new SlotDye(flag, 38, 129, 54));
-
-		// Player inv slots
-		for (int y = 0; y < 3; y++) {
-			for (int x = 0; x < 9; x++) {
-				addSlot(new Slot(inv, x + y * 9 + 9, 8 + x * 18, 113 + y * 18));
-			}
-		}
-
-		// Player hotbar
-		for (int i = 0; i < 9; i++) {
-			addSlot(new Slot(inv, i, 8 + i * 18, 171));
-		}
-	}
-
-	/*
-	 *   0 -   2 Dye Slots
-	 *   3 -  29 Inventory
-	 *  30 -  38 Hotbar
-	 */
-	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 0 && slot.id <= 2) {
-			// Dye Slots
-			return getSlots(0, 3, false);
-		}
-		if(action == InventoryAction.MOVE_SIMILAR) {
-			// Full Inventory
-			return getSlots(3, 36, false);
-		}
-		if(action == InventoryAction.MOVE_ALL) {
-			if(slot.id < 27) {
-				// Main Inventory
-				return getSlots(3, 27, false);
-			}else {
-				// Hotbar
-				return getSlots(30, 9, false);
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 0 && slot.id <= 2) {
-			// Dye Slots
-			return getSlots(3, 36, false); // Into Inventory
-		}
-		return getSlots(0, 3, false); // Dye Slots
-	}
-
-	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
-		return tileEntity.canInteractWith(entityplayer);
-	}
-}
+package net.minecraft.core.player.inventory.menu;
+
+import java.util.List;
+
+import net.minecraft.core.InventoryAction;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.slot.Slot;
+import net.minecraft.core.player.inventory.slot.DyeSlot;
+
+public class FlagMenu extends AbstractContainerMenu {
+	public FlagBlockEntity flag;
+
+	public FlagMenu(Container inv, FlagBlockEntity flag) {
+		this.flag = flag;
+
+		// Dye slots
+		addSlot(new DyeSlot(flag, 36, 129, 10));
+		addSlot(new DyeSlot(flag, 37, 129, 32));
+		addSlot(new DyeSlot(flag, 38, 129, 54));
+
+		// Player inv slots
+		for (int y = 0; y < 3; y++) {
+			for (int x = 0; x < 9; x++) {
+				addSlot(new Slot(inv, x + y * 9 + 9, 8 + x * 18, 113 + y * 18));
+			}
+		}
+
+		// Player hotbar
+		for (int i = 0; i < 9; i++) {
+			addSlot(new Slot(inv, i, 8 + i * 18, 171));
+		}
+	}
+
+	/*
+	 *   0 -   2 Dye Slots
+	 *   3 -  29 Inventory
+	 *  30 -  38 Hotbar
+	 */
+	@Override
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 0 && slot.index <= 2) {
+			// Dye Slots
+			return getSlots(0, 3, false);
+		}
+		if(action == InventoryAction.MOVE_SIMILAR) {
+			// Full Inventory
+			return getSlots(3, 36, false);
+		}
+		if(action == InventoryAction.MOVE_ALL) {
+			if(slot.index < 27) {
+				// Main Inventory
+				return getSlots(3, 27, false);
+			}else {
+				// Hotbar
+				return getSlots(30, 9, false);
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 0 && slot.index <= 2) {
+			// Dye Slots
+			return getSlots(3, 36, false); // Into Inventory
+		}
+		return getSlots(0, 3, false); // Dye Slots
+	}
+
+	@Override
+	public boolean stillValid(Player entityplayer) {
+		return flag.stillValid(entityplayer);
+	}
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/menu/FurnaceMenu.java b/src/main/java/net/minecraft/core/player/inventory/menu/FurnaceMenu.java
new file mode 100644
index 000000000..22bb60279
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/FurnaceMenu.java
@@ -0,0 +1,150 @@
+package net.minecraft.core.player.inventory.menu;
+
+import java.util.List;
+
+import net.minecraft.core.InventoryAction;
+import net.minecraft.core.block.entity.FurnaceBlockEntity;
+import net.minecraft.core.crafting.ContainerListener;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.slot.Slot;
+import net.minecraft.core.player.inventory.slot.FurnaceSlot;
+
+public class FurnaceMenu extends AbstractContainerMenu {
+
+	public FurnaceBlockEntity furnace;
+	private int currentCookTime;
+	private int currentBurnTime;
+	private int itemBurnTime;
+	private int itemCookTime;
+
+	public FurnaceMenu(Inventory inventoryplayer, FurnaceBlockEntity tileentityfurnace) {
+		currentCookTime = 0;
+		currentBurnTime = 0;
+		itemCookTime = 0;
+		itemBurnTime = 0;
+		furnace = tileentityfurnace;
+		addSlot(new Slot(tileentityfurnace, 0, 56, 17));
+		addSlot(new Slot(tileentityfurnace, 1, 56, 53));
+		addSlot(new FurnaceSlot(inventoryplayer.player, tileentityfurnace, 2, 116, 35));
+		for (int i = 0; i < 3; i++) {
+			for (int k = 0; k < 9; k++) {
+				addSlot(new Slot(inventoryplayer, k + i * 9 + 9, 8 + k * 18, 84 + i * 18));
+			}
+
+		}
+
+		for (int j = 0; j < 9; j++) {
+			addSlot(new Slot(inventoryplayer, j, 8 + j * 18, 142));
+		}
+
+	}
+
+	@Override
+	public void broadcastChanges() {
+		super.broadcastChanges();
+		for (ContainerListener crafter : containerListeners) {
+            if(currentCookTime != furnace.currentCookTime) {
+				crafter.updateCraftingInventoryInfo(this, 0, furnace.currentCookTime);
+			}
+			if(currentBurnTime != furnace.currentBurnTime) {
+				crafter.updateCraftingInventoryInfo(this, 1, furnace.currentBurnTime);
+			}
+			if(itemCookTime != furnace.maxCookTime) {
+				crafter.updateCraftingInventoryInfo(this, 2, furnace.maxCookTime);
+			}
+			if(itemBurnTime != furnace.maxBurnTime) {
+				crafter.updateCraftingInventoryInfo(this, 3, furnace.maxBurnTime);
+			}
+		}
+
+		this.currentCookTime = furnace.currentCookTime;
+		this.currentBurnTime = furnace.currentBurnTime;
+		itemCookTime = furnace.maxCookTime;
+		itemBurnTime = furnace.maxBurnTime;
+	}
+
+	@Override
+	public void setData(int id, int value) {
+		if(id == 0) {
+			furnace.currentCookTime = value;
+		}
+		if(id == 1) {
+			furnace.currentBurnTime = value;
+		}
+		if(id == 2) {
+			furnace.maxCookTime = value;
+		}
+		if(id == 3) {
+			furnace.maxBurnTime = value;
+		}
+	}
+
+	@Override
+	public boolean stillValid(Player entityplayer) {
+		return furnace.stillValid(entityplayer);
+	}
+
+	/**
+	 *  0 Input
+	 *  1 Fuel
+	 *  2 Output
+	 *  3 - 29 Main Inventory (27x)
+	 * 30 - 38 Hotbar (9x)
+	 */
+
+	@Override
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 0 && slot.index <= 3) return getSlots(slot.index, 1, false);
+
+		if(action == InventoryAction.MOVE_ALL) {
+			if(slot.index >= 3 && slot.index <= 30) {
+				// Main Inventory
+				return getSlots(3, 27, false);
+			}
+			if(slot.index >= 30 && slot.index <= 38) {
+				// Hotbar
+				return getSlots(30, 9, false);
+			}
+		}
+		if(slot.index >= 3 && slot.index <= 38) {
+			// Full Inventory
+			return getSlots(3, 36, false);
+		}
+		return null;
+	}
+
+	@Override
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 3 && slot.index <= 39) {
+			// Full Inventory
+			if(action != InventoryAction.MOVE_ALL) {
+				if(target == 1) {
+					return getSlots(0, 1, false); // Into Ingredient Slot
+				}
+				if(target == 2) {
+					return getSlots(1, 1, false); // Into Fuel Slot
+				}
+			}
+			if(slot.index >= 3 && slot.index <= 29) {
+				// Main Inventory
+				return getSlots(30, 9, false); // Into Hotbar
+			}
+			if(slot.index >= 31 && slot.index <= 38) {
+				// Hotbar
+				return getSlots(3, 27, false); // Into Main Inventory
+			}
+		}
+		if(slot.index >= 0 && slot.index <= 2) {
+			if(slot.index == 2) {
+				// Output
+				return getSlots(3, 36, true);
+			}else {
+				// Input and Fuel
+				return getSlots(3, 36, false);
+			}
+		}
+
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/player/inventory/menu/GuidebookMenu.java b/src/main/java/net/minecraft/core/player/inventory/menu/GuidebookMenu.java
new file mode 100644
index 000000000..e7132e011
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/GuidebookMenu.java
@@ -0,0 +1,34 @@
+package net.minecraft.core.player.inventory.menu;
+
+import net.minecraft.core.InventoryAction;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.slot.Slot;
+
+import java.util.List;
+
+public class GuidebookMenu extends AbstractContainerMenu
+{
+
+	@Override
+	public boolean stillValid(final Player entityplayer)
+	{
+		return true;
+	}
+
+	@Override
+	public ItemStack clicked(InventoryAction action, int[] args, Player player) {
+		return null;
+	}
+
+	@Override
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		return null;
+	}
+	
+	@Override
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		return null;
+	}
+	
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayer.java b/src/main/java/net/minecraft/core/player/inventory/menu/InventoryMenu.java
similarity index 53%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerPlayer.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/InventoryMenu.java
index a1deaa12d..9a8ae7979 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerPlayer.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/InventoryMenu.java
@@ -1,37 +1,46 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 import net.minecraft.core.InventoryAction;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.container.ResultContainer;
 import net.minecraft.core.player.inventory.slot.Slot;
-import net.minecraft.core.player.inventory.slot.SlotArmor;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
+import net.minecraft.core.player.inventory.slot.ArmorSlot;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
 
 import java.util.List;
 
-public class ContainerPlayer extends Container {
+public class InventoryMenu extends AbstractContainerMenu {
 
-	public ContainerPlayer(InventoryPlayer inventory) {
+	public CraftingContainer craftSlots;
+	public Container resultSlots;
+	public boolean active;
+	public Inventory inventory;
+
+	public InventoryMenu(Inventory inventory) {
 		this(inventory, true);
 	}
 
-	public ContainerPlayer(InventoryPlayer inventory, boolean isNotClientSide) {
-		craftMatrix = new InventoryCrafting(this, 2, 2);
-		craftResult = new InventoryCraftResult();
-		this.isNotClientSide = isNotClientSide;
-		playerInv = inventory;
-		addSlot(new SlotCrafting(inventory.player, craftMatrix, craftResult, 0, 144, 36));
+	public InventoryMenu(Inventory inventory, boolean active) {
+		craftSlots = new CraftingContainer(this, 2, 2);
+		resultSlots = new ResultContainer();
+		this.active = active;
+		this.inventory = inventory;
+		addSlot(new ResultSlot(inventory.player, craftSlots, resultSlots, 0, 144, 36));
 		
 		for (int i = 0; i < 2; i++) {
 			for (int j = 0; j < 2; j++) {
-				addSlot(new Slot(craftMatrix, j + i * 2, 88 + j * 18, 26 + i * 18));
+				addSlot(new Slot(craftSlots, j + i * 2, 88 + j * 18, 26 + i * 18));
 			}
 		}
 		
 		for (int i = 0; i < 4; i++) {
 			int j1 = i;
-			addSlot(new SlotArmor(this, inventory, inventory.getSizeInventory() - 1 - i, 8, 8 + i * 18, j1));
+			addSlot(new ArmorSlot(this, inventory, inventory.getContainerSize() - 1 - i, 8, 8 + i * 18, j1));
 		}
 		
 		for (int i = 0; i < 3; i++) {
@@ -44,22 +53,22 @@ public class ContainerPlayer extends Container {
 			addSlot(new Slot(inventory, i, 8 + i * 18, 142));
 		}
 
-		onCraftMatrixChanged(craftMatrix);
+		slotsChanged(craftSlots);
 	}
 
 	@Override
-	public void onCraftMatrixChanged(IInventory iinventory) {
-		craftResult.setInventorySlotContents(0, Registries.RECIPES.findMatchingRecipe(craftMatrix));
+	public void slotsChanged(Container iinventory) {
+		resultSlots.setItem(0, Registries.RECIPES.findMatchingRecipe(craftSlots));
 	}
 
 	@Override
-	public void onCraftGuiClosed(EntityPlayer player) {
+	public void onCraftGuiClosed(Player player) {
 		super.onCraftGuiClosed(player);
 		boolean insert = false;
 		for (int i = 0; i < 4; i++) {
-			ItemStack itemstack = craftMatrix.getStackInSlot(i);
+			ItemStack itemstack = craftSlots.getItem(i);
 			if(itemstack != null) {
-				craftMatrix.setInventorySlotContents(i, null);
+				craftSlots.setItem(i, null);
 				storeOrDropItem(player, itemstack);
 				insert = true;
 			}
@@ -70,7 +79,7 @@ public class ContainerPlayer extends Container {
 	}
 
 	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
+	public boolean stillValid(Player entityplayer) {
 		return true;
 	}
 
@@ -83,30 +92,30 @@ public class ContainerPlayer extends Container {
 	 */
 
 	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id == 0) {
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index == 0) {
 			// Craft Result
 			return getSlots(0, 1, false);
 		}
-		if(slot.id >= 1 && slot.id <= 4) {
+		if(slot.index >= 1 && slot.index <= 4) {
     		// Crafting Grid
 			return getSlots(1, 4, false);
 		}
-		if(slot.id >= 5 && slot.id <= 8) {
+		if(slot.index >= 5 && slot.index <= 8) {
 			// Armor
 			return getSlots(5, 4, false);
 		}
 		if(action == InventoryAction.MOVE_SIMILAR) {
-			if(slot.id >= 9 && slot.id <= 44) {
+			if(slot.index >= 9 && slot.index <= 44) {
 				// Full Inventory
 				return getSlots(9, 36, false);
 			}	
 		}else {
-			if(slot.id >= 9 && slot.id <= 35) {
+			if(slot.index >= 9 && slot.index <= 35) {
 				// Main Inventory
 				return getSlots(9, 27, false);
 			}
-			if(slot.id >= 36 && slot.id <= 44) {
+			if(slot.index >= 36 && slot.index <= 44) {
 				// Hotbar
 				return getSlots(36, 9, false);
 			}
@@ -115,8 +124,8 @@ public class ContainerPlayer extends Container {
 	}
 	
 	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 9 && slot.id <= 44) {
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 9 && slot.index <= 44) {
 			// Full Inventory
 			if(target == 1) {
 				return getSlots(1, 4, false); // Crafting
@@ -125,7 +134,7 @@ public class ContainerPlayer extends Container {
 				return getSlots(5, 4, false); // Armor
 			}
 			
-			if(slot.id < 36) {
+			if(slot.index < 36) {
 				// Main Inventory
 				return getSlots(36, 9, false); // Hotbar
 			}else {
@@ -133,7 +142,7 @@ public class ContainerPlayer extends Container {
 				return getSlots(9, 27, false); // Main Inventory
 			}
 		}else {
-			if(slot.id == 0) {
+			if(slot.index == 0) {
 				// Crafting Result
 				return getSlots(9, 36, true); // Full Inventory, Last First
 			}else {
@@ -143,9 +152,4 @@ public class ContainerPlayer extends Container {
 			
 		}
 	}
-
-	public InventoryCrafting craftMatrix;
-	public IInventory craftResult;
-	public boolean isNotClientSide;
-	public InventoryPlayer playerInv;
 }
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerDispenser.java b/src/main/java/net/minecraft/core/player/inventory/menu/TrapMenu.java
similarity index 51%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerDispenser.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/TrapMenu.java
index 86f58b3a5..ded9ce91e 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerDispenser.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/TrapMenu.java
@@ -1,37 +1,38 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 import java.util.List;
 
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.entity.TileEntityDispenser;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.player.inventory.slot.Slot;
 
-public class ContainerDispenser extends Container {
+public class TrapMenu extends AbstractContainerMenu {
 
-	public TileEntityDispenser tileEntity;
+	public DispenserBlockEntity trap;
 	
 	private int dispenserSlotsStart;
 	private int inventorySlotsStart;
 	private int hotbarSlotsStart;
 
-	public ContainerDispenser(IInventory iinventory, TileEntityDispenser tileentitydispenser) {
-		tileEntity = tileentitydispenser;
+	public TrapMenu(Container container, DispenserBlockEntity trap) {
+		this.trap = trap;
 		for (int i = 0; i < 3; i++) {
 			for (int l = 0; l < 3; l++) {
-				addSlot(new Slot(tileentitydispenser, l + i * 3, 62 + l * 18, 17 + i * 18));
+				addSlot(new Slot(trap, l + i * 3, 62 + l * 18, 17 + i * 18));
 			}
 
 		}
 
 		for (int j = 0; j < 3; j++) {
 			for (int i1 = 0; i1 < 9; i1++) {
-				addSlot(new Slot(iinventory, i1 + j * 9 + 9, 8 + i1 * 18, 84 + j * 18));
+				addSlot(new Slot(container, i1 + j * 9 + 9, 8 + i1 * 18, 84 + j * 18));
 			}
 		}
 
 		for (int k = 0; k < 9; k++) {
-			addSlot(new Slot(iinventory, k, 8 + k * 18, 142));
+			addSlot(new Slot(container, k, 8 + k * 18, 142));
 		}
 		
 		dispenserSlotsStart = 0;
@@ -40,26 +41,26 @@ public class ContainerDispenser extends Container {
 	}
 	
 	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
-		return tileEntity.canInteractWith(entityplayer);
+	public boolean stillValid(Player entityplayer) {
+		return trap.stillValid(entityplayer);
 	}
 
 	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= dispenserSlotsStart && slot.id < inventorySlotsStart) {
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= dispenserSlotsStart && slot.index < inventorySlotsStart) {
 			return getSlots(dispenserSlotsStart, 9, false);
 		}
 		
 		if(action == InventoryAction.MOVE_ALL) {
-			if(slot.id >= inventorySlotsStart && slot.id < hotbarSlotsStart) {
+			if(slot.index >= inventorySlotsStart && slot.index < hotbarSlotsStart) {
 				return getSlots(inventorySlotsStart, 27, false);
 			}
-			if(slot.id >= hotbarSlotsStart) {
+			if(slot.index >= hotbarSlotsStart) {
 				return getSlots(hotbarSlotsStart, 9, false);
 			}
 		}
 		if(action == InventoryAction.MOVE_SIMILAR) {
-			if(slot.id >= inventorySlotsStart) {
+			if(slot.index >= inventorySlotsStart) {
 				return getSlots(inventorySlotsStart, 36, false);
 			}
 		}
@@ -67,8 +68,8 @@ public class ContainerDispenser extends Container {
 	}
 
 	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= dispenserSlotsStart && slot.id < inventorySlotsStart) {
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= dispenserSlotsStart && slot.index < inventorySlotsStart) {
 			return getSlots(inventorySlotsStart, 36, false);
 		}else {
 			return getSlots(dispenserSlotsStart, 9, false);
diff --git a/src/main/java/net/minecraft/core/player/inventory/ContainerTrommel.java b/src/main/java/net/minecraft/core/player/inventory/menu/TrommelMenu.java
similarity index 67%
rename from src/main/java/net/minecraft/core/player/inventory/ContainerTrommel.java
rename to src/main/java/net/minecraft/core/player/inventory/menu/TrommelMenu.java
index 40170fb14..843f95aa9 100644
--- a/src/main/java/net/minecraft/core/player/inventory/ContainerTrommel.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/TrommelMenu.java
@@ -1,22 +1,23 @@
-package net.minecraft.core.player.inventory;
+package net.minecraft.core.player.inventory.menu;
 
 import java.util.List;
 
 import net.minecraft.core.InventoryAction;
-import net.minecraft.core.block.entity.TileEntityTrommel;
+import net.minecraft.core.block.entity.TrommelBlockEntity;
 
-import net.minecraft.core.crafting.ICrafting;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.crafting.ContainerListener;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.player.inventory.slot.Slot;
 
-public class ContainerTrommel extends Container {
+public class TrommelMenu extends AbstractContainerMenu {
 
-	private TileEntityTrommel trommel;
+	private TrommelBlockEntity trommel;
 	private int cookTime = 0;
 	private int burnTime = 0;
 	private int itemBurnTime = 0;
 
-	public ContainerTrommel(InventoryPlayer inventoryplayer, TileEntityTrommel tileEntityTrommel) {
+	public TrommelMenu(Inventory inventoryplayer, TrommelBlockEntity tileEntityTrommel) {
 		trommel = tileEntityTrommel;
 		
 		// Item Slots
@@ -39,10 +40,10 @@ public class ContainerTrommel extends Container {
 	}
 
 	@Override
-	public void updateInventory() {
-		super.updateInventory();
-		for (int i = 0; i < crafters.size(); i++) {
-			ICrafting icrafting = (ICrafting) crafters.get(i);
+	public void broadcastChanges() {
+		super.broadcastChanges();
+		for (int i = 0; i < containerListeners.size(); i++) {
+			ContainerListener icrafting = (ContainerListener) containerListeners.get(i);
 			if(cookTime != trommel.itemPopTime) {
 				icrafting.updateCraftingInventoryInfo(this, 0, trommel.itemPopTime);
 			}
@@ -60,7 +61,7 @@ public class ContainerTrommel extends Container {
 	}
 
 	@Override
-	public void updateClientProgressBar(int id, int value) {
+	public void setData(int id, int value) {
 		if(id == 0) {
 			trommel.itemPopTime = (int) value;
 		}
@@ -73,8 +74,8 @@ public class ContainerTrommel extends Container {
 	}
 
 	@Override
-	public boolean isUsableByPlayer(EntityPlayer entityplayer) {
-		return trommel.canInteractWith(entityplayer);
+	public boolean stillValid(Player entityplayer) {
+		return trommel.stillValid(entityplayer);
 	}
 	
 	/*
@@ -85,25 +86,25 @@ public class ContainerTrommel extends Container {
 	 */
 
 	@Override
-	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 0 && slot.id <= 3) {
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 0 && slot.index <= 3) {
 			return getSlots(0, 4, false);
 		}
-		if(slot.id == 4) {
+		if(slot.index == 4) {
 			return getSlots(4, 1, false);
 		}
 		if(action == InventoryAction.MOVE_ALL) {
-			if(slot.id >= 5 && slot.id <= 31) {
+			if(slot.index >= 5 && slot.index <= 31) {
 				// Main Inventory
 				return getSlots(5, 27, false);
 			}
-			if(slot.id >= 32 && slot.id <= 40) {
+			if(slot.index >= 32 && slot.index <= 40) {
 				// Hotbar
 				return getSlots(32, 9, false);
 			}
 		}
 		if(action == InventoryAction.MOVE_SIMILAR) {
-			if(slot.id >= 5 && slot.id <= 40) {
+			if(slot.index >= 5 && slot.index <= 40) {
 				// Full Inventory
 				return getSlots(5, 36, false);
 			}
@@ -112,12 +113,12 @@ public class ContainerTrommel extends Container {
 	}
 
 	@Override
-	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, EntityPlayer player) {
-		if(slot.id >= 0 && slot.id <= 4) {
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= 0 && slot.index <= 4) {
 			// Item and Fuel Slots
 			return getSlots(5, 36, false); // Into Inventory
 		}
-		if(slot.id >= 5 && slot.id <= 40) {
+		if(slot.index >= 5 && slot.index <= 40) {
 			if(target == 1) {
 				return getSlots(0, 4, false); // Into Item Slots
 			}
@@ -125,11 +126,11 @@ public class ContainerTrommel extends Container {
 				return getSlots(4, 1, false); // Into Fuel Slot
 			}
 			
-			if(slot.id >= 5 && slot.id <= 31) {
+			if(slot.index >= 5 && slot.index <= 31) {
 				// Main Inventory
 				return getSlots(32, 9, false); // Into hotbar
 			}
-			if(slot.id >= 32 && slot.id <= 40) {
+			if(slot.index >= 32 && slot.index <= 40) {
 				// Hotbar
 				return getSlots(5, 27, false); // Into Inventory
 			}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/ArmorSlot.java b/src/main/java/net/minecraft/core/player/inventory/slot/ArmorSlot.java
new file mode 100644
index 000000000..f5a38946f
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/ArmorSlot.java
@@ -0,0 +1,95 @@
+package net.minecraft.core.player.inventory.slot;
+
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.IArmorItem;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.block.BlockItem;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.menu.InventoryMenu;
+import net.minecraft.core.player.inventory.container.Container;
+
+public class ArmorSlot extends Slot
+{
+    public static String[] armorOutlines = new String[]{
+            "minecraft:item/armor_helmet_outline",
+            "minecraft:item/armor_chestplate_outline",
+            "minecraft:item/armor_leggings_outline",
+            "minecraft:item/armor_boots_outline"
+    };
+
+    final int armorType;
+    final InventoryMenu menu;
+
+    public ArmorSlot(InventoryMenu menu, Container container, int index, int x, int y, int armorType)
+    {
+        super(container, index, x, y);
+        this.menu = menu;
+        this.armorType = armorType;
+    }
+
+    @Override
+	public int getMaxStackSize()
+    {
+        return 1;
+    }
+
+    @Override
+	public boolean mayPlace(ItemStack itemstack)
+    {
+        if(itemstack.getItem() instanceof IArmorItem)
+        {
+            return ((IArmorItem)itemstack.getItem()).getArmorPiece() == armorType;
+        }
+        if(itemstack.getItem() instanceof BlockItem)
+        {
+            return armorType == IArmorItem.PIECE_HEAD;
+        }
+        else
+        {
+            return false;
+        }
+    }
+    
+    @Override
+	public void setChanged()
+    {
+        super.setChanged();
+        
+        int count = 0;
+        
+        for (int i = 0; i < menu.slots.size(); i++)
+        {
+        	if (menu.slots.get(i) instanceof ArmorSlot)
+        	{
+        		ItemStack stack = menu.slots.get(i).getItem();
+        		if (stack != null && (stack.itemID == Items.ARMOR_BOOTS_CHAINMAIL.id || stack.itemID == Items.ARMOR_HELMET_CHAINMAIL.id || stack.itemID == Items.ARMOR_CHESTPLATE_CHAINMAIL.id || stack.itemID == Items.ARMOR_LEGGINGS_CHAINMAIL.id))
+				{
+        			count++;
+				}
+        	}
+        }
+        
+        if (count == 4)
+        {
+        	menu.inventory.player.triggerAchievement(Achievements.GET_CHAINMAIL);
+        }
+        
+        if (getItem() != null && container instanceof Inventory) {
+            Player player = ((Inventory) container).player;
+            player.world.playSoundAtEntity(player, player, "random.equip", 2f, 1f);
+        }
+    }
+
+    public void set(final ItemStack itemstack)
+    {
+        super.set(itemstack);
+    }
+
+    @Override
+	public String getItemIcon()
+    {
+        return armorOutlines[armorType];
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/CreativeSlot.java b/src/main/java/net/minecraft/core/player/inventory/slot/CreativeSlot.java
new file mode 100644
index 000000000..089368bc7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/CreativeSlot.java
@@ -0,0 +1,76 @@
+package net.minecraft.core.player.inventory.slot;
+
+import net.minecraft.core.item.ItemStack;
+
+public class CreativeSlot extends Slot
+{
+	public ItemStack item;
+
+	public CreativeSlot(final int index, final int x, final int y, final ItemStack item)
+	{
+		super(null, index, x, y);
+		this.item = item;
+	}
+
+
+	@Override
+	public ItemStack remove(final int i)
+	{
+		if (item == null)
+		{
+			return null;
+		}
+		final ItemStack newStack = item.copy();
+		return newStack;
+	}
+
+	@Override
+	public boolean hasItem()
+	{
+		return item != null;
+	}
+
+	@Override
+	public int getMaxStackSize()
+	{
+		return 64;
+	}
+
+	@Override
+	public ItemStack getItem()
+	{
+		if (item == null)
+		{
+			return null;
+		}
+        return item.copy();
+	}
+
+	@Override
+	public void onTake(final ItemStack itemstack)
+	{
+    }
+
+	@Override
+	public void setChanged()
+	{
+		return;
+	}
+
+	@Override
+	public void set(final ItemStack itemstack)
+	{
+		return;
+	}
+	
+	@Override
+	public boolean enableDragAndPickup() {
+		return false;
+	}
+	
+	@Override
+	public boolean allowItemInteraction() {
+		return false;
+	}
+
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/DyeSlot.java b/src/main/java/net/minecraft/core/player/inventory/slot/DyeSlot.java
new file mode 100644
index 000000000..141f358e9
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/DyeSlot.java
@@ -0,0 +1,27 @@
+package net.minecraft.core.player.inventory.slot;
+
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+
+public class DyeSlot extends Slot {
+
+	public DyeSlot(final Container inventory, final int id, final int x, final int y) {
+		super(inventory, id, x, y);
+	}
+
+	@Override
+	public boolean mayPlace(final ItemStack itemstack) {
+		return itemstack != null && itemstack.itemID == Items.DYE.id;
+	}
+
+	@Override
+	public int getMaxStackSize() {
+		return 1;
+	}
+	
+	@Override
+	public boolean allowItemInteraction() {
+		return false;
+	}
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/FurnaceSlot.java b/src/main/java/net/minecraft/core/player/inventory/slot/FurnaceSlot.java
new file mode 100644
index 000000000..9374f1648
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/FurnaceSlot.java
@@ -0,0 +1,55 @@
+package net.minecraft.core.player.inventory.slot;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Slot, Player, ItemStack, Item,
+//            Achievements, IInventory
+
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+
+public class FurnaceSlot extends Slot
+{
+
+    public FurnaceSlot(Player player, Container container, int index, int x, int y)
+    {
+        super(container, index, x, y);
+        thePlayer = player;
+    }
+
+    @Override
+	public boolean mayPlace(ItemStack itemstack)
+    {
+        return false;
+    }
+
+    @Override
+	public void onTake(ItemStack itemstack)
+    {
+        itemstack.onCrafting(thePlayer.world, thePlayer);
+        if(itemstack.itemID == Items.INGOT_IRON.id)
+        {
+            thePlayer.addStat(Achievements.ACQUIRE_IRON, 1);
+        }
+        if(itemstack.itemID == Items.FOOD_FISH_COOKED.id)
+        {
+            thePlayer.addStat(Achievements.COOK_FISH, 1);
+        }
+        super.onTake(itemstack);
+    }
+    
+    @Override
+    public boolean enableDragAndPickup() {
+    	return false;
+    }
+    
+    @Override
+    public boolean allowItemInteraction() {
+    	return false;
+    }
+
+    private Player thePlayer;
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java b/src/main/java/net/minecraft/core/player/inventory/slot/GuidebookSlot.java
similarity index 74%
rename from src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java
rename to src/main/java/net/minecraft/core/player/inventory/slot/GuidebookSlot.java
index 5f80f95ac..631e25bc5 100644
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotGuidebook.java
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/GuidebookSlot.java
@@ -1,20 +1,21 @@
 package net.minecraft.core.player.inventory.slot;
 
-import net.minecraft.client.entity.player.EntityPlayerSP;
+import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
 import net.minecraft.core.achievement.stat.StatList;
 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.entity.player.Player;
+import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.gamemode.Gamemode;
 
 import java.util.List;
 import java.util.Random;
 
-public class SlotGuidebook extends Slot
+public class GuidebookSlot extends Slot
 {
 	public ItemStack item;
 	public RecipeSymbol symbol;
@@ -22,10 +23,10 @@ public class SlotGuidebook extends Slot
 	public int recipeIndex = 0;
 	public int recipeAmount = 0;
 	public boolean isOutput = false;
-	public SlotGuidebook(final int id, final int x, final int y, final RecipeSymbol symbol, final boolean discovered, final RecipeEntryBase<?,?,?> recipe)
+	public GuidebookSlot(final int id, final int x, final int y, final RecipeSymbol symbol, final boolean discovered, final RecipeEntryBase<?,?,?> recipe)
 	{
 		super(null, id, x, y);
-		this.id = id;
+		this.index = id;
 		this.symbol = symbol;
 		if(symbol != null && symbol.getItemGroup() != null){
 			showRandomItem();
@@ -42,7 +43,7 @@ public class SlotGuidebook extends Slot
 
 
 	@Deprecated
-	public SlotGuidebook(final int id, final int x, final int y, final RecipeSymbol symbol, final boolean discovered)
+	public GuidebookSlot(final int id, final int x, final int y, final RecipeSymbol symbol, final boolean discovered)
 	{
 		super(null, id, x, y);
 		this.symbol = symbol;
@@ -55,47 +56,47 @@ public class SlotGuidebook extends Slot
 		this.recipe = null;
 	}
 
-	public SlotGuidebook setAsOutput(){
+	public GuidebookSlot setAsOutput(){
 		this.isOutput = true;
 		return this;
 	}
 
 	@Override
-	public ItemStack decrStackSize(final int i)
+	public ItemStack remove(final int i)
 	{
 		return null;
 	}
 
 	@Override
-	public boolean hasStack()
+	public boolean hasItem()
 	{
 		return item != null;
 	}
 
 	@Override
-	public int getSlotStackLimit()
+	public int getMaxStackSize()
 	{
 		return item.getMaxStackSize();
 	}
 
 	@Override
-	public ItemStack getStack()
+	public ItemStack getItem()
 	{
 		return item;
 	}
 
 	@Override
-	public void onPickupFromSlot(final ItemStack itemstack)
+	public void onTake(final ItemStack itemstack)
 	{
     }
 
 	@Override
-	public void onSlotChanged()
+	public void setChanged()
 	{
     }
 
 	@Override
-	public void putStack(final ItemStack itemstack)
+	public void set(final ItemStack itemstack)
 	{
     }
 
@@ -112,12 +113,12 @@ public class SlotGuidebook extends Slot
 			item = newItem;
 		}
 	}
-	public boolean getIsDiscovered(EntityPlayer player){
+	public boolean getIsDiscovered(Player player){
 		if (item == null || discovered) return true;
-		if (player instanceof EntityPlayerSP){
-			if (!((EntityPlayerSP) player).sender.minecraft.gameSettings.hideUndiscoveredItems.value) return true;
+		if (player instanceof LocalPlayer){
+			if (!((LocalPlayer) player).sender.minecraft.gameSettings.hideUndiscoveredItems.value) return true;
 		}
-		return player.getStat(StatList.pickUpItemStats[item.itemID]) > 0 || player.getGamemode() == Gamemode.creative;
+		return player.getStat(item.getItem().getStat(StatList.STAT_PICKED_UP)) > 0 || player.getGamemode() == Gamemode.creative;
 	}
 
 	public void scrollRecipe(){
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/ResultSlot.java b/src/main/java/net/minecraft/core/player/inventory/slot/ResultSlot.java
new file mode 100644
index 000000000..fb70a181d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/ResultSlot.java
@@ -0,0 +1,80 @@
+package net.minecraft.core.player.inventory.slot;
+
+
+// Referenced classes of package net.minecraft.src:
+//            Slot, Player, ItemStack, Block,
+//            Achievements, Item, IInventory
+
+import net.minecraft.core.achievement.Achievements;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.tool.HoeToolItem;
+import net.minecraft.core.item.tool.PickaxeToolItem;
+import net.minecraft.core.item.tool.SwordToolItem;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.container.CraftingContainer;
+
+public class ResultSlot extends Slot
+{
+	private final Container craftSlots;
+	private Player thePlayer;
+
+    public ResultSlot(Player player, Container craftSlots, Container container, int index, int x, int y)
+    {
+        super(container, index, x, y);
+        thePlayer = player;
+        this.craftSlots = craftSlots;
+    }
+
+    @Override
+	public boolean mayPlace(ItemStack itemstack)
+    {
+        return false;
+    }
+
+	@Override
+	public void onTake(ItemStack itemStack) {
+		itemStack.onCrafting(thePlayer.world, thePlayer);
+
+		Item item = itemStack.getItem();
+		
+		if(item.id == Blocks.WORKBENCH.id) thePlayer.addStat(Achievements.BUILD_WORKBENCH, 1);
+		if(item.id == Blocks.FURNACE_STONE_IDLE.id) thePlayer.addStat(Achievements.BUILD_FURNACE, 1);
+		if(item.id == Items.FOOD_BREAD.id) thePlayer.addStat(Achievements.MAKE_BREAD, 1);
+		if(item.id == Items.FOOD_CAKE.id) thePlayer.addStat(Achievements.BAKE_CAKE, 1);
+		if(item.id == Items.HANDCANNON_UNLOADED.id) thePlayer.addStat(Achievements.CRAFT_HANDCANNON, 1);
+		if(item instanceof HoeToolItem) thePlayer.addStat(Achievements.BUILD_HOE, 1);
+		if(item instanceof SwordToolItem) thePlayer.addStat(Achievements.BUILD_SWORD, 1);
+		if(item instanceof PickaxeToolItem) {
+			PickaxeToolItem itemToolPickaxe = (PickaxeToolItem) item;
+
+			if(itemToolPickaxe.getMaterial().getMiningLevel() > 0) {
+				thePlayer.addStat(Achievements.BUILD_BETTER_PICKAXE, 1);
+			}
+			
+			thePlayer.addStat(Achievements.BUILD_PICKAXE, 1);
+		}
+		if(itemStack.itemID == Items.ARMOR_BOOTS_CHAINMAIL.id
+				|| itemStack.itemID == Items.ARMOR_HELMET_CHAINMAIL.id
+				|| itemStack.itemID == Items.ARMOR_CHESTPLATE_CHAINMAIL.id
+				|| itemStack.itemID == Items.ARMOR_LEGGINGS_CHAINMAIL.id) {
+			thePlayer.addStat(Achievements.REPAIR_ARMOR, 1);
+		}
+
+		Registries.RECIPES.onCraftResult((CraftingContainer) craftSlots);
+	}
+    
+    @Override
+    public boolean enableDragAndPickup() {
+    	return false;
+    }
+    
+    @Override
+    public boolean allowItemInteraction() {
+    	return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/Slot.java b/src/main/java/net/minecraft/core/player/inventory/slot/Slot.java
index d46c04380..75beacaa6 100644
--- a/src/main/java/net/minecraft/core/player/inventory/slot/Slot.java
+++ b/src/main/java/net/minecraft/core/player/inventory/slot/Slot.java
@@ -4,96 +4,96 @@ package net.minecraft.core.player.inventory.slot;
 //            IInventory, ItemStack
 
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.InventoryPlayer;
-import net.minecraft.core.player.inventory.IInventory;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.container.Container;
 import org.jetbrains.annotations.Nullable;
 
 public class Slot
 {
-	protected final int slotIndex;
-	protected final IInventory inventory;
-	public int id;
-	public int xDisplayPosition;
-	public int yDisplayPosition;
+	protected final int slot;
+	protected final Container container;
+	public int index;
+	public int x;
+	public int y;
 	protected boolean discovered;
 
-	public Slot(final IInventory inventory, final int id, final int x, final int y)
+	public Slot(final Container container, final int index, final int x, final int y)
 	{
-		this.inventory = inventory;
-		slotIndex = id;
-		xDisplayPosition = x;
-		yDisplayPosition = y;
+		this.container = container;
+		slot = index;
+		this.x = x;
+		this.y = y;
 		discovered = true;
 	}
 
 	public void sortSlotInventory() {
-		if (inventory != null) {
-			inventory.sortInventory();
+		if (container != null) {
+			container.sortContainer();
 		}
 	}
 
-	public ItemStack decrStackSize(final int i)
+	public ItemStack remove(final int i)
 	{
-		return inventory.decrStackSize(slotIndex, i);
+		return container.removeItem(slot, i);
 	}
 
-	public @Nullable String getBackgroundIconId()
+	public @Nullable String getItemIcon()
 	{
 		return null;
 	}
 
-	public boolean hasStack()
+	public boolean hasItem()
 	{
-		return getStack() != null;
+		return getItem() != null;
 	}
 
-	public int getSlotStackLimit()
+	public int getMaxStackSize()
 	{
-		return inventory.getInventoryStackLimit();
+		return container.getMaxStackSize();
 	}
 
-	public ItemStack getStack()
+	public ItemStack getItem()
 	{
-		return inventory.getStackInSlot(slotIndex);
+		return container.getItem(slot);
 	}
 
-	public boolean isHere(final IInventory iinventory, final int i)
+	public boolean isAt(final Container container, final int i)
 	{
-		return iinventory == inventory && i == slotIndex;
+		return container == this.container && i == slot;
 	}
 
-	public boolean canPutStackInSlot(final ItemStack itemstack)
+	public boolean mayPlace(final ItemStack itemstack)
 	{
 		return true;
 	}
 
-	public void onPickupFromSlot(final ItemStack itemstack)
+	public void onTake(final ItemStack itemstack)
 	{
-		onSlotChanged();
+		setChanged();
 	}
 
-	public void onSlotChanged()
+	public void setChanged()
 	{
-		inventory.onInventoryChanged();
+		container.setChanged();
 	}
 
-	public IInventory getInventory() {
-		return inventory;
+	public Container getContainer() {
+		return container;
 	}
 
-	public void putStack(final ItemStack itemstack)
+	public void set(final ItemStack itemstack)
 	{
-		inventory.setInventorySlotContents(slotIndex, itemstack);
-		onSlotChanged();
+		container.setItem(slot, itemstack);
+		setChanged();
 
-		if (inventory instanceof InventoryPlayer)
+		if (container instanceof Inventory)
 		{
-			final InventoryPlayer inventoryPlayer = (InventoryPlayer) inventory;
+			final Inventory inventory = (Inventory) this.container;
 
 			if(itemstack != null)
-				inventoryPlayer.player.addStat(StatList.pickUpItemStats[itemstack.itemID], 1);
+				inventory.player.addStat(itemstack.getItem().getStat(StatList.STAT_PICKED_UP), 1);
 
 		}
 	}
@@ -105,10 +105,8 @@ public class Slot
 	public boolean allowItemInteraction() {
 		return true;
 	}
-	public void setDiscovered(Boolean flag){
-		discovered = flag;
-	}
-	public boolean getIsDiscovered(EntityPlayer player){
+
+	public boolean getIsDiscovered(Player player){
 		return discovered;
 	}
 
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotArmor.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotArmor.java
deleted file mode 100644
index 1e9f9e774..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotArmor.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-// Referenced classes of package net.minecraft.src:
-//            Slot, ItemStack, ItemArmor, Item, 
-//            Block, ContainerPlayer, IInventory
-
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemArmor;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.block.ItemBlock;
-import net.minecraft.core.player.inventory.ContainerPlayer;
-import net.minecraft.core.player.inventory.IInventory;
-
-public class SlotArmor extends Slot
-{
-    public static String[] armorOutlines = new String[]{
-            "minecraft:item/armor_helmet_outline",
-            "minecraft:item/armor_chestplate_outline",
-            "minecraft:item/armor_leggings_outline",
-            "minecraft:item/armor_boots_outline"
-    };
-
-    public SlotArmor(ContainerPlayer containerplayer, IInventory iinventory, int i, int j, int k, int l)
-    {
-        super(iinventory, i, j, k);
-        inventory = containerplayer;
-        armorType = l;
-    }
-
-    @Override
-	public int getSlotStackLimit()
-    {
-        return 1;
-    }
-
-    @Override
-	public boolean canPutStackInSlot(ItemStack itemstack)
-    {
-        if(itemstack.getItem() instanceof ItemArmor)
-        {
-            return ((ItemArmor)itemstack.getItem()).armorPiece == armorType;
-        }
-        if(itemstack.getItem() instanceof ItemBlock)
-        {
-            return armorType == 0;
-        }
-        if(itemstack.getItem().id == Item.armorQuiverGold.id || itemstack.getItem().id == Item.armorQuiver.id)
-        {
-            return armorType == 1;
-        }
-        if(itemstack.getItem().id == Item.armorBootsIceskates.id) {
-            return armorType == 3;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    @Override
-	public void onSlotChanged()
-    {
-        super.onSlotChanged();
-        
-        int count = 0;
-        
-        for (int i = 0; i < inventory.inventorySlots.size(); i++)
-        {
-        	if (inventory.inventorySlots.get(i) instanceof SlotArmor)
-        	{
-        		ItemStack stack = ((Slot)inventory.inventorySlots.get(i)).getStack();
-        		if (stack != null && (stack.itemID == Item.armorBootsChainmail.id || stack.itemID == Item.armorHelmetChainmail.id || stack.itemID == Item.armorChestplateChainmail.id || stack.itemID == Item.armorLeggingsChainmail.id))
-				{
-        			count++;
-				}
-        	}
-        }
-        
-        if (count == 4)
-        {
-        	inventory.playerInv.player.triggerAchievement(AchievementList.GET_CHAINMAIL);
-        }
-    }
-
-    @Override
-	public String getBackgroundIconId()
-    {
-        return armorOutlines[armorType];
-    }
-
-    final int armorType; /* synthetic field */
-    final ContainerPlayer inventory; /* synthetic field */
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotCrafting.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotCrafting.java
deleted file mode 100644
index f4b1bbc9a..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotCrafting.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Slot, EntityPlayer, ItemStack, Block, 
-//            AchievementList, Item, IInventory
-
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.item.tool.ItemToolHoe;
-import net.minecraft.core.item.tool.ItemToolPickaxe;
-import net.minecraft.core.item.tool.ItemToolSword;
-import net.minecraft.core.player.inventory.IInventory;
-import net.minecraft.core.player.inventory.InventoryCrafting;
-
-public class SlotCrafting extends Slot
-{
-
-    public SlotCrafting(EntityPlayer entityplayer, IInventory iinventory, IInventory iinventory1, int i, int j, int k)
-    {
-        super(iinventory1, i, j, k);
-        thePlayer = entityplayer;
-        craftMatrix = iinventory;
-    }
-
-    @Override
-	public boolean canPutStackInSlot(ItemStack itemstack)
-    {
-        return false;
-    }
-
-	@Override
-	public void onPickupFromSlot(ItemStack itemStack) {
-		itemStack.onCrafting(thePlayer.world, thePlayer);
-
-		Item item = itemStack.getItem();
-		
-		if(item.id == Block.workbench.id) thePlayer.addStat(AchievementList.BUILD_WORKBENCH, 1);
-		if(item.id == Block.furnaceStoneIdle.id) thePlayer.addStat(AchievementList.BUILD_FURNACE, 1);
-		if(item.id == Item.foodBread.id) thePlayer.addStat(AchievementList.MAKE_BREAD, 1);
-		if(item.id == Item.foodCake.id) thePlayer.addStat(AchievementList.BAKE_CAKE, 1);
-		if(item.id == Item.handcannonUnloaded.id) thePlayer.addStat(AchievementList.CRAFT_HANDCANNON, 1);
-		if(item instanceof ItemToolHoe) thePlayer.addStat(AchievementList.BUILD_HOE, 1);
-		if(item instanceof ItemToolSword) thePlayer.addStat(AchievementList.BUILD_SWORD, 1);
-		if(item instanceof ItemToolPickaxe) {
-			ItemToolPickaxe itemToolPickaxe = (ItemToolPickaxe) item;
-
-			if(itemToolPickaxe.getMaterial().getMiningLevel() > 0) {
-				thePlayer.addStat(AchievementList.BUILD_BETTER_PICKAXE, 1);
-			}
-			
-			thePlayer.addStat(AchievementList.BUILD_PICKAXE, 1);
-		}
-		if(itemStack.itemID == Item.armorBootsChainmail.id
-				|| itemStack.itemID == Item.armorHelmetChainmail.id
-				|| itemStack.itemID == Item.armorChestplateChainmail.id
-				|| itemStack.itemID == Item.armorLeggingsChainmail.id) {
-			thePlayer.addStat(AchievementList.REPAIR_ARMOR, 1);
-		}
-
-		Registries.RECIPES.onCraftResult((InventoryCrafting) craftMatrix);
-	}
-    
-    @Override
-    public boolean enableDragAndPickup() {
-    	return false;
-    }
-    
-    @Override
-    public boolean allowItemInteraction() {
-    	return false;
-    }
-
-    private final IInventory craftMatrix;
-    private EntityPlayer thePlayer;
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotCreative.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotCreative.java
deleted file mode 100644
index 14f951445..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotCreative.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-import net.minecraft.core.item.ItemStack;
-
-public class SlotCreative extends Slot
-{
-	public ItemStack item;
-
-	public SlotCreative(final int i, final int j, final int k, final ItemStack item)
-	{
-		super(null, i, j, k);
-		this.item = item;
-	}
-
-
-	@Override
-	public ItemStack decrStackSize(final int i)
-	{
-		if (item == null)
-		{
-			return null;
-		}
-		final ItemStack newStack = item.copy();
-		/*if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL))
-		{
-			newStack.stackSize = newStack.getMaxStackSize();
-		}*/
-		return newStack;
-	}
-
-	@Override
-	public boolean hasStack()
-	{
-		return item != null;
-	}
-
-	@Override
-	public int getSlotStackLimit()
-	{
-		return 64;
-	}
-
-	@Override
-	public ItemStack getStack()
-	{
-		if (item == null)
-		{
-			return null;
-		}
-		final ItemStack newStack = item.copy();
-		/*if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL))
-		{
-			newStack.stackSize = newStack.getMaxStackSize();
-		}*/
-		return newStack;
-	}
-
-	@Override
-	public void onPickupFromSlot(final ItemStack itemstack)
-	{
-		return;
-	}
-
-	@Override
-	public void onSlotChanged()
-	{
-		return;
-	}
-
-	@Override
-	public void putStack(final ItemStack itemstack)
-	{
-		return;
-	}
-	
-	@Override
-	public boolean enableDragAndPickup() {
-		return false;
-	}
-	
-	@Override
-	public boolean allowItemInteraction() {
-		return false;
-	}
-
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotDye.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotDye.java
deleted file mode 100644
index 4d2d79d8a..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotDye.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
-
-public class SlotDye extends Slot {
-
-	public SlotDye(final IInventory inventory, final int id, final int x, final int y) {
-		super(inventory, id, x, y);
-	}
-
-	@Override
-	public boolean canPutStackInSlot(final ItemStack itemstack) {
-		return itemstack != null && itemstack.itemID == Item.dye.id;
-	}
-
-	@Override
-	public int getSlotStackLimit() {
-		return 1;
-	}
-	
-	@Override
-	public boolean allowItemInteraction() {
-		return false;
-	}
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotFurnace.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotFurnace.java
deleted file mode 100644
index 91c1a64d3..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotFurnace.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Slot, EntityPlayer, ItemStack, Item, 
-//            AchievementList, IInventory
-
-import net.minecraft.core.achievement.AchievementList;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
-
-public class SlotFurnace extends Slot
-{
-
-    public SlotFurnace(EntityPlayer entityplayer, IInventory iinventory, int i, int j, int k)
-    {
-        super(iinventory, i, j, k);
-        thePlayer = entityplayer;
-    }
-
-    @Override
-	public boolean canPutStackInSlot(ItemStack itemstack)
-    {
-        return false;
-    }
-
-    @Override
-	public void onPickupFromSlot(ItemStack itemstack)
-    {
-        itemstack.onCrafting(thePlayer.world, thePlayer);
-        if(itemstack.itemID == Item.ingotIron.id)
-        {
-            thePlayer.addStat(AchievementList.ACQUIRE_IRON, 1);
-        }
-        if(itemstack.itemID == Item.foodFishCooked.id)
-        {
-            thePlayer.addStat(AchievementList.COOK_FISH, 1);
-        }
-        super.onPickupFromSlot(itemstack);
-    }
-    
-    @Override
-    public boolean enableDragAndPickup() {
-    	return false;
-    }
-    
-    @Override
-    public boolean allowItemInteraction() {
-    	return false;
-    }
-
-    private EntityPlayer thePlayer;
-}
diff --git a/src/main/java/net/minecraft/core/player/inventory/slot/SlotTrommel.java b/src/main/java/net/minecraft/core/player/inventory/slot/SlotTrommel.java
deleted file mode 100644
index f2c906141..000000000
--- a/src/main/java/net/minecraft/core/player/inventory/slot/SlotTrommel.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.minecraft.core.player.inventory.slot;
-
-
-// Referenced classes of package net.minecraft.src:
-//            Slot, EntityPlayer, ItemStack, Item,
-//            AchievementList, IInventory
-
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.player.inventory.IInventory;
-
-public class SlotTrommel extends Slot
-{
-
-    public SlotTrommel(EntityPlayer entityplayer, IInventory iinventory, int i, int j, int k)
-    {
-        super(iinventory, i, j, k);
-        thePlayer = entityplayer;
-    }
-
-    @Override
-	public boolean canPutStackInSlot(ItemStack itemstack)
-    {
-        return false;
-    }
-    
-    @Override
-    public boolean allowItemInteraction() {
-    	return false;
-    }
-
-    private EntityPlayer thePlayer;
-}
diff --git a/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java b/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java
deleted file mode 100644
index 15786a4a3..000000000
--- a/src/main/java/net/minecraft/core/sound/BlockSoundDispatcher.java
+++ /dev/null
@@ -1,424 +0,0 @@
-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.permafrostPolished, 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.permafrostCarved, 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.slabPermafrostPolished, BlockSounds.STONE);
-        addDispatch(Block.slabCobblePermafrost, BlockSounds.STONE);
-        addDispatch(Block.slabBrickSandstone, BlockSounds.STONE);
-        addDispatch(Block.slabBrickPermafrost, 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.stairsSandstone, BlockSounds.STONE);
-        addDispatch(Block.stairsCobblePermafrost, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickSandstone, BlockSounds.STONE);
-        addDispatch(Block.stairsBrickPermafrost, 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.logThorn, BlockSounds.WOOD);
-        addDispatch(Block.logPalm, 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.leavesThorn, BlockSounds.GRASS);
-        addDispatch(Block.leavesPalm, 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.saplingThorn, BlockSounds.GRASS);
-        addDispatch(Block.saplingPalm, 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.flowerPurple, BlockSounds.GRASS);
-        addDispatch(Block.flowerPink, BlockSounds.GRASS);
-        addDispatch(Block.flowerLightBlue, BlockSounds.GRASS);
-        addDispatch(Block.flowerOrange, 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.pumpkinPie, 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!");
-            }
-        }
-    }
-}
diff --git a/src/main/java/net/minecraft/core/sound/BlockSounds.java b/src/main/java/net/minecraft/core/sound/BlockSounds.java
index 149c96e10..f7e38683b 100644
--- a/src/main/java/net/minecraft/core/sound/BlockSounds.java
+++ b/src/main/java/net/minecraft/core/sound/BlockSounds.java
@@ -7,6 +7,7 @@ public abstract class BlockSounds
     public static final BlockSound GRAVEL = new BlockSound("step.gravel", "step.gravel", 1.0F, 1.0F);
     public static final BlockSound GRASS = new BlockSound("step.grass", "step.grass", 1.0F, 1.0F);
     public static final BlockSound STONE = new BlockSound("step.stone", "step.stone", 1.0F, 1.0F);
+    public static final BlockSound PERMAFROST = new BlockSound("step.permafrost", "step.permafrost", 1.0F, 1.0F);
     public static final BlockSound METAL = new BlockSound("step.stone", "step.stone", 1.0F, 1.5F);
     public static final BlockSound GLASS = new BlockSound("step.stone", "random.glass", 1.0F, 1.0F);
     public static final BlockSound CLOTH = new BlockSound("step.cloth", "step.cloth", 1.0F, 1.0F);
diff --git a/src/main/java/net/minecraft/core/util/HardIllegalArgumentException.java b/src/main/java/net/minecraft/core/util/HardIllegalArgumentException.java
new file mode 100644
index 000000000..a3fc96628
--- /dev/null
+++ b/src/main/java/net/minecraft/core/util/HardIllegalArgumentException.java
@@ -0,0 +1,26 @@
+package net.minecraft.core.util;
+
+public class HardIllegalArgumentException extends Exception{
+
+    public HardIllegalArgumentException() {
+        super();
+    }
+
+    public HardIllegalArgumentException(String message) {
+        super(message);
+    }
+
+    public HardIllegalArgumentException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public HardIllegalArgumentException(Throwable cause) {
+        super(cause);
+    }
+
+    protected HardIllegalArgumentException(String message, Throwable cause,
+                                           boolean enableSuppression,
+                                           boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/util/collection/IntHashMap.java b/src/main/java/net/minecraft/core/util/collection/IntHashMap.java
new file mode 100644
index 000000000..f5c71c6de
--- /dev/null
+++ b/src/main/java/net/minecraft/core/util/collection/IntHashMap.java
@@ -0,0 +1,224 @@
+// 
+// Decompiled by Procyon v0.6.0
+// 
+
+package net.minecraft.core.util.collection;
+
+public class IntHashMap<V>
+{
+    private static final int DEFAULT_INITIAL_CAPACITY = 16;
+    private static final int MAXIMUM_CAPACITY = 1073741824;
+    private static final float DEFAULT_LOAD_FACTOR = 0.75f;
+    private transient Entry<V>[] table;
+    private transient int size;
+    private int threshold;
+    private final float loadFactor;
+    private transient volatile int modCount;
+    
+    public IntHashMap() {
+        this.loadFactor = DEFAULT_LOAD_FACTOR;
+        this.threshold = 12;
+        this.table = new Entry[DEFAULT_INITIAL_CAPACITY];
+    }
+    
+    private static int hash(int n) {
+        n ^= (n >>> 20 ^ n >>> 12);
+        return n ^ n >>> 7 ^ n >>> 4;
+    }
+    
+    private static int indexFor(final int n, final int n2) {
+        return n & n2 - 1;
+    }
+    
+    public int size() {
+        return this.size;
+    }
+    
+    public boolean isEmpty() {
+        return this.size == 0;
+    }
+    
+    public V get(final int n) {
+        for (Entry<V> next = this.table[indexFor(hash(n), this.table.length)]; next != null; next = next.next) {
+            if (next.key == n) {
+                return next.value;
+            }
+        }
+        return null;
+    }
+    
+    public boolean containsKey(final int n) {
+        return this.getEntry(n) != null;
+    }
+    
+    final Entry<V> getEntry(final int n) {
+        for (Entry<V> next = this.table[indexFor(hash(n), this.table.length)]; next != null; next = next.next) {
+            if (next.key == n) {
+                return next;
+            }
+        }
+        return null;
+    }
+    
+    public void put(final int n, final V value) {
+        final int hash = hash(n);
+        final int index = indexFor(hash, this.table.length);
+        for (Entry<V> next = this.table[index]; next != null; next = next.next) {
+            if (next.key == n) {
+                next.value = value;
+            }
+        }
+        ++this.modCount;
+        this.addEntry(hash, n, value, index);
+    }
+    
+    private void resize(final int n) {
+        if (this.table.length == MAXIMUM_CAPACITY) {
+            this.threshold = Integer.MAX_VALUE;
+            return;
+        }
+        final Entry[] table = new Entry[n];
+        this.transfer(table);
+        this.table = table;
+        this.threshold = (int)(n * this.loadFactor);
+    }
+    
+    private void transfer(final Entry<V>[] array) {
+        final Entry<V>[] table = this.table;
+        final int length = array.length;
+        for (int i = 0; i < table.length; ++i) {
+            Entry<V> entry = table[i];
+            if (entry != null) {
+                table[i] = null;
+                do {
+                    final Entry<V> next = entry.next;
+                    final int index = indexFor(entry.hash, length);
+                    entry.next = array[index];
+                    array[index] = entry;
+                    entry = next;
+                } while (entry != null);
+            }
+        }
+    }
+    
+    public V remove(final int n) {
+        final Entry<V> removeEntryForKey = this.removeEntryForKey(n);
+        return (removeEntryForKey == null) ? null : removeEntryForKey.value;
+    }
+    
+    final Entry<V> removeEntryForKey(final int n) {
+        final int index = indexFor(hash(n), this.table.length);
+        Entry<V> entry2;
+        Entry<V> next;
+        for (Entry<V> entry = entry2 = this.table[index]; entry2 != null; entry2 = next) {
+            next = entry2.next;
+            if (entry2.key == n) {
+                ++this.modCount;
+                --this.size;
+                if (entry == entry2) {
+                    this.table[index] = next;
+                }
+                else {
+                    entry.next = next;
+                }
+                return entry2;
+            }
+            entry = entry2;
+        }
+        return entry2;
+    }
+    
+    public void clear() {
+        ++this.modCount;
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            table[i] = null;
+        }
+        this.size = 0;
+    }
+    
+    public boolean containsValue(final Object o) {
+        if (o == null) {
+            return this.containsNullValue();
+        }
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            for (Entry<V> next = table[i]; next != null; next = next.next) {
+                if (o.equals(next.value)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    private boolean containsNullValue() {
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            for (Entry<V> next = table[i]; next != null; next = next.next) {
+                if (next.value == null) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    private void addEntry(final int n, final int n2, final V v, final int n3) {
+        this.table[n3] = new Entry<V>(n, n2, v, this.table[n3]);
+        if (this.size++ >= this.threshold) {
+            this.resize(2 * this.table.length);
+        }
+    }
+    
+    private static class Entry<V>
+    {
+        final int key;
+        V value;
+        Entry<V> next;
+        final int hash;
+        
+        Entry(final int hash, final int key, final V value, final Entry<V> next) {
+            this.value = value;
+            this.next = next;
+            this.key = key;
+            this.hash = hash;
+        }
+        
+        public final int getKey() {
+            return this.key;
+        }
+        
+        public final V getValue() {
+            return this.value;
+        }
+        
+        @Override
+        public final boolean equals(final Object o) {
+            if (!(o instanceof Entry)) {
+                return false;
+            }
+            final Entry entry = (Entry)o;
+            final Integer value = this.getKey();
+            final Integer value2 = entry.getKey();
+            if (value == value2 || (value != null && value.equals(value2))) {
+                final Object value3 = this.getValue();
+                final Object value4 = entry.getValue();
+                if (value3 == value4 || (value3 != null && value3.equals(value4))) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        
+        @Override
+        public final int hashCode() {
+            return hash(this.key);
+        }
+        
+        @Override
+        public final String toString() {
+            return this.getKey() + "=" + this.getValue();
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/util/collection/LongHashMap.java b/src/main/java/net/minecraft/core/util/collection/LongHashMap.java
new file mode 100644
index 000000000..9a3672e12
--- /dev/null
+++ b/src/main/java/net/minecraft/core/util/collection/LongHashMap.java
@@ -0,0 +1,228 @@
+// 
+// Decompiled by Procyon v0.6.0
+// 
+
+package net.minecraft.core.util.collection;
+
+public class LongHashMap<V>
+{
+    private static final int DEFAULT_INITIAL_CAPACITY = 16;
+    private static final int MAXIMUM_CAPACITY = 1073741824;
+    private static final float DEFAULT_LOAD_FACTOR = 0.75f;
+    private transient Entry<V>[] table;
+    private transient int size;
+    private int threshold;
+    private final float loadFactor;
+    private transient volatile int modCount;
+    
+    public LongHashMap() {
+        this.loadFactor = DEFAULT_LOAD_FACTOR;
+        this.threshold = 12;
+        this.table = new Entry[DEFAULT_INITIAL_CAPACITY];
+    }
+    
+    private static int hash(final long n) {
+        return hash((int)(n ^ n >>> 32));
+    }
+    
+    private static int hash(int n) {
+        n ^= (n >>> 20 ^ n >>> 12);
+        return n ^ n >>> 7 ^ n >>> 4;
+    }
+    
+    private static int indexFor(final int n, final int n2) {
+        return n & n2 - 1;
+    }
+    
+    public int size() {
+        return this.size;
+    }
+    
+    public boolean isEmpty() {
+        return this.size == 0;
+    }
+    
+    public V get(final long n) {
+        for (Entry<V> next = this.table[indexFor(hash(n), this.table.length)]; next != null; next = next.next) {
+            if (next.key == n) {
+                return next.value;
+            }
+        }
+        return null;
+    }
+    
+    public boolean containsKey(final long n) {
+        return this.getEntry(n) != null;
+    }
+    
+    final Entry<V> getEntry(final long n) {
+        for (Entry<V> next = this.table[indexFor(hash(n), this.table.length)]; next != null; next = next.next) {
+            if (next.key == n) {
+                return next;
+            }
+        }
+        return null;
+    }
+    
+    public void put(final long n, final V value) {
+        final int hash = hash(n);
+        final int index = indexFor(hash, this.table.length);
+        for (Entry<V> next = this.table[index]; next != null; next = next.next) {
+            if (next.key == n) {
+                next.value = value;
+            }
+        }
+        ++this.modCount;
+        this.addEntry(hash, n, value, index);
+    }
+    
+    private void resize(final int n) {
+        if (this.table.length == MAXIMUM_CAPACITY) {
+            this.threshold = Integer.MAX_VALUE;
+            return;
+        }
+        final Entry[] table = new Entry[n];
+        this.transfer(table);
+        this.table = table;
+        this.threshold = (int)(n * this.loadFactor);
+    }
+    
+    private void transfer(final Entry<V>[] array) {
+        final Entry<V>[] table = this.table;
+        final int length = array.length;
+        for (int i = 0; i < table.length; ++i) {
+            Entry<V> entry = table[i];
+            if (entry != null) {
+                table[i] = null;
+                do {
+                    final Entry<V> next = entry.next;
+                    final int index = indexFor(entry.hash, length);
+                    entry.next = array[index];
+                    array[index] = entry;
+                    entry = next;
+                } while (entry != null);
+            }
+        }
+    }
+    
+    public V remove(final long n) {
+        final Entry<V> removeEntryForKey = this.removeEntryForKey(n);
+        return (removeEntryForKey == null) ? null : removeEntryForKey.value;
+    }
+    
+    final Entry<V> removeEntryForKey(final long n) {
+        final int index = indexFor(hash(n), this.table.length);
+        Entry<V> entry2;
+        Entry<V> next;
+        for (Entry<V> entry = entry2 = this.table[index]; entry2 != null; entry2 = next) {
+            next = entry2.next;
+            if (entry2.key == n) {
+                ++this.modCount;
+                --this.size;
+                if (entry == entry2) {
+                    this.table[index] = next;
+                }
+                else {
+                    entry.next = next;
+                }
+                return entry2;
+            }
+            entry = entry2;
+        }
+        return entry2;
+    }
+    
+    public void clear() {
+        ++this.modCount;
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            table[i] = null;
+        }
+        this.size = 0;
+    }
+    
+    public boolean containsValue(final Object o) {
+        if (o == null) {
+            return this.containsNullValue();
+        }
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            for (Entry<V> next = table[i]; next != null; next = next.next) {
+                if (o.equals(next.value)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    private boolean containsNullValue() {
+        final Entry<V>[] table = this.table;
+        for (int i = 0; i < table.length; ++i) {
+            for (Entry<V> next = table[i]; next != null; next = next.next) {
+                if (next.value == null) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    private void addEntry(final int n, final long n2, final V v, final int n3) {
+        this.table[n3] = new Entry<V>(n, n2, v, this.table[n3]);
+        if (this.size++ >= this.threshold) {
+            this.resize(2 * this.table.length);
+        }
+    }
+    
+    private static class Entry<V>
+    {
+        final long key;
+        V value;
+        Entry<V> next;
+        final int hash;
+        
+        Entry(final int hash, final long key, final V value, final Entry<V> next) {
+            this.value = value;
+            this.next = next;
+            this.key = key;
+            this.hash = hash;
+        }
+        
+        public final long getKey() {
+            return this.key;
+        }
+        
+        public final V getValue() {
+            return this.value;
+        }
+        
+        @Override
+        public final boolean equals(final Object o) {
+            if (!(o instanceof Entry)) {
+                return false;
+            }
+            final Entry entry = (Entry)o;
+            final Long value = this.getKey();
+            final Long value2 = entry.getKey();
+            if (value == value2 || (value != null && value.equals(value2))) {
+                final Object value3 = this.getValue();
+                final Object value4 = entry.getValue();
+                if (value3 == value4 || (value3 != null && value3.equals(value4))) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        
+        @Override
+        public final int hashCode() {
+            return hash(this.key);
+        }
+        
+        @Override
+        public final String toString() {
+            return this.getKey() + "=" + this.getValue();
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/util/collection/NamespaceID.java b/src/main/java/net/minecraft/core/util/collection/NamespaceID.java
index 18887264b..5bd5de90d 100644
--- a/src/main/java/net/minecraft/core/util/collection/NamespaceID.java
+++ b/src/main/java/net/minecraft/core/util/collection/NamespaceID.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.util.collection;
 
+import net.minecraft.core.util.HardIllegalArgumentException;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Comparator;
@@ -7,16 +8,16 @@ import java.util.Comparator;
 public final class NamespaceID implements Comparator<NamespaceID>, Comparable<NamespaceID> {
     public final String namespace;
     public final String value;
-    public NamespaceID(String namespace, String value){
+    public NamespaceID(String namespace, String value) throws IllegalArgumentException {
         if (namespace.contains(":")) throw new IllegalArgumentException(namespace + " cannot contain the ':' character!");
         if (value.contains(":")) throw new IllegalArgumentException(value + " cannot contain the ':' character!");
         this.namespace = namespace;
         this.value = value;
     }
-    public NamespaceID(String formattedString){
-        if (!formattedString.contains(":")) throw new IllegalArgumentException("Formatted String '" + formattedString + "' missing ':' character all namespace ids must follow the format <namespace>:<value>!");
+    public NamespaceID(String formattedString) throws HardIllegalArgumentException {
+        if (!formattedString.contains(":")) throw new HardIllegalArgumentException("Formatted String '" + formattedString + "' missing ':' character all namespace ids must follow the format <namespace>:<value>!");
         String[] split = formattedString.split(":");
-        if (split.length != 2) throw new IllegalArgumentException("Formatted String '" + formattedString + "' has more then 1 ':' character! all namespace ids must follow the format <namespace>:<value>!");
+        if (split.length != 2) throw new HardIllegalArgumentException("Formatted String '" + formattedString + "' has more then 1 ':' character! all namespace ids must follow the format <namespace>:<value>!");
         namespace = split[0];
         value = split[1];
     }
diff --git a/src/main/java/net/minecraft/core/util/helper/Color.java b/src/main/java/net/minecraft/core/util/helper/Color.java
index 455486c9b..6329e1012 100644
--- a/src/main/java/net/minecraft/core/util/helper/Color.java
+++ b/src/main/java/net/minecraft/core/util/helper/Color.java
@@ -4,6 +4,11 @@ import com.b100.utils.InvalidCharacterException;
 import com.b100.utils.StringReader;
 
 public class Color {
+	public static final int SHIFT_ALPHA = 24;
+	public static final int SHIFT_RED = 16;
+	public static final int SHIFT_GREEN = 8;
+	public static final int SHIFT_BLUE = 0;
+	public static final int MASK_CHANNEL = 0xFF;
 
 	public int value;
 	
@@ -12,11 +17,11 @@ public class Color {
 	}
 	
 	public Color setRGBA(int r, int g, int b, int a) {
-		r = r & 0xFF;
-		g = g & 0xFF;
-		b = b & 0xFF;
-		a = a & 0xFF;
-		this.value = (a << 24) + (r << 16) + (g << 8) + b;
+		r = r & MASK_CHANNEL;
+		g = g & MASK_CHANNEL;
+		b = b & MASK_CHANNEL;
+		a = a & MASK_CHANNEL;
+		this.value = (a << SHIFT_ALPHA) + (r << SHIFT_RED) + (g << SHIFT_GREEN) + (b << SHIFT_BLUE);
 		return this;
 	}
 	
@@ -70,19 +75,19 @@ public class Color {
 	}
 	
 	public int getAlpha() {
-		return (value >> 24) & 0xFF;
+		return (value >> SHIFT_ALPHA) & MASK_CHANNEL;
 	}
 	
 	public int getRed() {
-		return (value >> 16) & 0xFF;
+		return (value >> SHIFT_RED) & MASK_CHANNEL;
 	}
 	
 	public int getGreen() {
-		return (value >> 8) & 0xFF;
+		return (value >> SHIFT_GREEN) & MASK_CHANNEL;
 	}
 	
 	public int getBlue() {
-		return value & 0xFF;
+		return (value >> SHIFT_BLUE) & MASK_CHANNEL;
 	}
 	
 	public String toPropertiesString() {
@@ -97,14 +102,7 @@ public class Color {
 	public String toString() {
 		return toHexRGBA();
 	}
-	
-	public static int byteToIntARGB(byte a, byte r, byte g, byte b) {
-		return ((a & 0xFF) << 24) + ((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF);
-	}
-	
-	public static int intToIntARGB(int a, int r, int g, int b) {
-		return ((a & 0xFF) << 24) + ((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF);
-	}
+
 
 	public void setRGB(Color newColor) {
 		setRGBA(newColor.getRed(), newColor.getGreen(), newColor.getBlue(), getAlpha());
@@ -113,5 +111,39 @@ public class Color {
 	public void setARGB(Color newColor) {
 		this.value = newColor.value;
 	}
-	
+
+
+	// Raw int handling methods
+
+	public static int byteToIntARGB(byte a, byte r, byte g, byte b) {
+		return ((a & MASK_CHANNEL) << SHIFT_ALPHA) + ((r & MASK_CHANNEL) << SHIFT_RED) + ((g & MASK_CHANNEL) << SHIFT_GREEN) + ((b & MASK_CHANNEL) << SHIFT_BLUE);
+	}
+	public static int shortToIntARGB(short a, short r, short g, short b) {
+		return ((a & MASK_CHANNEL) << SHIFT_ALPHA) + ((r & MASK_CHANNEL) << SHIFT_RED) + ((g & MASK_CHANNEL) << SHIFT_GREEN) + ((b & MASK_CHANNEL) << SHIFT_BLUE);
+	}
+	public static int intToIntARGB(int a, int r, int g, int b) {
+		return ((a & MASK_CHANNEL) << SHIFT_ALPHA) + ((r & MASK_CHANNEL) << SHIFT_RED) + ((g & MASK_CHANNEL) << SHIFT_GREEN) + ((b & MASK_CHANNEL) << SHIFT_BLUE);
+	}
+	public static int floatToIntARGB(float a, float r, float g, float b){
+		return intToIntARGB((int) (a * 255), (int) (r * 255), (int) (g * 255), (int) (b * 255));
+	}
+	public static int doubleToIntARGB(double a, double r, double g, double b){
+		return intToIntARGB((int) (a * 255), (int) (r * 255), (int) (g * 255), (int) (b * 255));
+	}
+
+	public static int alphaFromInt(int value) {
+		return (value >> SHIFT_ALPHA) & MASK_CHANNEL;
+	}
+
+	public static int redFromInt(int value) {
+		return (value >> SHIFT_RED) & MASK_CHANNEL;
+	}
+
+	public static int greenFromInt(int value) {
+		return (value >> SHIFT_GREEN) & MASK_CHANNEL;
+	}
+
+	public static int blueFromInt(int value) {
+		return (value >> SHIFT_BLUE) & MASK_CHANNEL;
+	}
 }
diff --git a/src/main/java/net/minecraft/core/util/helper/DamageType.java b/src/main/java/net/minecraft/core/util/helper/DamageType.java
index 4a19b61c8..55d5b87a1 100644
--- a/src/main/java/net/minecraft/core/util/helper/DamageType.java
+++ b/src/main/java/net/minecraft/core/util/helper/DamageType.java
@@ -7,12 +7,12 @@ import java.util.List;
 public class DamageType {
 	private static final List<DamageType> values = new ArrayList<>();
 	
-    public static final DamageType COMBAT = new DamageType("damagetype.combat", true, true, 0);
-    public static final DamageType BLAST = new DamageType("damagetype.blast", true, true, 2);
-    public static final DamageType FALL = new DamageType("damagetype.fall", true, true, 3);
-    public static final DamageType FIRE = new DamageType("damagetype.fire", true, true, 4);
-	public static final DamageType DROWN = new DamageType("damagetype.drown", false, false, 0);
-	public static final DamageType GENERIC = new DamageType("damagetype.generic" ,true, false, 0);
+    public static final DamageType COMBAT = new DamageType("damagetype.combat", true, true, "minecraft:gui/hud/protection_combat");
+    public static final DamageType BLAST = new DamageType("damagetype.blast", true, true, "minecraft:gui/hud/protection_blast");
+    public static final DamageType FALL = new DamageType("damagetype.fall", true, true, "minecraft:gui/hud/protection_fall");
+    public static final DamageType FIRE = new DamageType("damagetype.fire", true, true, "minecraft:gui/hud/protection_fire");
+	public static final DamageType DROWN = new DamageType("damagetype.drown", false, false, "minecraft:gui/hud/protection_combat");
+	public static final DamageType GENERIC = new DamageType("damagetype.generic" ,true, false, "minecraft:gui/hud/protection_combat");
 
 	public static List<DamageType> values() {
 		return values;
@@ -21,15 +21,15 @@ public class DamageType {
 	private final String languageKey;
 	private final boolean shouldDamageArmor;
 	private final boolean shouldDisplay;
-	private final int iconIndex;
+	private final String iconIndex;
 	
-	public DamageType(String languageKey, boolean shouldDamageArmor, boolean shouldDisplay, int iconIndex) {
+	public DamageType(String languageKey, boolean shouldDamageArmor, boolean shouldDisplay, String icon) {
 		DamageType.values().add(this);
 
 		this.languageKey = languageKey;
 		this.shouldDamageArmor = shouldDamageArmor;
 		this.shouldDisplay = shouldDisplay;
-		this.iconIndex = iconIndex;
+		this.iconIndex = icon;
 	}
 
 	public String getLanguageKey() {
@@ -44,7 +44,7 @@ public class DamageType {
 		return shouldDisplay;
 	}
 	
-	public int getIconIndex() {
+	public String getIcon() {
 		return iconIndex;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/util/helper/Direction.java b/src/main/java/net/minecraft/core/util/helper/Direction.java
index 897d45303..39b2ca599 100644
--- a/src/main/java/net/minecraft/core/util/helper/Direction.java
+++ b/src/main/java/net/minecraft/core/util/helper/Direction.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.util.helper;
 
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 
 public enum Direction {
 	
@@ -150,21 +150,21 @@ public enum Direction {
 		else return DOWN;
 	}
 	
-	public static Direction getVerticalDirection(EntityLiving entity) {
+	public static Direction getVerticalDirection(Mob entity) {
 		if(entity.rotationLockVertical != null && entity.rotationLockVertical != NONE) return entity.rotationLockVertical;
 		else return getVerticalDirection(entity.xRot);
 	}
 	
 	public static Direction getHorizontalDirection(double rotationYaw) {
-		return horizontalDirections[(MathHelper.floor_double(rotationYaw / 90f + 0.5) + 2) & 3];
+		return horizontalDirections[(MathHelper.floor(rotationYaw / 90f + 0.5) + 2) & 3];
 	}
 	
-	public static Direction getHorizontalDirection(EntityLiving entity) {
+	public static Direction getHorizontalDirection(Mob entity) {
 		if(entity.rotationLockHorizontal != null && entity.rotationLockHorizontal != NONE) return entity.rotationLockHorizontal;
 		return getHorizontalDirection(entity.yRot);
 	}
 	
-	public static Direction getDirection(EntityLiving entity) {
+	public static Direction getDirection(Mob entity) {
 		if(entity.rotationLock != null && entity.rotationLock != NONE) return entity.rotationLock;
 		if(entity.xRot < -45) return UP;
 		if(entity.xRot > 45) return DOWN;
diff --git a/src/main/java/net/minecraft/core/util/helper/DyeColor.java b/src/main/java/net/minecraft/core/util/helper/DyeColor.java
index 50012d811..0be25b8ff 100644
--- a/src/main/java/net/minecraft/core/util/helper/DyeColor.java
+++ b/src/main/java/net/minecraft/core/util/helper/DyeColor.java
@@ -1,30 +1,72 @@
 package net.minecraft.core.util.helper;
 
-public enum DyeColor
-{
-	DYE_WHITE(0, 15),
-	DYE_ORANGE(1, 14),
-	DYE_MAGENTA(2, 13),
-	DYE_LIGHT_BLUE(3, 12),
-	DYE_YELLOW(4, 11),
-	DYE_LIME(5, 10),
-	DYE_PINK(6, 9),
-	DYE_GRAY(7, 8),
-	DYE_LIGHT_GRAY(8, 7),
-	DYE_CYAN(9, 6),
-	DYE_PURPLE(10, 5),
-	DYE_BLUE(11, 4),
-	DYE_BROWN(12, 3),
-	DYE_GREEN(13, 2),
-	DYE_RED(14, 1),
-	DYE_BLACK(15, 0);
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Unmodifiable;
 
-	public int blockMeta;
-	public int dyeMeta;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
-	DyeColor(int blockMeta, int dyeMeta)
+public enum DyeColor
+{
+	WHITE(0, 15, "white", 0xf0f0f0),
+	ORANGE(1, 14, "orange", 0xeb8844),
+	MAGENTA(2, 13, "magenta", 0xc354cd),
+	LIGHT_BLUE(3, 12, "lightblue", 0x6689d3),
+	YELLOW(4, 11, "yellow", 0xdecf2a),
+	LIME(5, 10, "lime", 0x41cd34),
+	PINK(6, 9, "pink", 0xd88198),
+	GRAY(7, 8, "gray", 0x434343),
+	SILVER(8, 7, "silver", 0x9a9a9a),
+	CYAN(9, 6, "cyan", 0x287697),
+	PURPLE(10, 5, "purple", 0x7b2fbe),
+	BLUE(11, 4, "blue", 0x253192),
+	BROWN(12, 3, "brown", 0x51301a),
+	GREEN(13, 2, "green", 0x3b511a),
+	RED(14, 1, "red",0xb3312c),
+	BLACK(15, 0, "black", 0x1e1b1b);
+	public static final int COLOR_AMOUNT = 16;
+	public static final int MASK_COLOR = 0b0000_1111;
+	private static final DyeColor[] blockMetaToColor = new DyeColor[COLOR_AMOUNT];
+	private static final DyeColor[] itemMetaToColor = new DyeColor[COLOR_AMOUNT];
+	private static final List<DyeColor> blockMetaColorsList;
+	private static final List<DyeColor> itemMetaColorsList;
+	public final int blockMeta;
+	public final int itemMeta;
+	public final String colorID;
+	public final Color color;
+	DyeColor(int blockMeta, int itemMeta, String colorID, int color)
 	{
 		this.blockMeta = blockMeta;
-		this.dyeMeta = dyeMeta;
+		this.itemMeta = itemMeta;
+		this.colorID = colorID;
+		this.color = new Color().setARGB(color | 0xFF000000);
+	}
+
+	static {
+		for (DyeColor c : values()){
+			blockMetaToColor[c.blockMeta] = c;
+			itemMetaToColor[c.itemMeta] = c;
+		}
+		blockMetaColorsList = Collections.unmodifiableList(Arrays.asList(blockMetaToColor));
+		itemMetaColorsList = Collections.unmodifiableList(Arrays.asList(itemMetaToColor));
+
+	}
+	@NotNull
+	public static DyeColor colorFromBlockMeta(int blockMeta){
+		return blockMetaToColor[blockMeta & MASK_COLOR];
+	}
+	@NotNull
+	public static DyeColor colorFromItemMeta(int itemMeta){
+		return itemMetaToColor[itemMeta & MASK_COLOR];
+	}
+
+	@Unmodifiable
+	public static List<DyeColor> blockOrderedColors(){
+		return blockMetaColorsList;
+	}
+	@Unmodifiable
+	public static List<DyeColor> itemOrderedColors(){
+		return itemMetaColorsList;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/util/helper/GetMonsterSkinUrlThread.java b/src/main/java/net/minecraft/core/util/helper/GetMonsterSkinUrlThread.java
index b900beb62..65158d110 100644
--- a/src/main/java/net/minecraft/core/util/helper/GetMonsterSkinUrlThread.java
+++ b/src/main/java/net/minecraft/core/util/helper/GetMonsterSkinUrlThread.java
@@ -4,7 +4,7 @@ import com.b100.json.JsonParser;
 import com.b100.json.element.JsonArray;
 import com.b100.json.element.JsonObject;
 import com.b100.utils.StringUtils;
-import net.minecraft.core.entity.monster.EntityHuman;
+import net.minecraft.core.entity.monster.HumanMob;
 
 import java.util.Base64;
 
@@ -17,10 +17,10 @@ public class GetMonsterSkinUrlThread extends Thread{
 
 	private static final JsonParser jsonParser = new JsonParser();
 
-	private EntityHuman monster;
+	private HumanMob monster;
 	private String uuid;
 
-	public GetMonsterSkinUrlThread(EntityHuman monster) {
+	public GetMonsterSkinUrlThread(HumanMob monster) {
 		this.monster = monster;
 		
 		setDaemon(true);
diff --git a/src/main/java/net/minecraft/core/util/helper/GetSkinUrlThread.java b/src/main/java/net/minecraft/core/util/helper/GetSkinUrlThread.java
index 4fa08312e..02dfb01af 100644
--- a/src/main/java/net/minecraft/core/util/helper/GetSkinUrlThread.java
+++ b/src/main/java/net/minecraft/core/util/helper/GetSkinUrlThread.java
@@ -6,7 +6,7 @@ import com.b100.json.JsonParser;
 import com.b100.json.element.JsonArray;
 import com.b100.json.element.JsonObject;
 import com.b100.utils.StringUtils;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 
 public class GetSkinUrlThread extends Thread{
 	
@@ -17,10 +17,10 @@ public class GetSkinUrlThread extends Thread{
 	
 	private static final JsonParser jsonParser = new JsonParser();
 	
-	private EntityPlayer player;
+	private Player player;
 	private String uuid;
 	
-	public GetSkinUrlThread(EntityPlayer player) {
+	public GetSkinUrlThread(Player player) {
 		this.player = player;
 		
 		setDaemon(true);
diff --git a/src/main/java/net/minecraft/core/util/helper/LogPrintStream.java b/src/main/java/net/minecraft/core/util/helper/LogPrintStream.java
index 5076ee602..3972438b9 100644
--- a/src/main/java/net/minecraft/core/util/helper/LogPrintStream.java
+++ b/src/main/java/net/minecraft/core/util/helper/LogPrintStream.java
@@ -109,7 +109,7 @@ public class LogPrintStream extends PrintStream{
 		boolean a = false;
 		for(int i=0; i < string.length(); i++) {
 			char c = string.charAt(i);
-			if(c == '\247') {
+			if(c == '§') {
 				a = true;
 			}else if(a) {
 				a = false;
diff --git a/src/main/java/net/minecraft/core/util/helper/MathHelper.java b/src/main/java/net/minecraft/core/util/helper/MathHelper.java
index 234f3bbd0..99db8f0f1 100644
--- a/src/main/java/net/minecraft/core/util/helper/MathHelper.java
+++ b/src/main/java/net/minecraft/core/util/helper/MathHelper.java
@@ -23,7 +23,7 @@ public class MathHelper
         return (float) java.lang.Math.sqrt(f);
     }
 
-    public static float sqrt_double(double d)
+    public static float sqrt(double d)
     {
         return (float) java.lang.Math.sqrt(d);
     }
@@ -34,7 +34,7 @@ public class MathHelper
         return f >= (float)i ? i : i - 1;
     }
 
-    public static int floor_double(double d)
+    public static int floor(double d)
     {
         int truncated = (int)d;
         return d >= (double)truncated ? truncated : truncated - 1;
@@ -85,8 +85,10 @@ public class MathHelper
         return Math.max(value, min);
     }
 
-    public static float lerp(float a, float b, float amount)
-    {
+    public static float lerp(float a, float b, float amount) {
+        return a + ((b - a) * amount);
+    }
+    public static double lerp(double a, double b, double amount) {
         return a + ((b - a) * amount);
     }
 	
@@ -117,31 +119,51 @@ public class MathHelper
      * @return rotation bounded to the range [-180, 180) degrees
      */
     public static double normalizeRotation(double rotation){
-        return rotation + 360D * (int) -((rotation+180)/360);
+        double rotNorm = unsignedMod(rotation, 360);
+        if (rotNorm < 180) return rotNorm;
+        return rotNorm - 360;
     }
     /**
      * @param rotation value in degrees
      * @return rotation bounded to the range [-180, 180) degrees
      */
     public static float normalizeRotation(float rotation){
-        return rotation + 360F * (int) -((rotation+180)/360);
+        float rotNorm = (float) unsignedMod(rotation, 360);
+        if (rotNorm < 180) return rotNorm;
+        return rotNorm - 360;
+    }
+
+    public static double deltaAngle(double a, double b){
+        return unsignedMod((a - b + 180), 360) -180;
+    }
+    public static double unsignedMod(double value, double n){
+        return value - Math.floor(value/n) * n;
     }
+
     private static final float[] SIN_TABLE;
 
     public static final float PI = (float)Math.PI;
 
+    public static float toRadians(float angleDegrees){
+        return angleDegrees * DEG_TO_RAD;
+    }
+
+    public static float toDegrees(float angleRadians){
+        return angleRadians * RAD_TO_DEG;
+    }
+
+    public static final float DEG_TO_RAD = (float)Math.toRadians(1);
+    public static final float RAD_TO_DEG = (float)Math.toDegrees(1);
+
     public static int maxAbs(int a, int b)
     {
         return Math.abs(a) > Math.abs(b) ? a : b;
     }
 
-    static 
-    {
+    static {
         SIN_TABLE = new float[0x10000];
-        for(int i = 0; i < 0x10000; i++)
-        {
-            SIN_TABLE[i] = (float) java.lang.Math.sin(((double)i * 3.1415926535897931D * 2D) / 65536D);
+        for(int i = 0; i < 0x10000; i++) {
+            SIN_TABLE[i] = (float) Math.sin(((double)i * Math.PI * 2D) / 65536D);
         }
-
     }
 }
diff --git a/src/main/java/net/minecraft/core/util/phys/AABB.java b/src/main/java/net/minecraft/core/util/phys/AABB.java
index 4a36cd367..d1fcf3616 100644
--- a/src/main/java/net/minecraft/core/util/phys/AABB.java
+++ b/src/main/java/net/minecraft/core/util/phys/AABB.java
@@ -1,101 +1,104 @@
 package net.minecraft.core.util.phys;
 
-import net.minecraft.core.HitResult;
 import net.minecraft.core.util.helper.Side;
 
 import java.util.ArrayList;
 import java.util.List;
 
-// Referenced classes of package net.minecraft.src:
-//            Vec3D, MovingObjectPosition
-
 public class AABB
 {
+    private static final List<AABB> pool = new ArrayList<>();
+    private static int poolPointer = 0;
+    public double minX;
+    public double minY;
+    public double minZ;
+    public double maxX;
+    public double maxY;
+    public double maxZ;
 
-    public static AABB getBoundingBox(double d, double d1, double d2, double d3,
-                                      double d4, double d5)
+    public static AABB getPermanentBB(double d, double d1, double d2, double d3, double d4, double d5)
     {
         return new AABB(d, d1, d2, d3, d4, d5);
     }
 
     public static void deinitializePool()
     {
-        boundingBoxes.clear();
-        numBoundingBoxesInUse = 0;
+        pool.clear();
+        poolPointer = 0;
     }
 
     public static void initializePool()
     {
-        numBoundingBoxesInUse = 0;
+        poolPointer = 0;
     }
 
-    public static AABB getBoundingBoxFromPool(double minX, double minY, double minZ, double maxX,
-                                              double maxY, double maxZ)
+    public static AABB getTemporaryBB(double minX, double minY, double minZ, double maxX,
+                                      double maxY, double maxZ)
     {
-        if(numBoundingBoxesInUse >= boundingBoxes.size())
+        if(poolPointer >= pool.size())
         {
-            boundingBoxes.add(getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D));
+            pool.add(getPermanentBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D));
         }
-        return ((AABB)boundingBoxes.get(numBoundingBoxesInUse++)).setBounds(minX, minY, minZ, maxX, maxY, maxZ);
+        return pool.get(poolPointer++).set(minX, minY, minZ, maxX, maxY, maxZ);
     }
 
-    public AABB(double d, double d1, double d2, double d3, double d4, double d5)
+    private AABB(double minX, double minY, double minZ, double maxX, double maxY, double maxZ)
     {
-        minX = d;
-        minY = d1;
-        minZ = d2;
-        maxX = d3;
-        maxY = d4;
-        maxZ = d5;
+        this.minX = minX;
+        this.minY = minY;
+        this.minZ = minZ;
+        this.maxX = maxX;
+        this.maxY = maxY;
+        this.maxZ = maxZ;
     }
 
-    public AABB setBounds(double d, double d1, double d2, double d3, double d4, double d5)
+    public AABB set(double minX, double minY, double minZ, double maxX, double maxY, double maxZ)
     {
-        minX = d;
-        minY = d1;
-        minZ = d2;
-        maxX = d3;
-        maxY = d4;
-        maxZ = d5;
+        this.minX = minX;
+        this.minY = minY;
+        this.minZ = minZ;
+        this.maxX = maxX;
+        this.maxY = maxY;
+        this.maxZ = maxZ;
         return this;
     }
 
-    public AABB addCoord(double d, double d1, double d2)
+    public AABB expand(double stretchX, double stretchY, double stretchZ)
     {
-        double d3 = minX;
-        double d4 = minY;
-        double d5 = minZ;
-        double d6 = maxX;
-        double d7 = maxY;
-        double d8 = maxZ;
-        if(d < 0.0D)
+        double minX = this.minX;
+        double minY = this.minY;
+        double minZ = this.minZ;
+        double maxX = this.maxX;
+        double maxY = this.maxY;
+        double maxZ = this.maxZ;
+        if(stretchX < 0.0D)
         {
-            d3 += d;
+            minX += stretchX;
         }
-        if(d > 0.0D)
+        if(stretchX > 0.0D)
         {
-            d6 += d;
+            maxX += stretchX;
         }
-        if(d1 < 0.0D)
+        if(stretchY < 0.0D)
         {
-            d4 += d1;
+            minY += stretchY;
         }
-        if(d1 > 0.0D)
+        if(stretchY > 0.0D)
         {
-            d7 += d1;
+            maxY += stretchY;
         }
-        if(d2 < 0.0D)
+        if(stretchZ < 0.0D)
         {
-            d5 += d2;
+            minZ += stretchZ;
         }
-        if(d2 > 0.0D)
+        if(stretchZ > 0.0D)
         {
-            d8 += d2;
+            maxZ += stretchZ;
         }
-        return getBoundingBoxFromPool(d3, d4, d5, d6, d7, d8);
+        return getTemporaryBB(minX, minY, minZ, maxX, maxY, maxZ);
     }
 
-    public AABB expand(double d, double d1, double d2)
+    public AABB grow(double d, double d1, double d2)
     {
         double d3 = minX - d;
         double d4 = minY - d1;
@@ -103,35 +106,35 @@ public class AABB
         double d6 = maxX + d;
         double d7 = maxY + d1;
         double d8 = maxZ + d2;
-        return getBoundingBoxFromPool(d3, d4, d5, d6, d7, d8);
+        return getTemporaryBB(d3, d4, d5, d6, d7, d8);
     }
 
-    public AABB getOffsetBoundingBox(double d, double d1, double d2)
+    public AABB cloneMove(double offX, double offY, double offZ)
     {
-        return getBoundingBoxFromPool(minX + d, minY + d1, minZ + d2, maxX + d, maxY + d1, maxZ + d2);
+        return getTemporaryBB(minX + offX, minY + offY, minZ + offZ, maxX + offX, maxY + offY, maxZ + offZ);
     }
 
-    public double calculateXOffset(AABB axisalignedbb, double d)
+    public double clipXCollide(AABB aabb, double d)
     {
-        if(axisalignedbb.maxY <= minY || axisalignedbb.minY >= maxY)
+        if(aabb.maxY <= minY || aabb.minY >= maxY)
         {
             return d;
         }
-        if(axisalignedbb.maxZ <= minZ || axisalignedbb.minZ >= maxZ)
+        if(aabb.maxZ <= minZ || aabb.minZ >= maxZ)
         {
             return d;
         }
-        if(d > 0.0D && axisalignedbb.maxX <= minX)
+        if(d > 0.0D && aabb.maxX <= minX)
         {
-            double d1 = minX - axisalignedbb.maxX;
+            double d1 = minX - aabb.maxX;
             if(d1 < d)
             {
                 d = d1;
             }
         }
-        if(d < 0.0D && axisalignedbb.minX >= maxX)
+        if(d < 0.0D && aabb.minX >= maxX)
         {
-            double d2 = maxX - axisalignedbb.minX;
+            double d2 = maxX - aabb.minX;
             if(d2 > d)
             {
                 d = d2;
@@ -140,27 +143,27 @@ public class AABB
         return d;
     }
 
-    public double calculateYOffset(AABB axisalignedbb, double d)
+    public double clipYCollide(AABB aabb, double d)
     {
-        if(axisalignedbb.maxX <= minX || axisalignedbb.minX >= maxX)
+        if(aabb.maxX <= minX || aabb.minX >= maxX)
         {
             return d;
         }
-        if(axisalignedbb.maxZ <= minZ || axisalignedbb.minZ >= maxZ)
+        if(aabb.maxZ <= minZ || aabb.minZ >= maxZ)
         {
             return d;
         }
-        if(d > 0.0D && axisalignedbb.maxY <= minY)
+        if(d > 0.0D && aabb.maxY <= minY)
         {
-            double d1 = minY - axisalignedbb.maxY;
+            double d1 = minY - aabb.maxY;
             if(d1 < d)
             {
                 d = d1;
             }
         }
-        if(d < 0.0D && axisalignedbb.minY >= maxY)
+        if(d < 0.0D && aabb.minY >= maxY)
         {
-            double d2 = maxY - axisalignedbb.minY;
+            double d2 = maxY - aabb.minY;
             if(d2 > d)
             {
                 d = d2;
@@ -169,27 +172,27 @@ public class AABB
         return d;
     }
 
-    public double calculateZOffset(AABB axisalignedbb, double d)
+    public double clipZCollide(AABB aabb, double d)
     {
-        if(axisalignedbb.maxX <= minX || axisalignedbb.minX >= maxX)
+        if(aabb.maxX <= minX || aabb.minX >= maxX)
         {
             return d;
         }
-        if(axisalignedbb.maxY <= minY || axisalignedbb.minY >= maxY)
+        if(aabb.maxY <= minY || aabb.minY >= maxY)
         {
             return d;
         }
-        if(d > 0.0D && axisalignedbb.maxZ <= minZ)
+        if(d > 0.0D && aabb.maxZ <= minZ)
         {
-            double d1 = minZ - axisalignedbb.maxZ;
+            double d1 = minZ - aabb.maxZ;
             if(d1 < d)
             {
                 d = d1;
             }
         }
-        if(d < 0.0D && axisalignedbb.minZ >= maxZ)
+        if(d < 0.0D && aabb.minZ >= maxZ)
         {
-            double d2 = maxZ - axisalignedbb.minZ;
+            double d2 = maxZ - aabb.minZ;
             if(d2 > d)
             {
                 d = d2;
@@ -198,50 +201,75 @@ public class AABB
         return d;
     }
 
-    public boolean intersectsWith(AABB axisalignedbb)
-    {
-        if(axisalignedbb.maxX <= minX || axisalignedbb.minX >= maxX)
-        {
-            return false;
-        }
-        if(axisalignedbb.maxY <= minY || axisalignedbb.minY >= maxY)
-        {
-            return false;
-        }
-        return axisalignedbb.maxZ > minZ && axisalignedbb.minZ < maxZ;
+    public boolean intersects(AABB aabb) {
+        return aabb.maxX > this.minX && aabb.minX < this.maxX && aabb.maxY > this.minY && aabb.minY < this.maxY && aabb.maxZ > this.minZ && aabb.minZ < this.maxZ;
+    }
+    public boolean intersects(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
+        return maxX > this.minX && minX < this.maxX && maxY > this.minY && minY < this.maxY && maxZ > this.minZ && minZ < this.maxZ;
+    }
+
+    public boolean intersectsInner(final AABB aabb) {
+        return aabb.maxX >= this.minX && aabb.minX <= this.maxX && aabb.maxY >= this.minY && aabb.minY <= this.maxY && aabb.maxZ >= this.minZ && aabb.minZ <= this.maxZ;
     }
 
-    public AABB offset(double d, double d1, double d2)
+    public AABB move(double offX, double offY, double offZ)
     {
-        minX += d;
-        minY += d1;
-        minZ += d2;
-        maxX += d;
-        maxY += d1;
-        maxZ += d2;
+        minX += offX;
+        minY += offY;
+        minZ += offZ;
+        maxX += offX;
+        maxY += offY;
+        maxZ += offZ;
         return this;
     }
 
-    public boolean isVecInside(Vec3d vec3d)
+    public boolean contains(Vec3 vec3)
     {
-        if(vec3d.xCoord <= minX || vec3d.xCoord >= maxX)
+        if(vec3.x <= minX || vec3.x >= maxX)
         {
             return false;
         }
-        if(vec3d.yCoord <= minY || vec3d.yCoord >= maxY)
+        if(vec3.y <= minY || vec3.y >= maxY)
         {
             return false;
         }
-        return vec3d.zCoord > minZ && vec3d.zCoord < maxZ;
+        return vec3.z > minZ && vec3.z < maxZ;
     }
 
-    public double getAverageEdgeLength()
+    public double getSize()
     {
         double d = maxX - minX;
         double d1 = maxY - minY;
         double d2 = maxZ - minZ;
         return (d + d1 + d2) / 3D;
     }
+    public AABB shrink(final double n, final double n2, final double n3) {
+        double minX = this.minX;
+        double minY = this.minY;
+        double minZ = this.minZ;
+        double maxX = this.maxX;
+        double maxY = this.maxY;
+        double maxZ = this.maxZ;
+        if (n < 0.0) {
+            minX -= n;
+        }
+        if (n > 0.0) {
+            maxX -= n;
+        }
+        if (n2 < 0.0) {
+            minY -= n2;
+        }
+        if (n2 > 0.0) {
+            maxY -= n2;
+        }
+        if (n3 < 0.0) {
+            minZ -= n3;
+        }
+        if (n3 > 0.0) {
+            maxZ -= n3;
+        }
+        return getTemporaryBB(minX, minY, minZ, maxX, maxY, maxZ);
+    }
 
     public AABB getInsetBoundingBox(double d, double d1, double d2)
     {
@@ -251,106 +279,96 @@ public class AABB
         double d6 = maxX - d;
         double d7 = maxY - d1;
         double d8 = maxZ - d2;
-        return getBoundingBoxFromPool(d3, d4, d5, d6, d7, d8);
+        return getTemporaryBB(d3, d4, d5, d6, d7, d8);
     }
 
     public AABB copy()
     {
-        return getBoundingBoxFromPool(minX, minY, minZ, maxX, maxY, maxZ);
+        return getTemporaryBB(minX, minY, minZ, maxX, maxY, maxZ);
     }
 
-	public HitResult func_1169_a(Vec3d start, Vec3d end) {
-		Vec3d vec3d2 = start.getIntermediateWithXValue(end, minX);
-		Vec3d vec3d3 = start.getIntermediateWithXValue(end, maxX);
-		Vec3d vec3d4 = start.getIntermediateWithYValue(end, minY);
-		Vec3d vec3d5 = start.getIntermediateWithYValue(end, maxY);
-		Vec3d vec3d6 = start.getIntermediateWithZValue(end, minZ);
-		Vec3d vec3d7 = start.getIntermediateWithZValue(end, maxZ);
+	public HitResult clip(Vec3 start, Vec3 end) {
+		Vec3 vec32 = start.clipX(end, minX);
+		Vec3 vec3d3 = start.clipX(end, maxX);
+		Vec3 vec34 = start.clipY(end, minY);
+		Vec3 vec35 = start.clipY(end, maxY);
+		Vec3 vec36 = start.clipZ(end, minZ);
+		Vec3 vec37 = start.clipZ(end, maxZ);
 		
-		if(!isVecInYZ(vec3d2)) vec3d2 = null;
-		if(!isVecInYZ(vec3d3)) vec3d3 = null;
-		if(!isVecInXZ(vec3d4)) vec3d4 = null;
-		if(!isVecInXZ(vec3d5)) vec3d5 = null;
-		if(!isVecInXY(vec3d6)) vec3d6 = null;
-		if(!isVecInXY(vec3d7)) vec3d7 = null;
+		if(!containsX(vec32)) vec32 = null;
+		if(!containsX(vec3d3)) vec3d3 = null;
+		if(!containsY(vec34)) vec34 = null;
+		if(!containsY(vec35)) vec35 = null;
+		if(!containsZ(vec36)) vec36 = null;
+		if(!containsZ(vec37)) vec37 = null;
 		
-		Vec3d vec3d8 = null;
-		if(vec3d2 != null && (vec3d8 == null || start.squareDistanceTo(vec3d2) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d2;
-		if(vec3d3 != null && (vec3d8 == null || start.squareDistanceTo(vec3d3) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d3;
-		if(vec3d4 != null && (vec3d8 == null || start.squareDistanceTo(vec3d4) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d4;
-		if(vec3d5 != null && (vec3d8 == null || start.squareDistanceTo(vec3d5) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d5;
-		if(vec3d6 != null && (vec3d8 == null || start.squareDistanceTo(vec3d6) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d6;
-		if(vec3d7 != null && (vec3d8 == null || start.squareDistanceTo(vec3d7) < start.squareDistanceTo(vec3d8))) vec3d8 = vec3d7;
+		Vec3 vec38 = null;
+		if(vec32 != null && (vec38 == null || start.distanceToSquared(vec32) < start.distanceToSquared(vec38))) vec38 = vec32;
+		if(vec3d3 != null && (vec38 == null || start.distanceToSquared(vec3d3) < start.distanceToSquared(vec38))) vec38 = vec3d3;
+		if(vec34 != null && (vec38 == null || start.distanceToSquared(vec34) < start.distanceToSquared(vec38))) vec38 = vec34;
+		if(vec35 != null && (vec38 == null || start.distanceToSquared(vec35) < start.distanceToSquared(vec38))) vec38 = vec35;
+		if(vec36 != null && (vec38 == null || start.distanceToSquared(vec36) < start.distanceToSquared(vec38))) vec38 = vec36;
+		if(vec37 != null && (vec38 == null || start.distanceToSquared(vec37) < start.distanceToSquared(vec38))) vec38 = vec37;
 		
-		if(vec3d8 == null) return null;
+		if(vec38 == null) return null;
 		
 		Side side = Side.NONE;
-		if(vec3d8 == vec3d2) side = Side.WEST;
-		if(vec3d8 == vec3d3) side = Side.EAST;
-		if(vec3d8 == vec3d4) side = Side.BOTTOM;
-		if(vec3d8 == vec3d5) side = Side.TOP;
-		if(vec3d8 == vec3d6) side = Side.NORTH;
-		if(vec3d8 == vec3d7) side = Side.SOUTH;
+		if(vec38 == vec32) side = Side.WEST;
+		if(vec38 == vec3d3) side = Side.EAST;
+		if(vec38 == vec34) side = Side.BOTTOM;
+		if(vec38 == vec35) side = Side.TOP;
+		if(vec38 == vec36) side = Side.NORTH;
+		if(vec38 == vec37) side = Side.SOUTH;
 		
-		return new HitResult(0, 0, 0, side, vec3d8);
+		return new HitResult(0, 0, 0, side, vec38);
 	}
 
-    private boolean isVecInYZ(Vec3d vec3d)
+    private boolean containsX(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         } else
         {
-            return vec3d.yCoord >= minY && vec3d.yCoord <= maxY && vec3d.zCoord >= minZ && vec3d.zCoord <= maxZ;
+            return vec3.y >= minY && vec3.y <= maxY && vec3.z >= minZ && vec3.z <= maxZ;
         }
     }
 
-    private boolean isVecInXZ(Vec3d vec3d)
+    private boolean containsY(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         } else
         {
-            return vec3d.xCoord >= minX && vec3d.xCoord <= maxX && vec3d.zCoord >= minZ && vec3d.zCoord <= maxZ;
+            return vec3.x >= minX && vec3.x <= maxX && vec3.z >= minZ && vec3.z <= maxZ;
         }
     }
 
-    private boolean isVecInXY(Vec3d vec3d)
+    private boolean containsZ(Vec3 vec3)
     {
-        if(vec3d == null)
+        if(vec3 == null)
         {
             return false;
         } else
         {
-            return vec3d.xCoord >= minX && vec3d.xCoord <= maxX && vec3d.yCoord >= minY && vec3d.yCoord <= maxY;
+            return vec3.x >= minX && vec3.x <= maxX && vec3.y >= minY && vec3.y <= maxY;
         }
     }
 
-    public void setBB(AABB axisalignedbb)
+    public void setBB(AABB aabb)
     {
-        minX = axisalignedbb.minX;
-        minY = axisalignedbb.minY;
-        minZ = axisalignedbb.minZ;
-        maxX = axisalignedbb.maxX;
-        maxY = axisalignedbb.maxY;
-        maxZ = axisalignedbb.maxZ;
+        minX = aabb.minX;
+        minY = aabb.minY;
+        minZ = aabb.minZ;
+        maxX = aabb.maxX;
+        maxY = aabb.maxY;
+        maxZ = aabb.maxZ;
     }
 
     @Override
 	public String toString()
     {
-        return (new StringBuilder()).append("box[").append(minX).append(", ").append(minY).append(", ").append(minZ).append(" -> ").append(maxX).append(", ").append(maxY).append(", ").append(maxZ).append("]").toString();
+        return "box[" + minX + ", " + minY + ", " + minZ + " -> " + maxX + ", " + maxY + ", " + maxZ + "]";
     }
-
-    private static List boundingBoxes = new ArrayList();
-    private static int numBoundingBoxesInUse = 0;
-    public double minX;
-    public double minY;
-    public double minZ;
-    public double maxX;
-    public double maxY;
-    public double maxZ;
-
 }
diff --git a/src/main/java/net/minecraft/core/util/phys/HitResult.java b/src/main/java/net/minecraft/core/util/phys/HitResult.java
new file mode 100644
index 000000000..466bfc92e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/util/phys/HitResult.java
@@ -0,0 +1,53 @@
+package net.minecraft.core.util.phys;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
+
+public class HitResult
+{
+    public final HitType hitType;
+    public final int x;
+    public final int y;
+    public final int z;
+    public final Side side;
+    public final Vec3 location;
+    public final Entity entity;
+
+    public HitResult(int x, int y, int z, Side side, Vec3 vec3)
+    {
+        hitType = HitType.TILE;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        this.side = side;
+        location = Vec3.getTempVec3(vec3.x, vec3.y, vec3.z);
+        entity = null;
+    }
+
+    public HitResult(Entity entity)
+    {
+        x = 0;
+        y = 0;
+        z = 0;
+        side = Side.NONE;
+        hitType = HitType.ENTITY;
+        this.entity = entity;
+        location = Vec3.getTempVec3(entity.x, entity.y, entity.z);
+    }
+
+    public double distanceToSquared(final Entity entity) {
+        final double diffX = this.location.x - entity.x;
+        final double diffY = this.location.y - entity.y;
+        final double diffZ = this.location.z - entity.z;
+        return diffX * diffX + diffY * diffY + diffZ * diffZ;
+    }
+    public double distanceTo(final Entity entity) {
+        return Math.sqrt(distanceToSquared(entity));
+    }
+    public enum HitType
+    {
+        TILE,
+        ENTITY
+    }
+}
diff --git a/src/main/java/net/minecraft/core/util/phys/Vec3.java b/src/main/java/net/minecraft/core/util/phys/Vec3.java
new file mode 100644
index 000000000..4688861a7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/util/phys/Vec3.java
@@ -0,0 +1,236 @@
+package net.minecraft.core.util.phys;
+
+import net.minecraft.core.util.helper.MathHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// Referenced classes of package net.minecraft.src:
+//            MathHelper
+
+public class Vec3
+{
+    private static final List<Vec3> pool = new ArrayList<>();
+    private static int poolPointer = 0;
+    public double x;
+    public double y;
+    public double z;
+
+    public static Vec3 getPermanentVec3(double x, double y, double z)
+    {
+        return new Vec3(x, y, z);
+    }
+
+    public static void deinitializePool()
+    {
+        pool.clear();
+        poolPointer = 0;
+    }
+
+    public static void initializePool()
+    {
+        poolPointer = 0;
+    }
+
+    public static Vec3 getTempVec3(double x, double y, double z)
+    {
+        if(poolPointer >= pool.size())
+        {
+            pool.add(getPermanentVec3(0.0D, 0.0D, 0.0D));
+        }
+        return pool.get(poolPointer++).set(x, y, z);
+    }
+
+    public Vec3 makePermanent(){
+        if (pool.contains(this)){
+            pool.remove(this);
+            poolPointer--;
+        }
+        return this;
+    }
+
+    private Vec3(double x, double y, double z) {
+        if(x == -0D) {
+            x = 0.0D;
+        }
+        if(y == -0D) {
+            y = 0.0D;
+        }
+        if(z == -0D) {
+            z = 0.0D;
+        }
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    private Vec3 set(double x, double y, double z)
+    {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        return this;
+    }
+
+    public Vec3 vectorTo(Vec3 vec3)
+    {
+        return getTempVec3(vec3.x - x, vec3.y - y, vec3.z - z);
+    }
+
+    public Vec3 normalize()
+    {
+        double d = MathHelper.sqrt(x * x + y * y + z * z);
+        if(d < 0.0001D)
+        {
+            return getTempVec3(0.0D, 0.0D, 0.0D);
+        } else
+        {
+            return scale(1/d);
+        }
+    }
+    public double dotProduct(final Vec3 vec3) {
+        return this.x * vec3.x + this.y * vec3.y + this.z * vec3.z;
+    }
+    public Vec3 crossProduct(Vec3 vec3)
+    {
+        return getTempVec3(y * vec3.z - z * vec3.y, z * vec3.x - x * vec3.z, x * vec3.y - y * vec3.x);
+    }
+
+    public Vec3 add(double x, double y, double z)
+    {
+        return getTempVec3(this.x + x, this.y + y, this.z + z);
+    }
+
+    public Vec3 scale(double scalar){
+        return getTempVec3(this.x * scalar, this.y * scalar, this.z * scalar);
+    }
+
+    public double distanceTo(Vec3 vec3)
+    {
+        double diffX = vec3.x - x;
+        double diffY = vec3.y - y;
+        double diffZ = vec3.z - z;
+        return MathHelper.sqrt(diffX * diffX + diffY * diffY + diffZ * diffZ);
+    }
+
+    public double distanceToSquared(Vec3 vec3)
+    {
+        double diffX = vec3.x - x;
+        double diffY = vec3.y - y;
+        double diffZ = vec3.z - z;
+        return diffX * diffX + diffY * diffY + diffZ * diffZ;
+    }
+
+    public double distanceToSquared(double x, double y, double z)
+    {
+        double diffX = x - this.x;
+        double diffY = y - this.y;
+        double diffZ = z - this.z;
+        return diffX * diffX + diffY * diffY + diffZ * diffZ;
+    }
+
+    public double length()
+    {
+        return MathHelper.sqrt(x * x + y * y + z * z);
+    }
+
+    public Vec3 clipX(Vec3 vec3, double d)
+    {
+        double diffX = vec3.x - x;
+        double diffY = vec3.y - y;
+        double diffZ = vec3.z - z;
+        if(diffX * diffX < 1.0000000116860974E-007D)
+        {
+            return null;
+        }
+        double d4 = (d - x) / diffX;
+        if(d4 < 0.0D || d4 > 1.0D)
+        {
+            return null;
+        } else
+        {
+            return getTempVec3(x + diffX * d4, y + diffY * d4, z + diffZ * d4);
+        }
+    }
+
+    public Vec3 clipY(Vec3 vec3, double d)
+    {
+        double diffX = vec3.x - x;
+        double diffY = vec3.y - y;
+        double diffZ = vec3.z - z;
+        if(diffY * diffY < 1.0000000116860974E-007D)
+        {
+            return null;
+        }
+        double d4 = (d - y) / diffY;
+        if(d4 < 0.0D || d4 > 1.0D)
+        {
+            return null;
+        } else
+        {
+            return getTempVec3(x + diffX * d4, y + diffY * d4, z + diffZ * d4);
+        }
+    }
+
+    public Vec3 clipZ(Vec3 vec3, double d)
+    {
+        double diffX = vec3.x - x;
+        double diffY = vec3.y - y;
+        double diffZ = vec3.z - z;
+        if(diffZ * diffZ < 1.0000000116860974E-007D)
+        {
+            return null;
+        }
+        double d4 = (d - z) / diffZ;
+        if(d4 < 0.0D || d4 > 1.0D)
+        {
+            return null;
+        } else
+        {
+            return getTempVec3(x + diffX * d4, y + diffY * d4, z + diffZ * d4);
+        }
+    }
+
+    @Override
+	public String toString()
+    {
+        return "(" + x + ", " + y + ", " + z + ")";
+    }
+
+    public Vec3 lerp(final Vec3 vec3, final double progress) {
+        return getTempVec3(this.x + (vec3.x - this.x) * progress, this.y + (vec3.y - this.y) * progress, this.z + (vec3.z - this.z) * progress);
+    }
+    public void rotateAroundX(float radians)
+    {
+        final float cos = MathHelper.cos(radians);
+        final float sin = MathHelper.sin(radians);
+        final double x = this.x;
+        final double y = this.y * cos + this.z * sin;
+        final double z = this.z * cos - this.y * sin;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+
+    public void rotateAroundY(float radians)
+    {
+        final float cos = MathHelper.cos(radians);
+        final float sin = MathHelper.sin(radians);
+        final double x = this.x * cos + this.z * sin;
+        final double y = this.y;
+        final double z = this.z * cos - this.x * sin;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+    public void rotateAroundZ(final float radians) {
+        final float cos = MathHelper.cos(radians);
+        final float sin = MathHelper.sin(radians);
+        final double x = this.x * cos + this.y * sin;
+        final double y = this.y * cos - this.x * sin;
+        final double z = this.z;
+        this.x = x;
+        this.y = y;
+        this.z = z;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/util/phys/Vec3d.java b/src/main/java/net/minecraft/core/util/phys/Vec3d.java
deleted file mode 100644
index 89488c6c9..000000000
--- a/src/main/java/net/minecraft/core/util/phys/Vec3d.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package net.minecraft.core.util.phys;
-
-import net.minecraft.core.util.helper.MathHelper;
-
-import java.util.ArrayList;
-import java.util.List;
-
-// Referenced classes of package net.minecraft.src:
-//            MathHelper
-
-public class Vec3d
-{
-
-    public static Vec3d createVectorHelper(double x, double y, double z)
-    {
-        return new Vec3d(x, y, z);
-    }
-
-    public static void deinitializePool()
-    {
-        vectorList.clear();
-        nextVector = 0;
-    }
-
-    public static void initializePool()
-    {
-        nextVector = 0;
-    }
-
-    public static Vec3d createVector(double x, double y, double z)
-    {
-        if(nextVector >= vectorList.size())
-        {
-            vectorList.add(createVectorHelper(0.0D, 0.0D, 0.0D));
-        }
-        return vectorList.get(nextVector++).setComponents(x, y, z);
-    }
-
-    private Vec3d(double x, double y, double z)
-    {
-        if(x == -0D)
-        {
-            x = 0.0D;
-        }
-        if(y == -0D)
-        {
-            y = 0.0D;
-        }
-        if(z == -0D)
-        {
-            z = 0.0D;
-        }
-        xCoord = x;
-        yCoord = y;
-        zCoord = z;
-    }
-
-    private Vec3d setComponents(double d, double d1, double d2)
-    {
-        xCoord = d;
-        yCoord = d1;
-        zCoord = d2;
-        return this;
-    }
-
-    public Vec3d subtract(Vec3d vec3d)
-    {
-        return createVector(vec3d.xCoord - xCoord, vec3d.yCoord - yCoord, vec3d.zCoord - zCoord);
-    }
-
-    public Vec3d normalize()
-    {
-        double d = MathHelper.sqrt_double(xCoord * xCoord + yCoord * yCoord + zCoord * zCoord);
-        if(d < 0.0001D)
-        {
-            return createVector(0.0D, 0.0D, 0.0D);
-        } else
-        {
-            return createVector(xCoord / d, yCoord / d, zCoord / d);
-        }
-    }
-
-    public Vec3d crossProduct(Vec3d vec3d)
-    {
-        return createVector(yCoord * vec3d.zCoord - zCoord * vec3d.yCoord, zCoord * vec3d.xCoord - xCoord * vec3d.zCoord, xCoord * vec3d.yCoord - yCoord * vec3d.xCoord);
-    }
-
-    public Vec3d addVector(double d, double d1, double d2)
-    {
-        return createVector(xCoord + d, yCoord + d1, zCoord + d2);
-    }
-
-    public double distanceTo(Vec3d vec3d)
-    {
-        double d = vec3d.xCoord - xCoord;
-        double d1 = vec3d.yCoord - yCoord;
-        double d2 = vec3d.zCoord - zCoord;
-        return (double) MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2);
-    }
-
-    public double squareDistanceTo(Vec3d vec3d)
-    {
-        double d = vec3d.xCoord - xCoord;
-        double d1 = vec3d.yCoord - yCoord;
-        double d2 = vec3d.zCoord - zCoord;
-        return d * d + d1 * d1 + d2 * d2;
-    }
-
-    public double squareDistanceTo(double d, double d1, double d2)
-    {
-        double d3 = d - xCoord;
-        double d4 = d1 - yCoord;
-        double d5 = d2 - zCoord;
-        return d3 * d3 + d4 * d4 + d5 * d5;
-    }
-
-    public double lengthVector()
-    {
-        return (double) MathHelper.sqrt_double(xCoord * xCoord + yCoord * yCoord + zCoord * zCoord);
-    }
-
-    public Vec3d getIntermediateWithXValue(Vec3d vec3d, double d)
-    {
-        double d1 = vec3d.xCoord - xCoord;
-        double d2 = vec3d.yCoord - yCoord;
-        double d3 = vec3d.zCoord - zCoord;
-        if(d1 * d1 < 1.0000000116860974E-007D)
-        {
-            return null;
-        }
-        double d4 = (d - xCoord) / d1;
-        if(d4 < 0.0D || d4 > 1.0D)
-        {
-            return null;
-        } else
-        {
-            return createVector(xCoord + d1 * d4, yCoord + d2 * d4, zCoord + d3 * d4);
-        }
-    }
-
-    public Vec3d getIntermediateWithYValue(Vec3d vec3d, double d)
-    {
-        double d1 = vec3d.xCoord - xCoord;
-        double d2 = vec3d.yCoord - yCoord;
-        double d3 = vec3d.zCoord - zCoord;
-        if(d2 * d2 < 1.0000000116860974E-007D)
-        {
-            return null;
-        }
-        double d4 = (d - yCoord) / d2;
-        if(d4 < 0.0D || d4 > 1.0D)
-        {
-            return null;
-        } else
-        {
-            return createVector(xCoord + d1 * d4, yCoord + d2 * d4, zCoord + d3 * d4);
-        }
-    }
-
-    public Vec3d getIntermediateWithZValue(Vec3d vec3d, double d)
-    {
-        double d1 = vec3d.xCoord - xCoord;
-        double d2 = vec3d.yCoord - yCoord;
-        double d3 = vec3d.zCoord - zCoord;
-        if(d3 * d3 < 1.0000000116860974E-007D)
-        {
-            return null;
-        }
-        double d4 = (d - zCoord) / d3;
-        if(d4 < 0.0D || d4 > 1.0D)
-        {
-            return null;
-        } else
-        {
-            return createVector(xCoord + d1 * d4, yCoord + d2 * d4, zCoord + d3 * d4);
-        }
-    }
-
-    @Override
-	public String toString()
-    {
-        return "(" + xCoord + ", " + yCoord + ", " + zCoord + ")";
-    }
-
-    public void rotateAroundX(float f)
-    {
-        float f1 = MathHelper.cos(f);
-        float f2 = MathHelper.sin(f);
-        double d = xCoord;
-        double d1 = yCoord * (double)f1 + zCoord * (double)f2;
-        double d2 = zCoord * (double)f1 - yCoord * (double)f2;
-        xCoord = d;
-        yCoord = d1;
-        zCoord = d2;
-    }
-
-    public void rotateAroundY(float f)
-    {
-        float f1 = MathHelper.cos(f);
-        float f2 = MathHelper.sin(f);
-        double d = xCoord * (double)f1 + zCoord * (double)f2;
-        double d1 = yCoord;
-        double d2 = zCoord * (double)f1 - xCoord * (double)f2;
-        xCoord = d;
-        yCoord = d1;
-        zCoord = d2;
-    }
-
-    private static final List<Vec3d> vectorList = new ArrayList<>();
-    private static int nextVector = 0;
-    public double xCoord;
-    public double yCoord;
-    public double zCoord;
-
-}
diff --git a/src/main/java/net/minecraft/core/world/Dimension.java b/src/main/java/net/minecraft/core/world/Dimension.java
index 6064be594..e3f8a6bda 100644
--- a/src/main/java/net/minecraft/core/world/Dimension.java
+++ b/src/main/java/net/minecraft/core/world/Dimension.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.save.DimensionData;
 import net.minecraft.core.world.type.WorldType;
@@ -15,16 +15,17 @@ public class Dimension
 	public int id;
 	public final String languageKey;
 	public final Dimension homeDim;
-	public WorldType defaultWorldType;
+	public final WorldType defaultWorldType;
 	public final float worldScale;
 	public final int portalBlockId;
 	
-	public Dimension(String languageKey, Dimension homeDim, float worldScale, int portalBlockId)
+	public Dimension(String languageKey, Dimension homeDim, float worldScale, int portalBlockId, WorldType defaultWorldType)
 	{
 		this.languageKey = languageKey;
 		this.homeDim = homeDim;
 		this.worldScale = worldScale;
 		this.portalBlockId = portalBlockId;
+		this.defaultWorldType = defaultWorldType;
 	}
 	
 	public DimensionData getDimensionData(World world)
@@ -39,12 +40,6 @@ public class Dimension
 		return dimensionData;
 	}
 	
-	public Dimension setDefaultWorldType(WorldType defaultWorldType)
-	{
-		this.defaultWorldType = defaultWorldType;
-		return this;
-	}
-	
 	public boolean canPortal(Dimension dim)
 	{
 		if (homeDim == null) return true;
@@ -79,9 +74,9 @@ public class Dimension
 
 	private static final Map<Integer, Dimension> dimensionList = new HashMap<>();
 
-	public static final Dimension overworld;
-	public static final Dimension nether;
-	public static final Dimension paradise;
+	public static Dimension overworld;
+	public static Dimension nether;
+	public static Dimension paradise;
 
 	public static Map<Integer, Dimension> getDimensionList()
 	{
@@ -99,12 +94,10 @@ public class Dimension
 		dimension.id = id;
 		dimensionList.put(id, dimension);
 	}
-	
-	static
-	{
-		overworld = new Dimension("overworld", null, 1.0f, -1).setDefaultWorldType(WorldTypes.OVERWORLD_DEFAULT);
-		nether = new Dimension("hell", overworld, 0.125f, Block.portalNether.id).setDefaultWorldType(WorldTypes.NETHER_DEFAULT);
-		paradise = new Dimension("paradise", overworld, 8.0f, Block.portalParadise.id).setDefaultWorldType(WorldTypes.PARADISE_DEFAULT);
+	public static void init(){
+		overworld = new Dimension("overworld", null, 1.0f, -1, WorldTypes.OVERWORLD_DEFAULT);
+		nether = new Dimension("hell", overworld, 0.125f, Blocks.PORTAL_NETHER.id, WorldTypes.NETHER_DEFAULT);
+		paradise = new Dimension("paradise", overworld, 8.0f, Blocks.PORTAL_PARADISE.id, WorldTypes.PARADISE_DEFAULT);
 
 		registerDimension(0, overworld);
 		registerDimension(1, nether);
diff --git a/src/main/java/net/minecraft/core/world/Explosion.java b/src/main/java/net/minecraft/core/world/Explosion.java
index f79b4941e..af1baca0a 100644
--- a/src/main/java/net/minecraft/core/world/Explosion.java
+++ b/src/main/java/net/minecraft/core/world/Explosion.java
@@ -1,16 +1,17 @@
 package net.minecraft.core.world;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.chunk.ChunkPosition;
-import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.util.helper.DamageType;
 
 import java.util.*;
@@ -40,11 +41,11 @@ public class Explosion {
 		explosionZ = z;
 		destroyBlocks = true;
 		if(!world.getGameRuleValue(GameRules.MOB_GRIEFING)) {
-		    destroyBlocks = entity == null || entity instanceof EntityPlayer;
+		    destroyBlocks = entity == null || entity instanceof Player;
 		}
 	}
 
-	public void doExplosionA() {
+	public void explode() {
 	    if(destroyBlocks) calculateBlocksToDestroy();
 	    
 		damageEntities();
@@ -52,12 +53,11 @@ public class Explosion {
 		if(destroyBlocks && isFlaming) createFire();
 	}
 
-    public void doExplosionB(boolean particles) {
+    public void addEffects(boolean particles) {
     	if(!worldObj.isClientSide) {
     		worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, explosionX, explosionY, explosionZ, "random.explode", 4F, (1.0F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F) * 0.7F);	
     	}
-        List<ChunkPosition> arraylist = new ArrayList<>();
-        arraylist.addAll(destroyedBlockPositions);
+        List<ChunkPosition> arraylist = new ArrayList<>(destroyedBlockPositions);
         for (int i = arraylist.size() - 1; i >= 0; i--) {
             ChunkPosition chunkposition = arraylist.get(i);
             
@@ -66,7 +66,7 @@ public class Explosion {
             int z = chunkposition.z;
             
             int id = worldObj.getBlockId(x, y, z);
-            TileEntity tileEntity = worldObj.getBlockTileEntity(x, y, z);
+            BlockEntity blockEntity = worldObj.getBlockEntity(x, y, z);
             if(particles) {
                 double xPos = (double) x + worldObj.rand.nextFloat();
                 double yPos = (double) y + worldObj.rand.nextFloat();
@@ -74,7 +74,7 @@ public class Explosion {
                 double d3 = xPos - explosionX;
                 double d4 = yPos - explosionY;
                 double d5 = zPos - explosionZ;
-                double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
+                double d6 = MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
                 d3 /= d6;
                 d4 /= d6;
                 d5 /= d6;
@@ -88,7 +88,7 @@ public class Explosion {
             }
             if(id > 0)
             {
-                Block.blocksList[id].dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), tileEntity);
+                Block.blocksList[id].dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), blockEntity);
                 worldObj.setBlockWithNotify(x, y, z, 0);
                 Block.blocksList[id].onBlockDestroyedByExplosion(worldObj, x, y, z);
             }
@@ -119,9 +119,9 @@ public class Explosion {
                         if(f1 <= 0.0F) {
                             continue label0;
                         }
-                        int j4 = MathHelper.floor_double(d5);
-                        int k4 = MathHelper.floor_double(d7);
-                        int l4 = MathHelper.floor_double(d9);
+                        int j4 = MathHelper.floor(d5);
+                        int k4 = MathHelper.floor(d7);
+                        int l4 = MathHelper.floor(d9);
                         int i5 = worldObj.getBlockId(j4, k4, l4);
                         if(i5 > 0) {
                             f1 -= (Block.blocksList[i5].getBlastResistance(exploder) + 0.3F) * f2;
@@ -142,26 +142,26 @@ public class Explosion {
 	protected void damageEntities() {
         float explosionSize2 = explosionSize * 2.0f;
         
-        int x1 = MathHelper.floor_double(explosionX - (double) explosionSize2 - 1.0D);
-        int x2 = MathHelper.floor_double(explosionX + (double) explosionSize2 + 1.0D);
-        int y1 = MathHelper.floor_double(explosionY - (double) explosionSize2 - 1.0D);
-        int y2 = MathHelper.floor_double(explosionY + (double) explosionSize2 + 1.0D);
-        int z1 = MathHelper.floor_double(explosionZ - (double) explosionSize2 - 1.0D);
-        int z2 = MathHelper.floor_double(explosionZ + (double) explosionSize2 + 1.0D);
+        int x1 = MathHelper.floor(explosionX - (double) explosionSize2 - 1.0D);
+        int x2 = MathHelper.floor(explosionX + (double) explosionSize2 + 1.0D);
+        int y1 = MathHelper.floor(explosionY - (double) explosionSize2 - 1.0D);
+        int y2 = MathHelper.floor(explosionY + (double) explosionSize2 + 1.0D);
+        int z1 = MathHelper.floor(explosionZ - (double) explosionSize2 - 1.0D);
+        int z2 = MathHelper.floor(explosionZ + (double) explosionSize2 + 1.0D);
         
-        List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(exploder, AABB.getBoundingBoxFromPool(x1, y1, z1, x2, y2, z2));
-        Vec3d vec3d = Vec3d.createVector(explosionX, explosionY, explosionZ);
+        List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(exploder, AABB.getTemporaryBB(x1, y1, z1, x2, y2, z2));
+        Vec3 vec3 = Vec3.getTempVec3(explosionX, explosionY, explosionZ);
         for (Entity entity : list) {
             double d4 = entity.distanceTo(explosionX, explosionY, explosionZ) / (double) explosionSize2;
             if (d4 <= 1.0D) {
                 double d6 = entity.x - explosionX;
                 double d8 = entity.y - explosionY;
                 double d10 = entity.z - explosionZ;
-                double d11 = MathHelper.sqrt_double(d6 * d6 + d8 * d8 + d10 * d10);
+                double d11 = MathHelper.sqrt(d6 * d6 + d8 * d8 + d10 * d10);
                 d6 /= d11;
                 d8 /= d11;
                 d10 /= d11;
-                double d12 = worldObj.func_675_a(vec3d, entity.bb);
+                double d12 = worldObj.getSeenPercent(vec3, entity.bb);
                 double d13 = (1.0D - d4) * d12;
                 entity.hurt(exploder, (int) (((d13 * d13 + d13) / 2D) * 8D * (double) explosionSize2 + 1.0D), DamageType.BLAST);
                 double d14 = d13;
@@ -183,7 +183,7 @@ public class Explosion {
 			int z1 = chunkposition.z;
 			
 			if(worldObj.getBlockId(x1, y1, z1) == 0 && Block.solid[worldObj.getBlockId(x1, y1 - 1, z1)] && ExplosionRNG.nextInt(3) == 0) {
-				worldObj.setBlockWithNotify(x1, y1, z1, Block.fire.id);
+				worldObj.setBlockWithNotify(x1, y1, z1, Blocks.FIRE.id);
 			}
 		}
 	}
diff --git a/src/main/java/net/minecraft/core/world/ExplosionCannonball.java b/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
index ff06bc095..3c4baa9fa 100644
--- a/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
+++ b/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
@@ -1,15 +1,16 @@
 package net.minecraft.core.world;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.chunk.ChunkPosition;
-import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.util.helper.DamageType;
 
 import java.util.*;
@@ -22,7 +23,7 @@ public class ExplosionCannonball extends Explosion{
     }
 
     @Override
-	public void doExplosionA()
+	public void explode()
     {
         int i = 16;
         for(int j = 0; j < i; j++)
@@ -54,9 +55,9 @@ public class ExplosionCannonball extends Explosion{
                         {
                             continue label0;
                         }
-                        int j4 = MathHelper.floor_double(d5);
-                        int k4 = MathHelper.floor_double(d7);
-                        int l4 = MathHelper.floor_double(d9);
+                        int j4 = MathHelper.floor(d5);
+                        int k4 = MathHelper.floor(d7);
+                        int l4 = MathHelper.floor(d9);
                         int i5 = worldObj.getBlockId(j4, k4, l4);
                         if(i5 > 0)
                         {
@@ -78,15 +79,15 @@ public class ExplosionCannonball extends Explosion{
         }
 
         explosionSize *= 2.0F;
-        int k = MathHelper.floor_double(explosionX - (double)explosionSize - 1.0D);
-        int i1 = MathHelper.floor_double(explosionX + (double)explosionSize + 1.0D);
-        int k1 = MathHelper.floor_double(explosionY - (double)explosionSize - 1.0D);
-        int l1 = MathHelper.floor_double(explosionY + (double)explosionSize + 1.0D);
-        int i2 = MathHelper.floor_double(explosionZ - (double)explosionSize - 1.0D);
-        int j2 = MathHelper.floor_double(explosionZ + (double)explosionSize + 1.0D);
+        int k = MathHelper.floor(explosionX - (double)explosionSize - 1.0D);
+        int i1 = MathHelper.floor(explosionX + (double)explosionSize + 1.0D);
+        int k1 = MathHelper.floor(explosionY - (double)explosionSize - 1.0D);
+        int l1 = MathHelper.floor(explosionY + (double)explosionSize + 1.0D);
+        int i2 = MathHelper.floor(explosionZ - (double)explosionSize - 1.0D);
+        int j2 = MathHelper.floor(explosionZ + (double)explosionSize + 1.0D);
 //        List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(exploder, AABB.getBoundingBoxFromPool(k, k1, i2, i1, l1, j2));
-        List<Entity> list = worldObj.getEntitiesWithinAABB(Entity.class, AABB.getBoundingBoxFromPool(k, k1, i2, i1, l1, j2)); // Cannon balls can explode their owners
-        Vec3d vec3d = Vec3d.createVector(explosionX, explosionY, explosionZ);
+        List<Entity> list = worldObj.getEntitiesWithinAABB(Entity.class, AABB.getTemporaryBB(k, k1, i2, i1, l1, j2)); // Cannon balls can explode their owners
+        Vec3 vec3 = Vec3.getTempVec3(explosionX, explosionY, explosionZ);
         for(int k2 = 0; k2 < list.size(); k2++)
         {
             Entity entity = list.get(k2);
@@ -96,11 +97,11 @@ public class ExplosionCannonball extends Explosion{
                 double d6 = entity.x - explosionX;
                 double d8 = entity.y - explosionY;
                 double d10 = entity.z - explosionZ;
-                double d11 = MathHelper.sqrt_double(d6 * d6 + d8 * d8 + d10 * d10);
+                double d11 = MathHelper.sqrt(d6 * d6 + d8 * d8 + d10 * d10);
                 d6 *= 2.5;
                 d8 /= d11;
                 d10 *= 2.5;
-                double d12 = worldObj.func_675_a(vec3d, entity.bb);
+                double d12 = worldObj.getSeenPercent(vec3, entity.bb);
                 double d13 = (1.0D - d4) * d12;
                 entity.hurt(exploder, (int)(((d13 * d13 + d13) / 2D) * 8D * (double)explosionSize + 1.0D), DamageType.BLAST);
                 entity.xd += d6 * d13;
@@ -122,7 +123,7 @@ public class ExplosionCannonball extends Explosion{
                 int i4 = worldObj.getBlockId(i3, j3 - 1, k3);
                 if(l3 == 0 && Block.solid[i4] && ExplosionRNG.nextInt(3) == 0)
                 {
-                    worldObj.setBlockWithNotify(i3, j3, k3, Block.fire.id);
+                    worldObj.setBlockWithNotify(i3, j3, k3, Blocks.FIRE.id);
                 }
             }
 
@@ -130,7 +131,7 @@ public class ExplosionCannonball extends Explosion{
     }
 
     @Override
-	public void doExplosionB(boolean flag)
+	public void addEffects(boolean flag)
     {
     	if(!worldObj.isClientSide) {
     		worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, explosionX, explosionY, explosionZ, "random.explode", 4F, (1.0F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F) * 0.7F);	
@@ -143,7 +144,7 @@ public class ExplosionCannonball extends Explosion{
             int y = chunkposition.y;
             int z = chunkposition.z;
             int i1 = worldObj.getBlockId(x, y, z);
-            TileEntity tileEntity = worldObj.getBlockTileEntity(x, y, z);
+            BlockEntity blockEntity = worldObj.getBlockEntity(x, y, z);
             if(flag)
             {
                 double d = (double)x + worldObj.rand.nextFloat();
@@ -152,7 +153,7 @@ public class ExplosionCannonball extends Explosion{
                 double d3 = d - explosionX;
                 double d4 = d1 - explosionY;
                 double d5 = d2 - explosionZ;
-                double d6 = MathHelper.sqrt_double(d3 * d3 + d4 * d4 + d5 * d5);
+                double d6 = MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5);
                 d3 /= d6;
                 d4 /= d6;
                 d5 /= d6;
@@ -164,14 +165,14 @@ public class ExplosionCannonball extends Explosion{
                 worldObj.spawnParticle("explode", (d + explosionX) / 2D, (d1 + explosionY) / 2D, (d2 + explosionZ) / 2D, d3, d4, d5, 0 );
                 worldObj.spawnParticle("smoke", d, d1, d2, d3, d4, d5, 0);
             }
-            if(i1 > 0 && (Block.blocksList[i1].id == Block.glass.id
+            if(i1 > 0 && (Block.blocksList[i1].id == Blocks.GLASS.id
                     ||  Block.blocksList[i1].blockMaterial == Material.topSnow
                     ||  Block.blocksList[i1].blockMaterial == Material.plant
                     ||  Block.blocksList[i1].blockMaterial == Material.web
                     ||  Block.blocksList[i1].blockMaterial == Material.decoration
                     ||  Block.blocksList[i1].blockMaterial == Material.ice))
             {
-                Block.blocksList[i1].dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), tileEntity);
+                Block.blocksList[i1].dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), blockEntity);
                 worldObj.setBlockWithNotify(x, y, z, 0);
                 Block.blocksList[i1].onBlockDestroyedByExplosion(worldObj, x, y, z);
             }
diff --git a/src/main/java/net/minecraft/core/world/LevelListener.java b/src/main/java/net/minecraft/core/world/LevelListener.java
index 03d381c3f..2df368461 100644
--- a/src/main/java/net/minecraft/core/world/LevelListener.java
+++ b/src/main/java/net/minecraft/core/world/LevelListener.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.world;
 
 // Referenced classes of package net.minecraft.src:
-//            Entity, TileEntity, EntityPlayer
+//            Entity, BlockEntity, Player
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.sound.SoundCategory;
 
 public interface LevelListener
@@ -50,7 +50,7 @@ public interface LevelListener
 
     void playStreamingMusic(String soundPath, String Author, int x, int y, int z);
 
-    void tileEntityChanged(int x, int y, int z, TileEntity tileEntity);
+    void tileEntityChanged(int x, int y, int z, BlockEntity blockEntity);
 
-    void levelEvent(EntityPlayer player, int id, int x, int y, int z, int data);
+    void levelEvent(Player player, int id, int x, int y, int z, int data);
 }
diff --git a/src/main/java/net/minecraft/core/world/PortalHandler.java b/src/main/java/net/minecraft/core/world/PortalHandler.java
index b1c487cb8..951f79909 100644
--- a/src/main/java/net/minecraft/core/world/PortalHandler.java
+++ b/src/main/java/net/minecraft/core/world/PortalHandler.java
@@ -3,14 +3,14 @@ package net.minecraft.core.world;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockPortal;
+import net.minecraft.core.block.PortalBlock;
 import net.minecraft.core.world.type.WorldType;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Entity, MathHelper, World, Block, 
-//            BlockPortal, Material
+//            PortalBlock, Material
 
 public class PortalHandler
 {
@@ -36,8 +36,8 @@ public class PortalHandler
         int closestPortalX = 0;
         int closestPortalY = 0;
         int closestPortalZ = 0;
-        int entityBlockX = MathHelper.floor_double(entity.x);
-        int entityBlockZ = MathHelper.floor_double(entity.z);
+        int entityBlockX = MathHelper.floor(entity.x);
+        int entityBlockZ = MathHelper.floor(entity.z);
         
         WorldType oldWorldType = oldDim.getDimensionData(world).getWorldType();
         WorldType newWorldType = newDim.getDimensionData(world).getWorldType();
@@ -140,9 +140,9 @@ public class PortalHandler
 
         byte portalSearchRadius = 16;
         double lowestEntityDistance = -1D;
-        int blockX = MathHelper.floor_double(entity.x);
-        int blockY = MathHelper.floor_double(entityPosYScaled);
-        int blockZ = MathHelper.floor_double(entity.z);
+        int blockX = MathHelper.floor(entity.x);
+        int blockY = MathHelper.floor(entityPosYScaled);
+        int blockZ = MathHelper.floor(entity.z);
         int closestPortalX = blockX;
         int closestPortalY = blockY;
         int closestPortalZ = blockZ;
@@ -153,12 +153,12 @@ public class PortalHandler
         
         if (newDim.homeDim == null)
         {
-        	targetPortalFrameId = ((BlockPortal) Block.blocksList[oldDim.portalBlockId]).portalFrameId;
+        	targetPortalFrameId = ((PortalBlock) Block.blocksList[oldDim.portalBlockId]).portalFrameId;
         	targetPortalId = oldDim.portalBlockId;
         }
         else
         {
-        	targetPortalFrameId = ((BlockPortal)Block.blocksList[newDim.portalBlockId]).portalFrameId;
+        	targetPortalFrameId = ((PortalBlock)Block.blocksList[newDim.portalBlockId]).portalFrameId;
         	targetPortalId = newDim.portalBlockId;
         }
         
@@ -324,7 +324,7 @@ label1:
 
             }
             
-            ((BlockPortal)Block.blocksList[targetPortalId]).tryToCreatePortal(world, portalX,  portalY,  portalZ);
+            ((PortalBlock)Block.blocksList[targetPortalId]).tryToCreatePortal(world, portalX,  portalY,  portalZ);
 
             world.editingBlocks = false;
             for(int k6 = 0; k6 < 4; k6++)
diff --git a/src/main/java/net/minecraft/core/world/SpawnerMobs.java b/src/main/java/net/minecraft/core/world/SpawnerMobs.java
index 9f7098a11..6257ec3c7 100644
--- a/src/main/java/net/minecraft/core/world/SpawnerMobs.java
+++ b/src/main/java/net/minecraft/core/world/SpawnerMobs.java
@@ -1,18 +1,18 @@
 package net.minecraft.core.world;
 
-import net.minecraft.core.block.BlockBed;
+import net.minecraft.core.block.BedBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.data.gamerule.GameRules;
-import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.SpawnListEntry;
-import net.minecraft.core.entity.monster.EntityArmoredZombie;
-import net.minecraft.core.entity.monster.EntitySkeleton;
-import net.minecraft.core.entity.monster.EntitySpider;
-import net.minecraft.core.entity.monster.EntityZombie;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.enums.EnumCreatureType;
+import net.minecraft.core.entity.monster.SkeletonMob;
+import net.minecraft.core.entity.monster.ZombieArmoredMob;
+import net.minecraft.core.entity.monster.SpiderMob;
+import net.minecraft.core.entity.monster.ZombieMob;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.enums.MobCategory;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.chunk.ChunkCoordinate;
@@ -45,9 +45,9 @@ public final class SpawnerMobs
         if(!spawnHostileMobs && !spawnPassiveMobs) { return 0; }
         eligibleChunksForSpawning.clear();
 
-        for (EntityPlayer player : world.players){
-            final int playerChunkX = MathHelper.floor_double(player.x / (double) Chunk.CHUNK_SIZE_X);
-            final int playerChunkZ = MathHelper.floor_double(player.z / (double) Chunk.CHUNK_SIZE_Z);
+        for (Player player : world.players){
+            final int playerChunkX = MathHelper.floor(player.x / (double) Chunk.CHUNK_SIZE_X);
+            final int playerChunkZ = MathHelper.floor(player.z / (double) Chunk.CHUNK_SIZE_Z);
             final byte spawnRadius = 8;
 
             for(int dx = -spawnRadius; dx <= spawnRadius; ++dx) {
@@ -69,11 +69,11 @@ public final class SpawnerMobs
         }
 
 
-        for (EnumCreatureType creatureType : EnumCreatureType.values()) {
+        for (MobCategory creatureType : MobCategory.values()) {
 
-            if (creatureType.getPeacefulCreature() && !spawnPassiveMobs) continue;
-            if (!creatureType.getPeacefulCreature() && !spawnHostileMobs) continue;
-            if (world.countEntities(creatureType.getCreatureClass()) > ((creatureType.getMaxNumberOfCreature() * eligibleChunksForSpawning.size()) / 256))
+            if (creatureType.isPeaceful() && !spawnPassiveMobs) continue;
+            if (!creatureType.isPeaceful() && !spawnHostileMobs) continue;
+            if (world.countEntities(creatureType.getBaseClass()) > ((creatureType.getMaxCreaturesPerChunk() * eligibleChunksForSpawning.size()) / 256))
                 continue;
 
             chunkLoop: for (ChunkCoordinate chunk : eligibleChunksForSpawning) {
@@ -115,7 +115,7 @@ public final class SpawnerMobs
                 final int x = pos.x;
                 final int y = pos.y;
                 final int z = pos.z;
-                if (world.isBlockNormalCube(x, y, z) || world.getBlockMaterial(x, y, z) != creatureType.getCreatureMaterial())
+                if (world.isBlockNormalCube(x, y, z) || world.getBlockMaterial(x, y, z) != creatureType.getSpawnMaterial())
                     continue;
 
                 int countSpawned = 0;
@@ -146,16 +146,16 @@ public final class SpawnerMobs
                             if (spawnDistanceSquared < 576.0F) continue;
                         }
 
-                        EntityLiving mobToSpawn;
+                        Mob mobToSpawn;
                         try {
-                            mobToSpawn = (EntityLiving) spawnListEntry.entityClass.getConstructor(new Class[]{World.class}).newInstance(new Object[]{world});
+                            mobToSpawn = (Mob) spawnListEntry.entityClass.getConstructor(new Class[]{World.class}).newInstance(new Object[]{world});
                         } catch (Exception e) {
                             new RuntimeException("Error spawning entity class '" + spawnListEntry.entityClass.getSimpleName() + "' class missing default constructor for World! Skipping spawn attempt!", e).printStackTrace();
                             return totalSpawned;
                         }
 
                         mobToSpawn.moveTo(dx, dy, dz, world.rand.nextFloat() * 360.0F, 0.0F);
-                        if (!mobToSpawn.getCanSpawnHere()) {
+                        if (!mobToSpawn.canSpawnHere()) {
                             continue;
                         }
 
@@ -173,9 +173,9 @@ public final class SpawnerMobs
         return totalSpawned;
     }
 
-    private static boolean canCreatureTypeSpawnAtLocation(EnumCreatureType enumcreaturetype, World world, int x, int y, int z)
+    private static boolean canCreatureTypeSpawnAtLocation(MobCategory enumcreaturetype, World world, int x, int y, int z)
     {
-        if(enumcreaturetype.getCreatureMaterial() == Material.water)
+        if(enumcreaturetype.getSpawnMaterial() == Material.water)
         {
             return world.getBlockMaterial(x, y, z).isLiquid() && !world.isBlockNormalCube(x, y + 1, z);
         } else
@@ -184,7 +184,7 @@ public final class SpawnerMobs
         }
     }
 
-	public static boolean performSleepSpawning(World world, List<EntityPlayer> list)
+	public static boolean performSleepSpawning(World world, List<Player> list)
     {
         if (!world.getGameRuleValue(GameRules.DO_NIGHTMARES))
         {
@@ -194,7 +194,7 @@ public final class SpawnerMobs
 		PathFinder pathFinder = new PathFinder(world);
 
         // For each player in the player list
-		for (EntityPlayer player : list)
+		for (Player player : list)
         {
             // Ignore conditions where monsters shouldn't spawn
 			if (!player.isPlayerSleeping())
@@ -216,9 +216,9 @@ public final class SpawnerMobs
 				while (i < 20 && !spawnedEntityForPlayer)
                 {
                     // Get a random location for the monster to spawn
-					int x = MathHelper.floor_double(player.x) + world.rand.nextInt(32) - world.rand.nextInt(32);
-					int z = MathHelper.floor_double(player.z) + world.rand.nextInt(32) - world.rand.nextInt(32);
-					int y = MathHelper.floor_double(player.y) + world.rand.nextInt(16) - world.rand.nextInt(16);
+					int x = MathHelper.floor(player.x) + world.rand.nextInt(32) - world.rand.nextInt(32);
+					int z = MathHelper.floor(player.z) + world.rand.nextInt(32) - world.rand.nextInt(32);
+					int y = MathHelper.floor(player.y) + world.rand.nextInt(16) - world.rand.nextInt(16);
 					y = MathHelper.clamp(y, 1, world.getHeightBlocks());
 					
 					int spawnY = y;
@@ -231,7 +231,7 @@ public final class SpawnerMobs
 
                     // Make sure we're allowed to spawn in this Y coordinate
 					while(
-                            !canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, world, x, spawnY, z) &&
+                            !canCreatureTypeSpawnAtLocation(MobCategory.monster, world, x, spawnY, z) &&
                             spawnY < y + 16 &&
                             spawnY < world.getHeightBlocks()
                     )
@@ -249,10 +249,10 @@ public final class SpawnerMobs
 						float entityY = spawnY;
 						float entityZ = z + 0.5f;
 						
-						EntityLiving entity;
+						Mob entity;
 						try
                         {
-							entity = (EntityLiving) entityClasses[world.rand.nextInt(entityClasses.length)].getConstructor(World.class).newInstance(world);
+							entity = (Mob) entityClasses[world.rand.nextInt(entityClasses.length)].getConstructor(World.class).newInstance(world);
 						}
                         catch (Exception e)
                         {
@@ -261,15 +261,15 @@ public final class SpawnerMobs
 						}
 						
 						entity.moveTo(entityX, entityY, entityZ, world.rand.nextFloat() * 360.0f, 0.0f);
-						if(entity.getCanSpawnHere())
+						if(entity.canSpawnHere())
                         {
 							Path pathEntity = pathFinder.findPath(entity, player, 32.0f);
 							if(pathEntity != null && pathEntity.length > 1)
                             {
 								Node pathPoint = pathEntity.last();
-                                boolean isCollisionFree = world.checkBlockCollisionBetweenPoints(Vec3d.createVector(player.x, player.y + 1.5f, player.z), Vec3d.createVector(pathPoint.x, pathPoint.y + 1.5f, pathPoint.z)) == null;
+                                boolean isCollisionFree = world.checkBlockCollisionBetweenPoints(Vec3.getTempVec3(player.x, player.y + 1.5f, player.z), Vec3.getTempVec3(pathPoint.x, pathPoint.y + 1.5f, pathPoint.z)) == null;
 								if(Math.abs(pathPoint.x + 0.5f - player.x) < 1.5 && Math.abs(pathPoint.z + 0.5f - player.z) < 1.5 && Math.abs(pathPoint.y + 0.5f - player.y) < 1.5 && isCollisionFree) {
-									ChunkCoordinates pos = BlockBed.getNearestEmptyChunkCoordinates(world, MathHelper.floor_double(player.x), MathHelper.floor_double(player.y), MathHelper.floor_double(player.z), 1);
+									ChunkCoordinates pos = BedBlock.getNearestEmptyChunkCoordinates(world, MathHelper.floor(player.x), MathHelper.floor(player.y), MathHelper.floor(player.z), 1);
 									if(pos == null) {
 										pos = new ChunkCoordinates(x, spawnY + 1, z);
 									}
@@ -298,7 +298,7 @@ public final class SpawnerMobs
     static 
     {
         nightSpawnEntities = new Class[] {
-            EntitySpider.class, EntityZombie.class, EntitySkeleton.class, EntityArmoredZombie.class
+            SpiderMob.class, ZombieMob.class, SkeletonMob.class, ZombieArmoredMob.class
         };
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index 9e953dda8..858c08536 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -20,30 +20,29 @@ import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.util.debug.Debug;
 import net.minecraft.client.world.chunk.provider.ChunkProviderViewer;
 import net.minecraft.core.Global;
-import net.minecraft.core.HitResult;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.NextTickListEntry;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluid;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.data.gamerule.GameRule;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.BlockSound;
-import net.minecraft.core.sound.BlockSoundDispatcher;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
@@ -68,22 +67,23 @@ import net.minecraft.core.world.type.WorldType;
 import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.weather.Weather;
 import net.minecraft.core.world.weather.WeatherManager;
+import net.minecraft.core.world.weather.Weathers;
 import org.jetbrains.annotations.Nullable;
 
 public class World implements WorldSource {
 
     public static boolean AUTOSAVE = true;
 
-    private final int heightBlocks = 256;
-    private final int heightBits = -1;
+    public static final int HEIGHT_BLOCKS = 256;
+    public static final int MAX_BRIGHTNESS = 15;
     private final List<LightUpdate> lightingToUpdate = new LinkedList<>();
     public List<Entity> loadedEntityList = new ArrayList<>();
     private final List<Entity> unloadedEntityList = new ArrayList<>();
     private final TreeSet<NextTickListEntry> scheduledTickTreeSet = new TreeSet<>();
     private final Set<NextTickListEntry> scheduledTickSet = new HashSet<>();
-    public List<TileEntity> loadedTileEntityList = new ArrayList<>();
-    private final List<TileEntity> field_30900_E = new ArrayList<>();
-    public List<EntityPlayer> players = new ArrayList<>();
+    public List<BlockEntity> loadedBlockEntityList = new ArrayList<>();
+    private final List<BlockEntity> field_30900_E = new ArrayList<>();
+    public List<Player> players = new ArrayList<>();
     public List<Entity> weatherEffects = new ArrayList<>();
     public final ArrayList<AABB> collidingBoundingBoxes = new ArrayList<>();
     public List<LevelListener> listeners = new ArrayList<>();
@@ -205,7 +205,7 @@ public class World implements WorldSource {
 
         auroraProvider = new AuroraProvider(this, seed);
 
-        seasonManager = SeasonManager.fromConfig(this, this.worldType.getDefaultSeasonConfig());
+        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
 
         biomeProvider = this.worldType.createBiomeProvider(this);
         
@@ -248,7 +248,7 @@ public class World implements WorldSource {
         savedDataStorage = new SavedDataStorage(saveHandler);
         this.dimension = dimension;
         chunkProvider = createChunkProvider();
-        seasonManager = SeasonManager.fromConfig(this, this.worldType.getDefaultSeasonConfig());
+        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
 
         biomeProvider = this.worldType.createBiomeProvider(this);
 
@@ -268,7 +268,7 @@ public class World implements WorldSource {
         this.worldType = worldType;
         savedDataStorage = new SavedDataStorage(saveHandler);
         chunkProvider = createChunkProvider();
-        seasonManager = SeasonManager.fromConfig(this, this.worldType.getDefaultSeasonConfig());
+        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
         updateSkyBrightness();
 
         this.weatherManager = new WeatherManager(this);
@@ -284,7 +284,7 @@ public class World implements WorldSource {
         levelData = new LevelData(0, "modelviewer");
         this.worldType = WorldTypes.DEBUG;
         chunkProvider = new ChunkProviderViewer(this);
-        seasonManager = SeasonManager.fromConfig(this, this.worldType.getDefaultSeasonConfig());
+        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
         updateSkyBrightness();
 
         this.weatherManager = new WeatherManager(this);
@@ -337,7 +337,7 @@ public class World implements WorldSource {
         return getBlockId(x, y, z);
     }
 
-    public void spawnPlayerWithLoadedChunks(EntityPlayer player)
+    public void spawnPlayerWithLoadedChunks(Player player)
     {
         try
         {
@@ -913,7 +913,7 @@ public class World implements WorldSource {
     {
         if(i < 0xfe17b800 || k < 0xfe17b800 || i >= 0x1e84800 || k > 0x1e84800)
         {
-            return 15;
+            return MAX_BRIGHTNESS;
         }
         if(flag)
         {
@@ -1014,7 +1014,7 @@ public class World implements WorldSource {
         {
             if(canExistingBlockSeeTheSky(x, y, z))
             {
-                lightValue = 15;
+                lightValue = MAX_BRIGHTNESS;
             }
         }
         else if(lightLayer == LightLayer.Block)
@@ -1130,34 +1130,34 @@ public class World implements WorldSource {
     }
 
     @Nullable
-    public HitResult checkBlockCollisionBetweenPoints(Vec3d start, Vec3d end)
+    public HitResult checkBlockCollisionBetweenPoints(Vec3 start, Vec3 end)
     {
         return checkBlockCollisionBetweenPoints(start, end, false, false);
     }
 
     @Nullable
-    public HitResult checkBlockCollisionBetweenPoints(Vec3d start, Vec3d end, boolean shouldCollideWithFluids)
+    public HitResult checkBlockCollisionBetweenPoints(Vec3 start, Vec3 end, boolean shouldCollideWithFluids)
     {
         return checkBlockCollisionBetweenPoints(start, end, shouldCollideWithFluids, false);
     }
 
     @Nullable
-    public HitResult checkBlockCollisionBetweenPoints(Vec3d start, Vec3d end, boolean shouldCollideWithFluids, boolean flag1)
+    public HitResult checkBlockCollisionBetweenPoints(Vec3 start, Vec3 end, boolean shouldCollideWithFluids, boolean flag1)
     {
-        if(Double.isNaN(start.xCoord) || Double.isNaN(start.yCoord) || Double.isNaN(start.zCoord))
+        if(Double.isNaN(start.x) || Double.isNaN(start.y) || Double.isNaN(start.z))
         {
             return null;
         }
-        if(Double.isNaN(end.xCoord) || Double.isNaN(end.yCoord) || Double.isNaN(end.zCoord))
+        if(Double.isNaN(end.x) || Double.isNaN(end.y) || Double.isNaN(end.z))
         {
             return null;
         }
-        int blockEndX = MathHelper.floor_double(end.xCoord);
-        int blockEndY = MathHelper.floor_double(end.yCoord);
-        int blockEndZ = MathHelper.floor_double(end.zCoord);
-        int blockStartX = MathHelper.floor_double(start.xCoord);
-        int blockStartY = MathHelper.floor_double(start.yCoord);
-        int blockStartZ = MathHelper.floor_double(start.zCoord);
+        int blockEndX = MathHelper.floor(end.x);
+        int blockEndY = MathHelper.floor(end.y);
+        int blockEndZ = MathHelper.floor(end.z);
+        int blockStartX = MathHelper.floor(start.x);
+        int blockStartY = MathHelper.floor(start.y);
+        int blockStartZ = MathHelper.floor(start.z);
         int id = getBlockId(blockStartX, blockStartY, blockStartZ);
         int meta = getBlockMetadata(blockStartX, blockStartY, blockStartZ);
         Block block = Block.blocksList[id];
@@ -1171,7 +1171,7 @@ public class World implements WorldSource {
         }
         for(int l1 = 200; l1-- >= 0;)
         {
-            if(Double.isNaN(start.xCoord) || Double.isNaN(start.yCoord) || Double.isNaN(start.zCoord))
+            if(Double.isNaN(start.x) || Double.isNaN(start.y) || Double.isNaN(start.z))
             {
                 return null;
             }
@@ -1221,20 +1221,20 @@ public class World implements WorldSource {
             double d3 = 999D;
             double d4 = 999D;
             double d5 = 999D;
-            double d6 = end.xCoord - start.xCoord;
-            double d7 = end.yCoord - start.yCoord;
-            double d8 = end.zCoord - start.zCoord;
+            double d6 = end.x - start.x;
+            double d7 = end.y - start.y;
+            double d8 = end.z - start.z;
             if(flag2)
             {
-                d3 = (d - start.xCoord) / d6;
+                d3 = (d - start.x) / d6;
             }
             if(flag3)
             {
-                d4 = (d1 - start.yCoord) / d7;
+                d4 = (d1 - start.y) / d7;
             }
             if(flag4)
             {
-                d5 = (d2 - start.zCoord) / d8;
+                d5 = (d2 - start.z) / d8;
             }
             byte byte0 = 0;
             if(d3 < d4 && d3 < d5)
@@ -1246,9 +1246,9 @@ public class World implements WorldSource {
                 {
                     byte0 = 5;
                 }
-                start.xCoord = d;
-                start.yCoord += d7 * d3;
-                start.zCoord += d8 * d3;
+                start.x = d;
+                start.y += d7 * d3;
+                start.z += d8 * d3;
             } else
             if(d4 < d5)
             {
@@ -1259,9 +1259,9 @@ public class World implements WorldSource {
                 {
                     byte0 = 1;
                 }
-                start.xCoord += d6 * d4;
-                start.yCoord = d1;
-                start.zCoord += d8 * d4;
+                start.x += d6 * d4;
+                start.y = d1;
+                start.z += d8 * d4;
             } else
             {
                 if(blockEndZ > blockStartZ)
@@ -1271,28 +1271,28 @@ public class World implements WorldSource {
                 {
                     byte0 = 3;
                 }
-                start.xCoord += d6 * d5;
-                start.yCoord += d7 * d5;
-                start.zCoord = d2;
+                start.x += d6 * d5;
+                start.y += d7 * d5;
+                start.z = d2;
             }
-            Vec3d vec3d2 = Vec3d.createVector(start.xCoord, start.yCoord, start.zCoord);
-            blockStartX = (int)(vec3d2.xCoord = MathHelper.floor_double(start.xCoord));
+            Vec3 vec32 = Vec3.getTempVec3(start.x, start.y, start.z);
+            blockStartX = (int)(vec32.x = MathHelper.floor(start.x));
             if(byte0 == 5)
             {
                 blockStartX--;
-                vec3d2.xCoord++;
+                vec32.x++;
             }
-            blockStartY = (int)(vec3d2.yCoord = MathHelper.floor_double(start.yCoord));
+            blockStartY = (int)(vec32.y = MathHelper.floor(start.y));
             if(byte0 == 1)
             {
                 blockStartY--;
-                vec3d2.yCoord++;
+                vec32.y++;
             }
-            blockStartZ = (int)(vec3d2.zCoord = MathHelper.floor_double(start.zCoord));
+            blockStartZ = (int)(vec32.z = MathHelper.floor(start.z));
             if(byte0 == 3)
             {
                 blockStartZ--;
-                vec3d2.zCoord++;
+                vec32.z++;
             }
             int j2 = getBlockId(blockStartX, blockStartY, blockStartZ);
             int k2 = getBlockMetadata(blockStartX, blockStartY, blockStartZ);
@@ -1332,7 +1332,7 @@ public class World implements WorldSource {
     {
         if (block == null) return;
 
-        BlockSound sound = BlockSoundDispatcher.getInstance().getDispatch(block);
+        BlockSound sound = block.getSound();
         if (sound == null) return;
 
         String name;
@@ -1386,14 +1386,14 @@ public class World implements WorldSource {
 
     public boolean entityJoinedWorld(Entity entity)
     {
-        int i = MathHelper.floor_double(entity.x / Chunk.CHUNK_SIZE_X);
-        int j = MathHelper.floor_double(entity.z / Chunk.CHUNK_SIZE_Z);
-        boolean flag = entity instanceof EntityPlayer;
+        int i = MathHelper.floor(entity.x / Chunk.CHUNK_SIZE_X);
+        int j = MathHelper.floor(entity.z / Chunk.CHUNK_SIZE_Z);
+        boolean flag = entity instanceof Player;
         if(flag || isChunkLoaded(i, j))
         {
-            if(entity instanceof EntityPlayer)
+            if(entity instanceof Player)
             {
-                EntityPlayer entityplayer = (EntityPlayer)entity;
+                Player entityplayer = (Player)entity;
                 players.add(entityplayer);
                 updateEnoughPlayersSleepingFlag(null);
             }
@@ -1437,9 +1437,9 @@ public class World implements WorldSource {
             entity.startRiding(null);
         }
         entity.remove();
-        if(entity instanceof EntityPlayer)
+        if(entity instanceof Player)
         {
-            players.remove((EntityPlayer)entity);
+            players.remove((Player)entity);
             updateEnoughPlayersSleepingFlag(null);
         }
     }
@@ -1447,9 +1447,9 @@ public class World implements WorldSource {
     public void removePlayer(Entity entity)
     {
         entity.remove();
-        if(entity instanceof EntityPlayer)
+        if(entity instanceof Player)
         {
-            players.remove((EntityPlayer)entity);
+            players.remove((Player)entity);
             updateEnoughPlayersSleepingFlag(null);
         }
         int i = entity.chunkCoordX;
@@ -1475,12 +1475,12 @@ public class World implements WorldSource {
     {
         collidingBoundingBoxes.clear();
 
-        int minX = MathHelper.floor_double(axisalignedbb.minX);
-        int maxX = MathHelper.floor_double(axisalignedbb.maxX + 1.0D);
-        int minY = MathHelper.floor_double(axisalignedbb.minY);
-        int maxY = MathHelper.floor_double(axisalignedbb.maxY + 1.0D);
-        int minZ = MathHelper.floor_double(axisalignedbb.minZ);
-        int maxZ = MathHelper.floor_double(axisalignedbb.maxZ + 1.0D);
+        int minX = MathHelper.floor(axisalignedbb.minX);
+        int maxX = MathHelper.floor(axisalignedbb.maxX + 1.0D);
+        int minY = MathHelper.floor(axisalignedbb.minY);
+        int maxY = MathHelper.floor(axisalignedbb.maxY + 1.0D);
+        int minZ = MathHelper.floor(axisalignedbb.minZ);
+        int maxZ = MathHelper.floor(axisalignedbb.maxZ + 1.0D);
         for(int dx = minX - 1; dx <= maxX; dx++)
         {
             for(int dz = minZ - 1; dz <= maxZ; dz++)
@@ -1507,10 +1507,10 @@ public class World implements WorldSource {
         }
 
         double radius = 0.25D;
-        List<Entity> list = getEntitiesWithinAABBExcludingEntity(entity, axisalignedbb.expand(radius, radius, radius));
+        List<Entity> list = getEntitiesWithinAABBExcludingEntity(entity, axisalignedbb.grow(radius, radius, radius));
         for (Entity value : list) {
             AABB axisalignedbb1 = value.getBb();
-            if (axisalignedbb1 != null && axisalignedbb1.intersectsWith(axisalignedbb)) {
+            if (axisalignedbb1 != null && axisalignedbb1.intersects(axisalignedbb)) {
                 collidingBoundingBoxes.add(axisalignedbb1);
             }
         }
@@ -1521,12 +1521,12 @@ public class World implements WorldSource {
     public List<AABB> getCollidingSolidBlockBoundingBoxes(Entity entity, AABB axisalignedbb)
     {
         collidingBoundingBoxes.clear();
-        int minX = MathHelper.floor_double(axisalignedbb.minX);
-        int maxX = MathHelper.floor_double(axisalignedbb.maxX + 1.0D);
-        int minY = MathHelper.floor_double(axisalignedbb.minY);
-        int maxY = MathHelper.floor_double(axisalignedbb.maxY + 1.0D);
-        int minZ = MathHelper.floor_double(axisalignedbb.minZ);
-        int maxZ = MathHelper.floor_double(axisalignedbb.maxZ + 1.0D);
+        int minX = MathHelper.floor(axisalignedbb.minX);
+        int maxX = MathHelper.floor(axisalignedbb.maxX + 1.0D);
+        int minY = MathHelper.floor(axisalignedbb.minY);
+        int maxY = MathHelper.floor(axisalignedbb.maxY + 1.0D);
+        int minZ = MathHelper.floor(axisalignedbb.minZ);
+        int maxZ = MathHelper.floor(axisalignedbb.maxZ + 1.0D);
         for(int dx = minX - 1; dx <= maxX; dx++)
         {
             for(int dz = minZ - 1; dz <= maxZ; dz++)
@@ -1541,7 +1541,7 @@ public class World implements WorldSource {
                     if(block != null && block.isSolidRender())
                     {
                         // ignore mesh blocks if entity is instance of an item
-                        if(!(entity instanceof EntityItem && (block.id == Block.mesh.id || block.id == Block.spikes.id || block.id == Block.mobspawner.id)))
+                        if(!(entity instanceof ItemEntity && (block.id == Blocks.MESH.id || block.id == Blocks.SPIKES.id || block.id == Blocks.MOBSPAWNER.id)))
                             block.getCollidingBoundingBoxes(this, dx, dy, dz, axisalignedbb, collidingBoundingBoxes);
                     }
                 }
@@ -1551,11 +1551,11 @@ public class World implements WorldSource {
         }
 
         double d = 0.25D;
-        List list = getEntitiesWithinAABBExcludingEntity(entity, axisalignedbb.expand(d, d, d));
+        List list = getEntitiesWithinAABBExcludingEntity(entity, axisalignedbb.grow(d, d, d));
         for(int j2 = 0; j2 < list.size(); j2++)
         {
             AABB axisalignedbb1 = ((Entity)list.get(j2)).getBb();
-            if(axisalignedbb1 != null && axisalignedbb1.intersectsWith(axisalignedbb))
+            if(axisalignedbb1 != null && axisalignedbb1.intersects(axisalignedbb))
             {
                 collidingBoundingBoxes.add(axisalignedbb1);
             }
@@ -1566,17 +1566,17 @@ public class World implements WorldSource {
 	
 	public float getAmbientBrightness(float partialTicks) {
 		float angle = getCelestialAngle(partialTicks);
-		float bright = 1.0F - (MathHelper.cos(angle * 3.141593F * 2.0F) * 2.0F + 0.2F);
+		float bright = 1.0F - (MathHelper.cos(angle * MathHelper.PI * 2.0F) * 2.0F + 0.2F);
 		bright = 1.0f - MathHelper.clamp(bright, 0.0f, 1.0f);
 		
 		Weather weather = weatherManager.getCurrentWeather();
 		if(weather != null) {
 			// TODO Unhardcode somehow
-			if(weather == Weather.overworldRain) {
+			if(weather == Weathers.OVERWORLD_RAIN) {
 				float power = weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower();
 				bright = (float) (bright * (1.0 - (power * 5.0f) / 16.0));	
 			}
-			if(weather == Weather.overworldStorm) {
+			if(weather == Weathers.OVERWORLD_STORM) {
 				float power = weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower();
 				bright = (float) (bright * (1.0 - (power * 5.0f) / 16.0));
 				bright = (float) (bright * (1.0 - (power * 5.0f) / 16.0));
@@ -1586,10 +1586,10 @@ public class World implements WorldSource {
 		return bright * 0.8f + 0.2f;
 	}
 
-    public Vec3d getSkyColor(ICamera camera, float partialTick)
+    public Vec3 getSkyColor(ICamera camera, float partialTick)
     {
         float f1 = getCelestialAngle(partialTick);
-        float f2 = MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.5F;
+        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
         if(f2 < 0.0F)
         {
             f2 = 0.0F;
@@ -1598,9 +1598,9 @@ public class World implements WorldSource {
         {
             f2 = 1.0F;
         }
-        int x = MathHelper.floor_double(camera.getX(partialTick));
-        int y = MathHelper.floor_double(camera.getY(partialTick));
-        int z = MathHelper.floor_double(camera.getZ(partialTick));
+        int x = MathHelper.floor(camera.getX(partialTick));
+        int y = MathHelper.floor(camera.getY(partialTick));
+        int z = MathHelper.floor(camera.getZ(partialTick));
         float blockTemperature = (float) getBlockTemperature(x, z);
 
         if (seasonManager.getCurrentSeason() != null && (seasonManager.getCurrentSeason() == Seasons.OVERWORLD_WINTER || seasonManager.getCurrentSeason() == Seasons.OVERWORLD_FALL))
@@ -1640,7 +1640,7 @@ public class World implements WorldSource {
             g = g * (1.0F - f12) + 0.8F * f12;
             b = b * (1.0F - f12) + f12;
         }
-        return Vec3d.createVector(r, g, b);
+        return Vec3.getTempVec3(r, g, b);
     }
 
     public float getCelestialAngle(float partialTick)
@@ -1651,10 +1651,10 @@ public class World implements WorldSource {
         return worldType.getCelestialAngle(this, levelData.getWorldTime(), partialTick);
     }
 
-    public Vec3d getDimensionColor(ICamera camera, float partialTick)
+    public Vec3 getDimensionColor(ICamera camera, float partialTick)
     {
         float f1 = getCelestialAngle(partialTick);
-        float f2 = MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.5F;
+        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
         if(f2 < 0.0F)
         {
             f2 = 0.0F;
@@ -1679,10 +1679,10 @@ public class World implements WorldSource {
         r *= f2 * 0.9F + 0.1F;
         g *= f2 * 0.9F + 0.1F;
         b *= f2 * 0.85F + 0.15F;
-        return Vec3d.createVector(r, g, b);
+        return Vec3.getTempVec3(r, g, b);
     }
 
-    public Vec3d getFogColor(ICamera camera, float partialTick)
+    public Vec3 getFogColor(ICamera camera, float partialTick)
     {
     	double x = camera.getX(partialTick);
     	double y = camera.getY(partialTick);
@@ -1737,7 +1737,7 @@ public class World implements WorldSource {
     public float getStarBrightness(float partialTick)
     {
         float f1 = getCelestialAngle(partialTick);
-        float f2 = 1.0F - (MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.75F);
+        float f2 = 1.0F - (MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.75F);
         if(f2 < 0.0F)
         {
             f2 = 0.0F;
@@ -1835,14 +1835,14 @@ public class World implements WorldSource {
         }
 
         field_31055_L = true;
-        Iterator iterator = loadedTileEntityList.iterator();
+        Iterator iterator = loadedBlockEntityList.iterator();
         do
         {
             if(!iterator.hasNext())
             {
                 break;
             }
-            TileEntity tileentity = (TileEntity)iterator.next();
+            BlockEntity tileentity = (BlockEntity)iterator.next();
             if(!tileentity.isInvalid() && isBlockLoaded(tileentity.x, tileentity.y, tileentity.z))
             {
                 tileentity.tick();
@@ -1853,7 +1853,7 @@ public class World implements WorldSource {
                 Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(tileentity.x, Chunk.CHUNK_SIZE_X), Math.floorDiv(tileentity.z, Chunk.CHUNK_SIZE_Z));
                 if(chunk != null)
                 {
-                    chunk.removeTileEntity(tileentity.x & (Chunk.CHUNK_SIZE_X - 1), tileentity.y, tileentity.z & (Chunk.CHUNK_SIZE_Z - 1));
+                    chunk.removeBlockEntity(tileentity.x & (Chunk.CHUNK_SIZE_X - 1), tileentity.y, tileentity.z & (Chunk.CHUNK_SIZE_Z - 1));
                 }
             }
         } while(true);
@@ -1867,17 +1867,17 @@ public class World implements WorldSource {
                 {
                     break;
                 }
-                TileEntity tileentity1 = (TileEntity)iterator1.next();
+                BlockEntity tileentity1 = (BlockEntity)iterator1.next();
                 if(!tileentity1.isInvalid())
                 {
-                    if(!loadedTileEntityList.contains(tileentity1))
+                    if(!loadedBlockEntityList.contains(tileentity1))
                     {
-                        loadedTileEntityList.add(tileentity1);
+                        loadedBlockEntityList.add(tileentity1);
                     }
                     Chunk chunk1 = getChunkFromChunkCoords(Math.floorDiv(tileentity1.x, Chunk.CHUNK_SIZE_X), Math.floorDiv(tileentity1.z, Chunk.CHUNK_SIZE_Z));
                     if(chunk1 != null)
                     {
-                        chunk1.setTileEntity(tileentity1.x & (Chunk.CHUNK_SIZE_X - 1), tileentity1.y, tileentity1.z & (Chunk.CHUNK_SIZE_Z - 1), tileentity1);
+                        chunk1.setBlockEntity(tileentity1.x & (Chunk.CHUNK_SIZE_X - 1), tileentity1.y, tileentity1.z & (Chunk.CHUNK_SIZE_Z - 1), tileentity1);
                     }
                     markBlockNeedsUpdate(tileentity1.x, tileentity1.y, tileentity1.z);
                 }
@@ -1886,14 +1886,14 @@ public class World implements WorldSource {
         }
     }
 
-    public void func_31054_a(Collection collection)
+    public void addAllBlockEntities(Collection<BlockEntity> blockEntities)
     {
         if(field_31055_L)
         {
-            field_30900_E.addAll(collection);
+            field_30900_E.addAll(blockEntities);
         } else
         {
-            loadedTileEntityList.addAll(collection);
+            loadedBlockEntityList.addAll(blockEntities);
         }
     }
 
@@ -1904,14 +1904,14 @@ public class World implements WorldSource {
 
     public void updateEntityWithOptionalForce(Entity entity, boolean flag)
     {
-        int i = MathHelper.floor_double(entity.x);
-        int j = MathHelper.floor_double(entity.z);
+        int i = MathHelper.floor(entity.x);
+        int j = MathHelper.floor(entity.z);
         byte byte0 = 32;
         if(flag && !areBlocksLoaded(i - byte0, 0, j - byte0, i + byte0, getHeightBlocks(), j + byte0))
         {
             //try to despawn if entity wanders into nonexistant chunk
-            if(entity instanceof EntityLiving) {
-                ((EntityLiving) entity).tryToDespawn();
+            if(entity instanceof Mob) {
+                ((Mob) entity).tryToDespawn();
             }
             return;
         }
@@ -1950,9 +1950,9 @@ public class World implements WorldSource {
         {
             entity.yRot = entity.yRotO;
         }
-        int k = MathHelper.floor_double(entity.x / Chunk.CHUNK_SIZE_X);
-        int l = MathHelper.floor_double(entity.y / 16D);
-        int i1 = MathHelper.floor_double(entity.z / Chunk.CHUNK_SIZE_Z);
+        int k = MathHelper.floor(entity.x / Chunk.CHUNK_SIZE_X);
+        int l = MathHelper.floor(entity.y / 16D);
+        int i1 = MathHelper.floor(entity.z / Chunk.CHUNK_SIZE_Z);
         if(!entity.addedToChunk || entity.chunkCoordX != k || entity.chunkCoordY != l || entity.chunkCoordZ != i1)
         {
             if(entity.addedToChunk && isChunkLoaded(entity.chunkCoordX, entity.chunkCoordZ))
@@ -1988,7 +1988,7 @@ public class World implements WorldSource {
         for(int i = 0; i < list.size(); i++)
         {
             Entity entity = (Entity)list.get(i);
-            if (entity instanceof EntityFireflyCluster) continue;
+            if (entity instanceof FireflyClusterMob) continue;
             if(!entity.removed && entity.blocksBuilding)
             {
                 return false;
@@ -1999,12 +1999,12 @@ public class World implements WorldSource {
     }
     
 	public boolean getIsAnySolidGround(AABB boundingBox) {
-		int minX = MathHelper.floor_double(boundingBox.minX);
-		int maxX = MathHelper.floor_double(boundingBox.maxX);
-		int minY = MathHelper.floor_double(boundingBox.minY);
-		int maxY = MathHelper.floor_double(boundingBox.maxY);
-		int minZ = MathHelper.floor_double(boundingBox.minZ);
-		int maxZ = MathHelper.floor_double(boundingBox.maxZ);
+		int minX = MathHelper.floor(boundingBox.minX);
+		int maxX = MathHelper.floor(boundingBox.maxX);
+		int minY = MathHelper.floor(boundingBox.minY);
+		int maxY = MathHelper.floor(boundingBox.maxY);
+		int minZ = MathHelper.floor(boundingBox.minZ);
+		int maxZ = MathHelper.floor(boundingBox.maxZ);
 		
 		for(int x = minX; x <= maxX; x++) {
 			for(int y = minY; y <= maxY; y++) {
@@ -2021,7 +2021,7 @@ public class World implements WorldSource {
 
         for (Entity entity : entities) {
             AABB axisalignedbb1 = entity.getBb();
-            if (axisalignedbb1 != null && axisalignedbb1.intersectsWith(boundingBox)) {
+            if (axisalignedbb1 != null && axisalignedbb1.intersects(boundingBox)) {
                 collidingBoundingBoxes.add(axisalignedbb1);
             }
         }
@@ -2031,12 +2031,12 @@ public class World implements WorldSource {
 
 
 	public boolean getIsAnyLiquid(AABB boundingBox) {
-		int minX = MathHelper.floor_double(boundingBox.minX);
-		int maxX = MathHelper.floor_double(boundingBox.maxX);
-		int minY = MathHelper.floor_double(boundingBox.minY);
-		int maxY = MathHelper.floor_double(boundingBox.maxY);
-		int minZ = MathHelper.floor_double(boundingBox.minZ);
-		int maxZ = MathHelper.floor_double(boundingBox.maxZ);
+		int minX = MathHelper.floor(boundingBox.minX);
+		int maxX = MathHelper.floor(boundingBox.maxX);
+		int minY = MathHelper.floor(boundingBox.minY);
+		int maxY = MathHelper.floor(boundingBox.maxY);
+		int minZ = MathHelper.floor(boundingBox.minZ);
+		int maxZ = MathHelper.floor(boundingBox.maxZ);
 
 		for(int x = minX; x <= maxX; x++) {
 			for(int y = minY; y <= maxY; y++) {
@@ -2059,18 +2059,18 @@ public class World implements WorldSource {
 
     public boolean handleMaterialAcceleration(AABB axisalignedbb, Material material, Entity entity, boolean addVelocity)
     {
-        int i = MathHelper.floor_double(axisalignedbb.minX);
-        int j = MathHelper.floor_double(axisalignedbb.maxX + 1.0D);
-        int k = MathHelper.floor_double(axisalignedbb.minY);
-        int l = MathHelper.floor_double(axisalignedbb.maxY + 1.0D);
-        int i1 = MathHelper.floor_double(axisalignedbb.minZ);
-        int j1 = MathHelper.floor_double(axisalignedbb.maxZ + 1.0D);
+        int i = MathHelper.floor(axisalignedbb.minX);
+        int j = MathHelper.floor(axisalignedbb.maxX + 1.0D);
+        int k = MathHelper.floor(axisalignedbb.minY);
+        int l = MathHelper.floor(axisalignedbb.maxY + 1.0D);
+        int i1 = MathHelper.floor(axisalignedbb.minZ);
+        int j1 = MathHelper.floor(axisalignedbb.maxZ + 1.0D);
         if(!areBlocksLoaded(i, k, i1, j, l, j1))
         {
             return false;
         }
         boolean flag = false;
-        Vec3d vec3d = Vec3d.createVector(0.0D, 0.0D, 0.0D);
+        Vec3 vec3 = Vec3.getTempVec3(0.0D, 0.0D, 0.0D);
         for(int k1 = i; k1 < j; k1++)
         {
             for(int l1 = k; l1 < l; l1++)
@@ -2083,32 +2083,32 @@ public class World implements WorldSource {
                         continue;
                     }
                     flag = true;
-                    block.handleEntityInside(this, k1, l1, i2, entity, vec3d);
+                    block.handleEntityInside(this, k1, l1, i2, entity, vec3);
                 }
 
             }
 
         }
 
-        if(vec3d.lengthVector() > 0.0D && addVelocity)
+        if(vec3.length() > 0.0D && addVelocity)
         {
-            vec3d = vec3d.normalize();
+            vec3 = vec3.normalize();
             double d = 0.014D;
-            entity.xd += vec3d.xCoord * d;
-            entity.yd += vec3d.yCoord * d;
-            entity.zd += vec3d.zCoord * d;
+            entity.xd += vec3.x * d;
+            entity.yd += vec3.y * d;
+            entity.zd += vec3.z * d;
         }
         return flag;
     }
 
     public boolean isMaterialInBB(AABB axisalignedbb, Material ... materials)
     {
-        int minX_i = MathHelper.floor_double(axisalignedbb.minX);
-        int maxX_i = MathHelper.floor_double(axisalignedbb.maxX + 1.0D);
-        int minY_i = MathHelper.floor_double(axisalignedbb.minY);
-        int maxY_i = MathHelper.floor_double(axisalignedbb.maxY + 1.0D);
-        int minZ_i = MathHelper.floor_double(axisalignedbb.minZ);
-        int maxZ_i = MathHelper.floor_double(axisalignedbb.maxZ + 1.0D);
+        int minX_i = MathHelper.floor(axisalignedbb.minX);
+        int maxX_i = MathHelper.floor(axisalignedbb.maxX + 1.0D);
+        int minY_i = MathHelper.floor(axisalignedbb.minY);
+        int maxY_i = MathHelper.floor(axisalignedbb.maxY + 1.0D);
+        int minZ_i = MathHelper.floor(axisalignedbb.minZ);
+        int maxZ_i = MathHelper.floor(axisalignedbb.maxZ + 1.0D);
         for(int _x = minX_i; _x < maxX_i; _x++)
         {
             for(int _y = minY_i; _y < maxY_i; _y++)
@@ -2127,8 +2127,8 @@ public class World implements WorldSource {
                         if (!isMaterial) continue;
 
                         block.setBlockBoundsBasedOnState(this, _x, _y, _z);
-                        if (axisalignedbb.intersectsWith(
-                            AABB.getBoundingBoxFromPool(_x + block.minZ, _y + block.minY, _z + block.minZ,
+                        if (axisalignedbb.intersects(
+                            AABB.getTemporaryBB(_x + block.minZ, _y + block.minY, _z + block.minZ,
                                 _x + block.maxZ, _y + block.maxY, _z + block.maxZ))){
                             return true;
                         }
@@ -2143,12 +2143,12 @@ public class World implements WorldSource {
 
     public boolean isAABBInMaterial(AABB axisalignedbb, Material material)
     {
-        int i = MathHelper.floor_double(axisalignedbb.minX);
-        int j = MathHelper.floor_double(axisalignedbb.maxX + 1.0D);
-        int k = MathHelper.floor_double(axisalignedbb.minY);
-        int l = MathHelper.floor_double(axisalignedbb.maxY + 1.0D);
-        int i1 = MathHelper.floor_double(axisalignedbb.minZ);
-        int j1 = MathHelper.floor_double(axisalignedbb.maxZ + 1.0D);
+        int i = MathHelper.floor(axisalignedbb.minX);
+        int j = MathHelper.floor(axisalignedbb.maxX + 1.0D);
+        int k = MathHelper.floor(axisalignedbb.minY);
+        int l = MathHelper.floor(axisalignedbb.maxY + 1.0D);
+        int i1 = MathHelper.floor(axisalignedbb.minZ);
+        int j1 = MathHelper.floor(axisalignedbb.maxZ + 1.0D);
         for(int k1 = i; k1 < j; k1++)
         {
             for(int l1 = k; l1 < l; l1++)
@@ -2193,16 +2193,16 @@ public class World implements WorldSource {
         else
             explosion = new ExplosionCannonball(this, entity, x, y, z, explosionSize);
         explosion.isFlaming = flaming;
-        explosion.doExplosionA();
-        explosion.doExplosionB(true);
+        explosion.explode();
+        explosion.addEffects(true);
         return explosion;
     }
 
-    public float func_675_a(Vec3d vec3d, AABB axisalignedbb)
+    public float getSeenPercent(Vec3 vec3, AABB aabb)
     {
-        double d = 1.0D / ((axisalignedbb.maxX - axisalignedbb.minX) * 2D + 1.0D);
-        double d1 = 1.0D / ((axisalignedbb.maxY - axisalignedbb.minY) * 2D + 1.0D);
-        double d2 = 1.0D / ((axisalignedbb.maxZ - axisalignedbb.minZ) * 2D + 1.0D);
+        double d = 1.0D / ((aabb.maxX - aabb.minX) * 2D + 1.0D);
+        double d1 = 1.0D / ((aabb.maxY - aabb.minY) * 2D + 1.0D);
+        double d2 = 1.0D / ((aabb.maxZ - aabb.minZ) * 2D + 1.0D);
         int i = 0;
         int j = 0;
         for(float f = 0.0F; f <= 1.0F; f = (float)((double)f + d))
@@ -2211,10 +2211,10 @@ public class World implements WorldSource {
             {
                 for(float f2 = 0.0F; f2 <= 1.0F; f2 = (float)((double)f2 + d2))
                 {
-                    double d3 = axisalignedbb.minX + (axisalignedbb.maxX - axisalignedbb.minX) * (double)f;
-                    double d4 = axisalignedbb.minY + (axisalignedbb.maxY - axisalignedbb.minY) * (double)f1;
-                    double d5 = axisalignedbb.minZ + (axisalignedbb.maxZ - axisalignedbb.minZ) * (double)f2;
-                    if(checkBlockCollisionBetweenPoints(Vec3d.createVector(d3, d4, d5), vec3d) == null)
+                    double d3 = aabb.minX + (aabb.maxX - aabb.minX) * (double)f;
+                    double d4 = aabb.minY + (aabb.maxY - aabb.minY) * (double)f1;
+                    double d5 = aabb.minZ + (aabb.maxZ - aabb.minZ) * (double)f2;
+                    if(checkBlockCollisionBetweenPoints(Vec3.getTempVec3(d3, d4, d5), vec3) == null)
                     {
                         i++;
                     }
@@ -2228,19 +2228,19 @@ public class World implements WorldSource {
         return (float)i / (float)j;
     }
 
-    public void onBlockHit(EntityPlayer entityplayer, int x, int y, int z, Side side)
+    public void onBlockHit(Player entityplayer, int x, int y, int z, Side side)
     {
         x += side.getOffsetX();
         y += side.getOffsetY();
         z += side.getOffsetZ();
-        if(getBlockId(x, y, z) == Block.fire.id)
+        if(getBlockId(x, y, z) == Blocks.FIRE.id)
         {
             playSoundEffect(entityplayer, 1004, x, y, z, 0);
             setBlockWithNotify(x, y, z, 0);
         }
     }
 
-    public Entity func_4085_a(Class class1)
+    public Entity findSubclassOf(Class<? extends Entity> clazz) // this is what the b1.2 mappings called this
     {
         return null;
     }
@@ -2256,19 +2256,19 @@ public class World implements WorldSource {
     }
 
     @Override
-    public TileEntity getBlockTileEntity(int x, int y, int z)
+    public BlockEntity getBlockEntity(int x, int y, int z)
     {
         Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(x, Chunk.CHUNK_SIZE_X), Math.floorDiv(z, Chunk.CHUNK_SIZE_Z));
         if(chunk != null)
         {
-            return chunk.getTileEntity(x & (Chunk.CHUNK_SIZE_X - 1), y, z & (Chunk.CHUNK_SIZE_Z - 1));
+            return chunk.getBlockEntity(x & (Chunk.CHUNK_SIZE_X - 1), y, z & (Chunk.CHUNK_SIZE_Z - 1));
         } else
         {
             return null;
         }
     }
 
-    public void setBlockTileEntity(int i, int j, int k, TileEntity tileentity)
+    public void setBlockTileEntity(int i, int j, int k, BlockEntity tileentity)
     {
         if(!tileentity.isInvalid())
         {
@@ -2280,11 +2280,11 @@ public class World implements WorldSource {
                 field_30900_E.add(tileentity);
             } else
             {
-                loadedTileEntityList.add(tileentity);
+                loadedBlockEntityList.add(tileentity);
                 Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(i, Chunk.CHUNK_SIZE_X), Math.floorDiv(k, Chunk.CHUNK_SIZE_Z));
                 if(chunk != null)
                 {
-                    chunk.setTileEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), tileentity);
+                    chunk.setBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1), tileentity);
                 }
             }
         }
@@ -2292,7 +2292,7 @@ public class World implements WorldSource {
 
     public void removeBlockTileEntity(int i, int j, int k)
     {
-        TileEntity tileentity = getBlockTileEntity(i, j, k);
+        BlockEntity tileentity = getBlockEntity(i, j, k);
 
         if(tileentity != null && field_31055_L)
         {
@@ -2301,12 +2301,12 @@ public class World implements WorldSource {
         {
             if(tileentity != null)
             {
-                loadedTileEntityList.remove(tileentity);
+                loadedBlockEntityList.remove(tileentity);
             }
             Chunk chunk = getChunkFromChunkCoords(Math.floorDiv(i, Chunk.CHUNK_SIZE_X), Math.floorDiv(k, Chunk.CHUNK_SIZE_Z));
             if(chunk != null)
             {
-                chunk.removeTileEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1));
+                chunk.removeBlockEntity(i & (Chunk.CHUNK_SIZE_X - 1), j, k & (Chunk.CHUNK_SIZE_Z - 1));
             }
         }
     }
@@ -2551,9 +2551,9 @@ public class World implements WorldSource {
         positionsToUpdate.clear();
         for(int i = 0; i < players.size(); i++)
         {
-            EntityPlayer entityplayer = players.get(i);
-            int playerChunkX = MathHelper.floor_double(entityplayer.x / Chunk.CHUNK_SIZE_X);
-            int playerChunkZ = MathHelper.floor_double(entityplayer.z / Chunk.CHUNK_SIZE_Z);
+            Player entityplayer = players.get(i);
+            int playerChunkX = MathHelper.floor(entityplayer.x / Chunk.CHUNK_SIZE_X);
+            int playerChunkZ = MathHelper.floor(entityplayer.z / Chunk.CHUNK_SIZE_Z);
             byte radius = 9;
             for(int x = -radius; x <= radius; x++)
             {
@@ -2581,12 +2581,12 @@ public class World implements WorldSource {
             int blockZ = (randVal / (Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (Chunk.CHUNK_SIZE_Z - 1);
 
             if (caveSoundCounter == 0) {
-                int blockY = (randVal / (heightBlocks * Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (heightBlocks - 1);
+                int blockY = (randVal / (HEIGHT_BLOCKS * Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (HEIGHT_BLOCKS - 1);
                 int id = chunk.getBlockID(blockX, blockY, blockZ);
                 blockX += chunkBlockX;
                 blockZ += chunkBlockZ;
                 if (id == 0 && getFullBlockLightValue(blockX, blockY, blockZ) <= rand.nextInt(8) && getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ) <= 0) {
-                    EntityPlayer entityplayer1 = getClosestPlayer((double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, 8D);
+                    Player entityplayer1 = getClosestPlayer((double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, 8D);
                     if (entityplayer1 != null && entityplayer1.distanceToSqr((double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D) > 4D) {
                         playSoundEffect(null, SoundCategory.CAVE_SOUNDS, (double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + rand.nextFloat() * 0.2F);
                         caveSoundCounter = rand.nextInt(12000) + 6000;
@@ -2607,7 +2607,7 @@ public class World implements WorldSource {
                 int iRandVal = updateLCG >> 2;
                 int iBlockX = iRandVal & (Chunk.CHUNK_SIZE_X - 1);
                 int iBlockZ = (iRandVal / (Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (Chunk.CHUNK_SIZE_Z - 1);
-                int iBlockY = (iRandVal / (heightBlocks * Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (heightBlocks - 1);
+                int iBlockY = (iRandVal / (HEIGHT_BLOCKS * Chunk.CHUNK_SIZE_Z * Chunk.CHUNK_SIZE_X)) & (HEIGHT_BLOCKS - 1);
                 int id = chunk.getBlockID(iBlockX, iBlockY, iBlockZ);
                 if (Block.shouldTick[id]) {
                     Block.blocksList[id].updateTick(this, iBlockX + chunkBlockX, iBlockY, iBlockZ + chunkBlockZ, rand);
@@ -2665,7 +2665,7 @@ public class World implements WorldSource {
             int id = getBlockId(rx, ry, rz);
             if(id > 0)
             {
-                Block.blocksList[id].randomDisplayTick(this, rx, ry, rz, random);
+                Block.blocksList[id].animationTick(this, rx, ry, rz, random);
             }
         }
 
@@ -2674,10 +2674,10 @@ public class World implements WorldSource {
     public List<Entity> getEntitiesWithinAABBExcludingEntity(Entity entity, AABB aabb)
     {
         entityBuffer.clear();
-        int minX = MathHelper.floor_double((aabb.minX - 2D) / Chunk.CHUNK_SIZE_X);
-        int maxX = MathHelper.floor_double((aabb.maxX + 2D) / Chunk.CHUNK_SIZE_X);
-        int minZ = MathHelper.floor_double((aabb.minZ - 2D) / Chunk.CHUNK_SIZE_Z);
-        int maxZ = MathHelper.floor_double((aabb.maxZ + 2D) / Chunk.CHUNK_SIZE_Z);
+        int minX = MathHelper.floor((aabb.minX - 2D) / Chunk.CHUNK_SIZE_X);
+        int maxX = MathHelper.floor((aabb.maxX + 2D) / Chunk.CHUNK_SIZE_X);
+        int minZ = MathHelper.floor((aabb.minZ - 2D) / Chunk.CHUNK_SIZE_Z);
+        int maxZ = MathHelper.floor((aabb.maxZ + 2D) / Chunk.CHUNK_SIZE_Z);
         for(int x = minX; x <= maxX; x++)
         {
             for(int z = minZ; z <= maxZ; z++)
@@ -2694,10 +2694,10 @@ public class World implements WorldSource {
 
     public List<Entity> getEntitiesWithinAABB(Class<? extends Entity> ofClass, AABB aabb)
     {
-        int minX = MathHelper.floor_double((aabb.minX - 2D) / Chunk.CHUNK_SIZE_X);
-        int maxX = MathHelper.floor_double((aabb.maxX + 2D) / Chunk.CHUNK_SIZE_X);
-        int minZ = MathHelper.floor_double((aabb.minZ - 2D) / Chunk.CHUNK_SIZE_Z);
-        int maxZ = MathHelper.floor_double((aabb.maxZ + 2D) / Chunk.CHUNK_SIZE_Z);
+        int minX = MathHelper.floor((aabb.minX - 2D) / Chunk.CHUNK_SIZE_X);
+        int maxX = MathHelper.floor((aabb.maxX + 2D) / Chunk.CHUNK_SIZE_X);
+        int minZ = MathHelper.floor((aabb.minZ - 2D) / Chunk.CHUNK_SIZE_Z);
+        int maxZ = MathHelper.floor((aabb.maxZ + 2D) / Chunk.CHUNK_SIZE_Z);
         List<Entity> entities = new ArrayList<>();
         for(int x = minX; x <= maxX; x++)
         {
@@ -2719,7 +2719,7 @@ public class World implements WorldSource {
         return loadedEntityList;
     }
 
-    public void updateTileEntityChunkAndSendToPlayer(int x, int y, int z, TileEntity tileEntity)
+    public void updateTileEntityChunkAndSendToPlayer(int x, int y, int z, BlockEntity blockEntity)
     {
         if(isBlockLoaded(x, y, z))
         {
@@ -2727,7 +2727,7 @@ public class World implements WorldSource {
         }
         for(int l = 0; l < listeners.size(); l++)
         {
-            listeners.get(l).tileEntityChanged(x, y, z, tileEntity);
+            listeners.get(l).tileEntityChanged(x, y, z, blockEntity);
         }
     }
 
@@ -2784,14 +2784,14 @@ public class World implements WorldSource {
         {
             block = null;
         }
-        return blockId > 0 && block == null && block1.canPlaceBlockOnSide(this, x, y, z, side.getId());
+        return blockId > 0 && block == null && block1.canPlaceBlockOnSide(this, x, y, z, side);
     }
 
     public Path getPathToEntity(Entity entity, Entity entityToTravelTo, float distance)
     {
-        int x1 = MathHelper.floor_double(entity.x);
-        int y2 = MathHelper.floor_double(entity.y);
-        int z1 = MathHelper.floor_double(entity.z);
+        int x1 = MathHelper.floor(entity.x);
+        int y2 = MathHelper.floor(entity.y);
+        int z1 = MathHelper.floor(entity.z);
         int radius = (int)(distance + 16F);
         int xMin = x1 - radius;
         int yMin = y2 - radius;
@@ -2805,9 +2805,9 @@ public class World implements WorldSource {
 
     public Path getEntityPathToXYZ(Entity entity, int i, int j, int k, float f)
     {
-        int l = MathHelper.floor_double(entity.x);
-        int i1 = MathHelper.floor_double(entity.y);
-        int j1 = MathHelper.floor_double(entity.z);
+        int l = MathHelper.floor(entity.x);
+        int i1 = MathHelper.floor(entity.y);
+        int j1 = MathHelper.floor(entity.z);
         int k1 = (int)(f + 8F);
         int l1 = l - k1;
         int i2 = i1 - k1;
@@ -2819,85 +2819,53 @@ public class World implements WorldSource {
         return (new PathFinder(chunkcache)).findPath(entity, i, j, k, f);
     }
 
-    public boolean isBlockProvidingPowerTo(int i, int j, int k, int l)
-    {
-        int i1 = getBlockId(i, j, k);
-        if(i1 == 0)
-        {
-            return false;
-        } else
-        {
-            return Block.blocksList[i1].isIndirectlyPoweringTo(this, i, j, k, l);
-        }
+    public boolean isBlockProvidingPowerTo(int x, int y, int z, Side side) {
+        Block block = getBlock(x, y, z);
+        if (block == null) return false;
+        return block.getDirectSignal(this, x, y, z, side);
     }
 
-    public boolean isBlockGettingPowered(int i, int j, int k)
-    {
-        if(isBlockProvidingPowerTo(i, j - 1, k, 0))
-        {
-            return true;
-        }
-        if(isBlockProvidingPowerTo(i, j + 1, k, 1))
-        {
-            return true;
-        }
-        if(isBlockProvidingPowerTo(i, j, k - 1, 2))
-        {
-            return true;
-        }
-        if(isBlockProvidingPowerTo(i, j, k + 1, 3))
-        {
-            return true;
-        }
-        if(isBlockProvidingPowerTo(i - 1, j, k, 4))
-        {
-            return true;
+    public boolean isBlockGettingPowered(int x, int y, int z) {
+        for (Side side : Side.sides){
+            if (isBlockProvidingPowerTo(
+                x + side.getOffsetX(),
+                y + side.getOffsetY(),
+                z + side.getOffsetZ(),
+                side))
+            {
+                return true;
+            }
         }
-        return isBlockProvidingPowerTo(i + 1, j, k, 5);
+        return false;
     }
 
-    public boolean isBlockIndirectlyProvidingPowerTo(int i, int j, int k, int l)
-    {
-        int i1 = getBlockId(i, j, k);
-        if(isBlockNormalCube(i, j, k) && i1 != Block.blockRedstone.id)
-        {
-            return isBlockGettingPowered(i, j, k);
+    public boolean isBlockIndirectlyProvidingPowerTo(int x, int y, int z, Side side) {
+        Block block = getBlock(x, y, z);
+        if(isBlockNormalCube(x, y, z) && block != Blocks.BLOCK_REDSTONE && block != Blocks.PUMPKIN_REDSTONE) {
+            return isBlockGettingPowered(x, y, z);
         }
-        if(i1 == 0)
-        {
+        if(block == null) {
             return false;
-        } else
-        {
-            return Block.blocksList[i1].isPoweringTo(this, i, j, k, l);
         }
+
+        return block.getSignal(this, x, y, z, side);
     }
 
-    public boolean isBlockIndirectlyGettingPowered(int i, int j, int k)
-    {
-        if(isBlockIndirectlyProvidingPowerTo(i, j - 1, k, 0))
-        {
-            return true;
-        }
-        if(isBlockIndirectlyProvidingPowerTo(i, j + 1, k, 1))
-        {
-            return true;
-        }
-        if(isBlockIndirectlyProvidingPowerTo(i, j, k - 1, 2))
-        {
-            return true;
-        }
-        if(isBlockIndirectlyProvidingPowerTo(i, j, k + 1, 3))
-        {
-            return true;
-        }
-        if(isBlockIndirectlyProvidingPowerTo(i - 1, j, k, 4))
-        {
-            return true;
+    public boolean isBlockIndirectlyGettingPowered(int x, int y, int z) {
+        for (Side side : Side.sides){
+            if (isBlockIndirectlyProvidingPowerTo(
+                x + side.getOffsetX(),
+                y + side.getOffsetY(),
+                z + side.getOffsetZ(),
+                side))
+            {
+                return true;
+            }
         }
-        return isBlockIndirectlyProvidingPowerTo(i + 1, j, k, 5);
+        return false;
     }
 
-    public EntityPlayer getClosestPlayerToEntity(Entity entity, double radius)
+    public Player getClosestPlayerToEntity(Entity entity, double radius)
     {
         return getClosestPlayer(entity.x, entity.y, entity.z, radius);
     }
@@ -2905,13 +2873,13 @@ public class World implements WorldSource {
     /**
      * @param radius Radius around the point to search for a player, a radius less than 0 denotes searching for the closest player with 0 regard for radius
      */
-    public EntityPlayer getClosestPlayer(double x, double y, double z, double radius)
+    public Player getClosestPlayer(double x, double y, double z, double radius)
     {
         double closestDistance = Double.POSITIVE_INFINITY;
-        EntityPlayer entityplayer = null;
+        Player entityplayer = null;
         if (radius < 0) {
 
-            for (EntityPlayer entityPlayer1 : players) {
+            for (Player entityPlayer1 : players) {
                 double currentDistance = entityPlayer1.distanceToSqr(x, y, z);
                 if ((currentDistance < closestDistance)) {
                     closestDistance = currentDistance;
@@ -2920,7 +2888,7 @@ public class World implements WorldSource {
             }
         } else {
             double rSquared = radius * radius;
-            for (EntityPlayer entityPlayer1 : players) {
+            for (Player entityPlayer1 : players) {
                 double currentDistance = entityPlayer1.distanceToSqr(x, y, z);
                 if (currentDistance < rSquared && (currentDistance < closestDistance)) {
                     closestDistance = currentDistance;
@@ -2933,9 +2901,9 @@ public class World implements WorldSource {
 
 
 
-    public EntityPlayer getPlayerEntityByName(String s)
+    public Player getPlayerEntityByName(String s)
     {
-        for (EntityPlayer player : players) {
+        for (Player player : players) {
             if (s.equals(player.username)) {
                 return player;
             }
@@ -3091,8 +3059,8 @@ public class World implements WorldSource {
 
     public void joinEntityInSurroundings(Entity entity)
     {
-        int i = MathHelper.floor_double(entity.x / Chunk.CHUNK_SIZE_X);
-        int j = MathHelper.floor_double(entity.z / Chunk.CHUNK_SIZE_Z);
+        int i = MathHelper.floor(entity.x / Chunk.CHUNK_SIZE_X);
+        int j = MathHelper.floor(entity.z / Chunk.CHUNK_SIZE_Z);
         byte byte0 = 2;
         for(int k = i - byte0; k <= i + byte0; k++)
         {
@@ -3109,7 +3077,7 @@ public class World implements WorldSource {
         }
     }
 
-    public boolean canMineBlock(EntityPlayer entityplayer, int i, int j, int k)
+    public boolean canMineBlock(Player entityplayer, int i, int j, int k)
     {
         return true;
     }
@@ -3198,13 +3166,13 @@ public class World implements WorldSource {
         return levelData;
     }
 
-    public void updateEnoughPlayersSleepingFlag(EntityPlayer player)
+    public void updateEnoughPlayersSleepingFlag(Player player)
     {
         enoughPlayersSleeping = false;
         if(players.size() > 0) {
             int playersSleeping = 0;
             int req = getPlayersRequiredToSkipNight();
-            for(EntityPlayer p : players)
+            for(Player p : players)
                 if(p.isPlayerSleeping()) playersSleeping++;
             if(playersSleeping >= req) {
                 enoughPlayersSleeping = true;
@@ -3227,7 +3195,7 @@ public class World implements WorldSource {
             {
                 break;
             }
-            EntityPlayer entityplayer = (EntityPlayer)iterator.next();
+            Player entityplayer = (Player)iterator.next();
             if(entityplayer.isPlayerSleeping())
             {
                 entityplayer.wakeUpPlayer(false, false);
@@ -3244,7 +3212,7 @@ public class World implements WorldSource {
         if(enoughPlayersSleeping && !isClientSide)
         {
             int fullyAsleep = 0;
-            for(EntityPlayer player : players) if(player.isPlayerFullyAsleep()) fullyAsleep++;
+            for(Player player : players) if(player.isPlayerFullyAsleep()) fullyAsleep++;
             return fullyAsleep >= getPlayersRequiredToSkipNight() && fullyAsleep > 0;
         } else {
             return false;
@@ -3297,7 +3265,7 @@ public class World implements WorldSource {
         playSoundEffect(null, id, x, y, z, data);
     }
 
-    public void playSoundEffect(EntityPlayer entityplayer, int id, int x, int y, int z, int data)
+    public void playSoundEffect(Player entityplayer, int id, int x, int y, int z, int data)
     {
         for (LevelListener listener : listeners) {
             listener.levelEvent(entityplayer, id, x, y, z, data);
@@ -3310,18 +3278,18 @@ public class World implements WorldSource {
         return worldType;
     }
 
-    public EntityItem dropItem(int x, int y, int z, ItemStack itemStack) {
+    public ItemEntity dropItem(int x, int y, int z, ItemStack itemStack) {
         float f = 0.7F;
         double x1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
         double y1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
         double z1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
-        EntityItem entityitem = new EntityItem(this, (double) x + x1, (double) y + y1, (double) z + z1, itemStack);
-        entityitem.delayBeforeCanPickup = 10;
+        ItemEntity entityitem = new ItemEntity(this, (double) x + x1, (double) y + y1, (double) z + z1, itemStack);
+        entityitem.pickupDelay = 10;
         entityJoinedWorld(entityitem);
         return entityitem;
     }
     public void sendGlobalMessage(String message){
-        for (EntityPlayer player: players){
+        for (Player player: players){
             player.sendMessage(message);
         }
     }
diff --git a/src/main/java/net/minecraft/core/world/WorldSource.java b/src/main/java/net/minecraft/core/world/WorldSource.java
index e5843d29c..4fb084f77 100644
--- a/src/main/java/net/minecraft/core/world/WorldSource.java
+++ b/src/main/java/net/minecraft/core/world/WorldSource.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.biome.Biome;
@@ -14,7 +14,7 @@ public interface WorldSource
 
     Block getBlock(int x, int y, int z);
 
-    TileEntity getBlockTileEntity(int x, int y, int z);
+    BlockEntity getBlockEntity(int x, int y, int z);
 
     float getBrightness(int x, int y, int z, int blockLightValue);
     
diff --git a/src/main/java/net/minecraft/core/world/biome/Biome.java b/src/main/java/net/minecraft/core/world/biome/Biome.java
index 90e9358eb..0b444a26f 100644
--- a/src/main/java/net/minecraft/core/world/biome/Biome.java
+++ b/src/main/java/net/minecraft/core/world/biome/Biome.java
@@ -1,13 +1,24 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.animal.*;
-import net.minecraft.core.entity.monster.*;
-import net.minecraft.core.enums.EnumCreatureType;
+import net.minecraft.core.entity.animal.ChickenMob;
+import net.minecraft.core.entity.animal.CowMob;
+import net.minecraft.core.entity.animal.FireflyClusterMob;
+import net.minecraft.core.entity.animal.PigMob;
+import net.minecraft.core.entity.animal.SheepMob;
+import net.minecraft.core.entity.animal.SquidMob;
+import net.minecraft.core.entity.monster.CreeperMob;
+import net.minecraft.core.entity.monster.SkeletonMob;
+import net.minecraft.core.entity.monster.SlimeMob;
+import net.minecraft.core.entity.monster.SnowmanMob;
+import net.minecraft.core.entity.monster.SpiderMob;
+import net.minecraft.core.entity.monster.ZombieArmoredMob;
+import net.minecraft.core.entity.monster.ZombieMob;
+import net.minecraft.core.enums.MobCategory;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.entity.SpawnListEntry;
+import net.minecraft.core.world.generate.feature.WorldFeature;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
-import net.minecraft.core.world.generate.feature.WorldFeature;
 import net.minecraft.core.world.weather.Weather;
 
 import java.util.ArrayList;
@@ -30,35 +41,35 @@ public class Biome
     public Biome(String key)
     {
     	this.translationKey = "biome." + key; 
-        topBlock = (short) Block.grass.id;
-        fillerBlock = (short)Block.dirt.id;
+        topBlock = (short) Blocks.GRASS.id;
+        fillerBlock = (short)Blocks.DIRT.id;
         spawnableMonsterList = new ArrayList<>();
         spawnableCreatureList = new ArrayList<>();
         spawnableWaterCreatureList = new ArrayList<>();
         spawnableAmbientCreatureList = new ArrayList<>();
-        spawnableMonsterList.add(new SpawnListEntry(EntitySpider.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityArmoredZombie.class, 2));
-        spawnableMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntitySnowman.class, 2));
-        spawnableCreatureList.add(new SpawnListEntry(EntitySheep.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityPig.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityCow.class, 102));
-        spawnableWaterCreatureList.add(new SpawnListEntry(EntitySquid.class, 10));
-        spawnableAmbientCreatureList.add(new SpawnListEntry(EntityFireflyCluster.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(SpiderMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(ZombieMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(ZombieArmoredMob.class, 2));
+        spawnableMonsterList.add(new SpawnListEntry(SkeletonMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(CreeperMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(SlimeMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(SnowmanMob.class, 2));
+        spawnableCreatureList.add(new SpawnListEntry(SheepMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(PigMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(ChickenMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(CowMob.class, 102));
+        spawnableWaterCreatureList.add(new SpawnListEntry(SquidMob.class, 10));
+        spawnableAmbientCreatureList.add(new SpawnListEntry(FireflyClusterMob.class, 10));
     }
 
     public WorldFeature getRandomWorldGenForTrees(Random random)
     {
         if(random.nextInt(10) == 0)
         {
-            return new WorldFeatureTreeFancy(Block.leavesOak.id, Block.logOak.id);
+            return new WorldFeatureTreeFancy(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id);
         } else
         {
-            return new WorldFeatureTree(Block.leavesOak.id, Block.logOak.id, 4);
+            return new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 4);
         }
     }
 
@@ -82,7 +93,7 @@ public class Biome
         return java.awt.Color.getHSBColor(0.6222222F - temperature * 0.125F, 0.5F + temperature * 0.1F, 1.0F).getRGB();
     }
 
-    public List<SpawnListEntry> getSpawnableList(EnumCreatureType creatureType)
+    public List<SpawnListEntry> getSpawnableList(MobCategory creatureType)
     {
         switch (creatureType){
             case monster:
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeBirchForest.java b/src/main/java/net/minecraft/core/world/biome/BiomeBirchForest.java
index 187705825..ba8d36ff9 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeBirchForest.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeBirchForest.java
@@ -1,7 +1,8 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.WorldFeature;
@@ -15,7 +16,7 @@ public class BiomeBirchForest extends Biome
     public BiomeBirchForest(String key)
     {
     	super(key);
-        spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 25));
+        spawnableCreatureList.add(new SpawnListEntry(WolfMob.class, 25));
     }
 
     @Override
@@ -24,9 +25,9 @@ public class BiomeBirchForest extends Biome
 
         if(random.nextInt(10) == 0)
         {
-            return new WorldFeatureTreeTall(Block.leavesBirch.id, Block.logBirch.id);
+            return new WorldFeatureTreeTall(Blocks.LEAVES_BIRCH.id, Blocks.LOG_BIRCH.id);
         } else
-            return new WorldFeatureTree(Block.leavesBirch.id, Block.logBirch.id, 8);
+            return new WorldFeatureTree(Blocks.LEAVES_BIRCH.id, Blocks.LOG_BIRCH.id, 8);
 
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeBorealForest.java b/src/main/java/net/minecraft/core/world/biome/BiomeBorealForest.java
index f2b596223..050a6b6b6 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeBorealForest.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeBorealForest.java
@@ -1,7 +1,8 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeTaigaBushy;
 import net.minecraft.core.world.generate.feature.WorldFeature;
@@ -14,12 +15,12 @@ public class BiomeBorealForest extends Biome
     public BiomeBorealForest(String key)
     {
     	super(key);
-        spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 25));
+        spawnableCreatureList.add(new SpawnListEntry(WolfMob.class, 25));
     }
 
     @Override
 	public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        return new WorldFeatureTreeTaigaBushy(Block.leavesPine.id, Block.logPine.id);
+        return new WorldFeatureTreeTaigaBushy(Blocks.LEAVES_PINE.id, Blocks.LOG_PINE.id);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java b/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java
index b83e37492..ea942cf26 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeCaatinga.java
@@ -5,13 +5,14 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 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,
+//            BiomeGenBase, SpawnListEntry, WolfMob, WorldGenForest,
 //            WorldGenBigTree, WorldGenTrees, WorldGenerator
 
 public class BiomeCaatinga extends Biome
@@ -26,10 +27,10 @@ public class BiomeCaatinga extends Biome
     {
         if(random.nextInt(3) != 0)
         {
-            return new WorldFeatureTreeShrub(Block.leavesThorn.id, Block.logOak.id);
+            return new WorldFeatureTreeShrub(Blocks.LEAVES_THORN.id, Blocks.LOG_OAK.id);
         } else
         {
-            return new WorldFeatureTreeThorn(4, Block.logThorn.id, 0, Block.leavesThorn.id, 0);
+            return new WorldFeatureTreeThorn(4, Blocks.LOG_THORN.id, 0, Blocks.LEAVES_THORN.id, 0);
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeDesert.java b/src/main/java/net/minecraft/core/world/biome/BiomeDesert.java
index 53940e9a1..b1c205123 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeDesert.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeDesert.java
@@ -1,10 +1,9 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.generate.feature.WorldFeature;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreePalm;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeShrub;
 
 import java.util.Random;
 
@@ -18,6 +17,6 @@ public class BiomeDesert extends Biome
     @Override
     public WorldFeature getRandomWorldGenForTrees(Random random) {
 
-        return new WorldFeatureTreePalm(Block.logPalm, Block.leavesPalm, random.nextInt(10) == 0, false);
+        return new WorldFeatureTreePalm(Blocks.LOG_PALM, Blocks.LEAVES_PALM, random.nextInt(10) == 0, false);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeForest.java b/src/main/java/net/minecraft/core/world/biome/BiomeForest.java
index fc55be3af..be1537da8 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeForest.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeForest.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeCherry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
 import net.minecraft.core.world.generate.feature.WorldFeature;
@@ -16,7 +16,7 @@ public class BiomeForest extends Biome
     public BiomeForest(String key)
     {
     	super(key);
-        spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 25));
+        spawnableCreatureList.add(new SpawnListEntry(WolfMob.class, 25));
     }
 
     @Override
@@ -24,16 +24,16 @@ public class BiomeForest extends Biome
     {
         if(random.nextInt(5) == 0)
         {
-            return new WorldFeatureTree(Block.leavesBirch.id, Block.logBirch.id, 5);
+            return new WorldFeatureTree(Blocks.LEAVES_BIRCH.id, Blocks.LOG_BIRCH.id, 5);
         }
         if(random.nextInt(3) == 0)
         {
-            return new WorldFeatureTreeFancy(Block.leavesOak.id, Block.logOak.id);
+            return new WorldFeatureTreeFancy(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id);
         } else
         {
             if(random.nextInt(25) == 0)
-                return new WorldFeatureTree(Block.leavesOak.id, Block.logOakMossy.id, 4);
-            return new WorldFeatureTree(Block.leavesOak.id, Block.logOak.id, 4);
+                return new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK_MOSSY.id, 4);
+            return new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 4);
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeNether.java b/src/main/java/net/minecraft/core/world/biome/BiomeNether.java
index 2f2df256e..cf9aa62b6 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeNether.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeNether.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.monster.EntityGhast;
-import net.minecraft.core.entity.monster.EntityPigZombie;
+import net.minecraft.core.entity.monster.GhastMob;
+import net.minecraft.core.entity.monster.ZombiePigMob;
 import net.minecraft.core.entity.SpawnListEntry;
 
 public class BiomeNether extends Biome
@@ -14,7 +14,7 @@ public class BiomeNether extends Biome
         spawnableCreatureList.clear();
         spawnableWaterCreatureList.clear();
         spawnableAmbientCreatureList.clear();
-        spawnableMonsterList.add(new SpawnListEntry(EntityGhast.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityPigZombie.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(GhastMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(ZombiePigMob.class, 10));
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeOutback.java b/src/main/java/net/minecraft/core/world/biome/BiomeOutback.java
index 5c53100cc..1ea05fb82 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeOutback.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeOutback.java
@@ -1,7 +1,8 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.monster.EntitySpider;
+import net.minecraft.core.entity.monster.SpiderMob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeEucalyptus;
 import net.minecraft.core.world.generate.feature.WorldFeature;
@@ -17,12 +18,12 @@ public class BiomeOutback extends Biome
         spawnableMonsterList.clear();
         spawnableCreatureList.clear();
         spawnableWaterCreatureList.clear();
-        spawnableMonsterList.add(new SpawnListEntry(EntitySpider.class, 20));
+        spawnableMonsterList.add(new SpawnListEntry(SpiderMob.class, 20));
     }
 
     @Override
 	public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        return new WorldFeatureTreeEucalyptus(Block.leavesEucalyptus.id, Block.logEucalyptus.id);
+        return new WorldFeatureTreeEucalyptus(Blocks.LEAVES_EUCALYPTUS.id, Blocks.LOG_EUCALYPTUS.id);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeParadise.java b/src/main/java/net/minecraft/core/world/biome/BiomeParadise.java
index bba16e957..13e5b628b 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeParadise.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeParadise.java
@@ -1,10 +1,10 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.animal.EntityChicken;
+import net.minecraft.core.entity.animal.ChickenMob;
 import net.minecraft.core.entity.SpawnListEntry;
 
 // Referenced classes of package net.minecraft.src:
-//            BiomeGenBase, SpawnListEntry, EntityChicken
+//            BiomeGenBase, SpawnListEntry, ChickenMob
 
 public class BiomeParadise extends Biome
 {	
@@ -14,7 +14,7 @@ public class BiomeParadise extends Biome
         spawnableMonsterList.clear();
         spawnableCreatureList.clear();
         spawnableWaterCreatureList.clear();
-        spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 10));
+        spawnableCreatureList.add(new SpawnListEntry(ChickenMob.class, 10));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomePlains.java b/src/main/java/net/minecraft/core/world/biome/BiomePlains.java
index 13de075e0..05e075616 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomePlains.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomePlains.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.generate.feature.WorldFeature;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeEucalyptus;
 
@@ -15,6 +16,6 @@ public class BiomePlains extends Biome
     @Override
     public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        return new WorldFeatureTreeEucalyptus(Block.leavesEucalyptus.id, Block.logEucalyptus.id);
+        return new WorldFeatureTreeEucalyptus(Blocks.LEAVES_EUCALYPTUS.id, Blocks.LOG_EUCALYPTUS.id);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeRainforest.java b/src/main/java/net/minecraft/core/world/biome/BiomeRainforest.java
index 70ab0dec6..953ba12c0 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeRainforest.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeRainforest.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancyRainforest;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreePalm;
@@ -22,23 +23,23 @@ public class BiomeRainforest extends Biome
 	public WorldFeature getRandomWorldGenForTrees(Random random) {
 		if(random.nextInt(1000) == 0) {
 			int treeHeight = 30 + random.nextInt(30);
-			return new WorldFeatureSpoonerTreeRound(treeHeight, Block.logOak.id, 0, Block.leavesOak.id, 0);
+			return new WorldFeatureSpoonerTreeRound(treeHeight, Blocks.LOG_OAK.id, 0, Blocks.LEAVES_OAK.id, 0);
 		}
 		if(random.nextInt(10) == 0) {
-			return new WorldFeatureTreePalm(Block.logPalm, Block.leavesPalm, true, false);
+			return new WorldFeatureTreePalm(Blocks.LOG_PALM, Blocks.LEAVES_PALM, true, false);
 		}
 		if(random.nextInt(3) == 0) {
 			if(random.nextInt(10) == 0) {
-				return new WorldFeatureTreeFancyRainforest(Block.leavesOak.id, Block.logOakMossy.id, 0);
+				return new WorldFeatureTreeFancyRainforest(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK_MOSSY.id, 0);
 			}
-			return new WorldFeatureTreeFancyRainforest(Block.leavesOak.id, Block.logOak.id, 0);
+			return new WorldFeatureTreeFancyRainforest(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 0);
 		}
 		if(random.nextInt(5) == 0) {
-			return new WorldFeatureTreeShrub(Block.leavesShrub.id, Block.logOak.id);
+			return new WorldFeatureTreeShrub(Blocks.LEAVES_SHRUB.id, Blocks.LOG_OAK.id);
 		}
 		if(random.nextInt(10) == 0) {
-			return new WorldFeatureTree(Block.leavesCacao.id, Block.logOakMossy.id, 4);
+			return new WorldFeatureTree(Blocks.LEAVES_CACAO.id, Blocks.LOG_OAK_MOSSY.id, 4);
 		}
-		return new WorldFeatureTree(Block.leavesOak.id, Block.logOak.id, 6);
+		return new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 6);
 	}
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeRetro.java b/src/main/java/net/minecraft/core/world/biome/BiomeRetro.java
index 9d71db29e..99c75795b 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeRetro.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeRetro.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
 import net.minecraft.core.entity.animal.*;
 import net.minecraft.core.entity.monster.*;
@@ -20,25 +21,25 @@ public class BiomeRetro
         spawnableCreatureList.clear();
         spawnableWaterCreatureList.clear();
         spawnableAmbientCreatureList.clear();
-        spawnableMonsterList.add(new SpawnListEntry(EntitySpider.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 10));
-        spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10));
-        spawnableCreatureList.add(new SpawnListEntry(EntitySheep.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityPig.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 102));
-        spawnableCreatureList.add(new SpawnListEntry(EntityCow.class, 102));
+        spawnableMonsterList.add(new SpawnListEntry(SpiderMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(ZombieMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(SkeletonMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(CreeperMob.class, 10));
+        spawnableMonsterList.add(new SpawnListEntry(SlimeMob.class, 10));
+        spawnableCreatureList.add(new SpawnListEntry(SheepMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(PigMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(ChickenMob.class, 102));
+        spawnableCreatureList.add(new SpawnListEntry(CowMob.class, 102));
 
     }
 
     @Override
     public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        WorldFeature feature = new WorldFeatureTree(Block.leavesOakRetro.id, Block.logOak.id, 4);
+        WorldFeature feature = new WorldFeatureTree(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id, 4);
         if (random.nextInt(10) == 0)
         {
-            feature = new WorldFeatureTreeFancy(Block.leavesOakRetro.id, Block.logOak.id);
+            feature = new WorldFeatureTreeFancy(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id);
         }
 
         return feature;
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeSeasonalForest.java b/src/main/java/net/minecraft/core/world/biome/BiomeSeasonalForest.java
index 7b500492f..47cfadc5a 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeSeasonalForest.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeSeasonalForest.java
@@ -1,8 +1,9 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeCherry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeFancy;
@@ -11,7 +12,7 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BiomeGenBase, SpawnListEntry, EntityWolf, WorldGenForest,
+//            BiomeGenBase, SpawnListEntry, WolfMob, WorldGenForest,
 //            WorldGenBigTree, WorldGenTrees, WorldGenerator
 
 public class BiomeSeasonalForest extends Biome
@@ -20,7 +21,7 @@ public class BiomeSeasonalForest extends Biome
     public BiomeSeasonalForest(String key)
     {
     	super(key);
-        spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 25));
+        spawnableCreatureList.add(new SpawnListEntry(WolfMob.class, 25));
     }
     @Override
 	public WorldFeature getRandomWorldGenForTrees(Random random)
@@ -29,16 +30,16 @@ public class BiomeSeasonalForest extends Biome
         {
             if(random.nextInt(2) == 0)
             {
-                return new WorldFeatureTreeFancy(Block.leavesOak.id, Block.logOak.id);
+                return new WorldFeatureTreeFancy(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id);
             }
-            return new WorldFeatureTree(Block.leavesOak.id, Block.logOak.id, 4);
+            return new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 4);
         }
         if(random.nextInt(3) == 0)
         {
-            return new WorldFeatureTreeFancy(Block.leavesCherry.id, Block.logCherry.id);
+            return new WorldFeatureTreeFancy(Blocks.LEAVES_CHERRY.id, Blocks.LOG_CHERRY.id);
         } else
         {
-            return new WorldFeatureTreeCherry(Block.leavesCherry.id, Block.logCherry.id, 4);
+            return new WorldFeatureTreeCherry(Blocks.LEAVES_CHERRY.id, Blocks.LOG_CHERRY.id, 4);
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeShrubland.java b/src/main/java/net/minecraft/core/world/biome/BiomeShrubland.java
index 3ef1417a3..33041f2a1 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeShrubland.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeShrubland.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeShrub;
 import net.minecraft.core.world.generate.feature.WorldFeature;
 
@@ -15,6 +16,6 @@ public class BiomeShrubland extends Biome
 	@Override
 	public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        return new WorldFeatureTreeShrub(Block.leavesShrub.id, Block.logOak.id);
+        return new WorldFeatureTreeShrub(Blocks.LEAVES_SHRUB.id, Blocks.LOG_OAK.id);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeSwamp.java b/src/main/java/net/minecraft/core/world/biome/BiomeSwamp.java
index 3ff4c12bd..3d11de867 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeSwamp.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeSwamp.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.biome;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeShapeSwamp;
 import net.minecraft.core.world.generate.feature.WorldFeature;
 
@@ -15,6 +16,6 @@ public class BiomeSwamp extends Biome
 	@Override
 	public WorldFeature getRandomWorldGenForTrees(Random random)
     {
-        return new WorldFeatureTreeShapeSwamp(Block.leavesOak.id, Block.logOakMossy.id, 6);
+        return new WorldFeatureTreeShapeSwamp(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK_MOSSY.id, 6);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/biome/BiomeTaiga.java b/src/main/java/net/minecraft/core/world/biome/BiomeTaiga.java
index 070705aab..4892ea059 100644
--- a/src/main/java/net/minecraft/core/world/biome/BiomeTaiga.java
+++ b/src/main/java/net/minecraft/core/world/biome/BiomeTaiga.java
@@ -1,7 +1,8 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.animal.WolfMob;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.SpawnListEntry;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeTaigaBushy;
 import net.minecraft.core.world.generate.feature.tree.WorldFeatureTreeTaigaTall;
@@ -10,7 +11,7 @@ import net.minecraft.core.world.generate.feature.WorldFeature;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            BiomeGenBase, SpawnListEntry, EntityWolf, WorldGenTaiga1, 
+//            BiomeGenBase, SpawnListEntry, WolfMob, WorldGenTaiga1,
 //            WorldGenTaiga2, WorldGenerator
 
 public class BiomeTaiga extends Biome
@@ -19,7 +20,7 @@ public class BiomeTaiga extends Biome
     public BiomeTaiga(String key)
     {
     	super(key);
-        spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 25));
+        spawnableCreatureList.add(new SpawnListEntry(WolfMob.class, 25));
     }
 
     @Override
@@ -27,10 +28,10 @@ public class BiomeTaiga extends Biome
     {
         if(random.nextInt(3) == 0)
         {
-            return new WorldFeatureTreeTaigaTall(Block.leavesPine.id, Block.logPine.id);
+            return new WorldFeatureTreeTaigaTall(Blocks.LEAVES_PINE.id, Blocks.LOG_PINE.id);
         } else
         {
-            return new WorldFeatureTreeTaigaBushy(Block.leavesPine.id, Block.logPine.id);
+            return new WorldFeatureTreeTaigaBushy(Blocks.LEAVES_PINE.id, Blocks.LOG_PINE.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 12e736592..c5e36fe66 100644
--- a/src/main/java/net/minecraft/core/world/biome/Biomes.java
+++ b/src/main/java/net/minecraft/core/world/biome/Biomes.java
@@ -1,35 +1,35 @@
 package net.minecraft.core.world.biome;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 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_RAINFOREST = register("minecraft:overworld.rainforest", new BiomeRainforest("rainforest").setColor(0x1cf100).setBlockedWeathers(Weathers.OVERWORLD_SNOW));
     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));
     public static final Biome OVERWORLD_FOREST = register("minecraft:overworld.forest", new BiomeForest("forest").setColor(0x26a615));
-    public static final Biome OVERWORLD_GRASSLANDS = register("minecraft:overworld.grasslands", new Biome("grasslands").setColor(0xf0f048).setBlockedWeathers(Weather.overworldSnow));
-    public static final Biome OVERWORLD_OUTBACK = register("minecraft:overworld.outback", new BiomeOutback("outback").setColor(0xd95e20).setBlockedWeathers(Weather.overworldSnow).setTopBlock(Block.dirtScorched.id).setFillerBlock(Block.dirtScorched.id));
+    public static final Biome OVERWORLD_GRASSLANDS = register("minecraft:overworld.grasslands", new Biome("grasslands").setColor(0xf0f048).setBlockedWeathers(Weathers.OVERWORLD_SNOW));
+    public static final Biome OVERWORLD_OUTBACK = register("minecraft:overworld.outback", new BiomeOutback("outback").setColor(0xd95e20).setBlockedWeathers(Weathers.OVERWORLD_SNOW).setTopBlock(Blocks.DIRT_SCORCHED.id).setFillerBlock(Blocks.DIRT_SCORCHED.id));
     public static final Biome OVERWORLD_SHRUBLAND = register("minecraft:overworld.shrubland", new BiomeShrubland("shrubland").setColor(0xbaba38));
     public static final Biome OVERWORLD_TAIGA = register("minecraft:overworld.taiga", new BiomeTaiga("taiga").setColor(0x8abcff).setSurfaceSnow());
     public static final Biome OVERWORLD_BOREAL_FOREST = register("minecraft:overworld.boreal_forest", new BiomeBorealForest("boreal_forest").setColor(0x148564));
-    public static final Biome OVERWORLD_DESERT = register("minecraft:overworld.desert", new BiomeDesert("desert").setColor(0xEDE26F).setBlockedWeathers(Weather.overworldRain, Weather.overworldSnow, Weather.overworldStorm).setTopBlock(Block.sand.id).setFillerBlock(Block.sand.id));
+    public static final Biome OVERWORLD_DESERT = register("minecraft:overworld.desert", new BiomeDesert("desert").setColor(0xEDE26F).setBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM).setTopBlock(Blocks.SAND.id).setFillerBlock(Blocks.SAND.id));
     public static final Biome OVERWORLD_PLAINS = register("minecraft:overworld.plains", new BiomePlains("plains").setColor(0xA3C649));
-    public static final Biome OVERWORLD_GLACIER = register("minecraft:overworld.glacier", new Biome("glacier").setColor(0xcbf6ff).setSurfaceSnow().setTopBlock(Block.blockSnow.id).setFillerBlock(Block.blockSnow.id));
+    public static final Biome OVERWORLD_GLACIER = register("minecraft:overworld.glacier", new Biome("glacier").setColor(0xcbf6ff).setSurfaceSnow().setTopBlock(Blocks.BLOCK_SNOW.id).setFillerBlock(Blocks.BLOCK_SNOW.id));
     public static final Biome OVERWORLD_TUNDRA = register("minecraft:overworld.tundra", new Biome("tundra").setColor(0x57e0ff).setSurfaceSnow());
     public static final Biome OVERWORLD_MEADOW = register("minecraft:overworld.meadow", new BiomeBorealForest("meadow").setColor(0x8c8c22));
-    public static final Biome NETHER_NETHER = register("minecraft:nether.nether", new BiomeNether("nether").setColor(0xDD0000).setBlockedWeathers(Weather.overworldRain, Weather.overworldSnow, Weather.overworldStorm, Weather.overworldFog));
-    public static final Biome PARADISE_PARADISE = register("minecraft:paradise.paradise", new BiomeParadise("paradise").setColor(0x8080FF).setBlockedWeathers(Weather.overworldRain, Weather.overworldSnow, Weather.overworldStorm, Weather.overworldFog));
+    public static final Biome NETHER_NETHER = register("minecraft:nether.nether", new BiomeNether("nether").setColor(0xDD0000).setBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM, Weathers.OVERWORLD_FOG));
+    public static final Biome PARADISE_PARADISE = register("minecraft:paradise.paradise", new BiomeParadise("paradise").setColor(0x8080FF).setBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM, Weathers.OVERWORLD_FOG));
     public static final Biome OVERWORLD_BIRCH_FOREST = register("minecraft:overworld.birch_forest", new BiomeBirchForest("birch_forest").setColor(0x4bcb5e));
-    public static final Biome OVERWORLD_RETRO = register("minecraft:overworld.retro", new BiomeRetro("retro").setColor(0x76B14A).setTopBlock(Block.grassRetro.id));
-    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_RETRO = register("minecraft:overworld.retro", new BiomeRetro("retro").setColor(0x76B14A).setTopBlock(Blocks.GRASS_RETRO.id));
+    public static final Biome OVERWORLD_HELL = register("minecraft:overworld.hell", new Biome("hell").setColor(0xD96223).setTopBlock(Blocks.DIRT_SCORCHED.id).setTopBlock(Blocks.DIRT_SCORCHED.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(0xdecda6).setTopBlock(Block.mudBaked.id).setFillerBlock(Block.mudBaked.id).setBlockedWeathers(Weather.overworldSnow));
-    public static final Biome OVERWORLD_CAATINGA_PLAINS = register("minecraft:overworld.caatinga.plains", new Biome("caatinga.plains").setColor(0xa19477).setTopBlock(Block.mudBaked.id).setFillerBlock(Block.mudBaked.id).setBlockedWeathers(Weather.overworldSnow));
+    public static final Biome OVERWORLD_OUTBACK_GRASSY = register("minecraft:overworld.outback.grassy", new BiomeOutback("outback.grassy").setColor(0xf09037).setBlockedWeathers(Weathers.OVERWORLD_SNOW).setTopBlock(Blocks.GRASS_SCORCHED.id).setFillerBlock(Blocks.DIRT_SCORCHED.id));
+    public static final Biome OVERWORLD_CAATINGA = register("minecraft:overworld.caatinga", new BiomeCaatinga("caatinga").setColor(0xdecda6).setTopBlock(Blocks.MUD_BAKED.id).setFillerBlock(Blocks.MUD_BAKED.id).setBlockedWeathers(Weathers.OVERWORLD_SNOW));
+    public static final Biome OVERWORLD_CAATINGA_PLAINS = register("minecraft:overworld.caatinga.plains", new Biome("caatinga.plains").setColor(0xa19477).setTopBlock(Blocks.MUD_BAKED.id).setFillerBlock(Blocks.MUD_BAKED.id).setBlockedWeathers(Weathers.OVERWORLD_SNOW));
     public static Biome register(String key, Biome biome)
     {
         Registries.BIOMES.register(key, biome);
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 a8a8848b4..29ef04308 100644
--- a/src/main/java/net/minecraft/core/world/chunk/Chunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/Chunk.java
@@ -1,20 +1,15 @@
 package net.minecraft.core.world.chunk;
 
-import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.world.data.ChunkNibbleArray;
-import net.minecraft.core.world.data.ChunkUnsignedByteArray;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockTileEntity;
+import net.minecraft.core.block.EntityBlock;
 
-import java.nio.ByteBuffer;
-import java.nio.ShortBuffer;
 import java.util.*;
 
 public class Chunk
@@ -30,7 +25,7 @@ public class Chunk
     public int lowestY;
     public final int xPosition;
     public final int zPosition;
-    public Map<ChunkPosition, TileEntity> tileEntityMap;
+    public Map<ChunkPosition, BlockEntity> blockEntityMap;
     public double[] temperature;
     public double[] humidity;
     public double[] variety;
@@ -44,7 +39,7 @@ public class Chunk
 
     public Chunk(World world, int x, int z)
     {
-        tileEntityMap = new HashMap<>();
+        blockEntityMap = new HashMap<>();
         isTerrainPopulated = false;
         isModified = false;
         hasEntities = false;
@@ -302,7 +297,7 @@ public class Chunk
         lightGaps(x, z);
 
         if(Block.getBlock(id) != null) {
-            Block.blocksList[id].onBlockAdded(world, worldX, y, worldZ);
+            Block.blocksList[id].onBlockPlacedByWorld(world, worldX, y, worldZ);
         }
 
         isModified = true;
@@ -441,14 +436,14 @@ public class Chunk
     public void addEntity(Entity entity)
     {
         hasEntities = true;
-        int x = MathHelper.floor_double(entity.x / CHUNK_SIZE_X);
-        int z = MathHelper.floor_double(entity.z / CHUNK_SIZE_Z);
+        int x = MathHelper.floor(entity.x / CHUNK_SIZE_X);
+        int z = MathHelper.floor(entity.z / CHUNK_SIZE_Z);
         if(x != xPosition || z != zPosition)
         {
             System.out.println("Wrong location! " + entity);
             Thread.dumpStack();
         }
-        int section = MathHelper.clamp(MathHelper.floor_double(entity.y / 16D), 0, CHUNK_SECTIONS - 1);
+        int section = MathHelper.clamp(MathHelper.floor(entity.y / 16D), 0, CHUNK_SECTIONS - 1);
         entity.addedToChunk = true;
         entity.chunkCoordX = xPosition;
         entity.chunkCoordY = section;
@@ -472,71 +467,71 @@ public class Chunk
         return y >= getHeightValue(x, z);
     }
 
-    public TileEntity getTileEntity(int x, int y, int z)
+    public BlockEntity getBlockEntity(int x, int y, int z)
     {
         ChunkPosition pos = new ChunkPosition(x, y, z);
-        TileEntity tileEntity = tileEntityMap.get(pos);
-        if(tileEntity == null)
+        BlockEntity blockEntity = blockEntityMap.get(pos);
+        if(blockEntity == null)
         {
             int id = getBlockID(x, y, z);
             if(!Block.isEntityTile[id])
             {
                 return null;
             }
-            BlockTileEntity tileEntityBlock = (BlockTileEntity)Block.blocksList[id];
-            tileEntityBlock.onBlockAdded(world, xPosition * CHUNK_SIZE_X + x, y, zPosition * CHUNK_SIZE_Z + z);
-            tileEntity = tileEntityMap.get(pos);
+            EntityBlock tileEntityBlock = (EntityBlock)Block.blocksList[id];
+            tileEntityBlock.onBlockPlacedByWorld(world, xPosition * CHUNK_SIZE_X + x, y, zPosition * CHUNK_SIZE_Z + z);
+            blockEntity = blockEntityMap.get(pos);
         }
-        if(tileEntity != null && tileEntity.isInvalid())
+        if(blockEntity != null && blockEntity.isInvalid())
         {
-            tileEntityMap.remove(pos);
+            blockEntityMap.remove(pos);
             return null;
         }
         else
         {
-            return tileEntity;
+            return blockEntity;
         }
     }
 
-    public void addTileEntity(TileEntity tileEntity)
+    public void addBlockEntity(BlockEntity blockEntity)
     {
-        int x = tileEntity.x - xPosition * CHUNK_SIZE_X;
-        int y = tileEntity.y;
-        int z = tileEntity.z - zPosition * CHUNK_SIZE_Z;
-        setTileEntity(x, y, z, tileEntity);
+        int x = blockEntity.x - xPosition * CHUNK_SIZE_X;
+        int y = blockEntity.y;
+        int z = blockEntity.z - zPosition * CHUNK_SIZE_Z;
+        setBlockEntity(x, y, z, blockEntity);
         if(isLoaded)
         {
-            world.loadedTileEntityList.add(tileEntity);
+            world.loadedBlockEntityList.add(blockEntity);
         }
     }
 
-    public void setTileEntity(int x, int y, int z, TileEntity tileEntity)
+    public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
         ChunkPosition chunkposition = new ChunkPosition(x, y, z);
-        tileEntity.worldObj = world;
-        tileEntity.x = xPosition * CHUNK_SIZE_X + x;
-        tileEntity.y = y;
-        tileEntity.z = zPosition * CHUNK_SIZE_Z + z;
-        if (getBlockID(x, y, z) == 0 || !(Block.blocksList[getBlockID(x, y, z)] instanceof BlockTileEntity))
+        blockEntity.worldObj = world;
+        blockEntity.x = xPosition * CHUNK_SIZE_X + x;
+        blockEntity.y = y;
+        blockEntity.z = zPosition * CHUNK_SIZE_Z + z;
+        if (getBlockID(x, y, z) == 0 || !(Block.blocksList[getBlockID(x, y, z)] instanceof EntityBlock))
         {
             System.out.println("Attempted to place a tile entity where there was no entity tile!");
         }
         else
         {
-            tileEntity.validate();
-            tileEntityMap.put(chunkposition, tileEntity);
+            blockEntity.validate();
+            blockEntityMap.put(chunkposition, blockEntity);
         }
     }
 
-    public void removeTileEntity(int x, int y, int z)
+    public void removeBlockEntity(int x, int y, int z)
     {
         ChunkPosition pos = new ChunkPosition(x, y, z);
         if(isLoaded)
         {
-            TileEntity tileEntity = tileEntityMap.remove(pos);
-            if(tileEntity != null)
+            BlockEntity blockEntity = blockEntityMap.remove(pos);
+            if(blockEntity != null)
             {
-                tileEntity.invalidate();
+                blockEntity.invalidate();
             }
         }
     }
@@ -544,7 +539,7 @@ public class Chunk
     public void onLoad()
     {
         isLoaded = true;
-        world.func_31054_a(tileEntityMap.values());
+        world.addAllBlockEntities(blockEntityMap.values());
 
         for (ChunkSection section : sections) {
             section.onLoad(world);
@@ -554,8 +549,8 @@ public class Chunk
     public void onUnload()
     {
         isLoaded = false;
-        TileEntity tileentity;
-        for(Iterator<TileEntity> iterator = tileEntityMap.values().iterator(); iterator.hasNext(); tileentity.invalidate())
+        BlockEntity tileentity;
+        for(Iterator<BlockEntity> iterator = blockEntityMap.values().iterator(); iterator.hasNext(); tileentity.invalidate())
         {
             tileentity = iterator.next();
         }
@@ -572,8 +567,8 @@ public class Chunk
 
     public void getEntitiesWithin(Entity toExclude, AABB aabb, List<Entity> entities)
     {
-        int minSection = Math.max(0, MathHelper.floor_double((aabb.minY - 2D) / 16D));
-        int maxSection = Math.min(MathHelper.floor_double((aabb.maxY + 2D) / 16D), CHUNK_SECTIONS - 1);
+        int minSection = Math.max(0, MathHelper.floor((aabb.minY - 2D) / 16D));
+        int maxSection = Math.min(MathHelper.floor((aabb.maxY + 2D) / 16D), CHUNK_SECTIONS - 1);
         for(int section = minSection; section <= maxSection; section++) {
             getSection(section).getEntitiesWithin(toExclude, aabb, entities);
         }
@@ -581,8 +576,8 @@ public class Chunk
 
     public void getEntitiesWithin(Class<? extends Entity> ofClass, AABB aabb, List<Entity> entities)
     {
-        int minSection = Math.max(0, MathHelper.floor_double((aabb.minY - 2D) / 16D));
-        int maxSection = Math.min(MathHelper.floor_double((aabb.maxY + 2D) / 16D), CHUNK_SECTIONS - 1);
+        int minSection = Math.max(0, MathHelper.floor((aabb.minY - 2D) / 16D));
+        int maxSection = Math.min(MathHelper.floor((aabb.maxY + 2D) / 16D), CHUNK_SECTIONS - 1);
         for(int section = minSection; section <= maxSection; section++) {
             getSection(section).getEntitiesWithin(ofClass, aabb, entities);
         }
diff --git a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
index bd0db92c0..a291db9a6 100644
--- a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
+++ b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
@@ -2,14 +2,14 @@ package net.minecraft.core.world.chunk;
 
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
 //            IBlockAccess, World, Chunk, WorldProvider, 
-//            Block, Material, TileEntity, WorldChunkManager
+//            Block, Material, BlockEntity, WorldChunkManager
 
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.biome.Biome;
@@ -75,11 +75,11 @@ public class ChunkCache
     }
 
     @Override
-	public TileEntity getBlockTileEntity(int x, int y, int z)
+	public BlockEntity getBlockEntity(int x, int y, int z)
     {
         int l = Math.floorDiv(x, Chunk.CHUNK_SIZE_X) - chunkX;
         int i1 = Math.floorDiv(z, Chunk.CHUNK_SIZE_Z) - chunkZ;
-        return chunkArray[l][i1].getTileEntity(x & (Chunk.CHUNK_SIZE_X - 1), y, z & (Chunk.CHUNK_SIZE_Z - 1));
+        return chunkArray[l][i1].getBlockEntity(x & (Chunk.CHUNK_SIZE_X - 1), y, z & (Chunk.CHUNK_SIZE_Z - 1));
     }
 
     public boolean getBlockLitInteriorSurface(int i, int j, int k)
@@ -253,7 +253,7 @@ public class ChunkCache
             return false;
         } else
         {
-            return block.blockMaterial.blocksMotion() && block.renderAsNormalBlock();
+            return block.blockMaterial.blocksMotion() && block.isCubeShaped();
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/world/chunk/ChunkLoaderLegacy.java b/src/main/java/net/minecraft/core/world/chunk/ChunkLoaderLegacy.java
index b5a46b847..f18e68706 100644
--- a/src/main/java/net/minecraft/core/world/chunk/ChunkLoaderLegacy.java
+++ b/src/main/java/net/minecraft/core/world/chunk/ChunkLoaderLegacy.java
@@ -15,7 +15,7 @@ import net.minecraft.core.world.chunk.writer.ChunkWriter;
 import net.minecraft.core.world.data.ChunkNibbleArray;
 import net.minecraft.core.world.data.ChunkUnsignedByteArray;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.world.save.LevelData;
 
 import java.io.*;
@@ -197,10 +197,10 @@ public class ChunkLoaderLegacy
         // Write tile entities
         ListTag tileEntityListTag = new ListTag();
         CompoundTag tileEntityTag;
-        for (TileEntity tileEntity : chunk.tileEntityMap.values())
+        for (BlockEntity blockEntity : chunk.blockEntityMap.values())
         {
             tileEntityTag = new CompoundTag();
-            tileEntity.writeToNBT(tileEntityTag);
+            blockEntity.writeToNBT(tileEntityTag);
             tileEntityListTag.addTag(tileEntityTag);
         }
         tag.put("TileEntities", tileEntityListTag);
@@ -295,10 +295,10 @@ public class ChunkLoaderLegacy
                 if (tileEntityTagBase instanceof CompoundTag)
                 {
                     CompoundTag tileEntityTag = (CompoundTag) tileEntityTagBase;
-                    TileEntity tileEntity = TileEntity.createAndLoadEntity(tileEntityTag);
-                    if (tileEntity != null)
+                    BlockEntity blockEntity = BlockEntity.createAndLoadEntity(tileEntityTag);
+                    if (blockEntity != null)
                     {
-                        chunk.addTileEntity(tileEntity);
+                        chunk.addBlockEntity(blockEntity);
                     }
                 }
             }
diff --git a/src/main/java/net/minecraft/core/world/chunk/ChunkSection.java b/src/main/java/net/minecraft/core/world/chunk/ChunkSection.java
index 807e9aaee..389403e53 100644
--- a/src/main/java/net/minecraft/core/world/chunk/ChunkSection.java
+++ b/src/main/java/net/minecraft/core/world/chunk/ChunkSection.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.chunk;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.enums.LightLayer;
@@ -149,7 +150,7 @@ public class ChunkSection {
 
     public void getEntitiesWithin(Entity toExclude, AABB aabb, List<Entity> entities) {
         for (Entity e : this.entities) {
-            if (e != toExclude && e.bb.intersectsWith(aabb)) {
+            if (e != toExclude && e.bb.intersects(aabb)) {
                 entities.add(e);
             }
         }
@@ -157,7 +158,7 @@ public class ChunkSection {
 
     public void getEntitiesWithin(Class<? extends Entity> ofClass, AABB aabb, List<Entity> entities) {
         for (Entity e : this.entities) {
-            if (ofClass.isAssignableFrom(e.getClass()) && e.bb.intersectsWith(aabb)) {
+            if (ofClass.isAssignableFrom(e.getClass()) && e.bb.intersects(aabb)) {
                 entities.add(e);
             }
         }
diff --git a/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java b/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
index ec705341c..3a7610e04 100644
--- a/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/DisplayChunk.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.chunk;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
 
@@ -10,7 +10,7 @@ public class DisplayChunk extends EmptyChunk{
     public static int displayBlockPosX = 0;
     public static int displayBlockPosY = 0;
     public static int displayBlockPosZ = 0;
-    public static TileEntity displayTileEntity = null;
+    public static BlockEntity displayBlockEntity = null;
     public DisplayChunk(World world, int x, int z) {
         super(world, x, z);
     }
@@ -36,39 +36,39 @@ public class DisplayChunk extends EmptyChunk{
         return 15;
     }
     @Override
-    public void setTileEntity(int x, int y, int z, TileEntity tileEntity)
+    public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
         if (x == displayBlockPosX && y == displayBlockPosY && z == displayBlockPosZ){
-            displayTileEntity = tileEntity;
-            displayTileEntity.worldObj = world;
-            displayTileEntity.x = x;
-            displayTileEntity.y = y;
-            displayTileEntity.z = z;
+            displayBlockEntity = blockEntity;
+            displayBlockEntity.worldObj = world;
+            displayBlockEntity.x = x;
+            displayBlockEntity.y = y;
+            displayBlockEntity.z = z;
         }
     }
 
     @Override
-    public void removeTileEntity(int x, int y, int z)
+    public void removeBlockEntity(int x, int y, int z)
     {
         if (x == displayBlockPosX && y == displayBlockPosY && z == displayBlockPosZ){
-            displayTileEntity = null;
+            displayBlockEntity = null;
         }
     }
     @Override
-    public TileEntity getTileEntity(int x, int y, int z)
+    public BlockEntity getBlockEntity(int x, int y, int z)
     {
         if (x == displayBlockPosX && y == displayBlockPosY && z == displayBlockPosZ){
-            return displayTileEntity;
+            return displayBlockEntity;
         }
         return null;
     }
-    public static void setDisplayTileEntity(World world, TileEntity entity){
-        displayTileEntity = entity;
-        if (displayTileEntity != null){
-            displayTileEntity.worldObj = world;
-            displayTileEntity.x = DisplayChunk.displayBlockPosX;
-            displayTileEntity.y = DisplayChunk.displayBlockPosY;
-            displayTileEntity.z = DisplayChunk.displayBlockPosZ;
+    public static void setDisplayTileEntity(World world, BlockEntity entity){
+        displayBlockEntity = entity;
+        if (displayBlockEntity != null){
+            displayBlockEntity.worldObj = world;
+            displayBlockEntity.x = DisplayChunk.displayBlockPosX;
+            displayBlockEntity.y = DisplayChunk.displayBlockPosY;
+            displayBlockEntity.z = DisplayChunk.displayBlockPosZ;
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java b/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
index ad13559c1..37020d40c 100644
--- a/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
+++ b/src/main/java/net/minecraft/core/world/chunk/EmptyChunk.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.world.chunk;
 
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.enums.LightLayer;
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.world.World;
 
 import java.util.Arrays;
@@ -12,7 +12,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Chunk, World, EnumSkyBlock, Entity, 
-//            TileEntity, AxisAlignedBB
+//            BlockEntity, AxisAlignedBB
 
 public class EmptyChunk extends Chunk
 {
@@ -113,23 +113,23 @@ public class EmptyChunk extends Chunk
     }
 
     @Override
-	public TileEntity getTileEntity(int x, int y, int z)
+	public BlockEntity getBlockEntity(int x, int y, int z)
     {
         return null;
     }
 
     @Override
-	public void addTileEntity(TileEntity tileEntity)
+	public void addBlockEntity(BlockEntity blockEntity)
     {
     }
 
     @Override
-	public void setTileEntity(int x, int y, int z, TileEntity tileEntity)
+	public void setBlockEntity(int x, int y, int z, BlockEntity blockEntity)
     {
     }
 
     @Override
-	public void removeTileEntity(int x, int y, int z)
+	public void removeBlockEntity(int x, int y, int z)
     {
     }
 
diff --git a/src/main/java/net/minecraft/core/world/chunk/LightUpdate.java b/src/main/java/net/minecraft/core/world/chunk/LightUpdate.java
index 386d2119d..46403e045 100644
--- a/src/main/java/net/minecraft/core/world/chunk/LightUpdate.java
+++ b/src/main/java/net/minecraft/core/world/chunk/LightUpdate.java
@@ -4,6 +4,7 @@ package net.minecraft.core.world.chunk;
 //            World, Chunk, Block, EnumSkyBlock
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
 
diff --git a/src/main/java/net/minecraft/core/world/chunk/MissingBlockFixer.java b/src/main/java/net/minecraft/core/world/chunk/MissingBlockFixer.java
index ecb6bca18..c45e05b97 100644
--- a/src/main/java/net/minecraft/core/world/chunk/MissingBlockFixer.java
+++ b/src/main/java/net/minecraft/core/world/chunk/MissingBlockFixer.java
@@ -5,6 +5,7 @@ package net.minecraft.core.world.chunk;
 //            Block
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
 public class MissingBlockFixer
 {
diff --git a/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java b/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
index 9e840eadb..f143486cb 100644
--- a/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
+++ b/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
@@ -12,10 +12,22 @@ import java.util.*;
  */
 public class SynchedEntityData
 {
-    private static final int END_MARKER = 127;
-    private static final int MAX_DATA_VALUE = 31;
-    private static final HashMap<Class<?>, Integer> DATA_TYPES = new HashMap<>();
 
+    // Type ID constants
+    public static final int TYPE_BYTE = 0;
+    public static final int TYPE_SHORT = 1;
+    public static final int TYPE_INT = 2;
+    public static final int TYPE_FLOAT = 3;
+    public static final int TYPE_STRING = 4;
+    public static final int TYPE_ITEMSTACK = 5;
+    public static final int TYPE_CHUNK_COORDINATE = 6;
+
+    // Format Constants
+    public static final int MAX_DATA_VALUE = 31;
+    public static final int TYPE_MASK = 0b1110_0000;
+    public static final int TYPE_SHIFT = 5;
+    public static final int END_MARKER = 127;
+    private static final HashMap<Class<?>, Integer> DATA_TYPES = new HashMap<>();
     private final Map<Integer, DataItem<?>> itemsById = new HashMap<>();
     private boolean isDirty;
 
@@ -189,44 +201,43 @@ public class SynchedEntityData
     private static <T> void writeDataItem(DataOutputStream dos, DataItem<T> di)
         throws IOException
     {
-        int typeValueByte = (di.getType() << 5 | di.getId() & 0x1F) & 0xFF;
+        int typeValueByte = (di.getType() << TYPE_SHIFT | di.getId() & ~TYPE_MASK) & 0xFF;
         dos.writeByte(typeValueByte);
 
-        switch(di.getType())
-        {
-        case 0:
-            dos.writeByte((Byte) di.getValue());
-            break;
-        case 1:
-            dos.writeShort((Short) di.getValue());
-            break;
-        case 2:
-            dos.writeInt((Integer) di.getValue());
-            break;
-        case 3:
-            dos.writeFloat((Float) di.getValue());
-            break;
-        case 4:
-            Packet.writeString((String)di.getValue(), dos);
-            break;
-        case 5:
-            ItemStack itemStack = (ItemStack)di.getValue();
-            if (itemStack == ItemStack.NO_ITEM){
-                dos.writeShort(-1);
-                dos.writeByte(-1);
-                dos.writeShort(-1);
-            } else {
-                dos.writeShort(itemStack.getItem().id);
-                dos.writeByte(itemStack.stackSize);
-                dos.writeShort(itemStack.getMetadata());
-            }
-            break;
-        case 6:
-            ChunkCoordinates chunkcoordinates = (ChunkCoordinates)di.getValue();
-            dos.writeInt(chunkcoordinates.x);
-            dos.writeInt(chunkcoordinates.y);
-            dos.writeInt(chunkcoordinates.z);
-            break;
+        switch(di.getType()) {
+            case TYPE_BYTE:
+                dos.writeByte((Byte) di.getValue());
+                break;
+            case TYPE_SHORT:
+                dos.writeShort((Short) di.getValue());
+                break;
+            case TYPE_INT:
+                dos.writeInt((Integer) di.getValue());
+                break;
+            case TYPE_FLOAT:
+                dos.writeFloat((Float) di.getValue());
+                break;
+            case TYPE_STRING:
+                Packet.writeString((String)di.getValue(), dos);
+                break;
+            case TYPE_ITEMSTACK:
+                ItemStack itemStack = (ItemStack)di.getValue();
+                if (itemStack == ItemStack.NO_ITEM){
+                    dos.writeShort(-1);
+                    dos.writeByte(-1);
+                    dos.writeShort(-1);
+                } else {
+                    dos.writeShort(itemStack.getItem().id);
+                    dos.writeByte(itemStack.stackSize);
+                    dos.writeShort(itemStack.getMetadata());
+                }
+                break;
+            case TYPE_CHUNK_COORDINATE:
+                ChunkCoordinates chunkcoordinates = (ChunkCoordinates)di.getValue();
+                dos.writeInt(chunkcoordinates.x);
+                dos.writeInt(chunkcoordinates.y);
+                dos.writeInt(chunkcoordinates.z);
+                break;
         }
     }
 
@@ -247,27 +258,27 @@ public class SynchedEntityData
             {
                 out = new ArrayList<>();
             }
-            int type = (data & 0xE0) >> 5;
-            int id = data & 0x1F;
+            int type = (data & TYPE_MASK) >> TYPE_SHIFT;
+            int id = data & ~TYPE_MASK;
             DataItem<?> di = null;
             switch(type)
             {
-                case 0:
+                case TYPE_BYTE:
                     di = new DataItem<>(type, id, dis.readByte());
                     break;
-                case 1:
+                case TYPE_SHORT:
                     di = new DataItem<>(type, id, dis.readShort());
                     break;
-                case 2:
+                case TYPE_INT:
                     di = new DataItem<>(type, id, dis.readInt());
                     break;
-                case 3:
+                case TYPE_FLOAT:
                     di = new DataItem<>(type, id, dis.readFloat());
                     break;
-                case 4:
+                case TYPE_STRING:
                     di = new DataItem<>(type, id, Packet.readString(dis, 64));
                     break;
-                case 5:
+                case TYPE_ITEMSTACK:
                     short itemId = dis.readShort();
                     byte itemCount = dis.readByte();
                     short itemData = dis.readShort();
@@ -277,7 +288,7 @@ public class SynchedEntityData
                         di = new DataItem<>(type, id, new ItemStack(itemId, itemCount, itemData));
                     }
                     break;
-                case 6:
+                case TYPE_CHUNK_COORDINATE:
                     int x = dis.readInt();
                     int y = dis.readInt();
                     int z = dis.readInt();
@@ -310,13 +321,13 @@ public class SynchedEntityData
 
     static 
     {
-        DATA_TYPES.put(java.lang.Byte.class, 0);
-        DATA_TYPES.put(java.lang.Short.class, 1);
-        DATA_TYPES.put(java.lang.Integer.class, 2);
-        DATA_TYPES.put(java.lang.Float.class, 3);
-        DATA_TYPES.put(java.lang.String.class, 4);
-        DATA_TYPES.put(ItemStack.class, 5);
-        DATA_TYPES.put(ChunkCoordinates.class, 6);
+        DATA_TYPES.put(Byte.class, TYPE_BYTE);
+        DATA_TYPES.put(Short.class, TYPE_SHORT);
+        DATA_TYPES.put(Integer.class, TYPE_INT);
+        DATA_TYPES.put(Float.class, TYPE_FLOAT);
+        DATA_TYPES.put(String.class, TYPE_STRING);
+        DATA_TYPES.put(ItemStack.class, TYPE_ITEMSTACK);
+        DATA_TYPES.put(ChunkCoordinates.class, TYPE_CHUNK_COORDINATE);
     }
 
     /**
diff --git a/src/main/java/net/minecraft/core/world/generate/MapGenCaves.java b/src/main/java/net/minecraft/core/world/generate/MapGenCaves.java
index b681ec06c..d6e237dcb 100644
--- a/src/main/java/net/minecraft/core/world/generate/MapGenCaves.java
+++ b/src/main/java/net/minecraft/core/world/generate/MapGenCaves.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.generate;
 import java.util.Random;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -12,7 +13,7 @@ import net.minecraft.core.world.chunk.ChunkSection;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 
 // Referenced classes of package net.minecraft.src:
-//            MapGenBase, MathHelper, Block, BlockGrass,
+//            MapGenBase, MathHelper, Block, GrassBlock,
 //            World
 
 public class MapGenCaves extends MapGenBase
@@ -80,8 +81,8 @@ public class MapGenCaves extends MapGenBase
             // Do adjacent branches if necessary
             if(!noBranches && startPos == branchPos && initialRadius > 1.0F)
             {
-                generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor - 1.570796F, rotVer / 3F, startPos, endPos, 1.0D);
-                generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor + 1.570796F, rotVer / 3F, startPos, endPos, 1.0D);
+                generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor - MathHelper.PI / 2F, rotVer / 3F, startPos, endPos, 1.0D);
+                generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor + MathHelper.PI / 2F, rotVer / 3F, startPos, endPos, 1.0D);
                 return;
             }
 
@@ -106,12 +107,12 @@ public class MapGenCaves extends MapGenBase
             }
 
             // Determine sizes of current section
-            int minX = MathHelper.floor_double(blockX - width) - baseChunkX * Chunk.CHUNK_SIZE_X - 1;
-            int maxX = (MathHelper.floor_double(blockX + width) - baseChunkX * Chunk.CHUNK_SIZE_X) + 1;
-            int minY = MathHelper.floor_double(blockY - height) - 1;
-            int maxY = MathHelper.floor_double(blockY + height) + 1;
-            int minZ = MathHelper.floor_double(blockZ - width) - baseChunkZ * Chunk.CHUNK_SIZE_Z - 1;
-            int maxZ = (MathHelper.floor_double(blockZ + width) - baseChunkZ * Chunk.CHUNK_SIZE_Z) + 1;
+            int minX = MathHelper.floor(blockX - width) - baseChunkX * Chunk.CHUNK_SIZE_X - 1;
+            int maxX = (MathHelper.floor(blockX + width) - baseChunkX * Chunk.CHUNK_SIZE_X) + 1;
+            int minY = MathHelper.floor(blockY - height) - 1;
+            int maxY = MathHelper.floor(blockY + height) + 1;
+            int minZ = MathHelper.floor(blockZ - width) - baseChunkZ * Chunk.CHUNK_SIZE_Z - 1;
+            int maxZ = (MathHelper.floor(blockZ + width) - baseChunkZ * Chunk.CHUNK_SIZE_Z) + 1;
             if(minX < 0)
             {
                 minX = 0;
@@ -199,7 +200,7 @@ public class MapGenCaves extends MapGenBase
                             {
                                 if(y < 10)
                                 {
-                                    result.setBlock(x, yIndex, z, Block.fluidLavaStill.id);
+                                    result.setBlock(x, yIndex, z, Blocks.FLUID_LAVA_STILL.id);
                                 } else
                                 {
                                     result.setBlock(x, yIndex, z, 0);
diff --git a/src/main/java/net/minecraft/core/world/generate/MapGenCavesHell.java b/src/main/java/net/minecraft/core/world/generate/MapGenCavesHell.java
index 380b5643e..402bd4299 100644
--- a/src/main/java/net/minecraft/core/world/generate/MapGenCavesHell.java
+++ b/src/main/java/net/minecraft/core/world/generate/MapGenCavesHell.java
@@ -11,7 +11,7 @@ import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            MapGenBase, MathHelper, Block, BlockGrass,
+//            MapGenBase, MathHelper, Block, GrassBlock,
 //            World
 
 public class MapGenCavesHell extends MapGenBase
@@ -51,7 +51,7 @@ public class MapGenCavesHell extends MapGenBase
 		boolean sharpRotVer = random.nextInt(6) == 0;
 		for(; startPos < endPos; startPos++)
 		{
-			double width = 1.5D + (double)(MathHelper.sin(((float)startPos * 3.141593F) / (float)endPos) * initialRadius * 1.0F);
+			double width = 1.5D + (double)(MathHelper.sin(((float)startPos * MathHelper.PI) / (float)endPos) * initialRadius * 1.0F);
 			double height = width * heightMod;
 			float xzScale = MathHelper.cos(rotVer);
 			float yOffset = MathHelper.sin(rotVer);
@@ -76,8 +76,8 @@ public class MapGenCavesHell extends MapGenBase
 			// Do adjacent branches if necessary
 			if(!noBranches && startPos == branchPos && initialRadius > 1.0F)
 			{
-				generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor - 1.570796F, rotVer / 3F, startPos, endPos, 1.0D);
-				generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor + 1.570796F, rotVer / 3F, startPos, endPos, 1.0D);
+				generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor - MathHelper.PI / 2F, rotVer / 3F, startPos, endPos, 1.0D);
+				generateCave(random.nextLong(), baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, random.nextFloat() * 0.5F + 0.5F, rotHor + MathHelper.PI / 2F, rotVer / 3F, startPos, endPos, 1.0D);
 				return;
 			}
 
@@ -102,12 +102,12 @@ public class MapGenCavesHell extends MapGenBase
 			}
 
 			// Determine sizes of current section
-			int minX = MathHelper.floor_double(blockX - width) - baseChunkX * Chunk.CHUNK_SIZE_X - 1;
-			int maxX = (MathHelper.floor_double(blockX + width) - baseChunkX * Chunk.CHUNK_SIZE_X) + 1;
-			int minY = MathHelper.floor_double(blockY - height) - 1;
-			int maxY = MathHelper.floor_double(blockY + height) + 1;
-			int minZ = MathHelper.floor_double(blockZ - width) - baseChunkZ * Chunk.CHUNK_SIZE_Z - 1;
-			int maxZ = (MathHelper.floor_double(blockZ + width) - baseChunkZ * Chunk.CHUNK_SIZE_Z) + 1;
+			int minX = MathHelper.floor(blockX - width) - baseChunkX * Chunk.CHUNK_SIZE_X - 1;
+			int maxX = (MathHelper.floor(blockX + width) - baseChunkX * Chunk.CHUNK_SIZE_X) + 1;
+			int minY = MathHelper.floor(blockY - height) - 1;
+			int maxY = MathHelper.floor(blockY + height) + 1;
+			int minZ = MathHelper.floor(blockZ - width) - baseChunkZ * Chunk.CHUNK_SIZE_Z - 1;
+			int maxZ = (MathHelper.floor(blockZ + width) - baseChunkZ * Chunk.CHUNK_SIZE_Z) + 1;
 			if(minX < 0)
 			{
 				minX = 0;
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/ChunkGeneratorResult.java b/src/main/java/net/minecraft/core/world/generate/chunk/ChunkGeneratorResult.java
index 680286b03..0ea90249d 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/ChunkGeneratorResult.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/ChunkGeneratorResult.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.chunk;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.chunk.ChunkSection;
 
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/classic/ChunkGeneratorClassic.java b/src/main/java/net/minecraft/core/world/generate/chunk/classic/ChunkGeneratorClassic.java
index db6e440d8..2028ff1f4 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/classic/ChunkGeneratorClassic.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/classic/ChunkGeneratorClassic.java
@@ -1,22 +1,18 @@
 package net.minecraft.core.world.generate.chunk.classic;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
-import net.minecraft.core.world.chunk.ChunkSection;
 import net.minecraft.core.world.generate.MapGenCaves;
-import net.minecraft.core.world.generate.chunk.ChunkDecorator;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 import net.minecraft.core.world.generate.chunk.perlin.SurfaceGenerator;
 import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.ChunkDecoratorOverworldRetro;
 import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.SurfaceGeneratorOverworldRetro;
 import net.minecraft.core.world.noise.CombinedPerlinNoise;
-import net.minecraft.core.world.noise.ImprovedNoise;
 import net.minecraft.core.world.noise.PerlinNoise;
 
-import java.util.Random;
-
 public class ChunkGeneratorClassic
     extends ChunkGenerator
 {
@@ -123,16 +119,16 @@ public class ChunkGeneratorClassic
 
                     if (y < newHeight)
                     {
-                        blockID = world.getWorldType().getFillerBlock();
+                        blockID = world.getWorldType().getFillerBlockId();
                     }
                     else if (y < world.getWorldType().getOceanY())
                     {
-                        blockID = world.getWorldType().getOceanBlock();
+                        blockID = world.getWorldType().getOceanBlockId();
                     }
 
                     if (y == 0)
                     {
-                        blockID = Block.bedrock.id;
+                        blockID = Blocks.BEDROCK.id;
                     }
 
                     result.setBlock(x, y, z, blockID);
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/debug/ChunkDecoratorDebug.java b/src/main/java/net/minecraft/core/world/generate/chunk/debug/ChunkDecoratorDebug.java
index 87360d25b..55ff1a3b0 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/debug/ChunkDecoratorDebug.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/debug/ChunkDecoratorDebug.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.chunk.debug;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkDecorator;
 
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/empty/ChunkDecoratorEmpty.java b/src/main/java/net/minecraft/core/world/generate/chunk/empty/ChunkDecoratorEmpty.java
index ab3632825..c2ad0fecc 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/empty/ChunkDecoratorEmpty.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/empty/ChunkDecoratorEmpty.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.chunk.empty;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkDecorator;
 
@@ -12,7 +13,7 @@ public class ChunkDecoratorEmpty
     {
         if (chunk.xPosition == 0 && chunk.zPosition == 0)
         {
-            chunk.setBlockID(0, 0, 0, Block.bedrock.id);
+            chunk.setBlockID(0, 0, 0, Blocks.BEDROCK.id);
         }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/flat/ChunkGeneratorFlat.java b/src/main/java/net/minecraft/core/world/generate/chunk/flat/ChunkGeneratorFlat.java
index 6e48a3f66..1392b3e99 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/flat/ChunkGeneratorFlat.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/flat/ChunkGeneratorFlat.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.world.generate.chunk.flat;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
-import net.minecraft.core.world.chunk.ChunkSection;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 
@@ -22,14 +22,14 @@ public class ChunkGeneratorFlat
 
         for (int z = 0; z < Chunk.CHUNK_SIZE_Z; z++) {
             for (int x = 0; x < Chunk.CHUNK_SIZE_X; x++) {
-                result.setBlock(x, 0, z, Block.bedrock.id);
+                result.setBlock(x, 0, z, Blocks.BEDROCK.id);
                 for (int y = 1; y < 4; y++) {
-                    result.setBlock(x, y, z, Block.stone.id);
+                    result.setBlock(x, y, z, Blocks.STONE.id);
                 }
                 for (int y = 4; y < 6; y++) {
-                    result.setBlock(x, y, z, Block.dirt.id);
+                    result.setBlock(x, y, z, Blocks.DIRT.id);
                 }
-                result.setBlock(x, 6, z, Block.grass.id);
+                result.setBlock(x, 6, z, Blocks.GRASS.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/indev/ChunkGeneratorIndev.java b/src/main/java/net/minecraft/core/world/generate/chunk/indev/ChunkGeneratorIndev.java
index 094cb09e4..0fed457a1 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/indev/ChunkGeneratorIndev.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/indev/ChunkGeneratorIndev.java
@@ -1,17 +1,15 @@
 package net.minecraft.core.world.generate.chunk.indev;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
-import net.minecraft.core.world.chunk.ChunkSection;
 import net.minecraft.core.world.generate.MapGenCaves;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 import net.minecraft.core.world.generate.chunk.perlin.SurfaceGenerator;
 import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.ChunkDecoratorOverworldRetro;
 import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.SurfaceGeneratorOverworldRetro;
-import net.minecraft.core.world.noise.CombinedPerlinNoise;
-import net.minecraft.core.world.noise.PerlinNoise;
 
 public class ChunkGeneratorIndev
     extends ChunkGenerator
@@ -42,7 +40,7 @@ public class ChunkGeneratorIndev
         // Place bedrock
         for (int x = 0; x < Chunk.CHUNK_SIZE_X; x++) {
             for (int z = 0; z < Chunk.CHUNK_SIZE_Z; z++) {
-                result.setBlock(x, 0, z, Block.bedrock.id);
+                result.setBlock(x, 0, z, Blocks.BEDROCK.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/indev/LevelGenerator.java b/src/main/java/net/minecraft/core/world/generate/chunk/indev/LevelGenerator.java
index 7eb8906ed..dc9e4ee60 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/indev/LevelGenerator.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/indev/LevelGenerator.java
@@ -1,18 +1,13 @@
 package net.minecraft.core.world.generate.chunk.indev;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFlower;
-import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
-import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
 import net.minecraft.core.world.noise.CombinedPerlinNoise;
 import net.minecraft.core.world.noise.RetroPerlinNoise;
 
-import java.util.ArrayList;
-import java.util.Random;
-
 public final class LevelGenerator {
     private final int sizeX;
     private final int sizeY;
@@ -156,7 +151,7 @@ public final class LevelGenerator {
                     for (int y = 0; y < sizeY; y++) {
                         int id = 0;
                         if (y <= height) {
-                            id = Block.stone.id;
+                            id = Blocks.STONE.id;
                         }
 
                         if (worldType == IndevWorldType.FLOATING && y < floatingLayerMinY) {
@@ -198,17 +193,17 @@ public final class LevelGenerator {
 
                     int height = heightMap[x + z * Chunk.CHUNK_SIZE_X];
                     int topBlock = result.getBlock(x, height + 1, z);
-                    if ((topBlock == Block.fluidWaterFlowing.id || topBlock == Block.fluidWaterStill.id || topBlock == 0)
+                    if ((topBlock == Blocks.FLUID_WATER_FLOWING.id || topBlock == Blocks.FLUID_WATER_STILL.id || topBlock == 0)
                         && height <= waterLevel - 1 && isGravel) {
-                        result.setBlock(x, height, z, Block.gravel.id);
+                        result.setBlock(x, height, z, Blocks.GRAVEL.id);
                     }
 
                     if (topBlock == 0) {
                         int id = -1;
                         if (height <= beachHeight && isSand) {
-                            id = Block.sand.id;
+                            id = Blocks.SAND.id;
                             if (worldTheme == IndevWorldTheme.HELL) {
-                                id = Block.grass.id;
+                                id = Blocks.GRASS.id;
                             }
                         }
 
@@ -228,7 +223,7 @@ public final class LevelGenerator {
                         int i = Chunk.makeBlockIndex(x, y, z);
                         int id = result.getBlock(x, y, z);
                         if (id == 0 && y < waterLevel) {
-                            result.setBlock(x, y, z, Block.fluidWaterStill.id);
+                            result.setBlock(x, y, z, Blocks.FLUID_WATER_STILL.id);
                         }
                     }
                 }
@@ -244,11 +239,11 @@ public final class LevelGenerator {
         for (int x = xSpawn - 3; x <= xSpawn + 3; x++) {
             for (int y = ySpawn - 2; y <= ySpawn + 2; y++) {
                 for (int z = zSpawn - 3; z <= zSpawn + 3; z++) {
-                    int id = y < ySpawn - 1 ? Block.obsidian.id : 0;
+                    int id = y < ySpawn - 1 ? Blocks.OBSIDIAN.id : 0;
                     if (x == xSpawn - 3 || z == zSpawn - 3 || x == xSpawn + 3 || z == zSpawn + 3 || y == ySpawn - 2 || y == ySpawn + 2) {
-                        id = Block.stone.id;
+                        id = Blocks.STONE.id;
                         if (y >= ySpawn - 1) {
-                            id = Block.planksOak.id;
+                            id = Blocks.PLANKS_OAK.id;
                         }
                     }
 
@@ -261,7 +256,7 @@ public final class LevelGenerator {
             }
         }
 
-        world.setBlockWithNotify(xSpawn - 3 + 1, ySpawn + 2, zSpawn, Block.torchCoal.id);
-        world.setBlockWithNotify(xSpawn + 3 - 1, ySpawn + 2, zSpawn, Block.torchCoal.id);
+        world.setBlockWithNotify(xSpawn - 3 + 1, ySpawn + 2, zSpawn, Blocks.TORCH_COAL.id);
+        world.setBlockWithNotify(xSpawn + 3 - 1, ySpawn + 2, zSpawn, Blocks.TORCH_COAL.id);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
index 210dd3c40..b0c260f8f 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/ChunkDecoratorNether.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.generate.chunk.perlin.nether;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSand;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.SandBlock;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkDecorator;
@@ -31,7 +31,7 @@ public class ChunkDecoratorNether
 
         Random rand = new Random((long) chunkX * 0x4f9939f508L + (long) chunkZ * 0x1ef1565bd5L);
 
-        BlockSand.fallInstantly = true;
+        SandBlock.fallInstantly = true;
         int x = chunkX * 16;
         int z = chunkZ * 16;
         for(int i = 0; i < 8; i++)
@@ -39,7 +39,7 @@ public class ChunkDecoratorNether
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rangeY - 8) + 4;
             int zf = z + rand.nextInt(16) + 8;
-            (new WorldFeatureNetherLava(Block.fluidLavaFlowing.id)).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureNetherLava(Blocks.FLUID_LAVA_FLOWING.id)).place(world, rand, xf, yf, zf);
         }
 
         for(int i = 0; i < 10; i++)
@@ -47,7 +47,7 @@ public class ChunkDecoratorNether
             int xf = x + rand.nextInt(16);
             int yf = minY + rand.nextInt(rangeY - 8) + 4;
             int zf = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreNethercoalNetherrack.id, 12, false)).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureOre(Blocks.ORE_NETHERCOAL_NETHERRACK.id, 12)).place(world, rand, xf, yf, zf);
         }
 
         int max = rand.nextInt(rand.nextInt(10) + 1);
@@ -56,7 +56,7 @@ public class ChunkDecoratorNether
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rangeY - 8) + 4;
             int zf = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFire()).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureFire()).place(world, rand, xf, yf, zf);
         }
 
         max = rand.nextInt(rand.nextInt(10) + 1);
@@ -65,7 +65,7 @@ public class ChunkDecoratorNether
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rangeY - 8) + 4;
             int zf = z + rand.nextInt(16) + 8;
-            (new WorldFeatureGlowstoneA()).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureGlowstoneA()).place(world, rand, xf, yf, zf);
         }
 
         for(int i = 0; i < 10; i++)
@@ -73,17 +73,17 @@ public class ChunkDecoratorNether
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rangeY - 8) + 4;
             int zf = z + rand.nextInt(16) + 8;
-            (new WorldFeatureGlowstoneB()).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureGlowstoneB()).place(world, rand, xf, yf, zf);
         }
 
         if (rand.nextInt(8) == 0) {
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rangeY - 16) + 8;
             int zf = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLake(Block.fluidLavaStill.id)).generate(world, rand, xf, yf, zf);
+            (new WorldFeatureLake(Blocks.FLUID_LAVA_STILL.id)).place(world, rand, xf, yf, zf);
         }
 
-        BlockSand.fallInstantly = false;
+        SandBlock.fallInstantly = false;
 
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
index 8d3632cae..5a9b74363 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/SurfaceGeneratorNether.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.generate.chunk.perlin.nether;
 
-import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
@@ -35,8 +35,8 @@ public class SurfaceGeneratorNether
         int chunkX = chunk.xPosition;
         int chunkZ = chunk.zPosition;
 
-        int oceanBlock = world.getWorldType().getOceanBlock();
-        int worldFillBlock = world.getWorldType().getFillerBlock();
+        int oceanBlock = world.getWorldType().getOceanBlockId();
+        int worldFillBlock = world.getWorldType().getFillerBlockId();
 
         Random rand = new Random((long) chunkX * 0x4F9939F508L + (long) chunkZ * 0x1EF1565BD5L);
 
@@ -89,19 +89,19 @@ public class SurfaceGeneratorNether
                             fillerBlock = (short) worldFillBlock;
                             if(generateGravelBeach)
                             {
-                                topBlock = (short) Block.gravel.id;
+                                topBlock = (short) Blocks.GRAVEL.id;
                             }
                             if(generateGravelBeach)
                             {
-                                fillerBlock = (short) Block.netherrack.id;
+                                fillerBlock = (short) Blocks.NETHERRACK.id;
                             }
                             if(generateSandBeach)
                             {
-                                topBlock = (short) Block.soulsand.id;
+                                topBlock = (short) Blocks.SOULSAND.id;
                             }
                             if(generateSandBeach)
                             {
-                                fillerBlock = (short) Block.soulsand.id;
+                                fillerBlock = (short) Blocks.SOULSAND.id;
                             }
                         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
index c05622134..0a902d2de 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/TerrainGeneratorNether.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.chunk.perlin.nether;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.chunk.perlin.DensityGenerator;
 import net.minecraft.core.world.generate.chunk.perlin.TerrainGeneratorLerp;
@@ -25,19 +26,19 @@ public class TerrainGeneratorNether
 
         if (y >= type.getMaxY() - rand.nextInt(5))
         {
-            return Block.bedrock.id;
+            return Blocks.BEDROCK.id;
         }
         else if (y <= type.getMinY() + rand.nextInt(5))
         {
-            return Block.bedrock.id;
+            return Blocks.BEDROCK.id;
         }
         else if (density > 0.0)
         {
-            return type.getFillerBlock();
+            return type.getFillerBlockId();
         }
         else if (y >= type.getMinY() && y < type.getMinY() + type.getOceanY())
         {
-            return type.getOceanBlock();
+            return type.getOceanBlockId();
         }
 
         return 0;
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 aa7f16875..fbafb6b93 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
@@ -1,8 +1,16 @@
 package net.minecraft.core.world.generate.chunk.perlin.overworld;
 
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
-import net.minecraft.core.block.BlockSand;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.CoalOreBlock;
+import net.minecraft.core.block.DiamondOreBlock;
+import net.minecraft.core.block.GoldOreBlock;
+import net.minecraft.core.block.IronOreBlock;
+import net.minecraft.core.block.LapisOreBlock;
+import net.minecraft.core.block.MossBlock;
+import net.minecraft.core.block.RedstoneOreBlock;
+import net.minecraft.core.block.SandBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
@@ -49,7 +57,7 @@ public class ChunkDecoratorOverworld
 
         float oreHeightModifier = rangeY / 128f;
 
-        BlockSand.fallInstantly = true;
+        SandBlock.fallInstantly = true;
         int x = chunkX * 16;
         int z = chunkZ * 16;
         int y = world.getHeightValue(x + 16, z + 16);
@@ -70,7 +78,7 @@ public class ChunkDecoratorOverworld
                 {
                     int topBlock = world.getHeightValue(x + dx, z + dz);
                     int id = world.getBlockId(x + dx, topBlock - 1, z + dz);
-                    if (id == Block.grass.id)
+                    if (id == Blocks.GRASS.id)
                     {
                         boolean shouldPlaceWater = swampRand.nextFloat() < 0.5f;
                         if (shouldPlaceWater)
@@ -88,7 +96,7 @@ public class ChunkDecoratorOverworld
                                             negYId != 0 && Block.blocksList[negYId].blockMaterial.isSolid()
                             )
                             {
-                                world.setBlock(x + dx, topBlock - 1, z + dz, Block.fluidWaterStill.id);
+                                world.setBlock(x + dx, topBlock - 1, z + dz, Blocks.FLUID_WATER_STILL.id);
                                 world.setBlock(x + dx, topBlock, z + dz, 0);
                             }
                         }
@@ -103,22 +111,22 @@ public class ChunkDecoratorOverworld
         if (biome == Biomes.OVERWORLD_DESERT)
             lakeChance = 0;
         if (lakeChance != 0 && rand.nextInt(lakeChance) == 0) {
-            int fluid = Block.fluidWaterStill.id;
+            int fluid = Blocks.FLUID_WATER_STILL.id;
             if (biome.hasSurfaceSnow())
             {
-                fluid = Block.ice.id;
+                fluid = Blocks.ICE.id;
             }
             int i1 = x + rand.nextInt(16) + 8;
             int l4 = minY + rand.nextInt(rangeY);
             int i8 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLake(fluid)).generate(world, rand, i1, l4, i8);
+            (new WorldFeatureLake(fluid)).place(world, rand, i1, l4, i8);
         }
         if (rand.nextInt(8) == 0) {
             int xf = x + rand.nextInt(16) + 8;
             int yf = minY + rand.nextInt(rand.nextInt(rangeY - (rangeY / 16)) + (rangeY / 16));
             int zf = z + rand.nextInt(16) + 8;
             if (yf < minY + rangeY / 2 || rand.nextInt(10) == 0) {
-                (new WorldFeatureLake(Block.fluidLavaStill.id)).generate(world, rand, xf, yf, zf);
+                (new WorldFeatureLake(Blocks.FLUID_LAVA_STILL.id)).place(world, rand, xf, yf, zf);
             }
         }
         for (int k1 = 0; k1 < (8 * oreHeightModifier); k1++) {
@@ -126,9 +134,9 @@ public class ChunkDecoratorOverworld
             int k8 = minY + rand.nextInt(rangeY);
             int j11 = z + rand.nextInt(16) + 8;
             if (rand.nextInt(2) == 0) {
-                (new WorldFeatureDungeon(Block.brickClay.id, Block.brickClay.id, null)).generate(world, rand, j5, k8, j11);
+                (new WorldFeatureDungeon(Blocks.BRICK_CLAY.id, Blocks.BRICK_CLAY.id, null)).place(world, rand, j5, k8, j11);
             } else {
-                (new WorldFeatureDungeon(Block.cobbleStone.id, Block.cobbleStoneMossy.id, null)).generate(world, rand, j5, k8, j11);
+                (new WorldFeatureDungeon(Blocks.COBBLE_STONE.id, Blocks.COBBLE_STONE_MOSSY.id, null)).place(world, rand, j5, k8, j11);
             }
         }
 
@@ -144,7 +152,7 @@ public class ChunkDecoratorOverworld
 
             if (rand.nextInt(700) == 0) {
                 Random lRand = chunk.getChunkRandom(0x4823F58);
-                (new WorldFeatureLabyrinth()).generate(world, lRand, j5, k8, j11);
+                (new WorldFeatureLabyrinth()).place(world, lRand, j5, k8, j11);
             }
         }
 
@@ -152,77 +160,85 @@ public class ChunkDecoratorOverworld
             int k5 = x + rand.nextInt(16);
             int l8 = minY + rand.nextInt(rangeY);
             int k11 = z + rand.nextInt(16);
-            (new WorldFeatureClay(32)).generate(world, rand, k5, l8, k11);
+            (new WorldFeatureClay(32)).place(world, rand, k5, l8, k11);
         }
         if (biome instanceof BiomeOutback || biome == Biomes.OVERWORLD_OUTBACK) {
             int l5 = x + rand.nextInt(16);
             int l11 = z + rand.nextInt(16);
             int i9 = world.getHeightValue(l5, l11);
-            (new WorldFeatureRichScorchedDirt(10)).generate(world, rand, l5, i9, l11);
+            (new WorldFeatureRichScorchedDirt(10)).place(world, rand, l5, i9, l11);
         }
 
+        if (biome == Biomes.OVERWORLD_GLACIER || biome == Biomes.OVERWORLD_TUNDRA){
+            for (int i4 = 0; i4 < 5 * oreHeightModifier; i4++) {
+                int j7 = x + rand.nextInt(16);
+                int k10 = minY + rand.nextInt(rangeY / 2);
+                int j13 = z + rand.nextInt(16);
+                (new WorldFeaturePermaice(32 + rand.nextInt(32), Blocks.PERMAFROST)).place(world, rand, j7, k10, j13);
+            }
+        }
 
         for (int j2 = 0; j2 < (20 * oreHeightModifier); j2++) {
             int l5 = x + rand.nextInt(16);
             int i9 = minY + rand.nextInt(rangeY);
             int l11 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.dirt.id, 32, false)).generate(world, rand, l5, i9, l11);
+            (new WorldFeatureOre(Blocks.DIRT.id, 32)).place(world, rand, l5, i9, l11);
         }
 
         for (int k2 = 0; k2 < (10 * oreHeightModifier); k2++) {
             int i6 = x + rand.nextInt(16);
             int j9 = minY + rand.nextInt(rangeY);
             int i12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.gravel.id, 32, false)).generate(world, rand, i6, j9, i12);
+            (new WorldFeatureOre(Blocks.GRAVEL.id, 32)).place(world, rand, i6, j9, i12);
         }
 
         for (int i3 = 0; i3 < (20 * oreHeightModifier); i3++) {
             int j6 = x + rand.nextInt(16);
             int k9 = minY + rand.nextInt(rangeY);
             int j12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreCoalStone.id, 16, true)).generate(world, rand, j6, k9, j12);
+            new WorldFeatureOre(CoalOreBlock.variantMap, 16).place(world, rand, j6, k9, j12);
         }
 
         for (int j3 = 0; j3 < (20 * oreHeightModifier); j3++) {
             int k6 = x + rand.nextInt(16);
             int l9 = minY + rand.nextInt(rangeY / 2);
             int k12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreIronStone.id, 8, true)).generate(world, rand, k6, l9, k12);
+            (new WorldFeatureOre(IronOreBlock.variantMap, 8)).place(world, rand, k6, l9, k12);
         }
 
         for (int k3 = 0; k3 < (2 * oreHeightModifier); k3++) {
             int l6 = x + rand.nextInt(16);
             int i10 = minY + rand.nextInt(rangeY / 4);
             int l12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreGoldStone.id, 8, true)).generate(world, rand, l6, i10, l12);
+            (new WorldFeatureOre(GoldOreBlock.variantMap, 8)).place(world, rand, l6, i10, l12);
         }
 
         for (int l3 = 0; l3 < (8 * oreHeightModifier); l3++) {
             int i7 = x + rand.nextInt(16);
             int j10 = minY + rand.nextInt(rangeY / 8);
             int i13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreRedstoneStone.id, 7, true)).generate(world, rand, i7, j10, i13);
+            (new WorldFeatureOre(RedstoneOreBlock.variantMap, 7)).place(world, rand, i7, j10, i13);
         }
 
         for (int i4 = 0; i4 < oreHeightModifier; i4++) {
             int j7 = x + rand.nextInt(16);
             int k10 = minY + rand.nextInt(rangeY / 8);
             int j13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreDiamondStone.id, 7, true)).generate(world, rand, j7, k10, j13);
+            (new WorldFeatureOre(DiamondOreBlock.variantMap, 7)).place(world, rand, j7, k10, j13);
         }
 
         for (int i4 = 0; i4 < oreHeightModifier; i4++) {
             int j7 = x + rand.nextInt(16);
             int k10 = minY + rand.nextInt(rangeY / 2);
             int j13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.mossStone.id, 32, true)).generate(world, rand, j7, k10, j13);
+            (new WorldFeatureOre(MossBlock.variantMap, 32)).place(world, rand, j7, k10, j13);
         }
 
         for (int j4 = 0; j4 < oreHeightModifier; j4++) {
             int k7 = x + rand.nextInt(16);
             int l10 = minY + rand.nextInt(rangeY / 8) + rand.nextInt(rangeY / 8);
             int k13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreLapisStone.id, 6, true)).generate(world, rand, k7, l10, k13);
+            (new WorldFeatureOre(LapisOreBlock.variantMap, 6)).place(world, rand, k7, l10, k13);
         }
 
 
@@ -273,16 +289,16 @@ public class ChunkDecoratorOverworld
         }
         if (treeDensityOverride != -1) treeDensity = treeDensityOverride;
         try {
-        	BlockLeavesBase.enableDecay = false;
+        	BaseLeavesBlock.enableDecay = false;
             for (int i11 = 0; i11 < treeDensity; i11++) {
                 int l13 = x + rand.nextInt(16) + 8;
                 int j14 = z + rand.nextInt(16) + 8;
                 WorldFeature feature = biome.getRandomWorldGenForTrees(rand);
-                feature.func_517_a(1.0D, 1.0D, 1.0D);
-                feature.generate(world, rand, l13, world.getHeightValue(l13, j14), j14);
+                feature.init(1.0D, 1.0D, 1.0D);
+                feature.place(world, rand, l13, world.getHeightValue(l13, j14), j14);
             }
         }finally {
-        	BlockLeavesBase.enableDecay = true;
+        	BaseLeavesBlock.enableDecay = true;
         }
         byte byteReeds = 0;
         if (biome == Biomes.OVERWORLD_RAINFOREST) {
@@ -292,7 +308,7 @@ public class ChunkDecoratorOverworld
             int i18 = x + rand.nextInt(16) + 8;
             int i23 = z + rand.nextInt(16) + 8;
             int i21 = world.getHeightValue(i18, i23);
-            (new WorldFeatureSugarCaneTall()).generate(world, rand, i18, i21, i23);
+            (new WorldFeatureSugarCaneTall()).place(world, rand, i18, i21, i23);
         }
 
         byte byteOrchid = 0;
@@ -303,12 +319,12 @@ public class ChunkDecoratorOverworld
             byteOrchid = 1;
         }
         for (int l14 = 0; l14 < byteOrchid; l14++) {
-            int[] flowerIds= { Block.flowerYellow.id, Block.flowerPink.id, Block.flowerRed.id };
+            int[] flowerIds= { Blocks.FLOWER_YELLOW.id, Blocks.FLOWER_PINK.id, Blocks.FLOWER_RED.id };
 
             int l19 = x + rand.nextInt(16) + 8;
             int k22 = rand.nextInt(world.getHeightBlocks());
             int j24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureMeadow(flowerIds)).generate(world, rand, l19, k22, j24);
+            (new WorldFeatureMeadow(flowerIds)).place(world, rand, l19, k22, j24);
         }
 
         byte byteMeadow = 0;
@@ -326,17 +342,17 @@ public class ChunkDecoratorOverworld
         }
 
         for (int l14 = 0; l14 < byteMeadow; l14++) {
-            int blockId = Block.flowerPurple.id;
+            int blockId = Blocks.FLOWER_PURPLE.id;
             if (rand.nextInt(12) == 0) {
-                blockId = Block.flowerRed.id;
+                blockId = Blocks.FLOWER_RED.id;
             }
             if (rand.nextInt(6) == 0) {
-                blockId = Block.flowerYellow.id;
+                blockId = Blocks.FLOWER_YELLOW.id;
             }
             int l19 = x + rand.nextInt(16) + 8;
             int k22 = rand.nextInt(world.getHeightBlocks());
             int j24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureTallGrass(blockId)).generate(world, rand, l19, k22, j24);
+            (new WorldFeatureTallGrass(blockId)).place(world, rand, l19, k22, j24);
         }
 
         byte byteBluebells = 0;
@@ -357,7 +373,7 @@ public class ChunkDecoratorOverworld
             int k14 = x + rand.nextInt(16) + 8;
             int l16 = minY + rand.nextInt(rangeY);
             int k19 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerLightBlue.id)).generate(world, rand, k14, l16, k19);
+            (new WorldFeatureFlowers(Blocks.FLOWER_LIGHT_BLUE.id)).place(world, rand, k14, l16, k19);
         }
 
         byte byteMarigold = 0;
@@ -380,7 +396,7 @@ public class ChunkDecoratorOverworld
             int k14 = x + rand.nextInt(16) + 8;
             int l16 = minY + rand.nextInt(rangeY);
             int k19 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerOrange.id)).generate(world, rand, k14, l16, k19);
+            (new WorldFeatureFlowers(Blocks.FLOWER_ORANGE.id)).place(world, rand, k14, l16, k19);
         }
 
         byte byte0 = 0;
@@ -408,7 +424,7 @@ public class ChunkDecoratorOverworld
             int k14 = x + rand.nextInt(16) + 8;
             int l16 = minY + rand.nextInt(rangeY);
             int k19 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerYellow.id)).generate(world, rand, k14, l16, k19);
+            (new WorldFeatureFlowers(Blocks.FLOWER_YELLOW.id)).place(world, rand, k14, l16, k19);
         }
 
         byte byte1 = 0;
@@ -443,14 +459,14 @@ public class ChunkDecoratorOverworld
             byte1 = 2;
         }
         for (int l14 = 0; l14 < byte1; l14++) {
-            int type = Block.tallgrass.id;
+            int type = Blocks.TALLGRASS.id;
             if ((biome == Biomes.OVERWORLD_RAINFOREST || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_BOREAL_FOREST || biome == Biomes.OVERWORLD_TAIGA) && rand.nextInt(3) != 0) {
-                type = Block.tallgrassFern.id;
+                type = Blocks.TALLGRASS_FERN.id;
             }
             int l19 = x + rand.nextInt(16) + 8;
             int k22 = minY + rand.nextInt(rangeY);
             int j24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureTallGrass(type)).generate(world, rand, l19, k22, j24);
+            (new WorldFeatureTallGrass(type)).place(world, rand, l19, k22, j24);
         }
 
         byte1 = 0;
@@ -461,7 +477,7 @@ public class ChunkDecoratorOverworld
             int i17 = x + rand.nextInt(16) + 8;
             int i20 = minY + rand.nextInt(rangeY);
             int l22 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureSpinifexPatch()).generate(world, rand, i17, i20, l22);
+            (new WorldFeatureSpinifexPatch()).place(world, rand, i17, i20, l22);
         }
 
         byte1 = 0;
@@ -475,32 +491,32 @@ public class ChunkDecoratorOverworld
             int i17 = x + rand.nextInt(16) + 8;
             int i20 = minY + rand.nextInt(rangeY);
             int l22 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureDeadBush(Block.deadbush.id)).generate(world, rand, i17, i20, l22);
+            (new WorldFeatureDeadBush(Blocks.DEADBUSH.id)).place(world, rand, i17, i20, l22);
         }
 
         if (rand.nextInt(2) == 0) {
             int j15 = x + rand.nextInt(16) + 8;
             int j17 = minY + rand.nextInt(rangeY);
             int j20 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerRed.id)).generate(world, rand, j15, j17, j20);
+            (new WorldFeatureFlowers(Blocks.FLOWER_RED.id)).place(world, rand, j15, j17, j20);
         }
         if (rand.nextInt(4) == 0) {
             int k15 = x + rand.nextInt(16) + 8;
             int k17 = minY + rand.nextInt(rangeY);
             int k20 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.mushroomBrown.id)).generate(world, rand, k15, k17, k20);
+            (new WorldFeatureFlowers(Blocks.MUSHROOM_BROWN.id)).place(world, rand, k15, k17, k20);
         }
         if (rand.nextInt(8) == 0) {
             int l15 = x + rand.nextInt(16) + 8;
             int l17 = minY + rand.nextInt(rangeY);
             int l20 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.mushroomRed.id)).generate(world, rand, l15, l17, l20);
+            (new WorldFeatureFlowers(Blocks.MUSHROOM_RED.id)).place(world, rand, l15, l17, l20);
         }
         if(rand.nextInt(5) == 0) {
             int i18 = x + rand.nextInt(16) + 8;
             int i23 = z + rand.nextInt(16) + 8;
             int i21 = world.getHeightValue(i18, i23);
-            (new WorldFeatureSugarCane()).generate(world, rand, i18, i21, i23);
+            (new WorldFeatureSugarCane()).place(world, rand, i18, i21, i23);
         }
 
         if(rand.nextInt(128) == 0)
@@ -508,14 +524,14 @@ public class ChunkDecoratorOverworld
             int j16 = x + rand.nextInt(16) + 8;
             int j21 = z + rand.nextInt(16) + 8;
             int i22 = world.getHeightValue(j16, j21);
-            (new WorldFeaturePumpkin()).generate(world, rand, j16, i22, j21);
+            (new WorldFeaturePumpkin()).place(world, rand, j16, i22, j21);
         }
         if(rand.nextInt(64) == 0)
         {
             int j16 = x + rand.nextInt(16) + 8;
             int j21 = z + rand.nextInt(16) + 8;
             int i22 = world.getHeightValue(j16, j21);
-            (new WorldFeatureSponge()).generate(world, rand, j16, i22, j21);
+            (new WorldFeatureSponge()).place(world, rand, j16, i22, j21);
         }
 
         int k16 = 0;
@@ -532,7 +548,7 @@ public class ChunkDecoratorOverworld
             int k21 = x + rand.nextInt(16) + 8;
             int j23 = minY + rand.nextInt(rangeY);
             int k24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureCactus()).generate(world, rand, k21, j23, k24);
+            (new WorldFeatureCactus()).place(world, rand, k21, j23, k24);
         }
 
         for(int l18 = 0; l18 < 50; l18++)
@@ -540,7 +556,7 @@ public class ChunkDecoratorOverworld
             int l21 = x + rand.nextInt(16) + 8;
             int k23 = minY + rand.nextInt(rand.nextInt(rangeY - (rangeY / 16)) + (rangeY / 16));
             int l24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidWaterFlowing.id)).generate(world, rand, l21, k23, l24);
+            (new WorldFeatureLiquid(Blocks.FLUID_WATER_FLOWING.id)).place(world, rand, l21, k23, l24);
         }
 
         for(int i19 = 0; i19 < 20; i19++)
@@ -548,7 +564,7 @@ public class ChunkDecoratorOverworld
             int i22 = x + rand.nextInt(16) + 8;
             int l23 = minY + rand.nextInt(rand.nextInt(rand.nextInt(rangeY - (rangeY / 8)) + (rangeY / 16)) + (rangeY / 16));
             int i25 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidLavaFlowing.id)).generate(world, rand, i22, l23, i25);
+            (new WorldFeatureLiquid(Blocks.FLUID_LAVA_FLOWING.id)).place(world, rand, i22, l23, i25);
         }
 
         int oceanY = world.getWorldType().getOceanY();
@@ -563,19 +579,19 @@ public class ChunkDecoratorOverworld
                 {
                     if (world.isAirBlock(dx, dy, dz) && world.getBlockMaterial(dx, dy - 1, dz).blocksMotion())
                     {
-                        world.setBlockWithNotify(dx, dy, dz, Block.layerSnow.id);
+                        world.setBlockWithNotify(dx, dy, dz, Blocks.LAYER_SNOW.id);
                     }
                 }
-                if ((localBiome.hasSurfaceSnow() || world.worldType == WorldTypes.OVERWORLD_WINTER) && (world.getBlockId(dx, oceanY - 1, dz) == Block.fluidWaterStill.id || world.getBlockId(dx, oceanY - 1, dz) == Block.fluidWaterFlowing.id))
+                if ((localBiome.hasSurfaceSnow() || world.worldType == WorldTypes.OVERWORLD_WINTER) && (world.getBlockId(dx, oceanY - 1, dz) == Blocks.FLUID_WATER_STILL.id || world.getBlockId(dx, oceanY - 1, dz) == Blocks.FLUID_WATER_FLOWING.id))
                 {
-                    world.setBlockWithNotify(dx, oceanY - 1, dz, Block.ice.id);
+                    world.setBlockWithNotify(dx, oceanY - 1, dz, Blocks.ICE.id);
                 }
 
             }
 
         }
 
-        BlockSand.fallInstantly = false;
+        SandBlock.fallInstantly = false;
         world.scheduledUpdatesAreImmediate = false;
     }
 }
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 fc4baade8..d315bc946 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
@@ -3,7 +3,7 @@ package net.minecraft.core.world.generate.chunk.perlin.overworld;
 import java.util.Random;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.Biomes;
@@ -53,8 +53,8 @@ public class SurfaceGeneratorOverworld
         int chunkX = chunk.xPosition;
         int chunkZ = chunk.zPosition;
 
-        int oceanBlock = world.getWorldType().getOceanBlock();
-        int worldFillBlock = world.getWorldType().getFillerBlock();
+        int oceanBlock = world.getWorldType().getOceanBlockId();
+        int worldFillBlock = world.getWorldType().getFillerBlockId();
 
         Random rand = new Random((long) chunkX * 0x4F9939F508L + (long) chunkZ * 0x1EF1565BD5L);
 
@@ -157,24 +157,24 @@ public class SurfaceGeneratorOverworld
                                 fillerBlock = biome.fillerBlock;
                                 if(biomeGeneratesMud)
                                 {
-                                    topBlock = (short) Block.mud.id;
-                                    fillerBlock = (short) Block.mud.id;
+                                    topBlock = (short) Blocks.MUD.id;
+                                    fillerBlock = (short) Blocks.MUD.id;
                                 }
                                 else if(generateGravelBeach)
                                 {
                                     topBlock = 0;
-                                    fillerBlock = (short) Block.gravel.id;
+                                    fillerBlock = (short) Blocks.GRAVEL.id;
                                 }
                                 else if(generateSandBeach)
                                 {
-                                    topBlock = (short) Block.sand.id;
-                                    fillerBlock = (short) Block.sand.id;
+                                    topBlock = (short) Blocks.SAND.id;
+                                    fillerBlock = (short) Blocks.SAND.id;
                                 }
                             } else if (y <= oceanY) {
                                 if(biomeGeneratesMud) // Make mud under the ocean always be regular mud
                                 {
-                                    topBlock = (short) Block.mud.id;
-                                    fillerBlock = (short) Block.mud.id;
+                                    topBlock = (short) Blocks.MUD.id;
+                                    fillerBlock = (short) Blocks.MUD.id;
                                 }
                             }
                         }
@@ -209,7 +209,21 @@ public class SurfaceGeneratorOverworld
                             {
                                 if (generateBasaltLayer)
                                 {
-                                    result.setBlock(x, y, z, Block.basalt.id);
+                                    result.setBlock(x, y, z, Blocks.BASALT.id);
+                                    continue;
+                                }
+                            }
+                            if(biome == Biomes.OVERWORLD_GLACIER){
+                                if (y >= (minY + 56 + graniteThicknessLevel/4 - rand.nextInt(3)) && y <= maxY)
+                                {
+                                    result.setBlock(x, y, z, Blocks.PERMAFROST.id);
+                                    continue;
+                                }
+                            }
+                            if(biome == Biomes.OVERWORLD_TUNDRA){
+                                if (y >= (minY + 56 + graniteThicknessLevel/4 - rand.nextInt(3)) && y <= (minY + (56 + 36) + graniteThicknessLevel/8 - rand.nextInt(3)))
+                                {
+                                    result.setBlock(x, y, z, Blocks.PERMAFROST.id);
                                     continue;
                                 }
                             }
@@ -217,7 +231,7 @@ public class SurfaceGeneratorOverworld
                             {
                                 if (generateGraniteLayer)
                                 {
-                                    result.setBlock(x, y, z, Block.granite.id);
+                                    result.setBlock(x, y, z, Blocks.GRANITE.id);
                                     continue;
                                 }
                             }
@@ -225,7 +239,7 @@ public class SurfaceGeneratorOverworld
                             {
                                 if (generateLimestoneLayer)
                                 {
-                                    result.setBlock(x, y, z, Block.limestone.id);
+                                    result.setBlock(x, y, z, Blocks.LIMESTONE.id);
                                     continue;
                                 }
                             }
@@ -243,12 +257,12 @@ public class SurfaceGeneratorOverworld
                     // if reached end of filler layer, fill world with sandstone/permafrost if inside a glacier or desert biome
                     if(currentLayerDepth == 0)
                     {
-                        if(biome == Biomes.OVERWORLD_DESERT && fillerBlock == Block.sand.id) {
+                        if(biome == Biomes.OVERWORLD_DESERT && fillerBlock == Blocks.SAND.id) {
                             currentLayerDepth = rand.nextInt(8) + 2;
-                            fillerBlock = (short)Block.sandstone.id;
-                        } else if(biome == Biomes.OVERWORLD_GLACIER && fillerBlock == Block.blockSnow.id){
+                            fillerBlock = (short)Blocks.SANDSTONE.id;
+                        } else if(biome == Biomes.OVERWORLD_GLACIER && fillerBlock == Blocks.BLOCK_SNOW.id){
                             currentLayerDepth = rand.nextInt(8) + 14;
-                            fillerBlock = (short)Block.permafrost.id;
+                            fillerBlock = (short)Blocks.PERMAFROST.id;
                         }
                     }
                 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/TerrainGeneratorOverworld.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/TerrainGeneratorOverworld.java
index 997c3d682..f4985fb38 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/TerrainGeneratorOverworld.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/TerrainGeneratorOverworld.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.chunk.perlin.overworld;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.chunk.perlin.DensityGenerator;
 import net.minecraft.core.world.generate.chunk.perlin.TerrainGeneratorLerp;
@@ -30,15 +31,15 @@ public class TerrainGeneratorOverworld
 
         if (y <= type.getMinY() + rand.nextInt(5))
         {
-            return Block.bedrock.id;
+            return Blocks.BEDROCK.id;
         }
         else if (density > 0.0)
         {
-            return type.getFillerBlock();
+            return type.getFillerBlockId();
         }
         else if (y >= type.getMinY() && y < type.getMinY() + type.getOceanY())
         {
-            return type.getOceanBlock();
+            return type.getOceanBlockId();
         }
 
         return 0;
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/hell/ChunkDecoratorOverworldHell.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/hell/ChunkDecoratorOverworldHell.java
index 8ebbdc646..ecfc7652b 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/hell/ChunkDecoratorOverworldHell.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/hell/ChunkDecoratorOverworldHell.java
@@ -1,7 +1,14 @@
 package net.minecraft.core.world.generate.chunk.perlin.overworld.hell;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSand;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.CoalOreBlock;
+import net.minecraft.core.block.DiamondOreBlock;
+import net.minecraft.core.block.GoldOreBlock;
+import net.minecraft.core.block.IronOreBlock;
+import net.minecraft.core.block.LapisOreBlock;
+import net.minecraft.core.block.RedstoneOreBlock;
+import net.minecraft.core.block.SandBlock;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.chunk.Chunk;
@@ -38,7 +45,7 @@ public class ChunkDecoratorOverworldHell
 
         float oreHeightModifier = rangeY / 128f;
 
-        BlockSand.fallInstantly = true;
+        SandBlock.fallInstantly = true;
         int x = chunkX * 16;
         int z = chunkZ * 16;
         int y = world.getHeightValue(x + 16, z + 16);
@@ -53,7 +60,7 @@ public class ChunkDecoratorOverworldHell
             int i1 = x + rand.nextInt(16) + 8;
             int l4 = minY + rand.nextInt(rangeY);
             int i8 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLake(Block.fluidLavaStill.id)).generate(world, rand, i1, l4, i8);
+            (new WorldFeatureLake(Blocks.FLUID_LAVA_STILL.id)).place(world, rand, i1, l4, i8);
         }
         if(rand.nextInt(16) == 0)
         {
@@ -65,11 +72,11 @@ public class ChunkDecoratorOverworldHell
             {
                 if(rand.nextInt(4) == 0)
                 {
-                    (new WorldFeatureLake(Block.obsidian.id)).generate(world, rand, j1, i5, j8);
+                    (new WorldFeatureLake(Blocks.OBSIDIAN.id)).place(world, rand, j1, i5, j8);
                 }
                 else
                 {
-                    (new WorldFeatureLake(Block.fluidLavaStill.id)).generate(world, rand, j1, i5, j8);
+                    (new WorldFeatureLake(Blocks.FLUID_LAVA_STILL.id)).place(world, rand, j1, i5, j8);
                 }
             }
         }
@@ -80,7 +87,7 @@ public class ChunkDecoratorOverworldHell
             int k23 = minY + rand.nextInt(rangeY / 2);
             int l24 = z + rand.nextInt(16) + 8;
             if(k23 < minY + rangeY / 2) {
-                (new WorldFeatureLiquid(Block.fluidWaterFlowing.id)).generate(world, rand, l21, k23, l24);
+                (new WorldFeatureLiquid(Blocks.FLUID_WATER_FLOWING.id)).place(world, rand, l21, k23, l24);
             }
         }
         for(int k1 = 0; k1 < 8; k1++)
@@ -90,11 +97,11 @@ public class ChunkDecoratorOverworldHell
             int j11 = z + rand.nextInt(16) + 8;
             if (rand.nextInt(2) == 0)
             {
-                (new WorldFeatureDungeon(Block.brickClay.id, Block.brickClay.id, null)).generate(world, rand, j5, k8, j11);
+                (new WorldFeatureDungeon(Blocks.BRICK_CLAY.id, Blocks.BRICK_CLAY.id, null)).place(world, rand, j5, k8, j11);
             }
             else
             {
-                (new WorldFeatureDungeon(Block.cobbleStone.id, Block.cobbleStoneMossy.id, null)).generate(world, rand, j5, k8, j11);
+                (new WorldFeatureDungeon(Blocks.COBBLE_STONE.id, Blocks.COBBLE_STONE_MOSSY.id, null)).place(world, rand, j5, k8, j11);
             }
         }
 
@@ -109,7 +116,7 @@ public class ChunkDecoratorOverworldHell
                 k8 -= rand.nextInt(10)+30;
 
             if(rand.nextInt(512) == 0) {
-                (new WorldFeatureLabyrinth()).generate(world, rand, j5, k8, j11);
+                (new WorldFeatureLabyrinth()).place(world, rand, j5, k8, j11);
             }
         }
 
@@ -118,7 +125,7 @@ public class ChunkDecoratorOverworldHell
             int k5 = x + rand.nextInt(16);
             int l8 = minY + rand.nextInt(rangeY);
             int k11 = z + rand.nextInt(16);
-            (new WorldFeatureClay(32)).generate(world, rand, k5, l8, k11);
+            (new WorldFeatureClay(32)).place(world, rand, k5, l8, k11);
         }
 
         for(int j2 = 0; j2 < 20; j2++)
@@ -126,7 +133,7 @@ public class ChunkDecoratorOverworldHell
             int l5 = x + rand.nextInt(16);
             int i9 = minY + rand.nextInt(rangeY);
             int l11 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.dirt.id, 32, false)).generate(world, rand, l5, i9, l11);
+            (new WorldFeatureOre(Blocks.DIRT.id, 32)).place(world, rand, l5, i9, l11);
         }
 
         for(int k2 = 0; k2 < 10; k2++)
@@ -134,7 +141,7 @@ public class ChunkDecoratorOverworldHell
             int i6 = x + rand.nextInt(16);
             int j9 = minY + rand.nextInt(rangeY);
             int i12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.gravel.id, 32, false)).generate(world, rand, i6, j9, i12);
+            (new WorldFeatureOre(Blocks.GRAVEL.id, 32)).place(world, rand, i6, j9, i12);
         }
 
         for(int i3 = 0; i3 < 20; i3++)
@@ -142,7 +149,7 @@ public class ChunkDecoratorOverworldHell
             int j6 = x + rand.nextInt(16);
             int k9 = minY + rand.nextInt(rangeY);
             int j12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreCoalStone.id, 16, true)).generate(world, rand, j6, k9, j12);
+            (new WorldFeatureOre(CoalOreBlock.variantMap, 16)).place(world, rand, j6, k9, j12);
         }
 
         for(int j3 = 0; j3 < 20; j3++)
@@ -150,7 +157,7 @@ public class ChunkDecoratorOverworldHell
             int k6 = x + rand.nextInt(16);
             int l9 = minY + rand.nextInt(rangeY / 2);
             int k12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreIronStone.id, 8, true)).generate(world, rand, k6, l9, k12);
+            (new WorldFeatureOre(IronOreBlock.variantMap, 8)).place(world, rand, k6, l9, k12);
         }
 
         for(int k3 = 0; k3 < 2; k3++)
@@ -158,7 +165,7 @@ public class ChunkDecoratorOverworldHell
             int l6 = x + rand.nextInt(16);
             int i10 = minY + rand.nextInt(rangeY / 4);
             int l12 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreGoldStone.id, 8, true)).generate(world, rand, l6, i10, l12);
+            (new WorldFeatureOre(GoldOreBlock.variantMap, 8)).place(world, rand, l6, i10, l12);
         }
 
         for(int l3 = 0; l3 < 8; l3++)
@@ -166,7 +173,7 @@ public class ChunkDecoratorOverworldHell
             int i7 = x + rand.nextInt(16);
             int j10 = minY + rand.nextInt(rangeY / 8);
             int i13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreRedstoneStone.id, 7, true)).generate(world, rand, i7, j10, i13);
+            (new WorldFeatureOre(RedstoneOreBlock.variantMap, 7)).place(world, rand, i7, j10, i13);
         }
 
         for(int i4 = 0; i4 < 1; i4++)
@@ -174,7 +181,7 @@ public class ChunkDecoratorOverworldHell
             int j7 = x + rand.nextInt(16);
             int k10 = minY + rand.nextInt(rangeY / 8);
             int j13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreDiamondStone.id, 7, true)).generate(world, rand, j7, k10, j13);
+            (new WorldFeatureOre(DiamondOreBlock.variantMap, 7)).place(world, rand, j7, k10, j13);
         }
 
         for(int j4 = 0; j4 < 1; j4++)
@@ -182,7 +189,7 @@ public class ChunkDecoratorOverworldHell
             int k7 = x + rand.nextInt(16);
             int l10 = minY + rand.nextInt(rangeY / 8) + rand.nextInt(rangeY / 8);
             int k13 = z + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreLapisStone.id, 6, true)).generate(world, rand, k7, l10, k13);
+            (new WorldFeatureOre(LapisOreBlock.variantMap, 6)).place(world, rand, k7, l10, k13);
         }
 
         d = 0.5D;
@@ -201,13 +208,13 @@ public class ChunkDecoratorOverworldHell
             WorldFeature wf;
             if(rand.nextInt(10) == 0)
             {
-                wf = new WorldFeatureTreeFancy(hasLeaves ? Block.leavesOak.id : 0, Block.logOak.id);
+                wf = new WorldFeatureTreeFancy(hasLeaves ? Blocks.LEAVES_OAK.id : 0, Blocks.LOG_OAK.id);
             } else
             {
-                wf = new WorldFeatureTree(hasLeaves ? Block.leavesOak.id : 0, Block.logOak.id, 4);
+                wf = new WorldFeatureTree(hasLeaves ? Blocks.LEAVES_OAK.id : 0, Blocks.LOG_OAK.id, 4);
             }
-            wf.func_517_a(1.0D, 1.0D, 1.0D);
-            wf.generate(world, rand, l13, world.getHeightValue(l13, j14), j14);
+            wf.init(1.0D, 1.0D, 1.0D);
+            wf.place(world, rand, l13, world.getHeightValue(l13, j14), j14);
         }
 
         byte byte1 = 10;
@@ -216,7 +223,7 @@ public class ChunkDecoratorOverworldHell
             int i17 = x + rand.nextInt(16) + 8;
             int i20 = minY + rand.nextInt(rangeY);
             int l22 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureDeadBush(Block.deadbush.id)).generate(world, rand, i17, i20, l22);
+            (new WorldFeatureDeadBush(Blocks.DEADBUSH.id)).place(world, rand, i17, i20, l22);
         }
 
         for(int l18 = 0; l18 < 5; l18++)
@@ -224,7 +231,7 @@ public class ChunkDecoratorOverworldHell
             int l21 = x + rand.nextInt(16) + 8;
             int k23 = minY + rand.nextInt(rand.nextInt(rangeY - 8) + 8);
             int l24 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidLavaFlowing.id)).generate(world, rand, l21, k23, l24);
+            (new WorldFeatureLiquid(Blocks.FLUID_LAVA_FLOWING.id)).place(world, rand, l21, k23, l24);
         }
 
         for(int i19 = 0; i19 < 20; i19++)
@@ -232,15 +239,15 @@ public class ChunkDecoratorOverworldHell
             int i22 = x + rand.nextInt(16) + 8;
             int l23 = minY + rand.nextInt(rand.nextInt(rand.nextInt(rangeY - rangeY / 8) + 8) + 8);
             int i25 = z + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidLavaFlowing.id)).generate(world, rand, i22, l23, i25);
+            (new WorldFeatureLiquid(Blocks.FLUID_LAVA_FLOWING.id)).place(world, rand, i22, l23, i25);
         }
 
-        if (world.getBlockId(x, minY + world.getWorldType().getOceanY() - 1, z) == world.getWorldType().getOceanBlock())
+        if (world.getBlockId(x, minY + world.getWorldType().getOceanY() - 1, z) == world.getWorldType().getOceanBlockId())
         {
-            world.setBlockWithNotify(x, minY + world.getWorldType().getOceanY() - 1, z, world.getWorldType().getOceanBlock());
+            world.setBlockWithNotify(x, minY + world.getWorldType().getOceanY() - 1, z, world.getWorldType().getOceanBlockId());
         }
 
-        BlockSand.fallInstantly = false;
+        SandBlock.fallInstantly = false;
 
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/retro/ChunkDecoratorOverworldRetro.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/retro/ChunkDecoratorOverworldRetro.java
index 60cdbf577..9c0f4cc33 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/retro/ChunkDecoratorOverworldRetro.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/retro/ChunkDecoratorOverworldRetro.java
@@ -1,7 +1,12 @@
 package net.minecraft.core.world.generate.chunk.perlin.overworld.retro;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockSand;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.CoalOreBlock;
+import net.minecraft.core.block.DiamondOreBlock;
+import net.minecraft.core.block.GoldOreBlock;
+import net.minecraft.core.block.IronOreBlock;
+import net.minecraft.core.block.RedstoneOreBlock;
+import net.minecraft.core.block.SandBlock;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.Chunk;
@@ -41,7 +46,7 @@ public class ChunkDecoratorOverworldRetro
         int maxY = world.getWorldType().getMaxY();
         int rangeY = (maxY + 1) - minY;
 
-        BlockSand.fallInstantly = true;
+        SandBlock.fallInstantly = true;
         int k = chunkX * 16;
         int l = chunkZ * 16;
         Random rand = new Random(world.getRandomSeed());
@@ -54,7 +59,7 @@ public class ChunkDecoratorOverworldRetro
             int i4 = k + rand.nextInt(16) + 8;
             int j6 = minY + rand.nextInt(rangeY);
             int i11 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureDungeon(Block.cobbleStone.id, Block.cobbleStoneMossy.id, null)).generate(world, rand, i4, j6, i11);
+            (new WorldFeatureDungeon(Blocks.COBBLE_STONE.id, Blocks.COBBLE_STONE_MOSSY.id, null)).place(world, rand, i4, j6, i11);
         }
 
         for (int j1 = 0; j1 < 10; j1++)
@@ -62,7 +67,7 @@ public class ChunkDecoratorOverworldRetro
             int j4 = k + rand.nextInt(16);
             int k6 = minY + rand.nextInt(rangeY);
             int j11 = l + rand.nextInt(16);
-            (new WorldFeatureClay(32)).generate(world, rand, j4, k6, j11);
+            (new WorldFeatureClay(32)).place(world, rand, j4, k6, j11);
         }
 
         for (int k1 = 0; k1 < 20; k1++)
@@ -70,7 +75,7 @@ public class ChunkDecoratorOverworldRetro
             int k4 = k + rand.nextInt(16);
             int l6 = minY + rand.nextInt(rangeY);
             int k11 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.dirt.id, 32, false)).generate(world, rand, k4, l6, k11);
+            (new WorldFeatureOre(Blocks.DIRT.id, 32)).place(world, rand, k4, l6, k11);
         }
 
         for (int i2 = 0; i2 < 10; i2++)
@@ -78,7 +83,7 @@ public class ChunkDecoratorOverworldRetro
             int l4 = k + rand.nextInt(16);
             int i7 = minY + rand.nextInt(rangeY);
             int l11 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.gravel.id, 32, false)).generate(world, rand, l4, i7, l11);
+            (new WorldFeatureOre(Blocks.GRAVEL.id, 32)).place(world, rand, l4, i7, l11);
         }
 
         for (int j2 = 0; j2 < 20; j2++)
@@ -86,7 +91,7 @@ public class ChunkDecoratorOverworldRetro
             int i5 = k + rand.nextInt(16);
             int j7 = minY + rand.nextInt(rangeY);
             int i12 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreCoalStone.id, 16, true)).generate(world, rand, i5, j7, i12);
+            (new WorldFeatureOre(CoalOreBlock.variantMap, 16)).place(world, rand, i5, j7, i12);
         }
 
         for (int k2 = 0; k2 < 20; k2++)
@@ -94,7 +99,7 @@ public class ChunkDecoratorOverworldRetro
             int j5 = k + rand.nextInt(16);
             int k7 = minY + rand.nextInt(rangeY / 2);
             int j12 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreIronStone.id, 8, true)).generate(world, rand, j5, k7, j12);
+            (new WorldFeatureOre(IronOreBlock.variantMap, 8)).place(world, rand, j5, k7, j12);
         }
 
         for (int i3 = 0; i3 < 2; i3++)
@@ -102,7 +107,7 @@ public class ChunkDecoratorOverworldRetro
             int k5 = k + rand.nextInt(16);
             int l7 = minY + rand.nextInt(rangeY / 4);
             int k12 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreGoldStone.id, 8, true)).generate(world, rand, k5, l7, k12);
+            (new WorldFeatureOre(GoldOreBlock.variantMap, 8)).place(world, rand, k5, l7, k12);
         }
 
         for (int j3 = 0; j3 < 8; j3++)
@@ -110,7 +115,7 @@ public class ChunkDecoratorOverworldRetro
             int l5 = k + rand.nextInt(16);
             int i8 = minY + rand.nextInt(rangeY / 8);
             int l12 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreRedstoneStone.id, 7, true)).generate(world, rand, l5, i8, l12);
+            (new WorldFeatureOre(RedstoneOreBlock.variantMap, 7)).place(world, rand, l5, i8, l12);
         }
 
         for (int k3 = 0; k3 < 1; k3++)
@@ -118,7 +123,7 @@ public class ChunkDecoratorOverworldRetro
             int i6 = k + rand.nextInt(16);
             int j8 = minY + rand.nextInt(rangeY / 8);
             int i13 = l + rand.nextInt(16);
-            (new WorldFeatureOre(Block.oreDiamondStone.id, 7, true)).generate(world, rand, i6, j8, i13);
+            (new WorldFeatureOre(DiamondOreBlock.variantMap, 7)).place(world, rand, i6, j8, i13);
         }
 
         d = 0.5D;
@@ -131,17 +136,17 @@ public class ChunkDecoratorOverworldRetro
         {
             l3++;
         }
-        Object obj = new WorldFeatureTree(Block.leavesOakRetro.id, Block.logOak.id, 4);
+        Object obj = new WorldFeatureTree(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id, 4);
         if (rand.nextInt(10) == 0)
         {
-            obj = new WorldFeatureTreeFancy(Block.leavesOakRetro.id, Block.logOak.id);
+            obj = new WorldFeatureTreeFancy(Blocks.LEAVES_OAK_RETRO.id, Blocks.LOG_OAK.id);
         }
         for (int k8 = 0; k8 < l3; k8++)
         {
             int j13 = k + rand.nextInt(16) + 8;
             int l15 = l + rand.nextInt(16) + 8;
-            ((WorldFeature)(obj)).func_517_a(1.0D, 1.0D, 1.0D);
-            ((WorldFeature)(obj)).generate(world, rand, j13, world.getHeightValue(j13, l15), l15);
+            ((WorldFeature)(obj)).init(1.0D, 1.0D, 1.0D);
+            ((WorldFeature)(obj)).place(world, rand, j13, world.getHeightValue(j13, l15), l15);
         }
 
         for (int l8 = 0; l8 < 2; l8++)
@@ -149,7 +154,7 @@ public class ChunkDecoratorOverworldRetro
             int k13 = k + rand.nextInt(16) + 8;
             int i16 = minY + rand.nextInt(rangeY);
             int j18 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerYellow.id)).generate(world, rand, k13, i16, j18);
+            (new WorldFeatureFlowers(Blocks.FLOWER_YELLOW.id)).place(world, rand, k13, i16, j18);
         }
 
         if (rand.nextInt(2) == 0)
@@ -157,28 +162,28 @@ public class ChunkDecoratorOverworldRetro
             int i9 = k + rand.nextInt(16) + 8;
             int l13 = minY + rand.nextInt(rangeY);
             int j16 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.flowerRed.id)).generate(world, rand, i9, l13, j16);
+            (new WorldFeatureFlowers(Blocks.FLOWER_RED.id)).place(world, rand, i9, l13, j16);
         }
         if (rand.nextInt(4) == 0)
         {
             int j9 = k + rand.nextInt(16) + 8;
             int i14 = minY + rand.nextInt(rangeY);
             int k16 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.mushroomBrown.id)).generate(world, rand, j9, i14, k16);
+            (new WorldFeatureFlowers(Blocks.MUSHROOM_BROWN.id)).place(world, rand, j9, i14, k16);
         }
         if (rand.nextInt(8) == 0)
         {
             int k9 = k + rand.nextInt(16) + 8;
             int j14 = minY + rand.nextInt(rangeY);
             int l16 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureFlowers(Block.mushroomRed.id)).generate(world, rand, k9, j14, l16);
+            (new WorldFeatureFlowers(Blocks.MUSHROOM_RED.id)).place(world, rand, k9, j14, l16);
         }
         for (int l9 = 0; l9 < 10; l9++)
         {
             int k14 = k + rand.nextInt(16) + 8;
             int i17 = minY + rand.nextInt(rangeY);
             int k18 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureSugarCane()).generate(world, rand, k14, i17, k18);
+            (new WorldFeatureSugarCane()).place(world, rand, k14, i17, k18);
         }
 
         for (int i10 = 0; i10 < 1; i10++)
@@ -186,7 +191,7 @@ public class ChunkDecoratorOverworldRetro
             int l14 = k + rand.nextInt(16) + 8;
             int j17 = minY + rand.nextInt(rangeY);
             int l18 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureCactus()).generate(world, rand, l14, j17, l18);
+            (new WorldFeatureCactus()).place(world, rand, l14, j17, l18);
         }
 
         for (int j10 = 0; j10 < 50; j10++)
@@ -194,7 +199,7 @@ public class ChunkDecoratorOverworldRetro
             int i15 = k + rand.nextInt(16) + 8;
             int k17 = minY + rand.nextInt(rand.nextInt(rangeY - 8) + 8);
             int i19 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidWaterFlowing.id)).generate(world, rand, i15, k17, i19);
+            (new WorldFeatureLiquid(Blocks.FLUID_WATER_FLOWING.id)).place(world, rand, i15, k17, i19);
         }
 
         for (int k10 = 0; k10 < 20; k10++)
@@ -202,7 +207,7 @@ public class ChunkDecoratorOverworldRetro
             int j15 = k + rand.nextInt(16) + 8;
             int l17 = minY + rand.nextInt(rand.nextInt(rand.nextInt(rangeY / 2 - rangeY / 8) + 8) + 8);
             int j19 = l + rand.nextInt(16) + 8;
-            (new WorldFeatureLiquid(Block.fluidLavaFlowing.id)).generate(world, rand, j15, l17, j19);
+            (new WorldFeatureLiquid(Blocks.FLUID_LAVA_FLOWING.id)).place(world, rand, j15, l17, j19);
         }
 
         for (int l10 = k + 8 + 0; l10 < k + 8 + 16; l10++)
@@ -212,17 +217,17 @@ public class ChunkDecoratorOverworldRetro
                 int i18 = world.findTopSolidBlock(l10, k15);
                 if (snowCovered && i18 > minY && i18 <= maxY && world.getBlockId(l10, i18, k15) == 0 && world.getBlockMaterial(l10, i18 - 1, k15).blocksMotion() && world.getBlockMaterial(l10, i18 - 1, k15) != Material.ice)
                 {
-                    world.setBlockWithNotify(l10, i18, k15, Block.layerSnow.id);
+                    world.setBlockWithNotify(l10, i18, k15, Blocks.LAYER_SNOW.id);
                 }
                 if (snowCovered && world.getBlockMaterial(l10, world.getWorldType().getOceanY() - 1, k15) == Material.water)
                 {
-                    world.setBlockWithNotify(l10, world.getWorldType().getOceanY() - 1, k15, Block.ice.id);
+                    world.setBlockWithNotify(l10, world.getWorldType().getOceanY() - 1, k15, Blocks.ICE.id);
                 }
             }
 
         }
 
-        BlockSand.fallInstantly = false;
+        SandBlock.fallInstantly = false;
         world.scheduledUpdatesAreImmediate = false;
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/paradise/TerrainGeneratorParadise.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/paradise/TerrainGeneratorParadise.java
index c85406a47..bbc3f5834 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/paradise/TerrainGeneratorParadise.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/paradise/TerrainGeneratorParadise.java
@@ -30,7 +30,7 @@ public class TerrainGeneratorParadise
 
         if (density > 0.0)
         {
-            return type.getFillerBlock();
+            return type.getFillerBlockId();
         }
 
         return 0;
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblock.java b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblock.java
new file mode 100644
index 000000000..b78b7a0ef
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblock.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.world.generate.chunk.skyblock;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.ChestBlockEntity;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.world.chunk.Chunk;
+import net.minecraft.core.world.generate.chunk.ChunkDecorator;
+import net.minecraft.core.world.generate.feature.tree.WorldFeatureTree;
+
+import java.util.Random;
+
+public class ChunkDecoratorSkyblock
+    implements ChunkDecorator {
+    @Override
+    public void decorate(Chunk chunk) {
+        // Starting island
+        if (contains(chunk, -1, 1)) {
+            new WorldFeatureTree(Blocks.LEAVES_OAK.id, Blocks.LOG_OAK.id, 6).place(chunk.world, new Random(0), -1, 67, 1);
+        }
+        if (contains(chunk, 4, -3)) {
+            chunk.setBlockIDWithMetadata(4 & (Chunk.CHUNK_SIZE_X - 1), 67, -3 & (Chunk.CHUNK_SIZE_Z - 1), Blocks.CHEST_PLANKS_OAK.id, 3);
+            BlockEntity blockEntity = chunk.getBlockEntity(4 & (Chunk.CHUNK_SIZE_X - 1), 67, -3 & (Chunk.CHUNK_SIZE_Z - 1));
+            if (blockEntity instanceof ChestBlockEntity) {
+                ChestBlockEntity chestEntity = (ChestBlockEntity) blockEntity;
+                chestEntity.setItem(0, new ItemStack(Items.BUCKET_LAVA, 1));
+                chestEntity.setItem(1, new ItemStack(Blocks.ICE, 1));
+            }
+        }
+
+        // Desert island
+        if (contains(chunk, -67, 0)) {
+            chunk.setBlockIDWithMetadata(-67 & (Chunk.CHUNK_SIZE_X - 1), 67, 0 & (Chunk.CHUNK_SIZE_Z - 1), Blocks.CHEST_PLANKS_OAK.id, 1);
+            BlockEntity blockEntity = chunk.getBlockEntity(-67 & (Chunk.CHUNK_SIZE_X - 1), 67, 0 & (Chunk.CHUNK_SIZE_Z - 1));
+            if (blockEntity instanceof ChestBlockEntity) {
+                ChestBlockEntity chestEntity = (ChestBlockEntity) blockEntity;
+                chestEntity.setItem(0, new ItemStack(Blocks.OBSIDIAN, 14));
+                chestEntity.setItem(1, new ItemStack(Items.SEEDS_PUMPKIN, 1));
+            }
+
+        }
+    }
+
+    private boolean contains(Chunk chunk, int xBlock, int zBlock) {
+        return chunk.xPosition == xBlock >> 4 && chunk.zPosition == zBlock >> 4;
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblockNether.java b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblockNether.java
new file mode 100644
index 000000000..8fac9549e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkDecoratorSkyblockNether.java
@@ -0,0 +1,51 @@
+package net.minecraft.core.world.generate.chunk.skyblock;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.ChestBlockEntity;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.Items;
+import net.minecraft.core.world.chunk.Chunk;
+import net.minecraft.core.world.generate.chunk.ChunkDecorator;
+import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
+
+public class ChunkDecoratorSkyblockNether
+    implements ChunkDecorator {
+    @Override
+    public void decorate(Chunk chunk) {
+        // Portal
+        for (int z = 0; z <= 1; z++) {
+            if (contains(chunk, 2, z)) {
+                chunk.setBlockMetadata(2 & (Chunk.CHUNK_SIZE_X - 1), 66, z & (Chunk.CHUNK_SIZE_Z - 1), 1);
+                chunk.setBlockMetadata(2 & (Chunk.CHUNK_SIZE_X - 1), 67, z & (Chunk.CHUNK_SIZE_Z - 1), 1);
+                chunk.setBlockMetadata(2 & (Chunk.CHUNK_SIZE_X - 1), 68, z & (Chunk.CHUNK_SIZE_Z - 1), 1);
+            }
+        }
+
+        // Chest
+        if (contains(chunk, 1, -1)) {
+            chunk.setBlockIDWithMetadata(1 & (Chunk.CHUNK_SIZE_X - 1), 66, -1 & (Chunk.CHUNK_SIZE_Z - 1), Blocks.CHEST_PLANKS_OAK.id, 3);
+            BlockEntity blockEntity = chunk.getBlockEntity(1 & (Chunk.CHUNK_SIZE_X - 1), 66, -1 & (Chunk.CHUNK_SIZE_Z - 1));
+            if (blockEntity != null) {
+                ChestBlockEntity chestBlockEntity = (ChestBlockEntity) blockEntity;
+                chestBlockEntity.setItem(0, new ItemStack(Blocks.SAPLING_BIRCH, 1));
+                chestBlockEntity.setItem(1, new ItemStack(Items.SUGARCANE, 1));
+                chestBlockEntity.setItem(2, new ItemStack(Blocks.ICE, 1));
+            }
+        }
+
+        // Mushrooms
+        tryPlace(chunk, 1, 66, 0, Blocks.MUSHROOM_BROWN.id);
+        tryPlace(chunk, -1, 66, 1, Blocks.MUSHROOM_RED.id);
+    }
+
+    private boolean contains(Chunk chunk, int xBlock, int zBlock) {
+        return chunk.xPosition == xBlock >> 4 && chunk.zPosition == zBlock >> 4;
+    }
+
+    private void tryPlace(Chunk chunk, int xBlock, int yBlock, int zBlock, int blockId) {
+        if (contains(chunk, xBlock, zBlock)) {
+            chunk.setBlockID(xBlock & (Chunk.CHUNK_SIZE_X - 1), yBlock, zBlock & (Chunk.CHUNK_SIZE_Z - 1), blockId);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblock.java b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblock.java
new file mode 100644
index 000000000..b5566f80a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblock.java
@@ -0,0 +1,66 @@
+package net.minecraft.core.world.generate.chunk.skyblock;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.chunk.Chunk;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
+
+public class ChunkGeneratorSkyblock
+    extends ChunkGenerator {
+
+    public ChunkGeneratorSkyblock(World world) {
+        super(world, new ChunkDecoratorSkyblock());
+    }
+
+    @Override
+    protected ChunkGeneratorResult doBlockGeneration(Chunk chunk) {
+        ChunkGeneratorResult result = new ChunkGeneratorResult();
+
+        // Starting island
+        for (int x = -1; x <= 1; x++) {
+            for (int z = -1; z <= 1; z++) {
+                tryPlace(chunk, result, x, 64, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 65, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 66, z, Blocks.GRASS.id);
+            }
+        }
+        for (int x = -1; x <= 1; x++) {
+            for (int z = -4; z <= -2; z++) {
+                tryPlace(chunk, result, x, 64, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 65, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 66, z, Blocks.GRASS.id);
+            }
+        }
+        for (int x = 2; x <= 4; x++) {
+            for (int z = -4; z <= -2; z++) {
+                tryPlace(chunk, result, x, 64, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 65, z, Blocks.DIRT.id);
+                tryPlace(chunk, result, x, 66, z, Blocks.GRASS.id);
+            }
+        }
+        tryPlace(chunk, result, 0, 64, -3, Blocks.BEDROCK.id);
+
+        // Desert island
+        for (int x = -68; x <= -66; x++) {
+            for (int z = -1; z <= 1; z++) {
+                tryPlace(chunk, result, x, 64, z, Blocks.SAND.id);
+                tryPlace(chunk, result, x, 65, z, Blocks.SAND.id);
+                tryPlace(chunk, result, x, 66, z, Blocks.SAND.id);
+            }
+        }
+        tryPlace(chunk, result, -68, 67, 1, Blocks.CACTUS.id);
+
+        return result;
+    }
+
+    private boolean contains(Chunk chunk, int xBlock, int zBlock) {
+        return chunk.xPosition == xBlock >> 4 && chunk.zPosition == zBlock >> 4;
+    }
+
+    private void tryPlace(Chunk chunk, ChunkGeneratorResult result, int xBlock, int yBlock, int zBlock, int blockId) {
+        if (contains(chunk, xBlock, zBlock)) {
+            result.setBlock(xBlock & (Chunk.CHUNK_SIZE_X - 1), yBlock, zBlock & (Chunk.CHUNK_SIZE_Z - 1), blockId);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblockNether.java b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblockNether.java
new file mode 100644
index 000000000..ae6bc8bc7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/skyblock/ChunkGeneratorSkyblockNether.java
@@ -0,0 +1,58 @@
+package net.minecraft.core.world.generate.chunk.skyblock;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.chunk.Chunk;
+import net.minecraft.core.world.generate.chunk.ChunkDecorator;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
+
+public class ChunkGeneratorSkyblockNether
+    extends ChunkGenerator {
+
+    public ChunkGeneratorSkyblockNether(World world) {
+        super(world, new ChunkDecoratorSkyblockNether());
+    }
+
+    @Override
+    protected ChunkGeneratorResult doBlockGeneration(Chunk chunk) {
+        ChunkGeneratorResult result = new ChunkGeneratorResult();
+
+        // Main island
+        for (int x = -1; x <= 1; x++) {
+            for (int z = -1; z <= 1; z++) {
+                tryPlace(chunk, result, x, 63, z, Blocks.GLOWSTONE.id);
+                tryPlace(chunk, result, x, 64, z, Blocks.GLOWSTONE.id);
+                tryPlace(chunk, result, x, 65, z, Blocks.GLOWSTONE.id);
+            }
+        }
+        // Portal
+        for (int z = -1; z <= 2; z++) {
+            if (z == -1 || z == 2) {
+                tryPlace(chunk, result, 2, 65, z, Blocks.OBSIDIAN.id);
+                tryPlace(chunk, result, 2, 66, z, Blocks.OBSIDIAN.id);
+                tryPlace(chunk, result, 2, 67, z, Blocks.OBSIDIAN.id);
+                tryPlace(chunk, result, 2, 68, z, Blocks.OBSIDIAN.id);
+                tryPlace(chunk, result, 2, 69, z, Blocks.OBSIDIAN.id);
+            } else {
+                tryPlace(chunk, result, 2, 65, z, Blocks.OBSIDIAN.id);
+                tryPlace(chunk, result, 2, 66, z, Blocks.PORTAL_NETHER.id);
+                tryPlace(chunk, result, 2, 67, z, Blocks.PORTAL_NETHER.id);
+                tryPlace(chunk, result, 2, 68, z, Blocks.PORTAL_NETHER.id);
+                tryPlace(chunk, result, 2, 69, z, Blocks.OBSIDIAN.id);
+            }
+        }
+
+        return result;
+    }
+
+    private boolean contains(Chunk chunk, int xBlock, int zBlock) {
+        return chunk.xPosition == xBlock >> 4 && chunk.zPosition == zBlock >> 4;
+    }
+
+    private void tryPlace(Chunk chunk, ChunkGeneratorResult result, int xBlock, int yBlock, int zBlock, int blockId) {
+        if (contains(chunk, xBlock, zBlock)) {
+            result.setBlock(xBlock & (Chunk.CHUNK_SIZE_X - 1), yBlock, zBlock & (Chunk.CHUNK_SIZE_Z - 1), blockId);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeature.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeature.java
index 7cb04ce7e..1428331ae 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeature.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeature.java
@@ -14,9 +14,9 @@ public abstract class WorldFeature
     {
     }
 
-    public abstract boolean generate(World world, Random random, int x, int y, int z);
+    public abstract boolean place(World world, Random random, int x, int y, int z);
 
-    public void func_517_a(double d, double d1, double d2)
+    public void init(double d, double d1, double d2)
     {
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureAlgae.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureAlgae.java
index 328b1418f..e84fc53c0 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureAlgae.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureAlgae.java
@@ -1,29 +1,30 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldGenerator, World, Block, BlockFlower
+//            WorldGenerator, World, Block, FlowerBlock
 
 public class WorldFeatureAlgae extends WorldFeature
 {
 
     @Override
-    public boolean generate(World world, Random random, int x, int y, int z)
+    public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 128; l++)
         {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
             int j1 = (y);
             int k1 = (z + random.nextInt(8)) - random.nextInt(8);
-            if((world.getBlockId(i1, j1, k1) == Block.fluidWaterStill.id) &&
+            if((world.getBlockId(i1, j1, k1) == Blocks.FLUID_WATER_STILL.id) &&
                     world.getBlockMaterial(i1, j1+1, k1) == Material.air)
             {
-                world.setBlock(i1, j1+1, k1, Block.algae.id);
+                world.setBlock(i1, j1+1, k1, Blocks.ALGAE.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureCactus.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureCactus.java
index f2799a33a..cdc4fc961 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureCactus.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureCactus.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -16,7 +17,7 @@ public class WorldFeatureCactus extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 10; l++)
         {
@@ -30,9 +31,9 @@ public class WorldFeatureCactus extends WorldFeature
             int l1 = 1 + random.nextInt(random.nextInt(3) + 1);
             for(int i2 = 0; i2 < l1; i2++)
             {
-                if(Block.cactus.canBlockStay(world, i1, j1 + i2, k1))
+                if(Blocks.CACTUS.canBlockStay(world, i1, j1 + i2, k1))
                 {
-                    world.setBlock(i1, j1 + i2, k1, Block.cactus.id);
+                    world.setBlock(i1, j1 + i2, k1, Blocks.CACTUS.id);
                 }
             }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureClay.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureClay.java
index 8e90a8c70..26f5a7f82 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureClay.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureClay.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -13,25 +14,25 @@ import java.util.Random;
 
 public class WorldFeatureClay extends WorldFeature
 {	public WorldFeatureClay(int numberOfBlocks) {
-		this(numberOfBlocks, Block.sand);
+		this(numberOfBlocks, Blocks.SAND);
 	}
 
     @MethodParametersAnnotation(names = {"numberOfBlocks", "block"})
     public WorldFeatureClay(int numberOfBlocks, Block block)
     {
-        clayBlockId = Block.blockClay.id;
+        clayBlockId = Blocks.BLOCK_CLAY.id;
         this.numberOfBlocks = numberOfBlocks;
         this.generateInId = block.id;
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         if(world.getBlockMaterial(x, y, z) != Material.water)
         {
             return false;
         }
-        float f = random.nextFloat() * 3.141593F;
+        float f = random.nextFloat() * MathHelper.PI;
         double d = (float)(x + 8) + (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double d1 = (float)(x + 8) - (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double d2 = (float)(z + 8) + (MathHelper.cos(f) * (float)numberOfBlocks) / 8F;
@@ -44,14 +45,14 @@ public class WorldFeatureClay extends WorldFeature
             double d7 = d4 + ((d5 - d4) * (double)l) / (double)numberOfBlocks;
             double d8 = d2 + ((d3 - d2) * (double)l) / (double)numberOfBlocks;
             double d9 = (random.nextDouble() * (double)numberOfBlocks) / 16D;
-            double d10 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            double d11 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            int i1 = MathHelper.floor_double(d6 - d10 / 2D);
-            int j1 = MathHelper.floor_double(d7 - d11 / 2D);
-            int k1 = MathHelper.floor_double(d8 - d10 / 2D);
-            int l1 = MathHelper.floor_double(d6 + d10 / 2D);
-            int i2 = MathHelper.floor_double(d7 + d11 / 2D);
-            int j2 = MathHelper.floor_double(d8 + d10 / 2D);
+            double d10 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            double d11 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            int i1 = MathHelper.floor(d6 - d10 / 2D);
+            int j1 = MathHelper.floor(d7 - d11 / 2D);
+            int k1 = MathHelper.floor(d8 - d10 / 2D);
+            int l1 = MathHelper.floor(d6 + d10 / 2D);
+            int i2 = MathHelper.floor(d7 + d11 / 2D);
+            int j2 = MathHelper.floor(d8 + d10 / 2D);
             for(int k2 = i1; k2 <= l1; k2++)
             {
                 double d12 = (((double)k2 + 0.5D) - d6) / (d10 / 2D);
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDeadBush.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDeadBush.java
index 0686b8a7a..a4f341063 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDeadBush.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDeadBush.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.world.generate.feature;
 
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves, 
-//            BlockFlower
+//            FlowerBlock
 
 public class WorldFeatureDeadBush extends WorldFeature
 {
@@ -20,9 +20,9 @@ public class WorldFeatureDeadBush extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        for(int l = 0; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BlockLeavesBase) && y > 0; y--) { }
+        for(int l = 0; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BaseLeavesBlock) && y > 0; y--) { }
         for(int i1 = 0; i1 < 4; i1++)
         {
             int j1 = (x + random.nextInt(8)) - random.nextInt(8);
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDungeon.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDungeon.java
index ce0c56b13..4a48328e6 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDungeon.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureDungeon.java
@@ -2,19 +2,20 @@ package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.entity.ChestBlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntityChest;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Material, Block, 
-//            TileEntityChest, TileEntityMobSpawner, ItemStack, Item
+//            ChestBlockEntity, MobSpawnerBlockEntity, ItemStack, Item
 
 public class WorldFeatureDungeon extends WorldFeature
 {
@@ -31,22 +32,22 @@ public class WorldFeatureDungeon extends WorldFeature
     	this.blockIdFloor = blockIdFloor;
     	this.mobOverride = mobOverride;
         this.chestLoot = new WeightedRandomBag<>();
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.saddle.getDefaultStack()), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.ingotIron.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.foodBread.getDefaultStack()), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.wheat.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.sulphur.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.string.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.bucket.getDefaultStack()), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.foodAppleGold.getDefaultStack()), 1);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.dustRedstone.getDefaultStack(), 1, 4), 50);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.SADDLE.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.INGOT_IRON.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.FOOD_BREAD.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.WHEAT.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.SULPHUR.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.STRING.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.BUCKET.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.FOOD_APPLE_GOLD.getDefaultStack()), 1);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.DUST_REDSTONE.getDefaultStack(), 1, 4), 50);
         for (int i = 0; i < 9; i++) {
-            chestLoot.addEntry(new WeightedRandomLootObject(new ItemStack(Item.itemsList[Item.record13.id + i]), 1), 1);
+            chestLoot.addEntry(new WeightedRandomLootObject(new ItemStack(Item.itemsList[Items.RECORD_13.id + i]), 1), 1);
         }
-        chestLoot.addEntry(new WeightedRandomLootObject(Block.saplingCacao.getDefaultStack()), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Block.spongeDry.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.bone.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.foodApple.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Blocks.SAPLING_CACAO.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Blocks.SPONGE_DRY.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.BONE.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.FOOD_APPLE.getDefaultStack()), 100);
         chestLoot.addEntry(new WeightedRandomLootObject(null),239);
 
         this.spawnerMonsters = new WeightedRandomBag<>();
@@ -56,7 +57,7 @@ public class WorldFeatureDungeon extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         byte height = 3;
         int width = random.nextInt(2) + 2;
@@ -156,8 +157,8 @@ public class WorldFeatureDungeon extends WorldFeature
                 {
                     continue;
                 }
-                world.setBlockWithNotify(k3, l3, i4, Block.chestPlanksOak.id);
-                TileEntityChest tileentitychest = (TileEntityChest)world.getBlockTileEntity(k3, l3, i4);
+                world.setBlockWithNotify(k3, l3, i4, Blocks.CHEST_PLANKS_OAK.id);
+                ChestBlockEntity tileentitychest = (ChestBlockEntity)world.getBlockEntity(k3, l3, i4);
                 int k4 = 0;
                 do
                 {
@@ -168,7 +169,7 @@ public class WorldFeatureDungeon extends WorldFeature
                     ItemStack itemstack = pickCheckLootItem(random);
                     if(itemstack != null)
                     {
-                        tileentitychest.setInventorySlotContents(random.nextInt(tileentitychest.getSizeInventory()), itemstack);
+                        tileentitychest.setItem(random.nextInt(tileentitychest.getContainerSize()), itemstack);
                     }
                     k4++;
                 } while(true);
@@ -176,8 +177,8 @@ public class WorldFeatureDungeon extends WorldFeature
 
         }
 
-        world.setBlockWithNotify(x, y, z, Block.mobspawner.id);
-        TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner)world.getBlockTileEntity(x, y, z);
+        world.setBlockWithNotify(x, y, z, Blocks.MOBSPAWNER.id);
+        MobSpawnerBlockEntity tileentitymobspawner = (MobSpawnerBlockEntity)world.getBlockEntity(x, y, z);
         tileentitymobspawner.setMobId(pickMobSpawner(random));
         return true;
     }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFire.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFire.java
index c30984ae6..20f4e14f8 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFire.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFire.java
@@ -1,12 +1,13 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldGenerator, World, Block, BlockFire
+//            WorldGenerator, World, Block, FireBlock
 
 public class WorldFeatureFire extends WorldFeature
 {
@@ -16,16 +17,16 @@ public class WorldFeatureFire extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 64; l++)
         {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
             int j1 = (y + random.nextInt(4)) - random.nextInt(4);
             int k1 = (z + random.nextInt(8)) - random.nextInt(8);
-            if(world.isAirBlock(i1, j1, k1) && world.getBlockId(i1, j1 - 1, k1) == Block.netherrack.id)
+            if(world.isAirBlock(i1, j1, k1) && world.getBlockId(i1, j1 - 1, k1) == Blocks.NETHERRACK.id)
             {
-                world.setBlockWithNotify(i1, j1, k1, Block.fire.id);
+                world.setBlockWithNotify(i1, j1, k1, Blocks.FIRE.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFlowers.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFlowers.java
index 98053cc51..e2081c41b 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFlowers.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureFlowers.java
@@ -1,12 +1,13 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldGenerator, World, Block, BlockFlower
+//            WorldGenerator, World, Block, FlowerBlock
 
 public class WorldFeatureFlowers extends WorldFeature
 {
@@ -18,7 +19,7 @@ public class WorldFeatureFlowers extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 64; l++)
         {
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneA.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneA.java
index b6ef57781..39760661e 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneA.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneA.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -16,17 +17,17 @@ public class WorldFeatureGlowstoneA extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         if(!world.isAirBlock(x, y, z))
         {
             return false;
         }
-        if(world.getBlockId(x, y + 1, z) != Block.netherrack.id)
+        if(world.getBlockId(x, y + 1, z) != Blocks.NETHERRACK.id)
         {
             return false;
         }
-        world.setBlockWithNotify(x, y, z, Block.glowstone.id);
+        world.setBlockWithNotify(x, y, z, Blocks.GLOWSTONE.id);
         for(int l = 0; l < 1500; l++)
         {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
@@ -64,7 +65,7 @@ public class WorldFeatureGlowstoneA extends WorldFeature
                 {
                     j2 = world.getBlockId(i1, j1, k1 + 1);
                 }
-                if(j2 == Block.glowstone.id)
+                if(j2 == Blocks.GLOWSTONE.id)
                 {
                     l1++;
                 }
@@ -72,7 +73,7 @@ public class WorldFeatureGlowstoneA extends WorldFeature
 
             if(l1 == 1)
             {
-                world.setBlockWithNotify(i1, j1, k1, Block.glowstone.id);
+                world.setBlockWithNotify(i1, j1, k1, Blocks.GLOWSTONE.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneB.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneB.java
index 6c7bea0b9..5b3f778be 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneB.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGlowstoneB.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -16,17 +17,17 @@ public class WorldFeatureGlowstoneB extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         if(!world.isAirBlock(x, y, z))
         {
             return false;
         }
-        if(world.getBlockId(x, y + 1, z) != Block.netherrack.id)
+        if(world.getBlockId(x, y + 1, z) != Blocks.NETHERRACK.id)
         {
             return false;
         }
-        world.setBlockWithNotify(x, y, z, Block.glowstone.id);
+        world.setBlockWithNotify(x, y, z, Blocks.GLOWSTONE.id);
         for(int l = 0; l < 1500; l++)
         {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
@@ -64,7 +65,7 @@ public class WorldFeatureGlowstoneB extends WorldFeature
                 {
                     j2 = world.getBlockId(i1, j1, k1 + 1);
                 }
-                if(j2 == Block.glowstone.id)
+                if(j2 == Blocks.GLOWSTONE.id)
                 {
                     l1++;
                 }
@@ -72,7 +73,7 @@ public class WorldFeatureGlowstoneB extends WorldFeature
 
             if(l1 == 1)
             {
-                world.setBlockWithNotify(i1, j1, k1, Block.glowstone.id);
+                world.setBlockWithNotify(i1, j1, k1, Blocks.GLOWSTONE.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGrassPatch.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGrassPatch.java
index 40d66b808..310080df3 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGrassPatch.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureGrassPatch.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.generate.feature;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 
@@ -19,9 +19,9 @@ public class WorldFeatureGrassPatch extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        float f = random.nextFloat() * 3.141593F;
+        float f = random.nextFloat() * MathHelper.PI;
         double d = (float)(x + 8) + (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double d1 = (float)(x + 8) - (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double d2 = (float)(z + 8) + (MathHelper.cos(f) * (float)numberOfBlocks) / 8F;
@@ -34,14 +34,14 @@ public class WorldFeatureGrassPatch extends WorldFeature
             double d7 = d4 + ((d5 - d4) * (double)l) / (double)numberOfBlocks;
             double d8 = d2 + ((d3 - d2) * (double)l) / (double)numberOfBlocks;
             double d9 = (random.nextDouble() * (double)numberOfBlocks) / 16D;
-            double d10 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            double d11 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            int i1 = MathHelper.floor_double(d6 - d10 / 2D);
-            int j1 = MathHelper.floor_double(d7 - d11 / 2D);
-            int k1 = MathHelper.floor_double(d8 - d10 / 2D);
-            int l1 = MathHelper.floor_double(d6 + d10 / 2D);
-            int i2 = MathHelper.floor_double(d7 + d11 / 2D);
-            int j2 = MathHelper.floor_double(d8 + d10 / 2D);
+            double d10 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            double d11 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            int i1 = MathHelper.floor(d6 - d10 / 2D);
+            int j1 = MathHelper.floor(d7 - d11 / 2D);
+            int k1 = MathHelper.floor(d8 - d10 / 2D);
+            int l1 = MathHelper.floor(d6 + d10 / 2D);
+            int i2 = MathHelper.floor(d7 + d11 / 2D);
+            int j2 = MathHelper.floor(d8 + d10 / 2D);
             for(int k2 = i1; k2 <= l1; k2++)
             {
                 double d12 = (((double)k2 + 0.5D) - d6) / (d10 / 2D);
@@ -61,7 +61,7 @@ public class WorldFeatureGrassPatch extends WorldFeature
                         double d14 = (((double)i3 + 0.5D) - d8) / (d10 / 2D);
                         if(d12 * d12 + d13 * d13 + d14 * d14 < 1.0D)
                         {
-                            if(world.getBlockId(k2, l2, i3) == Block.dirt.id || world.getBlockId(k2, l2, i3) == Block.grass.id)
+                            if(world.getBlockId(k2, l2, i3) == Blocks.DIRT.id || world.getBlockId(k2, l2, i3) == Blocks.GRASS.id)
                                 world.setBlockAndMetadata(k2, l2, i3, blockToPlace, 0);
                         }
                     }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
index a968365d2..cb2a2efb8 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLabyrinth.java
@@ -2,14 +2,15 @@ package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.WeightedRandomBag;
 import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.entity.ChestBlockEntity;
+import net.minecraft.core.block.entity.DispenserBlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
 import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
-import net.minecraft.core.block.entity.TileEntityChest;
-import net.minecraft.core.block.entity.TileEntityDispenser;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
 import net.minecraft.core.world.biome.Biome;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.biome.Biomes;
 
@@ -17,7 +18,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Material, Block,
-//            TileEntityChest, TileEntityMobSpawner, ItemStack, Item
+//            ChestBlockEntity, MobSpawnerBlockEntity, ItemStack, Item
 public class WorldFeatureLabyrinth extends WorldFeature
 {
     public WorldFeatureLabyrinth()
@@ -29,71 +30,71 @@ public class WorldFeatureLabyrinth extends WorldFeature
     boolean treasureGenerated = false;
     boolean libraryGenerated = false;
     boolean isCold = false;
-    int wallBlockA = Block.cobbleStone.id;
-    int wallBlockB = Block.cobbleStoneMossy.id;
-    int brickBlockA = Block.brickStonePolished.id;
-    int brickBlockB = Block.brickStonePolishedMossy.id;
-    int slabBlock = Block.slabStonePolished.id;
+    int wallBlockA = Blocks.COBBLE_STONE.id;
+    int wallBlockB = Blocks.COBBLE_STONE_MOSSY.id;
+    int brickBlockA = Blocks.BRICK_STONE_POLISHED.id;
+    int brickBlockB = Blocks.BRICK_STONE_POLISHED_MOSSY.id;
+    int slabBlock = Blocks.SLAB_STONE_POLISHED.id;
     public ItemStack treasureItem;
     public WeightedRandomBag<WeightedRandomLootObject> chestLoot;
     public WeightedRandomBag<WeightedRandomLootObject> dispenserLoot;
     public WeightedRandomBag<String> spawnerMonsters;
     @Override
-    public boolean generate(World world, Random random, int x, int y, int z)
+    public boolean place(World world, Random random, int x, int y, int z)
     {
         Biome biome = world.getBlockBiome(x, y, z);
 
         if (biome == Biomes.OVERWORLD_DESERT || biome == Biomes.OVERWORLD_OUTBACK)
         {
-            wallBlockA = Block.sandstone.id;
-            wallBlockB = Block.sandstone.id;
-            brickBlockA = Block.brickSandstone.id;
-            brickBlockB = Block.brickSandstone.id;
-            slabBlock = Block.slabSandstone.id;
+            wallBlockA = Blocks.SANDSTONE.id;
+            wallBlockB = Blocks.SANDSTONE.id;
+            brickBlockA = Blocks.BRICK_SANDSTONE.id;
+            brickBlockB = Blocks.BRICK_SANDSTONE.id;
+            slabBlock = Blocks.SLAB_SANDSTONE.id;
         }
         if (biome == Biomes.OVERWORLD_TAIGA || biome == Biomes.OVERWORLD_TUNDRA || biome == Biomes.OVERWORLD_GLACIER)
         {
-            wallBlockA = Block.permafrost.id;
-            wallBlockB = Block.cobblePermafrost.id;
-            brickBlockA = Block.brickPermafrost.id;
-            brickBlockB = Block.brickPermafrost.id;
+            wallBlockA = Blocks.PERMAFROST.id;
+            wallBlockB = Blocks.COBBLE_PERMAFROST.id;
+            brickBlockA = Blocks.BRICK_PERMAFROST.id;
+            brickBlockB = Blocks.BRICK_PERMAFROST.id;
             isCold = true;
         }
 
         this.chestLoot = new WeightedRandomBag<>();
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.ingotIron.getDefaultStack(), 1, 6), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.ingotGold.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.sulphur.getDefaultStack(), 3, 8), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.diamond.getDefaultStack(), 1, 4), 2);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.foodAppleGold.getDefaultStack()), 1);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.dustRedstone.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.INGOT_IRON.getDefaultStack(), 1, 6), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.INGOT_GOLD.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.SULPHUR.getDefaultStack(), 3, 8), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.DIAMOND.getDefaultStack(), 1, 4), 2);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.FOOD_APPLE_GOLD.getDefaultStack()), 1);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.DUST_REDSTONE.getDefaultStack(), 1, 4), 100);
         for (int i = 0; i < 9; i++) {
-            chestLoot.addEntry(new WeightedRandomLootObject(new ItemStack(Item.itemsList[Item.record13.id + i])), 1);
+            chestLoot.addEntry(new WeightedRandomLootObject(new ItemStack(Item.itemsList[Items.RECORD_13.id + i])), 1);
         }
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.foodApple.getDefaultStack()), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Block.spongeDry.getDefaultStack(), 1, 4), 100);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.handcannonLoaded.getDefaultStack()), 0.5);
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.handcannonUnloaded.getDefaultStack()), 4.5);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.FOOD_APPLE.getDefaultStack()), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Blocks.SPONGE_DRY.getDefaultStack(), 1, 4), 100);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.HANDCANNON_LOADED.getDefaultStack()), 0.5);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.HANDCANNON_UNLOADED.getDefaultStack()), 4.5);
 
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.armorHelmetChainmail.getDefaultStack())
-                        .setRandomMetadata(Item.armorHelmetChainmail.getMaxDamage()/2, Item.armorHelmetChainmail.getMaxDamage()), 20);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.ARMOR_HELMET_CHAINMAIL.getDefaultStack())
+                        .setRandomMetadata(Items.ARMOR_HELMET_CHAINMAIL.getMaxDamage()/2, Items.ARMOR_HELMET_CHAINMAIL.getMaxDamage()), 20);
 
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.armorChestplateChainmail.getDefaultStack())
-                .setRandomMetadata(Item.armorChestplateChainmail.getMaxDamage()/2, Item.armorChestplateChainmail.getMaxDamage()), 20);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.ARMOR_CHESTPLATE_CHAINMAIL.getDefaultStack())
+                .setRandomMetadata(Items.ARMOR_CHESTPLATE_CHAINMAIL.getMaxDamage()/2, Items.ARMOR_CHESTPLATE_CHAINMAIL.getMaxDamage()), 20);
 
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.armorLeggingsChainmail.getDefaultStack())
-                .setRandomMetadata(Item.armorLeggingsChainmail.getMaxDamage()/2, Item.armorLeggingsChainmail.getMaxDamage()), 20);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.ARMOR_LEGGINGS_CHAINMAIL.getDefaultStack())
+                .setRandomMetadata(Items.ARMOR_LEGGINGS_CHAINMAIL.getMaxDamage()/2, Items.ARMOR_LEGGINGS_CHAINMAIL.getMaxDamage()), 20);
 
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.armorBootsChainmail.getDefaultStack())
-                .setRandomMetadata(Item.armorBootsChainmail.getMaxDamage()/2, Item.armorBootsChainmail.getMaxDamage()), 20);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.ARMOR_BOOTS_CHAINMAIL.getDefaultStack())
+                .setRandomMetadata(Items.ARMOR_BOOTS_CHAINMAIL.getMaxDamage()/2, Items.ARMOR_BOOTS_CHAINMAIL.getMaxDamage()), 20);
 
-        chestLoot.addEntry(new WeightedRandomLootObject(Item.ingotSteelCrude.getDefaultStack()), 10);
+        chestLoot.addEntry(new WeightedRandomLootObject(Items.INGOT_STEEL_CRUDE.getDefaultStack()), 10);
         chestLoot.addEntry(new WeightedRandomLootObject(null), 892);
 
         this.dispenserLoot = new WeightedRandomBag<>();
-        dispenserLoot.addEntry(new WeightedRandomLootObject(Item.ammoArrow.getDefaultStack(), 5, 7), 300);
-        dispenserLoot.addEntry(new WeightedRandomLootObject(Item.ammoArrowGold.getDefaultStack()), 10);
-        dispenserLoot.addEntry(new WeightedRandomLootObject(Item.ammoChargeExplosive.getDefaultStack()), 0.5);
+        dispenserLoot.addEntry(new WeightedRandomLootObject(Items.AMMO_ARROW.getDefaultStack(), 5, 7), 300);
+        dispenserLoot.addEntry(new WeightedRandomLootObject(Items.AMMO_ARROW_GOLD.getDefaultStack()), 10);
+        dispenserLoot.addEntry(new WeightedRandomLootObject(Items.AMMO_CHARGE_EXPLOSIVE.getDefaultStack()), 0.5);
         dispenserLoot.addEntry(new WeightedRandomLootObject(null), 289.5);
 
         this.spawnerMonsters = new WeightedRandomBag<>();
@@ -102,10 +103,10 @@ public class WorldFeatureLabyrinth extends WorldFeature
         if (isCold){
             spawnerMonsters.addEntry("Snowman", 1);
             spawnerMonsters.addEntry("ArmouredZombie", 1);
-            treasureItem = Item.armorBootsIceskates.getDefaultStack();
+            treasureItem = Items.ARMOR_BOOTS_ICESKATES.getDefaultStack();
         } else {
             spawnerMonsters.addEntry("ArmouredZombie", 2);
-            treasureItem = Item.armorQuiverGold.getDefaultStack();
+            treasureItem = Items.ARMOR_QUIVER_GOLD.getDefaultStack();
         }
 
         if(canReplace(world, x, y, z)) {
@@ -141,14 +142,14 @@ public class WorldFeatureLabyrinth extends WorldFeature
                         //generate traps
                         if (!generateTrapOnWall && (xWallCheck || zWallCheck)) {
                             if ((x == blockZ || z == blockZ) && y == blockY) {
-                                world.setBlockWithNotify(x, y, z, Block.motionsensorIdle.id);
-                                world.setBlockWithNotify(x, y - 1, z, Block.dispenserCobbleStone.id);
-                                TileEntityDispenser tileEntityDispenser = (TileEntityDispenser) world.getBlockTileEntity(x, blockY - 1, z);
+                                world.setBlockWithNotify(x, y, z, Blocks.MOTION_SENSOR_IDLE.id);
+                                world.setBlockWithNotify(x, y - 1, z, Blocks.DISPENSER_COBBLE_STONE.id);
+                                DispenserBlockEntity tileEntityDispenser = (DispenserBlockEntity) world.getBlockEntity(x, blockY - 1, z);
                                 int k4 = 0;
                                 while (k4 < 3) {
                                     ItemStack itemstack = pickDispenserLootItem(random);
                                     if (itemstack != null)
-                                        tileEntityDispenser.setInventorySlotContents(random.nextInt(tileEntityDispenser.getSizeInventory()), itemstack);
+                                        tileEntityDispenser.setItem(random.nextInt(tileEntityDispenser.getContainerSize()), itemstack);
                                     k4++;
                                 }
                                 generateTrapOnWall = true;
@@ -186,7 +187,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                         if (yWallCheck) {
                             world.setBlockWithNotify(x, y, z, wallBlockB);
                             if(dungeonSize >= 10)
-                                world.setBlockWithNotify(x, y+1, z, Block.spikes.id);
+                                world.setBlockWithNotify(x, y+1, z, Blocks.SPIKES.id);
                         }
                         else if (x != blockX && z != blockZ && random.nextInt(20) == 0 && world.getBlockId(x, y + 1, z) != slabBlock)
                         {
@@ -212,9 +213,9 @@ public class WorldFeatureLabyrinth extends WorldFeature
     private boolean canReplace(World world, int x, int y, int z){
         if(y <= 11)
             return false;
-        if(world.getBlockId(x, y, z) == (brickBlockA) || world.getBlockId(x, y, z) == Block.planksOak.id || world.getBlockId(x, y, z) == Block.cobweb.id || world.getBlockId(x, y, z) == Block.bookshelfPlanksOak.id || world.getBlockId(x, y, z) == Block.mobspawner.id || world.getBlockId(x, y, z) == brickBlockB )
+        if(world.getBlockId(x, y, z) == (brickBlockA) || world.getBlockId(x, y, z) == Blocks.PLANKS_OAK.id || world.getBlockId(x, y, z) == Blocks.COBWEB.id || world.getBlockId(x, y, z) == Blocks.BOOKSHELF_PLANKS_OAK.id || world.getBlockId(x, y, z) == Blocks.MOBSPAWNER.id || world.getBlockId(x, y, z) == brickBlockB )
             return false;
-        if(world.getBlockId(x, y, z) == Block.motionsensorIdle.id || world.getBlockId(x, y, z) == Block.dispenserCobbleStone.id || world.getBlockId(x, y, z) == Block.motionsensorActive.id) {
+        if(world.getBlockId(x, y, z) == Blocks.MOTION_SENSOR_IDLE.id || world.getBlockId(x, y, z) == Blocks.DISPENSER_COBBLE_STONE.id || world.getBlockId(x, y, z) == Blocks.MOTION_SENSOR_ACTIVE.id) {
             world.removeBlockTileEntity(x, y, z);
             world.setBlockWithNotify(x, y, z, 0);
             return true;
@@ -299,7 +300,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                             else world.setBlockWithNotify(x, y, z, 0);
                         }
                         if(y == blockY + (height - 1) && !zWallCheck && !xWallCheck && random.nextInt(20)==0)
-                            world.setBlockWithNotify(x, y, z, Block.cobweb.id);
+                            world.setBlockWithNotify(x, y, z, Blocks.COBWEB.id);
                     }
                 }
             }
@@ -369,21 +370,21 @@ public class WorldFeatureLabyrinth extends WorldFeature
         int chestX = blockX + random.nextInt(size-1) - (size-1);
         int chestZ = blockZ + random.nextInt(size-1) - (size-1);
         if(canReplace(world, chestX, blockY-2, chestZ)) {
-            world.setBlockWithNotify(chestX, blockY - 1, chestZ, Block.chestPlanksOak.id);
-            TileEntityChest tileentitychest = (TileEntityChest) world.getBlockTileEntity(chestX, blockY - 1, chestZ);
+            world.setBlockWithNotify(chestX, blockY - 1, chestZ, Blocks.CHEST_PLANKS_OAK.id);
+            ChestBlockEntity tileentitychest = (ChestBlockEntity) world.getBlockEntity(chestX, blockY - 1, chestZ);
             int k4 = 0;
             while (k4 < 10) {
                 ItemStack itemstack = pickCheckLootItem(random);
                 if (itemstack != null) {
-                    tileentitychest.setInventorySlotContents(random.nextInt(tileentitychest.getSizeInventory()), itemstack);
+                    tileentitychest.setItem(random.nextInt(tileentitychest.getContainerSize()), itemstack);
                 }
                 k4++;
             }
         }
         if (doSpawner)
         {
-            world.setBlockWithNotify(blockX, blockY-1, blockZ, Block.mobspawner.id);
-            TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner)world.getBlockTileEntity(blockX, blockY-1, blockZ);
+            world.setBlockWithNotify(blockX, blockY-1, blockZ, Blocks.MOBSPAWNER.id);
+            MobSpawnerBlockEntity tileentitymobspawner = (MobSpawnerBlockEntity)world.getBlockEntity(blockX, blockY-1, blockZ);
             if(tileentitymobspawner != null)
                 tileentitymobspawner.setMobId(pickMobSpawner(random));
         }
@@ -415,7 +416,7 @@ public class WorldFeatureLabyrinth extends WorldFeature
                         }
                         else if (yWallCheck) {
                             if((x > blockX-2 && x < blockX+2) || (z > blockZ-2 && z < blockZ+2))
-                                world.setBlockWithNotify(x, y, z, Block.planksOak.id);
+                                world.setBlockWithNotify(x, y, z, Blocks.PLANKS_OAK.id);
                             else if (random.nextInt(5) == 0)
                                 world.setBlockWithNotify(x, y, z, wallBlockB);
                             else
@@ -435,12 +436,12 @@ public class WorldFeatureLabyrinth extends WorldFeature
                                     && (z <= blockZ - 1 || z >= blockZ + 1)
                                     && y < blockY + 2) {
                                 if(xRoom % 2 == 0)
-                                    world.setBlockWithNotify(x, y, z, Block.bookshelfPlanksOak.id);
+                                    world.setBlockWithNotify(x, y, z, Blocks.BOOKSHELF_PLANKS_OAK.id);
                                 else
                                     if (random.nextInt(5) == 0)
-                                        world.setBlockWithNotify(x, y, z, Block.logOakMossy.id);
+                                        world.setBlockWithNotify(x, y, z, Blocks.LOG_OAK_MOSSY.id);
                                     else
-                                        world.setBlockWithNotify(x, y, z, Block.logOak.id);
+                                        world.setBlockWithNotify(x, y, z, Blocks.LOG_OAK.id);
                             }
                             else
                                 world.setBlockWithNotify(x, y, z, 0);
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
index bfed04599..5e50c5f3f 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
@@ -2,6 +2,7 @@ package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
@@ -10,7 +11,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Material, Block, 
-//            EnumSkyBlock, BlockGrass
+//            EnumSkyBlock, GrassBlock
 
 public class WorldFeatureLake extends WorldFeature
 {
@@ -21,7 +22,7 @@ public class WorldFeatureLake extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
     	Block liquid = Block.blocksList[liquidId];
     	Biome biome = world.getBlockBiome(x, y, z);
@@ -81,7 +82,7 @@ public class WorldFeatureLake extends WorldFeature
                     {
                         return false;
                     }
-                    if (world.getBlockId(x + dx, y + dy, z + dz) == Block.ice.id)
+                    if (world.getBlockId(x + dx, y + dy, z + dz) == Blocks.ICE.id)
                     {
                     	return false;
                     }
@@ -113,9 +114,9 @@ public class WorldFeatureLake extends WorldFeature
             {
                 for(int dy = 4; dy < 8; dy++)
                 {
-                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && world.getBlockId(x + dx, (y + dy) - 1, z + dz) == Block.dirt.id && world.getSavedLightValue(LightLayer.Sky, x + dx, y + dy, z + dz) > 0)
+                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && world.getBlockId(x + dx, (y + dy) - 1, z + dz) == Blocks.DIRT.id && world.getSavedLightValue(LightLayer.Sky, x + dx, y + dy, z + dz) > 0)
                     {
-                        world.setBlock(x + dx, (y + dy) - 1, z + dz, Block.grass.id);
+                        world.setBlock(x + dx, (y + dy) - 1, z + dz, Blocks.GRASS.id);
                     }
                 }
 
@@ -134,7 +135,7 @@ public class WorldFeatureLake extends WorldFeature
                         boolean flag1 = !shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && (dx < 15 && shouldPlaceLiquid[((dx + 1) * 16 + dz) * 8 + dy] || dx > 0 && shouldPlaceLiquid[((dx - 1) * 16 + dz) * 8 + dy] || dz < 15 && shouldPlaceLiquid[(dx * 16 + (dz + 1)) * 8 + dy] || dz > 0 && shouldPlaceLiquid[(dx * 16 + (dz - 1)) * 8 + dy] || dy < 7 && shouldPlaceLiquid[(dx * 16 + dz) * 8 + (dy + 1)] || dy > 0 && shouldPlaceLiquid[(dx * 16 + dz) * 8 + (dy - 1)]);
                         if(flag1 && (dy < 4 || random.nextInt(2) != 0) && world.getBlockMaterial(x + dx, y + dy, z + dz).isSolid())
                         {
-                            world.setBlock(x + dx, y + dy, z + dz, world.getWorldType().getFillerBlock());
+                            world.setBlock(x + dx, y + dy, z + dz, world.getWorldType().getFillerBlockId());
                         }
                     }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLiquid.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLiquid.java
index d82871189..57877d595 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLiquid.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLiquid.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -17,34 +18,34 @@ public class WorldFeatureLiquid extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        if(world.getBlockId(x, y + 1, z) != Block.stone.id)
+        if(world.getBlockId(x, y + 1, z) != Blocks.STONE.id)
         {
             return false;
         }
-        if(world.getBlockId(x, y - 1, z) != Block.stone.id)
+        if(world.getBlockId(x, y - 1, z) != Blocks.STONE.id)
         {
             return false;
         }
-        if(world.getBlockId(x, y, z) != 0 && world.getBlockId(x, y, z) != Block.stone.id)
+        if(world.getBlockId(x, y, z) != 0 && world.getBlockId(x, y, z) != Blocks.STONE.id)
         {
             return false;
         }
         int l = 0;
-        if(world.getBlockId(x - 1, y, z) == Block.stone.id)
+        if(world.getBlockId(x - 1, y, z) == Blocks.STONE.id)
         {
             l++;
         }
-        if(world.getBlockId(x + 1, y, z) == Block.stone.id)
+        if(world.getBlockId(x + 1, y, z) == Blocks.STONE.id)
         {
             l++;
         }
-        if(world.getBlockId(x, y, z - 1) == Block.stone.id)
+        if(world.getBlockId(x, y, z - 1) == Blocks.STONE.id)
         {
             l++;
         }
-        if(world.getBlockId(x, y, z + 1) == Block.stone.id)
+        if(world.getBlockId(x, y, z + 1) == Blocks.STONE.id)
         {
             l++;
         }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMeadow.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMeadow.java
index 61d5ef9a9..3cff97531 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMeadow.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMeadow.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -15,9 +15,9 @@ public class WorldFeatureMeadow extends WorldFeature
     }
 
     @Override
-    public boolean generate(World world, Random random, int x, int y, int z)
+    public boolean place(World world, Random random, int x, int y, int z)
     {
-        for(int l = 0; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BlockLeavesBase) && y > 0; y--) { }
+        for(int l = 0; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BaseLeavesBlock) && y > 0; y--) { }
         for(int i1 = 0; i1 < 128; i1++)
         {
             int j1 = (x + random.nextInt(8)) - random.nextInt(8);
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMudPatch.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMudPatch.java
index 66db64000..fccad9727 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMudPatch.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureMudPatch.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.noise.ImprovedNoise;
 
@@ -11,7 +12,7 @@ public class WorldFeatureMudPatch extends WorldFeature
     private static final ImprovedNoise noise = new ImprovedNoise(new Random(0));
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z) {
+	public boolean place(World world, Random random, int x, int y, int z) {
         int chunkCoordX = world.getChunkFromBlockCoords(x, z).xPosition * 16;
         int chunkCoordZ = world.getChunkFromBlockCoords(x, z).zPosition * 16;
 
@@ -22,9 +23,9 @@ public class WorldFeatureMudPatch extends WorldFeature
                 float offset = (float) noise.getValue(chunkX / 30D, yPos / 30D, chunkZ / 30D) * 0.75f;
                 if(offset >= 0.125F) {
                     for(int i = 0; i < 5; i++) {
-                        if (world.getBlockId(chunkX, yPos - i, chunkZ) == Block.grass.id ||
-                                world.getBlockId(chunkX, yPos - i, chunkZ) == Block.dirt.id) {
-                            world.setBlock(chunkX, yPos - i, chunkZ, Block.mud.id);
+                        if (world.getBlockId(chunkX, yPos - i, chunkZ) == Blocks.GRASS.id ||
+                                world.getBlockId(chunkX, yPos - i, chunkZ) == Blocks.DIRT.id) {
+                            world.setBlock(chunkX, yPos - i, chunkZ, Blocks.MUD.id);
                         }
                     }
                 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherLava.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherLava.java
index ca185c8d6..252887b3c 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherLava.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherLava.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -18,34 +19,34 @@ public class WorldFeatureNetherLava extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        if(world.getBlockId(x, y + 1, z) != Block.netherrack.id)
+        if(world.getBlockId(x, y + 1, z) != Blocks.NETHERRACK.id)
         {
             return false;
         }
-        if(world.getBlockId(x, y, z) != 0 && world.getBlockId(x, y, z) != Block.netherrack.id)
+        if(world.getBlockId(x, y, z) != 0 && world.getBlockId(x, y, z) != Blocks.NETHERRACK.id)
         {
             return false;
         }
         int l = 0;
-        if(world.getBlockId(x - 1, y, z) == Block.netherrack.id)
+        if(world.getBlockId(x - 1, y, z) == Blocks.NETHERRACK.id)
         {
             l++;
         }
-        if(world.getBlockId(x + 1, y, z) == Block.netherrack.id)
+        if(world.getBlockId(x + 1, y, z) == Blocks.NETHERRACK.id)
         {
             l++;
         }
-        if(world.getBlockId(x, y, z - 1) == Block.netherrack.id)
+        if(world.getBlockId(x, y, z - 1) == Blocks.NETHERRACK.id)
         {
             l++;
         }
-        if(world.getBlockId(x, y, z + 1) == Block.netherrack.id)
+        if(world.getBlockId(x, y, z + 1) == Blocks.NETHERRACK.id)
         {
             l++;
         }
-        if(world.getBlockId(x, y - 1, z) == Block.netherrack.id)
+        if(world.getBlockId(x, y - 1, z) == Blocks.NETHERRACK.id)
         {
             l++;
         }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
index 3326a24fe..dcd24662e 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
@@ -1,9 +1,11 @@
 package net.minecraft.core.world.generate.feature;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
+import java.util.Map;
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
@@ -11,18 +13,27 @@ import java.util.Random;
 
 public class WorldFeatureOre extends WorldFeature
 {
-    @MethodParametersAnnotation(names = {"blockId", "numberOfBlocks", "hasStoneStates"})
-    public WorldFeatureOre(int blockId, int numberOfBlocks, boolean hasStoneStates)
+    private int minableBlockId;
+    private int numberOfBlocks;
+    private final Map<Integer, Integer> variantMap;
+    @MethodParametersAnnotation(names = {"blockId", "numberOfBlocks"})
+    public WorldFeatureOre(int blockId, int numberOfBlocks)
     {
         minableBlockId = blockId;
         this.numberOfBlocks = numberOfBlocks;
-        this.hasStoneStates = hasStoneStates;
+        this.variantMap = null;
+    }
+    @MethodParametersAnnotation(names = {"blockId", "numberOfBlocks", "variantMap"})
+    public WorldFeatureOre(@NotNull Map<Integer, Integer> variantMap, int numberOfBlocks)
+    {
+        this.numberOfBlocks = numberOfBlocks;
+        this.variantMap = variantMap;
     }
 
     @Override
-	public boolean generate(World world, Random random, int xStart, int yStart, int zStart)
+	public boolean place(World world, Random random, int xStart, int yStart, int zStart)
     {
-        float f = random.nextFloat() * 3.141593F;
+        float f = random.nextFloat() * MathHelper.PI;
         double xMax = (float)(xStart + 8) + (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double xMin = (float)(xStart + 8) - (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
         double zMax = (float)(zStart + 8) + (MathHelper.cos(f) * (float)numberOfBlocks) / 8F;
@@ -35,14 +46,14 @@ public class WorldFeatureOre extends WorldFeature
             double d7 = yMax + ((yMin - yMax) * (double)l) / (double)numberOfBlocks;
             double d8 = zMax + ((zMin - zMax) * (double)l) / (double)numberOfBlocks;
             double d9 = (random.nextDouble() * (double)numberOfBlocks) / 16D;
-            double d10 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            double d11 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
-            int xVeinStart = MathHelper.floor_double(d6 - d10 / 2D);
-            int yVeinStart = MathHelper.floor_double(d7 - d11 / 2D);
-            int zVeinStart = MathHelper.floor_double(d8 - d10 / 2D);
-            int xVeinEnd = MathHelper.floor_double(d6 + d10 / 2D);
-            int yVeinEnd = MathHelper.floor_double(d7 + d11 / 2D);
-            int zVeinEnd = MathHelper.floor_double(d8 + d10 / 2D);
+            double d10 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            double d11 = (double)(MathHelper.sin(((float)l * MathHelper.PI) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            int xVeinStart = MathHelper.floor(d6 - d10 / 2D);
+            int yVeinStart = MathHelper.floor(d7 - d11 / 2D);
+            int zVeinStart = MathHelper.floor(d8 - d10 / 2D);
+            int xVeinEnd = MathHelper.floor(d6 + d10 / 2D);
+            int yVeinEnd = MathHelper.floor(d7 + d11 / 2D);
+            int zVeinEnd = MathHelper.floor(d8 + d10 / 2D);
             for(int x = xVeinStart; x <= xVeinEnd; x++)
             {
                 double d12 = (((double)x + 0.5D) - d6) / (d10 / 2D);
@@ -62,23 +73,20 @@ public class WorldFeatureOre extends WorldFeature
                         double d14 = (((double)z + 0.5D) - d8) / (d10 / 2D);
                         if(d12 * d12 + d13 * d13 + d14 * d14 < 1.0D)
                         {
-                        	if (hasStoneStates)
+                        	if (variantMap != null)
                         	{
-                        		if(world.getBlockId(x, y, z) == Block.stone.id || world.getBlockId(x, y, z) == Block.netherrack.id)
-                        			world.setBlock(x, y, z, minableBlockId);
-                        		else if (world.getBlockId(x, y, z) == Block.basalt.id)
-                        			world.setBlock(x, y, z, minableBlockId + 1);
-                        		else if (world.getBlockId(x, y, z) == Block.limestone.id)
-                        			world.setBlock(x, y, z, minableBlockId + 2);
-                        		else if (world.getBlockId(x, y, z) == Block.granite.id)
-                        			world.setBlock(x, y, z, minableBlockId + 3);
+                                int blockId = world.getBlockId(x, y, z);
+                                if (blockId <= 0) continue;
+                                if (variantMap.containsKey(blockId)){
+                                    world.setBlock(x, y, z, variantMap.get(blockId));
+                                }
                         	}
                         	else
                         	{
                         		int id = world.getBlockId(x, y, z);
-                        		if (id == Block.stone.id || id == Block.netherrack.id ||
-                        				id == Block.basalt.id || id == Block.limestone.id ||
-                        				id == Block.granite.id)
+                        		if (id == Blocks.STONE.id || id == Blocks.NETHERRACK.id ||
+                        				id == Blocks.BASALT.id || id == Blocks.LIMESTONE.id ||
+                        				id == Blocks.GRANITE.id)
                         		{
                         			world.setBlock(x, y, z, minableBlockId);
                         		}
@@ -94,8 +102,4 @@ public class WorldFeatureOre extends WorldFeature
 
         return true;
     }
-
-    private int minableBlockId;
-    private int numberOfBlocks;
-    private boolean hasStoneStates = false;
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePermaice.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePermaice.java
new file mode 100644
index 000000000..2e7aa4355
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePermaice.java
@@ -0,0 +1,81 @@
+package net.minecraft.core.world.generate.feature;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class WorldFeaturePermaice extends WorldFeature{
+    private int blockId;
+    private int numberOfBlocks;
+    private int generateInId;
+
+    @MethodParametersAnnotation(names = {"numberOfBlocks", "block"})
+    public WorldFeaturePermaice(int numberOfBlocks, Block block)
+    {
+        blockId = Blocks.PERMAICE.id;
+        this.numberOfBlocks = numberOfBlocks;
+        this.generateInId = block.id;
+    }
+
+    @Override
+    public boolean place(World world, Random random, int x, int y, int z)
+    {
+        float f = random.nextFloat() * 3.141593F;
+        double d = (float)(x + 8) + (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
+        double d1 = (float)(x + 8) - (MathHelper.sin(f) * (float)numberOfBlocks) / 8F;
+        double d2 = (float)(z + 8) + (MathHelper.cos(f) * (float)numberOfBlocks) / 8F;
+        double d3 = (float)(z + 8) - (MathHelper.cos(f) * (float)numberOfBlocks) / 8F;
+        double d4 = y + random.nextInt(3) + 2;
+        double d5 = y + random.nextInt(3) + 2;
+        for(int l = 0; l <= numberOfBlocks; l++)
+        {
+            double d6 = d + ((d1 - d) * (double)l) / (double)numberOfBlocks;
+            double d7 = d4 + ((d5 - d4) * (double)l) / (double)numberOfBlocks;
+            double d8 = d2 + ((d3 - d2) * (double)l) / (double)numberOfBlocks;
+            double d9 = (random.nextDouble() * (double)numberOfBlocks) / 16D;
+            double d10 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            double d11 = (double)(MathHelper.sin(((float)l * 3.141593F) / (float)numberOfBlocks) + 1.0F) * d9 + 1.0D;
+            int i1 = MathHelper.floor(d6 - d10 / 2D);
+            int j1 = MathHelper.floor(d7 - d11 / 2D);
+            int k1 = MathHelper.floor(d8 - d10 / 2D);
+            int l1 = MathHelper.floor(d6 + d10 / 2D);
+            int i2 = MathHelper.floor(d7 + d11 / 2D);
+            int j2 = MathHelper.floor(d8 + d10 / 2D);
+            for(int k2 = i1; k2 <= l1; k2++)
+            {
+                double d12 = (((double)k2 + 0.5D) - d6) / (d10 / 2D);
+                if(d12 * d12 >= 1.0D)
+                {
+                    continue;
+                }
+                for(int l2 = j1; l2 <= i2; l2++)
+                {
+                    double d13 = (((double)l2 + 0.5D) - d7) / (d11 / 2D);
+                    if(d12 * d12 + d13 * d13 >= 1.0D)
+                    {
+                        continue;
+                    }
+                    for(int i3 = k1; i3 <= j2; i3++)
+                    {
+                        double d14 = (((double)i3 + 0.5D) - d8) / (d10 / 2D);
+                        if(d12 * d12 + d13 * d13 + d14 * d14 < 1.0D)
+                        {
+                            if(world.getBlockId(k2, l2, i3) == generateInId)
+                            {
+                                world.setBlock(k2, l2, i3, blockId);
+                            }
+                        }
+                    }
+
+                }
+
+            }
+
+        }
+
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePumpkin.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePumpkin.java
index 22e62ea82..b1b7ba0cc 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePumpkin.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeaturePumpkin.java
@@ -1,12 +1,13 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldGenerator, World, Block, BlockGrass
+//            WorldGenerator, World, Block, GrassBlock
 
 public class WorldFeaturePumpkin extends WorldFeature
 {
@@ -16,18 +17,18 @@ public class WorldFeaturePumpkin extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 64; l++)
         {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
             int j1 = (y + random.nextInt(4)) - random.nextInt(4);
             int k1 = (z + random.nextInt(8)) - random.nextInt(8);
-            if(world.isAirBlock(i1, j1, k1) && world.getBlockId(i1, j1 - 1, k1) == Block.grass.id && Block.pumpkin.canPlaceBlockAt(world, i1, j1, k1))
+            if(world.isAirBlock(i1, j1, k1) && world.getBlockId(i1, j1 - 1, k1) == Blocks.GRASS.id && Blocks.PUMPKIN.canPlaceBlockAt(world, i1, j1, k1))
             {
                 if(random.nextInt(50)== 0)
-                    world.setBlockAndMetadata(i1, j1, k1, Block.pumpkinCarvedIdle.id, random.nextInt(4));
-                else    world.setBlockWithNotify(i1, j1, k1, Block.pumpkin.id);
+                    world.setBlockAndMetadata(i1, j1, k1, Blocks.PUMPKIN_CARVED_IDLE.id, random.nextInt(4));
+                else    world.setBlockWithNotify(i1, j1, k1, Blocks.PUMPKIN.id);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureRichScorchedDirt.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureRichScorchedDirt.java
index dcf3ff191..ace8cd0bd 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureRichScorchedDirt.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureRichScorchedDirt.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -17,15 +18,15 @@ public class WorldFeatureRichScorchedDirt extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
 
         for(int x1 = x - numberOfBlocks; x1 < x + numberOfBlocks; x1++ ) {
             for(int y1 = y - 2; y1 <= y+2; y1++ ) {
                 for(int z1 = z - numberOfBlocks; z1 < z + numberOfBlocks; z1++ ) {
                     if(random.nextInt(8) == 0){
-                        if(world.getBlockId(x1, y1, z1) == Block.dirtScorched.id)
-                            world.setBlock(x1, y1, z1, Block.dirtScorchedRich.id);
+                        if(world.getBlockId(x1, y1, z1) == Blocks.DIRT_SCORCHED.id)
+                            world.setBlock(x1, y1, z1, Blocks.DIRT_SCORCHED_RICH.id);
                     }
                 }
             }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSpinifexPatch.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSpinifexPatch.java
index e45060cd4..fdd84aa88 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSpinifexPatch.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSpinifexPatch.java
@@ -1,21 +1,22 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves,
-//            BlockFlower
+//            FlowerBlock
 
 public class WorldFeatureSpinifexPatch extends WorldFeature
 {
     @Override
-    public boolean generate(World world, Random random, int x, int y, int z)
+    public boolean place(World world, Random random, int x, int y, int z)
     {
-        for(int l; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BlockLeavesBase) && y > 0; y--) { }
+        for(int l; ((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BaseLeavesBlock) && y > 0; y--) { }
         for(int i1 = 0; i1 < 64; i1++)
         {
             int j1 = (x + random.nextInt(4)) - random.nextInt(4);
@@ -24,9 +25,9 @@ public class WorldFeatureSpinifexPatch extends WorldFeature
 
             int meta = 0;
 
-            if(world.isAirBlock(j1, k1, l1) && Block.spinifex.canBlockStay(world, j1, k1, l1))
+            if(world.isAirBlock(j1, k1, l1) && Blocks.SPINIFEX.canBlockStay(world, j1, k1, l1))
             {
-                world.setBlockAndMetadata(j1, k1, l1, Block.spinifex.id, meta);
+                world.setBlockAndMetadata(j1, k1, l1, Blocks.SPINIFEX.id, meta);
             }
         }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSponge.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSponge.java
index 131380158..a01737acc 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSponge.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSponge.java
@@ -1,33 +1,34 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldGenerator, World, Block, BlockFlower
+//            WorldGenerator, World, Block, FlowerBlock
 
 public class WorldFeatureSponge extends WorldFeature
 {
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        if (world.getBlockId(x, y - 1, z) != Block.fluidWaterStill.id)
+        if (world.getBlockId(x, y - 1, z) != Blocks.FLUID_WATER_STILL.id)
             return false;
         for(int l = 0; l < 16; l++) {
             int i1 = (x + random.nextInt(8)) - random.nextInt(8);
             int k1 = (z + random.nextInt(8)) - random.nextInt(8);
 
-            for (; world.getBlockId(i1, y - 1, k1) == Block.fluidWaterStill.id; y--);
+            for (; world.getBlockId(i1, y - 1, k1) == Blocks.FLUID_WATER_STILL.id; y--);
 
-            if(world.getBlockId(i1, y-1, k1) != Block.sand.id && world.getBlockId(i1, y-1, k1) != Block.dirt.id)
+            if(world.getBlockId(i1, y-1, k1) != Blocks.SAND.id && world.getBlockId(i1, y-1, k1) != Blocks.DIRT.id)
                 continue;
             if(world.getBlockId(i1, y+1, k1) == 0)
                 continue;
 
-            world.setBlockRaw(i1, y, k1, Block.spongeWet.id);
+            world.setBlockRaw(i1, y, k1, Blocks.SPONGE_WET.id);
         }
         return true;
     }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCane.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCane.java
index 3e754dd60..e83fd6c4b 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCane.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCane.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
@@ -17,7 +18,7 @@ public class WorldFeatureSugarCane extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 20; l++)
         {
@@ -31,9 +32,9 @@ public class WorldFeatureSugarCane extends WorldFeature
             int l1 = 2 + random.nextInt(random.nextInt(3) + 1);
             for(int i2 = 0; i2 < l1; i2++)
             {
-                if(Block.sugarcane.canBlockStay(world, i1, j1 + i2, k1))
+                if(Blocks.SUGARCANE.canBlockStay(world, i1, j1 + i2, k1))
                 {
-                    world.setBlock(i1, j1 + i2, k1, Block.sugarcane.id);
+                    world.setBlock(i1, j1 + i2, k1, Blocks.SUGARCANE.id);
                 }
             }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCaneTall.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCaneTall.java
index a7e97ebc5..316506f46 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCaneTall.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureSugarCaneTall.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
@@ -17,7 +18,7 @@ public class WorldFeatureSugarCaneTall extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         for(int l = 0; l < 20; l++)
         {
@@ -31,9 +32,9 @@ public class WorldFeatureSugarCaneTall extends WorldFeature
             int l1 = 5 + random.nextInt(random.nextInt(10) + 1);
             for(int i2 = 0; i2 < l1; i2++)
             {
-                if(Block.sugarcane.canBlockStay(world, i1, j1 + i2, k1))
+                if(Blocks.SUGARCANE.canBlockStay(world, i1, j1 + i2, k1))
                 {
-                    world.setBlock(i1, j1 + i2, k1, Block.sugarcane.id);
+                    world.setBlock(i1, j1 + i2, k1, Blocks.SUGARCANE.id);
                 }
             }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTallGrass.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTallGrass.java
index ec473a14a..2d517af7d 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTallGrass.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureTallGrass.java
@@ -1,14 +1,14 @@
 package net.minecraft.core.world.generate.feature;
 
+import net.minecraft.core.block.BaseLeavesBlock;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves, 
-//            BlockFlower
+//            FlowerBlock
 
 public class WorldFeatureTallGrass extends WorldFeature
 {
@@ -20,10 +20,10 @@ public class WorldFeatureTallGrass extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int l;
-        while (((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BlockLeavesBase) && y > 0) {
+        while (((l = world.getBlockId(x, y, z)) == 0 || Block.blocksList[l] instanceof BaseLeavesBlock) && y > 0) {
             y--;
         }
         for(int i1 = 0; i1 < 128; i1++)
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTree.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTree.java
index 5836b8c06..b0d23c6a8 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTree.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTree.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -23,7 +24,7 @@ public class WorldFeatureTree extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int treeHeight = random.nextInt(3) + heightMod;
         boolean canSpawn = true;
@@ -112,11 +113,11 @@ public class WorldFeatureTree extends WorldFeature
     
     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 == Blocks.GRASS.id || id == Blocks.GRASS_RETRO.id) {
+    		return Blocks.DIRT;
     	}
-    	if(id == Block.grassScorched.id) {
-    		return Block.dirtScorched;
+    	if(id == Blocks.GRASS_SCORCHED.id) {
+    		return Blocks.DIRT_SCORCHED;
     	}
     	return null;
     }
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
index 29388dc5e..8504417f2 100644
--- 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
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -64,15 +65,15 @@ public class WorldFeatureTreeCaatinga extends WorldFeature
         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);
+            pos[dim0] = MathHelper.floor((double)startPos[dim0] + (double)i + 0.5D);
+            pos[dim1] = MathHelper.floor((double)startPos[dim1] + (double)i * dim1DeltaScale + 0.5D);
+            pos[dim2] = MathHelper.floor((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)
+    public boolean place(World world, Random random, int x, int y, int z)
     {
         int l = random.nextInt(3) + heightMod;
         int noCanopies = 2;
@@ -181,11 +182,11 @@ public class WorldFeatureTreeCaatinga extends WorldFeature
 
     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 == Blocks.GRASS.id || id == Blocks.GRASS_RETRO.id) {
+            return Blocks.DIRT;
         }
-        if(id == Block.grassScorched.id) {
-            return Block.dirtScorched;
+        if(id == Blocks.GRASS_SCORCHED.id) {
+            return Blocks.DIRT_SCORCHED;
         }
         return null;
     }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCherry.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCherry.java
index 61f5cfd7c..4d1eb51a5 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCherry.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeCherry.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
-import net.minecraft.core.world.season.Seasons;
 
 import java.util.Random;
 
@@ -17,14 +17,14 @@ public class WorldFeatureTreeCherry extends WorldFeatureTree {
 	@Override
 	public void placeLeaves(World world, int x, int y, int z, Random rand) {
 		if(rand.nextInt(5) == 0) {
-			world.setBlockAndMetadataWithNotify(x, y, z, Block.leavesCherryFlowering.id, 0);
+			world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LEAVES_CHERRY_FLOWERING.id, 0);
 		}else {
-			world.setBlockWithNotify(x, y, z, Block.leavesCherry.id);
+			world.setBlockWithNotify(x, y, z, Blocks.LEAVES_CHERRY.id);
 		}
 	}
 	
 	@Override
 	public boolean isLeaf(int id) {
-		return id == Block.leavesCherryFlowering.id || id == Block.leavesCherry.id;
+		return id == Blocks.LEAVES_CHERRY_FLOWERING.id || id == Blocks.LEAVES_CHERRY.id;
 	}
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeEucalyptus.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeEucalyptus.java
index 8e3ed9176..cb42e364f 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeEucalyptus.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeEucalyptus.java
@@ -11,52 +11,68 @@ import java.util.Random;
 
 public class WorldFeatureTreeEucalyptus extends WorldFeature
 {
+    Random random;
+    World world;
+    int[] origin = {
+        0, 0, 0
+    };
+    int height;
+    int trunkHeight;
+    double trunkHeightScale;
+    double branchDensity;
+    double branchSlop;
+    double widthScale;
+    double foliageDensity;
+    int trunkWidth;
+    int heightVariance;
+    int foliageHeight;
+    int foliageCoords[][];
     protected int leavesID;
     protected int logID;
     @MethodParametersAnnotation(names = {"leavesID", "logID"})
     public WorldFeatureTreeEucalyptus(int leavesID, int logID)
     {
-        field_881_b = new Random();
-        field_878_e = 0;
-        field_876_g = 0.381D;
-        field_875_h = 1.0D;
-        field_874_i = 0.381D;
-        field_873_j = 1.0D;
-        field_872_k = 1.0D;
-        field_871_l = 1;
-        field_870_m = 20;
-        field_869_n = 10;
+        random = new Random();
+        height = 0;
+        trunkHeightScale = 0.381D;
+        branchDensity = 1.0D;
+        branchSlop = 0.381D;
+        widthScale = 1.0D;
+        foliageDensity = 1.0D;
+        trunkWidth = 1;
+        heightVariance = 20;
+        foliageHeight = 10;
         this.leavesID = leavesID;
         this.logID = logID;
     }
 
-    void func_521_a()
+    void prepare()
     {
-        height = (int)((double)field_878_e * field_876_g);
-        if(height >= field_878_e)
+        trunkHeight = (int)((double) height * trunkHeightScale);
+        if(trunkHeight >= height)
         {
-            height = field_878_e - 1;
+            trunkHeight = height - 1;
         }
-        int i = (int)(1.381D + java.lang.Math.pow((field_872_k * (double)field_878_e) / 7D, 2D));
+        int i = (int)(1.381D + Math.pow((foliageDensity * (double) height) / 7D, 2D));
         if(i < 1)
         {
             i = 1;
         }
-        int ai[][] = new int[i * field_878_e][4];
-        int j = (basePos[1] + field_878_e) - field_869_n;
+        int[][] ai = new int[i * height][4];
+        int j = (origin[1] + height) - foliageHeight;
         int k = 1;
-        int l = basePos[1] + height;
-        int i1 = j - basePos[1];
-        ai[0][0] = basePos[0];
+        int l = origin[1] + trunkHeight;
+        int i1 = j - origin[1];
+        ai[0][0] = origin[0];
         ai[0][1] = j;
-        ai[0][2] = basePos[2];
+        ai[0][2] = origin[2];
         ai[0][3] = l;
         j--;
         while(i1 >= 0)
         {
             int j1 = 0;
-            float f = func_528_a(i1);
-            if(f < 0.0F)
+            float treeShape = treeShape(i1);
+            if(treeShape < 0.0F)
             {
                 j--;
                 i1--;
@@ -65,25 +81,25 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
                 double d = 0.5D;
                 for(; j1 < i; j1++)
                 {
-                    double d1 = field_873_j * ((double)f * ((double)field_881_b.nextFloat() + 0.32800000000000001D));
-                    double d2 = (double)field_881_b.nextFloat() * 2D * 3.1415899999999999D;
-                    int k1 = MathHelper.floor_double(d1 * java.lang.Math.sin(d2) + (double)basePos[0] + d);
-                    int l1 = MathHelper.floor_double(d1 * java.lang.Math.cos(d2) + (double)basePos[2] + d);
+                    double d1 = widthScale * ((double)treeShape * ((double) random.nextFloat() + 0.32800000000000001D));
+                    double d2 = (double) random.nextFloat() * 2D * 3.1415899999999999D;
+                    int k1 = MathHelper.floor(d1 * Math.sin(d2) + (double) origin[0] + d);
+                    int l1 = MathHelper.floor(d1 * Math.cos(d2) + (double) origin[2] + d);
                     int ai1[] = {
                             k1, j, l1
                     };
                     int ai2[] = {
-                            k1, j + field_869_n, l1
+                            k1, j + foliageHeight, l1
                     };
-                    if(func_524_a(ai1, ai2) != -1)
+                    if(checkLine(ai1, ai2) != -1)
                     {
                         continue;
                     }
                     int ai3[] = {
-                            basePos[0], basePos[1], basePos[2]
+                            origin[0], origin[1], origin[2]
                     };
-                    double d3 = java.lang.Math.sqrt(java.lang.Math.pow(java.lang.Math.abs(basePos[0] - ai1[0]), 2D) + java.lang.Math.pow(java.lang.Math.abs(basePos[2] - ai1[2]), 2D));
-                    double d4 = d3 * field_874_i;
+                    double d3 = Math.sqrt(Math.pow(Math.abs(origin[0] - ai1[0]), 2D) + Math.pow(Math.abs(origin[2] - ai1[2]), 2D));
+                    double d4 = d3 * branchSlop;
                     if((double)ai1[1] - d4 > (double)l)
                     {
                         ai3[1] = l;
@@ -91,7 +107,7 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
                     {
                         ai3[1] = (int)((double)ai1[1] - d4);
                     }
-                    if(func_524_a(ai3, ai1) == -1)
+                    if(checkLine(ai3, ai1) == -1)
                     {
                         ai[k][0] = k1;
                         ai[k][1] = j;
@@ -105,15 +121,15 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
                 i1--;
             }
         }
-        field_868_o = new int[k][4];
-        System.arraycopy(ai, 0, field_868_o, 0, k);
+        foliageCoords = new int[k][4];
+        System.arraycopy(ai, 0, foliageCoords, 0, k);
     }
 
-    void placeLeaves(int i, int j, int k, float f, byte byte0, int l)
+    void crossSection(int i, int j, int k, float f, byte byte0, int l)
     {
         int i1 = (int)((double)f + 0.61799999999999999D);
-        byte byte1 = field_882_a[byte0];
-        byte byte2 = field_882_a[byte0 + 3];
+        byte byte1 = axisConversionArray[byte0];
+        byte byte2 = axisConversionArray[byte0 + 3];
         int[] ai = {
                 i, j, k
         };
@@ -128,20 +144,20 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
             ai1[byte1] = ai[byte1] + j1;
             for(int l1 = -i1; l1 <= i1;)
             {
-                double d = java.lang.Math.sqrt(java.lang.Math.pow((double) java.lang.Math.abs(j1) + 0.5D, 4D) + java.lang.Math.pow((double) java.lang.Math.abs(l1) + 0.5D, 4D));
+                double d = Math.sqrt(Math.pow((double) Math.abs(j1) + 0.5D, 4D) + Math.pow((double) Math.abs(l1) + 0.5D, 4D));
                 if(d > (double)f)
                 {
                     l1++;
                 } else
                 {
                     ai1[byte2] = ai[byte2] + l1;
-                    int i2 = worldObj.getBlockId(ai1[0], ai1[1], ai1[2]);
+                    int i2 = world.getBlockId(ai1[0], ai1[1], ai1[2]);
                     if(i2 != 0 && i2 != leavesID)
                     {
                         l1++;
                     } else
                     {
-                        worldObj.setBlockWithNotify(ai1[0], ai1[1], ai1[2], l);
+                        world.setBlockWithNotify(ai1[0], ai1[1], ai1[2], l);
                         l1++;
                     }
                 }
@@ -151,64 +167,63 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
 
     }
 
-    float func_528_a(int i)
+    float treeShape(int i)
     {
-        if((double)i < (double)(float)field_878_e * 0.29999999999999999D)
+        if((double)i < (double)(float) height * 0.3D)
         {
             return -1.618F;
         }
-        float f = (float)field_878_e / 2.0F;
-        float f1 = (float)field_878_e / 2.0F - (float)i;
+        float f = (float) height / 2.0F;
+        float f1 = (float) height / 2.0F - (float)i;
         float f2;
         if(f1 == 0.0F)
         {
             f2 = f;
         } else
-        if(java.lang.Math.abs(f1) >= f)
+        if(Math.abs(f1) >= f)
         {
             f2 = 0.0F;
         } else
         {
-            f2 = (float) java.lang.Math.sqrt(java.lang.Math.pow(java.lang.Math.abs(f), 2D) - java.lang.Math.pow(java.lang.Math.abs(f1), 2D));
+            f2 = (float) Math.sqrt(Math.pow(Math.abs(f), 2D) - Math.pow(Math.abs(f1), 2D));
         }
         f2 *= 0.5F;
         return f2;
     }
 
-    float func_526_b(int i)
+    float foliageShape(int i)
     {
-        if(i < 0 || i >= field_869_n)
+        if(i < 0 || i >= foliageHeight)
         {
             return -1F;
         }
-        return i != 0 && i != field_869_n - 1 ? 3F : 2.0F;
+        return i != 0 && i != foliageHeight - 1 ? 3F : 2.0F;
     }
 
-    void func_520_a(int i, int j, int k)
+    void foliageCluster(int x, int y, int z)
     {
-        int l = j;
-        for(int i1 = j + field_869_n; l < i1; l++)
+        int l = y;
+        for(int i1 = y + foliageHeight; l < i1; l++)
         {
-            float f = func_526_b(l - j);
-            placeLeaves(i, l, k, f, (byte)1, leavesID);
+            crossSection(x, l, z, foliageShape(l - y), (byte)1, leavesID);
         }
 
     }
 
-    void func_518_b()
+    void makeFoliage()
     {
         int i = 0;
-        for(int j = field_868_o.length; i < j; i++)
+        for(int j = foliageCoords.length; i < j; i++)
         {
-            int k = field_868_o[i][0];
-            int l = field_868_o[i][1];
-            int i1 = field_868_o[i][2];
-            func_520_a(k, l, i1);
+            int x = foliageCoords[i][0];
+            int y = foliageCoords[i][1];
+            int z = foliageCoords[i][2];
+            foliageCluster(x, y, z);
         }
 
     }
 
-    void placeWood(int ai[], int ai1[], int i)
+    void limb(int ai[], int ai1[], int i)
     {
         int ai2[] = {
                 0, 0, 0
@@ -218,7 +233,7 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
         for(; byte0 < 3; byte0++)
         {
             ai2[byte0] = ai1[byte0] - ai[byte0];
-            if(java.lang.Math.abs(ai2[byte0]) > java.lang.Math.abs(ai2[j]))
+            if(Math.abs(ai2[byte0]) > Math.abs(ai2[j]))
             {
                 j = byte0;
             }
@@ -228,8 +243,8 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
         {
             return;
         }
-        byte byte1 = field_882_a[j];
-        byte byte2 = field_882_a[j + 3];
+        byte byte1 = axisConversionArray[j];
+        byte byte2 = axisConversionArray[j + 3];
         byte byte3;
         if(ai2[j] > 0)
         {
@@ -246,80 +261,70 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
         int k = 0;
         for(int l = ai2[j] + byte3; k != l; k += byte3)
         {
-            ai3[j] = MathHelper.floor_double((double)(ai[j] + k) + 0.5D);
-            ai3[byte1] = MathHelper.floor_double((double)ai[byte1] + (double)k * d + 0.5D);
-            ai3[byte2] = MathHelper.floor_double((double)ai[byte2] + (double)k * d1 + 0.5D);
-            worldObj.setBlockWithNotify(ai3[0], ai3[1], ai3[2], i);
+            ai3[j] = MathHelper.floor((double)(ai[j] + k) + 0.5D);
+            ai3[byte1] = MathHelper.floor((double)ai[byte1] + (double)k * d + 0.5D);
+            ai3[byte2] = MathHelper.floor((double)ai[byte2] + (double)k * d1 + 0.5D);
+            world.setBlockWithNotify(ai3[0], ai3[1], ai3[2], i);
         }
 
     }
 
-    boolean func_527_c(int i)
+    boolean trimBranches(int i)
     {
-        return (double)i >= (double)field_878_e * 0.20000000000000001D;
+        return (double)i >= (double) height * 0.2D;
     }
 
-    void func_529_c()
+    void makeTrunk()
     {
-        int i = basePos[0];
-        int j = basePos[1];
-        int k = basePos[1] + height;
-        int l = basePos[2];
-        int ai[] = {
-                i, j, l
-        };
-        int ai1[] = {
-                i, k, l
-        };
-        placeWood(ai, ai1, logID);
-        if(field_871_l == 2)
-        {
-            ai[0]++;
-            ai1[0]++;
-            placeWood(ai, ai1, logID);
-            ai[2]++;
-            ai1[2]++;
-            placeWood(ai, ai1, logID);
-            ai[0]--;
-            ai1[0]--;
-            placeWood(ai, ai1, logID);
+        int x = origin[0];
+        int y = origin[1];
+        int yTop = origin[1] + trunkHeight;
+        int z = origin[2];
+        int[] posBottom = { x, y, z };
+        int[] posTop = { x, yTop, z };
+        limb(posBottom, posTop, logID);
+        if(trunkWidth == 2)
+        {
+            posBottom[0]++;
+            posTop[0]++;
+            limb(posBottom, posTop, logID);
+            posBottom[2]++;
+            posTop[2]++;
+            limb(posBottom, posTop, logID);
+            posBottom[0]--;
+            posTop[0]--;
+            limb(posBottom, posTop, logID);
         }
     }
 
-    void func_525_d()
+    void makeBranches()
     {
         int i = 0;
-        int j = field_868_o.length;
-        int ai[] = {
-                basePos[0], basePos[1], basePos[2]
-        };
+        int j = foliageCoords.length;
+        int[] ai = { origin[0], origin[1], origin[2] };
         for(; i < j; i++)
         {
-            int ai1[] = field_868_o[i];
-            int ai2[] = {
-                    ai1[0], ai1[1], ai1[2]
-            };
+            int[] ai1 = foliageCoords[i];
+            int[] ai2 = { ai1[0], ai1[1], ai1[2] };
             ai[1] = ai1[3];
-            int k = ai[1] - basePos[1];
-            if(func_527_c(k))
+            int k = ai[1] - origin[1];
+            if(trimBranches(k))
             {
-                placeWood(ai, ai2, logID);
+                limb(ai, ai2, logID);
             }
         }
 
     }
 
-    int func_524_a(int ai[], int ai1[])
+    int checkLine(int ai[], int ai1[])
     {
-        int ai2[] = {
-                0, 0, 0
-        };
+        int[] ai2 = { 0, 0, 0 };
         byte byte0 = 0;
         int i = 0;
         for(; byte0 < 3; byte0++)
         {
             ai2[byte0] = ai1[byte0] - ai[byte0];
-            if(java.lang.Math.abs(ai2[byte0]) > java.lang.Math.abs(ai2[i]))
+            if(Math.abs(ai2[byte0]) > Math.abs(ai2[i]))
             {
                 i = byte0;
             }
@@ -329,8 +334,8 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
         {
             return -1;
         }
-        byte byte1 = field_882_a[i];
-        byte byte2 = field_882_a[i + 3];
+        byte byte1 = axisConversionArray[i];
+        byte byte2 = axisConversionArray[i + 3];
         byte byte3;
         if(ai2[i] > 0)
         {
@@ -353,9 +358,9 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
                 break;
             }
             ai3[i] = ai[i] + j;
-            ai3[byte1] = MathHelper.floor_double((double)ai[byte1] + (double)j * d);
-            ai3[byte2] = MathHelper.floor_double((double)ai[byte2] + (double)j * d1);
-            int l = worldObj.getBlockId(ai3[0], ai3[1], ai3[2]);
+            ai3[byte1] = MathHelper.floor((double)ai[byte1] + (double)j * d);
+            ai3[byte2] = MathHelper.floor((double)ai[byte2] + (double)j * d1);
+            int l = world.getBlockId(ai3[0], ai3[1], ai3[2]);
             if(l != 0 && l != leavesID)
             {
                 break;
@@ -367,24 +372,24 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
             return -1;
         } else
         {
-            return java.lang.Math.abs(j);
+            return Math.abs(j);
         }
     }
 
-    boolean func_519_e()
+    boolean checkLocation()
     {
         int ai[] = {
-                basePos[0], basePos[1], basePos[2]
+                origin[0], origin[1], origin[2]
         };
         int ai1[] = {
-                basePos[0], (basePos[1] + field_878_e) - 1, basePos[2]
+                origin[0], (origin[1] + height) - 1, origin[2]
         };
-        int idBelow = worldObj.getBlockId(basePos[0], basePos[1] - 1, basePos[2]);
+        int idBelow = world.getBlockId(origin[0], origin[1] - 1, origin[2]);
         if(!Block.hasTag(idBelow, BlockTags.GROWS_TREES))
         {
             return false;
         }
-        int j = func_524_a(ai, ai1);
+        int j = checkLine(ai, ai1);
         if(j == -1)
         {
             return true;
@@ -394,68 +399,53 @@ public class WorldFeatureTreeEucalyptus extends WorldFeature
             return false;
         } else
         {
-            field_878_e = j;
+            height = j;
             return true;
         }
     }
 
     @Override
-	public void func_517_a(double d, double d1, double d2)
+	public void init(double d, double d1, double d2)
     {
-        field_870_m = (int)(d * 20D);
+        heightVariance = (int)(d * 20D);
         if(d > 0.5D)
         {
-            field_869_n = 5;
+            foliageHeight = 5;
         }
-        field_873_j = d1;
-        field_872_k = d2;
+        widthScale = d1;
+        foliageDensity = d2;
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        worldObj = world;
+        this.world = world;
         long l = random.nextLong();
-        field_881_b.setSeed(l);
-        basePos[0] = x;
-        basePos[1] = y;
-        basePos[2] = z;
-        if(field_878_e == 0)
+        this.random.setSeed(l);
+        origin[0] = x;
+        origin[1] = y;
+        origin[2] = z;
+        if(height == 0)
         {
-            field_878_e = 12 + field_881_b.nextInt(4);
+            height = 12 + this.random.nextInt(4);
         }
-        if(!func_519_e())
+        if(!checkLocation())
         {
             return false;
         } else
         {
-            WorldFeatureTree.onTreeGrown(worldObj, basePos[0], basePos[1], basePos[2]);
-            func_521_a();
-            func_518_b();
-            func_529_c();
-            func_525_d();
+            WorldFeatureTree.onTreeGrown(this.world, origin[0], origin[1], origin[2]);
+            prepare();
+            makeFoliage();
+            makeTrunk();
+            makeBranches();
             return true;
         }
     }
 
-    static final byte field_882_a[] = {
+    static final byte[] axisConversionArray = {
             2, 0, 0, 1, 2, 1
     };
-    Random field_881_b;
-    World worldObj;
-    int basePos[] = {
-            0, 0, 0
-    };
-    int field_878_e;
-    int height;
-    double field_876_g;
-    double field_875_h;
-    double field_874_i;
-    double field_873_j;
-    double field_872_k;
-    int field_871_l;
-    int field_870_m;
-    int field_869_n;
-    int field_868_o[][];
+
 
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
index fa853cf7c..846de0eef 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
@@ -17,22 +17,20 @@ public class WorldFeatureTreeFancy extends WorldFeature
 	protected int leavesID;
 	protected int logID;
 
-    static final byte[] dimensionLookup = {
-        2, 0, 0, 1, 2, 1
-    };
-    Random treeRand;
-    World worldObj;
-    int[] pos = { 0, 0, 0 };
+    static final byte[] axisConversionArray = { 2, 0, 0, 1, 2, 1 };
+    Random rnd;
+    World world;
+    int[] origin = { 0, 0, 0 };
     int height;
     int trunkHeight;
     double trunkHeightScale;
-    double field_875_h;
+    double branchDensity;
     double branchSlope;
-    double field_873_j;
-    double field_872_k;
-    int trunkThickness;
-    int trunkHeightVariance;
-    int leavesHeight;
+    double widthScale;
+    double foliageDensity;
+    int trunkWidth;
+    int heightVariance;
+    int foliageHeight;
     int[][] foliageCoords;
     int heightMod;
 
@@ -45,16 +43,16 @@ public class WorldFeatureTreeFancy extends WorldFeature
     @MethodParametersAnnotation(names = {"leavesID", "logID", "heightMod"})
     public WorldFeatureTreeFancy(int leavesID, int logID, int heightMod)
     {
-        treeRand = new Random();
+        rnd = new Random();
         height = 0;
         trunkHeightScale = 0.6D;
-        field_875_h = 1.0D;
+        branchDensity = 1.0D;
         branchSlope = 0.4D;
-        field_873_j = 1.0D;
-        field_872_k = 1.0D;
-        trunkThickness = 1;
-        trunkHeightVariance = 12;
-        leavesHeight = 4;
+        widthScale = 1.0D;
+        foliageDensity = 1.0D;
+        trunkWidth = 1;
+        heightVariance = 12;
+        foliageHeight = 4;
         this.leavesID = leavesID;
         this.logID = logID;
         this.heightMod = heightMod;
@@ -67,19 +65,19 @@ public class WorldFeatureTreeFancy extends WorldFeature
         {
             trunkHeight = height - 1;
         }
-        int numOfClustersPerY = (int)(1.4D + Math.pow((field_872_k * (double) height) / 13D, 2D));
+        int numOfClustersPerY = (int)(1.4D + Math.pow((foliageDensity * (double) height) / 13D, 2D));
         if (numOfClustersPerY < 1)
         {
             numOfClustersPerY = 1;
         }
         int[][] foliageCoords = new int[numOfClustersPerY * height][4];
-        int yEnd = (pos[1] + height) - leavesHeight;
+        int yEnd = (origin[1] + height) - foliageHeight;
         int foliageCoordsIndex = 1;
-        int topY = pos[1] + trunkHeight;
-        int y = yEnd - pos[1];
-        foliageCoords[0][0] = pos[0];
+        int topY = origin[1] + trunkHeight;
+        int y = yEnd - origin[1];
+        foliageCoords[0][0] = origin[0];
         foliageCoords[0][1] = yEnd;
-        foliageCoords[0][2] = pos[2];
+        foliageCoords[0][2] = origin[2];
         foliageCoords[0][3] = topY;
         yEnd--;
         while (y >= 0) {
@@ -90,17 +88,17 @@ public class WorldFeatureTreeFancy extends WorldFeature
             } else {
                 double offset = 0.5D;
                 for (int i = 0; i < numOfClustersPerY; i++) {
-                    double r = field_873_j * ((double)shapeFac * ((double) treeRand.nextFloat() + 0.328D));
-                    double theta = (double) treeRand.nextFloat() * 2D * Math.PI;
-                    int x = MathHelper.floor_double(r * Math.sin(theta) + (double) pos[0] + offset);
-                    int z = MathHelper.floor_double(r * Math.cos(theta) + (double) pos[2] + offset);
+                    double r = widthScale * ((double)shapeFac * ((double) rnd.nextFloat() + 0.328D));
+                    double theta = (double) rnd.nextFloat() * 2D * Math.PI;
+                    int x = MathHelper.floor(r * Math.sin(theta) + (double) origin[0] + offset);
+                    int z = MathHelper.floor(r * Math.cos(theta) + (double) origin[2] + offset);
                     int[] branchEnd = { x, yEnd, z };
-                    int[] branchTopOfTree = { x, yEnd + leavesHeight, z };
+                    int[] branchTopOfTree = { x, yEnd + foliageHeight, z };
                     if (distToMat(branchEnd, branchTopOfTree) != -1) {
                         continue;
                     }
-                    int[] branchStart = { pos[0], pos[1], pos[2] };
-                    double dist = Math.sqrt(Math.pow(Math.abs(pos[0] - branchEnd[0]), 2D) + Math.pow(Math.abs(pos[2] - branchEnd[2]), 2D));
+                    int[] branchStart = { origin[0], origin[1], origin[2] };
+                    double dist = Math.sqrt(Math.pow(Math.abs(origin[0] - branchEnd[0]), 2D) + Math.pow(Math.abs(origin[2] - branchEnd[2]), 2D));
                     if ((double)branchEnd[1] - dist * branchSlope > (double)topY) {
                         branchStart[1] = topY;
                     }
@@ -143,10 +141,10 @@ public class WorldFeatureTreeFancy extends WorldFeature
                 double thisDist = Math.sqrt(Math.pow((double) Math.abs(off1) + 0.5D, 2D) + Math.pow((double) Math.abs(off2) + 0.5D, 2D));
                 if(thisDist <= (double)radius)
                 {
-                    int id = worldObj.getBlockId(coord[0], coord[1], coord[2]);
+                    int id = world.getBlockId(coord[0], coord[1], coord[2]);
                     if (id == 0 || id == leavesID)
                     {
-                        worldObj.setBlockWithNotify(coord[0], coord[1], coord[2], blockId);
+                        world.setBlockWithNotify(coord[0], coord[1], coord[2], blockId);
                     }
                 }
             }
@@ -175,11 +173,11 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     float getFoliageShape(int y)
     {
-        if(y < 0 || y >= leavesHeight)
+        if(y < 0 || y >= foliageHeight)
         {
             return -1F;
         }
-        else if (y == 0 || y == leavesHeight - 1)
+        else if (y == 0 || y == foliageHeight - 1)
         {
             return 2F;
         }
@@ -191,7 +189,7 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     void foliageCluster(int x, int y, int z)
     {
-        for(int leavesY = y; leavesY < y + leavesHeight; leavesY++)
+        for(int leavesY = y; leavesY < y + foliageHeight; leavesY++)
         {
             float radius = getFoliageShape(leavesY - y);
             crossSection(x, leavesY, z, radius, leavesID);
@@ -230,8 +228,8 @@ public class WorldFeatureTreeFancy extends WorldFeature
         }
 
         // Look up other two dimensions
-        byte dim1 = dimensionLookup[dim0];
-        byte dim2 = dimensionLookup[dim0 + 3];
+        byte dim1 = axisConversionArray[dim0];
+        byte dim2 = axisConversionArray[dim0 + 3];
 
         byte delta;
         if(dimensions[dim0] > 0)
@@ -251,10 +249,10 @@ public class WorldFeatureTreeFancy extends WorldFeature
         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);
-            worldObj.setBlockWithNotify(pos[0], pos[1], pos[2], blockId);
+            pos[dim0] = MathHelper.floor((double)startPos[dim0] + (double)i + 0.5D);
+            pos[dim1] = MathHelper.floor((double)startPos[dim1] + (double)i * dim1DeltaScale + 0.5D);
+            pos[dim2] = MathHelper.floor((double)startPos[dim2] + (double)i * dim2DeltaScale + 0.5D);
+            world.setBlockWithNotify(pos[0], pos[1], pos[2], blockId);
         }
     }
 
@@ -265,14 +263,14 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     void makeTrunk()
     {
-        int x = pos[0];
-        int minY = pos[1];
-        int maxY = pos[1] + trunkHeight;
-        int z = pos[2];
+        int x = origin[0];
+        int minY = origin[1];
+        int maxY = origin[1] + trunkHeight;
+        int z = origin[2];
         int[] startPos = { x, minY, z };
         int[] endPos = { x, maxY, z };
         makeBranch(startPos, endPos, logID);
-        if(trunkThickness == 2)
+        if(trunkWidth == 2)
         {
             startPos[0]++;
             endPos[0]++;
@@ -288,12 +286,12 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     void makeBranches()
     {
-        int[] startPos = { pos[0], pos[1], pos[2] };
+        int[] startPos = { origin[0], origin[1], origin[2] };
         for (int[] branchPoint : foliageCoords)
         {
             int[] endPos = { branchPoint[0], branchPoint[1], branchPoint[2] };
             startPos[1] = branchPoint[3];
-            int dy = startPos[1] - pos[1];
+            int dy = startPos[1] - origin[1];
             if (isHighEnoughToBranch(dy))
             {
                 makeBranch(startPos, endPos, logID);
@@ -322,8 +320,8 @@ public class WorldFeatureTreeFancy extends WorldFeature
         }
 
         // Look up other two dimensions
-        byte dim1 = dimensionLookup[dim0];
-        byte dim2 = dimensionLookup[dim0 + 3];
+        byte dim1 = axisConversionArray[dim0];
+        byte dim2 = axisConversionArray[dim0 + 3];
 
         byte delta;
         if(dimensions[dim0] > 0)
@@ -346,9 +344,9 @@ public class WorldFeatureTreeFancy extends WorldFeature
         {
             int[] pos = { 0, 0, 0 };
             pos[dim0] = startPos[dim0] + linePos;
-            pos[dim1] = MathHelper.floor_double((double)startPos[dim1] + (double)linePos * dim1DeltaScale);
-            pos[dim2] = MathHelper.floor_double((double)startPos[dim2] + (double)linePos * dim2DeltaScale);
-            int idAtPos = worldObj.getBlockId(pos[0], pos[1], pos[2]);
+            pos[dim1] = MathHelper.floor((double)startPos[dim1] + (double)linePos * dim1DeltaScale);
+            pos[dim2] = MathHelper.floor((double)startPos[dim2] + (double)linePos * dim2DeltaScale);
+            int idAtPos = world.getBlockId(pos[0], pos[1], pos[2]);
             if(idAtPos != 0 && idAtPos != leavesID)
             {
                 break;
@@ -369,9 +367,9 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     boolean canGenerateTree()
     {
-        int[] bottomPos = { pos[0], pos[1], pos[2] };
-        int[] topPos = { pos[0], (pos[1] + height) - 1, pos[2] };
-        int blockIdUnderneath = worldObj.getBlockId(pos[0], pos[1] - 1, pos[2]);
+        int[] bottomPos = { origin[0], origin[1], origin[2] };
+        int[] topPos = { origin[0], (origin[1] + height) - 1, origin[2] };
+        int blockIdUnderneath = world.getBlockId(origin[0], origin[1] - 1, origin[2]);
         if(!Block.hasTag(blockIdUnderneath, BlockTags.GROWS_TREES))
         {
             return false;
@@ -393,33 +391,33 @@ public class WorldFeatureTreeFancy extends WorldFeature
     }
 
     @Override
-	public void func_517_a(double d, double d1, double d2)
+	public void init(double d, double d1, double d2)
     {
-        trunkHeightVariance = (int)(d * (12D + heightMod));
+        heightVariance = (int)(d * (12D + heightMod));
         if(d > 0.5D)
         {
-            leavesHeight = 5;
+            foliageHeight = 5;
         }
-        field_873_j = d1;
-        field_872_k = d2;
+        widthScale = d1;
+        foliageDensity = d2;
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
-        worldObj = world;
+        this.world = world;
         long seed = random.nextLong();
-        treeRand.setSeed(seed);
-        pos[0] = x;
-        pos[1] = y;
-        pos[2] = z;
+        rnd.setSeed(seed);
+        origin[0] = x;
+        origin[1] = y;
+        origin[2] = z;
         if(height == 0)
         {
-            height = 5 + treeRand.nextInt(trunkHeightVariance);
+            height = 5 + rnd.nextInt(heightVariance);
         }
         if(canGenerateTree())
         {
-            WorldFeatureTree.onTreeGrown(worldObj, pos[0], pos[1], pos[2]);
+            WorldFeatureTree.onTreeGrown(this.world, origin[0], origin[1], origin[2]);
             prepare();
             makeFoliage();
             makeTrunk();
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancyRainforest.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancyRainforest.java
index 3456bdc86..e5c5d7cb6 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancyRainforest.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancyRainforest.java
@@ -88,8 +88,8 @@ public class WorldFeatureTreeFancyRainforest extends WorldFeature
                 {
                     double d1 = field_873_j * ((double)f * ((double)treeRand.nextFloat() + 0.32800000000000001D));
                     double d2 = (double)treeRand.nextFloat() * 2D * 3.1415899999999999D;
-                    int k1 = MathHelper.floor_double(d1 * java.lang.Math.sin(d2) + (double)basePos[0] + d);
-                    int l1 = MathHelper.floor_double(d1 * java.lang.Math.cos(d2) + (double)basePos[2] + d);
+                    int k1 = MathHelper.floor(d1 * java.lang.Math.sin(d2) + (double)basePos[0] + d);
+                    int l1 = MathHelper.floor(d1 * java.lang.Math.cos(d2) + (double)basePos[2] + d);
                     int ai1[] = {
                         k1, j, l1
                     };
@@ -280,9 +280,9 @@ public class WorldFeatureTreeFancyRainforest extends WorldFeature
         int k = 0;
         for(int l = ai2[j] + byte3; k != l; k += byte3)
         {
-            ai3[j] = MathHelper.floor_double((double)(ai[j] + k) + 0.5D);
-            ai3[byte1] = MathHelper.floor_double((double)ai[byte1] + (double)k * d + 0.5D);
-            ai3[byte2] = MathHelper.floor_double((double)ai[byte2] + (double)k * d1 + 0.5D);
+            ai3[j] = MathHelper.floor((double)(ai[j] + k) + 0.5D);
+            ai3[byte1] = MathHelper.floor((double)ai[byte1] + (double)k * d + 0.5D);
+            ai3[byte2] = MathHelper.floor((double)ai[byte2] + (double)k * d1 + 0.5D);
             worldObj.setBlockWithNotify(ai3[0], ai3[1], ai3[2], i);
         }
 
@@ -387,8 +387,8 @@ public class WorldFeatureTreeFancyRainforest extends WorldFeature
                 break;
             }
             ai3[i] = ai[i] + j;
-            ai3[byte1] = MathHelper.floor_double((double)ai[byte1] + (double)j * d);
-            ai3[byte2] = MathHelper.floor_double((double)ai[byte2] + (double)j * d1);
+            ai3[byte1] = MathHelper.floor((double)ai[byte1] + (double)j * d);
+            ai3[byte2] = MathHelper.floor((double)ai[byte2] + (double)j * d1);
             int l = worldObj.getBlockId(ai3[0], ai3[1], ai3[2]);
             if(l != 0 && l != leavesID)
             {
@@ -435,7 +435,7 @@ public class WorldFeatureTreeFancyRainforest extends WorldFeature
     }
 
     @Override
-	public void func_517_a(double d, double d1, double d2)
+	public void init(double d, double d1, double d2)
     {
         field_870_m = (int)(d * (12D+heightMod));
         if(d > 0.5D)
@@ -447,7 +447,7 @@ public class WorldFeatureTreeFancyRainforest extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         worldObj = world;
         long l = random.nextLong();
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreePalm.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreePalm.java
index 70641d5bc..648ddfb28 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreePalm.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreePalm.java
@@ -1,9 +1,10 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFlower;
-import net.minecraft.core.block.BlockLeavesBase;
-import net.minecraft.core.block.BlockLog;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.FlowerBlock;
+import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.block.LogBlock;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.MathHelper;
@@ -61,7 +62,7 @@ public class WorldFeatureTreePalm extends WorldFeature {
 	}
 
 	@Override
-	public boolean generate(World world, Random random, int x, int y, int z) {
+	public boolean place(World world, Random random, int x, int y, int z) {
 		this.world = world;
 		this.random = random;
 		this.basePos = new ChunkPosition(x, y, z);
@@ -110,7 +111,7 @@ public class WorldFeatureTreePalm extends WorldFeature {
 		// Generate all log block positions
 		for(int i=0; i < height; i++) {
 			float yFactor = i / (float) height;
-			int offset = MathHelper.floor_double(Math.pow(yFactor, angle + 1.0f) * bend);
+			int offset = MathHelper.floor(Math.pow(yFactor, angle + 1.0f) * bend);
 			
 			int offsetX = direction.getOffsetX() * offset;
 			int offsetY = i;
@@ -176,13 +177,13 @@ public class WorldFeatureTreePalm extends WorldFeature {
 		Block block = Block.getBlock(id);
 		
 		// TODO Create BlockTag and apply to all trees
-		if(block instanceof BlockLog) {
+		if(block instanceof LogBlock) {
 			return true;
 		}
-		if(block instanceof BlockLeavesBase) {
+		if(block instanceof BaseLeavesBlock) {
 			return true;
 		}
-		if(block instanceof BlockFlower) {
+		if(block instanceof FlowerBlock) {
 			return true;
 		}
 		return false;
@@ -331,7 +332,7 @@ public class WorldFeatureTreePalm extends WorldFeature {
 	}
 	
 	public boolean canGrowOnThisBlock(int id, int x, int y, int z) {
-		return Block.hasTag(id, BlockTags.GROWS_TREES) || (id == Block.sand.id && waterNearby(x, y, z));
+		return Block.hasTag(id, BlockTags.GROWS_TREES) || (id == Blocks.SAND.id && waterNearby(x, y, z));
 	}
 	
 	public static int encode(int x, int y, int z) {
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShapeSwamp.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShapeSwamp.java
index f8993efec..ab52ab5ad 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShapeSwamp.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShapeSwamp.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -11,7 +12,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves,
-//            BlockGrass
+//            GrassBlock
 
 public class WorldFeatureTreeShapeSwamp extends WorldFeature
 {
@@ -28,7 +29,7 @@ public class WorldFeatureTreeShapeSwamp extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int trunkLength = random.nextInt(4) + heightMod;
         boolean flag = true;
@@ -73,7 +74,7 @@ public class WorldFeatureTreeShapeSwamp extends WorldFeature
             return false;
         }
         int sinkToFloor = 0;
-        for(; world.getBlockId(x, (y -sinkToFloor)-1, z)==Block.fluidWaterStill.id; sinkToFloor++) {
+        for(; world.getBlockId(x, (y -sinkToFloor)-1, z)==Blocks.FLUID_WATER_STILL.id; sinkToFloor++) {
 
             if (sinkToFloor > 3)
                 return false;
@@ -86,7 +87,7 @@ public class WorldFeatureTreeShapeSwamp extends WorldFeature
             return false;
         }
         WorldFeatureTree.onTreeGrown(world, x, y, z);
-        world.setBlockWithNotify(x, y - 1, z, Block.dirt.id);
+        world.setBlockWithNotify(x, y - 1, z, Blocks.DIRT.id);
         for(int k1 = (y - 3) + trunkLength + sinkToFloor; k1 <= y + trunkLength + sinkToFloor; k1++)
         {
             int j2 = k1 - (y + trunkLength + sinkToFloor);
@@ -121,13 +122,13 @@ public class WorldFeatureTreeShapeSwamp extends WorldFeature
         for(int l1 = 0; l1 < trunkLength + sinkToFloor; l1++)
         {
             int k2 = world.getBlockId(x, y + l1, z);
-            if(k2 == 0 || k2 == leavesID || k2 == Block.fluidWaterStill.id || k2 == Block.fluidWaterFlowing.id)
+            if(k2 == 0 || k2 == leavesID || k2 == Blocks.FLUID_WATER_STILL.id || k2 == Blocks.FLUID_WATER_FLOWING.id)
             {
                 world.setBlockWithNotify(x, y + l1, z, logID);
             }
         }
 
-        (new WorldFeatureAlgae()).generate(world, treeRand, x, oldY-1, z);
+        (new WorldFeatureAlgae()).place(world, treeRand, x, oldY-1, z);
 
         return true;
     }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShrub.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShrub.java
index 0f212cbba..19969007d 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShrub.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeShrub.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -11,7 +12,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves,
-//            BlockGrass
+//            GrassBlock
 
 public class WorldFeatureTreeShrub extends WorldFeature
 {
@@ -27,7 +28,7 @@ public class WorldFeatureTreeShrub extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int maxHeight = 1;
         boolean flag = true;
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaBushy.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaBushy.java
index 70bea77a4..69498f366 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaBushy.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaBushy.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -10,7 +11,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves, 
-//            BlockGrass
+//            GrassBlock
 
 public class WorldFeatureTreeTaigaBushy extends WorldFeature
 {
@@ -25,7 +26,7 @@ public class WorldFeatureTreeTaigaBushy extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int heightMod = random.nextInt(2) + 10;
         int l = random.nextInt(4) + heightMod;
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaTall.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaTall.java
index 9e6dfc7bf..a226aed51 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaTall.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTaigaTall.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -10,7 +11,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves, 
-//            BlockGrass
+//            GrassBlock
 
 public class WorldFeatureTreeTaigaTall extends WorldFeature
 {
@@ -24,7 +25,7 @@ public class WorldFeatureTreeTaigaTall extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int l = random.nextInt(5) + 7;
         int i1 = l - random.nextInt(2) - 3;
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTall.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTall.java
index ffcec1a3b..7f5e71352 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTall.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeTall.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -10,7 +11,7 @@ import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            WorldGenerator, World, Block, BlockLeaves,
-//            BlockGrass
+//            GrassBlock
 
 public class WorldFeatureTreeTall extends WorldFeature
 {
@@ -25,7 +26,7 @@ public class WorldFeatureTreeTall extends WorldFeature
     }
 
     @Override
-	public boolean generate(World world, Random random, int x, int y, int z)
+	public boolean place(World world, Random random, int x, int y, int z)
     {
         int trunkHeight = random.nextInt(5) + 10;
         boolean flag = true;
@@ -136,7 +137,7 @@ public class WorldFeatureTreeTall extends WorldFeature
                     world.setBlockAndMetadataWithNotify(x + xOffset, y + yOffset, z + zOffset, logID, onXAxis? 2 : 1);
                     if(random.nextInt(10)==0){
                         if(world.getBlockId(x + xOffset, y + yOffset+1, z + zOffset)==0)
-                            world.setBlockWithNotify(x + xOffset, y + yOffset+1, z + zOffset, Block.mushroomBrown.id);
+                            world.setBlockWithNotify(x + xOffset, y + yOffset+1, z + zOffset, Blocks.MUSHROOM_BROWN.id);
                     }
             }
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java
index 9e14f2184..7fabb3cb3 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.generate.feature.tree.spooner;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.generate.feature.MethodParametersAnnotation;
@@ -121,7 +122,7 @@ public abstract class WorldFeatureSpoonerTree
     }
 
     @Override
-    public boolean generate(World world, Random random, int x, int y, int z) {
+    public boolean place(World world, Random random, int x, int y, int z) {
         this.random = random;
         this.pos = new int[] { x, y, z };
 
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java
index 4fb1cc92a..2e2361485 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java
@@ -28,7 +28,7 @@ public abstract class WorldFeatureSpoonerTreeProcedural
     }
 
     protected void crossSection(int[] center, double radius, int dirAxis, int id, int data, World world) {
-        int rad = MathHelper.floor_double(radius + 0.618);
+        int rad = MathHelper.floor(radius + 0.618);
         int secidx1 = (dirAxis + 1) % 3;
         int secidx2 = (dirAxis + 2) % 3;
         int[] coord = new int[3];
diff --git a/src/main/java/net/minecraft/core/world/pathfinder/IdHashMap.java b/src/main/java/net/minecraft/core/world/pathfinder/IdHashMap.java
deleted file mode 100644
index 32f718c54..000000000
--- a/src/main/java/net/minecraft/core/world/pathfinder/IdHashMap.java
+++ /dev/null
@@ -1,235 +0,0 @@
-package net.minecraft.core.world.pathfinder;
-
-public class IdHashMap<T> {
-    private transient Entry<T>[] entries;
-    private transient int count;
-    private int threshold;
-    private final float growFactor = 0.75F;
-    private volatile transient int versionStamp;
-
-    public IdHashMap()
-    {
-        threshold = 12;
-        entries = new Entry[16];
-    }
-
-    private static int getHash(int i)
-    {
-        i ^= i >>> 20 ^ i >>> 12;
-        return i ^ i >>> 7 ^ i >>> 4;
-    }
-
-    private static int getEntryIndex(int i, int j)
-    {
-        return i & j - 1;
-    }
-
-    public T get(int id)
-    {
-        int j = getHash(id);
-        for(Entry<T> mchashentry = entries[getEntryIndex(j, entries.length)]; mchashentry != null; mchashentry = mchashentry.next)
-        {
-            if(mchashentry.hash == id)
-            {
-                return mchashentry.value;
-            }
-        }
-
-        return null;
-    }
-    
-    public boolean containsItem(int i)
-    {
-        return lookupEntry(i) != null;
-    }
-
-    final Entry<T> lookupEntry(int i)
-    {
-        int j = getHash(i);
-        for(Entry<T> mchashentry = entries[getEntryIndex(j, entries.length)]; mchashentry != null; mchashentry = mchashentry.next)
-        {
-            if(mchashentry.hash == i)
-            {
-                return mchashentry;
-            }
-        }
-
-        return null;
-    }
-
-
-    public void add(int key, T item)
-    {
-        int j = getHash(key);
-        int k = getEntryIndex(j, entries.length);
-        for(Entry<T> mchashentry = entries[k]; mchashentry != null; mchashentry = mchashentry.next)
-        {
-            if(mchashentry.hash == key)
-            {
-                mchashentry.value = item;
-            }
-        }
-
-        versionStamp++;
-        insert(j, key, item, k);
-    }
-
-    private void grow(int i)
-    {
-        Entry<T>[] amchashentry = entries;
-        int j = amchashentry.length;
-        if(j == 0x40000000)
-        {
-            threshold = 0x7fffffff;
-            return;
-        } else
-        {
-            Entry<T>[] amchashentry1 = new Entry[i];
-            copy(amchashentry1);
-            entries = amchashentry1;
-            threshold = (int)((float)i * growFactor);
-            return;
-        }
-    }
-
-    private void copy(Entry<T>[] amchashentry)
-    {
-        Entry<T>[] amchashentry1 = entries;
-        int i = amchashentry.length;
-        for(int j = 0; j < amchashentry1.length; j++)
-        {
-            Entry<T> mchashentry = amchashentry1[j];
-            if(mchashentry == null)
-            {
-                continue;
-            }
-            amchashentry1[j] = null;
-            do
-            {
-                Entry<T> mchashentry1 = mchashentry.next;
-                int k = getEntryIndex(mchashentry.entryIndex, i);
-                mchashentry.next = amchashentry[k];
-                amchashentry[k] = mchashentry;
-                mchashentry = mchashentry1;
-            } while(mchashentry != null);
-        }
-
-    }
-
-    public T remove(int id)
-    {
-        Entry<T> mchashentry = removeEntry(id);
-        return mchashentry != null ? mchashentry.value : null;
-    }
-
-    final Entry<T> removeEntry(int id)
-    {
-        int j = getHash(id);
-        int k = getEntryIndex(j, entries.length);
-        Entry<T> mchashentry = entries[k];
-        Entry<T> mchashentry1;
-        Entry<T> mchashentry2;
-        for(mchashentry1 = mchashentry; mchashentry1 != null; mchashentry1 = mchashentry2)
-        {
-            mchashentry2 = mchashentry1.next;
-            if(mchashentry1.hash == id)
-            {
-                versionStamp++;
-                count--;
-                if(mchashentry == mchashentry1)
-                {
-                    entries[k] = mchashentry2;
-                } else
-                {
-                    mchashentry.next = mchashentry2;
-                }
-                return mchashentry1;
-            }
-            mchashentry = mchashentry1;
-        }
-
-        return mchashentry1;
-    }
-
-    public void clear()
-    {
-        versionStamp++;
-        Entry<T>[] amchashentry = entries;
-        for(int i = 0; i < amchashentry.length; i++)
-        {
-            amchashentry[i] = null;
-        }
-
-        count = 0;
-    }
-
-    private void insert(int i, int j, T obj, int k)
-    {
-        Entry<T> mchashentry = entries[k];
-        entries[k] = new Entry<>(i, j, obj, mchashentry);
-        if(count++ >= threshold)
-        {
-            grow(2 * entries.length);
-        }
-    }
-
-    static class Entry<T> {
-        final int hash;
-        T value;
-        Entry<T> next;
-        final int entryIndex;
-
-        Entry(int entryIndex, int hash, T value, Entry<T> next)
-        {
-            this.value = value;
-            this.next = next;
-            this.hash = hash;
-            this.entryIndex = entryIndex;
-        }
-
-        public final int getHash()
-        {
-            return hash;
-        }
-
-        public final Object getValue()
-        {
-            return value;
-        }
-
-        @Override
-        public final boolean equals(Object that)
-        {
-            if(!(that instanceof Entry))
-            {
-                return false;
-            }
-            Entry entry = (Entry)that;
-            Integer integer = this.getHash();
-            Integer integer1 = entry.getHash();
-            if(integer == integer1 || integer != null && integer.equals(integer1))
-            {
-                Object obj1 = this.getValue();
-                Object obj2 = entry.getValue();
-                if(obj1 == obj2 || obj1 != null && obj1.equals(obj2))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public final int hashCode()
-        {
-            return IdHashMap.getHash(hash);
-        }
-
-        @Override
-        public final String toString()
-        {
-            return getHash() + "=" + getValue();
-        }
-    }
-
-}
diff --git a/src/main/java/net/minecraft/core/world/pathfinder/Path.java b/src/main/java/net/minecraft/core/world/pathfinder/Path.java
index 5105dd4de..1de15536f 100644
--- a/src/main/java/net/minecraft/core/world/pathfinder/Path.java
+++ b/src/main/java/net/minecraft/core/world/pathfinder/Path.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.pathfinder;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 
 public class Path
 {
@@ -37,11 +37,11 @@ public class Path
         }
     }
 
-    public Vec3d getPos(Entity entity)
+    public Vec3 getPos(Entity entity)
     {
         double x = (double) nodes[index].x + (double)(int)(entity.bbWidth + 2.0F) * 0.5D;
         double y = nodes[index].y;
         double z = (double) nodes[index].z + (double)(int)(entity.bbWidth + 2.0F) * 0.5D;
-        return Vec3d.createVector(x, y, z);
+        return Vec3.getTempVec3(x, y, z);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/pathfinder/PathFinder.java b/src/main/java/net/minecraft/core/world/pathfinder/PathFinder.java
index ecafc696f..da45714df 100644
--- a/src/main/java/net/minecraft/core/world/pathfinder/PathFinder.java
+++ b/src/main/java/net/minecraft/core/world/pathfinder/PathFinder.java
@@ -1,9 +1,10 @@
 package net.minecraft.core.world.pathfinder;
 
+import net.minecraft.core.block.DoorBlock;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockDoor;
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.util.collection.IntHashMap;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.WorldSource;
 
@@ -11,13 +12,13 @@ public class PathFinder
 {
     private final WorldSource worldSource;
     private final BinaryHeap openSet;
-    private final IdHashMap<Node> closedSet;
+    private final IntHashMap<Node> closedSet;
     private final Node[] neighbors;
 
     public PathFinder(WorldSource worldSource)
     {
         openSet = new BinaryHeap();
-        closedSet = new IdHashMap<>();
+        closedSet = new IntHashMap<>();
         neighbors = new Node[32];
         this.worldSource = worldSource;
     }
@@ -36,8 +37,8 @@ public class PathFinder
     {
         openSet.clear();
         closedSet.clear();
-        Node pathpoint = getNode(MathHelper.floor_double(entity.bb.minX), MathHelper.floor_double(entity.bb.minY), MathHelper.floor_double(entity.bb.minZ));
-        Node pathpoint1 = getNode(MathHelper.floor_double(xt - (double)(entity.bbWidth / 2.0F)), MathHelper.floor_double(yt), MathHelper.floor_double(zt - (double)(entity.bbWidth / 2.0F)));
+        Node pathpoint = getNode(MathHelper.floor(entity.bb.minX), MathHelper.floor(entity.bb.minY), MathHelper.floor(entity.bb.minZ));
+        Node pathpoint1 = getNode(MathHelper.floor(xt - (double)(entity.bbWidth / 2.0F)), MathHelper.floor(yt), MathHelper.floor(zt - (double)(entity.bbWidth / 2.0F)));
         Node pathpoint2 = new Node(MathHelper.floor_float(entity.bbWidth + 1.0F), MathHelper.floor_float(entity.bbHeight + 1.0F), MathHelper.floor_float(entity.bbWidth + 1.0F));
         Path pathentity = findPath(entity, pathpoint, pathpoint1, pathpoint2, distance);
         return pathentity;
@@ -172,7 +173,7 @@ public class PathFinder
         if(pathpoint == null)
         {
             pathpoint = new Node(x, y, z);
-            closedSet.add(l, pathpoint);
+            closedSet.put(l, pathpoint);
         }
         return pathpoint;
     }
@@ -190,10 +191,10 @@ public class PathFinder
                     {
                         continue;
                     }
-                    if(Block.blocksList[k1] instanceof BlockDoor)
+                    if(Block.blocksList[k1] instanceof DoorBlock)
                     {
                         int l1 = worldSource.getBlockMetadata(x1, y1, z1);
-                        if(!BlockDoor.isOpen(l1))
+                        if(!DoorBlock.isOpen(l1))
                         {
                             return 0;
                         }
diff --git a/src/main/java/net/minecraft/core/world/save/DimensionData.java b/src/main/java/net/minecraft/core/world/save/DimensionData.java
index 1123f25bd..6cebaa0c3 100644
--- a/src/main/java/net/minecraft/core/world/save/DimensionData.java
+++ b/src/main/java/net/minecraft/core/world/save/DimensionData.java
@@ -9,6 +9,7 @@ import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.type.WorldType;
 import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 import java.io.File;
 import java.io.IOException;
@@ -137,7 +138,7 @@ public class DimensionData
 
     public Weather getCurrentWeather()
     {
-        return Weather.getWeather(weatherCurrentId);
+        return Weathers.getWeather(weatherCurrentId);
     }
 
     public void setCurrentWeather(Weather weather)
@@ -148,7 +149,7 @@ public class DimensionData
     public Weather getNextWeather()
     {
         if (weatherNextId == -1) return null;
-        return Weather.getWeather(weatherNextId);
+        return Weathers.getWeather(weatherNextId);
     }
 
     public void setNextWeather(Weather weather)
diff --git a/src/main/java/net/minecraft/core/world/save/IdKeyTable.java b/src/main/java/net/minecraft/core/world/save/IdKeyTable.java
deleted file mode 100644
index 9f25571ae..000000000
--- a/src/main/java/net/minecraft/core/world/save/IdKeyTable.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package net.minecraft.core.world.save;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.item.Item;
-import com.mojang.nbt.Tag;
-import com.mojang.nbt.CompoundTag;
-import com.mojang.nbt.ListTag;
-import com.mojang.nbt.StringTag;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.util.*;
-
-public class IdKeyTable
-{
-    protected final Map<String, Integer> keyIdMap = new HashMap<>();
-    protected final Map<Integer, String> idKeyMap = new HashMap<>();
-    protected byte[] hash;
-
-    public IdKeyTable()
-    {
-        for (int i = 0; i <= Block.highestBlockId; i++)
-        {
-            Block block = Block.blocksList[i];
-            if (block != null)
-            {
-                keyIdMap.put(block.getKey(), block.id);
-                idKeyMap.put(block.id, block.getKey());
-            }
-        }
-        for (int i = Block.highestBlockId + 1; i < Item.highestItemId; i++)
-        {
-            Item item = Item.itemsList[i];
-            if (item != null)
-            {
-                keyIdMap.put(item.getKey(), item.id);
-            }
-        }
-
-        // Calculate hash
-        hash = calculateHash();
-    }
-
-    public IdKeyTable(CompoundTag tagBlockTable)
-    {
-        ListTag tagTable = tagBlockTable.getListOrDefault("Table", null);
-        if (tagTable == null)
-        {
-            throw new IllegalArgumentException("BlockKeyTable had no list!");
-        }
-        if (tagTable.getId() != new StringTag().getId())
-        {
-            throw new IllegalArgumentException("BlockKeyTable.Table was not of type String!");
-        }
-        for (int i = 0; i < tagTable.tagCount(); i++)
-        {
-            Tag<?> idTag = tagTable.tagAt(i);
-            if (idTag instanceof StringTag)
-            {
-                String key = ((StringTag) idTag).getValue();
-                idKeyMap.put(i, key);
-                keyIdMap.put(key, i);
-            }
-        }
-
-        this.hash = tagBlockTable.getByteArrayOrDefault("TableHash", null);
-        if (this.hash == null || this.hash.length != 16)
-        {
-            System.out.println("WARNING: Block ID to Key Map has no/invalid hash code. Regenerating...");
-            hash = calculateHash();
-        }
-    }
-
-    public int getIDByKey(String key)
-    {
-        if (!keyIdMap.containsKey(key))
-        {
-            return -1;
-        }
-
-        return keyIdMap.get(key);
-    }
-
-    public String getKeyById(int id)
-    {
-        if (!idKeyMap.containsKey(id))
-        {
-            return null;
-        }
-
-        return idKeyMap.get(id);
-    }
-
-    protected byte[] calculateHash()
-    {
-        StringBuilder sb = new StringBuilder();
-        for (int id : idKeyMap.keySet())
-        {
-            sb.append(id);
-            sb.append(idKeyMap.get(id));
-        }
-        String concatenated = sb.toString();
-
-        MessageDigest digest;
-        try
-        {
-            digest = MessageDigest.getInstance("MD5");
-        }
-        catch (Exception e)
-        {
-            e.printStackTrace();
-            return null;
-        }
-        return digest.digest(concatenated.getBytes(StandardCharsets.UTF_8));
-    }
-
-    public CompoundTag writeToCompoundTag()
-    {
-        CompoundTag tag = new CompoundTag();
-        tag.putByteArray("TableHash", hash);
-        ListTag list = new ListTag();
-        List<Integer> idList = new ArrayList<>(idKeyMap.keySet());
-        Collections.sort(idList);
-        for (int id : idList)
-        {
-            list.addTag(new StringTag(idKeyMap.get(id)));
-        }
-        tag.putList("Table", list);
-
-        return tag;
-    }
-
-    public static boolean areMapsIdentical(IdKeyTable mapA, IdKeyTable mapB)
-    {
-        return Arrays.equals(mapA.hash, mapB.hash);
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/save/IdKeyTableCustom.java b/src/main/java/net/minecraft/core/world/save/IdKeyTableCustom.java
deleted file mode 100644
index 82e930b07..000000000
--- a/src/main/java/net/minecraft/core/world/save/IdKeyTableCustom.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package net.minecraft.core.world.save;
-
-import net.minecraft.core.world.save.IdKeyTable;
-
-public class IdKeyTableCustom extends IdKeyTable
-{
-    public IdKeyTableCustom()
-    {
-    }
-
-    public void addEntry(int id, String key)
-    {
-        idKeyMap.put(id, key);
-        keyIdMap.put(key, id);
-    }
-
-    public void updateHash()
-    {
-        hash = calculateHash();
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/save/LevelData.java b/src/main/java/net/minecraft/core/world/save/LevelData.java
index e6eb9de10..e8b96c26b 100644
--- a/src/main/java/net/minecraft/core/world/save/LevelData.java
+++ b/src/main/java/net/minecraft/core/world/save/LevelData.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.save;
 
 import net.minecraft.core.data.gamerule.GameRuleCollection;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.NbtIo;
 
@@ -11,7 +11,7 @@ import java.nio.file.Files;
 import java.util.List;
 
 // Referenced classes of package net.minecraft.src:
-//            NBTTagCompound, EntityPlayer
+//            NBTTagCompound, Player
 
 public class LevelData
 {
@@ -100,10 +100,10 @@ public class LevelData
         return nbttagcompound;
     }
 
-    public CompoundTag getNBTTagCompoundWithPlayer(List<EntityPlayer> list)
+    public CompoundTag getNBTTagCompoundWithPlayer(List<Player> list)
     {
         CompoundTag nbttagcompound = new CompoundTag();
-        EntityPlayer entityplayer = null;
+        Player entityplayer = null;
         CompoundTag nbttagcompound1 = null;
         if(list.size() > 0)
         {
diff --git a/src/main/java/net/minecraft/core/world/save/LevelStorage.java b/src/main/java/net/minecraft/core/world/save/LevelStorage.java
index 017c560c8..9cf4b34df 100644
--- a/src/main/java/net/minecraft/core/world/save/LevelStorage.java
+++ b/src/main/java/net/minecraft/core/world/save/LevelStorage.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.save;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.Dimension;
@@ -38,7 +38,7 @@ public interface LevelStorage
 	 * @param levelData The level data to save.
 	 * @param playerList A list of players whose data should be saved.
 	 */
-	void saveLevelDataAndPlayerData(LevelData levelData, List<EntityPlayer> playerList);
+	void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList);
 
 	/**
 	 * Saves the level data.
diff --git a/src/main/java/net/minecraft/core/world/save/PlayerIO.java b/src/main/java/net/minecraft/core/world/save/PlayerIO.java
index ebe0a700d..64496b8ce 100644
--- a/src/main/java/net/minecraft/core/world/save/PlayerIO.java
+++ b/src/main/java/net/minecraft/core/world/save/PlayerIO.java
@@ -1,11 +1,11 @@
 package net.minecraft.core.world.save;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 
 public interface PlayerIO
 {
 
-    void save(EntityPlayer player);
+    void save(Player player);
 
-    void load(EntityPlayer player);
+    void load(Player player);
 }
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
index cee6cd4ee..cfb4e6793 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.world.save;
 
 import net.minecraft.core.MinecraftException;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.NbtIo;
 import net.minecraft.core.world.Dimension;
@@ -115,7 +115,7 @@ public abstract class SaveHandlerBase implements LevelStorage
 	}
 
 	@Override
-	public void saveLevelDataAndPlayerData(LevelData levelData, List<EntityPlayer> playerList)
+	public void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList)
 	{
 		CompoundTag nbttagcompound = levelData.getNBTTagCompoundWithPlayer(playerList);
 		CompoundTag nbttagcompound1 = new CompoundTag();
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java
index 56454ca38..cc5a3778c 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.save;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.Dimension;
@@ -53,7 +53,7 @@ public class SaveHandlerClientMP
 	}
 
 	@Override
-	public void saveLevelDataAndPlayerData(LevelData levelData, List<EntityPlayer> playerList)
+	public void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList)
 	{
 		
 	}
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java
index a202f2ab2..b345ef62e 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java
@@ -1,10 +1,9 @@
 package net.minecraft.core.world.save;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.chunk.ChunkLoaderRegionAsync;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.chunk.ChunkLoaderRegion;
 
 import java.io.File;
 import java.util.List;
@@ -28,7 +27,7 @@ public class SaveHandlerClientSP
     }
 
     @Override
-    public void saveLevelDataAndPlayerData(LevelData levelData, List<EntityPlayer> playerList)
+    public void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList)
     {
         levelData.setSaveVersion(saveFormat.getSaveVersion());
         super.saveLevelDataAndPlayerData(levelData, playerList);
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerServer.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerServer.java
index 194be8eb5..e0e4995a5 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerServer.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerServer.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.save;
 
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import com.mojang.nbt.NbtIo;
@@ -36,14 +36,14 @@ public class SaveHandlerServer
     }
 
     @Override
-    public void saveLevelDataAndPlayerData(LevelData levelData, List<EntityPlayer> playerList)
+    public void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList)
     {
         levelData.setSaveVersion(saveFormat.getSaveVersion());
         super.saveLevelDataAndPlayerData(levelData, playerList);
     }
 
     @Override
-    public void save(EntityPlayer player)
+    public void save(Player player)
     {
         try
         {
@@ -65,7 +65,7 @@ public class SaveHandlerServer
     }
 
     @Override
-    public void load(EntityPlayer player)
+    public void load(Player player)
     {
         CompoundTag nbttagcompound = getPlayerData(player.username);
         if(nbttagcompound != null)
diff --git a/src/main/java/net/minecraft/core/world/save/conversion/ChunkConverter.java b/src/main/java/net/minecraft/core/world/save/conversion/ChunkConverter.java
index ff876a304..396ad1f6c 100644
--- a/src/main/java/net/minecraft/core/world/save/conversion/ChunkConverter.java
+++ b/src/main/java/net/minecraft/core/world/save/conversion/ChunkConverter.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.save.conversion;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
 public class ChunkConverter
 {
@@ -229,7 +230,7 @@ public class ChunkConverter
 			converters[0].addMapping(new MappingSimple(52, 640)); //Block.mobspawner.blockID));
 			converters[0].addMapping(new MappingSimple(53, 160)); //Block.stairsPlanksOak.blockID));
 			converters[0].addMapping(new MappingSimple(54, 680)); //Block.chestPlanksOak.blockID));
-			converters[0].addMapping(new MappingSimple(55, 450)); //Block.wireRedstone.blockID));
+			converters[0].addMapping(new MappingSimple(55, 450)); //Blocks.WIRE_REDSTONE.blockID));
 			converters[0].addMapping(new MappingMetaToId(56, new int[] { 410, 411, 412, 413 })); //new int[] { Block.oreDiamondStone.blockID, Block.oreDiamondBasalt.blockID, Block.oreDiamondLimestone.blockID, Block.oreDiamondGranite.blockID }));
 			converters[0].addMapping(new MappingSimple(57, 435)); //Block.blockDiamond.blockID));
 			converters[0].addMapping(new MappingSimple(58, 650)); //Block.workbench.blockID));
diff --git a/src/main/java/net/minecraft/core/world/save/conversion/IdKeyTableConverter.java b/src/main/java/net/minecraft/core/world/save/conversion/IdKeyTableConverter.java
deleted file mode 100644
index ca5d0ae1c..000000000
--- a/src/main/java/net/minecraft/core/world/save/conversion/IdKeyTableConverter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.minecraft.core.world.save.conversion;
-
-import com.mojang.nbt.CompoundTag;
-import net.minecraft.core.world.save.IdKeyTable;
-
-
-public class IdKeyTableConverter
-{
-    public void convert(CompoundTag chunkData, IdKeyTable oldTable, IdKeyTable newTable)
-    {
-        if (IdKeyTable.areMapsIdentical(oldTable, newTable)) return;
-
-        CompoundTag tagLevel = chunkData.getCompound("Level");
-        short[] blocks = tagLevel.getShortArray("Blocks");
-
-        short lastId = -1;
-        short newId = -1;
-
-        // Convert block array
-        for (int i = 0; i < blocks.length; i++)
-        {
-            /* Wow, actual optimisation! If this ID is the same as the last ID
-               we looked up (which is fairly likely given what Minecraft's world
-               looks like), we can skip the lookup and just use the same
-               conversion again.
-            */
-            if (blocks[i] != lastId)
-            {
-                // Find out what string this ID maps to
-                lastId = blocks[i];
-                String key = oldTable.getKeyById(lastId);
-                newId = (short) newTable.getIDByKey(key);
-            }
-            blocks[i] = newId;
-        }
-
-
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/save/legacy/SaveFormatLegacy.java b/src/main/java/net/minecraft/core/world/save/legacy/SaveFormatLegacy.java
index f7417d550..9a22fee98 100644
--- a/src/main/java/net/minecraft/core/world/save/legacy/SaveFormatLegacy.java
+++ b/src/main/java/net/minecraft/core/world/save/legacy/SaveFormatLegacy.java
@@ -1,7 +1,6 @@
 package net.minecraft.core.world.save.legacy;
 
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.save.IdKeyTable;
 import net.minecraft.core.world.save.SaveFormatBase;
 
 import java.io.File;
diff --git a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19132.java b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19132.java
index 35b34e90f..db1675d91 100644
--- a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19132.java
+++ b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19132.java
@@ -2,7 +2,6 @@ package net.minecraft.core.world.save.mcregion;
 
 
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.save.IdKeyTable;
 import net.minecraft.core.world.save.SaveFormatBase;
 
 import java.io.*;
diff --git a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19133.java b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19133.java
index 10f86a053..b0268709a 100644
--- a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19133.java
+++ b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19133.java
@@ -1,8 +1,6 @@
 package net.minecraft.core.world.save.mcregion;
 
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.save.IdKeyTable;
-import net.minecraft.core.world.save.IdKeyTableCustom;
 import net.minecraft.core.world.save.SaveFormatBase;
 
 import java.io.*;
diff --git a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19134.java b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19134.java
index f8f5a6908..18404166b 100644
--- a/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19134.java
+++ b/src/main/java/net/minecraft/core/world/save/mcregion/SaveFormat19134.java
@@ -1,7 +1,6 @@
 package net.minecraft.core.world.save.mcregion;
 
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.save.IdKeyTable;
 import net.minecraft.core.world.save.LevelData;
 import net.minecraft.core.world.save.SaveFormatBase;
 
diff --git a/src/main/java/net/minecraft/core/world/saveddata/maps/ItemMapSavedData.java b/src/main/java/net/minecraft/core/world/saveddata/maps/ItemMapSavedData.java
index 485472ce7..53dedd4d6 100644
--- a/src/main/java/net/minecraft/core/world/saveddata/maps/ItemMapSavedData.java
+++ b/src/main/java/net/minecraft/core/world/saveddata/maps/ItemMapSavedData.java
@@ -1,22 +1,24 @@
 package net.minecraft.core.world.saveddata.maps;
 
-import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
+import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.saveddata.SavedData;
 
 import java.util.*;
 
 // Referenced classes of package net.minecraft.src:
-//            MapDataBase, NBTTagCompound, MapInfo, EntityPlayer, 
+//            MapDataBase, NBTTagCompound, MapInfo, Player,
 //            InventoryPlayer, MapCoord, ItemStack
 
 public class ItemMapSavedData extends SavedData
 {
+    public static final byte MAX_SCALE = 4;
     public int x;
     public int z;
     public byte dimension;
@@ -24,7 +26,7 @@ public class ItemMapSavedData extends SavedData
     public byte[] colors;
     public int step;
     public List<HoldingPlayer> carriedBy;
-    private final Map<EntityPlayer, HoldingPlayer> carriedByPlayers;
+    private final Map<Player, HoldingPlayer> carriedByPlayers;
     public List<MapDecoration> decorations;
     public final int MAX_WAYPOINTS = 16;
     public List<MapWaypoint> mapWaypoints;
@@ -50,9 +52,9 @@ public class ItemMapSavedData extends SavedData
         {
             scale = 0;
         }
-        if(scale > 4)
+        if(scale > MAX_SCALE)
         {
-            scale = 4;
+            scale = MAX_SCALE;
         }
         short width = tag.getShort("width");
         short height = tag.getShort("height");
@@ -106,7 +108,7 @@ public class ItemMapSavedData extends SavedData
         tag.put("Waypoints", waypointsList);
     }
 
-    public void tickCarriedBy(EntityPlayer player, ItemStack stack)
+    public void tickCarriedBy(Player player, ItemStack stack)
     {
         if(!carriedByPlayers.containsKey(player))
         {
@@ -118,7 +120,7 @@ public class ItemMapSavedData extends SavedData
 
         for(MapWaypoint mapWaypoint : mapWaypoints){
             if(player.distanceToSqr(mapWaypoint.xPos, mapWaypoint.yPos, mapWaypoint.zPos) <= 256D) {
-               if(player.world.getBlockId(mapWaypoint.xPos, mapWaypoint.yPos, mapWaypoint.zPos)!= Block.flag.id)
+               if(player.world.getBlockId(mapWaypoint.xPos, mapWaypoint.yPos, mapWaypoint.zPos)!= Blocks.FLAG.id)
                 {
                     mapWaypoints.remove(mapWaypoint);
                     break;
@@ -137,16 +139,12 @@ public class ItemMapSavedData extends SavedData
             }
             float f = (float)(mapinfo1.player.x - (double) x) / (float)(1 << scale);
             float f1 = (float)(mapinfo1.player.z - (double) z) / (float)(1 << scale);
-            int j = 64;
-            int k = 64;
-            if(f < (float)(-j) || f1 < (float)(-k) || f > (float)j || f1 > (float)k)
-            {
-                continue;
-            }
             byte color = 0;
-            byte xCoord = (byte)(int)((double)(f * 2.0F) + 0.5D);
-            byte zCoord = (byte)(int)((double)(f1 * 2.0F) + 0.5D);
-            byte rotation = (byte)(int)((double)((player.yRot * 16F) / 360F) + 0.5D);
+            byte xCoord = (byte)(MathHelper.clamp((double)(f * 2.0F) + 0.5D, -128, 127));
+            byte zCoord = (byte)(MathHelper.clamp((double)(f1 * 2.0F) + 0.5D, -128, 127));
+            float yRot = player.yRot;
+            while (yRot < 0) yRot += 360;
+            byte rotation = (byte)((double)((yRot * 16F) / 360F) + 0.5D);
             if(dimension == 1)
             {
                 int l = step / 10;
@@ -161,7 +159,7 @@ public class ItemMapSavedData extends SavedData
         }
     }
 
-    public boolean createNewWaypoint(TileEntityFlag flag)
+    public boolean createNewWaypoint(FlagBlockEntity flag)
     {
         if(mapWaypoints.size() >= MAX_WAYPOINTS)
             return false;
@@ -191,7 +189,7 @@ public class ItemMapSavedData extends SavedData
         return true;
     }
 
-    public byte[] getMapDataBytes(ItemStack stack, World world, EntityPlayer player)
+    public byte[] getMapDataBytes(ItemStack stack, World world, Player player)
     {
         HoldingPlayer mapinfo = carriedByPlayers.get(player);
         if(mapinfo == null)
@@ -254,14 +252,14 @@ public class ItemMapSavedData extends SavedData
 
     public class HoldingPlayer
     {
-        public final EntityPlayer player;
+        public final Player player;
         public int[] minDirty;
         public int[] maxDirty;
         private int tick;
         private int step;
         private byte[] packetBuffer;
 
-        public HoldingPlayer(EntityPlayer player)
+        public HoldingPlayer(Player player)
         {
             minDirty = new int[128];
             maxDirty = new int[128];
diff --git a/src/main/java/net/minecraft/core/world/season/Seasons.java b/src/main/java/net/minecraft/core/world/season/Seasons.java
index 9d709c3eb..a029095b6 100644
--- a/src/main/java/net/minecraft/core/world/season/Seasons.java
+++ b/src/main/java/net/minecraft/core/world/season/Seasons.java
@@ -5,18 +5,18 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import net.minecraft.core.world.weather.Weather;
+import net.minecraft.core.world.weather.Weathers;
 
 public abstract class Seasons
 {
     private static final Map<String, Season> SEASONS_MAP = new HashMap<>();
     public final static Season NULL = register(new SeasonNull("null"));
-    public final static Season OVERWORLD_SPRING = register(new SeasonSpring("overworld.spring").allowWeather(Weather.overworldRain, 0.3f).allowWeather(Weather.overworldFog, 0.3f).setDayLength(0.5f).setCropGrowthFactor(1.5f).setGrowFlowers().setSaplingDropFactor(2f));
-    public final static Season OVERWORLD_SUMMER = register(new SeasonSummer("overworld.summer").allowWeather(Weather.overworldRain, 0.1f).allowWeather(Weather.overworldStorm, 0.1f).setDayLength(0.6f));
-    public final static Season OVERWORLD_FALL = register(new SeasonFall("overworld.fall").allowWeather(Weather.overworldRain, 0.2f).allowWeather(Weather.overworldStorm, 0.05f).allowWeather(Weather.overworldFog, 0.5f).setDayLength(0.5f).setSaplingDropFactor(0.5f));
-    public final static Season OVERWORLD_WINTER = register(new SeasonWinter("overworld.winter").allowWeather(Weather.overworldSnow, 0.5f).allowWeather(Weather.overworldFog, 0.25f).setLetWeatherCleanUpSnow(false).setDayLength(0.3f).setCropGrowthFactor(0.25f).setKillFlowers().setSaplingDropFactor(0.1f));
+    public final static Season OVERWORLD_SPRING = register(new SeasonSpring("overworld.spring").allowWeather(Weathers.OVERWORLD_RAIN, 0.3f).allowWeather(Weathers.OVERWORLD_FOG, 0.3f).setDayLength(0.5f).setCropGrowthFactor(1.5f).setGrowFlowers().setSaplingDropFactor(2f));
+    public final static Season OVERWORLD_SUMMER = register(new SeasonSummer("overworld.summer").allowWeather(Weathers.OVERWORLD_RAIN, 0.1f).allowWeather(Weathers.OVERWORLD_STORM, 0.1f).setDayLength(0.6f));
+    public final static Season OVERWORLD_FALL = register(new SeasonFall("overworld.fall").allowWeather(Weathers.OVERWORLD_RAIN, 0.2f).allowWeather(Weathers.OVERWORLD_STORM, 0.05f).allowWeather(Weathers.OVERWORLD_FOG, 0.5f).setDayLength(0.5f).setSaplingDropFactor(0.5f));
+    public final static Season OVERWORLD_WINTER = register(new SeasonWinter("overworld.winter").allowWeather(Weathers.OVERWORLD_SNOW, 0.5f).allowWeather(Weathers.OVERWORLD_FOG, 0.25f).setLetWeatherCleanUpSnow(false).setDayLength(0.3f).setCropGrowthFactor(0.25f).setKillFlowers().setSaplingDropFactor(0.1f));
     public final static Season OVERWORLD_HELL = register(new SeasonOverworldHell("overworld.hell"));
-    public final static Season OVERWORLD_WINTER_ENDLESS = register(new SeasonWinter("overworld.winter.endless").allowWeather(Weather.overworldWinterSnow, 1.0f).setLetWeatherCleanUpSnow(false).setDayLength(0.3f).setCropGrowthFactor(0.25f).setKillFlowers().setSaplingDropFactor(0.1f));
+    public final static Season OVERWORLD_WINTER_ENDLESS = register(new SeasonWinter("overworld.winter.endless").allowWeather(Weathers.OVERWORLD_WINTER_SNOW, 1.0f).setLetWeatherCleanUpSnow(false).setDayLength(0.3f).setCropGrowthFactor(0.25f).setKillFlowers().setSaplingDropFactor(0.1f));
     public final static Season PARADISE_GOLD = register(new SeasonParadiseGold("paradise.gold").setLetWeatherCleanUpSnow(false));
     public final static Season PARADISE_SILVER = register(new SeasonParadiseSilver("paradise.silver").setLetWeatherCleanUpSnow(false));
 
diff --git a/src/main/java/net/minecraft/core/world/type/WorldType.java b/src/main/java/net/minecraft/core/world/type/WorldType.java
index 497061c63..ca65452c2 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldType.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldType.java
@@ -1,114 +1,159 @@
 package net.minecraft.core.world.type;
 
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.Global;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.config.season.SeasonConfig;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.save.LevelData;
+import net.minecraft.core.world.season.Seasons;
 import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
+import net.minecraft.core.world.weather.Weathers;
+import net.minecraft.core.world.wind.WindProvider;
+import net.minecraft.core.world.wind.WindProviderGeneric;
 
-public abstract class WorldType
-{
+public abstract class WorldType {
     private final String languageKey;
     private final Weather defaultWeather;
-    private final WindManager windManager;
+    private final WindProvider windProvider;
     private final boolean hasCeiling;
     private final float[] brightnessRamp;
-    private final SeasonConfig defaultSeasonConfig;
-
-    public WorldType(String languageKey, Weather defaultWeather, WindManager windManager, boolean hasCeiling, float[] brightnessRamp, SeasonConfig defaultSeasonConfig)
-    {
-        this.languageKey = languageKey;
-        this.defaultWeather = defaultWeather;
-        this.windManager = windManager;
-        this.hasCeiling = hasCeiling;
-        this.brightnessRamp = brightnessRamp;
-        this.defaultSeasonConfig = defaultSeasonConfig;
+    private final SeasonConfig seasonConfig;
+    private final boolean hasClouds;
+    private final boolean hasSky;
+    private final int minY;
+    private final int maxY;
+    private final int oceanY;
+    private final int oceanBlockId;
+    private final int fillerBlockId;
+    private final int dayNightCycleTicks;
+    private final boolean mayRespawn;
+    private final float cloudHeight;
+    private final boolean hasGround;
+    private final boolean hasAurora;
+
+    public WorldType(Properties properties) {
+        this.languageKey = properties.languageKey;
+        this.defaultWeather = properties.defaultWeather == null ? Weathers.OVERWORLD_CLEAR : properties.defaultWeather;
+        this.windProvider = properties.windProvider == null ? new WindProviderGeneric() : properties.windProvider;
+        this.hasCeiling = properties.hasCeiling;
+        this.brightnessRamp = properties.brightnessRamp;
+        this.seasonConfig = properties.seasonConfig == null ? SeasonConfig.builder().withSingleSeason(Seasons.NULL).build() : properties.seasonConfig;
+        this.hasClouds = properties.hasClouds;
+        this.hasSky = properties.hasSky;
+        this.minY = properties.minY;
+        this.maxY = properties.maxY;
+        this.oceanY = properties.oceanY;
+        this.oceanBlockId = properties.oceanBlock == null ? 0 : properties.oceanBlock.id;
+        this.fillerBlockId = properties.fillerBlock == null ? 0 : properties.fillerBlock.id;
+        this.dayNightCycleTicks = properties.dayNightCycleTicks;
+        this.mayRespawn = properties.mayRespawn;
+        this.cloudHeight = properties.cloudHeight == null ? (properties.maxY + 1) - 20 : properties.cloudHeight;
+        this.hasGround = properties.hasGround;
+        this.hasAurora = properties.hasAurora;
     }
 
-    public void onWorldCreation(World world) { }
-
-    public String getLanguageKey()
-    {
+    public String getLanguageKey() {
         return languageKey;
     }
 
-    public Weather getDefaultWeather()
-    {
+    public Weather getDefaultWeather() {
         return defaultWeather;
     }
 
-    public WindManager getWindManager()
-    {
-        return windManager;
+    public WindProvider getWindManager() {
+        return windProvider;
     }
 
-    public boolean hasCeiling()
-    {
+    public boolean hasCeiling() {
         return hasCeiling;
     }
 
-    public float[] getBrightnessRamp()
-    {
+    public float[] getBrightnessRamp() {
         return brightnessRamp;
     }
 
-    public SeasonConfig getDefaultSeasonConfig()
-    {
-        return defaultSeasonConfig;
+    public SeasonConfig getSeasonConfig() {
+        return seasonConfig;
     }
 
     public boolean hasClouds() {
-        return true;
+        return hasClouds;
     }
 
     public boolean hasSky() {
-        return true;
+        return hasSky;
+    }
+
+    public int getMinY() {
+        return minY;
+    }
+
+    public int getMaxY() {
+        return maxY;
+    }
+
+    public int getOceanY() {
+        return oceanY;
+    }
+
+    public int getOceanBlockId() {
+        return oceanBlockId;
+    }
+
+    public int getFillerBlockId() {
+        return fillerBlockId;
+    }
+
+    public int getDayNightCycleTicks() {
+        return dayNightCycleTicks;
+    }
+
+    public boolean mayRespawn() {
+        return mayRespawn;
+    }
+
+    public float getCloudHeight() {
+        return cloudHeight;
+    }
+
+    public boolean hasGround() {
+        return hasGround;
     }
 
-    public abstract int getMinY();
+    public boolean hasAurora() {
+        return hasAurora;
+    }
 
-    public abstract int getMaxY();
+    public void onWorldCreation(World world) { }
 
-    public final int getYRange()
-    {
+    public final int getYRange() {
         return getMaxY() - getMinY();
     }
 
-    public final double getYPercentage(int y)
-    {
+    public final double getYPercentage(int y) {
         int range = getYRange();
         y -= getMinY();
         return (double)y / (double)range;
     }
 
-    public abstract int getOceanY();
-
-    public abstract int getOceanBlock();
-
-    public abstract int getFillerBlock();
-
     public abstract BiomeProvider createBiomeProvider(World world);
 
     public abstract ChunkGenerator createChunkGenerator(World world);
 
     public abstract boolean isValidSpawn(World world, int x, int y, int z);
 
-    public void getInitialSpawnLocation(World world)
-    {
+    public void getInitialSpawnLocation(World world) {
         int x = 0;
         int y = 0;
         int z = 0;
-        spawnLoop:  while (true)
-        {
+        spawnLoop:  while (true) {
             x += world.rand.nextInt(64) - world.rand.nextInt(64);
             z += world.rand.nextInt(64) - world.rand.nextInt(64);
-            for (y = getMaxY(); y >= getMinY(); y--)
-            {
-                if (world.getBlockId(x, y + 1, z) == 0 && isValidSpawn(world, x, y, z))
-                {
+            for (y = getMaxY(); y >= getMinY(); y--) {
+                if (world.getBlockId(x, y + 1, z) == 0 && isValidSpawn(world, x, y, z)) {
                     break spawnLoop;
                 }
             }
@@ -116,17 +161,14 @@ public abstract class WorldType
         world.getLevelData().setSpawn(x, y, z);
     }
 
-    public void getRespawnLocation(World world)
-    {
+    public void getRespawnLocation(World world) {
         LevelData levelData = world.getLevelData();
-        if(levelData.getSpawnY() <= 0)
-        {
+        if(levelData.getSpawnY() <= 0) {
             levelData.setSpawnY(getOceanY());
         }
         int x = levelData.getSpawnX();
         int z = levelData.getSpawnZ();
-        while (world.getTopBlock(x, z) == 0)
-        {
+        while (world.getTopBlock(x, z) == 0) {
             x += world.rand.nextInt(8) - world.rand.nextInt(8);
             z += world.rand.nextInt(8) - world.rand.nextInt(8);
         }
@@ -136,40 +178,34 @@ public abstract class WorldType
 
     }
 
-    public abstract int getDayNightCycleLengthTicks();
-
     protected int getDayLengthTicks(World world) {
         float dayLength;
         float seasonProgress = world.getSeasonManager().getSeasonProgress();
-        if (seasonProgress < 0.5f)
-        {
+        if (seasonProgress < 0.5f) {
             float lastSeasonDayLength = world.getSeasonManager().getPreviousSeason().dayLength;
             float thisSeasonDayLength = world.getSeasonManager().getCurrentSeason().dayLength;
             float seasonModifier = world.getSeasonManager().getSeasonModifier() * 0.5f + 0.5f;
             dayLength = (lastSeasonDayLength * (1.0f - seasonModifier)) + (thisSeasonDayLength * seasonModifier);
-        }
-        else
-        {
+        } else {
             float thisSeasonDayLength = world.getSeasonManager().getCurrentSeason().dayLength;
             float nextSeasonDayLength = world.getSeasonManager().getNextSeason().dayLength;
             float seasonModifier = world.getSeasonManager().getSeasonModifier() * 0.5f + 0.5f;
             dayLength = (thisSeasonDayLength * seasonModifier) + (nextSeasonDayLength * (1.0f - seasonModifier));
         }
 
-        int cycleTicks = getDayNightCycleLengthTicks();
+        int cycleTicks = getDayNightCycleTicks();
         return (int)(dayLength * cycleTicks);
     }
 
     public int getSunriseTick(World world) {
         int dayLengthTicks = getDayLengthTicks(world);
-        int cycleTicks = getDayNightCycleLengthTicks();
+        int cycleTicks = getDayNightCycleTicks();
         return cycleTicks / 4 - dayLengthTicks / 2;
     }
 
-    public float getTimeOfDay(World world, long tick, float partialTick)
-    {
+    public float getTimeOfDay(World world, long tick, float partialTick) {
         tick += 18000;
-        int cycleTicks = getDayNightCycleLengthTicks();
+        int cycleTicks = getDayNightCycleTicks();
         int dayTicks = getDayLengthTicks(world);
         int nightTicks = cycleTicks - dayTicks;
 
@@ -198,16 +234,125 @@ public abstract class WorldType
 
     public abstract int getSkyDarken(World world, long tick, float partialTick);
 
-    public abstract Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick);
+    public abstract Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick);
+
+    public static class Properties {
+        private final String languageKey;
+        private Weather defaultWeather = null;
+        private WindProvider windProvider = null;
+        private boolean hasCeiling = false;
+        private float[] brightnessRamp = null;
+        private SeasonConfig seasonConfig = null;
+        private boolean hasClouds = true;
+        private boolean hasSky = true;
+        private int minY = 0;
+        private int maxY = 255;
+        private int oceanY = 128;
+        private Block oceanBlock = null;
+        private Block fillerBlock = null;
+        private int dayNightCycleTicks = Global.DAY_LENGTH_TICKS;
+        private boolean mayRespawn = false;
+        private Float cloudHeight = null;
+        private boolean hasGround = true;
+        private boolean hasAurora = false;
+
+        private Properties(String languageKey) {
+            this.languageKey = languageKey;
+        }
+
+        public static Properties of(String languageKey) {
+            return new Properties(languageKey);
+        }
+
+        public Properties defaultWeather(Weather weather) {
+            this.defaultWeather = weather;
+            return this;
+        }
+
+        public Properties windManager(WindProvider windProvider) {
+            this.windProvider = windProvider;
+            return this;
+        }
+
+        public Properties withCeiling() {
+            this.hasCeiling = true;
+            return this;
+        }
+
+        public Properties brightnessRamp(float[] brightnessRamp) {
+            this.brightnessRamp = brightnessRamp;
+            return this;
+        }
+
+        public Properties seasonConfig(SeasonConfig seasonConfig) {
+            this.seasonConfig = seasonConfig;
+            return this;
+        }
+
+        public Properties noClouds() {
+            this.hasClouds = false;
+            return this;
+        }
+
+        public Properties noSky() {
+            this.hasSky = false;
+            return this;
+        }
+
+        public Properties bounds(int minY, int maxY, int oceanY) {
+            if (minY < 0) {
+                throw new IllegalArgumentException("minY cannot be negative");
+            }
+            if (maxY < 0) {
+                throw new IllegalArgumentException("maxY cannot be negative");
+            }
+            if (maxY <= minY) {
+                throw new IllegalArgumentException("maxY cannot be less than or equal to minY");
+            }
+            if (oceanY < 0) {
+                throw new IllegalArgumentException("oceanY cannot be negative");
+            }
+
+            this.minY = minY;
+            this.maxY = maxY;
+            this.oceanY = oceanY;
+
+            return this;
+        }
+
+        public Properties oceanBlock(Block oceanBlock) {
+            this.oceanBlock = oceanBlock;
+            return this;
+        }
+
+        public Properties fillerBlock(Block fillerBlock) {
+            this.fillerBlock = fillerBlock;
+            return this;
+        }
+
+        public Properties dayNightCycleTicks(int ticks) {
+            this.dayNightCycleTicks = ticks;
+            return this;
+        }
 
-    public abstract boolean mayRespawn();
+        public Properties allowRespawn() {
+            this.mayRespawn = true;
+            return this;
+        }
 
-    public abstract float getCloudHeight();
+        public Properties cloudHeight(float cloudHeight) {
+            this.cloudHeight = cloudHeight;
+            return this;
+        }
 
-    public abstract boolean hasGround();
+        public Properties noGround() {
+            this.hasGround = false;
+            return this;
+        }
 
-    public boolean hasAurora()
-    {
-        return false;
+        public Properties withAurora() {
+            this.hasAurora = true;
+            return this;
+        }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java b/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
index 9685e4b79..8fd2f3edb 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
@@ -1,142 +1,68 @@
 package net.minecraft.core.world.type;
 
-import net.minecraft.core.Global;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.generate.chunk.debug.ChunkGeneratorDebug;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
 
 import java.util.Arrays;
 
 public class WorldTypeDebug
-    extends WorldType
-{
-    public WorldTypeDebug(String languageKey) {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            false,
-            createLightRamp(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.NULL)
-                .build()
-        );
+        extends WorldType {
+    public WorldTypeDebug(Properties properties) {
+        super(properties);
     }
 
-    private static float[] createLightRamp()
-    {
+    public static float[] createLightRamp() {
         float[] brightnessRamp = new float[32];
         Arrays.fill(brightnessRamp, 1.0f);
         return brightnessRamp;
     }
 
     @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getOceanBlock()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getFillerBlock()
-    {
-        return 0;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
+    public BiomeProvider createBiomeProvider(World world) {
         return new BiomeProviderSingleBiome(Biomes.OVERWORLD_PLAINS, 1.0, 1.0, 1.0);
     }
 
     @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
+    public ChunkGenerator createChunkGenerator(World world) {
         return new ChunkGeneratorDebug(world);
     }
 
     @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
+    public boolean isValidSpawn(World world, int x, int y, int z) {
         return true;
     }
 
     @Override
-    public void getInitialSpawnLocation(World world)
-    {
+    public void getInitialSpawnLocation(World world) {
         world.getLevelData().setSpawn(0, 1, 0);
     }
 
     @Override
-    public void getRespawnLocation(World world) { }
-
-    @Override
-    public int getDayNightCycleLengthTicks()
-    {
-        return Global.DAY_LENGTH_TICKS;
+    public void getRespawnLocation(World world) {
     }
 
     @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
+    public float getCelestialAngle(World world, long tick, float partialTick) {
         return 0;
     }
 
     @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick)
-    {
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
         return new float[4];
     }
 
     @Override
-    public int getSkyDarken(World world, long tick, float partialTick)
-    {
+    public int getSkyDarken(World world, long tick, float partialTick) {
         return 0;
     }
 
     @Override
-    public Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick)
-    {
-        return Vec3d.createVector(1.0, 1.0, 1.0);
-    }
-
-    @Override
-    public boolean mayRespawn() {
-        return true;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-
-    @Override
-    public boolean hasGround() {
-        return false;
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        return Vec3.getTempVec3(1.0, 1.0, 1.0);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java b/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
index 9405e52a0..b18d77fc4 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
@@ -1,42 +1,26 @@
 package net.minecraft.core.world.type;
 
-import net.minecraft.core.Global;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
 import net.minecraft.core.world.generate.chunk.empty.ChunkGeneratorEmpty;
-import net.minecraft.core.world.season.Seasons;
 import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
 
 public class WorldTypeEmpty
-    extends WorldType
-{
-    public WorldTypeEmpty(String languageKey) {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            false,
-            createLightRamp(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.NULL)
-                .build()
-        );
+        extends WorldType {
+    public WorldTypeEmpty(Properties properties) {
+        super(properties);
     }
 
-    private static float[] createLightRamp()
-    {
+    public static float[] createLightRamp() {
         float[] brightnessRamp = new float[32];
         float f = 0.05F;
-        for(int i = 0; i <= 31; i++)
-        {
-            float f1 = 1.0F - (float)i / 15F;
+        for (int i = 0; i <= 31; i++) {
+            float f1 = 1.0F - (float) i / 15F;
             if (i > 15) f1 = 0.0f;
             brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
         }
@@ -44,127 +28,78 @@ public class WorldTypeEmpty
     }
 
     @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getOceanBlock()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getFillerBlock()
-    {
-        return 0;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
+    public BiomeProvider createBiomeProvider(World world) {
         return new BiomeProviderSingleBiome(Biomes.OVERWORLD_PLAINS, 1.0, 1.0, 1.0);
     }
 
     @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
+    public ChunkGenerator createChunkGenerator(World world) {
         return new ChunkGeneratorEmpty(world);
     }
 
     @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
+    public boolean isValidSpawn(World world, int x, int y, int z) {
         return true;
     }
 
     @Override
-    public void getInitialSpawnLocation(World world)
-    {
+    public void getInitialSpawnLocation(World world) {
         world.getLevelData().setSpawn(0, 1, 0);
     }
 
     @Override
-    public void getRespawnLocation(World world) { }
-
-    @Override
-    public int getDayNightCycleLengthTicks()
-    {
-        return Global.DAY_LENGTH_TICKS;
+    public void getRespawnLocation(World world) {
     }
 
     @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
+    public float getCelestialAngle(World world, long tick, float partialTick) {
         return getTimeOfDay(world, tick, partialTick);
     }
 
     @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick)
-    {
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
         float[] sunriseCol = new float[4];
         float f2 = 0.4F;
-        float f3 = MathHelper.cos(timeOfDay * 3.141593F * 2.0F) - 0.0F;
+        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
         float f4 = -0F;
-        if(f3 >= f4 - f2 && f3 <= f4 + f2)
-        {
+        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
             float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * 3.141593F)) * 0.99F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
             a *= a;
             sunriseCol[0] = c * 0.3F + 0.7F;
             sunriseCol[1] = c * c * 0.7F + 0.2F;
             sunriseCol[2] = c * c * 0.0F + 0.2F;
             sunriseCol[3] = a;
             return sunriseCol;
-        }
-        else
-        {
+        } else {
             return null;
         }
     }
 
     @Override
-    public int getSkyDarken(World world, long tick, float partialTick)
-    {
+    public int getSkyDarken(World world, long tick, float partialTick) {
         float f1 = getCelestialAngle(world, tick, partialTick);
-        float f2 = 1.0F - (MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.5F);
-        if(f2 < 0.0F)
-        {
+        float f2 = 1.0F - (MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F);
+        if (f2 < 0.0F) {
             f2 = 0.0F;
         }
-        if(f2 > 1.0F)
-        {
+        if (f2 > 1.0F) {
             f2 = 1.0F;
         }
         float weatherOffset = 0;
         Weather currentWeather = world.getCurrentWeather();
-        if (currentWeather != null) weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
-        return (int)(f2 * (11F - weatherOffset) + weatherOffset);
+        if (currentWeather != null)
+            weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
+        return (int) (f2 * (11F - weatherOffset) + weatherOffset);
     }
 
     @Override
-    public Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick)
-    {
-        float f2 = MathHelper.cos(celestialAngle * 3.141593F * 2.0F) * 2.0F + 0.5F;
-        if(f2 < 0.0F)
-        {
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        if (f2 < 0.0F) {
             f2 = 0.0F;
         }
-        if(f2 > 1.0F)
-        {
+        if (f2 > 1.0F) {
             f2 = 1.0F;
         }
         float r = 0.7529412F;
@@ -173,20 +108,6 @@ public class WorldTypeEmpty
         r *= f2 * 0.94F + 0.06F;
         g *= f2 * 0.94F + 0.06F;
         b *= f2 * 0.91F + 0.09F;
-        return Vec3d.createVector(r, g, b);
-    }
-    @Override
-    public boolean mayRespawn() {
-        return true;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-
-    @Override
-    public boolean hasGround() {
-        return false;
+        return Vec3.getTempVec3(r, g, b);
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeFlat.java b/src/main/java/net/minecraft/core/world/type/WorldTypeFlat.java
deleted file mode 100644
index 7b33b3ee2..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeFlat.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.flat.ChunkGeneratorFlat;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeFlat
-    extends WorldTypeOverworld
-{
-    public WorldTypeFlat(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.OVERWORLD_SUMMER)
-                .build()
-        );
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 31;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 0;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_PLAINS, 0.5, 0.0, 0.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorFlat(world);
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return world.getBlockId(x, y, z) == Block.grass.id;
-    }
-
-    @Override
-    public void getRespawnLocation(World world) {}
-
-    @Override
-    public float getCloudHeight() {
-        return 236.0f;
-    }
-
-    @Override
-    public boolean hasAurora()
-    {
-        return false;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java b/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java
new file mode 100644
index 000000000..c5b57133a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java
@@ -0,0 +1,85 @@
+package net.minecraft.core.world.type;
+
+import net.minecraft.core.world.Dimension;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WorldTypeGroups {
+    public static final List<Group> GROUPS = new ArrayList<>();
+    public static final Group DEFAULT = new Group(WorldTypes.OVERWORLD_EXTENDED);
+
+    static {
+        GROUPS.add(
+            DEFAULT
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_DEFAULT)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_WINTER)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_FLOATING)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_AMPLIFIED)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_ISLANDS)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_INLAND)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.FLAT)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_HELL)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_WOODS)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_PARADISE)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_CLASSIC)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_INDEV)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_RETRO)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.OVERWORLD_SKYBLOCK)
+                .with(Dimension.nether, WorldTypes.NETHER_SKYBLOCK)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.EMPTY)
+        );
+        GROUPS.add(
+            new Group(WorldTypes.DEBUG)
+        );
+    }
+
+    public static class Group {
+        private final Map<Dimension, WorldType> worldTypes = new HashMap<>();
+
+        public Group(WorldType overworldType) {
+            worldTypes.put(Dimension.overworld, overworldType);
+        }
+
+        public Group with(Dimension dimension, WorldType worldType) {
+            worldTypes.put(dimension, worldType);
+            return this;
+        }
+
+        public WorldType get(Dimension dimension) {
+            return worldTypes.get(dimension);
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeNether.java b/src/main/java/net/minecraft/core/world/type/WorldTypeNether.java
deleted file mode 100644
index 13e559883..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeNether.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.client.render.colorizer.Colorizers;
-import net.minecraft.core.Global;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.nether.ChunkGeneratorNether;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
-
-public abstract class WorldTypeNether
-    extends WorldType
-{
-    public WorldTypeNether(String languageKey, Weather defaultWeather, WindManager windManager, SeasonConfig defaultSeasonConfig)
-    {
-        super(
-            languageKey,
-            defaultWeather,
-            windManager,
-            true,
-            getLightRamp(),
-            defaultSeasonConfig
-        );
-    }
-
-    private static float[] getLightRamp()
-    {
-        float[] brightnessRamp = new float[32];
-        float f = 0.1F;
-        for(int i = 0; i <= 15; i++)
-        {
-            float f1 = 1.0F - (float)i / 15F;
-            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
-        }
-        return brightnessRamp;
-    }
-
-    @Override
-    public void onWorldCreation(World world)
-    {
-        super.onWorldCreation(world);
-
-        world.setWorldTime(72000);
-    }
-
-    @Override
-    public int getOceanBlock()
-    {
-        return Block.fluidLavaStill.id;
-    }
-
-    @Override
-    public int getFillerBlock()
-    {
-        return Block.netherrack.id;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.NETHER_NETHER, 1.0, 0.0, 1.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorNether(world);
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return true;
-    }
-
-    @Override
-    public int getDayNightCycleLengthTicks()
-    {
-        return Global.DAY_LENGTH_TICKS;
-    }
-
-    @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
-        return 0.5f;
-    }
-
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        return new float[4];
-    }
-
-    @Override
-    public int getSkyDarken(World world, long tick, float partialTick) {
-        return 0;
-    }
-
-    @Override
-    public Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick)
-    {
-    	if(Colorizers.fog.isEnabled()) {
-	    	int x1 = MathHelper.floor_double(x);
-	    	int y1 = MathHelper.floor_double(y);
-	    	int z1 = MathHelper.floor_double(z);
-	    	
-	    	int color = Colorizers.fog.getColor(world, x1, y1, z1);
-	    	
-	    	float r = ((color >> 16) & 0xFF) / 255.0f;
-	    	float g = ((color >> 8) & 0xFF) / 255.0f;
-	    	float b = (color & 0xFF) / 255.0f;
-	    	return Vec3d.createVector(r, g, b);
-	    }
-        return Vec3d.createVector(0.0, 0.0, 0.0);
-    }
-
-    @Override
-    public boolean mayRespawn()
-    {
-        return false;
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 0;
-    }
-
-    @Override
-    public boolean hasGround()
-    {
-        return true;
-    }
-
-    @Override
-    public boolean hasClouds() {
-        return false;
-    }
-
-    @Override
-    public boolean hasSky() {
-        return false;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeNetherDefault.java b/src/main/java/net/minecraft/core/world/type/WorldTypeNetherDefault.java
deleted file mode 100644
index 3458abab9..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeNetherDefault.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeNetherDefault
-    extends WorldTypeNether
-{
-    public WorldTypeNetherDefault(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.NULL)
-                .build()
-        );
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 128;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 32;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworld.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworld.java
deleted file mode 100644
index bec4698d6..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworld.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.client.render.colorizer.Colorizers;
-import net.minecraft.core.Global;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.overworld.ChunkGeneratorOverworld;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
-
-public abstract class WorldTypeOverworld
-    extends WorldType
-{
-    public WorldTypeOverworld(String languageKey, Weather defaultWeather, WindManager windManager, SeasonConfig defaultSeasonConfig)
-    {
-        super(
-            languageKey,
-            defaultWeather,
-            windManager,
-            false,
-            createLightRamp(),
-            defaultSeasonConfig
-        );
-    }
-
-    @Override
-    public void onWorldCreation(World world)
-    {
-        super.onWorldCreation(world);
-
-        world.setWorldTime(72000 + 3000);
-    }
-
-    private static float[] createLightRamp()
-    {
-        float[] brightnessRamp = new float[32];
-        float f = 0.05F;
-        for(int i = 0; i <= 31; i++)
-        {
-            float f1 = 1.0F - (float)i / 15F;
-            if (i > 15) f1 = 0.0f;
-            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
-        }
-        return brightnessRamp;
-    }
-
-    @Override
-    public int getOceanBlock()
-    {
-        return Block.fluidWaterStill.id;
-    }
-
-    @Override
-    public int getFillerBlock()
-    {
-        return Block.stone.id;
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorOverworld(world);
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return world.getBlockId(x, y, z) == Block.sand.id;
-    }
-
-    @Override
-    public int getDayNightCycleLengthTicks()
-    {
-        return Global.DAY_LENGTH_TICKS;
-    }
-
-    @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
-        return getTimeOfDay(world, tick, partialTick);
-    }
-
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick)
-    {
-        float[] sunriseCol = new float[4];
-        float sunriseMinimum = 0.4F;
-
-        // Gives a value that goes from 1 to -1 to 1 over the course of a day
-        float sunrisePresence = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F);
-        float middle = 0F;
-        if(sunrisePresence >= middle - sunriseMinimum && sunrisePresence <= middle + sunriseMinimum)
-        {
-            float c = ((sunrisePresence - middle) / sunriseMinimum) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
-            a *= a;
-            sunriseCol[0] = c * 0.3F + 0.7F;
-            sunriseCol[1] = c * c * 0.7F + 0.2F;
-            sunriseCol[2] = c * c * 0.0F + 0.2F;
-            sunriseCol[3] = a;
-            return sunriseCol;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    @Override
-    public int getSkyDarken(World world, long tick, float partialTick)
-    {
-        float f1 = getCelestialAngle(world, tick, partialTick);
-        float f2 = 1.0F - (MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.5F);
-        if(f2 < 0.0F)
-        {
-            f2 = 0.0F;
-        }
-        if(f2 > 1.0F)
-        {
-            f2 = 1.0F;
-        }
-        float weatherOffset = 0;
-        Weather currentWeather = world.getCurrentWeather();
-        if (currentWeather != null) weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
-        return (int)(f2 * (11F - weatherOffset) + weatherOffset);
-    }
-
-    @Override
-    public Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick)
-    {
-        float dayProgress = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        dayProgress = MathHelper.clamp(dayProgress, 0.0f, 1.0f);
-        float r, g, b;
-        
-        if(Colorizers.fog.isEnabled()) {
-        	int x1 = MathHelper.floor_double(x);
-        	int y1 = MathHelper.floor_double(y);
-        	int z1 = MathHelper.floor_double(z);
-        	
-        	int color = Colorizers.fog.getColor(world, x1, y1, z1);
-        	
-        	r = ((color >> 16) & 0xFF) / 255.0f;
-        	g = ((color >> 8) & 0xFF) / 255.0f;
-        	b = (color & 0xFF) / 255.0f;
-        }else {
-            r = 0.7529412f;
-            g = 0.8470588f;
-            b = 1.0f;
-        }
-        r *= dayProgress * 0.94f + 0.06f;
-        g *= dayProgress * 0.94f + 0.06f;
-        b *= dayProgress * 0.91f + 0.09f;
-        return Vec3d.createVector(r, g, b);
-    }
-
-    @Override
-    public boolean mayRespawn()
-    {
-        return true;
-    }
-
-    @Override
-    public boolean hasGround()
-    {
-        return true;
-    }
-
-    @Override
-    public boolean hasAurora()
-    {
-        return true;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldAmplified.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldAmplified.java
deleted file mode 100644
index a2a529ac8..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldAmplified.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldAmplified
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldAmplified(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldClassic.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldClassic.java
deleted file mode 100644
index 46fd865b2..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldClassic.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.classic.ChunkGeneratorClassic;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldClassic
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldClassic(String languageKey)
-    {
-        super(
-                languageKey,
-                Weather.overworldClear,
-                new WindManagerGeneric(),
-                SeasonConfig.builder()
-                        .withSingleSeason(Seasons.NULL)
-                        .build()
-        );
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_RETRO, 1.0, 1.0, 1.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorClassic(world);
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldDefault.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldDefault.java
deleted file mode 100644
index 7cf10558a..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldDefault.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldDefault
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldDefault(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldExtended.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldExtended.java
deleted file mode 100644
index 7befdd494..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldExtended.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldExtended
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldExtended(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this);
-//                .withTemperatureScales(0.0125, 0.0125, 0.25, 0.01)
-//                .withHumidityScales(0.025, 0.025,  0.3, 0.004)
-//                .withFuzzinessScales(0.25, 0.25, 0.025);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 128;
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 256 - 20;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldFloating.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldFloating.java
deleted file mode 100644
index 4f50e5acd..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldFloating.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.overworld.floating.ChunkGeneratorOverworldFloating;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldFloating
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldFloating(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this)
-                .withTemperatureScales(0.00625, 0.00625, 0.25, 0.01)
-                .withHumidityScales(0.0125, 0.0125, 0.3, 0.01)
-                .withFuzzinessScales(8, 8, 0.025);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 0;
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorOverworldFloating(world);
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        Block block = world.getBlock(x, y, z);
-        return world.getHeightValue(x, z) > 0 && block != null && block.isSolidRender();
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 32f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldHell.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldHell.java
deleted file mode 100644
index a6bccdf83..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldHell.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biome;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.overworld.hell.ChunkGeneratorOverworldHell;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldHell
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldHell(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldRainBlood,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.OVERWORLD_HELL)
-                .build()
-        );
-    }
-
-    @Override
-    public void onWorldCreation(World world)
-    {
-        super.onWorldCreation(world);
-
-        world.setWorldTime(576000);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public int getOceanBlock()
-    {
-        return Block.fluidLavaStill.id;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_HELL, 1.0, 1.0, 0.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorOverworldHell(world);
-    }
-
-    @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
-        return 0.5f;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-
-    @Override
-    public boolean hasAurora()
-    {
-        return false;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldInland.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldInland.java
deleted file mode 100644
index a1215b593..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldInland.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.block.Block;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldInland
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldInland(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this)
-                .withTemperatureScales(0.00625, 0.00625, 0.25, 0.01)
-                .withHumidityScales(0.0125, 0.0125, 0.3, 0.01)
-                .withFuzzinessScales(8, 8, 0.025);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 0;
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 236.0f;
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return world.getBlockId(x, y, z) == Block.grass.id;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIslands.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIslands.java
deleted file mode 100644
index 09725306a..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIslands.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldIslands
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldIslands(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this)
-                .withTemperatureScales(0.00625, 0.00625, 0.25, 0.01)
-                .withHumidityScales(0.0125, 0.0125, 0.3, 0.01)
-                .withFuzzinessScales(8, 8, 0.025);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 160;
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 236.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldParadise.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldParadise.java
deleted file mode 100644
index 4e8f8a1ed..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldParadise.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldParadise
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldParadise(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.OVERWORLD_SPRING)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
-        return 0.0f;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldRetro.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldRetro.java
deleted file mode 100644
index bf45a2b95..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldRetro.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biome;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.ChunkGeneratorOverworldRetro;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldRetro
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldRetro(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.NULL)
-                .build()
-        );
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_RETRO, 1.0, 1.0, 1.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorOverworldRetro(world);
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWinter.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWinter.java
deleted file mode 100644
index 63e92e553..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWinter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldWinter
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldWinter(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldWinterSnow,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSingleSeason(Seasons.OVERWORLD_WINTER_ENDLESS)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWoods.java b/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWoods.java
deleted file mode 100644
index b525c04d5..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldWoods.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.overworld.woods.ChunkGeneratorOverworldWoods;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeOverworldWoods
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldWoods(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
-                .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
-                .build()
-        );
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderOverworld(world.getRandomSeed(), this)
-                .withTemperatureScales(0.00625, 0.00625, 0.25, 0.01)
-                .withHumidityScales(0.0125, 0.0125, 0.3, 0.01)
-                .withFuzzinessScales(8, 8, 0.025);
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 128;
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorOverworldWoods(world);
-    }
-
-    @Override
-    public float getCloudHeight()
-    {
-        return 236.0f;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeParadise.java b/src/main/java/net/minecraft/core/world/type/WorldTypeParadise.java
deleted file mode 100644
index 89d46b8f0..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeParadise.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.client.render.colorizer.Colorizers;
-import net.minecraft.core.Global;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3d;
-import net.minecraft.core.world.World;
-import net.minecraft.core.world.biome.Biomes;
-import net.minecraft.core.world.biome.provider.BiomeProvider;
-import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.perlin.paradise.ChunkGeneratorParadise;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
-
-public abstract class WorldTypeParadise
-    extends WorldType
-{
-    public WorldTypeParadise(String languageKey, Weather defaultWeather, WindManager windManager, SeasonConfig defaultSeasonConfig)
-    {
-        super(
-            languageKey,
-            defaultWeather,
-            windManager,
-            false,
-            createLightRamp(),
-            defaultSeasonConfig
-        );
-    }
-
-    private static float[] createLightRamp()
-    {
-        float[] brightnessRamp = new float[32];
-        float f = 0.05F;
-        for(int i = 0; i <= 31; i++)
-        {
-            float f1 = 1.0F - (float)i / 15F;
-            if (i > 15) f1 = 0.0f;
-            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
-        }
-        return brightnessRamp;
-    }
-
-    @Override
-    public void onWorldCreation(World world)
-    {
-        super.onWorldCreation(world);
-
-        world.setWorldTime(576000);
-    }
-
-    @Override
-    public int getOceanY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getOceanBlock() {
-        return 0;
-    }
-
-    @Override
-    public int getFillerBlock()
-    {
-        return Block.marble.id;
-    }
-
-    @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
-        return new BiomeProviderSingleBiome(Biomes.PARADISE_PARADISE, 0.5, 0.0, 0.0);
-    }
-
-    @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
-        return new ChunkGeneratorParadise(world);
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return true;
-    }
-
-    @Override
-    public int getDayNightCycleLengthTicks()
-    {
-        return Global.DAY_LENGTH_TICKS * 28 * 2;
-    }
-
-    @Override
-    public float getCelestialAngle(World world, long tick, float partialTick)
-    {
-        float dayProgress = getTimeOfDay(world, tick, partialTick);
-        dayProgress -= 0.25f;
-        float f2 = dayProgress;
-        dayProgress = 1.0F - (float)((Math.cos((double)dayProgress * Math.PI) + 1.0D) / 2D);
-        dayProgress = f2 + (dayProgress - f2) / 3F;
-        return dayProgress;
-    }
-
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick)
-    {
-        float[] sunriseCol = new float[4];
-        float f2 = 0.4F;
-        float f3 = MathHelper.cos(timeOfDay * 3.141593F * 2.0F) - 0.0F;
-        float f4 = -0F;
-        if(f3 >= f4 - f2 && f3 <= f4 + f2)
-        {
-            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * 3.141593F)) * 0.99F;
-            a *= a;
-            sunriseCol[0] = c * 0.3F + 0.7F;
-            sunriseCol[1] = c * c * 0.7F + 0.2F;
-            sunriseCol[2] = c * c * 0.0F + 0.2F;
-            sunriseCol[3] = a;
-            return sunriseCol;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    @Override
-    public int getSkyDarken(World world, long tick, float partialTick)
-    {
-        float f1 = getCelestialAngle(world, tick, partialTick);
-        float f2 = 1.0F - (MathHelper.cos(f1 * 3.141593F * 2.0F) * 2.0F + 0.5F);
-        if(f2 < 0.0F)
-        {
-            f2 = 0.0F;
-        }
-        if(f2 > 1.0F)
-        {
-            f2 = 1.0F;
-        }
-        float weatherOffset = 0;
-        if (world.getCurrentWeather() != null) weatherOffset = world.getCurrentWeather().subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
-        int subtracted = (int)(f2 * (11F - weatherOffset) + weatherOffset);
-        if (subtracted > 8) subtracted = 8;
-        return subtracted;
-    }
-
-    @Override
-    public Vec3d getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick)
-    {
-        float f2 = MathHelper.cos(celestialAngle * 3.141593F * 2.0F) * 2.0F + 0.5F;
-        f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
-        float r, g, b;
-        
-        if(Colorizers.fog.isEnabled()) {
-        	int x1 = MathHelper.floor_double(x);
-        	int y1 = MathHelper.floor_double(y);
-        	int z1 = MathHelper.floor_double(z);
-        	
-        	int color = Colorizers.fog.getColor(world, x1, y1, z1);
-        	
-        	r = ((color >> 16) & 0xFF) / 255.0f;
-        	g = ((color >> 8) & 0xFF) / 255.0f;
-        	b = (color & 0xFF) / 255.0f;
-        }else {
-            int i = 0x8080a0;
-            r = (float)(i >> 16 & 0xff) / 255.0f;
-            g = (float)(i >> 8 & 0xff) / 255.0f;
-            b = (float)(i & 0xff) / 255.0f;
-        }
-        r *= f2 * 0.94F + 0.06F;
-        g *= f2 * 0.94F + 0.06F;
-        b *= f2 * 0.91F + 0.09F;
-        return Vec3d.createVector(r, g, b);
-    }
-
-    @Override
-    public boolean mayRespawn() {
-        return false;
-    }
-
-    @Override
-    public float getCloudHeight() {
-        return 8.0F;
-    }
-
-    @Override
-    public boolean hasGround() {
-        return false;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeParadiseDefault.java b/src/main/java/net/minecraft/core/world/type/WorldTypeParadiseDefault.java
deleted file mode 100644
index 4ab0a8b57..000000000
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeParadiseDefault.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package net.minecraft.core.world.type;
-
-import net.minecraft.core.world.config.season.SeasonConfig;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManager;
-import net.minecraft.core.world.wind.WindManagerGeneric;
-
-public class WorldTypeParadiseDefault
-    extends WorldTypeParadise
-{
-    public WorldTypeParadiseDefault(String languageKey)
-    {
-        super(
-            languageKey,
-            Weather.overworldClear,
-            new WindManagerGeneric(),
-            SeasonConfig.builder()
-                .withSeasonInCycle(Seasons.PARADISE_GOLD, 28)
-                .withSeasonInCycle(Seasons.PARADISE_SILVER, 28)
-                .build()
-        );
-    }
-
-    @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY()
-    {
-        return 255;
-    }
-}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypes.java b/src/main/java/net/minecraft/core/world/type/WorldTypes.java
index 9bc260d22..3a2dacbd9 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypes.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypes.java
@@ -1,30 +1,195 @@
 package net.minecraft.core.world.type;
 
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.world.config.season.SeasonConfig;
+import net.minecraft.core.world.season.Seasons;
+import net.minecraft.core.world.type.nether.WorldTypeNether;
+import net.minecraft.core.world.type.nether.WorldTypeNetherSkyblock;
+import net.minecraft.core.world.type.overworld.*;
+import net.minecraft.core.world.type.paradise.WorldTypeParadise;
+import net.minecraft.core.world.weather.Weathers;
 
-public abstract class WorldTypes
-{
-    public static final WorldType OVERWORLD_EXTENDED = register("minecraft:overworld.extended", new WorldTypeOverworldExtended("worldType.overworld.extended"));
-    public static final WorldType OVERWORLD_DEFAULT = register("minecraft:overworld.default", new WorldTypeOverworldDefault("worldType.overworld.default"));
-    public static final WorldType NETHER_DEFAULT = register("minecraft:nether.default", new WorldTypeNetherDefault("worldType.nether.default"));
-    public static final WorldType PARADISE_DEFAULT = register("minecraft:paradise.default", new WorldTypeParadiseDefault("worldType.paradise.default"));
-    public static final WorldType FLAT = register("minecraft:flat", new WorldTypeFlat("worldType.flat"));
-    public static final WorldType OVERWORLD_FLOATING = register("minecraft:overworld.floating", new WorldTypeOverworldFloating("worldType.overworld.floating"));
-    public static final WorldType OVERWORLD_AMPLIFIED = register("minecraft:overworld.amplified", new WorldTypeOverworldAmplified("worldType.overworld.amplified"));
-    public static final WorldType OVERWORLD_RETRO = register("minecraft:overworld.retro", new WorldTypeOverworldRetro("worldType.overworld.retro"));
-    public static final WorldType OVERWORLD_ISLANDS = register("minecraft:overworld.islands", new WorldTypeOverworldIslands("worldType.overworld.islands"));
-    public static final WorldType OVERWORLD_WINTER = register("minecraft:overworld.winter", new WorldTypeOverworldWinter("worldType.overworld.winter"));
-    public static final WorldType OVERWORLD_HELL = register("minecraft:overworld.hell", new WorldTypeOverworldHell("worldType.overworld.hell"));
-    public static final WorldType OVERWORLD_WOODS = register("minecraft:overworld.woods", new WorldTypeOverworldWoods("worldType.overworld.woods"));
-    public static final WorldType OVERWORLD_PARADISE = register("minecraft:overworld.paradise", new WorldTypeOverworldParadise("worldType.overworld.paradise"));
-    public static final WorldType OVERWORLD_INLAND = register("minecraft:overworld.inland", new WorldTypeOverworldInland("worldType.overworld.inland"));
-    public static final WorldType OVERWORLD_CLASSIC = register("minecraft:overworld.classic", new WorldTypeOverworldClassic("worldType.overworld.classic"));
-    public static final WorldType OVERWORLD_INDEV = register("minecraft:overworld.indev", new WorldTypeOverworldIndev("worldType.overworld.indev"));
-    public static final WorldType EMPTY = register("minecraft:empty", new WorldTypeEmpty("worldType.empty"));
-    public static final WorldType DEBUG = register("minecraft:debug", new WorldTypeDebug("worldType.debug"));
+public abstract class WorldTypes {
+    public static final WorldType OVERWORLD_EXTENDED = register(
+            "minecraft:overworld.extended",
+            new WorldTypeOverworld(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.extended")
+            )
+    );
+    public static final WorldType OVERWORLD_DEFAULT = register(
+            "minecraft:overworld.default",
+            new WorldTypeOverworld(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.default")
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType NETHER_DEFAULT = register(
+            "minecraft:nether.default",
+            new WorldTypeNether(
+                    WorldTypeNether.defaultProperties("worldType.nether.default")
+            )
+    );
+    public static final WorldType NETHER_SKYBLOCK = register(
+            "minecraft:nether.skyblock",
+            new WorldTypeNetherSkyblock(
+                    WorldTypeNether.defaultProperties("worldType.nether.skyblock")
+                        .bounds(0, 127, 0)
+            )
+    );
+    public static final WorldType PARADISE_DEFAULT = register(
+            "minecraft:paradise.default",
+            new WorldTypeParadise(
+                    WorldTypeParadise.defaultProperties("worldType.paradise.default")
+            )
+    );
+    public static final WorldType FLAT = register(
+            "minecraft:flat",
+            new WorldTypeFlat(
+                    WorldType.Properties.of("worldType.flat")
+                            .brightnessRamp(WorldTypeOverworld.createLightRamp())
+                            .fillerBlock(Blocks.STONE)
+                            .allowRespawn()
+                            .bounds(0, 31, 0)
+                            .cloudHeight(256f - 20f)
+                            .seasonConfig(SeasonConfig.builder()
+                                    .withSingleSeason(Seasons.OVERWORLD_SUMMER)
+                                    .build()
+                            )
+            )
+    );
+    public static final WorldType OVERWORLD_FLOATING = register(
+            "minecraft:overworld.floating",
+            new WorldTypeOverworldFloating(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.floating")
+                            .bounds(0, 255, 0)
+                            .oceanBlock(null)
+                            .cloudHeight(32f)
+            )
+    );
+    public static final WorldType OVERWORLD_AMPLIFIED = register(
+            "minecraft:overworld.amplified",
+            new WorldTypeOverworld(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.amplified")
+                            .bounds(0, 255, 64)
+                            .cloudHeight(128f - 20f)
+            )
+    );
+    public static final WorldType OVERWORLD_RETRO = register(
+            "minecraft:overworld.retro",
+            new WorldTypeOverworldRetro(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.retro")
+                            .seasonConfig(null)
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType OVERWORLD_ISLANDS = register(
+            "minecraft:overworld.islands",
+            new WorldTypeOverworld(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.islands")
+                            .bounds(0, 255, 160)
+            )
+    );
+    public static final WorldType OVERWORLD_WINTER = register(
+            "minecraft:overworld.winter",
+            new WorldTypeOverworld(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.winter")
+                            .seasonConfig(SeasonConfig.builder()
+                                    .withSingleSeason(Seasons.OVERWORLD_WINTER_ENDLESS)
+                                    .build()
+                            )
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType OVERWORLD_HELL = register(
+            "minecraft:overworld.hell",
+            new WorldTypeOverworldHell(
+                    WorldType.Properties.of("worldType.overworld.hell")
+                            .brightnessRamp(WorldTypeOverworld.createLightRamp())
+                            .seasonConfig(SeasonConfig.builder()
+                                    .withSingleSeason(Seasons.OVERWORLD_HELL)
+                                    .build()
+                            )
+                            .oceanBlock(Blocks.FLUID_LAVA_STILL)
+                            .fillerBlock(Blocks.STONE)
+                            .allowRespawn()
+                            .bounds(0, 127, 64)
+                            .defaultWeather(Weathers.OVERWORLD_CLEAR_HELL)
+            )
+    );
+    public static final WorldType OVERWORLD_WOODS = register(
+            "minecraft:overworld.woods",
+            new WorldTypeOverworldWoods(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.woods")
+                            .defaultWeather(Weathers.OVERWORLD_CLEAR_WOODS)
+            )
+    );
+    public static final WorldType OVERWORLD_PARADISE = register(
+            "minecraft:overworld.paradise",
+            new WorldTypeOverworldParadise(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.paradise")
+                            .seasonConfig(SeasonConfig.builder()
+                                    .withSingleSeason(Seasons.OVERWORLD_SPRING)
+                                    .build()
+                            )
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType OVERWORLD_INLAND = register(
+            "minecraft:overworld.inland",
+            new WorldTypeOverworldInland(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.inland")
+                            .bounds(0, 255, 0)
+                            .oceanBlock(null)
+            )
+    );
+    public static final WorldType OVERWORLD_CLASSIC = register(
+            "minecraft:overworld.classic",
+            new WorldTypeOverworldClassic(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.classic")
+                            .seasonConfig(null)
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType OVERWORLD_INDEV = register(
+            "minecraft:overworld.indev",
+            new WorldTypeOverworldIndev(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.indev")
+                            .seasonConfig(null)
+                            .bounds(0, 127, 64)
+            )
+    );
+    public static final WorldType OVERWORLD_SKYBLOCK = register(
+            "minecraft:overworld.skyblock",
+            new WorldTypeOverworldSkyblock(
+                    WorldTypeOverworld.defaultProperties("worldType.overworld.skyblock")
+                        .bounds(0, 127, 0)
+            )
+    );
+    public static final WorldType EMPTY = register(
+            "minecraft:empty",
+            new WorldTypeEmpty(
+                    WorldType.Properties.of("worldType.empty")
+                            .brightnessRamp(WorldTypeEmpty.createLightRamp())
+                            .bounds(0, 255, 0)
+                            .allowRespawn()
+                            .cloudHeight(128f - 20f)
+                            .noGround()
+            )
+    );
+    public static final WorldType DEBUG = register(
+            "minecraft:debug",
+            new WorldTypeDebug(
+                    WorldType.Properties.of("worldType.debug")
+                            .brightnessRamp(WorldTypeDebug.createLightRamp())
+                            .bounds(0, 255, 0)
+                            .allowRespawn()
+                            .cloudHeight(128f - 20f)
+                            .noGround()
+            )
+    );
 
-    public static WorldType register(String key, WorldType worldType)
-    {
+    public static WorldType register(String key, WorldType worldType) {
         Registries.WORLD_TYPES.register(key, worldType);
 
         return worldType;
diff --git a/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java
new file mode 100644
index 000000000..1fb276125
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java
@@ -0,0 +1,95 @@
+package net.minecraft.core.world.type.nether;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.nether.ChunkGeneratorNether;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeNether
+        extends WorldType {
+    public WorldTypeNether(Properties properties) {
+        super(properties);
+    }
+
+    public static Properties defaultProperties(String translationKey) {
+        return Properties.of(translationKey)
+                .brightnessRamp(getLightRamp())
+                .oceanBlock(Blocks.FLUID_LAVA_STILL)
+                .fillerBlock(Blocks.NETHERRACK)
+                .noClouds()
+                .noSky()
+                .withCeiling()
+                .bounds(128, 255, 32);
+    }
+
+    private static float[] getLightRamp() {
+        float[] brightnessRamp = new float[32];
+        float f = 0.1F;
+        for (int i = 0; i <= 15; i++) {
+            float f1 = 1.0F - (float) i / 15F;
+            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
+        }
+        return brightnessRamp;
+    }
+
+    @Override
+    public void onWorldCreation(World world) {
+        super.onWorldCreation(world);
+
+        world.setWorldTime(72000);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.NETHER_NETHER, 1.0, 0.0, 1.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorNether(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return true;
+    }
+
+    @Override
+    public float getCelestialAngle(World world, long tick, float partialTick) {
+        return 0.5f;
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        return new float[4];
+    }
+
+    @Override
+    public int getSkyDarken(World world, long tick, float partialTick) {
+        return 0;
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            float r = ((color >> 16) & 0xFF) / 255.0f;
+            float g = ((color >> 8) & 0xFF) / 255.0f;
+            float b = (color & 0xFF) / 255.0f;
+            return Vec3.getTempVec3(r, g, b);
+        }
+        return Vec3.getTempVec3(0.0, 0.0, 0.0);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherSkyblock.java b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherSkyblock.java
new file mode 100644
index 000000000..ea71bcce3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherSkyblock.java
@@ -0,0 +1,17 @@
+package net.minecraft.core.world.type.nether;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.skyblock.ChunkGeneratorSkyblockNether;
+
+public class WorldTypeNetherSkyblock
+    extends WorldTypeNether {
+    public WorldTypeNetherSkyblock(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorSkyblockNether(world);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeFlat.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeFlat.java
new file mode 100644
index 000000000..d9e5b0b8c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeFlat.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.flat.ChunkGeneratorFlat;
+
+public class WorldTypeFlat
+        extends WorldTypeOverworld {
+    public WorldTypeFlat(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_PLAINS, 0.5, 0.0, 0.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorFlat(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return world.getBlockId(x, y, z) == Blocks.GRASS.id;
+    }
+
+    @Override
+    public void getRespawnLocation(World world) {
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java
new file mode 100644
index 000000000..a252deae4
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java
@@ -0,0 +1,142 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
+import net.minecraft.core.world.config.season.SeasonConfig;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.overworld.ChunkGeneratorOverworld;
+import net.minecraft.core.world.season.Seasons;
+import net.minecraft.core.world.type.WorldType;
+import net.minecraft.core.world.weather.Weather;
+
+public class WorldTypeOverworld
+        extends WorldType {
+    public WorldTypeOverworld(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public void onWorldCreation(World world) {
+        super.onWorldCreation(world);
+
+        world.setWorldTime(72000 + 3000);
+    }
+
+    public static Properties defaultProperties(String translationKey) {
+        return Properties.of(translationKey)
+                .brightnessRamp(createLightRamp())
+                .seasonConfig(SeasonConfig.builder()
+                        .withSeasonInCycle(Seasons.OVERWORLD_SPRING, 14)
+                        .withSeasonInCycle(Seasons.OVERWORLD_SUMMER, 14)
+                        .withSeasonInCycle(Seasons.OVERWORLD_FALL, 14)
+                        .withSeasonInCycle(Seasons.OVERWORLD_WINTER, 14)
+                        .build()
+                )
+                .oceanBlock(Blocks.FLUID_WATER_STILL)
+                .fillerBlock(Blocks.STONE)
+                .allowRespawn()
+                .withAurora();
+    }
+
+    public static float[] createLightRamp() {
+        float[] brightnessRamp = new float[32];
+        float f = 0.05F;
+        for (int i = 0; i <= 31; i++) {
+            float f1 = 1.0F - (float) i / 15F;
+            if (i > 15) f1 = 0.0f;
+            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
+        }
+        return brightnessRamp;
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderOverworld(world.getRandomSeed(), this);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorOverworld(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return world.getBlockId(x, y, z) == Blocks.SAND.id;
+    }
+
+    @Override
+    public float getCelestialAngle(World world, long tick, float partialTick) {
+        return getTimeOfDay(world, tick, partialTick);
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        float[] sunriseCol = new float[4];
+        float sunriseMinimum = 0.4F;
+
+        // Gives a value that goes from 1 to -1 to 1 over the course of a day
+        float sunrisePresence = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F);
+        float middle = 0F;
+        if (sunrisePresence >= middle - sunriseMinimum && sunrisePresence <= middle + sunriseMinimum) {
+            float c = ((sunrisePresence - middle) / sunriseMinimum) * 0.5F + 0.5F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
+            a *= a;
+            sunriseCol[0] = c * 0.3F + 0.7F;
+            sunriseCol[1] = c * c * 0.7F + 0.2F;
+            sunriseCol[2] = c * c * 0.0F + 0.2F;
+            sunriseCol[3] = a;
+            return sunriseCol;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public int getSkyDarken(World world, long tick, float partialTick) {
+        float f1 = getCelestialAngle(world, tick, partialTick);
+        float f2 = 1.0F - (MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F);
+        if (f2 < 0.0F) {
+            f2 = 0.0F;
+        }
+        if (f2 > 1.0F) {
+            f2 = 1.0F;
+        }
+        float weatherOffset = 0;
+        Weather currentWeather = world.getCurrentWeather();
+        if (currentWeather != null)
+            weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
+        return (int) (f2 * (11F - weatherOffset) + weatherOffset);
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float dayProgress = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        dayProgress = MathHelper.clamp(dayProgress, 0.0f, 1.0f);
+        float r, g, b;
+
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            r = ((color >> 16) & 0xFF) / 255.0f;
+            g = ((color >> 8) & 0xFF) / 255.0f;
+            b = (color & 0xFF) / 255.0f;
+        } else {
+            r = 0.7529412f;
+            g = 0.8470588f;
+            b = 1.0f;
+        }
+        r *= dayProgress * 0.94f + 0.06f;
+        g *= dayProgress * 0.94f + 0.06f;
+        b *= dayProgress * 0.91f + 0.09f;
+        return Vec3.getTempVec3(r, g, b);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldClassic.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldClassic.java
new file mode 100644
index 000000000..af5134ee1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldClassic.java
@@ -0,0 +1,26 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.classic.ChunkGeneratorClassic;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeOverworldClassic
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldClassic(WorldType.Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_RETRO, 1.0, 1.0, 1.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorClassic(world);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldFloating.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldFloating.java
new file mode 100644
index 000000000..c269a8122
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldFloating.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.overworld.floating.ChunkGeneratorOverworldFloating;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeOverworldFloating
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldFloating(WorldType.Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderOverworld(world.getRandomSeed(), this)
+                .withTemperatureScales(0.00625, 0.00625, 0.25, 0.01)
+                .withHumidityScales(0.0125, 0.0125, 0.3, 0.01)
+                .withFuzzinessScales(8, 8, 0.025);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorOverworldFloating(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        Block block = world.getBlock(x, y, z);
+        return world.getHeightValue(x, z) > 0 && block != null && block.isSolidRender();
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldHell.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldHell.java
new file mode 100644
index 000000000..771e3419c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldHell.java
@@ -0,0 +1,37 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.overworld.hell.ChunkGeneratorOverworldHell;
+
+public class WorldTypeOverworldHell
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldHell(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public void onWorldCreation(World world) {
+        super.onWorldCreation(world);
+
+        world.setWorldTime(576000);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_HELL, 1.0, 1.0, 0.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorOverworldHell(world);
+    }
+
+    @Override
+    public float getCelestialAngle(World world, long tick, float partialTick) {
+        return 0.5f;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIndev.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldIndev.java
similarity index 50%
rename from src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIndev.java
rename to src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldIndev.java
index dc696a057..e04ce0c60 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeOverworldIndev.java
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldIndev.java
@@ -1,56 +1,25 @@
-package net.minecraft.core.world.type;
+package net.minecraft.core.world.type.overworld;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
-import net.minecraft.core.world.config.season.SeasonConfig;
 import net.minecraft.core.world.generate.chunk.ChunkGenerator;
-import net.minecraft.core.world.generate.chunk.classic.ChunkGeneratorClassic;
 import net.minecraft.core.world.generate.chunk.indev.ChunkGeneratorIndev;
 import net.minecraft.core.world.generate.chunk.indev.IndevWorldTheme;
 import net.minecraft.core.world.generate.chunk.indev.IndevWorldType;
 import net.minecraft.core.world.generate.chunk.indev.LevelGenerator;
-import net.minecraft.core.world.season.Seasons;
-import net.minecraft.core.world.weather.Weather;
-import net.minecraft.core.world.wind.WindManagerGeneric;
 
 public class WorldTypeOverworldIndev
-    extends WorldTypeOverworld
-{
-    public WorldTypeOverworldIndev(String languageKey)
-    {
-        super(
-                languageKey,
-                Weather.overworldClear,
-                new WindManagerGeneric(),
-                SeasonConfig.builder()
-                        .withSingleSeason(Seasons.NULL)
-                        .build()
-        );
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldIndev(Properties properties) {
+        super(properties);
     }
 
     @Override
-    public int getMinY()
-    {
-        return 0;
-    }
-
-    @Override
-    public int getMaxY() {
-        return 127;
-    }
-
-    @Override
-    public int getOceanY() {
-        return 64;
-    }
-
-    @Override
-    public boolean isValidSpawn(World world, int x, int y, int z)
-    {
-        return world.getBlockId(x, y, z) == Block.grass.id || world.getBlockId(x, y, z) == Block.sand.id || world.getBlockId(x, y, z) == Block.grassRetro.id;
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return world.getBlockId(x, y, z) == Blocks.GRASS.id || world.getBlockId(x, y, z) == Blocks.SAND.id || world.getBlockId(x, y, z) == Blocks.GRASS_RETRO.id;
     }
 
     @Override
@@ -58,14 +27,12 @@ public class WorldTypeOverworldIndev
         int x = 0;
         int y = 0;
         int z = 0;
-        spawnLoop:  while (true)
-        {
+        spawnLoop:
+        while (true) {
             x = world.rand.nextInt(256);
             z = world.rand.nextInt(256);
-            for (y = getMaxY(); y >= getMinY(); y--)
-            {
-                if (world.getBlockId(x, y + 1, z) == 0 && isValidSpawn(world, x, y, z))
-                {
+            for (y = getMaxY(); y >= getMinY(); y--) {
+                if (world.getBlockId(x, y + 1, z) == 0 && isValidSpawn(world, x, y, z)) {
                     break spawnLoop;
                 }
             }
@@ -80,19 +47,12 @@ public class WorldTypeOverworldIndev
     }
 
     @Override
-    public BiomeProvider createBiomeProvider(World world)
-    {
+    public BiomeProvider createBiomeProvider(World world) {
         return new BiomeProviderSingleBiome(Biomes.OVERWORLD_RETRO, 1.0, 1.0, 1.0);
     }
 
     @Override
-    public ChunkGenerator createChunkGenerator(World world)
-    {
+    public ChunkGenerator createChunkGenerator(World world) {
         return new ChunkGeneratorIndev(world, 256, getMaxY() + 1, 256, IndevWorldType.ISLAND, IndevWorldTheme.NORMAL);
     }
-
-    @Override
-    public float getCloudHeight() {
-        return 108.0f;
-    }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldInland.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldInland.java
new file mode 100644
index 000000000..5bb0326c0
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldInland.java
@@ -0,0 +1,16 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.World;
+
+public class WorldTypeOverworldInland
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldInland(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return world.getBlockId(x, y, z) == Blocks.GRASS.id;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldParadise.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldParadise.java
new file mode 100644
index 000000000..4ada2848a
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldParadise.java
@@ -0,0 +1,15 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+
+public class WorldTypeOverworldParadise
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldParadise(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public float getCelestialAngle(World world, long tick, float partialTick) {
+        return 0.0f;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldRetro.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldRetro.java
new file mode 100644
index 000000000..18e81b245
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldRetro.java
@@ -0,0 +1,25 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.overworld.retro.ChunkGeneratorOverworldRetro;
+
+public class WorldTypeOverworldRetro
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldRetro(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_RETRO, 1.0, 1.0, 1.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorOverworldRetro(world);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldSkyblock.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldSkyblock.java
new file mode 100644
index 000000000..50f5f00a3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldSkyblock.java
@@ -0,0 +1,39 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.skyblock.ChunkGeneratorSkyblock;
+
+public class WorldTypeOverworldSkyblock
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldSkyblock(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.OVERWORLD_PLAINS, 1.0, 1.0, 1.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorSkyblock(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return true;
+    }
+
+    @Override
+    public void getInitialSpawnLocation(World world) {
+        world.getLevelData().setSpawn(0, 66, 0);
+    }
+
+    @Override
+    public void getRespawnLocation(World world) {
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldWoods.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldWoods.java
new file mode 100644
index 000000000..4f56a5d42
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworldWoods.java
@@ -0,0 +1,17 @@
+package net.minecraft.core.world.type.overworld;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.overworld.woods.ChunkGeneratorOverworldWoods;
+
+public class WorldTypeOverworldWoods
+        extends WorldTypeOverworld {
+    public WorldTypeOverworldWoods(Properties properties) {
+        super(properties);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorOverworldWoods(world);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java b/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java
new file mode 100644
index 000000000..1149d1c9d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java
@@ -0,0 +1,147 @@
+package net.minecraft.core.world.type.paradise;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.Global;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biomes;
+import net.minecraft.core.world.biome.provider.BiomeProvider;
+import net.minecraft.core.world.biome.provider.BiomeProviderSingleBiome;
+import net.minecraft.core.world.config.season.SeasonConfig;
+import net.minecraft.core.world.generate.chunk.ChunkGenerator;
+import net.minecraft.core.world.generate.chunk.perlin.paradise.ChunkGeneratorParadise;
+import net.minecraft.core.world.season.Seasons;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeParadise
+        extends WorldType {
+    public WorldTypeParadise(Properties properties) {
+        super(properties);
+    }
+
+    public static Properties defaultProperties(String translationKey) {
+        return Properties.of(translationKey)
+                .brightnessRamp(createLightRamp())
+                .seasonConfig(SeasonConfig.builder()
+                        .withSeasonInCycle(Seasons.PARADISE_GOLD, 28)
+                        .withSeasonInCycle(Seasons.PARADISE_SILVER, 28)
+                        .build()
+                )
+                .fillerBlock(Blocks.MARBLE)
+                .dayNightCycleTicks(Global.DAY_LENGTH_TICKS * 28 * 2)
+                .cloudHeight(8f)
+                .noGround()
+                .bounds(0, 255, 0);
+    }
+
+    private static float[] createLightRamp() {
+        float[] brightnessRamp = new float[32];
+        float f = 0.05F;
+        for (int i = 0; i <= 31; i++) {
+            float f1 = 1.0F - (float) i / 15F;
+            if (i > 15) f1 = 0.0f;
+            brightnessRamp[i] = ((1.0F - f1) / (f1 * 3F + 1.0F)) * (1.0F - f) + f;
+        }
+        return brightnessRamp;
+    }
+
+    @Override
+    public void onWorldCreation(World world) {
+        super.onWorldCreation(world);
+
+        world.setWorldTime(576000);
+    }
+
+    @Override
+    public BiomeProvider createBiomeProvider(World world) {
+        return new BiomeProviderSingleBiome(Biomes.PARADISE_PARADISE, 0.5, 0.0, 0.0);
+    }
+
+    @Override
+    public ChunkGenerator createChunkGenerator(World world) {
+        return new ChunkGeneratorParadise(world);
+    }
+
+    @Override
+    public boolean isValidSpawn(World world, int x, int y, int z) {
+        return true;
+    }
+
+    @Override
+    public float getCelestialAngle(World world, long tick, float partialTick) {
+        float dayProgress = getTimeOfDay(world, tick, partialTick);
+        dayProgress -= 0.25f;
+        float f2 = dayProgress;
+        dayProgress = 1.0F - (float) ((Math.cos((double) dayProgress * Math.PI) + 1.0D) / 2D);
+        dayProgress = f2 + (dayProgress - f2) / 3F;
+        return dayProgress;
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        float[] sunriseCol = new float[4];
+        float f2 = 0.4F;
+        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
+        float f4 = -0F;
+        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
+            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
+            a *= a;
+            sunriseCol[0] = c * 0.3F + 0.7F;
+            sunriseCol[1] = c * c * 0.7F + 0.2F;
+            sunriseCol[2] = c * c * 0.0F + 0.2F;
+            sunriseCol[3] = a;
+            return sunriseCol;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public int getSkyDarken(World world, long tick, float partialTick) {
+        float f1 = getCelestialAngle(world, tick, partialTick);
+        float f2 = 1.0F - (MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F);
+        if (f2 < 0.0F) {
+            f2 = 0.0F;
+        }
+        if (f2 > 1.0F) {
+            f2 = 1.0F;
+        }
+        float weatherOffset = 0;
+        if (world.getCurrentWeather() != null)
+            weatherOffset = world.getCurrentWeather().subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
+        int subtracted = (int) (f2 * (11F - weatherOffset) + weatherOffset);
+        if (subtracted > 8) subtracted = 8;
+        return subtracted;
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
+        float r, g, b;
+
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            r = ((color >> 16) & 0xFF) / 255.0f;
+            g = ((color >> 8) & 0xFF) / 255.0f;
+            b = (color & 0xFF) / 255.0f;
+        } else {
+            int i = 0x8080a0;
+            r = (float) (i >> 16 & 0xff) / 255.0f;
+            g = (float) (i >> 8 & 0xff) / 255.0f;
+            b = (float) (i & 0xff) / 255.0f;
+        }
+        r *= f2 * 0.94F + 0.06F;
+        g *= f2 * 0.94F + 0.06F;
+        b *= f2 * 0.91F + 0.09F;
+        return Vec3.getTempVec3(r, g, b);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/weather/Weather.java b/src/main/java/net/minecraft/core/world/weather/Weather.java
index 39fce5dd2..e900858ba 100644
--- a/src/main/java/net/minecraft/core/world/weather/Weather.java
+++ b/src/main/java/net/minecraft/core/world/weather/Weather.java
@@ -1,6 +1,6 @@
 package net.minecraft.core.world.weather;
 
-import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.chunk.Chunk;
@@ -21,8 +21,8 @@ public abstract class Weather
 	
 	public Weather(int id)
 	{
-		if(weatherList[id] != null) throw new RuntimeException();
-		weatherList[id] = this;
+		if(Weathers.WEATHERS[id] != null) throw new RuntimeException();
+		Weathers.WEATHERS[id] = this;
 		this.weatherId = id;
 	}
 	
@@ -102,7 +102,7 @@ public abstract class Weather
 
 			if (world.getBlockBiome(x, y, z).hasSurfaceSnow())
 			{
-				if (blockId == Block.layerSnow.id)
+				if (blockId == Blocks.LAYER_SNOW.id)
 				{
 					int meta = world.getBlockMetadata(x, y, z);
 					if (meta != 0)
@@ -114,7 +114,7 @@ public abstract class Weather
 			}
 			else
 			{
-				if (blockId == Block.layerSnow.id)
+				if (blockId == Blocks.LAYER_SNOW.id)
 				{
 					int meta = world.getBlockMetadata(x, y, z);
 					if (meta != 0)
@@ -127,9 +127,9 @@ public abstract class Weather
 						world.setBlockWithNotify(x, y, z, 0);
 					}
 				}
-				else if (blockIdBelow == Block.ice.id)
+				else if (blockIdBelow == Blocks.ICE.id)
 				{
-					world.setBlockWithNotify(x, y - 1, z, Block.fluidWaterStill.id);
+					world.setBlockWithNotify(x, y - 1, z, Blocks.FLUID_WATER_STILL.id);
 				}
 			}
 		}
@@ -151,47 +151,23 @@ public abstract class Weather
 
 				if (world.getBlockBiome(chunk.xPosition * 16 + x, y, chunk.zPosition * 16 + z).hasSurfaceSnow())
 				{
-					if (blockId == Block.layerSnow.id)
+					if (blockId == Blocks.LAYER_SNOW.id)
 					{
 						chunk.setBlockMetadata(x, y, z, 0);
 					}
 				}
 				else
 				{
-					if (blockId == Block.layerSnow.id)
+					if (blockId == Blocks.LAYER_SNOW.id)
 					{
 						chunk.setBlockID(x, y, z, 0);
 					}
-					else if (blockIdBelow == Block.ice.id)
+					else if (blockIdBelow == Blocks.ICE.id)
 					{
-						chunk.setBlockID(x, y - 1, z, Block.fluidWaterStill.id);
+						chunk.setBlockID(x, y - 1, z, Blocks.FLUID_WATER_STILL.id);
 					}
 				}
 			}
 		}
 	}
-	
-	public static Weather getWeatherByLanguageKey(String string) {
-		for(Weather weather : Weather.weatherList) {
-			if(weather != null && weather.languageKey.substring(8).equalsIgnoreCase(string)) {
-				return weather;
-			}
-		}
-		return null;
-	}
-	
-	public static Weather getWeather(int i) {
-		return weatherList[i];
-	}
-	
-	public static final Weather[] weatherList = new Weather[16];
-	public static final Weather overworldClear = new WeatherClear(0).setLanguageKey("overworld.clear");
-	public static final Weather overworldRain = new WeatherRain(1).setLanguageKey("overworld.rain").setPrecipitation("/environment/rain.png", 0).setSubtractLightLevel(3).setSpawnRainParticles(true).setFogDistance(0.5f);
-	public static final Weather overworldSnow = new WeatherSnow(2).setLanguageKey("overworld.snow").setPrecipitation("/environment/snow.png", 1).setSubtractLightLevel(1).setFogDistance(0.5f);
-	public static final Weather overworldStorm = new WeatherStorm(3).setLanguageKey("overworld.storm").setPrecipitation("/environment/rain.png", 0).setSubtractLightLevel(5).setSpawnRainParticles(true).setMobsSpawnInDaylight().setFogDistance(0.4f);
-	public static final Weather overworldFog = new WeatherClear(4).setLanguageKey("overworld.fog").setFogDistance(0.125f);
-	public static final Weather overworldHellClear = new WeatherClear(5).setLanguageKey("overworld.clear.hell").setSubtractLightLevel(7);
-	public static final Weather overworldWoodsClear = new WeatherClear(6).setLanguageKey("overworld.clear.woods").setSubtractLightLevel(2);
-	public static final Weather overworldWinterSnow = new WeatherSnow(7).setLanguageKey("overworld.winter.snow").setPrecipitation("/environment/snow.png", 1);
-	public static final Weather overworldRainBlood = new WeatherStorm(8).setLanguageKey("overworld.rain.blood").setPrecipitation("/environment/rain_blood.png", 2).setSubtractLightLevel(5).setMobsSpawnInDaylight().setFogDistance(0.4f);
 }
diff --git a/src/main/java/net/minecraft/core/world/weather/WeatherClear.java b/src/main/java/net/minecraft/core/world/weather/WeatherClear.java
index 6fa24f6e3..8a3f4a9cb 100644
--- a/src/main/java/net/minecraft/core/world/weather/WeatherClear.java
+++ b/src/main/java/net/minecraft/core/world/weather/WeatherClear.java
@@ -2,6 +2,7 @@ package net.minecraft.core.world.weather;
 
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.chunk.Chunk;
 
 import java.util.Random;
diff --git a/src/main/java/net/minecraft/core/world/weather/WeatherRain.java b/src/main/java/net/minecraft/core/world/weather/WeatherRain.java
index 68966aa58..af3d5cccd 100644
--- a/src/main/java/net/minecraft/core/world/weather/WeatherRain.java
+++ b/src/main/java/net/minecraft/core/world/weather/WeatherRain.java
@@ -2,6 +2,7 @@ package net.minecraft.core.world.weather;
 
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 
 import java.util.Random;
 
diff --git a/src/main/java/net/minecraft/core/world/weather/WeatherSnow.java b/src/main/java/net/minecraft/core/world/weather/WeatherSnow.java
index adc52ac52..4a82a9c4b 100644
--- a/src/main/java/net/minecraft/core/world/weather/WeatherSnow.java
+++ b/src/main/java/net/minecraft/core/world/weather/WeatherSnow.java
@@ -3,8 +3,8 @@ package net.minecraft.core.world.weather;
 import java.util.Random;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockFluidStill;
-import net.minecraft.core.block.BlockLayerSnow;
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.SnowLayerBlock;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.World;
@@ -25,11 +25,11 @@ public class WeatherSnow extends Weather
 	{
 		if (world.weatherManager.getWeatherPower() <= 0.6f)
 		{
-			return "/environment/snow_light.png";
+			return "/assets/minecraft/textures/environment/snow_light.png";
 		}
 		else
 		{
-			return "/environment/snow.png";
+			return "/assets/minecraft/textures/environment/snow.png";
 		}
 	}
 
@@ -56,14 +56,14 @@ zLoop:		for (int z = 0; z < 16; z++)
 
 				if (y >= 0 && y < world.getHeightBlocks() && chunk.getBrightness(LightLayer.Block, x, y, z) < 10)
 				{
-					if (blockId == 0 && Block.layerSnow.canPlaceBlockAt(world, worldX, y, worldZ) && blockIdBelow != Block.ice.id)
+					if (blockId == 0 && Blocks.LAYER_SNOW.canPlaceBlockAt(world, worldX, y, worldZ) && blockIdBelow != Blocks.ICE.id)
 					{
-						chunk.setBlockIDRaw(x, y, z, Block.layerSnow.id);
+						chunk.setBlockIDRaw(x, y, z, Blocks.LAYER_SNOW.id);
 					}
-					else if (blockIdBelow == Block.fluidWaterStill.id && chunk.getBlockMetadata(x, y - 1, z) == 0) {
-						chunk.setBlockIDRaw(x, y - 1, z, Block.ice.id);
-						if (chunk.getBlockID(x, y - 2, z) == Block.fluidWaterStill.id){
-							chunk.setBlockIDRaw(x, y - 2, z, Block.fluidWaterFlowing.id);
+					else if (blockIdBelow == Blocks.FLUID_WATER_STILL.id && chunk.getBlockMetadata(x, y - 1, z) == 0) {
+						chunk.setBlockIDRaw(x, y - 1, z, Blocks.ICE.id);
+						if (chunk.getBlockID(x, y - 2, z) == Blocks.FLUID_WATER_STILL.id){
+							chunk.setBlockIDRaw(x, y - 2, z, Blocks.FLUID_WATER_FLOWING.id);
 						}
 					}
 				}
@@ -95,20 +95,20 @@ zLoop:		for (int z = 0; z < 16; z++)
 		
 		if (world.weatherManager.getWeatherPower() > 0.6f && y >= 0 && y < world.getHeightBlocks() && world.getSavedLightValue(LightLayer.Block, x, y, z) < 10)
 		{
-			if (blockId == 0 && blockIdBelow != 0 && Block.layerSnow.canPlaceBlockAt(world, x, y, z) && blockIdBelow != Block.ice.id)
+			if (blockId == 0 && blockIdBelow != 0 && Blocks.LAYER_SNOW.canPlaceBlockAt(world, x, y, z) && blockIdBelow != Blocks.ICE.id)
 			{
 				if(snow)
 				{
-					world.setBlockWithNotify(x, y, z, Block.layerSnow.id);
+					world.setBlockWithNotify(x, y, z, Blocks.LAYER_SNOW.id);
 				}
 			}
-			else if (world.weatherManager.getWeatherPower() > 0.5f && blockId == Block.layerSnow.id && world.getSeasonManager().getCurrentSeason() != null && (world.getSeasonManager().getCurrentSeason().hasDeeperSnow || biome == Biomes.OVERWORLD_GLACIER))
+			else if (world.weatherManager.getWeatherPower() > 0.5f && blockId == Blocks.LAYER_SNOW.id && world.getSeasonManager().getCurrentSeason() != null && (world.getSeasonManager().getCurrentSeason().hasDeeperSnow || biome == Biomes.OVERWORLD_GLACIER))
 			{
 				if(snow) {
-					((BlockLayerSnow)Block.layerSnow).accumulate(world, x, y, z);
+					((SnowLayerBlock)Blocks.LAYER_SNOW).accumulate(world, x, y, z);
 				}
 			}
-			else if (blockIdBelow == Block.fluidWaterStill.id && world.getBlockMetadata(x, y - 1, z) == 0)
+			else if (blockIdBelow == Blocks.FLUID_WATER_STILL.id && world.getBlockMetadata(x, y - 1, z) == 0)
 			{
 				if(rand.nextFloat() < world.weatherManager.getWeatherPower() * world.weatherManager.getWeatherIntensity())
 				{
@@ -116,9 +116,9 @@ zLoop:		for (int z = 0; z < 16; z++)
 					{
 						Direction direction = Direction.horizontalDirections[i];
 						Block block = world.getBlock(x + direction.getOffsetX(), y - 1, z + direction.getOffsetZ());
-						if(block == Block.ice || block != null && block.isSolidRender())
+						if(block == Blocks.ICE || block != null && block.isSolidRender())
 						{
-							world.setBlockWithNotify(x, y - 1, z, Block.ice.id);
+							world.setBlockWithNotify(x, y - 1, z, Blocks.ICE.id);
 							break;
 						}
 					}	
diff --git a/src/main/java/net/minecraft/core/world/weather/WeatherStorm.java b/src/main/java/net/minecraft/core/world/weather/WeatherStorm.java
index b2216c480..5a1b384e7 100644
--- a/src/main/java/net/minecraft/core/world/weather/WeatherStorm.java
+++ b/src/main/java/net/minecraft/core/world/weather/WeatherStorm.java
@@ -1,8 +1,14 @@
 package net.minecraft.core.world.weather;
 
-import net.minecraft.core.entity.EntityLightningBolt;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.LightningEntity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
+import java.util.List;
 import java.util.Random;
 
 public class WeatherStorm extends WeatherRain
@@ -29,15 +35,53 @@ public class WeatherStorm extends WeatherRain
 	{
 		super.doEnvironmentUpdate(world, rand, x, z);
 		
-		if (rand.nextInt((int)(0x186a0 * (1 / world.weatherManager.getWeatherPower()))) == 0) // Yes this is a weird value, it's what it used before, don't @ me
+		if (rand.nextInt((int)(100000 * (1 / world.weatherManager.getWeatherPower()))) == 0)
 		{
-			int y = world.getHeightValue(x, z);
-			
-			if (world.canBlockBeRainedOn(x, y, z))
+			final int searchRadius = 32;
+
+			int maxWeight = Integer.MIN_VALUE;
+			int targetX = x;
+			int targetY = world.getHeightValue(x, z);
+			int targetZ = z;
+			for (int _x = -searchRadius; _x <= searchRadius; _x++) {
+				for (int _z = -searchRadius; _z < searchRadius; _z++) {
+					int checkX = x + _x;
+					int checkZ = z + _z;
+					int checkY = world.getHeightValue(checkX, checkZ);
+					int weight = evalStrikeWeight(world, rand, x, z, checkX, checkY, checkZ);
+					if (weight > maxWeight){
+						maxWeight = weight;
+						targetX = checkX;
+						targetY = checkY;
+						targetZ = checkZ;
+					}
+				}
+			}
+
+			if (world.canBlockBeRainedOn(targetX, targetY, targetZ))
 			{
-				world.addWeatherEffect(new EntityLightningBolt(world, x, y, z));
+				world.addWeatherEffect(new LightningEntity(world, targetX, targetY, targetZ));
 			}			
 		}
 	}
+	public int evalStrikeWeight(World world, Random random, int orgX, int orgZ, int checkX, int checkY, int checkZ){
+		Material material = world.getBlockMaterial(checkX, checkY - 1, checkZ);
+		int weight = random.nextInt(10);
+		weight += checkY;
+		weight += material.getConductivity();
+
+		List<Entity> entityList = world.getEntitiesWithinAABB(Mob.class, AABB.getTemporaryBB(checkX, checkY, checkZ, checkX + 1, checkY + 1, checkZ + 1));
+		if (!entityList.isEmpty()){
+			weight += 4; // :)
+		}
+
+		final int distX =  (checkX - orgX);
+		final int distZ =  (checkZ - orgZ);
+		final double dist = Math.sqrt(distX * distX + distZ + distZ);
+		final int decayFactor = MathHelper.floor(Math.sqrt(dist) / 4);
+		weight -= decayFactor;
+
+		return weight;
+	}
 
 }
diff --git a/src/main/java/net/minecraft/core/world/weather/Weathers.java b/src/main/java/net/minecraft/core/world/weather/Weathers.java
new file mode 100644
index 000000000..49e438226
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/weather/Weathers.java
@@ -0,0 +1,28 @@
+package net.minecraft.core.world.weather;
+
+public abstract class Weathers {
+    public static final Weather[] WEATHERS = new Weather[16];
+    public static final Weather OVERWORLD_CLEAR = new WeatherClear(0).setLanguageKey("overworld.clear");
+    public static final Weather OVERWORLD_RAIN = new WeatherRain(1).setLanguageKey("overworld.rain").setPrecipitation("/assets/minecraft/textures/environment/rain.png", 0).setSubtractLightLevel(3).setSpawnRainParticles(true).setFogDistance(0.5f);
+    public static final Weather OVERWORLD_SNOW = new WeatherSnow(2).setLanguageKey("overworld.snow").setPrecipitation("/assets/minecraft/textures/environment/snow.png", 1).setSubtractLightLevel(1).setFogDistance(0.5f);
+    public static final Weather OVERWORLD_STORM = new WeatherStorm(3).setLanguageKey("overworld.storm").setPrecipitation("/assets/minecraft/textures/environment/rain.png", 0).setSubtractLightLevel(5).setSpawnRainParticles(true).setMobsSpawnInDaylight().setFogDistance(0.4f);
+    public static final Weather OVERWORLD_FOG = new WeatherClear(4).setLanguageKey("overworld.fog").setFogDistance(0.125f);
+    public static final Weather OVERWORLD_CLEAR_HELL = new WeatherClear(5).setLanguageKey("overworld.clear.hell").setSubtractLightLevel(7);
+    public static final Weather OVERWORLD_CLEAR_WOODS = new WeatherClear(6).setLanguageKey("overworld.clear.woods").setSubtractLightLevel(2);
+    public static final Weather OVERWORLD_WINTER_SNOW = new WeatherSnow(7).setLanguageKey("overworld.winter.snow").setPrecipitation("/assets/minecraft/textures/environment/snow.png", 1);
+    public static final Weather OVERWORLD_RAIN_BLOOD = new WeatherStorm(8).setLanguageKey("overworld.rain.blood").setPrecipitation("/assets/minecraft/textures/environment/rain_blood.png", 2).setSubtractLightLevel(5).setMobsSpawnInDaylight().setFogDistance(0.4f);
+
+    public static Weather getWeatherByLanguageKey(String string) {
+        for(Weather weather : WEATHERS) {
+            if(weather != null && weather.languageKey.substring(8).equalsIgnoreCase(string)) {
+                return weather;
+            }
+        }
+        return null;
+    }
+
+    public static Weather getWeather(int i) {
+        return WEATHERS[i];
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/world/wind/WindManager.java b/src/main/java/net/minecraft/core/world/wind/WindProvider.java
similarity index 93%
rename from src/main/java/net/minecraft/core/world/wind/WindManager.java
rename to src/main/java/net/minecraft/core/world/wind/WindProvider.java
index 2ad583ce6..d8846765e 100644
--- a/src/main/java/net/minecraft/core/world/wind/WindManager.java
+++ b/src/main/java/net/minecraft/core/world/wind/WindProvider.java
@@ -2,7 +2,7 @@ package net.minecraft.core.world.wind;
 
 import net.minecraft.core.world.World;
 
-public abstract class WindManager {
+public abstract class WindProvider {
     /**
      * Gets the current wind direction.
      * @param world The world.
diff --git a/src/main/java/net/minecraft/core/world/wind/WindManagerGeneric.java b/src/main/java/net/minecraft/core/world/wind/WindProviderGeneric.java
similarity index 97%
rename from src/main/java/net/minecraft/core/world/wind/WindManagerGeneric.java
rename to src/main/java/net/minecraft/core/world/wind/WindProviderGeneric.java
index cde005071..d92ba3b2a 100644
--- a/src/main/java/net/minecraft/core/world/wind/WindManagerGeneric.java
+++ b/src/main/java/net/minecraft/core/world/wind/WindProviderGeneric.java
@@ -1,12 +1,11 @@
 package net.minecraft.core.world.wind;
 
-import net.minecraft.core.Global;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.noise.ImprovedNoise;
 
 import java.util.Random;
 
-public class WindManagerGeneric extends WindManager {
+public class WindProviderGeneric extends WindProvider {
     private final double perlinMax = Math.sqrt(3.0 / 4.0);
     
     private long randomSeed = -1;
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 6bcab559d..684464006 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -4,27 +4,26 @@ import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.Global;
 import net.minecraft.core.MinecraftAccessor;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.Block;
-import net.minecraft.core.crafting.legacy.CraftingManager;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.data.DataLoader;
 import net.minecraft.core.data.legacy.LegacyWorldTypes;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.SkinVariantList;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.ICommandListener;
 import net.minecraft.core.net.IUpdatePlayerListBox;
 import net.minecraft.core.net.NetworkManager;
 import net.minecraft.core.net.PropertyManager;
-import net.minecraft.core.net.ServerCommand;
+import net.minecraft.core.net.ServerCommandEntry;
 import net.minecraft.core.net.command.ServerCommandHandler;
-import net.minecraft.core.net.packet.Packet4UpdateTime;
+import net.minecraft.core.net.packet.SetTimePacket;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.sound.SoundTypes;
 import net.minecraft.core.util.helper.RSA;
 import net.minecraft.core.util.helper.RestHandler;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
@@ -43,7 +42,7 @@ import net.minecraft.core.world.type.WorldType;
 import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.ServerSkinVariantList;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.server.gui.ServerGui;
 import net.minecraft.server.net.ConsoleCommandHandler;
 import net.minecraft.server.net.NetworkListenThread;
@@ -88,7 +87,6 @@ public class MinecraftServer
         deathTime = 0;
         field_9010_p = new ArrayList();
         commands = Collections.synchronizedList(new ArrayList());
-        entityTracker = new EntityTracker[Dimension.getDimensionList().size()];
         new ThreadSleepForeverServer(this);
     }
 
@@ -172,8 +170,12 @@ public class MinecraftServer
         }
 
         // Manually initialize blocks and items
-        Block.initializeBlocks();
-        Item.initializeItems();
+        Blocks.init();
+        Items.init();
+
+        Dimension.init();
+
+        entityTracker = new EntityTracker[Dimension.getDimensionList().size()];
 
         new Registries();
         BiomeProviderOverworld.init();
@@ -183,7 +185,6 @@ public class MinecraftServer
         DataLoader.loadRecipesFromFile("/recipes/furnace.json");
         DataLoader.loadRecipesFromFile("/recipes/trommel.json");
         DataLoader.loadRecipesFromFile("/recipes/workbench.json");
-        CraftingManager.getInstance().init();
 
         DataLoader.loadDataPacks(this);
 
@@ -198,6 +199,8 @@ public class MinecraftServer
         
         I18n.initialize(language);
 
+        StatList.init();
+
         if (!statsToken.equals("only-enter-a-value-if-you-are-a-registered-server") && !(statsToken.equals("")))
         {
             statsStatus = true;
@@ -409,7 +412,7 @@ public class MinecraftServer
     {
         currentTask = s;
         percentDone = i;
-        logger.info((new StringBuilder()).append(s).append(": ").append(i).append("%").toString());
+        logger.info(s + ": " + i + "%");
     }
 
     private void clearCurrentTask()
@@ -489,7 +492,7 @@ public class MinecraftServer
                         {
                             timeSinceLastTick -= 10L;
                             i++;
-                            for (EntityPlayerMP player : playerList.playerEntities) {
+                            for (ServerPlayer player : playerList.playerEntities) {
                                 player.tickSendChunks();
                             }
                             if (i % 5 == 0) {
@@ -575,7 +578,7 @@ public class MinecraftServer
         }
 
         AABB.initializePool();
-        Vec3d.initializePool();
+        Vec3.initializePool();
         deathTime++;
         for (int i = 0; i < dimensionWorlds.length; i++)
         {
@@ -590,7 +593,7 @@ public class MinecraftServer
             WorldServer worldserver = dimensionWorlds[i];
             if (deathTime % 20 == 0)
             {
-                playerList.sendPacketToAllPlayersInDimension(new Packet4UpdateTime(worldserver.getWorldTime()), worldserver.dimension.id);
+                playerList.sendPacketToAllPlayersInDimension(new SetTimePacket(worldserver.getWorldTime()), worldserver.dimension.id);
             }
             worldserver.tick();
             while (worldserver.updatingLighting()) ;
@@ -621,15 +624,15 @@ public class MinecraftServer
 
     public void addCommand(String s, ICommandListener icommandlistener)
     {
-        commands.add(new ServerCommand(s, icommandlistener));
+        commands.add(new ServerCommandEntry(s, icommandlistener));
     }
 
     public void commandLineParser()
     {
-        ServerCommand servercommand;
+        ServerCommandEntry servercommand;
         for (; commands.size() > 0; commandHandler.handleCommand(servercommand))
         {
-            servercommand = (ServerCommand) commands.remove(0);
+            servercommand = commands.remove(0);
         }
 
     }
@@ -639,7 +642,7 @@ public class MinecraftServer
         field_9010_p.add(iupdateplayerlistbox);
     }
 
-    public static void main(String args[])
+    public static void main(String[] args)
     {
         try
         {
@@ -669,7 +672,6 @@ public class MinecraftServer
             throw new RuntimeException(e);
         }
         PropertyConfigurator.configure("log4j.properties");
-        StatList.init();
         try
         {
             MinecraftServer minecraftserver = new MinecraftServer();
@@ -759,7 +761,7 @@ public class MinecraftServer
     public static HashMap field_6037_b = new HashMap();
     public NetworkListenThread networkServer;
     public PropertyManager propertyManager;
-    public WorldServer dimensionWorlds[];
+    public WorldServer[] dimensionWorlds;
     public PlayerList playerList;
     private ConsoleCommandHandler commandHandler;
     private boolean serverRunning;
@@ -767,9 +769,9 @@ public class MinecraftServer
     int deathTime;
     public String currentTask;
     public int percentDone;
-    private List field_9010_p;
-    private List commands;
-    public EntityTracker entityTracker[];
+    private final List field_9010_p;
+    private final List<ServerCommandEntry> commands;
+    public EntityTracker[] entityTracker;
     public boolean onlineMode;
     public boolean spawnPeacefulMobs;
     public boolean pvpOn;
@@ -788,7 +790,7 @@ public class MinecraftServer
     public static boolean statsStatus;
     public boolean disablePhotoMode = false;
     public String motd = "";
-    private SkinVariantList skinVariantList = new ServerSkinVariantList();
+    private final SkinVariantList skinVariantList = new ServerSkinVariantList();
     public int autoSaveInterval = 5;
     public int chunksSavedPerAutosave = 24;
     public boolean forceSaveAllChunksOnAutosave = false;
diff --git a/src/main/java/net/minecraft/server/entity/EntityTracker.java b/src/main/java/net/minecraft/server/entity/EntityTracker.java
index 2534a1d2f..451bcd842 100644
--- a/src/main/java/net/minecraft/server/entity/EntityTracker.java
+++ b/src/main/java/net/minecraft/server/entity/EntityTracker.java
@@ -4,9 +4,9 @@ import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.entity.ITrackedEntry;
 import net.minecraft.core.net.entity.NetEntityHandler;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.world.pathfinder.IdHashMap;
+import net.minecraft.core.util.collection.IntHashMap;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -15,14 +15,14 @@ import java.util.Set;
 
 public class EntityTracker {
     public final Set<EntityTrackerEntry> trackedEntitySet;
-    public final IdHashMap<EntityTrackerEntry> trackedEntityHashTable;
+    public final IntHashMap<EntityTrackerEntry> trackedEntityHashTable;
     public final MinecraftServer mcServer;
     public final int maxTrackingDistanceThreshold;
     public final int dimension;
 
     public EntityTracker(MinecraftServer minecraftserver, int dimId) {
         trackedEntitySet = new HashSet<>();
-        trackedEntityHashTable = new IdHashMap<>();
+        trackedEntityHashTable = new IntHashMap<>();
         mcServer = minecraftserver;
         dimension = dimId;
         maxTrackingDistanceThreshold = minecraftserver.playerList.getMaxTrackingDistance();
@@ -41,21 +41,21 @@ public class EntityTracker {
         if(trackingDistance > maxTrackingDistanceThreshold) {
             trackingDistance = maxTrackingDistanceThreshold;
         }
-        if(trackedEntityHashTable.containsItem(entity.id)) {
+        if(trackedEntityHashTable.containsValue(entity.id)) {
             throw new IllegalStateException("Entity is already tracked!");
         }
         EntityTrackerEntry trackerEntry = new EntityTrackerEntry(entity, trackingDistance, packetDelay, shouldSendMotionUpdates);
         trackedEntitySet.add(trackerEntry);
-        trackedEntityHashTable.add(entity.id, trackerEntry);
+        trackedEntityHashTable.put(entity.id, trackerEntry);
         trackerEntry.updatePlayerEntities(mcServer.getDimensionWorld(dimension).players);
         return trackerEntry;
     }
 
     public void untrackEntity(Entity entity)
     {
-        if(entity instanceof EntityPlayerMP)
+        if(entity instanceof ServerPlayer)
         {
-            EntityPlayerMP entityplayermp = (EntityPlayerMP)entity;
+            ServerPlayer entityplayermp = (ServerPlayer)entity;
             EntityTrackerEntry entitytrackerentry1;
             for(Iterator<EntityTrackerEntry> iterator = trackedEntitySet.iterator(); iterator.hasNext(); entitytrackerentry1.removeFromTrackedPlayers(entityplayermp))
             {
@@ -76,14 +76,14 @@ public class EntityTracker {
         ArrayList<Entity> arraylist = new ArrayList<>();
         for (EntityTrackerEntry entitytrackerentry : trackedEntitySet) {
             entitytrackerentry.tick(mcServer.getDimensionWorld(dimension).players);
-            if (entitytrackerentry.playerEntitiesUpdated && (entitytrackerentry.trackedEntity instanceof EntityPlayerMP)) {
+            if (entitytrackerentry.playerEntitiesUpdated && (entitytrackerentry.trackedEntity instanceof ServerPlayer)) {
                 arraylist.add(entitytrackerentry.trackedEntity);
             }
         }
 label0:
         for(int i = 0; i < arraylist.size(); i++)
         {
-            EntityPlayerMP entityplayermp = (EntityPlayerMP)arraylist.get(i);
+            ServerPlayer entityplayermp = (ServerPlayer)arraylist.get(i);
             Iterator<EntityTrackerEntry> iterator1 = trackedEntitySet.iterator();
             do
             {
@@ -119,7 +119,7 @@ label0:
         }
     }
 
-    public void removeTrackedPlayerSymmetric(EntityPlayerMP entityplayermp)
+    public void removeTrackedPlayerSymmetric(ServerPlayer entityplayermp)
     {
         EntityTrackerEntry entitytrackerentry;
         for(Iterator<EntityTrackerEntry> iterator = trackedEntitySet.iterator(); iterator.hasNext(); entitytrackerentry.removeTrackedPlayerSymmetric(entityplayermp))
diff --git a/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
index 244c133c8..1edadfeeb 100644
--- a/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
+++ b/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
@@ -1,25 +1,23 @@
 package net.minecraft.server.entity;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityLiving;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.entity.NetEntityHandler;
+import net.minecraft.core.net.packet.MoveEntityPacket;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet17Sleep;
-import net.minecraft.core.net.packet.Packet28EntityVelocity;
-import net.minecraft.core.net.packet.Packet29DestroyEntity;
-import net.minecraft.core.net.packet.Packet31RelEntityMove;
-import net.minecraft.core.net.packet.Packet32EntityLook;
-import net.minecraft.core.net.packet.Packet33RelEntityMoveLook;
-import net.minecraft.core.net.packet.Packet34EntityTeleport;
-import net.minecraft.core.net.packet.Packet35EntityNickname;
-import net.minecraft.core.net.packet.Packet40EntityMetadata;
-import net.minecraft.core.net.packet.Packet42EntityTagData;
-import net.minecraft.core.net.packet.Packet5PlayerInventory;
+import net.minecraft.core.net.packet.SleepPacket;
+import net.minecraft.core.net.packet.SetEntityMotionPacket;
+import net.minecraft.core.net.packet.RemoveEntityPacket;
+import net.minecraft.core.net.packet.TeleportEntityPacket;
+import net.minecraft.core.net.packet.EntityNicknamePacket;
+import net.minecraft.core.net.packet.SetEntityDataPacket;
+import net.minecraft.core.net.packet.EntityTagDataPacket;
+import net.minecraft.core.net.packet.SetEquippedItemPacket;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.data.SynchedEntityData;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.HashSet;
 import java.util.List;
@@ -45,7 +43,7 @@ public class EntityTrackerEntry {
     private final boolean shouldSendMotionUpdates;
     private int ticksSinceLastTeleport;
     public boolean playerEntitiesUpdated;
-    public Set<EntityPlayerMP> trackedPlayers;
+    public Set<ServerPlayer> trackedPlayers;
     public EntityTrackerEntry(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates) {
         updateCounter = 0;
         ticksSinceLastTeleport = 0;
@@ -56,9 +54,9 @@ public class EntityTrackerEntry {
         this.trackingDistance = trackingDistance;
         this.packetDelay = packetDelay;
         this.shouldSendMotionUpdates = shouldSendMotionUpdates;
-        encodedPosX = MathHelper.floor_double(entity.x * 32D);
-        encodedPosY = MathHelper.floor_double(entity.y * 32D);
-        encodedPosZ = MathHelper.floor_double(entity.z * 32D);
+        encodedPosX = MathHelper.floor(entity.x * 32D);
+        encodedPosY = MathHelper.floor(entity.y * 32D);
+        encodedPosZ = MathHelper.floor(entity.z * 32D);
         encodedRotationYaw = MathHelper.floor_float((entity.yRot * 256F) / 360F);
         encodedRotationPitch = MathHelper.floor_float((entity.xRot * 256F) / 360F);
     }
@@ -75,7 +73,7 @@ public class EntityTrackerEntry {
         return trackedEntity.id;
     }
 
-    public void tick(List<EntityPlayer> list) {
+    public void tick(List<Player> list) {
         playerEntitiesUpdated = false;
         if(!firstUpdateDone || trackedEntity.distanceToSqr(lastTrackedEntityPosX, lastTrackedEntityPosY, lastTrackedEntityPosZ) > 16D) {
             lastTrackedEntityPosX = trackedEntity.x;
@@ -87,9 +85,9 @@ public class EntityTrackerEntry {
         }
         ticksSinceLastTeleport++;
         if(++updateCounter % packetDelay == 0) {
-            int entityX = MathHelper.floor_double(trackedEntity.x * 32D);
-            int entityY = MathHelper.floor_double(trackedEntity.y * 32D);
-            int entityZ = MathHelper.floor_double(trackedEntity.z * 32D);
+            int entityX = MathHelper.floor(trackedEntity.x * 32D);
+            int entityY = MathHelper.floor(trackedEntity.y * 32D);
+            int entityZ = MathHelper.floor(trackedEntity.z * 32D);
             int entityYaw = MathHelper.floor_float((trackedEntity.yRot * 256F) / 360F);
             int entityPitch = MathHelper.floor_float((trackedEntity.xRot * 256F) / 360F);
             int dx = entityX - encodedPosX;
@@ -103,13 +101,13 @@ public class EntityTrackerEntry {
                 trackedEntity.x = (double)entityX / 32D;
                 trackedEntity.y = (double)entityY / 32D;
                 trackedEntity.z = (double)entityZ / 32D;
-                packet = new Packet34EntityTeleport(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch);
+                packet = new TeleportEntityPacket(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch);
             } else if(hasMoved && hasLooked) {
-                packet = new Packet33RelEntityMoveLook(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch);
+                packet = new MoveEntityPacket.PosRot(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch);
             } else if(hasMoved) {
-                packet = new Packet31RelEntityMove(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz);
+                packet = new MoveEntityPacket.Pos(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz);
             } else if(hasLooked) {
-                packet = new Packet32EntityLook(trackedEntity.id, (byte)entityYaw, (byte)entityPitch);
+                packet = new MoveEntityPacket.Rot(trackedEntity.id, (byte)entityYaw, (byte)entityPitch);
             }
             if(shouldSendMotionUpdates) {
                 double d = trackedEntity.xd - lastTrackedEntityMotionX;
@@ -121,7 +119,7 @@ public class EntityTrackerEntry {
                     lastTrackedEntityMotionX = trackedEntity.xd;
                     lastTrackedEntityMotionY = trackedEntity.yd;
                     lastTrackedEntityMotionZ = trackedEntity.zd;
-                    sendPacketToTrackedPlayers(new Packet28EntityVelocity(trackedEntity.id, lastTrackedEntityMotionX, lastTrackedEntityMotionY, lastTrackedEntityMotionZ));
+                    sendPacketToTrackedPlayers(new SetEntityMotionPacket(trackedEntity.id, lastTrackedEntityMotionX, lastTrackedEntityMotionY, lastTrackedEntityMotionZ));
                 }
             }
             if(packet != null) {
@@ -129,7 +127,7 @@ public class EntityTrackerEntry {
             }
             SynchedEntityData synchedEntityData = trackedEntity.getEntityData();
             if(synchedEntityData.isDirty()) {
-                sendPacketToTrackedPlayersAndTrackedEntity(new Packet40EntityMetadata(trackedEntity.id, synchedEntityData));
+                sendPacketToTrackedPlayersAndTrackedEntity(new SetEntityDataPacket(trackedEntity.id, synchedEntityData));
             }
             if(hasMoved) {
                 encodedPosX = entityX;
@@ -142,37 +140,37 @@ public class EntityTrackerEntry {
             }
         }
         if(trackedEntity.hurtMarked) {
-            sendPacketToTrackedPlayersAndTrackedEntity(new Packet28EntityVelocity(trackedEntity));
+            sendPacketToTrackedPlayersAndTrackedEntity(new SetEntityMotionPacket(trackedEntity));
             trackedEntity.hurtMarked = false;
         }
         if (trackedEntity.hadNicknameSet) {
-            sendPacketToTrackedPlayersAndTrackedEntity(new Packet35EntityNickname(trackedEntity.id, ((EntityLiving) trackedEntity).nickname, ((EntityLiving) trackedEntity).chatColor));
+            sendPacketToTrackedPlayersAndTrackedEntity(new EntityNicknamePacket(trackedEntity.id, ((Mob) trackedEntity).nickname, ((Mob) trackedEntity).chatColor));
             trackedEntity.hadNicknameSet = false;
         }
     }
 
     public void sendPacketToTrackedPlayers(Packet packet) {
-        for (EntityPlayerMP playerMP : trackedPlayers){
+        for (ServerPlayer playerMP : trackedPlayers){
             playerMP.playerNetServerHandler.sendPacket(packet);
         }
     }
 
     public void sendPacketToTrackedPlayersAndTrackedEntity(Packet packet) {
         sendPacketToTrackedPlayers(packet);
-        if(trackedEntity instanceof EntityPlayerMP) {
-            ((EntityPlayerMP)trackedEntity).playerNetServerHandler.sendPacket(packet);
+        if(trackedEntity instanceof ServerPlayer) {
+            ((ServerPlayer)trackedEntity).playerNetServerHandler.sendPacket(packet);
         }
     }
 
     public void sendDestroyEntityPacketToTrackedPlayers() {
-        sendPacketToTrackedPlayers(new Packet29DestroyEntity(trackedEntity.id));
+        sendPacketToTrackedPlayers(new RemoveEntityPacket(trackedEntity.id));
     }
 
-    public void removeFromTrackedPlayers(EntityPlayerMP playerMP) {
+    public void removeFromTrackedPlayers(ServerPlayer playerMP) {
         trackedPlayers.remove(playerMP);
     }
 
-    public void updatePlayerEntity(EntityPlayerMP entityplayermp) {
+    public void updatePlayerEntity(ServerPlayer entityplayermp) {
         if(entityplayermp == trackedEntity) {
             return;
         }
@@ -183,40 +181,40 @@ public class EntityTrackerEntry {
                 trackedPlayers.add(entityplayermp);
                 entityplayermp.playerNetServerHandler.sendPacket(NetEntityHandler.getSpawnPacket(this));
                 if (trackedEntity.sendAdditionalData) {
-                    entityplayermp.playerNetServerHandler.sendPacket(new Packet42EntityTagData(trackedEntity));
+                    entityplayermp.playerNetServerHandler.sendPacket(new EntityTagDataPacket(trackedEntity));
                 }
                 if(shouldSendMotionUpdates) {
-                    entityplayermp.playerNetServerHandler.sendPacket(new Packet28EntityVelocity(trackedEntity.id, trackedEntity.xd, trackedEntity.yd, trackedEntity.zd));
+                    entityplayermp.playerNetServerHandler.sendPacket(new SetEntityMotionPacket(trackedEntity.id, trackedEntity.xd, trackedEntity.yd, trackedEntity.zd));
                 }
                 ItemStack[] aitemstack = trackedEntity.getInventory();
                 if(aitemstack != null) {
                     for(int i = 0; i < aitemstack.length; i++) {
-                        entityplayermp.playerNetServerHandler.sendPacket(new Packet5PlayerInventory(trackedEntity.id, i, aitemstack[i]));
+                        entityplayermp.playerNetServerHandler.sendPacket(new SetEquippedItemPacket(trackedEntity.id, i, aitemstack[i]));
                     }
                 }
-                if(trackedEntity instanceof EntityPlayer) {
-                    EntityPlayer entityplayer = (EntityPlayer)trackedEntity;
+                if(trackedEntity instanceof Player) {
+                    Player entityplayer = (Player)trackedEntity;
                     if(entityplayer.isPlayerSleeping())
                     {
-                        entityplayermp.playerNetServerHandler.sendPacket(new Packet17Sleep(trackedEntity, 0, MathHelper.floor_double(trackedEntity.x), MathHelper.floor_double(trackedEntity.y), MathHelper.floor_double(trackedEntity.z)));
+                        entityplayermp.playerNetServerHandler.sendPacket(new SleepPacket(trackedEntity, 0, MathHelper.floor(trackedEntity.x), MathHelper.floor(trackedEntity.y), MathHelper.floor(trackedEntity.z)));
                     }
                 }
             }
         } else if(trackedPlayers.contains(entityplayermp)) {
             trackedPlayers.remove(entityplayermp);
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(trackedEntity.id));
+            entityplayermp.playerNetServerHandler.sendPacket(new RemoveEntityPacket(trackedEntity.id));
         }
     }
 
-    public void updatePlayerEntities(List<EntityPlayer> list) {
-        for (EntityPlayer player : list) {
-            updatePlayerEntity((EntityPlayerMP) player);
+    public void updatePlayerEntities(List<Player> list) {
+        for (Player player : list) {
+            updatePlayerEntity((ServerPlayer) player);
         }
     }
-    public void removeTrackedPlayerSymmetric(EntityPlayerMP playerMP) {
+    public void removeTrackedPlayerSymmetric(ServerPlayer playerMP) {
         if(trackedPlayers.contains(playerMP)) {
             trackedPlayers.remove(playerMP);
-            playerMP.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(trackedEntity.id));
+            playerMP.playerNetServerHandler.sendPacket(new RemoveEntityPacket(trackedEntity.id));
         }
     }
 }
diff --git a/src/main/java/net/minecraft/server/entity/ServerSkinVariantList.java b/src/main/java/net/minecraft/server/entity/ServerSkinVariantList.java
index 504b88172..4c79c58aa 100644
--- a/src/main/java/net/minecraft/server/entity/ServerSkinVariantList.java
+++ b/src/main/java/net/minecraft/server/entity/ServerSkinVariantList.java
@@ -1,39 +1,12 @@
 package net.minecraft.server.entity;
 
-import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.SkinVariantList;
-import net.minecraft.core.entity.animal.EntityChicken;
-import net.minecraft.core.entity.animal.EntityCow;
-import net.minecraft.core.entity.animal.EntityPig;
-import net.minecraft.core.entity.animal.EntitySquid;
-import net.minecraft.core.entity.monster.EntitySkeleton;
-import net.minecraft.core.entity.monster.EntitySnowman;
-import net.minecraft.core.entity.monster.EntitySpider;
-import net.minecraft.core.entity.monster.EntityZombie;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class ServerSkinVariantList
-    extends SkinVariantList {
-    private static final Map<String, Integer> entitySkinCounts = new HashMap<>();
-    public static void registerSkinCount(Class<? extends Entity> entityClass, int numSkins) {
-        entitySkinCounts.put(entityClass.getName(), numSkins);
-    }
-
-    static {
-        registerSkinCount(EntityChicken.class, 4);
-        registerSkinCount(EntityCow.class, 4);
-        registerSkinCount(EntityPig.class, 5);
-        registerSkinCount(EntitySkeleton.class, 5);
-        registerSkinCount(EntitySnowman.class, 5);
-        registerSkinCount(EntitySpider.class, 4);
-        registerSkinCount(EntitySquid.class, 4);
-        registerSkinCount(EntityZombie.class, 16);
-    }
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
+public class ServerSkinVariantList extends SkinVariantList {
     @Override
-    public int getNumSkinsForEntity(Class<? extends Entity> entityClass) {
-        return entitySkinCounts.getOrDefault(entityClass.getName(), 1);
+    public @NotNull String getSkinReference(@Nullable String variantJsonPath, @NotNull String defaultKey, int skinIndex) {
+        return "";
     }
 }
diff --git a/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
similarity index 61%
rename from src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java
rename to src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
index 058fb00ab..95445e365 100644
--- a/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java
+++ b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
@@ -2,30 +2,31 @@ package net.minecraft.server.entity.player;
 
 import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockPortal;
+import net.minecraft.core.block.PortalBlock;
 import net.minecraft.core.block.entity.*;
-import net.minecraft.core.crafting.ICrafting;
+import net.minecraft.core.crafting.ContainerListener;
 import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityArrow;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.projectile.ArrowProjectile;
 import net.minecraft.core.enums.EnumSleepStatus;
 import net.minecraft.core.item.Item;
-import net.minecraft.core.item.ItemComplex;
+import net.minecraft.core.item.IComplexItem;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.menu.*;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.IVehicle;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.chunk.ChunkSection;
 import net.minecraft.server.entity.EntityTracker;
-import net.minecraft.server.net.handler.NetServerHandler;
+import net.minecraft.server.net.handler.ServerPacketHandler;
 import net.minecraft.core.net.packet.*;
 import net.minecraft.server.world.ServerPlayerController;
 import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.*;
-import net.minecraft.core.player.inventory.slot.SlotCrafting;
+import net.minecraft.core.player.inventory.slot.ResultSlot;
 import net.minecraft.core.util.helper.AES;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.phys.AABB;
@@ -42,22 +43,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
-// Referenced classes of package net.minecraft.src:
-//            EntityPlayer, ICrafting, ItemStack, ItemInWorldManager, 
-//            World, ChunkCoordinates, WorldProvider, WorldServer, 
-//            Container, Packet5PlayerInventory, EntityTracker, InventoryPlayer, 
-//            EntityArrow, Item, NetServerHandler, ItemMapBase, 
-//            ChunkCoordIntPair, Packet51MapChunk, TileEntity, PropertyManager, 
-//            ServerConfigurationManager, Packet8UpdateHealth, Entity, EntityItem, 
-//            Packet22Collect, Packet18Animation, EnumStatus, Packet17Sleep, 
-//            Packet39AttachEntity, Packet100OpenWindow, ContainerWorkbench, IInventory, 
-//            ContainerChest, TileEntityFurnace, ContainerFurnace, TileEntityDispenser, 
-//            ContainerDispenser, SlotCrafting, Packet103SetSlot, Packet104WindowItems, 
-//            Packet105UpdateProgressbar, Packet101CloseWindow, StatBase, Packet200Statistic, 
-//            StringTranslate, Packet3Chat
-
-public class EntityPlayerMP extends EntityPlayer implements ICrafting {
-    public EntityPlayerMP(MinecraftServer minecraftserver, World world, String s, ServerPlayerController iteminworldmanager)
+public class ServerPlayer extends Player implements ContainerListener {
+    public ServerPlayer(MinecraftServer minecraftserver, World world, String s, ServerPlayerController iteminworldmanager)
     {
         super(world);
         loadedChunks = new LinkedList();
@@ -105,16 +92,16 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     @Override
 	public void setGamemode(Gamemode gamemode)
     {
-        mcServer.playerList.sendPacketToAllPlayers(new Packet41EntityPlayerGamemode(this.id, gamemode.getId()));
+        mcServer.playerList.sendPacketToAllPlayers(new PlayerGamemodePacket(this.id, gamemode.getId()));
         this.gamemode = gamemode;
 
-        ContainerPlayer newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
+        InventoryMenu newContainer = gamemode.getContainer(this.inventory, !world.isClientSide);
         if (craftingInventory == inventorySlots)
         {
             craftingInventory = newContainer;
         }
         inventorySlots = newContainer;
-        inventorySlots.onContainerInit(this);
+        inventorySlots.addSlotListener(this);
         if (!gamemode.canPlayerFly())
         {
             noPhysics = false;
@@ -140,7 +127,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 	public void awardKillScore(Entity entity, int i)
     {
         super.awardKillScore(entity, i);
-        mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(username, nickname, score, chatColor, true, isOperator()));
+        mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(username, nickname, score, chatColor, true, isOperator()));
     }
 
     public boolean isOperator()
@@ -177,7 +164,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 
     public void func_20057_k()
     {
-        craftingInventory.onContainerInit(this);
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
@@ -203,13 +190,13 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     {
         playerController.tick();
         ticksOfInvuln--;
-        craftingInventory.updateInventory();
+        craftingInventory.broadcastChanges();
         for (int i = 0; i < 5; i++)
         {
             ItemStack itemstack = getEquipmentInSlot(i);
             if (itemstack != playerInventory[i])
             {
-                mcServer.getEntityTracker(dimension).sendPacketToTrackedPlayers(this, new Packet5PlayerInventory(id, i, itemstack));
+                mcServer.getEntityTracker(dimension).sendPacketToTrackedPlayers(this, new SetEquippedItemPacket(id, i, itemstack));
                 playerInventory[i] = itemstack;
             }
         }
@@ -224,10 +211,10 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
             name = username;
         }
         else {
-            List<EntityPlayer> players = new ArrayList<>(MinecraftServer.getInstance().playerList.playerEntities);
-            players.sort(new EntityPlayer.SortByUsername());
+            List<Player> players = new ArrayList<>(MinecraftServer.getInstance().playerList.playerEntities);
+            players.sort(new Player.SortByUsername());
             int nickNum = 0;
-            for (EntityPlayer player : players){
+            for (Player player : players){
                 if (player == this) break;
                 if (player.nickname.equals(this.nickname)){
                     nickNum++;
@@ -263,14 +250,14 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         }
         if (!mcServer.pvpOn)
         {
-            if (attacker instanceof EntityPlayer)
+            if (attacker instanceof Player)
             {
                 return false;
             }
-            if (attacker instanceof EntityArrow)
+            if (attacker instanceof ArrowProjectile)
             {
-                EntityArrow entityarrow = (EntityArrow) attacker;
-                if (entityarrow.owner instanceof EntityPlayer)
+                ArrowProjectile entityarrow = (ArrowProjectile) attacker;
+                if (entityarrow.owner instanceof Player)
                 {
                     return false;
                 }
@@ -295,14 +282,14 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     {
         super.tick();
 
-        for (int i = 0; i < inventory.getSizeInventory(); i++)
+        for (int i = 0; i < inventory.getContainerSize(); i++)
         {
-            ItemStack itemstack = inventory.getStackInSlot(i);
-            if (itemstack == null || !Item.itemsList[itemstack.itemID].isComplex() || playerNetServerHandler.getNumChunkDataPackets() > 2)
+            ItemStack itemstack = inventory.getItem(i);
+            if (itemstack == null || !(Item.itemsList[itemstack.itemID] instanceof IComplexItem) || playerNetServerHandler.getNumChunkDataPackets() > 2)
             {
                 continue;
             }
-            Packet packet = ((ItemComplex) Item.itemsList[itemstack.itemID]).sendPacketData(itemstack, world, this);
+            Packet packet = ((IComplexItem) Item.itemsList[itemstack.itemID]).sendPacketData(itemstack, world, this);
             if (packet != null)
             {
                 playerNetServerHandler.sendPacket(packet);
@@ -311,7 +298,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 
         if (inPortal)
         {
-            int targetDim = ((BlockPortal) Block.blocksList[portalID]).targetDimension;
+            int targetDim = ((PortalBlock) Block.blocksList[portalID]).targetDimension;
             boolean netherAllowed = mcServer.propertyManager.getBooleanProperty("allow-nether", true);
             boolean paradiseAllowed = mcServer.propertyManager.getBooleanProperty("allow-paradise", false);
             if ((netherAllowed && targetDim == Dimension.nether.id) || (paradiseAllowed && targetDim == Dimension.paradise.id) || (targetDim != Dimension.nether.id && targetDim != Dimension.paradise.id))
@@ -361,12 +348,12 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         }
         if (getHealth() != lastHealth)
         {
-            playerNetServerHandler.sendPacket(new Packet8UpdateHealth(getHealth()));
+            playerNetServerHandler.sendPacket(new SetHealthPacket(getHealth()));
             lastHealth = getHealth();
         }
         if (score != lastScore)
         {
-            playerNetServerHandler.sendPacket(new Packet72UpdatePlayerProfile(username, nickname, score, chatColor, true, isOperator()));
+            playerNetServerHandler.sendPacket(new UpdatePlayerProfilePacket(username, nickname, score, chatColor, true, isOperator()));
             lastScore = score;
         }
     }
@@ -382,18 +369,18 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
                 {
                     WorldServer worldserver = mcServer.getDimensionWorld(dimension);
                     loadedChunks.remove(chunkCoord);
-                    playerNetServerHandler.sendPacket(new Packet51MapChunk(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, Chunk.CHUNK_SIZE_Z, worldserver));
+                    playerNetServerHandler.sendPacket(new BlockRegionUpdatePacket(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, Chunk.CHUNK_SIZE_Z, worldserver));
                     List list = worldserver.getTileEntityList(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, chunkCoord.x * Chunk.CHUNK_SIZE_X + Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, chunkCoord.z * Chunk.CHUNK_SIZE_Z + Chunk.CHUNK_SIZE_Z);
                     for (int j = 0; j < list.size(); j++)
                     {
-                        getTileEntityInfo((TileEntity) list.get(j));
+                        getTileEntityInfo((BlockEntity) list.get(j));
                     }
                 }
             }
         }
     }
 
-    private void getTileEntityInfo(TileEntity tileentity)
+    private void getTileEntityInfo(BlockEntity tileentity)
     {
         if (tileentity != null)
         {
@@ -416,22 +403,22 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     }
 
     @Override
-	public void onItemPickup(Entity entity, int i)
+	public void onItemPickup(Entity entity, ItemStack item)
     {
         if (!entity.removed)
         {
             EntityTracker entitytracker = mcServer.getEntityTracker(dimension);
-            if (entity instanceof EntityItem)
+            if (entity instanceof ItemEntity)
             {
-                entitytracker.sendPacketToTrackedPlayers(entity, new Packet22Collect(entity.id, id));
+                entitytracker.sendPacketToTrackedPlayers(entity, new TakeItemEntityPacket(entity.id, id));
             }
-            if (entity instanceof EntityArrow)
+            if (entity instanceof ArrowProjectile)
             {
-                entitytracker.sendPacketToTrackedPlayers(entity, new Packet22Collect(entity.id, id));
+                entitytracker.sendPacketToTrackedPlayers(entity, new TakeItemEntityPacket(entity.id, id));
             }
         }
-        super.onItemPickup(entity, i);
-        craftingInventory.updateInventory();
+        super.onItemPickup(entity, item);
+        craftingInventory.broadcastChanges();
     }
 
     @Override
@@ -442,7 +429,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
             swingProgressInt = -1;
             isSwinging = true;
             EntityTracker entitytracker = mcServer.getEntityTracker(dimension);
-            entitytracker.sendPacketToTrackedPlayers(this, new Packet18Animation(this, 1));
+            entitytracker.sendPacketToTrackedPlayers(this, new AnimatePacket(this, 1));
         }
     }
 
@@ -457,10 +444,10 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         if (enumstatus == EnumSleepStatus.OK)
         {
             EntityTracker entitytracker = mcServer.getEntityTracker(dimension);
-            Packet17Sleep packet17sleep = new Packet17Sleep(this, 0, i, j, k);
-            entitytracker.sendPacketToTrackedPlayers(this, packet17sleep);
+            SleepPacket sleepPacket = new SleepPacket(this, 0, i, j, k);
+            entitytracker.sendPacketToTrackedPlayers(this, sleepPacket);
             playerNetServerHandler.teleportAndRotate(x, y, z, yRot, xRot);
-            playerNetServerHandler.sendPacket(packet17sleep);
+            playerNetServerHandler.sendPacket(sleepPacket);
         }
         return enumstatus;
     }
@@ -471,7 +458,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         if (isPlayerSleeping())
         {
             EntityTracker entitytracker = mcServer.getEntityTracker(dimension);
-            entitytracker.sendPacketToTrackedPlayersAndTrackedEntity(this, new Packet18Animation(this, 3));
+            entitytracker.sendPacketToTrackedPlayersAndTrackedEntity(this, new AnimatePacket(this, 3));
             super.wakeUpPlayer(flag, flag1);
         }
         if (playerNetServerHandler != null)
@@ -491,10 +478,10 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         }
         super.startRiding(vehicle);
         if (vehicle instanceof Entity) {
-            playerNetServerHandler.sendPacket(new Packet39AttachEntity(this, (Entity) this.vehicle));
-        } else if (vehicle instanceof TileEntity) {
-            TileEntity tileEntity = (TileEntity) vehicle;
-            playerNetServerHandler.sendPacket(new Packet39AttachEntity(this, tileEntity.x, tileEntity.y, tileEntity.z));
+            playerNetServerHandler.sendPacket(new SetRidingPacket(this, (Entity) this.vehicle));
+        } else if (vehicle instanceof BlockEntity) {
+            BlockEntity blockEntity = (BlockEntity) vehicle;
+            playerNetServerHandler.sendPacket(new SetRidingPacket(this, blockEntity.x, blockEntity.y, blockEntity.z));
         }
         playerNetServerHandler.teleport(x, y, z);
     }
@@ -518,90 +505,90 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 	public void displayGUIWorkbench(int i, int j, int k)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 1, "Crafting", 9));
-        craftingInventory = new ContainerWorkbench(inventory, world, i, j, k);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 1, "Crafting", 9));
+        craftingInventory = new CraftingMenu(inventory, world, i, j, k);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
     public void displayGUIPaintingPicker()
     {
-        playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 7, "Painting", 0));
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 7, "Painting", 0));
     }
 
     @Override
-	public void displayGUIChest(IInventory iinventory)
+	public void displayGUIChest(Container iinventory)
     {
         getNextWindowId();
-        NetServerHandler.logger.info((new StringBuilder()).append(username).append(" interacted with chest at (").append(x).append(", ").append(y).append(", ").append(z).append(")").toString());
-        playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 0, iinventory.getInvName(), iinventory.getSizeInventory()));
-        craftingInventory = new ContainerChest(inventory, iinventory);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        ServerPacketHandler.logger.info((new StringBuilder()).append(username).append(" interacted with chest at (").append(x).append(", ").append(y).append(", ").append(z).append(")").toString());
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 0, iinventory.getName(), iinventory.getContainerSize()));
+        craftingInventory = new ContainerMenu(inventory, iinventory);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
-	public void displayGUIFurnace(TileEntityFurnace tileentityfurnace)
+	public void displayGUIFurnace(FurnaceBlockEntity tileentityfurnace)
     {
         getNextWindowId();
-        if (tileentityfurnace instanceof TileEntityBlastFurnace)
+        if (tileentityfurnace instanceof BlastFurnaceBlockEntity)
         {
-            playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 4, tileentityfurnace.getInvName(), tileentityfurnace.getSizeInventory()));
+            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 4, tileentityfurnace.getName(), tileentityfurnace.getContainerSize()));
         }
         else
         {
-            playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 2, tileentityfurnace.getInvName(), tileentityfurnace.getSizeInventory()));
+            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 2, tileentityfurnace.getName(), tileentityfurnace.getContainerSize()));
         }
 
-        craftingInventory = new ContainerFurnace(inventory, tileentityfurnace);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        craftingInventory = new FurnaceMenu(inventory, tileentityfurnace);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
-	public void displayGUIDispenser(TileEntityDispenser tileentitydispenser)
+	public void displayGUIDispenser(DispenserBlockEntity tileentitydispenser)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 3, tileentitydispenser.getInvName(), tileentitydispenser.getSizeInventory()));
-        craftingInventory = new ContainerDispenser(inventory, tileentitydispenser);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 3, tileentitydispenser.getName(), tileentitydispenser.getContainerSize()));
+        craftingInventory = new TrapMenu(inventory, tileentitydispenser);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
-	public void displayGUITrommel(TileEntityTrommel tileentitytrommel)
+	public void displayGUITrommel(TrommelBlockEntity tileentitytrommel)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new Packet100OpenWindow(currentWindowId, 5, tileentitytrommel.getInvName(), tileentitytrommel.getSizeInventory()));
-        craftingInventory = new ContainerTrommel(inventory, tileentitytrommel);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 5, tileentitytrommel.getName(), tileentitytrommel.getContainerSize()));
+        craftingInventory = new TrommelMenu(inventory, tileentitytrommel);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
-    public void displayGUIEditFlag(TileEntityFlag tileEntityFlag)
+    public void displayGUIEditFlag(FlagBlockEntity tileEntityFlag)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new Packet142OpenFlagWindow(currentWindowId, tileEntityFlag.x, tileEntityFlag.y, tileEntityFlag.z));
-        craftingInventory = new ContainerFlag(inventory, tileEntityFlag);
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        playerNetServerHandler.sendPacket(new FlagOpenPacket(currentWindowId, tileEntityFlag.x, tileEntityFlag.y, tileEntityFlag.z));
+        craftingInventory = new FlagMenu(inventory, tileEntityFlag);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     public void displayGUIGuidebook()
     {
         getNextWindowId();
 
-        craftingInventory = new ContainerGuidebook();
-        craftingInventory.windowId = currentWindowId;
-        craftingInventory.onContainerInit(this);
+        craftingInventory = new GuidebookMenu();
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
     }
 
     @Override
-	public void updateInventorySlot(Container container, int i, ItemStack itemstack)
+	public void updateInventorySlot(AbstractContainerMenu container, int i, ItemStack itemstack)
     {
-        if (container.getSlot(i) instanceof SlotCrafting)
+        if (container.getSlot(i) instanceof ResultSlot)
         {
             return;
         }
@@ -613,33 +600,33 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         {
             if (playerNetServerHandler != null)
             {
-                playerNetServerHandler.sendPacket(new Packet103SetSlot(container.windowId, i, itemstack));
+                playerNetServerHandler.sendPacket(new ContainerSetSlotPacket(container.containerId, i, itemstack));
             }
             return;
         }
     }
 
-    public void func_28017_a(Container container)
+    public void func_28017_a(AbstractContainerMenu container)
     {
         updateCraftingInventory(container, container.func_28127_b());
     }
 
     @Override
-	public void updateCraftingInventory(Container container, List<ItemStack> list)
+	public void updateCraftingInventory(AbstractContainerMenu container, List<ItemStack> list)
     {
 
         //playernetserverhandler returning false?
         if (playerNetServerHandler != null)
         {
-            playerNetServerHandler.sendPacket(new Packet104WindowItems(container.windowId, list));
-//            playerNetServerHandler.sendPacket(new Packet103SetSlot(-1, -1, inventory.getHeldItemStack()));
+            playerNetServerHandler.sendPacket(new ContainerSetContentPacket(container.containerId, list));
+//            playerNetServerHandler.sendPacket(new ContainerSetSlotPacket(-1, -1, inventory.getHeldItemStack()));
         }
     }
 
     @Override
-	public void updateCraftingInventoryInfo(Container container, int id, int value)
+	public void updateCraftingInventoryInfo(AbstractContainerMenu container, int id, int value)
     {
-        playerNetServerHandler.sendPacket(new Packet105UpdateProgressbar(container.windowId, id, value));
+        playerNetServerHandler.sendPacket(new ContainerSetDataPacket(container.containerId, id, value));
     }
 
     @Override
@@ -649,7 +636,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 
     public void usePersonalCraftingInventory()
     {
-        playerNetServerHandler.sendPacket(new Packet101CloseWindow(craftingInventory.windowId));
+        playerNetServerHandler.sendPacket(new ContainerClosePacket(craftingInventory.containerId));
         closeCraftingGui();
     }
 
@@ -661,7 +648,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
         }
         else
         {
-            playerNetServerHandler.sendPacket(new Packet103SetSlot(-1, -1, inventory.getHeldItemStack()));
+            playerNetServerHandler.sendPacket(new ContainerSetSlotPacket(-1, -1, inventory.getHeldItemStack()));
             return;
         }
     }
@@ -683,20 +670,21 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     }
 
     @Override
-	public void addStat(Stat statbase, int i)
+	public void addStat(Stat stat, int i)
     {
-        if (statbase == null)
+        if (stat == null)
         {
             return;
         }
-        if (!statbase.clientside)
+        if (!stat.clientside)
         {
-            for (; i > 100; i -= 100)
-            {
-                playerNetServerHandler.sendPacket(new Packet200Statistic(statbase.statId, 100));
+            for (; i > 100; i -= 100) { // send value change in groups of 100
+                playerNetServerHandler.sendPacket(new StatisticPacket(stat.statId, 100));
             }
 
-            playerNetServerHandler.sendPacket(new Packet200Statistic(statbase.statId, i));
+            if (i > 0) {
+                playerNetServerHandler.sendPacket(new StatisticPacket(stat.statId, i));
+            }
         }
     }
     public void func_30002_A()
@@ -717,34 +705,34 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
 
     public void func_30001_B()
     {
-        lastHealth = 0xfa0a1f01;
-        lastScore = 0xfa0a1f01;
+        lastHealth = Integer.MIN_VALUE;
+        lastScore = Integer.MIN_VALUE;
     }
 
     public void func_22061_a(String s)
     {
         I18n stringtranslate = I18n.getInstance();
         String s1 = stringtranslate.translateKey(s);
-        playerNetServerHandler.sendPacket(new Packet3Chat(s1));
+        playerNetServerHandler.sendPacket(new ChatPacket(s1));
     }
     
     @Override
     public void setCurrentItem(int i) {
     	super.setCurrentItem(i);
-    	playerNetServerHandler.sendPacket(new Packet16BlockItemSwitch(i));
+    	playerNetServerHandler.sendPacket(new SetCarriedItemPacket(i));
     }
 
 	@Override
 	public void sendMessage(String message) {
-		playerNetServerHandler.sendPacket(new Packet3Chat(message, 0, AES.keyChain.get(username)));
+		playerNetServerHandler.sendPacket(new ChatPacket(message, 0, AES.keyChain.get(username)));
 	}
 
 	@Override
 	public void sendStatusMessage(String message) {
-		playerNetServerHandler.sendPacket(new Packet3Chat(message, 1, AES.keyChain.get(username)));
+		playerNetServerHandler.sendPacket(new ChatPacket(message, 1, AES.keyChain.get(username)));
 	}
 
-    public NetServerHandler playerNetServerHandler;
+    public ServerPacketHandler playerNetServerHandler;
     public MinecraftServer mcServer;
     public ServerPlayerController playerController;
     public double field_9155_d;
diff --git a/src/main/java/net/minecraft/server/gui/GuiStatsComponent.java b/src/main/java/net/minecraft/server/gui/GuiStatsComponent.java
index b7f125391..e3d78a8dc 100644
--- a/src/main/java/net/minecraft/server/gui/GuiStatsComponent.java
+++ b/src/main/java/net/minecraft/server/gui/GuiStatsComponent.java
@@ -29,7 +29,7 @@ public class GuiStatsComponent extends JComponent
         long l = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
         System.gc();
         displayStrings[0] = (new StringBuilder()).append("Memory use: ").append(l / 1024L / 1024L).append(" mb (").append((Runtime.getRuntime().freeMemory() * 100L) / Runtime.getRuntime().maxMemory()).append("% free)").toString();
-        displayStrings[1] = (new StringBuilder()).append("Threads: ").append(NetworkManager.numReadThreads).append(" + ").append(NetworkManager.numWriteThreads).toString();
+        displayStrings[1] = (new StringBuilder()).append("Threads: ").append(NetworkManager.readThreads).append(" + ").append(NetworkManager.writeThreads).toString();
         memoryUse[updateCounter++ & 0xff] = (int)((l * 100L) / Runtime.getRuntime().maxMemory());
         repaint();
     }
diff --git a/src/main/java/net/minecraft/server/net/ConsoleCommandHandler.java b/src/main/java/net/minecraft/server/net/ConsoleCommandHandler.java
index ba3bee281..03e0281b9 100644
--- a/src/main/java/net/minecraft/server/net/ConsoleCommandHandler.java
+++ b/src/main/java/net/minecraft/server/net/ConsoleCommandHandler.java
@@ -1,35 +1,19 @@
 package net.minecraft.server.net;
 
-import java.util.Iterator;
-import java.util.Set;
 
+import net.minecraft.core.net.ServerCommandEntry;
 
-import net.minecraft.core.net.ICommandListener;
-import net.minecraft.core.net.ServerCommand;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.packet.Packet3Chat;
-import net.minecraft.core.net.packet.Packet41EntityPlayerGamemode;
-import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.server.world.WorldServer;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.command.Command;
 import net.minecraft.core.net.command.CommandError;
 import net.minecraft.core.net.command.Commands;
 import net.minecraft.core.net.command.ConsoleCommandSender;
-import org.apache.log4j.Logger;
-
-
-// Referenced classes of package net.minecraft.src:
-//            ServerCommand, ICommandListener, ServerConfigurationManager, WorldServer, 
-//            EntityPlayerMP, NetServerHandler, Item, ItemStack, 
-//            Packet3Chat, PropertyManager
 
 public class ConsoleCommandHandler
 {
 
-    private static Logger minecraftLogger = Logger.getLogger("Minecraft");
-    private MinecraftServer minecraftServer;
+    private final MinecraftServer minecraftServer;
     public final ConsoleCommandSender sender;
 
     public ConsoleCommandHandler(MinecraftServer server)
@@ -41,10 +25,10 @@ public class ConsoleCommandHandler
         this.sender = new ConsoleCommandSender(server);
     }
 
-    public boolean handleCommandNew(ServerCommand serverCommand) {
-    	System.out.println("ServerCommand: "+serverCommand.command);
+    public void handleCommand(ServerCommandEntry serverCommandEntry) {
+    	System.out.println("ServerCommand: "+ serverCommandEntry.command);
 
-    	String[] args = serverCommand.command.split(" ");
+    	String[] args = serverCommandEntry.command.split(" ");
     	String[] args1 = new String[args.length - 1];
     	System.arraycopy(args, 1, args1, 0, args.length - 1);
 
@@ -58,258 +42,9 @@ public class ConsoleCommandHandler
     			}catch (CommandError e) {
     				sender.sendMessage(TextFormatting.RED + e.getMessage());
 				}
-    			return true;
+    			return;
     		}
     	}
         sender.sendMessage(TextFormatting.RED + "Command '" + args[0] + "' does not exist!");
-    	
-    	return false;
-    }
-
-    public void handleCommand(ServerCommand servercommand)
-    {
-        String s = servercommand.command;
-        ICommandListener icommandlistener = servercommand.commandListener;
-        String s1 = icommandlistener.getUsername();
-        PlayerList serverconfigurationmanager = minecraftServer.playerList;
-        if(handleCommandNew(servercommand)) {} else
-        if(s.toLowerCase().startsWith("help") || s.toLowerCase().startsWith("?"))
-        {
-            printHelp(icommandlistener);
-        } else
-        if(s.toLowerCase().startsWith("save-all"))
-        {
-            sendNoticeToOps(s1, "Forcing save..");
-            if(serverconfigurationmanager != null)
-            {
-                serverconfigurationmanager.savePlayerStates();
-            }
-            for(int i = 0; i < minecraftServer.dimensionWorlds.length; i++)
-            {
-                WorldServer worldserver = minecraftServer.dimensionWorlds[i];
-                worldserver.saveWorld(true, null, i == 0);
-            }
-
-            sendNoticeToOps(s1, "Save complete.");
-        } else
-        if(s.toLowerCase().startsWith("save-off"))
-        {
-            sendNoticeToOps(s1, "Disabling level saving..");
-            for(int j = 0; j < minecraftServer.dimensionWorlds.length; j++)
-            {
-                WorldServer worldserver1 = minecraftServer.dimensionWorlds[j];
-                worldserver1.levelSaving = true;
-            }
-
-        } else
-        if(s.toLowerCase().startsWith("save-on"))
-        {
-            sendNoticeToOps(s1, "Enabling level saving..");
-            for(int k = 0; k < minecraftServer.dimensionWorlds.length; k++)
-            {
-                WorldServer worldserver2 = minecraftServer.dimensionWorlds[k];
-                worldserver2.levelSaving = false;
-            }
-
-        } else
-        if(s.toLowerCase().startsWith("ban-ip "))
-        {
-            String s4 = s.substring(s.indexOf(" ")).trim();
-            serverconfigurationmanager.banIP(s4);
-            sendNoticeToOps(s1, (new StringBuilder()).append("Banning ip ").append(s4).toString());
-        } else
-        if(s.toLowerCase().startsWith("pardon-ip "))
-        {
-            String s5 = s.substring(s.indexOf(" ")).trim();
-            serverconfigurationmanager.pardonIP(s5);
-            sendNoticeToOps(s1, (new StringBuilder()).append("Pardoning ip ").append(s5).toString());
-        } else
-        if(s.toLowerCase().startsWith("ban "))
-        {
-            String s6 = s.substring(s.indexOf(" ")).trim();
-            serverconfigurationmanager.banPlayer(s6);
-            sendNoticeToOps(s1, (new StringBuilder()).append("Banning ").append(s6).toString());
-            EntityPlayerMP entityplayermp = serverconfigurationmanager.getPlayerEntity(s6);
-            if(entityplayermp != null)
-            {
-                entityplayermp.playerNetServerHandler.kickPlayer("Banned by admin");
-            }
-        } else
-        if(s.toLowerCase().startsWith("pardon "))
-        {
-            String s7 = s.substring(s.indexOf(" ")).trim();
-            serverconfigurationmanager.pardonPlayer(s7);
-            sendNoticeToOps(s1, (new StringBuilder()).append("Pardoning ").append(s7).toString());
-        } else
-        if(s.toLowerCase().startsWith("kick "))
-        {
-            String s8 = s.substring(s.indexOf(" ")).trim();
-            EntityPlayerMP entityplayermp1 = null;
-            for(int l = 0; l < serverconfigurationmanager.playerEntities.size(); l++)
-            {
-                EntityPlayerMP entityplayermp5 = (EntityPlayerMP)serverconfigurationmanager.playerEntities.get(l);
-                if(entityplayermp5.username.equalsIgnoreCase(s8))
-                {
-                    entityplayermp1 = entityplayermp5;
-                }
-            }
-
-            if(entityplayermp1 != null)
-            {
-                entityplayermp1.playerNetServerHandler.kickPlayer("Kicked by admin");
-                sendNoticeToOps(s1, (new StringBuilder()).append("Kicking ").append(entityplayermp1.getDisplayName()).toString());
-            } else
-            {
-                icommandlistener.log((new StringBuilder()).append("Can't find user ").append(s8).append(". No kick.").toString());
-            }
-        } else
-        if(s.toLowerCase().startsWith("say "))
-        {
-            s = s.substring(s.indexOf(" ")).trim();
-            minecraftLogger.info((new StringBuilder()).append("[").append(s1).append("] ").append(s).toString());
-            serverconfigurationmanager.sendPacketToAllPlayers(new Packet3Chat((new StringBuilder()).append(TextFormatting.PINK + "[Server] ").append(s).toString()));
-        } else
-        if(s.toLowerCase().startsWith("whitelist "))
-        {
-            handleWhitelist(s1, s, icommandlistener);
-        }
-        else if (s.startsWith("gamemode "))
-        {
-        	String as[] = s.split(" ");
-        	if (as.length == 3)
-        	{
-        		int gamemodeId = -1;
-        		try
-        		{
-        			gamemodeId = Integer.parseInt(as[2]);
-        		}
-        		catch (Exception e)
-        		{
-                    icommandlistener.log("Unknown or invalid gamemode ID.");
-        		}
-        		
-        		if (gamemodeId != -1)
-        		{
-        			if (gamemodeId >= Gamemode.gamemodesList.length || Gamemode.gamemodesList[gamemodeId] == null)
-        			{
-                        icommandlistener.log("Unknown or invalid gamemode ID.");
-        			}
-        			else
-        			{
-
-                        EntityPlayerMP player = serverconfigurationmanager.getPlayerEntity(as[1]);
-                        if(player == null)
-                        {
-                            icommandlistener.log("There's no player by that name online.");
-                        }
-                        else
-                        {
-                        	player.setGamemode(Gamemode.gamemodesList[gamemodeId]);
-                            sendNoticeToOps(s1, (new StringBuilder()).append("Setting ").append(player.getDisplayName()).append("\2477").append("'s gamemode to ").append(Gamemode.gamemodesList[gamemodeId].getLanguageKey()).toString());
-                        }
-        			}
-        		}
-        	}
-        }
-        else
-        {
-            minecraftLogger.info("Unknown console command. Type \"help\" for help.");
-        }
-    }
-
-    private void handleWhitelist(String s, String s1, ICommandListener icommandlistener)
-    {
-        String as[] = s1.split(" ");
-        if(as.length < 2)
-        {
-            return;
-        }
-        String s2 = as[1].toLowerCase();
-        if("on".equals(s2))
-        {
-            sendNoticeToOps(s, "Turned on white-listing");
-            minecraftServer.propertyManager.setProperty("white-list", true);
-        } else
-        if("off".equals(s2))
-        {
-            sendNoticeToOps(s, "Turned off white-listing");
-            minecraftServer.propertyManager.setProperty("white-list", false);
-        } else
-        if("list".equals(s2))
-        {
-            Set set = minecraftServer.playerList.getWhitelist();
-            String s5 = "";
-            for(Iterator iterator = set.iterator(); iterator.hasNext();)
-            {
-                String s6 = (String)iterator.next();
-                s5 = (new StringBuilder()).append(s5).append(s6).append(" ").toString();
-            }
-
-            icommandlistener.log((new StringBuilder()).append("White-listed players: ").append(s5).toString());
-        } else
-        if("add".equals(s2) && as.length == 3)
-        {
-            String s3 = as[2].toLowerCase();
-            minecraftServer.playerList.addToWhiteList(s3);
-            sendNoticeToOps(s, (new StringBuilder()).append("Added ").append(s3).append(" to white-list").toString());
-        } else
-        if("remove".equals(s2) && as.length == 3)
-        {
-            String s4 = as[2].toLowerCase();
-            minecraftServer.playerList.removeFromWhiteList(s4);
-            sendNoticeToOps(s, (new StringBuilder()).append("Removed ").append(s4).append(" from white-list").toString());
-        } else
-        if("reload".equals(s2))
-        {
-            minecraftServer.playerList.reloadWhiteList();
-            sendNoticeToOps(s, "Reloaded white-list from file");
-        }
     }
-
-    private void printHelp(ICommandListener icommandlistener)
-    {
-        icommandlistener.log("To run the server without a gui, start it like this:");
-        icommandlistener.log("   java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui");
-        icommandlistener.log("Console commands:");
-        icommandlistener.log("   help  or  ?               shows this message");
-        icommandlistener.log("   kick <player>             removes a player from the server");
-        icommandlistener.log("   ban <player>              bans a player from the server");
-        icommandlistener.log("   pardon <player>           pardons a banned player so that they can connect again");
-        icommandlistener.log("   ban-ip <ip>               bans an IP address from the server");
-        icommandlistener.log("   pardon-ip <ip>            pardons a banned IP address so that they can connect again");
-        icommandlistener.log("   op <player>               turns a player into an op");
-        icommandlistener.log("   deop <player>             removes op status from a player");
-        icommandlistener.log("   tp <player1> <player2>    moves one player to the same location as another player");
-        icommandlistener.log("   give <player> <id> [num]  gives a player a resource");
-        icommandlistener.log("   tell <player> <message>   sends a private message to a player");
-        icommandlistener.log("   stop                      gracefully stops the server");
-        icommandlistener.log("   save-all                  forces a server-wide level save");
-        icommandlistener.log("   save-off                  disables terrain saving (useful for backup scripts)");
-        icommandlistener.log("   save-on                   re-enables terrain saving");
-        icommandlistener.log("   list                      lists all currently connected players");
-        icommandlistener.log("   say <message>             broadcasts a message to all players");
-        icommandlistener.log("   time <add|set> <amount>   adds to or sets the world time (0-24000)");
-        icommandlistener.log("   gamemode <player> <id>   sets the target player's gamemode");
-        icommandlistener.log("   setspawn <x> <y> <z>   sets the server spawn point to the given coordinates");
-    }
-
-    private void sendNoticeToOps(String s, String s1)
-    {
-        String s2 = (new StringBuilder()).append(s).append(": ").append(s1).toString();
-        minecraftServer.playerList.sendChatMessageToAllOps((new StringBuilder()).append("\2477(").append(s2).append(")").toString());
-        minecraftLogger.info(s2);
-    }
-
-    private int tryParse(String s, int i)
-    {
-        try
-        {
-            return Integer.parseInt(s);
-        }
-        catch(NumberFormatException numberformatexception)
-        {
-            return i;
-        }
-    }
-
 }
diff --git a/src/main/java/net/minecraft/server/net/NetworkListenThread.java b/src/main/java/net/minecraft/server/net/NetworkListenThread.java
index 9bc07d6f1..f781fe02f 100644
--- a/src/main/java/net/minecraft/server/net/NetworkListenThread.java
+++ b/src/main/java/net/minecraft/server/net/NetworkListenThread.java
@@ -5,17 +5,16 @@ import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.ArrayList;
-import java.util.HashMap;
 
 
-import net.minecraft.server.net.handler.NetLoginHandler;
-import net.minecraft.server.net.handler.NetServerHandler;
+import net.minecraft.server.net.handler.LoginPacketHandler;
+import net.minecraft.server.net.handler.ServerPacketHandler;
 import net.minecraft.server.MinecraftServer;
 import org.apache.log4j.Logger;
 
 
 // Referenced classes of package net.minecraft.src:
-//            NetworkAcceptThread, NetLoginHandler, NetworkManager, NetServerHandler
+//            NetworkAcceptThread, LoginPacketHandler, NetworkManager, ServerPacketHandler
 
 public class NetworkListenThread
 {
@@ -36,7 +35,7 @@ public class NetworkListenThread
                 try {
                     Socket socket = serverSocket.accept();
                     if (socket != null) {
-                        NetLoginHandler loginHandler = new NetLoginHandler(mcServer, socket, "Connection #" + connectionCounter++);
+                        LoginPacketHandler loginHandler = new LoginPacketHandler(mcServer, socket, "Connection #" + connectionCounter++);
                         addPendingConnection(loginHandler);
                     }
                 } catch (IOException ioexception) {
@@ -47,12 +46,12 @@ public class NetworkListenThread
         networkAcceptThread.start();
     }
 
-    public void addPlayer(NetServerHandler netserverhandler)
+    public void addPlayer(ServerPacketHandler netserverhandler)
     {
         playerList.add(netserverhandler);
     }
 
-    private void addPendingConnection(NetLoginHandler netloginhandler)
+    private void addPendingConnection(LoginPacketHandler netloginhandler)
     {
         if(netloginhandler == null)
         {
@@ -68,7 +67,7 @@ public class NetworkListenThread
     {
         for(int i = 0; i < pendingConnections.size(); i++)
         {
-            NetLoginHandler netloginhandler = pendingConnections.get(i);
+            LoginPacketHandler netloginhandler = pendingConnections.get(i);
             try
             {
                 netloginhandler.tryLogin();
@@ -87,7 +86,7 @@ public class NetworkListenThread
 
         for(int j = 0; j < playerList.size(); j++)
         {
-            NetServerHandler netserverhandler = (NetServerHandler)playerList.get(j);
+            ServerPacketHandler netserverhandler = (ServerPacketHandler)playerList.get(j);
             try
             {
                 netserverhandler.handlePackets();
@@ -111,8 +110,8 @@ public class NetworkListenThread
     private Thread networkAcceptThread;
     public volatile boolean isListening;
     private int connectionCounter;
-    private ArrayList<NetLoginHandler> pendingConnections;
-    private final ArrayList<NetServerHandler> playerList;
+    private ArrayList<LoginPacketHandler> pendingConnections;
+    private final ArrayList<ServerPacketHandler> playerList;
     public MinecraftServer mcServer;
 
 }
diff --git a/src/main/java/net/minecraft/core/player/PlayerHash.java b/src/main/java/net/minecraft/server/net/PlayerHash.java
similarity index 99%
rename from src/main/java/net/minecraft/core/player/PlayerHash.java
rename to src/main/java/net/minecraft/server/net/PlayerHash.java
index 47f74a21f..2f091caf9 100644
--- a/src/main/java/net/minecraft/core/player/PlayerHash.java
+++ b/src/main/java/net/minecraft/server/net/PlayerHash.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.player;
+package net.minecraft.server.net;
 
 
 // Referenced classes of package net.minecraft.src:
diff --git a/src/main/java/net/minecraft/core/player/PlayerHashEntry.java b/src/main/java/net/minecraft/server/net/PlayerHashEntry.java
similarity index 97%
rename from src/main/java/net/minecraft/core/player/PlayerHashEntry.java
rename to src/main/java/net/minecraft/server/net/PlayerHashEntry.java
index 433ab07b4..42ff0829f 100644
--- a/src/main/java/net/minecraft/core/player/PlayerHashEntry.java
+++ b/src/main/java/net/minecraft/server/net/PlayerHashEntry.java
@@ -1,4 +1,4 @@
-package net.minecraft.core.player;
+package net.minecraft.server.net;
 
 
 // Referenced classes of package net.minecraft.src:
diff --git a/src/main/java/net/minecraft/server/net/PlayerList.java b/src/main/java/net/minecraft/server/net/PlayerList.java
index 7e0197858..864b73f0e 100644
--- a/src/main/java/net/minecraft/server/net/PlayerList.java
+++ b/src/main/java/net/minecraft/server/net/PlayerList.java
@@ -1,10 +1,10 @@
 package net.minecraft.server.net;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.server.net.handler.NetLoginHandler;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.server.entity.player.ServerPlayer;
+import net.minecraft.server.net.handler.LoginPacketHandler;
 import net.minecraft.core.net.packet.*;
 import net.minecraft.server.player.PlayerManager;
 import net.minecraft.server.world.ServerPlayerController;
@@ -25,7 +25,7 @@ import java.util.*;
 public class PlayerList
 {
     public static Logger logger = Logger.getLogger("Minecraft");
-    public List<EntityPlayerMP> playerEntities;
+    public List<ServerPlayer> playerEntities;
     private final MinecraftServer server;
     private final PlayerManager[] playerManagers;
     private final Set<String> bans;
@@ -73,7 +73,7 @@ public class PlayerList
         playerIo = aworldserver[0].getSaveHandler().getPlayerFileData();
     }
 
-    public void func_28172_a(EntityPlayerMP player)
+    public void func_28172_a(ServerPlayer player)
     {
         for (PlayerManager playerManager : playerManagers) {
             playerManager.removePlayer(player);
@@ -93,12 +93,12 @@ public class PlayerList
         return playerManagers[dim];
     }
 
-    public void load(EntityPlayerMP player)
+    public void load(ServerPlayer player)
     {
         playerIo.load(player);
     }
 
-    public void playerLoggedIn(EntityPlayerMP player)
+    public void playerLoggedIn(ServerPlayer player)
     {
         playerEntities.add(player);
         player.playerNetServerHandler.handleSendInitialPlayerList();
@@ -117,12 +117,12 @@ public class PlayerList
         getPlayerManager(player.dimension).addPlayer(player);
     }
 
-    public void func_613_b(EntityPlayerMP entityplayermp)
+    public void func_613_b(ServerPlayer entityplayermp)
     {
         getPlayerManager(entityplayermp.dimension).func_543_c(entityplayermp);
     }
 
-    public void playerLoggedOut(EntityPlayerMP entityplayermp)
+    public void playerLoggedOut(ServerPlayer entityplayermp)
     {
         playerIo.save(entityplayermp);
         server.getDimensionWorld(entityplayermp.dimension).setEntityDead(entityplayermp);
@@ -130,7 +130,7 @@ public class PlayerList
         getPlayerManager(entityplayermp.dimension).removePlayer(entityplayermp);
     }
 
-    public EntityPlayerMP getPlayerForLogin(NetLoginHandler handler, String username)
+    public ServerPlayer getPlayerForLogin(LoginPacketHandler handler, String username)
     {
         if (bans.contains(username.trim().toLowerCase()))
         {
@@ -157,17 +157,17 @@ public class PlayerList
         }
         for (int i = 0; i < playerEntities.size(); i++)
         {
-            EntityPlayerMP player = playerEntities.get(i);
+            ServerPlayer player = playerEntities.get(i);
             if (player.username.equalsIgnoreCase(username))
             {
                 player.playerNetServerHandler.kickPlayer("You are logged in from another location!");
             }
         }
 
-        return new EntityPlayerMP(server, server.getDimensionWorld(0), username, new ServerPlayerController(server.getDimensionWorld(0)));
+        return new ServerPlayer(server, server.getDimensionWorld(0), username, new ServerPlayerController(server.getDimensionWorld(0)));
     }
 
-    public EntityPlayerMP recreatePlayerEntity(EntityPlayerMP previousPlayer, int i)
+    public ServerPlayer recreatePlayerEntity(ServerPlayer previousPlayer, int i)
     {
         server.getEntityTracker(previousPlayer.dimension).removeTrackedPlayerSymmetric(previousPlayer);
         server.getEntityTracker(previousPlayer.dimension).untrackEntity(previousPlayer);
@@ -176,7 +176,7 @@ public class PlayerList
         server.getDimensionWorld(previousPlayer.dimension).removePlayer(previousPlayer);
         ChunkCoordinates chunkcoordinates = previousPlayer.getPlayerSpawnCoordinate();
         previousPlayer.dimension = i;
-        EntityPlayerMP newPlayer = new EntityPlayerMP(server, server.getDimensionWorld(previousPlayer.dimension), previousPlayer.username, new ServerPlayerController(server.getDimensionWorld(previousPlayer.dimension)));
+        ServerPlayer newPlayer = new ServerPlayer(server, server.getDimensionWorld(previousPlayer.dimension), previousPlayer.username, new ServerPlayerController(server.getDimensionWorld(previousPlayer.dimension)));
         newPlayer.id = previousPlayer.id;
         newPlayer.chatColor = previousPlayer.chatColor;
         newPlayer.nickname = previousPlayer.nickname;
@@ -187,7 +187,7 @@ public class PlayerList
         //entityplayermp1.setGamemodeOnLogin(entityplayermp.gamemode);
         if (chunkcoordinates != null)
         {
-            ChunkCoordinates chunkcoordinates1 = EntityPlayer.getValidBedSpawnCoordinates(server.getDimensionWorld(previousPlayer.dimension), chunkcoordinates);
+            ChunkCoordinates chunkcoordinates1 = Player.getValidBedSpawnCoordinates(server.getDimensionWorld(previousPlayer.dimension), chunkcoordinates);
             if (chunkcoordinates1 != null)
             {
                 newPlayer.moveTo((float) chunkcoordinates1.x + 0.5F, (float) chunkcoordinates1.y + 0.1F, (float) chunkcoordinates1.z + 0.5F, 0.0F, 0.0F);
@@ -195,15 +195,15 @@ public class PlayerList
             }
             else
             {
-                newPlayer.playerNetServerHandler.sendPacket(new Packet70Bed(0));
+                newPlayer.playerNetServerHandler.sendPacket(new BedMessagePacket(0));
             }
         }
         worldserver.chunkProviderServer.prepareChunk((int) newPlayer.x >> 4, (int) newPlayer.z >> 4);
         for (; worldserver.getCubes(newPlayer, newPlayer.bb).size() != 0; newPlayer.setPos(newPlayer.x, newPlayer.y + 1.0D, newPlayer.z))
         {
         }
-        newPlayer.playerNetServerHandler.sendPacket(new Packet9Respawn((byte) newPlayer.dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver.worldType)));
-        server.playerList.sendPacketToAllPlayers(new Packet41EntityPlayerGamemode(newPlayer.id, newPlayer.gamemode.getId()));
+        newPlayer.playerNetServerHandler.sendPacket(new RespawnPacket((byte) newPlayer.dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver.worldType)));
+        server.playerList.sendPacketToAllPlayers(new PlayerGamemodePacket(newPlayer.id, newPlayer.gamemode.getId()));
         newPlayer.playerNetServerHandler.teleportAndRotate(newPlayer.x, newPlayer.y, newPlayer.z, newPlayer.yRot, newPlayer.xRot);
         func_28170_a(newPlayer, worldserver);
         getPlayerManager(newPlayer.dimension).addPlayer(newPlayer);
@@ -211,51 +211,51 @@ public class PlayerList
         playerEntities.add(newPlayer);
         newPlayer.func_20057_k();
         newPlayer.func_22068_s();
-        newPlayer.playerNetServerHandler.sendPacket(new Packet74GameRule(server.getDimensionWorld(0).getLevelData().getGameRules()));
+        newPlayer.playerNetServerHandler.sendPacket(new GameRulePacket(server.getDimensionWorld(0).getLevelData().getGameRules()));
         return newPlayer;
     }
 
-    public void sendPlayerToOtherDimension(EntityPlayerMP entityplayermp, int targetDim, boolean generatePortal)
+    public void sendPlayerToOtherDimension(ServerPlayer serverPlayer, int targetDim, boolean generatePortal)
     {
-        WorldServer worldserver = server.getDimensionWorld(entityplayermp.dimension);
-        Dimension lastDim = Dimension.getDimensionList().get(entityplayermp.dimension);
+        WorldServer worldserver = server.getDimensionWorld(serverPlayer.dimension);
+        Dimension lastDim = Dimension.getDimensionList().get(serverPlayer.dimension);
         Dimension newDim = Dimension.getDimensionList().get(targetDim);
 
-        entityplayermp.dimension = targetDim;
-        WorldServer worldserver1 = server.getDimensionWorld(entityplayermp.dimension);
-        entityplayermp.playerNetServerHandler.sendPacket(new Packet9Respawn((byte) entityplayermp.dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver1.worldType)));
-        worldserver.removePlayer(entityplayermp);
-        entityplayermp.removed = false;
-        double d = entityplayermp.x;
-        double d1 = entityplayermp.z;
+        serverPlayer.dimension = targetDim;
+        WorldServer worldserver1 = server.getDimensionWorld(serverPlayer.dimension);
+        serverPlayer.playerNetServerHandler.sendPacket(new RespawnPacket((byte) serverPlayer.dimension, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver1.worldType)));
+        worldserver.removePlayer(serverPlayer);
+        serverPlayer.removed = false;
+        double d = serverPlayer.x;
+        double d1 = serverPlayer.z;
         double d2 = 8D;
 
         d *= Dimension.getCoordScale(lastDim, newDim);
         d1 *= Dimension.getCoordScale(lastDim, newDim);
-        entityplayermp.moveTo(d, entityplayermp.y, d1, entityplayermp.yRot, entityplayermp.xRot);
-        if (entityplayermp.isAlive())
+        serverPlayer.moveTo(d, serverPlayer.y, d1, serverPlayer.yRot, serverPlayer.xRot);
+        if (serverPlayer.isAlive())
         {
-            worldserver.updateEntityWithOptionalForce(entityplayermp, false);
+            worldserver.updateEntityWithOptionalForce(serverPlayer, false);
         }
 
-        if (entityplayermp.isAlive())
+        if (serverPlayer.isAlive())
         {
-            worldserver1.entityJoinedWorld(entityplayermp);
-            entityplayermp.moveTo(d, entityplayermp.y, d1, entityplayermp.yRot, entityplayermp.xRot);
-            worldserver1.updateEntityWithOptionalForce(entityplayermp, false);
+            worldserver1.entityJoinedWorld(serverPlayer);
+            serverPlayer.moveTo(d, serverPlayer.y, d1, serverPlayer.yRot, serverPlayer.xRot);
+            worldserver1.updateEntityWithOptionalForce(serverPlayer, false);
             if (generatePortal){
                 worldserver1.chunkProviderServer.chunkLoadOverride = true;
-                (new PortalHandler()).teleportEntity(worldserver1, entityplayermp, lastDim, newDim);
+                (new PortalHandler()).teleportEntity(worldserver1, serverPlayer, lastDim, newDim);
                 worldserver1.chunkProviderServer.chunkLoadOverride = false;
             }
         }
-        func_28172_a(entityplayermp);
-        entityplayermp.playerNetServerHandler.teleportAndRotate(entityplayermp.x, entityplayermp.y, entityplayermp.z, entityplayermp.yRot, entityplayermp.xRot);
-        server.playerList.sendPacketToAllPlayers(new Packet41EntityPlayerGamemode(entityplayermp.id, entityplayermp.gamemode.getId()));
-        entityplayermp.setWorld(worldserver1);
-        func_28170_a(entityplayermp, worldserver1);
-        func_30008_g(entityplayermp);
-        entityplayermp.playerNetServerHandler.sendPacket(new Packet74GameRule(server.getDimensionWorld(0).getLevelData().getGameRules()));
+        func_28172_a(serverPlayer);
+        serverPlayer.playerNetServerHandler.teleportAndRotate(serverPlayer.x, serverPlayer.y, serverPlayer.z, serverPlayer.yRot, serverPlayer.xRot);
+        server.playerList.sendPacketToAllPlayers(new PlayerGamemodePacket(serverPlayer.id, serverPlayer.gamemode.getId()));
+        serverPlayer.setWorld(worldserver1);
+        func_28170_a(serverPlayer, worldserver1);
+        func_30008_g(serverPlayer);
+        serverPlayer.playerNetServerHandler.sendPacket(new GameRulePacket(server.getDimensionWorld(0).getLevelData().getGameRules()));
     }
 
     public void onTick()
@@ -276,7 +276,7 @@ public class PlayerList
     {
         for (int i = 0; i < playerEntities.size(); i++)
         {
-            EntityPlayerMP entityplayermp = playerEntities.get(i);
+            ServerPlayer entityplayermp = playerEntities.get(i);
             entityplayermp.playerNetServerHandler.sendPacket(packet);
         }
 
@@ -286,8 +286,8 @@ public class PlayerList
     {
         for (int i = 0; i < playerEntities.size(); i++)
         {
-            EntityPlayerMP entityplayermp = playerEntities.get(i);
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet3Chat(message, 0, AES.keyChain.get(entityplayermp.username)));
+            ServerPlayer entityplayermp = playerEntities.get(i);
+            entityplayermp.playerNetServerHandler.sendPacket(new ChatPacket(message, 0, AES.keyChain.get(entityplayermp.username)));
         }
 
     }
@@ -296,7 +296,7 @@ public class PlayerList
     {
         for (int j = 0; j < playerEntities.size(); j++)
         {
-            EntityPlayerMP entityplayermp = playerEntities.get(j);
+            ServerPlayer entityplayermp = playerEntities.get(j);
             if (entityplayermp.dimension == i)
             {
                 entityplayermp.playerNetServerHandler.sendPacket(packet);
@@ -519,11 +519,11 @@ public class PlayerList
         return ops.contains(s.trim().toLowerCase());
     }
     @Nullable
-    public EntityPlayerMP getPlayerEntity(String s)
+    public ServerPlayer getPlayerEntity(String s)
     {
         for (int i = 0; i < playerEntities.size(); i++)
         {
-            EntityPlayerMP entityplayermp = playerEntities.get(i);
+            ServerPlayer entityplayermp = playerEntities.get(i);
             if (entityplayermp.username.equalsIgnoreCase(s))
             {
                 return entityplayermp;
@@ -535,10 +535,10 @@ public class PlayerList
 
     public void sendChatMessageToPlayer(String s, String s1)
     {
-        EntityPlayerMP entityplayermp = getPlayerEntity(s);
+        ServerPlayer entityplayermp = getPlayerEntity(s);
         if (entityplayermp != null)
         {
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet3Chat(s1));
+            entityplayermp.playerNetServerHandler.sendPacket(new ChatPacket(s1));
         }
     }
 
@@ -547,10 +547,10 @@ public class PlayerList
         sendPacketToOtherPlayersAroundPoint(null, x, y, z, radius, dimension, packet);
     }
 
-    public void sendPacketToOtherPlayersAroundPoint(EntityPlayer player, double x, double y, double z,
-                                               double radius, int dimension, Packet packet)
+    public void sendPacketToOtherPlayersAroundPoint(Player player, double x, double y, double z,
+                                                    double radius, int dimension, Packet packet)
     {
-        for (EntityPlayerMP otherPlayer : playerEntities) {
+        for (ServerPlayer otherPlayer : playerEntities) {
             if (otherPlayer == player || otherPlayer.dimension != dimension) {
                 continue;
             }
@@ -566,13 +566,13 @@ public class PlayerList
 
     public void sendChatMessageToAllOps(String s)
     {
-        Packet3Chat packet3chat = new Packet3Chat(s);
+        ChatPacket chatPacket = new ChatPacket(s);
         for (int i = 0; i < playerEntities.size(); i++)
         {
-            EntityPlayerMP entityplayermp = playerEntities.get(i);
+            ServerPlayer entityplayermp = playerEntities.get(i);
             if (isOp(entityplayermp.username))
             {
-                entityplayermp.playerNetServerHandler.sendPacket(packet3chat);
+                entityplayermp.playerNetServerHandler.sendPacket(chatPacket);
             }
         }
 
@@ -580,7 +580,7 @@ public class PlayerList
 
     public boolean sendPacketToPlayer(String s, Packet packet)
     {
-        EntityPlayerMP entityplayermp = getPlayerEntity(s);
+        ServerPlayer entityplayermp = getPlayerEntity(s);
         if (entityplayermp != null)
         {
             entityplayermp.playerNetServerHandler.sendPacket(packet);
@@ -601,7 +601,7 @@ public class PlayerList
 
     }
 
-    public void sendTileEntityToPlayer(int i, int j, int k, TileEntity tileentity)
+    public void sendTileEntityToPlayer(int i, int j, int k, BlockEntity tileentity)
     {
     }
 
@@ -617,7 +617,7 @@ public class PlayerList
         saveWhiteList();
     }
 
-    public Set getWhitelist()
+    public Set<String> getWhitelist()
     {
         return whitelist;
     }
@@ -627,16 +627,16 @@ public class PlayerList
         loadWhiteList();
     }
 
-    public void func_28170_a(EntityPlayerMP entityplayermp, WorldServer worldserver)
+    public void func_28170_a(ServerPlayer entityplayermp, WorldServer worldserver)
     {
-        entityplayermp.playerNetServerHandler.sendPacket(new Packet4UpdateTime(worldserver.getWorldTime()));
+        entityplayermp.playerNetServerHandler.sendPacket(new SetTimePacket(worldserver.getWorldTime()));
 //        if(worldserver.func_27068_v())
 //        {
-//            entityplayermp.playerNetServerHandler.sendPacket(new Packet70Bed(1));
+//            entityplayermp.playerNetServerHandler.sendPacket(new BedMessagePacket(1));
 //        }
     }
 
-    public void func_30008_g(EntityPlayerMP entityplayermp)
+    public void func_30008_g(ServerPlayer entityplayermp)
     {
         entityplayermp.func_28017_a(entityplayermp.inventorySlots);
         entityplayermp.func_30001_B();
diff --git a/src/main/java/net/minecraft/server/net/handler/NetLoginHandler.java b/src/main/java/net/minecraft/server/net/handler/LoginPacketHandler.java
similarity index 64%
rename from src/main/java/net/minecraft/server/net/handler/NetLoginHandler.java
rename to src/main/java/net/minecraft/server/net/handler/LoginPacketHandler.java
index 548a5a887..38bb40bb9 100644
--- a/src/main/java/net/minecraft/server/net/handler/NetLoginHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/LoginPacketHandler.java
@@ -3,8 +3,8 @@ package net.minecraft.server.net.handler;
 import net.minecraft.core.Global;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.registry.recipe.RecipeEntryBase;
-import net.minecraft.core.net.handler.NetHandler;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.core.net.NetworkManager;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.net.packet.*;
@@ -25,35 +25,35 @@ import java.util.Random;
 
 
 // Referenced classes of package net.minecraft.src:
-//            NetHandler, NetworkManager, Packet255KickDisconnect, Packet2Handshake, 
-//            Packet1Login, ThreadLoginVerifier, ServerConfigurationManager, EntityPlayerMP, 
-//            WorldServer, NetServerHandler, WorldProvider, Packet6SpawnPosition, 
-//            ChunkCoordinates, Packet3Chat, NetworkListenThread, Packet4UpdateTime, 
+//            PacketHandler, NetworkManager, DisconnectPacket, PreLoginPacket,
+//            LoginPacket, ThreadLoginVerifier, ServerConfigurationManager, ServerPlayer,
+//            WorldServer, ServerPacketHandler, WorldProvider, SetSpawnPositionPacket,
+//            ChunkCoordinates, ChatPacket, NetworkListenThread, SetTimePacket,
 //            Packet
 
-public class NetLoginHandler extends NetHandler
+public class LoginPacketHandler extends PacketHandler
 {
     public static String kickMessage = null;
 
-    public NetLoginHandler(MinecraftServer minecraftserver, Socket socket, String s)
+    public LoginPacketHandler(MinecraftServer minecraftserver, Socket socket, String s)
             throws IOException
     {
         finishedProcessing = false;
         loginTimer = 0;
         username = null;
-        packet1login = null;
+        loginPacket = null;
         serverId = "";
         mcServer = minecraftserver;
         netManager = new NetworkManager(socket, s, this);
-        netManager.packetSendDelay = 0;
+        netManager.fakeLag = 0;
     }
 
     public void tryLogin()
     {
-        if (packet1login != null)
+        if (loginPacket != null)
         {
-            doLogin(packet1login);
-            packet1login = null;
+            doLogin(loginPacket);
+            loginPacket = null;
         }
         if (loginTimer++ == 600)
         {
@@ -75,7 +75,7 @@ public class NetLoginHandler extends NetHandler
         try
         {
             if (!silent) logger.info("Disconnecting " + getUserAndIPString() + ": " + s);
-            netManager.addToSendQueue(new Packet255KickDisconnect(s));
+            netManager.addToSendQueue(new DisconnectPacket(s));
             netManager.serverShutdown();
             finishedProcessing = true;
         }
@@ -86,26 +86,26 @@ public class NetLoginHandler extends NetHandler
     }
 
     @Override
-	public void handleHandshake(Packet2Handshake packet2handshake)
+	public void handleHandshake(PreLoginPacket preLoginPacket)
     {
         if (mcServer.onlineMode)
         {
             serverId = Long.toHexString(rand.nextLong());
-            netManager.addToSendQueue(new Packet2Handshake(serverId));
+            netManager.addToSendQueue(new PreLoginPacket(serverId));
         }
         else
         {
-            netManager.addToSendQueue(new Packet2Handshake("-"));
+            netManager.addToSendQueue(new PreLoginPacket("-"));
         }
     }
 
     @Override
-	public void handleLogin(Packet1Login packet1login)
+	public void handleLogin(LoginPacket loginPacket)
     {
-        username = packet1login.username;
-        if (packet1login.playerEntityIdAndProtocolVersion != Global.MP_PROTOCOL_VERSION)
+        username = loginPacket.username;
+        if (loginPacket.playerEntityIdAndProtocolVersion != Global.MP_PROTOCOL_VERSION)
         {
-            if (packet1login.playerEntityIdAndProtocolVersion > Global.MP_PROTOCOL_VERSION)
+            if (loginPacket.playerEntityIdAndProtocolVersion > Global.MP_PROTOCOL_VERSION)
             {
                 kickUser("Outdated server!");
             }
@@ -117,17 +117,17 @@ public class NetLoginHandler extends NetHandler
         }
         if (!mcServer.onlineMode)
         {
-            doLogin(packet1login);
+            doLogin(loginPacket);
         }
         else
         {
-            (new ThreadLoginVerifier(this, packet1login)).start();
+            (new ThreadLoginVerifier(this, loginPacket)).start();
         }
     }
 
-    public void doLogin(Packet1Login packet1login)
+    public void doLogin(LoginPacket loginPacket)
     {
-        EntityPlayerMP entityplayermp = mcServer.playerList.getPlayerForLogin(this, packet1login.username);
+        ServerPlayer entityplayermp = mcServer.playerList.getPlayerForLogin(this, loginPacket.username);
         if (entityplayermp != null)
         {
             mcServer.playerList.load(entityplayermp);
@@ -135,13 +135,13 @@ public class NetLoginHandler extends NetHandler
             logger.info(getUserAndIPString() + " logged in with entity id " + entityplayermp.id + " at (" + entityplayermp.x + ", " + entityplayermp.y + ", " + entityplayermp.z + ")");
             WorldServer worldserver = mcServer.getDimensionWorld(entityplayermp.dimension);
             ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint();
-            NetServerHandler netserverhandler = new NetServerHandler(mcServer, netManager, entityplayermp);
+            ServerPacketHandler netserverhandler = new ServerPacketHandler(mcServer, netManager, entityplayermp);
             try
             {
-                netserverhandler.sendPacket(new Packet1Login("", entityplayermp.id, worldserver.getRandomSeed(), (byte) worldserver.dimension.id, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver.dimensionData.getWorldType()), NetworkManager.PACKET_DELAY, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
+                netserverhandler.sendPacket(new LoginPacket("", entityplayermp.id, worldserver.getRandomSeed(), (byte) worldserver.dimension.id, (byte) Registries.WORLD_TYPES.getNumericIdOfItem(worldserver.dimensionData.getWorldType()), NetworkManager.PACKET_DELAY, RSA.getPublicKey(RSA.RSAKeyChain.getPublic())));
 
                 Key aesKey = AES.generateKey();
-                netserverhandler.sendPacket(new Packet136SendKey(RSA.encrypt(AES.getKey(aesKey), RSA.getPublicKey(packet1login.publicKey))));
+                netserverhandler.sendPacket(new AESSendKeyPacket(RSA.encrypt(AES.getKey(aesKey), RSA.getPublicKey(loginPacket.publicKey))));
                 AES.keyChain.put(entityplayermp.username, aesKey);
             }
             catch (Exception e)
@@ -149,33 +149,33 @@ public class NetLoginHandler extends NetHandler
                 throw new RuntimeException(e);
             }
 
-            netserverhandler.sendPacket(new Packet6SpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z));
+            netserverhandler.sendPacket(new SetSpawnPositionPacket(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z));
             mcServer.playerList.func_28170_a(entityplayermp, worldserver);
-            mcServer.playerList.sendPacketToAllPlayers(new Packet3Chat(TextFormatting.YELLOW + entityplayermp.getDisplayName() + TextFormatting.YELLOW + " joined the game."));
-            mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(entityplayermp.username, entityplayermp.nickname, entityplayermp.score, entityplayermp.chatColor, true, entityplayermp.isOperator()));
+            mcServer.playerList.sendPacketToAllPlayers(new ChatPacket(TextFormatting.YELLOW + entityplayermp.getDisplayName() + TextFormatting.YELLOW + " joined the game."));
+            mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(entityplayermp.username, entityplayermp.nickname, entityplayermp.score, entityplayermp.chatColor, true, entityplayermp.isOperator()));
 
             if (mcServer.joinMessage != null && mcServer.joinMessage.length() > 0)
             {
-                entityplayermp.playerNetServerHandler.sendPacket(new Packet3Chat(mcServer.joinMessage));
+                entityplayermp.playerNetServerHandler.sendPacket(new ChatPacket(mcServer.joinMessage));
             }
 
             mcServer.playerList.playerLoggedIn(entityplayermp);
             netserverhandler.teleportAndRotate(entityplayermp.x, entityplayermp.y, entityplayermp.z, entityplayermp.yRot, entityplayermp.xRot);
             mcServer.networkServer.addPlayer(netserverhandler);
-            mcServer.playerList.sendPacketToAllPlayers(new Packet41EntityPlayerGamemode(entityplayermp.id, entityplayermp.gamemode.getId()));
-            netserverhandler.sendPacket(new Packet4UpdateTime(worldserver.getWorldTime()));
+            mcServer.playerList.sendPacketToAllPlayers(new PlayerGamemodePacket(entityplayermp.id, entityplayermp.gamemode.getId()));
+            netserverhandler.sendPacket(new SetTimePacket(worldserver.getWorldTime()));
             entityplayermp.func_20057_k();
             if (MinecraftServer.statsStatus)
             {
                 RestHandler.post("https://api.betterthanadventure.net/stats?serverToken=" + MinecraftServer.statsToken + "&count=" + mcServer.playerList.playerEntities.size());
             }
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet143PhotoMode(mcServer.disablePhotoMode));
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet74GameRule(mcServer.getDimensionWorld(0).getLevelData().getGameRules()));
+            entityplayermp.playerNetServerHandler.sendPacket(new PhotoModePacket(mcServer.disablePhotoMode));
+            entityplayermp.playerNetServerHandler.sendPacket(new GameRulePacket(mcServer.getDimensionWorld(0).getLevelData().getGameRules()));
 
             for (RecipeEntryBase<?, ?, ?> recipe : Registries.RECIPES.getAllSerializableRecipes()) {
-                entityplayermp.playerNetServerHandler.sendPacket(new Packet75RecipeSync(recipe,Registries.RECIPES.getAllSerializableRecipes().size()));
+                entityplayermp.playerNetServerHandler.sendPacket(new RecipeSyncPacket(recipe,Registries.RECIPES.getAllSerializableRecipes().size()));
             }
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet201Ids());
+            entityplayermp.playerNetServerHandler.sendPacket(new SyncIDsPacket());
         }
         finishedProcessing = true;
     }
@@ -188,7 +188,7 @@ public class NetLoginHandler extends NetHandler
     }
 
     @Override
-    public void handlePingHandshake(Packet254PingHandshake packet) {
+    public void handlePingHandshake(PingHandshakePacket packet) {
         String msg = "";
         if (packet.pingHostString.equals("MC|PingHost")) {
             msg =
@@ -249,14 +249,14 @@ public class NetLoginHandler extends NetHandler
         return true;
     }
 
-    public static String getServerId(NetLoginHandler netloginhandler)
+    public static String getServerId(LoginPacketHandler netloginhandler)
     {
         return netloginhandler.serverId;
     }
 
-    public static Packet1Login setLoginPacket(NetLoginHandler netloginhandler, Packet1Login packet1login)
+    public static LoginPacket setLoginPacket(LoginPacketHandler netloginhandler, LoginPacket loginPacket)
     {
-        return netloginhandler.packet1login = packet1login;
+        return netloginhandler.loginPacket = loginPacket;
     }
 
     public static Logger logger = Logger.getLogger("Minecraft");
@@ -266,7 +266,7 @@ public class NetLoginHandler extends NetHandler
     private MinecraftServer mcServer;
     private int loginTimer;
     private String username;
-    private Packet1Login packet1login;
+    private LoginPacket loginPacket;
     private String serverId;
 
 }
diff --git a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java b/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
similarity index 67%
rename from src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
rename to src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
index a78c6a067..4b2550d1f 100644
--- a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
@@ -1,22 +1,17 @@
 package net.minecraft.server.net.handler;
 
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import net.minecraft.core.HitResult;
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.block.entity.TileEntityMobSpawner;
-import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.entity.FlagBlockEntity;
+import net.minecraft.core.block.entity.MobSpawnerBlockEntity;
+import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.enums.PlacementMode;
-import net.minecraft.core.item.Item;
+import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.net.ChatEmotes;
 import net.minecraft.core.net.ICommandListener;
 import net.minecraft.core.net.NetworkManager;
 import net.minecraft.core.net.command.Command;
@@ -26,41 +21,38 @@ import net.minecraft.core.net.command.PlayerCommandSender;
 import net.minecraft.core.net.command.ServerCommandHandler;
 import net.minecraft.core.net.command.ServerPlayerCommandSender;
 import net.minecraft.core.net.command.TextFormatting;
-import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.net.handler.PacketHandler;
+import net.minecraft.core.net.packet.ChatPacket;
+import net.minecraft.core.net.packet.PlayerCommandPacket;
+import net.minecraft.core.net.packet.InteractPacket;
+import net.minecraft.core.net.packet.KeepAlivePacket;
+import net.minecraft.core.net.packet.MovePlayerPacket;
 import net.minecraft.core.net.packet.Packet;
-import net.minecraft.core.net.packet.Packet0KeepAlive;
-import net.minecraft.core.net.packet.Packet101CloseWindow;
-import net.minecraft.core.net.packet.Packet102WindowClick;
-import net.minecraft.core.net.packet.Packet103SetSlot;
-import net.minecraft.core.net.packet.Packet106Transaction;
-import net.minecraft.core.net.packet.Packet107UpdateCreativeInventory;
-import net.minecraft.core.net.packet.Packet108SetHotbarOffset;
-import net.minecraft.core.net.packet.Packet10Flying;
-import net.minecraft.core.net.packet.Packet11PlayerPosition;
-import net.minecraft.core.net.packet.Packet130UpdateSign;
-import net.minecraft.core.net.packet.Packet132SetMobSpawner;
-import net.minecraft.core.net.packet.Packet133OpenGuidebook;
-import net.minecraft.core.net.packet.Packet137SetItemName;
-import net.minecraft.core.net.packet.Packet139SetPaintingMotive;
-import net.minecraft.core.net.packet.Packet13PlayerLookMove;
-import net.minecraft.core.net.packet.Packet14BlockDig;
-import net.minecraft.core.net.packet.Packet15Place;
-import net.minecraft.core.net.packet.Packet16BlockItemSwitch;
-import net.minecraft.core.net.packet.Packet18Animation;
-import net.minecraft.core.net.packet.Packet19EntityAction;
-import net.minecraft.core.net.packet.Packet250CustomPayload;
-import net.minecraft.core.net.packet.Packet255KickDisconnect;
-import net.minecraft.core.net.packet.Packet26BoatControl;
-import net.minecraft.core.net.packet.Packet27Position;
-import net.minecraft.core.net.packet.Packet3Chat;
-import net.minecraft.core.net.packet.Packet53BlockChange;
-import net.minecraft.core.net.packet.Packet72UpdatePlayerProfile;
-import net.minecraft.core.net.packet.Packet7UseEntity;
-import net.minecraft.core.net.packet.Packet9Respawn;
+import net.minecraft.core.net.packet.ContainerClosePacket;
+import net.minecraft.core.net.packet.ContainerClickPacket;
+import net.minecraft.core.net.packet.ContainerSetSlotPacket;
+import net.minecraft.core.net.packet.ContainerAckPacket;
+import net.minecraft.core.net.packet.UpdateCreativeInventoryPacket;
+import net.minecraft.core.net.packet.SetHotbarOffsetPacket;
+import net.minecraft.core.net.packet.SignUpdatePacket;
+import net.minecraft.core.net.packet.SetMobSpawnerPacket;
+import net.minecraft.core.net.packet.GuidebookPacket;
+import net.minecraft.core.net.packet.SetItemNamePacket;
+import net.minecraft.core.net.packet.SetPaintingArtPacket;
+import net.minecraft.core.net.packet.PlayerActionPacket;
+import net.minecraft.core.net.packet.UseItemPacket;
+import net.minecraft.core.net.packet.SetCarriedItemPacket;
+import net.minecraft.core.net.packet.AnimatePacket;
+import net.minecraft.core.net.packet.CustomPayloadPacket;
+import net.minecraft.core.net.packet.DisconnectPacket;
+import net.minecraft.core.net.packet.BoatControlPacket;
+import net.minecraft.core.net.packet.BlockUpdatePacket;
+import net.minecraft.core.net.packet.UpdatePlayerProfilePacket;
+import net.minecraft.core.net.packet.RespawnPacket;
 import net.minecraft.core.player.gamemode.Gamemode;
-import net.minecraft.core.player.inventory.ContainerFlag;
-import net.minecraft.core.player.inventory.ContainerPlayerCreative;
-import net.minecraft.core.player.inventory.InventoryPlayer;
+import net.minecraft.core.player.inventory.menu.FlagMenu;
+import net.minecraft.core.player.inventory.menu.CreativeInventoryMenu;
+import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.util.helper.AES;
 import net.minecraft.core.util.helper.ChatAllowedCharacters;
@@ -68,33 +60,25 @@ import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.RestHandler;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.util.phys.Vec3d;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.net.ChatEmotes;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.server.util.helper.PlayerList;
 import net.minecraft.server.world.WorldServer;
 import org.apache.log4j.Logger;
 
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
-// Referenced classes of package net.minecraft.src:
-//            NetHandler, ICommandListener, NetworkManager, EntityPlayerMP, 
-//            Packet0KeepAlive, Packet255KickDisconnect, Packet3Chat, ServerConfigurationManager, 
-//            Packet27Position, Packet10Flying, Entity, WorldServer, 
-//            AxisAlignedBB, Packet13PlayerLookMove, Packet14BlockDig, WorldProvider, 
-//            ChunkCoordinates, MathHelper, ItemInWorldManager, Packet53BlockChange, 
-//            InventoryPlayer, Packet15Place, ItemStack, Container, 
-//            Packet103SetSlot, Slot, Packet16BlockItemSwitch, ChatAllowedCharacters, 
-//            Packet18Animation, Packet19EntityAction, Packet7UseEntity, Packet102WindowClick, 
-//            Packet106Transaction, Packet130UpdateSign, TileEntitySign, Packet, 
-//            Packet9Respawn, Packet101CloseWindow
-
-public class NetServerHandler extends NetHandler
+public class ServerPacketHandler extends PacketHandler
         implements ICommandListener
 {
 
-    public NetServerHandler(MinecraftServer minecraftserver, NetworkManager networkManager, EntityPlayerMP player)
+    public ServerPacketHandler(MinecraftServer minecraftserver, NetworkManager networkManager, ServerPlayer player)
     {
         connectionClosed = false;
         hasMoved = true;
@@ -112,17 +96,17 @@ public class NetServerHandler extends NetHandler
         netManager.processReadPackets();
         if (field_15_f - field_22004_g > 20)
         {
-            sendPacket(new Packet0KeepAlive());
+            sendPacket(new KeepAlivePacket());
         }
     }
 
     public void kickPlayer(String s)
     {
         playerEntity.func_30002_A();
-        sendPacket(new Packet255KickDisconnect(s));
+        sendPacket(new DisconnectPacket(s));
         netManager.serverShutdown();
-        mcServer.playerList.sendPacketToAllPlayers(new Packet3Chat(playerEntity.getDisplayName() + TextFormatting.YELLOW + " was kicked from the game."));
-        mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(playerEntity.username, playerEntity.nickname, playerEntity.score, playerEntity.chatColor, false, playerEntity.isOperator()));
+        mcServer.playerList.sendPacketToAllPlayers(new ChatPacket(playerEntity.getDisplayName() + TextFormatting.YELLOW + " was kicked from the game."));
+        mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(playerEntity.username, playerEntity.nickname, playerEntity.score, playerEntity.chatColor, false, playerEntity.isOperator()));
         mcServer.playerList.playerLoggedOut(playerEntity);
         connectionClosed = true;
         if (MinecraftServer.statsStatus)
@@ -132,30 +116,25 @@ public class NetServerHandler extends NetHandler
         PlayerList.updateList();
     }
 
-    public void handleMovementTypePacket(Packet27Position packet)
-    {
-        playerEntity.setMovementType(packet.func_22031_c(), packet.func_22028_e(), packet.func_22032_g(), packet.func_22030_h(), packet.func_22029_d(), packet.func_22033_f());
-    }
-
     @Override
-    public void handleSetMobSpawner(Packet132SetMobSpawner packet) {
+    public void handleSetMobSpawner(SetMobSpawnerPacket packet) {
         WorldServer world = mcServer.getDimensionWorld(playerEntity.dimension);
         if (playerEntity.getGamemode() == Gamemode.creative && world.isBlockLoaded(packet.xPosition, packet.yPosition, packet.zPosition))
         {
-            TileEntity tileentity = world.getBlockTileEntity(packet.xPosition, packet.yPosition, packet.zPosition);
-            if (tileentity instanceof TileEntityMobSpawner)
+            BlockEntity tileentity = world.getBlockEntity(packet.xPosition, packet.yPosition, packet.zPosition);
+            if (tileentity instanceof MobSpawnerBlockEntity)
             {
-                TileEntityMobSpawner tileEntityMobSpawner = (TileEntityMobSpawner) tileentity;
+                MobSpawnerBlockEntity tileEntityMobSpawner = (MobSpawnerBlockEntity) tileentity;
                 tileEntityMobSpawner.setMobId(packet.spawnType);
 
-                tileEntityMobSpawner.onInventoryChanged();
+                tileEntityMobSpawner.setChanged();
                 world.markBlockNeedsUpdate(packet.xPosition, packet.yPosition, packet.zPosition);
             }
         }
     }
 
     @Override
-    public void handleFlying(Packet10Flying packet)
+    public void handleFlying(MovePlayerPacket packet)
     {
         if (!playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
@@ -163,8 +142,8 @@ public class NetServerHandler extends NetHandler
         field_22003_h = true;
         if (!hasMoved)
         {
-            double d = packet.yPosition - lastPosY;
-            if (packet.xPosition == lastPosX && d * d < 0.01D && packet.zPosition == lastPosZ)
+            double d = packet.y - lastPosY;
+            if (packet.x == lastPosX && d * d < 0.01D && packet.z == lastPosZ)
             {
                 hasMoved = true;
             }
@@ -181,15 +160,15 @@ public class NetServerHandler extends NetHandler
                 double d6 = playerEntity.z;
                 double d8 = 0.0D;
                 double d9 = 0.0D;
-                if (packet.rotating)
+                if (packet.hasRotation)
                 {
                     f = packet.yaw;
                     f1 = packet.pitch;
                 }
-                if (packet.moving && packet.yPosition == -999D && packet.stance == -999D)
+                if (packet.hasPosition && packet.y == -999D && packet.yView == -999D)
                 {
-                    d8 = packet.xPosition;
-                    d9 = packet.zPosition;
+                    d8 = packet.x;
+                    d9 = packet.z;
                 }
                 playerEntity.onGround = packet.onGround;
                 playerEntity.onUpdateEntity();
@@ -228,19 +207,19 @@ public class NetServerHandler extends NetHandler
             double newPosZ = playerEntity.z;
             float f2 = playerEntity.yRot;
             float f3 = playerEntity.xRot;
-            if (packet.moving && packet.yPosition == -999D && packet.stance == -999D)
+            if (packet.hasPosition && packet.y == -999D && packet.yView == -999D)
             {
-                packet.moving = false;
+                packet.hasPosition = false;
             }
-            if (packet.moving && packet.yPosition == -999D && packet.stance == -999D)
+            if (packet.hasPosition && packet.y == -999D && packet.yView == -999D)
             {
-                packet.moving = false;
+                packet.hasPosition = false;
             }
-            if (packet.moving)
+            if (packet.hasPosition)
             {
-                newPosX = packet.xPosition;
-                newPosY = packet.yPosition;
-                newPosZ = packet.zPosition;
+                newPosX = packet.x;
+                newPosY = packet.y;
+                newPosZ = packet.z;
                 // I don't see why the server really needs to care about stance
 //                double d10 = packet.stance - packet.yPosition;
 //                if (!playerEntity.isPlayerSleeping() && (d10 > 1.65D || d10 < 0.1D))
@@ -249,7 +228,7 @@ public class NetServerHandler extends NetHandler
 //                    return;
 //                }
                 // Lag back the player if they attempt to move to an illegal position
-                if (java.lang.Math.abs(packet.xPosition) > 32000000D || java.lang.Math.abs(packet.zPosition) > 32000000D)
+                if (java.lang.Math.abs(packet.x) > 32000000D || java.lang.Math.abs(packet.z) > 32000000D)
                 {
 //                    kickPlayer("Illegal position");
                     logger.warn((new StringBuilder()).append(playerEntity.username).append(" tried to move to an illegal position").toString());
@@ -257,7 +236,7 @@ public class NetServerHandler extends NetHandler
                     return;
                 }
             }
-            if (packet.rotating)
+            if (packet.hasRotation)
             {
                 f2 = packet.yaw;
                 f3 = packet.pitch;
@@ -307,7 +286,7 @@ public class NetServerHandler extends NetHandler
                 teleportAndRotate(lastPosX, lastPosY, lastPosZ, f2, f3);
                 return;
             }
-            AABB axisalignedbb = playerEntity.bb.copy().expand(f4, f4, f4).addCoord(0.0D, -0.55D, 0.0D);
+            AABB axisalignedbb = playerEntity.bb.copy().grow(f4, f4, f4).expand(0.0D, -0.55D, 0.0D);
             if (!playerEntity.getGamemode().canPlayerFly() && !mcServer.allowFlight && !worldserver.getIsAnySolidGround(axisalignedbb))
             {
                 if (dy > -0.03125D)
@@ -340,7 +319,7 @@ public class NetServerHandler extends NetHandler
 		lastPosY = y;
 		lastPosZ = z;
 		playerEntity.absMoveTo(x, y, z, playerEntity.yRot, playerEntity.xRot);
-		playerEntity.playerNetServerHandler.sendPacket(new Packet11PlayerPosition(x, y + 1.625, y, z, false));
+		playerEntity.playerNetServerHandler.sendPacket(new MovePlayerPacket.Pos(x, y + 1.625, y, z, false));
 	}
 
 	public void teleportAndRotate(double x, double y, double z, float yaw, float pitch) {
@@ -349,11 +328,11 @@ public class NetServerHandler extends NetHandler
 		lastPosY = y;
 		lastPosZ = z;
 		playerEntity.absMoveTo(x, y, z, yaw, pitch);
-		playerEntity.playerNetServerHandler.sendPacket(new Packet13PlayerLookMove(x, y + 1.625, y, z, yaw, pitch, false));
+		playerEntity.playerNetServerHandler.sendPacket(new MovePlayerPacket.PosRot(x, y + 1.625, y, z, yaw, pitch, false));
 	}
 
     @Override
-    public void handleBlockDig(Packet14BlockDig packet) {
+    public void handleBlockDig(PlayerActionPacket packet) {
         final int x = packet.xPosition;
         final int y = packet.yPosition;
         final int z = packet.zPosition;
@@ -390,7 +369,7 @@ public class NetServerHandler extends NetHandler
         int spawnDistZ = (int) MathHelper.abs(z - spawnPos.z);
         int distanceFromSpawn = Math.max(spawnDistX, spawnDistZ);
         if(distanceFromSpawn <= mcServer.spawnProtectionRange && !ignoreSpawnProtection) {
-            playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, world));
+            playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, world));
             world.field_819_z = false;
             return;
         }
@@ -405,7 +384,7 @@ public class NetServerHandler extends NetHandler
         } else if(packet.status == 2) {
             // Block Destroy
             if(!playerEntity.playerController.destroyBlock(x, y, z, packet.side)) {
-                playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, world));
+                playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, world));
             }
         }
         world.field_819_z = false;
@@ -413,14 +392,14 @@ public class NetServerHandler extends NetHandler
 
     public void handleSendInitialPlayerList()
     {
-        for (EntityPlayerMP entityPlayerMP : mcServer.playerList.playerEntities)
+        for (ServerPlayer entityPlayerServer : mcServer.playerList.playerEntities)
         {
-            sendPacket(new Packet72UpdatePlayerProfile(entityPlayerMP.username, entityPlayerMP.nickname, entityPlayerMP.score, entityPlayerMP.chatColor, true, entityPlayerMP.isOperator()));
+            sendPacket(new UpdatePlayerProfilePacket(entityPlayerServer.username, entityPlayerServer.nickname, entityPlayerServer.score, entityPlayerServer.chatColor, true, entityPlayerServer.isOperator()));
         }
     }
 
     @Override
-    public void handlePlace(Packet15Place packet)
+    public void handlePlace(UseItemPacket packet)
     {
         if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
@@ -453,11 +432,11 @@ public class NetServerHandler extends NetHandler
             {
                 playerEntity.playerController.activateBlockOrUseItem(playerEntity, worldserver, itemstack, x, y, z, direction.getSide(), xPlaced, yPlaced);
             }
-            playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, worldserver));
+            playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, worldserver));
             x += direction.getOffsetX();
             y += direction.getOffsetY();
             z += direction.getOffsetZ();
-            playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, worldserver));
+            playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, worldserver));
         }
         itemstack = playerEntity.inventory.getCurrentItem();
         if (itemstack != null && itemstack.stackSize <= 0)
@@ -466,12 +445,12 @@ public class NetServerHandler extends NetHandler
         }
         playerEntity.isChangingQuantityOnly = true;
         playerEntity.inventory.mainInventory[playerEntity.inventory.currentItem] = ItemStack.copyItemStack(playerEntity.inventory.mainInventory[playerEntity.inventory.currentItem]);
-        Slot slot = playerEntity.craftingInventory.func_20127_a(playerEntity.inventory, playerEntity.inventory.currentItem);
-        playerEntity.craftingInventory.updateInventory();
+        Slot slot = playerEntity.craftingInventory.getSlotFor(playerEntity.inventory, playerEntity.inventory.currentItem);
+        playerEntity.craftingInventory.broadcastChanges();
         playerEntity.isChangingQuantityOnly = false;
         if (!ItemStack.areItemStacksEqual(playerEntity.inventory.getCurrentItem(), packet.itemStack))
         {
-            sendPacket(new Packet103SetSlot(playerEntity.craftingInventory.windowId, slot.id, playerEntity.inventory.getCurrentItem()));
+            sendPacket(new ContainerSetSlotPacket(playerEntity.craftingInventory.containerId, slot.index, playerEntity.inventory.getCurrentItem()));
         }
         worldserver.field_819_z = false;
     }
@@ -480,8 +459,8 @@ public class NetServerHandler extends NetHandler
     public void handleErrorMessage(String s, Object[] aobj)
     {
         logger.info(playerEntity.username + " lost connection: " + s);
-        mcServer.playerList.sendPacketToAllPlayers(new Packet3Chat(playerEntity.getDisplayName() + TextFormatting.YELLOW + " left the game."));
-        mcServer.playerList.sendPacketToAllPlayers(new Packet72UpdatePlayerProfile(playerEntity.username, playerEntity.nickname, playerEntity.score, playerEntity.chatColor, false, playerEntity.isOperator()));
+        mcServer.playerList.sendPacketToAllPlayers(new ChatPacket(playerEntity.getDisplayName() + TextFormatting.YELLOW + " left the game."));
+        mcServer.playerList.sendPacketToAllPlayers(new UpdatePlayerProfilePacket(playerEntity.username, playerEntity.nickname, playerEntity.score, playerEntity.chatColor, false, playerEntity.isOperator()));
         mcServer.playerList.playerLoggedOut(playerEntity);
         connectionClosed = true;
         if (MinecraftServer.statsStatus)
@@ -505,9 +484,9 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleBlockItemSwitch(Packet16BlockItemSwitch packet)
+    public void handleBlockItemSwitch(SetCarriedItemPacket packet)
     {
-        if (packet.id < 0 || packet.id > InventoryPlayer.func_25054_e())
+        if (packet.id < 0 || packet.id > Inventory.func_25054_e())
         {
             logger.warn(playerEntity.username + " tried to set an invalid carried item");
             return;
@@ -520,13 +499,13 @@ public class NetServerHandler extends NetHandler
     }
 
 	@Override
-	public void handleChat(Packet3Chat packet) {
+	public void handleChat(ChatPacket packet) {
 		String message;
 		if(packet.encrypted) {
 			try {
 				message = AES.decrypt(packet.message, AES.keyChain.get(playerEntity.username));
 			}catch (Exception e) {
-				throw new RuntimeException(Packet3Chat.ENCRYPTION_ERROR_MESSAGE, e);
+				throw new RuntimeException(ChatPacket.ENCRYPTION_ERROR_MESSAGE, e);
 			}
 		}else {
 			message = packet.message;
@@ -542,7 +521,7 @@ public class NetServerHandler extends NetHandler
 		for(int i = 0; i < message.length(); i++) {
 			char c = message.charAt(i);
 			if(ChatAllowedCharacters.ALLOWED_CHARACTERS.indexOf(c) < 0) {
-				sendPacket(new Packet3Chat(String.valueOf(TextFormatting.GRAY) + TextFormatting.ITALIC + "[SERVER] Illegal characters in chat message."));
+				sendPacket(new ChatPacket(String.valueOf(TextFormatting.GRAY) + TextFormatting.ITALIC + "[SERVER] Illegal characters in chat message."));
 				return;
 			}
 		}
@@ -598,40 +577,11 @@ public class NetServerHandler extends NetHandler
                 return;
             }
         }
-        if (s.toLowerCase().startsWith("/kill"))
-        {
-            playerEntity.hurt(null, 1000, null);
-        }
-        else if (s.equalsIgnoreCase("/online"))
-        {
-            StringBuilder playerList = new StringBuilder();
-            for (int i = 0; i < mcServer.playerList.playerEntities.size(); i++)
-            {
-                if (i > 0)
-                {
-                    playerList.append(",");
-                }
-                EntityPlayerMP entityplayermp = mcServer.playerList.playerEntities.get(i);
-                playerList.append(entityplayermp.getDisplayName()).append(": ").append(TextFormatting.YELLOW).append(entityplayermp.score).append("pts").append(TextFormatting.WHITE);
-            }
-            logger.info(s);
-            sendPacket(new Packet3Chat(playerList.toString()));
-        }
-        else if (mcServer.playerList.isOp(playerEntity.username))
-        {
-            String s1 = s.substring(1);
-            logger.info(playerEntity.username + " issued server command: " + s1);
-            mcServer.addCommand(s1, this);
-        }
-        else
-        {
-            String s2 = s.substring(1);
-            logger.info(playerEntity.username + " tried command: " + s2);
-        }
+        sender.sendMessage(TextFormatting.RED + "Command '" + args[0] + "' does not exist!");
     }
 
     @Override
-    public void handleAnimation(Packet18Animation packet)
+    public void handleAnimation(AnimatePacket packet)
     {
         if (!playerEntity.isAlive()) return;
         if (packet.animate == 1)
@@ -641,7 +591,7 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleEntityAction(Packet19EntityAction packet)
+    public void handleEntityAction(PlayerCommandPacket packet)
     {
         if (!playerEntity.isAlive()) return;
         if (packet.state == 1)
@@ -659,19 +609,19 @@ public class NetServerHandler extends NetHandler
         }
     }
     @Override
-    public void handleBoatControl(Packet26BoatControl packet26BoatControl)
+    public void handleBoatControl(BoatControlPacket boatControlPacket)
     {
         if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
-        if (playerEntity.vehicle != null && playerEntity.vehicle instanceof EntityBoat){
-            EntityBoat boat = (EntityBoat) playerEntity.vehicle;
-            boat.handleControlDirect(packet26BoatControl.targetXD, packet26BoatControl.targetZD, packet26BoatControl.targetYRot);
-            packet26BoatControl.entityId = boat.id;
-            mcServer.playerList.sendPacketToOtherPlayersAroundPoint(playerEntity,boat.x, boat.y, boat.z, 128, boat.world.dimension.id, packet26BoatControl);
+        if (playerEntity.vehicle != null && playerEntity.vehicle instanceof BoatEntity){
+            BoatEntity boat = (BoatEntity) playerEntity.vehicle;
+            boat.handleControlDirect(boatControlPacket.targetXD, boatControlPacket.targetZD, boatControlPacket.targetYRot);
+            boatControlPacket.entityId = boat.id;
+            mcServer.playerList.sendPacketToOtherPlayersAroundPoint(playerEntity,boat.x, boat.y, boat.z, 128, boat.world.dimension.id, boatControlPacket);
         }
     }
 
     @Override
-    public void handleKickDisconnect(Packet255KickDisconnect packet)
+    public void handleKickDisconnect(DisconnectPacket packet)
     {
         netManager.networkShutdown("disconnect.quitting", new Object[0]);
     }
@@ -684,7 +634,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void log(String s)
     {
-        sendPacket(new Packet3Chat("\2477" + s));
+        sendPacket(new ChatPacket("\2477" + s));
     }
 
     @Override
@@ -694,44 +644,44 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleUseEntity(Packet7UseEntity packet)
+    public void handleUseEntity(InteractPacket packet)
     {
         if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
-        Entity targetEntity = worldserver.getEntityFromId(packet.targetEntity);
+        Entity targetEntity = worldserver.getEntityFromId(packet.targetEntityID);
         if (targetEntity != null && playerEntity.distanceToSqr(targetEntity) < 36D)
         {
             boolean canAttack = playerEntity.canEntityBeSeen(targetEntity);
 
             if (!canAttack)
             {
-                float f1 = MathHelper.cos(-playerEntity.yRot * 0.01745329F - 3.141593F);
-                float f2 = MathHelper.sin(-playerEntity.yRot * 0.01745329F - 3.141593F);
+                float f1 = MathHelper.cos(-playerEntity.yRot * 0.01745329F - MathHelper.PI);
+                float f2 = MathHelper.sin(-playerEntity.yRot * 0.01745329F - MathHelper.PI);
                 float f3 = -MathHelper.cos(-playerEntity.xRot * 0.01745329F);
                 float f4 = MathHelper.sin(-playerEntity.xRot * 0.01745329F);
 
-                Vec3d viewVector = Vec3d.createVector(f2 * f3, f4, f1 * f3);
+                Vec3 viewVector = Vec3.getTempVec3(f2 * f3, f4, f1 * f3);
 
-                viewVector.xCoord *= 8;
-                viewVector.yCoord *= 8;
-                viewVector.zCoord *= 8;
-                viewVector.xCoord += playerEntity.x;
-                viewVector.yCoord += playerEntity.y;
-                viewVector.zCoord += playerEntity.z;
+                viewVector.x *= 8;
+                viewVector.y *= 8;
+                viewVector.z *= 8;
+                viewVector.x += playerEntity.x;
+                viewVector.y += playerEntity.y;
+                viewVector.z += playerEntity.z;
 
-                Vec3d playerViewPos = Vec3d.createVector(playerEntity.x, playerEntity.y + playerEntity.getHeadHeight(), playerEntity.z);
+                Vec3 playerViewPos = Vec3.getTempVec3(playerEntity.x, playerEntity.y + playerEntity.getHeadHeight(), playerEntity.z);
 
-                HitResult movingObjectPosition = targetEntity.bb.func_1169_a(playerViewPos, viewVector);
+                HitResult movingObjectPosition = targetEntity.bb.clip(playerViewPos, viewVector);
 
                 canAttack = movingObjectPosition != null && worldserver.checkBlockCollisionBetweenPoints(playerViewPos, movingObjectPosition.location) == null;
             }
             if (canAttack)
             {
-                if (packet.isLeftClick == 0)
+                if (packet.action == InteractPacket.ACTION_INTERACT)
                 {
                     playerEntity.useCurrentItemOnEntity(targetEntity);
                 }
-                else if (packet.isLeftClick == 1)
+                else if (packet.action == InteractPacket.ACTION_ATTACK)
                 {
                     playerEntity.attackTargetEntityWithCurrentItem(targetEntity);
                 }
@@ -740,13 +690,13 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleOpenGuidebook(Packet133OpenGuidebook packet)
+    public void handleOpenGuidebook(GuidebookPacket packet)
     {
         playerEntity.displayGUIGuidebook();
     }
 
     @Override
-    public void handleRespawn(Packet9Respawn packet)
+    public void handleRespawn(RespawnPacket packet)
     {
         if (playerEntity.getHealth() <= 0) {
             playerEntity = mcServer.playerList.recreatePlayerEntity(playerEntity, 0);
@@ -754,34 +704,34 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleCloseWindow(Packet101CloseWindow packet)
+    public void handleCloseWindow(ContainerClosePacket packet)
     {
         playerEntity.closeCraftingGui();
     }
 
     @Override
-    public void handleWindowClick(Packet102WindowClick packet)
+    public void handleWindowClick(ContainerClickPacket packet)
     {
-        if (playerEntity.craftingInventory.windowId == packet.window_Id && playerEntity.craftingInventory.getCanCraft(playerEntity))
+        if (playerEntity.craftingInventory.containerId == packet.window_Id && playerEntity.craftingInventory.isSynched(playerEntity))
         {
-            ItemStack itemstack = playerEntity.craftingInventory.clickInventorySlot(packet.action, packet.args, playerEntity);
+            ItemStack itemstack = playerEntity.craftingInventory.clicked(packet.action, packet.args, playerEntity);
             if (ItemStack.areItemStacksEqual(packet.itemStack, itemstack))
             {
-                playerEntity.playerNetServerHandler.sendPacket(new Packet106Transaction(packet.window_Id, packet.actionId, true));
+                playerEntity.playerNetServerHandler.sendPacket(new ContainerAckPacket(packet.window_Id, packet.actionId, true));
                 playerEntity.isChangingQuantityOnly = true;
-                playerEntity.craftingInventory.updateInventory();
+                playerEntity.craftingInventory.broadcastChanges();
                 playerEntity.updateHeldItem();
                 playerEntity.isChangingQuantityOnly = false;
             }
             else
             {
-                field_10_k.put(Integer.valueOf(playerEntity.craftingInventory.windowId), Short.valueOf(packet.actionId));
-                playerEntity.playerNetServerHandler.sendPacket(new Packet106Transaction(packet.window_Id, packet.actionId, false));
-                playerEntity.craftingInventory.setCanCraft(playerEntity, false);
+                field_10_k.put(Integer.valueOf(playerEntity.craftingInventory.containerId), Short.valueOf(packet.actionId));
+                playerEntity.playerNetServerHandler.sendPacket(new ContainerAckPacket(packet.window_Id, packet.actionId, false));
+                playerEntity.craftingInventory.setSynched(playerEntity, false);
                 ArrayList<ItemStack> arraylist = new ArrayList<>();
-                for (int i = 0; i < playerEntity.craftingInventory.inventorySlots.size(); i++)
+                for (int i = 0; i < playerEntity.craftingInventory.slots.size(); i++)
                 {
-                    arraylist.add(playerEntity.craftingInventory.inventorySlots.get(i).getStack());
+                    arraylist.add(playerEntity.craftingInventory.slots.get(i).getItem());
                 }
 
                 playerEntity.updateCraftingInventory(playerEntity.craftingInventory, arraylist);
@@ -790,27 +740,27 @@ public class NetServerHandler extends NetHandler
     }
 
     @Override
-    public void handleTransaction(Packet106Transaction packet)
+    public void handleTransaction(ContainerAckPacket packet)
     {
-        Short short1 = (Short) field_10_k.get(Integer.valueOf(playerEntity.craftingInventory.windowId));
-        if (short1 != null && packet.shortWindowId == short1.shortValue() && playerEntity.craftingInventory.windowId == packet.windowId && !playerEntity.craftingInventory.getCanCraft(playerEntity))
+        Short short1 = (Short) field_10_k.get(Integer.valueOf(playerEntity.craftingInventory.containerId));
+        if (short1 != null && packet.shortWindowId == short1.shortValue() && playerEntity.craftingInventory.containerId == packet.windowId && !playerEntity.craftingInventory.isSynched(playerEntity))
         {
-            playerEntity.craftingInventory.setCanCraft(playerEntity, true);
+            playerEntity.craftingInventory.setSynched(playerEntity, true);
         }
     }
 
     @Override
-    public void handleUpdateSign(Packet130UpdateSign packet)
+    public void handleUpdateSign(SignUpdatePacket packet)
     {
         if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         if (worldserver.isBlockLoaded(packet.xPosition, packet.yPosition, packet.zPosition))
         {
-            TileEntity tileentity = worldserver.getBlockTileEntity(packet.xPosition, packet.yPosition, packet.zPosition);
-            if (tileentity instanceof TileEntitySign)
+            BlockEntity tileentity = worldserver.getBlockEntity(packet.xPosition, packet.yPosition, packet.zPosition);
+            if (tileentity instanceof SignBlockEntity)
             {
-                TileEntitySign tileentitysign = (TileEntitySign) tileentity;
-                if (!tileentitysign.getIsEditable(playerEntity))
+                SignBlockEntity tileentitysign = (SignBlockEntity) tileentity;
+                if (!tileentitysign.isEditableBy(playerEntity))
                 {
                     mcServer.logWarning("Player " + playerEntity.username + " just tried to change non-editable sign");
                     return;
@@ -841,12 +791,12 @@ public class NetServerHandler extends NetHandler
                 }
             }
 
-            if (tileentity instanceof TileEntitySign)
+            if (tileentity instanceof SignBlockEntity)
             {
                 int x = packet.xPosition;
                 int y = packet.yPosition;
                 int z = packet.zPosition;
-                TileEntitySign tileEntity = (TileEntitySign) tileentity;
+                SignBlockEntity tileEntity = (SignBlockEntity) tileentity;
                 for (int j1 = 0; j1 < 4; j1++)
                 {
                     tileEntity.signText[j1] = packet.signLines[j1];
@@ -855,43 +805,43 @@ public class NetServerHandler extends NetHandler
                 tileEntity.setColor(TextFormatting.FORMATTINGS[packet.color]);
                 tileEntity.setPicture(EnumSignPicture.values()[packet.picture]);
 
-                tileEntity.onInventoryChanged();
+                tileEntity.setChanged();
                 worldserver.markBlockNeedsUpdate(x, y, z);
             }
         }
     }
 
     @Override
-    public void handleUpdateCreativeInventory(Packet107UpdateCreativeInventory packet)
+    public void handleUpdateCreativeInventory(UpdateCreativeInventoryPacket packet)
     {
-        if (playerEntity.craftingInventory.windowId == packet.windowId && playerEntity.craftingInventory instanceof ContainerPlayerCreative)
+        if (playerEntity.craftingInventory.containerId == packet.windowId && playerEntity.craftingInventory instanceof CreativeInventoryMenu)
         {
-            ((ContainerPlayerCreative) playerEntity.craftingInventory).setInventoryStatus(packet.page, packet.searchText);
+            ((CreativeInventoryMenu) playerEntity.craftingInventory).setInventoryStatus(packet.page, packet.searchText);
         }
     }
 
     @Override
-    public void handleSetHotbarOffset(Packet108SetHotbarOffset packet)
+    public void handleSetHotbarOffset(SetHotbarOffsetPacket packet)
     {
         playerEntity.inventory.hotbarOffset = packet.hotbarOffset;
     }
     
     @Override
-    public void handleItemName(Packet137SetItemName packet)
+    public void handleItemName(SetItemNamePacket packet)
     {
         String name = packet.name;
         if (name.length() > 16) name = packet.name.substring(0, 16);
-        playerEntity.inventory.getStackInSlot(packet.slot).setCustomName(name);
+        playerEntity.inventory.getItem(packet.slot).setCustomName(name);
     }
 
     @Override
-    public void handleSetPaintingMotive(Packet139SetPaintingMotive packet)
+    public void handleSetPaintingMotive(SetPaintingArtPacket packet)
     {
         playerEntity.setSelectedArt(ArtType.values.get(packet.motive));
     }
     
     @Override
-    public void handleCustomPayload(Packet250CustomPayload packet) {
+    public void handleCustomPayload(CustomPayloadPacket packet) {
     	if("BTA|RotationLock".equals(packet.channel)) {
     		if(packet.data.length == 4) {
         		playerEntity.rotationLock = Direction.getDirectionById(packet.data[0]);
@@ -900,9 +850,9 @@ public class NetServerHandler extends NetHandler
         		playerEntity.placementModeOverride = PlacementMode.get(packet.data[3]);
     		}
     	}else if("BTA|Flag".equals(packet.channel)) {
-    		if(packet.data.length == 24 * 16 && playerEntity.craftingInventory instanceof ContainerFlag) {
-    			ContainerFlag containerFlag = (ContainerFlag) playerEntity.craftingInventory;
-    			TileEntityFlag tileEntity = containerFlag.tileEntity;
+    		if(packet.data.length == 24 * 16 && playerEntity.craftingInventory instanceof FlagMenu) {
+    			FlagMenu flagMenu = (FlagMenu) playerEntity.craftingInventory;
+    			FlagBlockEntity tileEntity = flagMenu.flag;
     			
     			if(tileEntity.owner == null || tileEntity.owner.isEmpty() || tileEntity.owner.equals(playerEntity.username)) {
         			tileEntity.owner = playerEntity.username;
@@ -917,7 +867,7 @@ public class NetServerHandler extends NetHandler
     			}
     		}
     	} else if ("BTA|WandMonster".equals(packet.channel)) {
-            if (playerEntity.getHeldItem() != null && playerEntity.getHeldItem().getItem() == Item.wandMonsterSpawner){
+            if (playerEntity.getHeldItem() != null && playerEntity.getHeldItem().getItem() == Items.WAND_MONSTER_SPAWNER){
                 String id = new String(packet.data, StandardCharsets.UTF_8);
                 playerEntity.getHeldItem().getData().putString("monster", id);
             }
@@ -935,7 +885,7 @@ public class NetServerHandler extends NetHandler
     public NetworkManager netManager;
     public boolean connectionClosed;
     private MinecraftServer mcServer;
-    private EntityPlayerMP playerEntity;
+    private ServerPlayer playerEntity;
     private int field_15_f;
     private int field_22004_g;
     private int playerInAirTime;
diff --git a/src/main/java/net/minecraft/server/net/thread/ThreadLoginVerifier.java b/src/main/java/net/minecraft/server/net/thread/ThreadLoginVerifier.java
index efa152a0f..19b67f889 100644
--- a/src/main/java/net/minecraft/server/net/thread/ThreadLoginVerifier.java
+++ b/src/main/java/net/minecraft/server/net/thread/ThreadLoginVerifier.java
@@ -1,7 +1,7 @@
 package net.minecraft.server.net.thread;
 
-import net.minecraft.server.net.handler.NetLoginHandler;
-import net.minecraft.core.net.packet.Packet1Login;
+import net.minecraft.core.net.packet.LoginPacket;
+import net.minecraft.server.net.handler.LoginPacketHandler;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
@@ -9,16 +9,16 @@ import java.net.URL;
 import java.net.URLEncoder;
 
 // Referenced classes of package net.minecraft.src:
-//            NetLoginHandler, Packet1Login
+//            LoginPacketHandler, LoginPacket
 
 public class ThreadLoginVerifier extends Thread
 {
 
-    public ThreadLoginVerifier(NetLoginHandler netloginhandler, Packet1Login packet1login)
+    public ThreadLoginVerifier(LoginPacketHandler netloginhandler, LoginPacket loginPacket)
     {
 //        super();
         loginHandler = netloginhandler;
-        loginPacket = packet1login;
+        this.loginPacket = loginPacket;
     }
 
     @Override
@@ -26,14 +26,14 @@ public class ThreadLoginVerifier extends Thread
     {
         try
         {
-            String s = NetLoginHandler.getServerId(loginHandler);
+            String s = LoginPacketHandler.getServerId(loginHandler);
             URL url = new URL((new StringBuilder()).append("http://session.minecraft.net/game/checkserver.jsp?user=").append(URLEncoder.encode(loginPacket.username, "UTF-8")).append("&serverId=").append(URLEncoder.encode(s, "UTF-8")).toString());
             BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream()));
             String s1 = bufferedreader.readLine();
             bufferedreader.close();
             if(s1.equals("YES"))
             {
-                NetLoginHandler.setLoginPacket(loginHandler, loginPacket);
+                LoginPacketHandler.setLoginPacket(loginHandler, loginPacket);
             } else
             {
                 loginHandler.kickUser("Failed to verify username!");
@@ -46,6 +46,6 @@ public class ThreadLoginVerifier extends Thread
         }
     }
 
-    final Packet1Login loginPacket; /* synthetic field */
-    final NetLoginHandler loginHandler; /* synthetic field */
+    final LoginPacket loginPacket; /* synthetic field */
+    final LoginPacketHandler loginHandler; /* synthetic field */
 }
diff --git a/src/main/java/net/minecraft/server/player/PlayerListBox.java b/src/main/java/net/minecraft/server/player/PlayerListBox.java
index d5b00603d..7253843ee 100644
--- a/src/main/java/net/minecraft/server/player/PlayerListBox.java
+++ b/src/main/java/net/minecraft/server/player/PlayerListBox.java
@@ -3,12 +3,12 @@ package net.minecraft.server.player;
 import java.util.Vector;
 import javax.swing.JList;
 
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.core.net.IUpdatePlayerListBox;
 
 // Referenced classes of package net.minecraft.src:
-//            IUpdatePlayerListBox, ServerConfigurationManager, EntityPlayerMP
+//            IUpdatePlayerListBox, ServerConfigurationManager, ServerPlayer
 
 public class PlayerListBox extends JList
     implements IUpdatePlayerListBox
@@ -29,7 +29,7 @@ public class PlayerListBox extends JList
             Vector vector = new Vector();
             for(int i = 0; i < mcServer.playerList.playerEntities.size(); i++)
             {
-                vector.add(((EntityPlayerMP)mcServer.playerList.playerEntities.get(i)).username);
+                vector.add(((ServerPlayer)mcServer.playerList.playerEntities.get(i)).username);
             }
 
             setListData(vector);
diff --git a/src/main/java/net/minecraft/server/player/PlayerManager.java b/src/main/java/net/minecraft/server/player/PlayerManager.java
index 8a25392c3..b4327f74d 100644
--- a/src/main/java/net/minecraft/server/player/PlayerManager.java
+++ b/src/main/java/net/minecraft/server/player/PlayerManager.java
@@ -4,18 +4,18 @@ import java.util.ArrayList;
 import java.util.List;
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.net.packet.*;
-import net.minecraft.core.player.PlayerHash;
+import net.minecraft.server.net.PlayerHash;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.chunk.ChunkCoordinate;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 import net.minecraft.server.world.WorldServer;
 import net.minecraft.server.MinecraftServer;
 
 public class PlayerManager
 {
-    public final List<EntityPlayerMP> players;
+    public final List<ServerPlayer> players;
     private final PlayerHash playerInstances;
     private final List<PlayerInstance> playerInstancesToUpdate;
     private final MinecraftServer server;
@@ -78,7 +78,7 @@ public class PlayerManager
         }
     }
 
-    public void addPlayer(EntityPlayerMP player)
+    public void addPlayer(ServerPlayer player)
     {
         int xChunk = (int)player.x >> 4;
         int zChunk = (int)player.z >> 4;
@@ -114,7 +114,7 @@ public class PlayerManager
         players.add(player);
     }
 
-    public void removePlayer(EntityPlayerMP entityplayermp)
+    public void removePlayer(ServerPlayer entityplayermp)
     {
         int i = (int)entityplayermp.field_9155_d >> 4;
         int j = (int)entityplayermp.field_9154_e >> 4;
@@ -145,7 +145,7 @@ public class PlayerManager
         return j1 >= -viewRadius && j1 <= viewRadius;
     }
 
-    public void func_543_c(EntityPlayerMP entityplayermp)
+    public void func_543_c(ServerPlayer entityplayermp)
     {
         int i = (int)entityplayermp.x >> 4;
         int j = (int)entityplayermp.z >> 4;
@@ -195,7 +195,7 @@ public class PlayerManager
     }
 
     class PlayerInstance {
-        private final List<EntityPlayerMP> players;
+        private final List<ServerPlayer> players;
         private final int chunkX;
         private final int chunkZ;
         private final ChunkCoordinate currentChunk;
@@ -218,18 +218,18 @@ public class PlayerManager
             server.getDimensionWorld(dimension).chunkProviderServer.prepareChunk(chunkX, chunkZ);
         }
 
-        public void addPlayer(EntityPlayerMP player) {
+        public void addPlayer(ServerPlayer player) {
             if (players.contains(player)) {
                 throw new IllegalStateException("Failed to add player. " + player + " already is in chunk " + chunkX + ", " + chunkZ);
             } else {
                 player.field_420_ah.add(currentChunk);
-                player.playerNetServerHandler.sendPacket(new Packet50PreChunk(currentChunk.x, currentChunk.z, true));
+                player.playerNetServerHandler.sendPacket(new ChunkVisibilityPacket(currentChunk.x, currentChunk.z, true));
                 players.add(player);
                 player.loadedChunks.add(currentChunk);
             }
         }
 
-        public void removePlayer(EntityPlayerMP player) {
+        public void removePlayer(ServerPlayer player) {
             if (!players.contains(player)) {
                 return;
             }
@@ -244,7 +244,7 @@ public class PlayerManager
             }
             player.loadedChunks.remove(currentChunk);
             if (player.field_420_ah.contains(currentChunk)) {
-                player.playerNetServerHandler.sendPacket(new Packet50PreChunk(chunkX, chunkZ, false));
+                player.playerNetServerHandler.sendPacket(new ChunkVisibilityPacket(chunkX, chunkZ, false));
             }
         }
 
@@ -287,7 +287,7 @@ public class PlayerManager
 
         public void sendPacketToPlayersInInstance(Packet packet) {
             for (int i = 0; i < players.size(); i++) {
-                EntityPlayerMP entityplayermp = (EntityPlayerMP) players.get(i);
+                ServerPlayer entityplayermp = (ServerPlayer) players.get(i);
                 if (entityplayermp.field_420_ah.contains(currentChunk)) {
                     entityplayermp.playerNetServerHandler.sendPacket(packet);
                 }
@@ -304,9 +304,9 @@ public class PlayerManager
                 int x = chunkX * Chunk.CHUNK_SIZE_X + minX;
                 int y = minY;
                 int z = chunkZ * Chunk.CHUNK_SIZE_Z + minZ;
-                sendPacketToPlayersInInstance(new Packet53BlockChange(x, y, z, world));
+                sendPacketToPlayersInInstance(new BlockUpdatePacket(x, y, z, world));
                 if (Block.isEntityTile[world.getBlockId(x, y, z)]) {
-                    updateTileEntity(world.getBlockTileEntity(x, y, z));
+                    updateTileEntity(world.getBlockEntity(x, y, z));
                 }
             }
             else if(numBlocksToUpdate >= 10)
@@ -328,16 +328,16 @@ public class PlayerManager
     //	            ySize = world.getHeightBlocks();
     //	            zSize = 16;
     //            }
-                sendPacketToPlayersInInstance(new Packet51MapChunk(minWorldX, minWorldY, minWorldZ, xSize, ySize, zSize, world));
-                List<TileEntity> list = world.getTileEntityList(minWorldX, minWorldY, minWorldZ, minWorldX + xSize, minWorldY + ySize, minWorldZ + zSize);
+                sendPacketToPlayersInInstance(new BlockRegionUpdatePacket(minWorldX, minWorldY, minWorldZ, xSize, ySize, zSize, world));
+                List<BlockEntity> list = world.getTileEntityList(minWorldX, minWorldY, minWorldZ, minWorldX + xSize, minWorldY + ySize, minWorldZ + zSize);
                 for(int j3 = 0; j3 < list.size(); j3++)
                 {
-                    updateTileEntity((TileEntity)list.get(j3));
+                    updateTileEntity((BlockEntity)list.get(j3));
                 }
 
             } else
             {
-                sendPacketToPlayersInInstance(new Packet52MultiBlockChange(chunkX, chunkZ, blocksToUpdate, numBlocksToUpdate, world));
+                sendPacketToPlayersInInstance(new ChunkBlocksUpdatePacket(chunkX, chunkZ, blocksToUpdate, numBlocksToUpdate, world));
                 for(int k = 0; k < numBlocksToUpdate; k++)
                 {
                     int x = chunkX * 16 + (blocksToUpdate[k] >> 0 & 0x0F);
@@ -345,7 +345,7 @@ public class PlayerManager
                     int z = chunkZ * 16 + (blocksToUpdate[k] >> 4 & 0x0F);
                     if(Block.isEntityTile[world.getBlockId(x, y, z)])
                     {
-                        updateTileEntity(world.getBlockTileEntity(x, y, z));
+                        updateTileEntity(world.getBlockEntity(x, y, z));
                     }
                 }
 
@@ -353,7 +353,7 @@ public class PlayerManager
             numBlocksToUpdate = 0;
         }
 
-        private void updateTileEntity(TileEntity tileentity) {
+        private void updateTileEntity(BlockEntity tileentity) {
             if (tileentity != null) {
                 Packet packet = tileentity.getDescriptionPacket();
                 if (packet != null) {
diff --git a/src/main/java/net/minecraft/server/util/helper/PlayerList.java b/src/main/java/net/minecraft/server/util/helper/PlayerList.java
index ccefcad63..72d8d9283 100644
--- a/src/main/java/net/minecraft/server/util/helper/PlayerList.java
+++ b/src/main/java/net/minecraft/server/util/helper/PlayerList.java
@@ -1,8 +1,8 @@
 package net.minecraft.server.util.helper;
 
-import net.minecraft.core.net.packet.Packet138PlayerList;
+import net.minecraft.core.net.packet.PlayerListPacket;
 import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 public class PlayerList {
 	
@@ -15,12 +15,12 @@ public class PlayerList {
 		String[] scores = new String[playerCount];
     	
     	for(int i=0; i < playerCount; i++) {
-    		EntityPlayerMP player = server.playerList.playerEntities.get(i);
+    		ServerPlayer player = server.playerList.playerEntities.get(i);
     		
     		players[i] = player.getDisplayName();
     		scores[i] = String.valueOf(player.getScore());
     	}
         
-        server.playerList.sendPacketToAllPlayers(new Packet138PlayerList(playerCount, players, scores));
+        server.playerList.sendPacketToAllPlayers(new PlayerListPacket(playerCount, players, scores));
     }
 }
diff --git a/src/main/java/net/minecraft/server/world/ServerPlayerController.java b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
index fba54f23b..56ee1b149 100644
--- a/src/main/java/net/minecraft/server/world/ServerPlayerController.java
+++ b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
@@ -4,18 +4,18 @@ package net.minecraft.server.world;
 import net.minecraft.core.block.Block;
 
 // Referenced classes of package net.minecraft.src:
-//            WorldServer, Block, EntityPlayer, ItemStack, 
-//            EntityPlayerMP, Packet53BlockChange, NetServerHandler, InventoryPlayer, 
+//            WorldServer, Block, Player, ItemStack,
+//            ServerPlayer, BlockUpdatePacket, ServerPacketHandler, InventoryPlayer,
 //            World
 
-import net.minecraft.core.block.entity.TileEntity;
-import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.net.packet.Packet53BlockChange;
+import net.minecraft.core.net.packet.BlockUpdatePacket;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
-import net.minecraft.server.entity.player.EntityPlayerMP;
+import net.minecraft.server.entity.player.ServerPlayer;
 
 public class ServerPlayerController
 {
@@ -120,7 +120,7 @@ public class ServerPlayerController
     		}
     	}
         Block block = Block.getBlock(id);
-        TileEntity tileEntity = thisWorld.getBlockTileEntity(x, y, z);
+        BlockEntity blockEntity = thisWorld.getBlockEntity(x, y, z);
         thisWorld.playSoundEffect(player, 2001, x, y, z, id);
         boolean flag = removeBlock(x, y, z);
         if(flag) {
@@ -130,8 +130,8 @@ public class ServerPlayerController
         }
         if(flag && player.canHarvestBlock(Block.blocksList[id]) && player.getGamemode().dropBlockOnBreak())
         {
-            Block.blocksList[id].harvestBlock(thisWorld, player, x, y, z, meta, tileEntity);
-            ((EntityPlayerMP) player).playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, thisWorld));
+            Block.blocksList[id].harvestBlock(thisWorld, player, x, y, z, meta, blockEntity);
+            ((ServerPlayer) player).playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, thisWorld));
         }
         ItemStack itemstack = player.getCurrentEquippedItem();
         if(itemstack != null)
@@ -145,7 +145,7 @@ public class ServerPlayerController
         return flag;
     }
 
-    public boolean func_6154_a(EntityPlayer entityplayer, World world, ItemStack itemstack)
+    public boolean func_6154_a(Player entityplayer, World world, ItemStack itemstack)
     {
         if (!entityplayer.getGamemode().canInteract()) return false;
         int i = itemstack.stackSize;
@@ -164,7 +164,7 @@ public class ServerPlayerController
         }
     }
 
-    public boolean activateBlockOrUseItem(EntityPlayer entityplayer, World world, ItemStack itemstack, int i, int j, int k, Side side, double xPlaced, double yPlaced)
+    public boolean activateBlockOrUseItem(Player entityplayer, World world, ItemStack itemstack, int i, int j, int k, Side side, double xPlaced, double yPlaced)
     {
         if (!entityplayer.getGamemode().canInteract()) return false;
         int i1 = world.getBlockId(i, j, k);
@@ -186,7 +186,7 @@ public class ServerPlayerController
     }
 
     private WorldServer thisWorld;
-    public EntityPlayer player;
+    public Player player;
     private int blockHitTicks;
     private int currentlyMiningX;
     private int currentlyMiningY;
diff --git a/src/main/java/net/minecraft/server/world/WorldManager.java b/src/main/java/net/minecraft/server/world/WorldManager.java
index 5cdcf0983..62e3d8f79 100644
--- a/src/main/java/net/minecraft/server/world/WorldManager.java
+++ b/src/main/java/net/minecraft/server/world/WorldManager.java
@@ -3,12 +3,12 @@ package net.minecraft.server.world;
 import java.util.HashSet;
 import java.util.Set;
 
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.net.packet.Packet61PlaySoundEffect;
-import net.minecraft.core.net.packet.Packet62PlaySoundDirect;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.net.packet.PlaySoundEffectPacket;
+import net.minecraft.core.net.packet.PlaySoundEffectDirectPacket;
 import net.minecraft.core.sound.SoundTypes;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.world.LevelListener;
@@ -16,8 +16,8 @@ import net.minecraft.server.MinecraftServer;
 
 // Referenced classes of package net.minecraft.src:
 //            IWorldAccess, WorldServer, WorldProvider, EntityTracker, 
-//            ServerConfigurationManager, Packet61DoorChange, Entity, TileEntity, 
-//            EntityPlayer
+//            ServerConfigurationManager, Packet61DoorChange, Entity, BlockEntity,
+//            Player
 
 public class WorldManager
     implements LevelListener
@@ -50,9 +50,9 @@ public class WorldManager
 	public void entityAdded(Entity entity)
     {
     	// Fix crash
-    	if(entity instanceof EntityItem) {
-    		EntityItem entityItem = (EntityItem) entity;
-    		if(entityItem.item == null || entityItem.item.getItem() == null) {
+    	if(entity instanceof ItemEntity) {
+    		ItemEntity itemEntity = (ItemEntity) entity;
+    		if(itemEntity.item == null || itemEntity.item.getItem() == null) {
     			return;
     		}
     	}
@@ -80,14 +80,14 @@ public class WorldManager
 			}
 			return;
 		}
-		Packet62PlaySoundDirect packet = new Packet62PlaySoundDirect(soundId, soundType, x, y, z, volume, pitch);
+		PlaySoundEffectDirectPacket packet = new PlaySoundEffectDirectPacket(soundId, soundType, x, y, z, volume, pitch);
 		float range = 16.0f;
 		if(volume > 1.0f) {
 			range *= volume;
 		}
-		EntityPlayer entityPlayer = null;
-		if(player instanceof EntityPlayer) {
-			entityPlayer = (EntityPlayer) player;
+		Player entityPlayer = null;
+		if(player instanceof Player) {
+			entityPlayer = (Player) player;
 		}
 		mcServer.playerList.sendPacketToOtherPlayersAroundPoint(entityPlayer, x, y, z, range, worldServer.dimension.id, packet);
     }
@@ -114,14 +114,14 @@ public class WorldManager
     }
 
     @Override
-	public void tileEntityChanged(int x, int y, int z, TileEntity tileEntity)
+	public void tileEntityChanged(int x, int y, int z, BlockEntity blockEntity)
     {
-        mcServer.playerList.sendTileEntityToPlayer(x, y, z, tileEntity);
+        mcServer.playerList.sendTileEntityToPlayer(x, y, z, blockEntity);
     }
 
     @Override
-	public void levelEvent(EntityPlayer player, int id, int x, int y, int z, int data)
+	public void levelEvent(Player player, int id, int x, int y, int z, int data)
     {
-        mcServer.playerList.sendPacketToOtherPlayersAroundPoint(player, x, y, z, 64D, worldServer.dimension.id, new Packet61PlaySoundEffect(id, x, y, z, data));
+        mcServer.playerList.sendPacketToOtherPlayersAroundPoint(player, x, y, z, 64D, worldServer.dimension.id, new PlaySoundEffectPacket(id, x, y, z, data));
     }
 }
diff --git a/src/main/java/net/minecraft/server/world/WorldServer.java b/src/main/java/net/minecraft/server/world/WorldServer.java
index 51f4021fe..d691573ab 100644
--- a/src/main/java/net/minecraft/server/world/WorldServer.java
+++ b/src/main/java/net/minecraft/server/world/WorldServer.java
@@ -4,13 +4,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 import net.minecraft.core.Global;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.entity.animal.Animal;
+import net.minecraft.core.util.collection.IntHashMap;
 import net.minecraft.core.world.*;
-import net.minecraft.core.world.pathfinder.IdHashMap;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.animal.EntityAnimal;
-import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.animal.EntityWaterAnimal;
-import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.entity.animal.WaterAnimal;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.net.packet.*;
@@ -22,11 +22,11 @@ import net.minecraft.core.world.type.WorldType;
 import net.minecraft.server.MinecraftServer;
 
 // Referenced classes of package net.minecraft.src:
-//            World, WorldProvider, MCHash, EntityAnimal, 
-//            EntityWaterMob, Entity, EntityPlayer, ISaveHandler, 
-//            ChunkProviderServer, TileEntity, WorldInfo, MathHelper, 
-//            ServerConfigurationManager, Packet71Weather, Packet38EntityStatus, EntityTracker, 
-//            Explosion, Packet60Explosion, Packet54PlayNoteBlock, Packet70Bed, 
+//            World, WorldProvider, MCHash, Animal,
+//            EntityWaterMob, Entity, Player, ISaveHandler,
+//            ChunkProviderServer, BlockEntity, WorldInfo, MathHelper,
+//            ServerConfigurationManager, WeatherEffectPacket, EnitityEventPacket, EntityTracker,
+//            Explosion, ExplosionPacket, BlockEventPacket, BedMessagePacket,
 //            IChunkProvider
 
 public class WorldServer extends World
@@ -36,18 +36,18 @@ public class WorldServer extends World
     {
         super(isavehandler, name, seed, Dimension.getDimensionList().get(dimensionId), worldType);
         field_819_z = false;
-        entityIdHashMap = new IdHashMap<>();
+        entityIntHashMap = new IntHashMap<>();
         mcServer = minecraftserver;
     }
 
     @Override
     public void updateEntityWithOptionalForce(Entity entity, boolean flag)
     {
-        if(!mcServer.spawnPeacefulMobs && ((entity instanceof EntityAnimal) || (entity instanceof EntityWaterAnimal)))
+        if(!mcServer.spawnPeacefulMobs && ((entity instanceof Animal) || (entity instanceof WaterAnimal)))
         {
             entity.remove();
         }
-        if(!(entity.passenger instanceof EntityPlayer))
+        if(!(entity.passenger instanceof Player))
         {
             super.updateEntityWithOptionalForce(entity, flag);
         }
@@ -66,12 +66,12 @@ public class WorldServer extends World
         return chunkProviderServer;
     }
 
-    public List<TileEntity> getTileEntityList(int i, int j, int k, int l, int i1, int j1)
+    public List<BlockEntity> getTileEntityList(int i, int j, int k, int l, int i1, int j1)
     {
-        ArrayList<TileEntity> arraylist = new ArrayList<>();
-        for(int k1 = 0; k1 < loadedTileEntityList.size(); k1++)
+        ArrayList<BlockEntity> arraylist = new ArrayList<>();
+        for(int k1 = 0; k1 < loadedBlockEntityList.size(); k1++)
         {
-            TileEntity tileentity = loadedTileEntityList.get(k1);
+            BlockEntity tileentity = loadedBlockEntityList.get(k1);
             if(tileentity.x >= i && tileentity.y >= j && tileentity.z >= k && tileentity.x < l && tileentity.y < i1 && tileentity.z < j1)
             {
                 arraylist.add(tileentity);
@@ -82,7 +82,7 @@ public class WorldServer extends World
     }
 
     @Override
-    public boolean canMineBlock(EntityPlayer entityplayer, int i, int j, int k)
+    public boolean canMineBlock(Player entityplayer, int i, int j, int k)
     {
         int l = (int)MathHelper.abs(i - levelData.getSpawnX());
         int i1 = (int)MathHelper.abs(k - levelData.getSpawnZ());
@@ -98,7 +98,7 @@ public class WorldServer extends World
     {
         super.obtainEntitySkin(entity);
         if (entity == null) return;
-        entityIdHashMap.add(entity.id, entity);
+        entityIntHashMap.put(entity.id, entity);
     }
 
     @Override
@@ -106,7 +106,7 @@ public class WorldServer extends World
     {
         super.releaseEntitySkin(entity);
         if (entity == null) return;
-        entityIdHashMap.remove(entity.id);
+        entityIntHashMap.remove(entity.id);
     }
 
     @Override
@@ -122,14 +122,14 @@ public class WorldServer extends World
             {
                 if(MinecraftServer.getInstance() != null && players.size() > 1) {
                     if(getPlayersRequiredToSkipNight() <= 1) {
-                        EntityPlayer player = null;
-                        for(EntityPlayer player2 : players) {
+                        Player player = null;
+                        for(Player player2 : players) {
                             if(player2.isPlayerFullyAsleep()) {
                                 player = player2;
                             }
                         }
                         if(player != null) {
-                            MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet3Chat(TextFormatting.YELLOW + player.getDisplayName() + TextFormatting.ORANGE + " went to sleep. Sweet dreams!"), dimension.id);
+                            MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new ChatPacket(TextFormatting.YELLOW + player.getDisplayName() + TextFormatting.ORANGE + " went to sleep. Sweet dreams!"), dimension.id);
                         }
                     }
                 }
@@ -142,13 +142,13 @@ public class WorldServer extends World
     }
 
     @Override
-    public void updateEnoughPlayersSleepingFlag(EntityPlayer player)
+    public void updateEnoughPlayersSleepingFlag(Player player)
     {
         enoughPlayersSleeping = false;
         if(players.size() > 0) {
             int playersSleeping = 0;
             int req = getPlayersRequiredToSkipNight();
-            for(EntityPlayer p : players)
+            for(Player p : players)
                 if(p.isPlayerSleeping()) playersSleeping++;
             if(playersSleeping >= req) {
                 enoughPlayersSleeping = true;
@@ -157,15 +157,15 @@ public class WorldServer extends World
             if(MinecraftServer.getInstance() != null && player != null && players.size() > 1 && req > 1) {
                 int moreReq = req - playersSleeping;
                 if(player.isPlayerSleeping()) {
-                    MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet3Chat(TextFormatting.YELLOW + player.username + TextFormatting.ORANGE + " went to bed."), dimension.id);
+                    MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new ChatPacket(TextFormatting.YELLOW + player.username + TextFormatting.ORANGE + " went to bed."), dimension.id);
                 }else {
-                    MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet3Chat(TextFormatting.YELLOW + player.username + TextFormatting.ORANGE + " has left their bed."), dimension.id);
+                    MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new ChatPacket(TextFormatting.YELLOW + player.username + TextFormatting.ORANGE + " has left their bed."), dimension.id);
                 }
                 if(moreReq > 0) {
                     if(moreReq > 1) {
-                        MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet3Chat(TextFormatting.LIGHT_GRAY + "" + moreReq + " more players are required to sleep to skip to daytime"), dimension.id);
+                        MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new ChatPacket(TextFormatting.LIGHT_GRAY + "" + moreReq + " more players are required to sleep to skip to daytime"), dimension.id);
                     }else {
-                        MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new Packet3Chat(TextFormatting.LIGHT_GRAY + "1 more player is required to sleep to skip to daytime"), dimension.id);
+                        MinecraftServer.getInstance().playerList.sendPacketToAllPlayersInDimension(new ChatPacket(TextFormatting.LIGHT_GRAY + "1 more player is required to sleep to skip to daytime"), dimension.id);
                     }
 
                 }
@@ -176,7 +176,7 @@ public class WorldServer extends World
 
     public Entity getEntityFromId(int i)
     {
-        return entityIdHashMap.get(i);
+        return entityIntHashMap.get(i);
     }
 
     @Override
@@ -184,7 +184,7 @@ public class WorldServer extends World
     {
         if(super.addWeatherEffect(entity))
         {
-            mcServer.playerList.sendPacketToPlayersAroundPoint(entity.x, entity.y, entity.z, 512D, dimension.id, new Packet71Weather(entity));
+            mcServer.playerList.sendPacketToPlayersAroundPoint(entity.x, entity.y, entity.z, 512D, dimension.id, new WeatherEffectPacket(entity));
             return true;
         } else
         {
@@ -195,21 +195,21 @@ public class WorldServer extends World
     @Override
     public void sendTrackedEntityStatusUpdatePacket(Entity entityId, byte entityStatus)
     {
-        Packet38EntityStatus packet38entitystatus = new Packet38EntityStatus(entityId.id, entityStatus);
-        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entityId, packet38entitystatus);
+        EnitityEventPacket enitityEventPacket38Entitystatus = new EnitityEventPacket(entityId.id, entityStatus);
+        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entityId, enitityEventPacket38Entitystatus);
     }
 
     @Override
     public void sendTrackedEntityStatusUpdatePacket(Entity entityId, byte entityStatus, float attackedAtYaw)
     {
-        Packet38EntityStatus packet38entitystatus = new Packet38EntityStatus(entityId.id, entityStatus, attackedAtYaw);
-        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entityId, packet38entitystatus);
+        EnitityEventPacket enitityEventPacket38Entitystatus = new EnitityEventPacket(entityId.id, entityStatus, attackedAtYaw);
+        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entityId, enitityEventPacket38Entitystatus);
     }
 
     @Override
     public void sendTrackedEntityDataPacket(Entity entity) {
-        Packet42EntityTagData packet42entitytagdata = new Packet42EntityTagData(entity);
-        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entity, packet42entitytagdata);
+        EntityTagDataPacket entitytagdataNBT = new EntityTagDataPacket(entity);
+        mcServer.getEntityTracker(dimension.id).sendPacketToTrackedPlayersAndTrackedEntity(entity, entitytagdataNBT);
     }
 
     @Override
@@ -225,16 +225,16 @@ public class WorldServer extends World
         else
             explosion = new ExplosionCannonball(this, entity, x, y, z, explosionSize);
         explosion.isFlaming = flaming;
-        explosion.doExplosionA();
-        explosion.doExplosionB(true);
-        mcServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, 64D, dimension.id, new Packet60Explosion(x, y, z, explosionSize, explosion.destroyedBlockPositions, isCannonBall));
+        explosion.explode();
+        explosion.addEffects(true);
+        mcServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, 64D, dimension.id, new ExplosionPacket(x, y, z, explosionSize, explosion.destroyedBlockPositions, isCannonBall));
         return explosion;
     }
     @Override
     public void triggerEvent(int x, int y, int z, int index, int data)
     {
         super.triggerEvent(x, y, z, index, data);
-        mcServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, 64D, dimension.id, new Packet54PlayNoteBlock(x, y, z, index, data));
+        mcServer.playerList.sendPacketToPlayersAroundPoint(x, y, z, 64D, dimension.id, new BlockEventPacket(x, y, z, index, data));
     }
 
     public void func_30006_w()
@@ -247,19 +247,19 @@ public class WorldServer extends World
         super.tick();
 
         if (System.currentTimeMillis() - lastWeatherSend > 1000) {
-            mcServer.playerList.sendPacketToAllPlayers(new Packet73WeatherStatus(dimension.id, getCurrentWeather() != null ? getCurrentWeather().weatherId : -1, weatherManager.getNextWeather() != null ? weatherManager.getNextWeather().weatherId : -1, weatherManager.getWeatherDuration(), weatherManager.getWeatherIntensity(), weatherManager.getWeatherPower()));
+            mcServer.playerList.sendPacketToAllPlayers(new WeatherStatusPacket(dimension.id, getCurrentWeather() != null ? getCurrentWeather().weatherId : -1, weatherManager.getNextWeather() != null ? weatherManager.getNextWeather().weatherId : -1, weatherManager.getWeatherDuration(), weatherManager.getWeatherIntensity(), weatherManager.getWeatherPower()));
             lastWeatherSend = System.currentTimeMillis();
         }
     }
     @Override
     public void sendGlobalMessage(String message){
-        mcServer.playerList.sendPacketToAllPlayers(new Packet3Chat(message));
+        mcServer.playerList.sendPacketToAllPlayers(new ChatPacket(message));
     }
 
     public ChunkProviderServer chunkProviderServer;
     public boolean field_819_z;
     public boolean levelSaving;
     public MinecraftServer mcServer;
-    private final IdHashMap<Entity> entityIdHashMap;
+    private final IntHashMap<Entity> entityIntHashMap;
     private long lastWeatherSend = System.currentTimeMillis();
 }
diff --git a/src/main/java/org/lwjgl/opengl/Display.java b/src/main/java/org/lwjgl/opengl/Display.java
new file mode 100644
index 000000000..30ee29765
--- /dev/null
+++ b/src/main/java/org/lwjgl/opengl/Display.java
@@ -0,0 +1,301 @@
+package org.lwjgl.opengl;
+
+import org.lwjgl.BufferUtils;
+import org.lwjgl.LWJGLException;
+import org.lwjgl.glfw.*;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+
+import java.awt.*;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+
+public abstract class Display {
+    private static String title = "";
+    private static long handle = -1;
+    private static boolean resizable = false;
+    private static DisplayMode displayMode = new DisplayMode(640, 480, 24, 60);
+    private static int width = 0;
+    private static int height = 0;
+    private static int xPos = 0;
+    private static int yPos = 0;
+    private static boolean windowResized = false;
+    private static GLFWWindowSizeCallback sizeCallback = null;
+    private static ByteBuffer[] cachedIcons = null;
+    private static Canvas parent = null;
+
+    public static void create() throws LWJGLException {
+        create(new PixelFormat());
+    }
+
+    public static long getHandle() {
+        return handle;
+    }
+
+    public static void create(PixelFormat pixel_format) throws LWJGLException {
+        GLFWErrorCallback.createPrint(System.err).set();
+        if (!GLFW.glfwInit()) {
+            throw new IllegalStateException("Unable to initialize GLFW");
+        }
+        GLFW.glfwDefaultWindowHints();
+        GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);
+        GLFW.glfwWindowHint(GLFW.GLFW_RESIZABLE, resizable ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
+        handle = GLFW.glfwCreateWindow(displayMode.getWidth(), displayMode.getHeight(), title, 0, 0);
+        width = displayMode.getWidth();
+        height = displayMode.getHeight();
+        GLFW.glfwMakeContextCurrent(handle);
+        GL.createCapabilities();
+        sizeCallback = GLFWWindowSizeCallback.create(Display::resizeCallback);
+        GLFW.glfwSetWindowSizeCallback(handle, sizeCallback);
+        Mouse.create();
+        Keyboard.create();
+        GLFW.glfwShowWindow(handle);
+        if (cachedIcons != null) {
+            setIcon(cachedIcons);
+        }
+    }
+
+    private static void resizeCallback(long window, int width, int height) {
+        if (window == handle) {
+            Display.width = width;
+            Display.height = height;
+            windowResized = true;
+        }
+    }
+
+    private static void destroyWindow() {
+        sizeCallback.free();
+        Mouse.destroy();
+        Keyboard.destroy();
+        GLFW.glfwDestroyWindow(handle);
+    }
+
+    public static void destroy() {
+        destroyWindow();
+        GLFW.glfwTerminate();
+        GLFW.glfwSetErrorCallback(null).free();
+    }
+
+    public static DisplayMode[] getAvailableDisplayModes() {
+        long primaryMonitor = GLFW.glfwGetPrimaryMonitor();
+        if (primaryMonitor == 0) {
+            return new DisplayMode[0];
+        }
+        GLFWVidMode.Buffer videoModes = GLFW.glfwGetVideoModes(primaryMonitor);
+        if (videoModes == null) {
+            return new DisplayMode[0];
+        }
+
+        DisplayMode[] modes = new DisplayMode[videoModes.capacity()];
+        for (int i = 0; i < videoModes.capacity(); i++) {
+            GLFWVidMode videoMode = videoModes.get(i);
+            modes[i] = new DisplayMode(videoMode.width(), videoMode.height(), videoMode.redBits() + videoMode.greenBits() + videoMode.blueBits(), videoMode.refreshRate());
+        }
+        return modes;
+    }
+
+    public static DisplayMode getDesktopDisplayMode() {
+        GLFWVidMode videoMode = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor());
+        if (videoMode == null) {
+            DisplayMode[] displayModes = getAvailableDisplayModes();
+            if (displayModes.length == 0) {
+                return null;
+            }
+            DisplayMode largest = displayModes[0];
+            for (DisplayMode mode : displayModes) {
+                if (mode.getWidth() * mode.getHeight() > largest.getWidth() * largest.getHeight()) {
+                    largest = mode;
+                }
+            }
+
+            return largest;
+        } else {
+            return new DisplayMode(videoMode.width(), videoMode.height(), videoMode.redBits() + videoMode.greenBits() + videoMode.blueBits(), videoMode.refreshRate());
+        }
+    }
+
+    public static DisplayMode getDisplayMode() {
+        return displayMode;
+    }
+
+    public static int getHeight() {
+        return height;
+    }
+
+    public static Canvas getParent() {
+        return parent;
+    }
+
+    public static String getTitle() {
+        return title;
+    }
+
+    public static int getWidth() {
+        return width;
+    }
+
+    public static int getX() {
+        return xPos;
+    }
+
+    public static int getY() {
+        return yPos;
+    }
+
+    public static boolean isActive() {
+        return GLFW.glfwGetWindowAttrib(handle, GLFW.GLFW_FOCUSED) == GLFW.GLFW_TRUE;
+    }
+
+    public static boolean isCloseRequested() {
+        return GLFW.glfwWindowShouldClose(handle);
+    }
+
+    public static boolean isCreated() {
+        return handle != -1;
+    }
+
+    public static boolean isFullscreen() {
+        return GLFW.glfwGetWindowMonitor(handle) != 0;
+    }
+
+    public static boolean isResizable() {
+        return resizable;
+    }
+
+    public static boolean isVisible() {
+        return GLFW.glfwGetWindowAttrib(handle, GLFW.GLFW_VISIBLE) == GLFW.GLFW_TRUE;
+    }
+
+    public static void setDisplayMode(DisplayMode mode) throws LWJGLException {
+        displayMode = mode;
+        if (isCreated()) {
+            GLFW.glfwSetWindowSize(handle, mode.getWidth(), mode.getHeight());
+        }
+    }
+
+    public static void setDisplayModeAndFullscreen(DisplayMode mode) throws LWJGLException {
+        setDisplayMode(mode);
+        setFullscreen(true);
+    }
+
+    public static void setFullscreen(boolean fullscreen) throws LWJGLException {
+        try {
+            resizeCallback(handle, displayMode.getWidth(), displayMode.getHeight());
+            if (fullscreen) {
+                long monitor = GLFW.glfwGetPrimaryMonitor();
+
+                GLFW.glfwSetWindowMonitor(
+                    handle,
+                    monitor,
+                    0,
+                    0,
+                    getWidth(),
+                    getHeight(),
+                    displayMode.getFrequency()
+                );
+                xPos = displayMode.getWidth() / 2;
+                yPos = displayMode.getHeight() / 2;
+            } else {
+                xPos -= width / 2;
+                yPos -= height / 2;
+                GLFW.glfwSetWindowMonitor(
+                    handle,
+                    0L,
+                    xPos,
+                    yPos,
+                    getWidth(),
+                    getHeight(),
+                    -1
+                );
+            }
+            GLFW.glfwSetWindowSize(handle, getWidth(), getHeight());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static int setIcon(ByteBuffer[] icons) {
+        if (isCreated()) {
+            GLFW.glfwSetWindowIcon(handle, iconsToGLFWBuffer(icons));
+            return 1;
+        } else {
+            return 0;
+        }
+    }
+
+    private static ByteBuffer cloneByteBuffer(ByteBuffer original) {
+        ByteBuffer clone = BufferUtils.createByteBuffer(original.capacity());
+        int oldPosition = original.position();
+        clone.put(original);
+        ((Buffer) original).position(oldPosition);
+        ((Buffer) clone).flip();
+
+        return clone;
+    }
+
+    private static GLFWImage.Buffer iconsToGLFWBuffer(ByteBuffer[] icons) {
+        GLFWImage.Buffer buffer = GLFWImage.create(icons.length);
+        for (ByteBuffer icon : icons) {
+            int size = icon.limit() / 4;
+            int dimension = (int)(Math.sqrt(size));
+            GLFWImage image = GLFWImage.malloc();
+            buffer.put(image.set(dimension, dimension, icon));
+        }
+        buffer.flip();
+        return buffer;
+    }
+
+    public static void setLocation(int x, int y) {
+        xPos = x;
+        yPos = y;
+        if (isCreated()) {
+            GLFW.glfwSetWindowPos(handle, x, y);
+        }
+    }
+
+    public static void setParent(Canvas parent) throws LWJGLException {
+        Display.parent = parent;
+    }
+
+    public static void setResizable(boolean resizable) {
+        Display.resizable = resizable;
+        if (isCreated()) {
+            GLFW.glfwSetWindowAttrib(handle, GLFW.GLFW_RESIZABLE, resizable ? GLFW.GLFW_TRUE : GLFW.GLFW_FALSE);
+        }
+    }
+
+    public static void setSwapInterval(int interval) {
+        GLFW.glfwSwapInterval(interval);
+    }
+
+    public static void setTitle(String title) {
+        Display.title = title;
+        if (isCreated()) {
+            GLFW.glfwSetWindowTitle(handle, title);
+        }
+    }
+
+    public static void setVSyncEnabled(boolean sync) {
+        setSwapInterval(sync ? 1 : 0);
+    }
+
+    public static void swapBuffers() throws LWJGLException {
+        GLFW.glfwSwapBuffers(handle);
+    }
+
+    public static void update() {
+        windowResized = false;
+        GLFW.glfwPollEvents();
+        if (Mouse.isCreated()) {
+            Mouse.poll();
+        }
+        if (Keyboard.isCreated()) {
+            Keyboard.poll();
+        }
+        GLFW.glfwSwapBuffers(handle);
+    }
+
+    public static boolean wasResized() {
+        return windowResized;
+    }
+}
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_coal_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_coal_permafrost.png
new file mode 100644
index 000000000..aa8ec811a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_coal_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_diamond_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_diamond_permafrost.png
new file mode 100644
index 000000000..7a34175be
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_diamond_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_gold_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_gold_permafrost.png
new file mode 100644
index 000000000..7d3c73207
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_gold_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_iron_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_iron_permafrost.png
new file mode 100644
index 000000000..cc098f7f7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_iron_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_lapis_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_lapis_permafrost.png
new file mode 100644
index 000000000..d3737ae47
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_lapis_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/ore_redstone_permafrost.png b/src/main/resources/assets/minecraft/textures/block/ore_redstone_permafrost.png
new file mode 100644
index 000000000..526ebe220
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/ore_redstone_permafrost.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone.png b/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone.png
new file mode 100644
index 000000000..2ad12cd3d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone_overlay.png b/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone_overlay.png
new file mode 100644
index 000000000..bc393b0e7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/pumpkin_redstone_overlay.png differ
diff --git a/src/main/resources/assets/minecraft/textures/entity/chicken/variants.json b/src/main/resources/assets/minecraft/textures/entity/chicken/variants.json
new file mode 100644
index 000000000..42eaed298
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/chicken/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 4
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/cow/variants.json b/src/main/resources/assets/minecraft/textures/entity/cow/variants.json
new file mode 100644
index 000000000..42eaed298
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/cow/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 4
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/pig/variants.json b/src/main/resources/assets/minecraft/textures/entity/pig/variants.json
new file mode 100644
index 000000000..5bf0f12e2
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/pig/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 5
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/skeleton/variants.json b/src/main/resources/assets/minecraft/textures/entity/skeleton/variants.json
new file mode 100644
index 000000000..5bf0f12e2
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/skeleton/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 5
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/variants.json b/src/main/resources/assets/minecraft/textures/entity/snowman/variants.json
new file mode 100644
index 000000000..5bf0f12e2
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/snowman/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 5
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/spider/variants.json b/src/main/resources/assets/minecraft/textures/entity/spider/variants.json
new file mode 100644
index 000000000..42eaed298
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/spider/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 4
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/squid/variants.json b/src/main/resources/assets/minecraft/textures/entity/squid/variants.json
new file mode 100644
index 000000000..42eaed298
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/squid/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 4
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/entity/zombie/variants.json b/src/main/resources/assets/minecraft/textures/entity/zombie/variants.json
new file mode 100644
index 000000000..089ca2f7d
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/entity/zombie/variants.json
@@ -0,0 +1,3 @@
+{
+    "skins": 16
+}
\ No newline at end of file
diff --git a/src/main/resources/environment/aurora.png b/src/main/resources/assets/minecraft/textures/environment/aurora.png
similarity index 100%
rename from src/main/resources/environment/aurora.png
rename to src/main/resources/assets/minecraft/textures/environment/aurora.png
diff --git a/src/main/resources/assets/minecraft/textures/environment/aurora.png.mcmeta b/src/main/resources/assets/minecraft/textures/environment/aurora.png.mcmeta
new file mode 100644
index 000000000..7275ccde7
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/environment/aurora.png.mcmeta
@@ -0,0 +1,5 @@
+{
+    "texture": {
+        "blur": true
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/environment/clouds.png b/src/main/resources/assets/minecraft/textures/environment/clouds.png
similarity index 100%
rename from src/main/resources/environment/clouds.png
rename to src/main/resources/assets/minecraft/textures/environment/clouds.png
diff --git a/src/main/resources/environment/rain.png b/src/main/resources/assets/minecraft/textures/environment/rain.png
similarity index 100%
rename from src/main/resources/environment/rain.png
rename to src/main/resources/assets/minecraft/textures/environment/rain.png
diff --git a/src/main/resources/environment/rain_blood.png b/src/main/resources/assets/minecraft/textures/environment/rain_blood.png
similarity index 100%
rename from src/main/resources/environment/rain_blood.png
rename to src/main/resources/assets/minecraft/textures/environment/rain_blood.png
diff --git a/src/main/resources/environment/snow.png b/src/main/resources/assets/minecraft/textures/environment/snow.png
similarity index 100%
rename from src/main/resources/environment/snow.png
rename to src/main/resources/assets/minecraft/textures/environment/snow.png
diff --git a/src/main/resources/environment/snow_light.png b/src/main/resources/assets/minecraft/textures/environment/snow_light.png
similarity index 100%
rename from src/main/resources/environment/snow_light.png
rename to src/main/resources/assets/minecraft/textures/environment/snow_light.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/achievement/bg.png b/src/main/resources/assets/minecraft/textures/gui/achievement/bg.png
deleted file mode 100644
index df22246d5..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/achievement/bg.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/blastfurnace.png b/src/main/resources/assets/minecraft/textures/gui/container/blastfurnace.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/blastfurnace.png
rename to src/main/resources/assets/minecraft/textures/gui/container/blastfurnace.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/container.png b/src/main/resources/assets/minecraft/textures/gui/container/container.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/container.png
rename to src/main/resources/assets/minecraft/textures/gui/container/container.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/crafting.png b/src/main/resources/assets/minecraft/textures/gui/container/crafting.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/crafting.png
rename to src/main/resources/assets/minecraft/textures/gui/container/crafting.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/creative.png b/src/main/resources/assets/minecraft/textures/gui/container/creative.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/creative.png
rename to src/main/resources/assets/minecraft/textures/gui/container/creative.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/trap.png b/src/main/resources/assets/minecraft/textures/gui/container/dispenser.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/trap.png
rename to src/main/resources/assets/minecraft/textures/gui/container/dispenser.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/flag_editor.png b/src/main/resources/assets/minecraft/textures/gui/container/flag_editor.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/flag_editor.png
rename to src/main/resources/assets/minecraft/textures/gui/container/flag_editor.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/furnace.png b/src/main/resources/assets/minecraft/textures/gui/container/furnace.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/furnace.png
rename to src/main/resources/assets/minecraft/textures/gui/container/furnace.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/guidebook/cover.png b/src/main/resources/assets/minecraft/textures/gui/container/guidebook/cover.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/guidebook/cover.png
rename to src/main/resources/assets/minecraft/textures/gui/container/guidebook/cover.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/guidebook/guidebook.png b/src/main/resources/assets/minecraft/textures/gui/container/guidebook/guidebook.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/guidebook/guidebook.png
rename to src/main/resources/assets/minecraft/textures/gui/container/guidebook/guidebook.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/guidebook/mob.png b/src/main/resources/assets/minecraft/textures/gui/container/guidebook/mob.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/guidebook/mob.png
rename to src/main/resources/assets/minecraft/textures/gui/container/guidebook/mob.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/inventory.png b/src/main/resources/assets/minecraft/textures/gui/container/inventory.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/inventory.png
rename to src/main/resources/assets/minecraft/textures/gui/container/inventory.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/trommel.png b/src/main/resources/assets/minecraft/textures/gui/container/trommel.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/trommel.png
rename to src/main/resources/assets/minecraft/textures/gui/container/trommel.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/controller/cursor.png b/src/main/resources/assets/minecraft/textures/gui/controller/cursor.png
new file mode 100644
index 000000000..8b2e89212
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/controller/cursor.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/icons.png b/src/main/resources/assets/minecraft/textures/gui/controller/nintendo.png
similarity index 55%
rename from src/main/resources/assets/minecraft/textures/gui/icons.png
rename to src/main/resources/assets/minecraft/textures/gui/controller/nintendo.png
index bfd8f6086..98733710d 100644
Binary files a/src/main/resources/assets/minecraft/textures/gui/icons.png and b/src/main/resources/assets/minecraft/textures/gui/controller/nintendo.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/controller/playstation.png b/src/main/resources/assets/minecraft/textures/gui/controller/playstation.png
new file mode 100644
index 000000000..6ade36536
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/controller/playstation.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/controller/xbox.png b/src/main/resources/assets/minecraft/textures/gui/controller/xbox.png
new file mode 100644
index 000000000..d45c89e71
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/controller/xbox.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.png b/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.png
deleted file mode 100644
index 2d03f7c54..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.psd b/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.psd
deleted file mode 100644
index 3b32d59f9..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/controller/xbox360.psd and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/flag.png b/src/main/resources/assets/minecraft/textures/gui/flag.png
deleted file mode 100644
index d3b973868..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/flag.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/gui.png b/src/main/resources/assets/minecraft/textures/gui/gui.png
deleted file mode 100644
index ce1567d86..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/gui.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/doom.png b/src/main/resources/assets/minecraft/textures/gui/hud/doom.png
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/doom.png
rename to src/main/resources/assets/minecraft/textures/gui/hud/doom.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/logo.png b/src/main/resources/assets/minecraft/textures/gui/logo.png
deleted file mode 100644
index 2250a2bb7..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/logo.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/particles.png b/src/main/resources/assets/minecraft/textures/gui/particles.png
deleted file mode 100644
index ac7e39f45..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/particles.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/afk.png b/src/main/resources/assets/minecraft/textures/gui/sign/afk.png
new file mode 100644
index 000000000..10a208512
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/afk.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png
new file mode 100644
index 000000000..0c491cc38
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png
new file mode 100644
index 000000000..0ea1cd0ef
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png
new file mode 100644
index 000000000..268d1cb5f
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png
new file mode 100644
index 000000000..17f9f0125
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/axe.png b/src/main/resources/assets/minecraft/textures/gui/sign/axe.png
new file mode 100644
index 000000000..21917251c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/axe.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png b/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png
new file mode 100644
index 000000000..fa2ba0bd6
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png b/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png
new file mode 100644
index 000000000..71fd6979c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png b/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png
new file mode 100644
index 000000000..0950f2fa7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/brb.png b/src/main/resources/assets/minecraft/textures/gui/sign/brb.png
new file mode 100644
index 000000000..4e8b2263b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/brb.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/caution.png b/src/main/resources/assets/minecraft/textures/gui/sign/caution.png
new file mode 100644
index 000000000..f1c524dbb
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/caution.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/chest.png b/src/main/resources/assets/minecraft/textures/gui/sign/chest.png
new file mode 100644
index 000000000..2f2e37b21
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/chest.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/craft.png b/src/main/resources/assets/minecraft/textures/gui/sign/craft.png
new file mode 100644
index 000000000..36563d486
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/craft.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/cross.png b/src/main/resources/assets/minecraft/textures/gui/sign/cross.png
new file mode 100644
index 000000000..4be4d9cb9
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/cross.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png
new file mode 100644
index 000000000..75ccc7bd1
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png
new file mode 100644
index 000000000..a14e28804
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png
new file mode 100644
index 000000000..9f6854560
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png
new file mode 100644
index 000000000..0620b3713
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png
new file mode 100644
index 000000000..7f6dfd425
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png b/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png
new file mode 100644
index 000000000..8aaa623ce
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/farm.png b/src/main/resources/assets/minecraft/textures/gui/sign/farm.png
new file mode 100644
index 000000000..fbcaa059c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/farm.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/heart.png b/src/main/resources/assets/minecraft/textures/gui/sign/heart.png
new file mode 100644
index 000000000..cd61d01e6
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/heart.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png b/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png
new file mode 100644
index 000000000..b5850b3c3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mine.png b/src/main/resources/assets/minecraft/textures/gui/sign/mine.png
new file mode 100644
index 000000000..bc7429476
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mine.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png b/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png
new file mode 100644
index 000000000..a19ff9996
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png b/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png
new file mode 100644
index 000000000..5479c4a73
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png b/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png
new file mode 100644
index 000000000..7798c9126
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png b/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png
new file mode 100644
index 000000000..e4b14313a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png b/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png
new file mode 100644
index 000000000..0bd3693ac
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/none.png b/src/main/resources/assets/minecraft/textures/gui/sign/none.png
new file mode 100644
index 000000000..78aafa7f4
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/none.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png b/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png
new file mode 100644
index 000000000..1089bd027
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png b/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png
new file mode 100644
index 000000000..d613d7bff
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png b/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png
new file mode 100644
index 000000000..504e390ab
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png b/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png
new file mode 100644
index 000000000..dba3b0a7b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png b/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png
new file mode 100644
index 000000000..0603e3d22
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign_images.pdn b/src/main/resources/assets/minecraft/textures/gui/sign/sign_images.pdn
similarity index 100%
rename from src/main/resources/assets/minecraft/textures/gui/sign_images.pdn
rename to src/main/resources/assets/minecraft/textures/gui/sign/sign_images.pdn
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/sword.png b/src/main/resources/assets/minecraft/textures/gui/sign/sword.png
new file mode 100644
index 000000000..9765d462e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/sword.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png b/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png
new file mode 100644
index 000000000..5a523f7e7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png b/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png
new file mode 100644
index 000000000..6ae648706
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/trees.png b/src/main/resources/assets/minecraft/textures/gui/sign/trees.png
new file mode 100644
index 000000000..291148b8a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/trees.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png b/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png
new file mode 100644
index 000000000..eaec6f472
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png b/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png
new file mode 100644
index 000000000..3a5ca5f2c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sign_images.png b/src/main/resources/assets/minecraft/textures/gui/sign_images.png
deleted file mode 100644
index 08697f8c9..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/sign_images.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/slot.png b/src/main/resources/assets/minecraft/textures/gui/slot.png
deleted file mode 100644
index 4eb39baf7..000000000
Binary files a/src/main/resources/assets/minecraft/textures/gui/slot.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement.png b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement.png
new file mode 100644
index 000000000..c6d6099a2
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_secret.png b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_secret.png
new file mode 100644
index 000000000..3eb871add
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_secret.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_special.png b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_special.png
new file mode 100644
index 000000000..415c132a4
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/achievement_special.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/star.png b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/star.png
new file mode 100644
index 000000000..dbe136d81
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/achievement/star.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_down.png b/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_down.png
new file mode 100644
index 000000000..285e21287
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_down.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_up.png b/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_up.png
new file mode 100644
index 000000000..f92c76c6b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/arrow_up.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/crafted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/crafted.png
new file mode 100644
index 000000000..dc6f213a1
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/crafted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/depleted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/depleted.png
new file mode 100644
index 000000000..273267d4d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/depleted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air.png
new file mode 100644
index 000000000..c7b509156
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air_pop.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air_pop.png
new file mode 100644
index 000000000..38abff414
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/air_pop.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png
new file mode 100644
index 000000000..05f3dfde1
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_full.png
new file mode 100644
index 000000000..17e152f9a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png
new file mode 100644
index 000000000..242b6b3f1
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/crosshair.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/crosshair.png
new file mode 100644
index 000000000..49ce3caf8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/crosshair.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/fire.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/fire.png
new file mode 100644
index 000000000..0d778040a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/fire.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container.png
new file mode 100644
index 000000000..61bc137a8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container_blinking.png
new file mode 100644
index 000000000..f73f6c023
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/container_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full.png
new file mode 100644
index 000000000..eb0ff3149
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full_blinking.png
new file mode 100644
index 000000000..48a6aef91
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/full_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half.png
new file mode 100644
index 000000000..ba8e53b68
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half_blinking.png
new file mode 100644
index 000000000..70b9fd6ec
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/half_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full.png
new file mode 100644
index 000000000..aadd65a16
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full_blinking.png
new file mode 100644
index 000000000..a56135438
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_full_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half.png
new file mode 100644
index 000000000..ec9dd0c29
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half_blinking.png
new file mode 100644
index 000000000..fbd48b6ac
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_half_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_full.png
new file mode 100644
index 000000000..260934729
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half.png
new file mode 100644
index 000000000..e239c6607
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half_right.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half_right.png
new file mode 100644
index 000000000..14115826b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/hardcore_preview_half_right.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full.png
new file mode 100644
index 000000000..86e1873ad
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full_blinking.png
new file mode 100644
index 000000000..1938633cc
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_full_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half.png
new file mode 100644
index 000000000..f3ad6098c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half_blinking.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half_blinking.png
new file mode 100644
index 000000000..6d00a065c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/overheal_half_blinking.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_full.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_full.png
new file mode 100644
index 000000000..9efd61d8a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_full.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half.png
new file mode 100644
index 000000000..f6869f172
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half_right.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half_right.png
new file mode 100644
index 000000000..8242df503
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/heart/preview_half_right.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar.png
new file mode 100644
index 000000000..f63978c28
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selection.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selection.png
new file mode 100644
index 000000000..fc7ac212c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selection.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selector.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selector.png
new file mode 100644
index 000000000..e43909fc0
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/hotbar_selector.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_blast.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_blast.png
new file mode 100644
index 000000000..7026b5cad
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_blast.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_combat.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_combat.png
new file mode 100644
index 000000000..cd394f0ce
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_combat.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fall.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fall.png
new file mode 100644
index 000000000..8f563e917
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fall.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fire.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fire.png
new file mode 100644
index 000000000..0d778040a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_fire.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_projectile.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_projectile.png
new file mode 100644
index 000000000..0b82a8d92
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/protection_projectile.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_back.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_back.png
new file mode 100644
index 000000000..9c4d08298
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_back.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_down.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_down.png
new file mode 100644
index 000000000..a9fe86a0b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_down.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_downer.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_downer.png
new file mode 100644
index 000000000..4aa3ae7f0
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_downer.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_front.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_front.png
new file mode 100644
index 000000000..80b4043c3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_front.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_left.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_left.png
new file mode 100644
index 000000000..672f85e09
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_left.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_right.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_right.png
new file mode 100644
index 000000000..5fb399350
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_right.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_up.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_up.png
new file mode 100644
index 000000000..778684dd4
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_up.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_upper.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_upper.png
new file mode 100644
index 000000000..81257bcd9
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/arrow_upper.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_back.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_back.png
new file mode 100644
index 000000000..5400d7e61
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_back.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_down.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_down.png
new file mode 100644
index 000000000..2463a2bdc
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_down.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_downer.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_downer.png
new file mode 100644
index 000000000..001e99701
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_downer.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_front.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_front.png
new file mode 100644
index 000000000..9ef9963bf
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_front.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_left.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_left.png
new file mode 100644
index 000000000..63018dd96
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_left.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_right.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_right.png
new file mode 100644
index 000000000..3e870d56a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_right.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_up.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_up.png
new file mode 100644
index 000000000..7fd0bb0bc
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_up.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_upper.png b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_upper.png
new file mode 100644
index 000000000..eacaf25e8
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/hud/rotation/cube_upper.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/mined.png b/src/main/resources/assets/minecraft/textures/gui/sprites/mined.png
new file mode 100644
index 000000000..fd024c0dc
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/mined.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder.png
new file mode 100644
index 000000000..d040ce590
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder_highlighted.png
new file mode 100644
index 000000000..177c2910b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_folder_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language.png
new file mode 100644
index 000000000..309862dad
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language_highlighted.png
new file mode 100644
index 000000000..d3596cb69
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_language_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random.png
new file mode 100644
index 000000000..62ddbbd79
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random_highlighted.png
new file mode 100644
index 000000000..aea9e339d
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_random_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset.png
new file mode 100644
index 000000000..f15100519
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset_highlighted.png
new file mode 100644
index 000000000..4490397bb
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_reset_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search.png
new file mode 100644
index 000000000..5cad57eb1
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search_highlighted.png
new file mode 100644
index 000000000..0e035ad62
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/button_search_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset.png
new file mode 100644
index 000000000..0553f86af
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset_highlighted.png
new file mode 100644
index 000000000..887d697ea
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/misc/icon_reset_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/slot.png b/src/main/resources/assets/minecraft/textures/gui/sprites/slot.png
new file mode 100644
index 000000000..690688780
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/slot.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/slot_raised.png b/src/main/resources/assets/minecraft/textures/gui/sprites/slot_raised.png
new file mode 100644
index 000000000..3b05041d7
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/slot_raised.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/toast.png b/src/main/resources/assets/minecraft/textures/gui/sprites/toast.png
new file mode 100644
index 000000000..170d30c49
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/toast.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/used.png b/src/main/resources/assets/minecraft/textures/gui/sprites/used.png
new file mode 100644
index 000000000..cd827f048
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/used.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png
new file mode 100644
index 000000000..b9b8175ec
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png.mcmeta b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png.mcmeta
new file mode 100644
index 000000000..a9b84c3cb
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button.png.mcmeta
@@ -0,0 +1,13 @@
+{
+    "gui": {
+        "type": "nine_slice",
+        "width": 200,
+        "height": 20,
+        "border": {
+            "top": 2,
+            "left": 2,
+            "right": 2,
+            "bottom": 3
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png
new file mode 100644
index 000000000..6745dd84c
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png.mcmeta b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png.mcmeta
new file mode 100644
index 000000000..a08c3403a
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_disabled.png.mcmeta
@@ -0,0 +1,8 @@
+{
+    "gui": {
+        "type": "nine_slice",
+        "width": 200,
+        "height": 20,
+        "border": 1
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png
new file mode 100644
index 000000000..76d5a2d1a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png.mcmeta b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png.mcmeta
new file mode 100644
index 000000000..a9b84c3cb
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button_highlighted.png.mcmeta
@@ -0,0 +1,13 @@
+{
+    "gui": {
+        "type": "nine_slice",
+        "width": 200,
+        "height": 20,
+        "border": {
+            "top": 2,
+            "left": 2,
+            "right": 2,
+            "bottom": 3
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/title/majonk.png b/src/main/resources/assets/minecraft/textures/gui/title/majonk.png
similarity index 100%
rename from src/main/resources/title/majonk.png
rename to src/main/resources/assets/minecraft/textures/gui/title/majonk.png
diff --git a/src/main/resources/assets/minecraft/textures/gui/title/mclogo.png b/src/main/resources/assets/minecraft/textures/gui/title/mclogo.png
new file mode 100644
index 000000000..aa44f1ead
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/title/mclogo.png differ
diff --git a/src/main/resources/title/retrologo.png b/src/main/resources/assets/minecraft/textures/gui/title/retrologo.png
similarity index 100%
rename from src/main/resources/title/retrologo.png
rename to src/main/resources/assets/minecraft/textures/gui/title/retrologo.png
diff --git a/src/main/resources/title/splashes.txt b/src/main/resources/assets/minecraft/textures/gui/title/splashes.txt
similarity index 98%
rename from src/main/resources/title/splashes.txt
rename to src/main/resources/assets/minecraft/textures/gui/title/splashes.txt
index 0d6035aab..5a629a1c5 100644
--- a/src/main/resources/title/splashes.txt
+++ b/src/main/resources/assets/minecraft/textures/gui/title/splashes.txt
@@ -133,7 +133,7 @@ The finest minds of a generation!
 Every copy is personalized!
 Damn fine cherry pie!
 Bee tea, eh!
-This background has an Easter egg!
+This background has an Easter eggProjectile!
 Almost finished!
 Watch out for chest goblins!
 Self-documenting!
diff --git a/src/main/resources/assets/minecraft/textures/item/map_blank.png b/src/main/resources/assets/minecraft/textures/item/map_blank.png
new file mode 100644
index 000000000..a5c73ba28
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/map_blank.png differ
diff --git a/src/main/resources/misc/colors_chat.png b/src/main/resources/assets/minecraft/textures/misc/colors_chat.png
similarity index 100%
rename from src/main/resources/misc/colors_chat.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_chat.png
diff --git a/src/main/resources/misc/colors_flag.png b/src/main/resources/assets/minecraft/textures/misc/colors_flag.png
similarity index 100%
rename from src/main/resources/misc/colors_flag.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_flag.png
diff --git a/src/main/resources/misc/colors_lamps.png b/src/main/resources/assets/minecraft/textures/misc/colors_lamps.png
similarity index 100%
rename from src/main/resources/misc/colors_lamps.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_lamps.png
diff --git a/src/main/resources/misc/colors_planks.png b/src/main/resources/assets/minecraft/textures/misc/colors_planks.png
similarity index 100%
rename from src/main/resources/misc/colors_planks.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_planks.png
diff --git a/src/main/resources/misc/colors_redstone.png b/src/main/resources/assets/minecraft/textures/misc/colors_redstone.png
similarity index 100%
rename from src/main/resources/misc/colors_redstone.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_redstone.png
diff --git a/src/main/resources/misc/colors_signs.png b/src/main/resources/assets/minecraft/textures/misc/colors_signs.png
similarity index 100%
rename from src/main/resources/misc/colors_signs.png
rename to src/main/resources/assets/minecraft/textures/misc/colors_signs.png
diff --git a/src/main/resources/misc/dial.png b/src/main/resources/assets/minecraft/textures/misc/dial.png
similarity index 100%
rename from src/main/resources/misc/dial.png
rename to src/main/resources/assets/minecraft/textures/misc/dial.png
diff --git a/src/main/resources/misc/dialseason.png b/src/main/resources/assets/minecraft/textures/misc/dialseason.png
similarity index 100%
rename from src/main/resources/misc/dialseason.png
rename to src/main/resources/assets/minecraft/textures/misc/dialseason.png
diff --git a/src/main/resources/misc/flagicon.png b/src/main/resources/assets/minecraft/textures/misc/flagicon.png
similarity index 100%
rename from src/main/resources/misc/flagicon.png
rename to src/main/resources/assets/minecraft/textures/misc/flagicon.png
diff --git a/src/main/resources/misc/footprint.png b/src/main/resources/assets/minecraft/textures/misc/footprint.png
similarity index 100%
rename from src/main/resources/misc/footprint.png
rename to src/main/resources/assets/minecraft/textures/misc/footprint.png
diff --git a/src/main/resources/misc/mapbg.png b/src/main/resources/assets/minecraft/textures/misc/mapbg.png
similarity index 100%
rename from src/main/resources/misc/mapbg.png
rename to src/main/resources/assets/minecraft/textures/misc/mapbg.png
diff --git a/src/main/resources/misc/mapicons.png b/src/main/resources/assets/minecraft/textures/misc/mapicons.png
similarity index 100%
rename from src/main/resources/misc/mapicons.png
rename to src/main/resources/assets/minecraft/textures/misc/mapicons.png
diff --git a/src/main/resources/misc/pumpkinblur.png b/src/main/resources/assets/minecraft/textures/misc/pumpkinblur.png
similarity index 100%
rename from src/main/resources/misc/pumpkinblur.png
rename to src/main/resources/assets/minecraft/textures/misc/pumpkinblur.png
diff --git a/src/main/resources/assets/minecraft/textures/misc/pumpkinblur.png.mcmeta b/src/main/resources/assets/minecraft/textures/misc/pumpkinblur.png.mcmeta
new file mode 100644
index 000000000..7275ccde7
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/misc/pumpkinblur.png.mcmeta
@@ -0,0 +1,5 @@
+{
+    "texture": {
+        "blur": true
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/misc/shadow.png b/src/main/resources/assets/minecraft/textures/misc/shadow.png
similarity index 100%
rename from src/main/resources/misc/shadow.png
rename to src/main/resources/assets/minecraft/textures/misc/shadow.png
diff --git a/src/main/resources/assets/minecraft/textures/misc/shadow.png.mcmeta b/src/main/resources/assets/minecraft/textures/misc/shadow.png.mcmeta
new file mode 100644
index 000000000..5f42481dd
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/misc/shadow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+    "texture": {
+        "clamp": true
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/misc/vignette.png b/src/main/resources/assets/minecraft/textures/misc/vignette.png
similarity index 100%
rename from src/main/resources/misc/vignette.png
rename to src/main/resources/assets/minecraft/textures/misc/vignette.png
diff --git a/src/main/resources/assets/minecraft/textures/misc/vignette.png.mcmeta b/src/main/resources/assets/minecraft/textures/misc/vignette.png.mcmeta
new file mode 100644
index 000000000..7275ccde7
--- /dev/null
+++ b/src/main/resources/assets/minecraft/textures/misc/vignette.png.mcmeta
@@ -0,0 +1,5 @@
+{
+    "texture": {
+        "blur": true
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/misc/water.png b/src/main/resources/assets/minecraft/textures/misc/water.png
similarity index 100%
rename from src/main/resources/misc/water.png
rename to src/main/resources/assets/minecraft/textures/misc/water.png
diff --git a/src/main/resources/credits.txt b/src/main/resources/credits.txt
new file mode 100644
index 000000000..47de95318
--- /dev/null
+++ b/src/main/resources/credits.txt
@@ -0,0 +1,27 @@
+*Lead Developers
+MaggAndGeez
+jonkadelic
+
+*Developers
+Bestsoft100
+Flamarine
+Martin (sunsetsatellite)
+NebulaBC
+Useless (uselessbullets)
+
+*Artists
+afk (away.from.keyboard)
+thaboar
+
+*Community Moderators
+Cookie Cakes
+Jej Chainstar
+Orknarok_666
+
+*Special Thanks
+DirtPiper
+Vivian (vivianfox.)
+Snowman64
+
+!Thank you for playing
+!Better than Adventure!
\ No newline at end of file
diff --git a/src/main/resources/entity/variants.json b/src/main/resources/entity/variants.json
deleted file mode 100644
index 7aaf9099a..000000000
--- a/src/main/resources/entity/variants.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-	"replace": false,
-	"variants": {
-		"net.minecraft.core.entity.animal.EntityChicken": {
-			"numSkins": 4
-		},
-		"net.minecraft.core.entity.animal.EntityCow": {
-			"numSkins": 4
-		},
-		"net.minecraft.core.entity.animal.EntityPig": {
-			"numSkins": 5
-		},
-		"net.minecraft.core.entity.monster.EntitySkeleton": {
-			"numSkins": 5
-		},
-		"net.minecraft.core.entity.monster.EntitySnowman": {
-			"numSkins": 5
-		},
-		"net.minecraft.core.entity.monster.EntitySpider": {
-			"numSkins": 4
-		},
-		"net.minecraft.core.entity.animal.EntitySquid": {
-			"numSkins": 4
-		},
-		"net.minecraft.core.entity.monster.EntityZombie": {
-			"numSkins": 16
-		}
-	}
-}
\ No newline at end of file
diff --git a/src/main/resources/items.tiles b/src/main/resources/items.tiles
new file mode 100644
index 000000000..2c1e08358
--- /dev/null
+++ b/src/main/resources/items.tiles
@@ -0,0 +1,183 @@
+size=32x32
+0,0=armor_helmet_leather
+0,1=armor_chestplate_leather
+0,2=armor_leggings_leather
+0,3=armor_boots_leather
+0,4=tool_sword_wood
+0,5=tool_shovel_wood
+0,6=tool_pickaxe_wood
+0,7=tool_axe_wood
+0,8=tool_hoe_wood
+0,9=tool_sword_steel
+0,10=tool_shovel_steel
+0,11=tool_pickaxe_steel
+0,12=tool_axe_steel
+0,13=tool_hoe_steel
+0,15=record_13
+1,0=armor_helmet_chainmail
+1,1=armor_chestplate_chainmail
+1,2=armor_leggings_chainmail
+1,3=armor_boots_chainmail
+1,4=tool_sword_stone
+1,5=tool_shovel_stone
+1,6=tool_pickaxe_stone
+1,7=tool_axe_stone
+1,8=tool_hoe_stone
+1,9=armor_helmet_steel
+1,10=armor_chestplate_steel
+1,11=armor_leggings_steel
+1,12=armor_boots_steel
+1,15=record_cat
+2,0=armor_helmet_iron
+2,1=armor_chestplate_iron
+2,2=armor_leggings_iron
+2,3=armor_boots_iron
+2,4=tool_sword_iron
+2,5=tool_shovel_iron
+2,6=tool_pickaxe_iron
+2,7=tool_axe_iron
+2,8=tool_hoe_iron
+2,9=tool_shears_steel
+2,10=tool_firestriker_steel
+2,15=record_blocks
+3,0=armor_helmet_diamond
+3,1=armor_chestplate_diamond
+3,2=armor_leggings_diamond
+3,3=armor_boots_diamond
+3,4=tool_sword_diamond
+3,5=tool_shovel_diamond
+3,6=tool_pickaxe_diamond
+3,7=tool_axe_diamond
+3,8=tool_hoe_diamond
+3,9=jar
+3,10=lantern_firefly_green
+3,11=lantern_firefly_blue
+3,12=lantern_firefly_orange
+3,13=lantern_firefly_red
+3,15=record_chirp
+4,0=armor_helmet_gold
+4,1=armor_chestplate_gold
+4,2=armor_leggings_gold
+4,3=armor_boots_gold
+4,4=tool_sword_gold
+4,5=tool_shovel_gold
+4,6=tool_pickaxe_gold
+4,7=tool_axe_gold
+4,8=tool_hoe_gold
+4,9=armor_quiver_gold
+4,10=ammo_arrow_purple
+4,15=record_far
+5,0=tool_firestriker
+5,1=tool_bow
+5,2=ammo_arrow
+5,3=stick
+5,4=tool_fishingrod
+5,5=tool_fishingrod_cast
+5,6=nethercoal
+5,7=ammo_arrow_gold
+5,8=handcannon_unloaded
+5,9=handcannon_loaded
+5,15=record_mall
+6,0=flint
+6,1=brick_clay
+6,2=armor_quiver
+6,3=tool_compass
+6,4=tool_clock
+6,5=repeater
+6,6=armor_boots_iceskates
+6,7=tool_calendar
+6,8=ammo_charge_explosive
+6,9=armor_quiver_full
+6,15=record_mellohi
+7,0=coal
+7,1=ingot_iron
+7,2=ingot_gold
+7,3=diamond
+7,4=bowl
+7,5=food_porkchop_raw
+7,6=leather
+7,7=ingot_steel
+7,8=minecart
+7,9=minecart_chest
+7,10=minecart_furnace
+7,15=record_stal
+8,0=string
+8,1=feather_chicken
+8,2=sulphur
+8,3=dust_redstone
+8,4=food_stew_mushroom
+8,5=food_porkchop_cooked
+8,6=saddle
+8,7=ingot_steel_crude
+8,8=boat
+8,9=label
+8,10=label_written
+8,15=record_strad
+9,0=seeds_wheat
+9,1=wheat
+9,2=food_bread
+9,3=clay
+9,4=dust_glowstone
+9,5=food_fish_raw
+9,6=cloth
+9,7=chainlink
+9,8=ore_raw_iron
+9,15=record_ward
+10,0=food_apple
+10,1=painting
+10,2=sign
+10,3=paper
+10,4=bucket
+10,5=food_fish_cooked
+10,6=ammo_pebble
+10,7=food_cherry
+10,8=ore_raw_gold
+11,0=food_apple_gold
+11,1=sugarcane
+11,2=door_oak
+11,3=book
+11,4=bucket_water
+11,5=quartz
+11,6=olivine
+11,7=charcoal
+11,8=flag
+11,15=record_dog
+12,0=egg_chicken
+12,1=bone
+12,2=door_iron
+12,3=map
+12,4=bucket_lava
+12,5=food_cookie
+12,6=bucket_icecream
+12,7=basket
+12,8=seeds_pumpkin
+12,15=record_wait
+13,0=dust_sugar
+13,1=food_cake
+13,2=bed
+13,4=bucket_milk
+13,5=tool_shears
+14,0=ammo_snowball
+14,1=slimeball
+14,2=ammo_fireball
+14,3=seat
+14,4=dye_black
+14,5=dye_red
+14,6=dye_green
+14,7=dye_brown
+14,8=dye_blue
+14,9=dye_purple
+14,10=dye_cyan
+14,11=dye_silver
+15,0=armor_helmet_outline
+15,1=armor_chestplate_outline
+15,2=armor_leggings_outline
+15,3=armor_boots_outline
+15,4=dye_gray
+15,5=dye_pink
+15,6=dye_lime
+15,7=dye_yellow
+15,8=dye_lightblue
+15,9=dye_magenta
+15,10=dye_orange
+15,11=dye_white
\ No newline at end of file
diff --git a/src/main/resources/terrain.tiles b/src/main/resources/terrain.tiles
new file mode 100644
index 000000000..2e62a0e1b
--- /dev/null
+++ b/src/main/resources/terrain.tiles
@@ -0,0 +1,519 @@
+size=32x32
+0,0=grass_top
+0,1=cobbled_stone
+0,2=moss_overlay
+0,3=sponge
+0,5=torch_coal
+0,6=lever_cobbled_stone
+0,7=rail_turn
+0,8=rail_straight
+0,9=block_lapis
+0,10=block_redstone
+0,11=sandstone_top
+0,12=sandstone_side
+0,13=sandstone_bottom
+0,14=brick_sandstone
+0,15=breaking_0
+0,16=rail_powered_overlay
+0,20=log_oak_side
+0,21=log_oak_mossy_side
+0,23=log_pine_side
+0,24=log_birch_side
+0,25=log_cherry_side
+0,26=log_eucalyptus_side
+1,0=stone
+1,1=bedrock
+1,2=cobbled_stone_retro
+1,3=glass
+1,4=mobspawner
+1,5=door_planks_oak_top
+1,6=door_planks_oak_bottom
+1,7=trommel_active_front
+1,8=trommel_side
+1,9=trommel_active_front_background
+1,10=trommel_top
+1,15=breaking_1
+1,16=motionsensor_overlay
+1,20=log_oak_top
+1,21=log_oak_mossy_top
+1,23=log_pine_top
+1,24=log_birch_top
+1,25=log_cherry_top
+1,26=log_eucalyptus_top
+2,0=dirt
+2,1=sand
+2,4=block_snow
+2,5=door_iron_top
+2,6=door_iron_bottom
+2,7=trommel_active_back
+2,8=trommel_side_slot
+2,9=trommel_active_front_foreground
+2,10=trommel_idle_front
+2,11=trommel_idle_back
+2,12=polished_limestone_side
+2,13=polished_granite_side
+2,14=polished_basalt_side
+2,15=breaking_2
+2,16=netherrack_igneous_overlay
+2,18=leaves_cacao_bean_stage0
+2,19=leaves_cherry_flowering_overlay
+2,20=leaves_oak_fancy
+2,22=leaves_oak_retro_fancy
+2,23=leaves_pine_fancy
+2,24=leaves_birch_fancy
+2,25=leaves_cherry_fancy
+2,26=leaves_eucalyptus_fancy
+2,27=leaves_shrub_fancy
+2,28=leaves_cacao_fancy
+3,0=grass_side
+3,1=gravel
+3,2=bookshelf_side
+3,3=trapdoor_planks_oak_side
+3,4=ice
+3,5=ladder
+3,6=torch_redstone_active
+3,7=torch_redstone_idle
+3,8=repeater_idle_top
+3,9=repeater_active_top
+3,10=rail_powered_idle
+3,11=rail_powered_active
+3,12=rail_detector
+3,13=polished_limestone_top
+3,14=carved_limestone
+3,15=breaking_3
+3,16=ore_nethercoal_netherrack_overlay
+3,17=leaves_cherry_overlay
+3,18=leaves_cacao_bean_stage1
+3,20=leaves_oak
+3,22=leaves_oak_retro
+3,23=leaves_pine
+3,24=leaves_birch
+3,25=leaves_cherry
+3,26=leaves_eucalyptus
+3,27=leaves_shrub
+3,28=leaves_cacao
+4,0=planks_oak
+4,2=cobbled_stone_mossy
+4,3=trapdoor_iron_side
+4,4=grass_snowy_side
+4,5=trapdoor_planks_oak_top
+4,6=grass_path_top
+4,7=trapdoor_iron_top
+4,8=basket_side
+4,9=basket_bottom
+4,10=wire_redstone_cross
+4,13=polished_granite_top
+4,14=carved_granite
+4,15=breaking_4
+4,16=ore_redstone_overlay
+4,17=leaves_cacao_bean_stage3
+4,18=leaves_cacao_bean_stage2
+4,20=sapling_oak
+4,22=sapling_oak_retro
+4,23=sapling_pine
+4,24=sapling_birch
+4,25=sapling_cherry
+4,26=sapling_eucalyptus
+4,27=sapling_shrub
+4,28=sapling_cacao
+5,0=carved_stone
+5,1=polished_stone_side
+5,2=obsidian
+5,3=trapdoor_glass_side
+5,4=cactus_top
+5,5=pumpkin_bottom
+5,6=grass_path_side
+5,7=candle_soulwax
+5,8=basket_fill
+5,9=bed_foot_front
+5,10=wire_redstone_straight
+5,13=polished_basalt_top
+5,14=carved_basalt
+5,15=breaking_5
+5,16=block_nethercoal_overlay
+5,17=wool_black
+5,18=wool_red
+5,19=wool_green
+5,20=wool_brown
+5,21=wool_blue
+5,22=wool_purple
+5,23=wool_cyan
+5,24=wool_silver
+6,0=polished_stone_top
+6,1=algae
+6,2=grass_side_overlay
+6,3=grass_retro_side
+6,4=cactus_side
+6,5=farmland_wet_top
+6,6=pumpkin_top
+6,7=pumpkin_side
+6,8=bed_foot_top
+6,9=bed_foot_side
+6,10=basalt
+6,11=spikes_side
+6,12=glass_tinted
+6,13=brick_slate
+6,14=carved_slate
+6,15=breaking_6
+6,17=wool_gray
+6,18=wool_pink
+6,19=wool_lime
+6,20=wool_yellow
+6,21=wool_lightblue
+6,22=wool_magenta
+6,23=wool_orange
+6,24=wool_white
+7,0=brick_clay
+7,2=tallgrass
+7,3=deadbush
+7,4=cactus_bottom
+7,5=farmland_dry_top
+7,6=netherrack
+7,7=pumpkin_carved_idle
+7,8=bed_head_top
+7,9=bed_head_side
+7,10=cobbled_basalt
+7,11=spikes_top
+7,12=motionsensor_idle_front
+7,13=slate_side
+7,14=polished_slate_side
+7,15=breaking_7
+7,18=pebbles0
+7,19=fence_chain_center
+7,20=fence_chain_column
+8,0=tnt_side
+8,1=grass_retro_top
+8,3=fern
+8,4=block_clay
+8,5=crops_wheat_stage0
+8,6=soulsand
+8,7=pumpkin_carved_active
+8,8=brick_iron
+8,9=bed_head_front
+8,10=brick_basalt
+8,11=mesh
+8,12=motionsensor_active_front
+8,13=slate_top
+8,14=polished_slate_top
+8,15=breaking_8
+8,18=pebbles1
+8,19=fence_chain_top
+9,0=tnt_top
+9,1=chest_planks_oak_top
+9,2=chest_planks_oak_left_front
+9,3=chest_planks_oak_left_back
+9,4=sugarcane
+9,5=crops_wheat_stage1
+9,6=glowstone
+9,7=cake_top
+9,8=brick_lapis
+9,9=brick_gold
+9,10=limestone
+9,11=granite
+9,13=capstone_marble_side
+9,14=capstone_marble_top
+9,15=breaking_9
+9,18=pebbles2
+9,19=fence_paper_center
+9,19=paperwall
+9,20=fence_paper_column
+10,0=tnt_bottom
+10,1=chest_planks_oak_side
+10,2=chest_planks_oak_right_front
+10,3=chest_planks_oak_right_back
+10,4=noteblock
+10,4=jukebox_side
+10,5=crops_wheat_stage2
+10,6=piston_face_sticky
+10,7=cake_side
+10,8=brick_polished_stone
+10,9=ore_nethercoal_netherrack
+10,10=cobbled_limestone
+10,11=cobbled_granite
+10,12=motionsensor_side
+10,13=brick_marble
+10,14=carved_marble
+10,15=permaice
+11,0=cobweb
+11,1=chest_planks_oak_front
+11,2=workbench_top
+11,3=workbench_front
+11,4=jukebox_top
+11,5=crops_wheat_stage3
+11,6=piston_face
+11,7=cake_inner
+11,8=brick_polished_stone_mossy
+11,9=sponge_wet
+11,10=brick_limestone
+11,11=brick_granite
+11,12=pillar_marble_side
+11,13=pillar_marble_top
+11,14=marble
+11,15=permafrost
+12,0=flower_red
+12,1=mushroom_brown
+12,2=furnace_stone_idle_front
+12,3=workbench_side
+12,4=netherrack_igneous
+12,5=crops_wheat_stage4
+12,6=piston_side
+12,7=cake_bottom
+12,8=dirt_scorched_rich
+12,9=brick_stone
+12,10=spinifex
+12,11=block_olivine
+12,12=block_quartz
+12,13=seat_side
+12,15=cobbled_permafrost
+13,0=flower_yellow
+13,1=mushroom_red
+13,2=furnace_stone_side
+13,2=dispenser_side
+13,3=furnace_stone_active_front
+13,4=soulslate
+13,5=crops_wheat_stage5
+13,6=piston_bottom
+13,7=furnace_blast_idle_front
+13,8=dirt_scorched
+13,9=jar
+13,10=lantern_firefly_blue
+13,11=lantern_firefly_green
+13,12=water_still
+13,13=seat_top
+13,14=lava_still
+13,15=brick_permafrost
+14,0=portal_nether
+14,2=dispenser_front
+14,3=furnace_stone_top
+14,3=dispenser_top
+14,3=spikes_bottom
+14,4=netherrack_mossy
+14,5=crops_wheat_stage6
+14,6=piston_top
+14,7=furnace_blast_side
+14,8=furnace_blast_active_front
+14,9=furnace_blast_bottom
+14,10=lantern_firefly_orange
+14,11=lantern_firefly_red
+14,12=water_flowing
+14,14=lava_flowing
+15,1=fire
+15,5=crops_wheat_stage7
+15,7=block_charcoal
+15,8=furnace_blast_top
+15,9=block_sugarcane_side
+15,10=block_sugarcane_baked_side
+16,0=ore_gold_stone
+16,1=ore_gold_basalt
+16,2=ore_gold_limestone
+16,3=ore_gold_granite
+16,4=block_iron_top
+16,5=block_iron_side
+16,6=block_iron_bottom
+16,7=block_coal
+16,10=block_sugarcane_top
+16,11=grass_scorched_top
+16,12=crops_pumpkin_stage4_top
+16,13=crops_pumpkin_stage3_top
+16,14=crops_pumpkin_stage2_top
+16,15=crops_pumpkin_stage1_top
+16,16=crops_pumpkin_stage0
+16,24=lamp_black_idle
+16,25=lamp_red_idle
+16,26=lamp_green_idle
+16,27=lamp_brown_idle
+16,28=lamp_blue_idle
+16,29=lamp_purple_idle
+16,30=lamp_cyan_idle
+16,31=lamp_silver_idle
+17,0=ore_iron_stone
+17,1=ore_iron_basalt
+17,2=ore_iron_limestone
+17,3=ore_iron_granite
+17,4=block_gold_top
+17,5=block_gold_side
+17,6=block_gold_bottom
+17,7=block_nethercoal
+17,10=block_sugarcane_baked_top
+17,11=grass_scorched_side
+17,12=crops_pumpkin_stage4_side
+17,13=crops_pumpkin_stage3_side
+17,14=crops_pumpkin_stage2_side
+17,15=crops_pumpkin_stage1_side
+17,24=lamp_gray_idle
+17,25=lamp_pink_idle
+17,26=lamp_lime_idle
+17,27=lamp_yellow_idle
+17,28=lamp_lightblue_idle
+17,29=lamp_magenta_idle
+17,30=lamp_orange_idle
+17,31=lamp_white_idle
+18,0=ore_coal_stone
+18,1=ore_coal_basalt
+18,2=ore_coal_limestone
+18,3=ore_coal_granite
+18,4=block_diamond_top
+18,5=block_diamond_side
+18,6=block_diamond_bottom
+18,10=jar_dirt
+18,24=lamp_black_active
+18,25=lamp_red_active
+18,26=lamp_green_active
+18,27=lamp_brown_active
+18,28=lamp_blue_active
+18,29=lamp_purple_active
+18,30=lamp_cyan_active
+18,31=lamp_silver_active
+19,0=ore_lapis_stone
+19,1=ore_lapis_basalt
+19,2=ore_lapis_limestone
+19,3=ore_lapis_granite
+19,4=block_steel_top
+19,5=block_steel_side
+19,6=block_steel_bottom
+19,24=lamp_gray_active
+19,25=lamp_pink_active
+19,26=lamp_lime_active
+19,27=lamp_yellow_active
+19,28=lamp_lightblue_active
+19,29=lamp_magenta_active
+19,30=lamp_orange_active
+19,31=lamp_white_active
+20,0=ore_diamond_stone
+20,1=ore_diamond_basalt
+20,2=ore_diamond_limestone
+20,3=ore_diamond_granite
+20,20=chest_planks_oak_painted_black_top
+20,21=chest_planks_oak_painted_black_left_front
+20,22=chest_planks_oak_painted_black_left_back
+20,23=chest_planks_oak_painted_red_top
+20,24=chest_planks_oak_painted_red_left_front
+20,25=chest_planks_oak_painted_red_left_back
+20,26=chest_planks_oak_painted_green_top
+20,27=chest_planks_oak_painted_green_left_front
+20,28=chest_planks_oak_painted_green_left_back
+20,29=chest_planks_oak_painted_brown_top
+20,30=chest_planks_oak_painted_brown_left_front
+20,31=chest_planks_oak_painted_brown_left_back
+21,0=ore_redstone_stone
+21,1=ore_redstone_basalt
+21,2=ore_redstone_limestone
+21,3=ore_redstone_granite
+21,20=chest_planks_oak_painted_black_side
+21,21=chest_planks_oak_painted_black_right_front
+21,22=chest_planks_oak_painted_black_right_back
+21,23=chest_planks_oak_painted_red_side
+21,24=chest_planks_oak_painted_red_right_front
+21,25=chest_planks_oak_painted_red_right_back
+21,26=chest_planks_oak_painted_green_side
+21,27=chest_planks_oak_painted_green_right_front
+21,28=chest_planks_oak_painted_green_right_back
+21,29=chest_planks_oak_painted_brown_side
+21,30=chest_planks_oak_painted_brown_right_front
+21,31=chest_planks_oak_painted_brown_right_back
+22,0=mud
+22,20=chest_planks_oak_painted_black_front
+22,21=planks_oak_painted_black
+22,23=chest_planks_oak_painted_red_front
+22,24=planks_oak_painted_red
+22,26=chest_planks_oak_painted_green_front
+22,27=planks_oak_painted_green
+22,29=chest_planks_oak_painted_brown_front
+22,30=planks_oak_painted_brown
+23,0=mud_baked
+23,20=chest_planks_oak_painted_blue_top
+23,21=chest_planks_oak_painted_blue_left_front
+23,22=chest_planks_oak_painted_blue_left_back
+23,23=chest_planks_oak_painted_purple_top
+23,24=chest_planks_oak_painted_purple_left_front
+23,25=chest_planks_oak_painted_purple_left_back
+23,26=chest_planks_oak_painted_cyan_top
+23,27=chest_planks_oak_painted_cyan_left_front
+23,28=chest_planks_oak_painted_cyan_left_back
+23,29=chest_planks_oak_painted_silver_top
+23,30=chest_planks_oak_painted_silver_left_front
+23,31=chest_planks_oak_painted_silver_left_back
+24,20=chest_planks_oak_painted_blue_side
+24,21=chest_planks_oak_painted_blue_right_front
+24,22=chest_planks_oak_painted_blue_right_back
+24,23=chest_planks_oak_painted_purple_side
+24,24=chest_planks_oak_painted_purple_right_front
+24,25=chest_planks_oak_painted_purple_right_back
+24,26=chest_planks_oak_painted_cyan_side
+24,27=chest_planks_oak_painted_cyan_right_front
+24,28=chest_planks_oak_painted_cyan_right_back
+24,29=chest_planks_oak_painted_silver_side
+24,30=chest_planks_oak_painted_silver_right_front
+24,31=chest_planks_oak_painted_silver_right_back
+25,20=chest_planks_oak_painted_blue_front
+25,21=planks_oak_painted_blue
+25,23=chest_planks_oak_painted_purple_front
+25,24=planks_oak_painted_purple
+25,26=chest_planks_oak_painted_cyan_front
+25,27=planks_oak_painted_cyan
+25,29=chest_planks_oak_painted_silver_front
+25,30=planks_oak_painted_silver
+26,20=chest_planks_oak_painted_gray_top
+26,21=chest_planks_oak_painted_gray_left_front
+26,22=chest_planks_oak_painted_gray_left_back
+26,23=chest_planks_oak_painted_pink_top
+26,24=chest_planks_oak_painted_pink_left_front
+26,25=chest_planks_oak_painted_pink_left_back
+26,26=chest_planks_oak_painted_lime_top
+26,27=chest_planks_oak_painted_lime_left_front
+26,28=chest_planks_oak_painted_lime_left_back
+26,29=chest_planks_oak_painted_yellow_top
+26,30=chest_planks_oak_painted_yellow_left_front
+26,31=chest_planks_oak_painted_yellow_left_back
+27,20=chest_planks_oak_painted_gray_side
+27,21=chest_planks_oak_painted_gray_right_front
+27,22=chest_planks_oak_painted_gray_right_back
+27,23=chest_planks_oak_painted_pink_side
+27,24=chest_planks_oak_painted_pink_right_front
+27,25=chest_planks_oak_painted_pink_right_back
+27,26=chest_planks_oak_painted_lime_side
+27,27=chest_planks_oak_painted_lime_right_front
+27,28=chest_planks_oak_painted_lime_right_back
+27,29=chest_planks_oak_painted_yellow_side
+27,30=chest_planks_oak_painted_yellow_right_front
+27,31=chest_planks_oak_painted_yellow_right_back
+28,20=chest_planks_oak_painted_gray_front
+28,21=planks_oak_painted_gray
+28,23=chest_planks_oak_painted_pink_front
+28,24=planks_oak_painted_pink
+28,26=chest_planks_oak_painted_lime_front
+28,27=planks_oak_painted_lime
+28,29=chest_planks_oak_painted_yellow_front
+28,30=planks_oak_painted_yellow
+29,20=chest_planks_oak_painted_lightblue_top
+29,21=chest_planks_oak_painted_lightblue_left_front
+29,22=chest_planks_oak_painted_lightblue_left_back
+29,23=chest_planks_oak_painted_magenta_top
+29,24=chest_planks_oak_painted_magenta_left_front
+29,25=chest_planks_oak_painted_magenta_left_back
+29,26=chest_planks_oak_painted_orange_top
+29,27=chest_planks_oak_painted_orange_left_front
+29,28=chest_planks_oak_painted_orange_left_back
+29,29=chest_planks_oak_painted_white_top
+29,30=chest_planks_oak_painted_white_left_front
+29,31=chest_planks_oak_painted_white_left_back
+30,20=chest_planks_oak_painted_lightblue_side
+30,21=chest_planks_oak_painted_lightblue_right_front
+30,22=chest_planks_oak_painted_lightblue_right_back
+30,23=chest_planks_oak_painted_magenta_side
+30,24=chest_planks_oak_painted_magenta_right_front
+30,25=chest_planks_oak_painted_magenta_right_back
+30,26=chest_planks_oak_painted_orange_side
+30,27=chest_planks_oak_painted_orange_right_front
+30,28=chest_planks_oak_painted_orange_right_back
+30,29=chest_planks_oak_painted_white_side
+30,30=chest_planks_oak_painted_white_right_front
+30,31=chest_planks_oak_painted_white_right_back
+31,20=chest_planks_oak_painted_lightblue_front
+31,21=planks_oak_painted_lightblue
+31,23=chest_planks_oak_painted_magenta_front
+31,24=planks_oak_painted_magenta
+31,26=chest_planks_oak_painted_orange_front
+31,27=planks_oak_painted_orange
+31,29=chest_planks_oak_painted_white_front
+31,30=planks_oak_painted_white
\ No newline at end of file
diff --git a/src/main/resources/title/mclogo.png b/src/main/resources/title/mclogo.png
deleted file mode 100644
index 288cbdd7e..000000000
Binary files a/src/main/resources/title/mclogo.png and /dev/null differ
