--- ../src-base/minecraft/net/minecraft/world/gen/MapGenRavine.java
+++ ../src-work/minecraft/net/minecraft/world/gen/MapGenRavine.java
@@ -130,7 +130,7 @@
                                 {
                                     IBlockState iblockstate = p_180707_5_.func_177856_a(k2, i3, l2);
 
-                                    if (iblockstate.func_177230_c() == Blocks.field_150358_i || iblockstate.func_177230_c() == Blocks.field_150355_j)
+                                    if (isOceanBlock(p_180707_5_, k2, i2, l2, p_180707_3_, p_180707_4_))
                                     {
                                         flag2 = true;
                                     }
@@ -165,27 +165,12 @@
                                         {
                                             IBlockState iblockstate1 = p_180707_5_.func_177856_a(k2, j3, j4);
 
-                                            if (iblockstate1.func_177230_c() == Blocks.field_150349_c)
+                                            if (isTopBlock(p_180707_5_, k2, j3, j4, p_180707_3_, p_180707_4_))
                                             {
                                                 flag = true;
                                             }
 
-                                            if (iblockstate1.func_177230_c() == Blocks.field_150348_b || iblockstate1.func_177230_c() == Blocks.field_150346_d || iblockstate1.func_177230_c() == Blocks.field_150349_c)
-                                            {
-                                                if (j3 - 1 < 10)
-                                                {
-                                                    p_180707_5_.func_177855_a(k2, j3, j4, Blocks.field_150356_k.func_176223_P());
-                                                }
-                                                else
-                                                {
-                                                    p_180707_5_.func_177855_a(k2, j3, j4, Blocks.field_150350_a.func_176223_P());
-
-                                                    if (flag && p_180707_5_.func_177856_a(k2, j3 - 1, j4).func_177230_c() == Blocks.field_150346_d)
-                                                    {
-                                                        p_180707_5_.func_177855_a(k2, j3 - 1, j4, this.field_75039_c.func_180494_b(new BlockPos(k2 + p_180707_3_ * 16, 0, j4 + p_180707_4_ * 16)).field_76752_A);
-                                                    }
-                                                }
-                                            }
+                                            digBlock(p_180707_5_, k2, j3, j4, p_180707_3_, p_180707_4_, flag);
                                         }
                                     }
                                 }
@@ -220,4 +205,68 @@
             }
         }
     }
+    protected boolean isOceanBlock(ChunkPrimer data, int x, int y, int z, int chunkX, int chunkZ)
+    {
+        net.minecraft.block.Block block = data.func_177856_a(x, y, z).func_177230_c();
+        return block== Blocks.field_150358_i || block == Blocks.field_150355_j;
+    }
+
+    //Exception biomes to make sure we generate like vanilla
+    private boolean isExceptionBiome(net.minecraft.world.biome.BiomeGenBase biome)
+    {
+        if (biome == net.minecraft.world.biome.BiomeGenBase.field_76787_r) return true;
+        if (biome == net.minecraft.world.biome.BiomeGenBase.field_76769_d) return true;
+        if (biome == net.minecraft.world.biome.BiomeGenBase.field_76789_p) return true;
+        if (biome == net.minecraft.world.biome.BiomeGenBase.field_76788_q) return true;
+        return false;
+    }
+
+    //Determine if the block at the specified location is the top block for the biome, we take into account
+    //Vanilla bugs to make sure that we generate the map the same way vanilla does.
+    private boolean isTopBlock(ChunkPrimer data, int x, int y, int z, int chunkX, int chunkZ)
+    {
+        net.minecraft.world.biome.BiomeGenBase biome = field_75039_c.func_180494_b(new BlockPos(x + chunkX * 16, 0, z + chunkZ * 16));
+        IBlockState state = data.func_177856_a(x, y, z);
+        return (isExceptionBiome(biome) ? state.func_177230_c() == Blocks.field_150349_c : state.func_177230_c() == biome.field_76752_A);
+    }
+
+    /**
+     * Digs out the current block, default implementation removes stone, filler, and top block
+     * Sets the block to lava if y is less then 10, and air other wise.
+     * If setting to air, it also checks to see if we've broken the surface and if so
+     * tries to make the floor the biome's top block
+     *
+     * @param data Block data array
+     * @param index Pre-calculated index into block data
+     * @param x local X position
+     * @param y local Y position
+     * @param z local Z position
+     * @param chunkX Chunk X position
+     * @param chunkZ Chunk Y position
+     * @param foundTop True if we've encountered the biome's top block. Ideally if we've broken the surface.
+     */
+    protected void digBlock(ChunkPrimer data, int x, int y, int z, int chunkX, int chunkZ, boolean foundTop)
+    {
+        net.minecraft.world.biome.BiomeGenBase biome = field_75039_c.func_180494_b(new BlockPos(x + chunkX * 16, 0, z + chunkZ * 16));
+        IBlockState state = data.func_177856_a(x, y, z);
+        IBlockState top = isExceptionBiome(biome) ? Blocks.field_150349_c.func_176223_P() : biome.field_76752_A;
+        IBlockState filler = isExceptionBiome(biome) ? Blocks.field_150346_d.func_176223_P() : biome.field_76753_B;
+
+        if (state.func_177230_c() == Blocks.field_150348_b || state.func_177230_c() == top.func_177230_c() || state.func_177230_c() == filler.func_177230_c())
+        {
+            if (y < 10)
+            {
+                data.func_177855_a(x, y, z, Blocks.field_150353_l.func_176223_P());
+            }
+            else
+            {
+                data.func_177855_a(x, y, z, Blocks.field_150350_a.func_176223_P());
+
+                if (foundTop && data.func_177856_a(x, y - 1, z).func_177230_c() == filler.func_177230_c())
+                {
+                    data.func_177855_a(x, y - 1, z, top.func_177230_c().func_176223_P());
+                }
+            }
+        }
+    }
 }
