diff --git a/src/main/java/net/minecraft/client/render/FallbackRenderer.java b/src/main/java/net/minecraft/client/render/FallbackRenderer.java
index 0c1a3789e..c1926da15 100644
--- a/src/main/java/net/minecraft/client/render/FallbackRenderer.java
+++ b/src/main/java/net/minecraft/client/render/FallbackRenderer.java
@@ -9,19 +9,24 @@ public class FallbackRenderer implements Renderer {
 	public FallbackRenderer(Minecraft minecraft) {
 		mc = minecraft;
 	}
-	
+
 	@Override
 	public void beginRenderGame(float partialTicks) {
 		
 	}
 
 	@Override
-	public void endRenderGame(float partialTicks) {
+	public void beginRenderWorld(float partialTicks) {
 		
 	}
 
 	@Override
-	public void beginRenderWorld(float partialTicks) {
+	public void beginRenderClouds(float partialTicks) {
+		
+	}
+
+	@Override
+	public void endRenderClouds(float partialTicks) {
 		
 	}
 
@@ -30,6 +35,11 @@ public class FallbackRenderer implements Renderer {
 		
 	}
 
+	@Override
+	public void endRenderGame(float partialTicks) {
+		
+	}
+
 	@Override
 	public void reload() {
 		
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index a3cdcfc8b..465418447 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -994,7 +994,8 @@ public class RenderGlobal
 
     public void renderCloudsFancy(float partialTick)
     {
-        glDisable(GL_FOG);
+    	mc.renderer.beginRenderClouds(partialTick);
+    	
         float celestialAngle = worldObj.getCelestialAngle(partialTick);
         float[] sunriseColor = worldObj.worldType.getSunriseColor(celestialAngle, partialTick);
         float rSun = 0.0f, gSun = 0.0f, bSun = 0.0f, aSun = 0.0f;
@@ -1006,9 +1007,9 @@ public class RenderGlobal
         }
 
         Vec3d dimensionColor = worldObj.getDimensionColor(mc.activeCamera, partialTick);
-        float rDim = (float)dimensionColor.xCoord;
-        float gDim = (float)dimensionColor.yCoord;
-        float bDim = (float)dimensionColor.zCoord;
+        final float rDim = (float)dimensionColor.xCoord;
+        final float gDim = (float)dimensionColor.yCoord;
+        final float bDim = (float)dimensionColor.zCoord;
 
         GL11.glDisable(GL11.GL_CULL_FACE);
         float cameraY = (float) mc.activeCamera.getY(partialTick);
@@ -1031,10 +1032,14 @@ public class RenderGlobal
         float f14 = (float)(dx - (double) MathHelper.floor_double(dx));
         float f15 = (float)(dz - (double) MathHelper.floor_double(dz));
         int cloudWidthScale = 8;
-        byte radius = 8;
+        byte radius = 3;
         float f16 = 1F / 1024F;
         GL11.glScalef(cloudWidth, 1.0F, cloudWidth);
-        double maxDistance = Math.sqrt(Math.pow(6, 2) * 2);
+        
+        float red = rDim + (rSun - rDim) * aSun;
+        float green = gDim + (gSun - gDim) * aSun;
+        float blue = bDim + (bSun - bDim) * aSun;
+        
         for(int l = 0; l < 2; l++)
         {
             if(l == 0)
@@ -1050,14 +1055,6 @@ public class RenderGlobal
             {
                 for(int iz = -radius - 1; iz <= radius; iz++)
                 {
-                    double distance = Math.sqrt(Math.pow(ix, 2) + Math.pow(iz, 2));
-                    float distanceFactor = (1f - (float)(distance / maxDistance));
-                    if (distanceFactor > 0.75f) distanceFactor = 0.75f;
-                    distanceFactor *= 1.333333f;
-
-                    float red = rDim + (rSun - rDim) * aSun;
-                    float green = gDim + (gSun - gDim) * aSun;
-                    float blue = bDim + (bSun - bDim) * aSun;
 
                     float f17 = ix * cloudWidthScale;
                     float f18 = iz * cloudWidthScale;
@@ -1065,7 +1062,7 @@ public class RenderGlobal
                     float cloudZ = f18 - f15;
                     if(dy > -cloudThickness - 1.0F)
                     {
-                        tessellator.setColorRGBA_F(red * 0.7F, green * 0.7F, blue * 0.7F, 0.8F * distanceFactor);
+                        tessellator.setColorRGBA_F(red * 0.7F, green * 0.7F, blue * 0.7F, 0.8F);
                         tessellator.setNormal(0.0F, -1F, 0.0F);
                         tessellator.addVertexWithUV(cloudX + 0.0F, dy + 0.0F, cloudZ + (float)cloudWidthScale, (f17 + 0.0F) * f13 + f9, (f18 + (float)cloudWidthScale) * f13 + f11);
                         tessellator.addVertexWithUV(cloudX + (float)cloudWidthScale, dy + 0.0F, cloudZ + (float)cloudWidthScale, (f17 + (float)cloudWidthScale) * f13 + f9, (f18 + (float)cloudWidthScale) * f13 + f11);
@@ -1074,14 +1071,14 @@ public class RenderGlobal
                     }
                     if(dy <= cloudThickness + 1.0F)
                     {
-                        tessellator.setColorRGBA_F(red, green, blue, 0.8F * distanceFactor);
+                        tessellator.setColorRGBA_F(red, green, blue, 0.8F);
                         tessellator.setNormal(0.0F, 1.0F, 0.0F);
                         tessellator.addVertexWithUV(cloudX + 0.0F, (dy + cloudThickness) - f16, cloudZ + (float)cloudWidthScale, (f17 + 0.0F) * f13 + f9, (f18 + (float)cloudWidthScale) * f13 + f11);
                         tessellator.addVertexWithUV(cloudX + (float)cloudWidthScale, (dy + cloudThickness) - f16, cloudZ + (float)cloudWidthScale, (f17 + (float)cloudWidthScale) * f13 + f9, (f18 + (float)cloudWidthScale) * f13 + f11);
                         tessellator.addVertexWithUV(cloudX + (float)cloudWidthScale, (dy + cloudThickness) - f16, cloudZ + 0.0F, (f17 + (float)cloudWidthScale) * f13 + f9, (f18 + 0.0F) * f13 + f11);
                         tessellator.addVertexWithUV(cloudX + 0.0F, (dy + cloudThickness) - f16, cloudZ + 0.0F, (f17 + 0.0F) * f13 + f9, (f18 + 0.0F) * f13 + f11);
                     }
-                    tessellator.setColorRGBA_F(red * 0.9F, green * 0.9F, blue * 0.9F, 0.8F * distanceFactor);
+                    tessellator.setColorRGBA_F(red * 0.9F, green * 0.9F, blue * 0.9F, 0.8F);
                     if(ix > -1)
                     {
                         tessellator.setNormal(-1F, 0.0F, 0.0F);
@@ -1106,7 +1103,7 @@ public class RenderGlobal
                         }
 
                     }
-                    tessellator.setColorRGBA_F(red * 0.8F, green * 0.8F, blue * 0.8F, 0.8F * distanceFactor);
+                    tessellator.setColorRGBA_F(red * 0.8F, green * 0.8F, blue * 0.8F, 0.8F);
                     if(iz > -1)
                     {
                         tessellator.setNormal(0.0F, 0.0F, -1F);
@@ -1141,6 +1138,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*/);
+        
+    	mc.renderer.endRenderClouds(partialTick);
     }
 
     public boolean updateRenderers(ICamera camera)
diff --git a/src/main/java/net/minecraft/client/render/Renderer.java b/src/main/java/net/minecraft/client/render/Renderer.java
index 02e90068a..0788746e4 100644
--- a/src/main/java/net/minecraft/client/render/Renderer.java
+++ b/src/main/java/net/minecraft/client/render/Renderer.java
@@ -4,12 +4,16 @@ public interface Renderer {
 	
 	public void beginRenderGame(float partialTicks);
 	
-	public void endRenderGame(float partialTicks);
-	
 	public void beginRenderWorld(float partialTicks);
 	
+	public void beginRenderClouds(float partialTicks);
+	
+	public void endRenderClouds(float partialTicks);
+	
 	public void endRenderWorld(float partialTicks);
 	
+	public void endRenderGame(float partialTicks);
+	
 	public void reload();
 	
 	public void delete();
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 38026b551..6a3e0ea67 100644
--- a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
+++ b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
@@ -7,6 +7,10 @@ import static org.lwjgl.opengl.GL20.*;
 
 import java.io.File;
 import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import org.lwjgl.util.vector.Matrix4f;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Framebuffer;
@@ -29,6 +33,7 @@ public class ShadersRenderer implements Renderer {
 	
 	protected final Shader postShader = new Shader();
 	protected final Shader finalShader = new Shader();
+	protected final Shader cloudsShader = new Shader();
 	
 	protected ShaderProvider internal = new ShaderProviderInternal("/shaders/");
 	
@@ -37,6 +42,9 @@ public class ShadersRenderer implements Renderer {
 	
 	public int renderWidth;
 	public int renderHeight;
+	
+	protected FloatBuffer matrixBuffer = ByteBuffer.allocateDirect(64).order(ByteOrder.nativeOrder()).asFloatBuffer();
+	protected Matrix4f matrix = new Matrix4f();
 
 	public ShadersRenderer(Minecraft minecraft) {
 		mc = minecraft;
@@ -97,6 +105,41 @@ public class ShadersRenderer implements Renderer {
 		OpenGLHelper.checkError("begin render world");
 	}
 
+	@Override
+	public void beginRenderClouds(float partialTicks) {
+		if(mc.gameSettings.clouds.value && mc.gameSettings.fancyGraphics.value == 1 && cloudsShader.isEnabled()) {
+			OpenGLHelper.checkError("pre setup clouds");
+			
+			cloudsShader.bind();
+			
+			// Read projection matrix, invert it, and send it to the shader
+			matrixBuffer.clear();
+			glGetFloat(GL_PROJECTION_MATRIX, matrixBuffer);
+			
+			matrixBuffer.position(0);
+			matrix.load(matrixBuffer);
+			
+			Matrix4f.invert(matrix, matrix);
+			
+			matrixBuffer.clear();
+			matrix.store(matrixBuffer);
+			
+			matrixBuffer.position(0);
+			matrixBuffer.limit(16);
+			glUniformMatrix4(cloudsShader.getUniform("gbufferProjectionInverse"), false, matrixBuffer);
+			
+			glUniform1f(cloudsShader.getUniform("viewWidth"), renderWidth);
+			glUniform1f(cloudsShader.getUniform("viewHeight"), renderHeight);
+			
+			OpenGLHelper.checkError("setup clouds");
+		}
+	}
+
+	@Override
+	public void endRenderClouds(float partialTicks) {
+		glUseProgram(0);
+	}
+
 	@Override
 	public void endRenderWorld(float partialTicks) {
 		OpenGLHelper.checkError("pre end render world");
@@ -209,12 +252,14 @@ public class ShadersRenderer implements Renderer {
 		
 		postShader.delete();
 		finalShader.delete();
+		cloudsShader.delete();
 		
 		ShaderProvider shaderProvider = getShader();
 		
 		if(shaderProvider != null) {
 			finalShader.compile(shaderProvider, "base");
 			postShader.compile(shaderProvider, "post");
+			cloudsShader.compile(shaderProvider, "clouds");
 		}
 		
 		OpenGLHelper.checkError("shader reload");
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index 12f58671e..957b0eb7d 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -263,21 +263,6 @@ public class Block
         return blockAccess.getBlockMaterial(x, y, z).isSolid();
     }
 
-    public int getBlockTexture(WorldSource blockAccess, int x, int y, int z, Side side)
-    {
-        return getBlockTextureFromSideAndMetadata(side, blockAccess.getBlockMetadata(x, y, z));
-    }
-    
-    public int getBlockOverbrightTexture(WorldSource blockAccess, int x, int y, int z, int side)
-    {
-        return -1;
-    }
-
-    public int getBlockTextureFromSideAndMetadata(Side side, int data)
-    {
-        return atlasIndices[side.getId()];
-    }
-
     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);
@@ -672,18 +657,6 @@ public class Block
         int l = world.getBlockId(x, y, z);
         return l != 0 && blocksList[l] != null && blocksList[l].isLitInteriorSurface;
     }
-    
-    public Block withOverbright()
-    {
-    	hasOverbright = true;
-    	return this;
-    }
-    
-    public static boolean getHasOverbright(World world, int x, int y, int z)
-    {
-    	int id = world.getBlockId(x, y, z);
-    	return id != 0 && blocksList[id] != null && blocksList[id].hasOverbright;
-    }
 
     @SafeVarargs
     public final Block withTags(Tag<Block>... tags)
@@ -1182,7 +1155,7 @@ public class Block
             .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).withOverbright()
+    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);
@@ -1387,7 +1360,7 @@ public class Block
 
     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).withOverbright().withHardness(1.25F).withBlastResistance(7F).withLightEmission(10)
+    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)
@@ -1447,7 +1420,6 @@ public class Block
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
 
-    public int[] atlasIndices = new int[6];
     public final int id;
     protected float blockHardness;
     protected float blastResistance;
@@ -1464,7 +1436,6 @@ public class Block
     public final Material blockMaterial;
     public float movementScale;
     protected String key;
-    public boolean hasOverbright = false;
     public int dropOverride = -1;
     public boolean immovable = false;
     @NotNull
diff --git a/src/main/resources/shaders/clouds.fsh b/src/main/resources/shaders/clouds.fsh
new file mode 100644
index 000000000..a6ce4841b
--- /dev/null
+++ b/src/main/resources/shaders/clouds.fsh
@@ -0,0 +1,44 @@
+#version 120
+
+#define FOG
+#define RADIAL_FOG
+
+uniform sampler2D texture;
+
+#ifdef RADIAL_FOG
+uniform mat4 gbufferProjectionInverse;
+uniform float viewWidth;
+uniform float viewHeight;
+#endif
+
+varying vec2 texcoord;
+varying vec4 color;
+
+void main() {
+	vec4 col = color;
+	
+	#ifdef FOG
+	float fogStrength = 0.0f;
+	
+	#ifndef RADIAL_FOG
+	fogStrength = (gl_FogFragCoord - gl_Fog.start) * gl_Fog.scale;
+	#endif
+	
+	#ifdef RADIAL_FOG
+	vec4 fragPos = gbufferProjectionInverse * vec4((gl_FragCoord.xy / vec2(viewWidth, viewHeight)) * 2.0f - 1.0f, gl_FragCoord.z * 2.0f - 1.0f, 1.0f);
+	fragPos /= fragPos.w;
+	
+	float dist = length(fragPos.xyz);
+	float end = gl_Fog.end;
+	float start = gl_Fog.start / gl_Fog.end;
+	
+	fogStrength = dist / end;
+	fogStrength -= (start);
+	fogStrength /= (1.0f - start);
+	fogStrength = clamp(fogStrength, 0.0f, 1.0f);
+	#endif
+	col.a *= 1.0f - fogStrength;
+	#endif
+	
+	gl_FragData[0] = texture2D(texture, texcoord) * col;
+}
\ No newline at end of file
diff --git a/src/main/resources/shaders/clouds.vsh b/src/main/resources/shaders/clouds.vsh
new file mode 100644
index 000000000..0a5f716c5
--- /dev/null
+++ b/src/main/resources/shaders/clouds.vsh
@@ -0,0 +1,12 @@
+#version 120
+
+varying vec2 texcoord;
+varying vec4 color;
+
+void main() {
+	texcoord = gl_MultiTexCoord0.xy;
+	color = gl_Color;
+	
+	gl_Position = ftransform();
+	gl_FogFragCoord = gl_Position.z;
+}
\ No newline at end of file
