--- ../src-base/minecraft/net/minecraft/world/WorldProvider.java
+++ ../src-work/minecraft/net/minecraft/world/WorldProvider.java
@@ -141,13 +141,13 @@
 
     public static WorldProvider func_76570_a(int p_76570_0_)
     {
-        return (WorldProvider)(p_76570_0_ == -1 ? new WorldProviderHell() : (p_76570_0_ == 0 ? new WorldProviderSurface() : (p_76570_0_ == 1 ? new WorldProviderEnd() : null)));
+        return net.minecraftforge.common.DimensionManager.createProviderFor(p_76570_0_);
     }
 
     @SideOnly(Side.CLIENT)
     public float func_76571_f()
     {
-        return 128.0F;
+        return this.field_76577_b.getCloudHeight();
     }
 
     @SideOnly(Side.CLIENT)
@@ -211,4 +211,319 @@
     {
         return new WorldBorder();
     }
+
+    /*======================================= Forge Start =========================================*/
+    private net.minecraftforge.client.IRenderHandler skyRenderer = null;
+    private net.minecraftforge.client.IRenderHandler cloudRenderer = null;
+    private net.minecraftforge.client.IRenderHandler weatherRenderer = null;
+
+    /**
+     * Sets the providers current dimension ID, used in default getSaveFolder()
+     * Added to allow default providers to be registered for multiple dimensions.
+     *
+     * @param dim Dimension ID
+     */
+    public void setDimension(int dim)
+    {
+        this.field_76574_g = dim;
+    }
+
+    /**
+     * Returns the sub-folder of the world folder that this WorldProvider saves to.
+     * EXA: DIM1, DIM-1
+     * @return The sub-folder name to save this world's chunks to.
+     */
+    public String getSaveFolder()
+    {
+        return (field_76574_g == 0 ? null : "DIM" + field_76574_g);
+    }
+
+    /**
+     * A message to display to the user when they transfer to this dimension.
+     *
+     * @return The message to be displayed
+     */
+    public String getWelcomeMessage()
+    {
+        if (this instanceof WorldProviderEnd)
+        {
+            return "Entering the End";
+        }
+        else if (this instanceof WorldProviderHell)
+        {
+            return "Entering the Nether";
+        }
+        return null;
+    }
+
+    /**
+     * A Message to display to the user when they transfer out of this dismension.
+     *
+     * @return The message to be displayed
+     */
+    public String getDepartMessage()
+    {
+        if (this instanceof WorldProviderEnd)
+        {
+            return "Leaving the End";
+        }
+        else if (this instanceof WorldProviderHell)
+        {
+            return "Leaving the Nether";
+        }
+        return null;
+    }
+
+    /**
+     * The dimensions movement factor. Relative to normal overworld.
+     * It is applied to the players position when they transfer dimensions.
+     * Exa: Nether movement is 8.0
+     * @return The movement factor
+     */
+    public double getMovementFactor()
+    {
+        if (this instanceof WorldProviderHell)
+        {
+            return 8.0;
+        }
+        return 1.0;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public net.minecraftforge.client.IRenderHandler getSkyRenderer()
+    {
+        return this.skyRenderer;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public void setSkyRenderer(net.minecraftforge.client.IRenderHandler skyRenderer)
+    {
+        this.skyRenderer = skyRenderer;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public net.minecraftforge.client.IRenderHandler getCloudRenderer()
+    {
+        return cloudRenderer;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public void setCloudRenderer(net.minecraftforge.client.IRenderHandler renderer)
+    {
+        cloudRenderer = renderer;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public net.minecraftforge.client.IRenderHandler getWeatherRenderer()
+    {
+        return weatherRenderer;
+    }
+
+    @SideOnly(Side.CLIENT)
+    public void setWeatherRenderer(net.minecraftforge.client.IRenderHandler renderer)
+    {
+        weatherRenderer = renderer;
+    }
+
+    public BlockPos getRandomizedSpawnPoint()
+    {
+        BlockPos ret = this.field_76579_a.func_175694_M();
+
+        boolean isAdventure = field_76579_a.func_72912_H().func_76077_q() == WorldSettings.GameType.ADVENTURE;
+        int spawnFuzz = field_76577_b.getSpawnFuzz();
+        int border = MathHelper.func_76128_c(field_76579_a.func_175723_af().func_177729_b(ret.func_177958_n(), ret.func_177952_p()));
+        if (border < spawnFuzz) spawnFuzz = border;
+        if (spawnFuzz < 1) spawnFuzz = 1;
+        int spawnFuzzHalf = spawnFuzz / 2;
+
+        if (!func_177495_o() && !isAdventure)
+        {
+            ret = field_76579_a.func_175672_r(ret.func_177982_a(field_76579_a.field_73012_v.nextInt(spawnFuzzHalf) - spawnFuzz, 0, field_76579_a.field_73012_v.nextInt(spawnFuzzHalf) - spawnFuzz));
+        }
+
+        return ret;
+    }
+    /**
+     * Determine if the cursor on the map should 'spin' when rendered, like it does for the player in the nether.
+     *
+     * @param entity The entity holding the map, playername, or frame-ENTITYID
+     * @param x X Position
+     * @param y Y Position
+     * @param z Z Position
+     * @return True to 'spin' the cursor
+     */
+    public boolean shouldMapSpin(String entity, double x, double y, double z)
+    {
+        return field_76574_g < 0;
+    }
+
+    /**
+     * Determines the dimension the player will be respawned in, typically this brings them back to the overworld.
+     *
+     * @param player The player that is respawning
+     * @return The dimension to respawn the player in
+     */
+    public int getRespawnDimension(net.minecraft.entity.player.EntityPlayerMP player)
+    {
+        return 0;
+    }
+
+    /*======================================= Start Moved From World =========================================*/
+
+    public BiomeGenBase getBiomeGenForCoords(BlockPos pos)
+    {
+        return field_76579_a.getBiomeGenForCoordsBody(pos);
+    }
+
+    public boolean isDaytime()
+    {
+        return field_76579_a.func_175657_ab() < 4;
+    }
+
+    /**
+     * The current sun brightness factor for this dimension.
+     * 0.0f means no light at all, and 1.0f means maximum sunlight.
+     * This will be used for the "calculateSkylightSubtracted"
+     * which is for Sky light value calculation.
+     *
+     * @return The current brightness factor
+     * */
+    public float getSunBrightnessFactor(float par1)
+    {
+        return field_76579_a.getSunBrightnessFactor(par1);
+    }
+
+    /**
+     * Calculates the current moon phase factor.
+     * This factor is effective for slimes.
+     * (This method do not affect the moon rendering)
+     * */
+    public float getCurrentMoonPhaseFactor()
+    {
+        return field_76579_a.getCurrentMoonPhaseFactorBody();
+    }
+
+    @SideOnly(Side.CLIENT)
+    public Vec3 getSkyColor(net.minecraft.entity.Entity cameraEntity, float partialTicks)
+    {
+        return field_76579_a.getSkyColorBody(cameraEntity, partialTicks);
+    }
+
+    @SideOnly(Side.CLIENT)
+    public Vec3 drawClouds(float partialTicks)
+    {
+        return field_76579_a.drawCloudsBody(partialTicks);
+    }
+
+    /**
+     * Gets the Sun Brightness for rendering sky.
+     * */
+    @SideOnly(Side.CLIENT)
+    public float getSunBrightness(float par1)
+    {
+        return field_76579_a.getSunBrightnessBody(par1);
+    }
+
+    /**
+     * Gets the Star Brightness for rendering sky.
+     * */
+    @SideOnly(Side.CLIENT)
+    public float getStarBrightness(float par1)
+    {
+        return field_76579_a.getStarBrightnessBody(par1);
+    }
+
+    public void setAllowedSpawnTypes(boolean allowHostile, boolean allowPeaceful)
+    {
+        field_76579_a.field_72985_G = allowHostile;
+        field_76579_a.field_72992_H = allowPeaceful;
+    }
+
+    public void calculateInitialWeather()
+    {
+        field_76579_a.calculateInitialWeatherBody();
+    }
+
+    public void updateWeather()
+    {
+        field_76579_a.updateWeatherBody();
+    }
+
+    public boolean canBlockFreeze(BlockPos pos, boolean byWater)
+    {
+        return field_76579_a.canBlockFreezeBody(pos, byWater);
+    }
+
+    public boolean canSnowAt(BlockPos pos, boolean checkLight)
+    {
+        return field_76579_a.canSnowAtBody(pos, checkLight);
+    }
+    public void setWorldTime(long time)
+    {
+        field_76579_a.field_72986_A.func_76068_b(time);
+    }
+
+    public long getSeed()
+    {
+        return field_76579_a.field_72986_A.func_76063_b();
+    }
+
+    public long getWorldTime()
+    {
+        return field_76579_a.field_72986_A.func_76073_f();
+    }
+
+    public BlockPos getSpawnPoint()
+    {
+        net.minecraft.world.storage.WorldInfo info = field_76579_a.field_72986_A;
+        return new BlockPos(info.func_76079_c(), info.func_76075_d(), info.func_76074_e());
+    }
+
+    public void setSpawnPoint(BlockPos pos)
+    {
+        field_76579_a.field_72986_A.func_176143_a(pos);
+    }
+
+    public boolean canMineBlock(net.minecraft.entity.player.EntityPlayer player, BlockPos pos)
+    {
+        return field_76579_a.canMineBlockBody(player, pos);
+    }
+
+    public boolean isBlockHighHumidity(BlockPos pos)
+    {
+        return field_76579_a.func_180494_b(pos).func_76736_e();
+    }
+
+    public int getHeight()
+    {
+        return 256;
+    }
+
+    public int getActualHeight()
+    {
+        return field_76576_e ? 128 : 256;
+    }
+
+    public double getHorizon()
+    {
+        return field_76579_a.field_72986_A.func_76067_t().getHorizon(field_76579_a);
+    }
+
+    public void resetRainAndThunder()
+    {
+        field_76579_a.field_72986_A.func_76080_g(0);
+        field_76579_a.field_72986_A.func_76084_b(false);
+        field_76579_a.field_72986_A.func_76090_f(0);
+        field_76579_a.field_72986_A.func_76069_a(false);
+    }
+
+    public boolean canDoLightning(net.minecraft.world.chunk.Chunk chunk)
+    {
+        return true;
+    }
+
+    public boolean canDoRainSnowIce(net.minecraft.world.chunk.Chunk chunk)
+    {
+        return true;
+    }
 }
