diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index e288e80f2c344ecc1095cf8788054a0130b75d97..f7efc4e18e10ccdcb380a6cb499e3863f73cb6ef 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -302,24 +302,25 @@ void MapgenV5::calculateNoise()
 	int y = node_min.Y - 1;
 	int z = node_min.Z;
 
-	noise_filler_depth->perlinMap2D(x, z);
 	noise_factor->perlinMap2D(x, z);
 	noise_height->perlinMap2D(x, z);
+	noise_ground->perlinMap3D(x, y, z);
 
 	if (flags & MG_CAVES) {
 		noise_cave1->perlinMap3D(x, y, z);
 		noise_cave2->perlinMap3D(x, y, z);
 	}
 
-	noise_ground->perlinMap3D(x, y, z);
-
 	if (spflags & MGV5_BLOBS) {
 		noise_crumble->perlinMap3D(x, y, z);
 		noise_wetness->perlinMap3D(x, y, z);
 	}
 
-	noise_heat->perlinMap2D(x, z);
-	noise_humidity->perlinMap2D(x, z);
+	if (node_max.Y >= water_level) {
+		noise_filler_depth->perlinMap2D(x, z);
+		noise_heat->perlinMap2D(x, z);
+		noise_humidity->perlinMap2D(x, z);
+	}
 
 	//printf("calculateNoise: %dus\n", t.stop());
 }
@@ -531,12 +532,12 @@ void MapgenV5::generateBlobs()
 
 void MapgenV5::dustTopNodes()
 {
+	if (node_max.Y < water_level)
+		return;
+
 	v3s16 em = vm->m_area.getExtent();
 	u32 index = 0;
 
-	if (water_level > node_max.Y)
-		return;
-
 	for (s16 z = node_min.Z; z <= node_max.Z; z++)
 	for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
 		Biome *biome = (Biome *)bmgr->get(biomemap[index]);