--- ../work/decompile-8eb82bde/net/minecraft/server/BiomeDecorator.java	2014-12-12 19:26:13.625913570 +0000
+++ src/main/java/net/minecraft/server/BiomeDecorator.java	2014-12-12 19:15:22.000000000 +0000
@@ -132,7 +132,7 @@
             WorldGenTreeAbstract worldgentreeabstract = biomebase.a(this.b);
 
             worldgentreeabstract.e();
-            blockposition = this.a.getHighestBlockYAt(this.c.a(k, 0, l));
+            blockposition = this.getHighestBlockYAt(this.c.a(k, 0, l)); // CraftBukkit - Prevent crash
             if (worldgentreeabstract.generate(this.a, this.b, blockposition)) {
                 worldgentreeabstract.a(this.a, this.b, blockposition);
             }
@@ -141,7 +141,7 @@
         for (j = 0; j < this.K; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            this.v.generate(this.a, this.b, this.a.getHighestBlockYAt(this.c.a(k, 0, l)));
+            this.v.generate(this.a, this.b, this.getHighestBlockYAt(this.c.a(k, 0, l ))); // CraftBukkit - Prevent crash
         }
 
         int i1;
@@ -149,7 +149,7 @@
         for (j = 0; j < this.B; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() + 32);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() + 32); // CraftBukkit - Prevent crash
             blockposition = this.c.a(k, i1, l);
             EnumFlowerVarient enumflowervarient = biomebase.a(this.b, blockposition);
             BlockFlowers blockflowers = enumflowervarient.a().a();
@@ -163,14 +163,14 @@
         for (j = 0; j < this.C; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             biomebase.b(this.b).generate(this.a, this.b, this.c.a(k, i1, l));
         }
 
         for (j = 0; j < this.D; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             (new WorldGenDeadBush()).generate(this.a, this.b, this.c.a(k, i1, l));
         }
 
@@ -179,7 +179,7 @@
         while (j < this.z) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             blockposition = this.c.a(k, i1, l);
 
             while (true) {
@@ -202,7 +202,7 @@
             if (this.b.nextInt(4) == 0) {
                 k = this.b.nextInt(16) + 8;
                 l = this.b.nextInt(16) + 8;
-                BlockPosition blockposition2 = this.a.getHighestBlockYAt(this.c.a(k, 0, l));
+                BlockPosition blockposition2 = this.getHighestBlockYAt(this.c.a(k, 0, l)); // CraftBukkit - Prevent crash
 
                 this.t.generate(this.a, this.b, blockposition2);
             }
@@ -210,7 +210,7 @@
             if (this.b.nextInt(8) == 0) {
                 k = this.b.nextInt(16) + 8;
                 l = this.b.nextInt(16) + 8;
-                i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+                i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
                 blockposition = this.c.a(k, i1, l);
                 this.u.generate(this.a, this.b, blockposition);
             }
@@ -219,42 +219,42 @@
         if (this.b.nextInt(4) == 0) {
             j = this.b.nextInt(16) + 8;
             k = this.b.nextInt(16) + 8;
-            l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2);
+            l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash
             this.t.generate(this.a, this.b, this.c.a(j, l, k));
         }
 
         if (this.b.nextInt(8) == 0) {
             j = this.b.nextInt(16) + 8;
             k = this.b.nextInt(16) + 8;
-            l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2);
+            l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash
             this.u.generate(this.a, this.b, this.c.a(j, l, k));
         }
 
         for (j = 0; j < this.F; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             this.w.generate(this.a, this.b, this.c.a(k, i1, l));
         }
 
         for (j = 0; j < 10; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             this.w.generate(this.a, this.b, this.c.a(k, i1, l));
         }
 
         if (this.b.nextInt(32) == 0) {
             j = this.b.nextInt(16) + 8;
             k = this.b.nextInt(16) + 8;
-            l = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2);
+            l = this.b.nextInt(this.getHighestBlockYAt(this.c.a(j, 0, k)).getY() * 2); // CraftBukkit - Prevent crash
             (new WorldGenPumpkin()).generate(this.a, this.b, this.c.a(j, l, k));
         }
 
         for (j = 0; j < this.G; ++j) {
             k = this.b.nextInt(16) + 8;
             l = this.b.nextInt(16) + 8;
-            i1 = this.b.nextInt(this.a.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2);
+            i1 = this.b.nextInt(this.getHighestBlockYAt(this.c.a(k, 0, l)).getY() * 2); // CraftBukkit - Prevent crash
             this.x.generate(this.a, this.b, this.c.a(k, i1, l));
         }
 
@@ -274,6 +274,16 @@
 
     }
 
+    // CraftBukkit start - The heightMap can be wrong calculated and return Y = 0 which will crash the Server
+    private BlockPosition getHighestBlockYAt( BlockPosition blockPosition ) {
+        BlockPosition returnBlockPosition = this.a.getHighestBlockYAt( blockPosition );
+        if ( returnBlockPosition.getY() == 0 ) {
+            returnBlockPosition = returnBlockPosition.up( 1 );
+        }
+        return returnBlockPosition;
+    }
+    // CraftBukkit end
+
     protected void a(int i, WorldGenerator worldgenerator, int j, int k) {
         int l;