diff --git a/minetest.conf.example b/minetest.conf.example
index fa54bde8dc0cdecd9b64c06992b0b06afdd61302..674d253fbd25528c2ebdb91ef3ddcfee7b5237ca 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -281,10 +281,6 @@
 #disable_anticheat = false
 # If true, actions are recorded for rollback
 #enable_rollback_recording = false
-# If true, blocks are cached (and generated if not before) before a player is spawned.
-#cache_block_before_spawn = true
-# Defines the maximum height a player can spawn in a map, above water level
-#max_spawn_height = 50
 
 # Profiler data print interval. #0 = disable.
 #profiler_print_interval = 0
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index a7187faea9a662868e0669faf2c4954076e26cb0..659682b8f1ee3056c59b2d87425b4b919171295c 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -189,8 +189,6 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("disallow_empty_password", "false");
 	settings->setDefault("disable_anticheat", "false");
 	settings->setDefault("enable_rollback_recording", "false");
-	settings->setDefault("cache_block_before_spawn", "true");
-	settings->setDefault("max_spawn_height", "50");
 
 	settings->setDefault("profiler_print_interval", "0");
 	settings->setDefault("enable_mapgen_debug_info", "false");
diff --git a/src/map.cpp b/src/map.cpp
index 55f91c8a6117f8b982e40c9ba6aa4c36750c9883..4d32ecdfe8418f828ff9109584dd3c298346a855 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -3185,56 +3185,48 @@ void ServerMap::prepareBlock(MapBlock *block) {
 	}
 }
 
-/**
- * Get the ground level by searching for a non CONTENT_AIR node in a column from top to bottom
- */
-s16 ServerMap::findGroundLevel(v2s16 p2d, bool cacheBlocks)
+s16 ServerMap::findGroundLevel(v2s16 p2d)
 {
-	
-	s16 level;
-
-	// The reference height is the original mapgen height
-	s16 referenceHeight = m_emerge->getGroundLevelAtPoint(p2d);
-	s16 maxSearchHeight =  63 + referenceHeight;
-	s16 minSearchHeight = -63 + referenceHeight;
-	v3s16 probePosition(p2d.X, maxSearchHeight, p2d.Y);
-	v3s16 blockPosition = getNodeBlockPos(probePosition);
-	v3s16 prevBlockPosition = blockPosition;
-
-	// Cache the block to be inspected.
-	if(cacheBlocks) {
-		emergeBlock(blockPosition, true);
-	}
-
-	// Probes the nodes in the given column
-	for(; probePosition.Y > minSearchHeight; probePosition.Y--)
+#if 0
+	/*
+		Uh, just do something random...
+	*/
+	// Find existing map from top to down
+	s16 max=63;
+	s16 min=-64;
+	v3s16 p(p2d.X, max, p2d.Y);
+	for(; p.Y>min; p.Y--)
 	{
-		if(cacheBlocks) {
-			// Calculate the block position of the given node
-			blockPosition = getNodeBlockPos(probePosition); 
-
-			// If the node is in an different block, cache it
-			if(blockPosition != prevBlockPosition) {
-				emergeBlock(blockPosition, true);
-				prevBlockPosition = blockPosition;
-			}
-		}
-
-		MapNode node = getNodeNoEx(probePosition);
-		if (node.getContent() != CONTENT_IGNORE &&
-		    node.getContent() != CONTENT_AIR) {
+		MapNode n = getNodeNoEx(p);
+		if(n.getContent() != CONTENT_IGNORE)
 			break;
-		}
 	}
-
-	// Could not determine the ground. Use map generator noise functions.
-	if(probePosition.Y == minSearchHeight) {
-		level = referenceHeight; 
-	} else {
-		level = probePosition.Y;
+	if(p.Y == min)
+		goto plan_b;
+	// If this node is not air, go to plan b
+	if(getNodeNoEx(p).getContent() != CONTENT_AIR)
+		goto plan_b;
+	// Search existing walkable and return it
+	for(; p.Y>min; p.Y--)
+	{
+		MapNode n = getNodeNoEx(p);
+		if(content_walkable(n.d) && n.getContent() != CONTENT_IGNORE)
+			return p.Y;
 	}
 
+	// Move to plan b
+plan_b:
+#endif
+
+	/*
+		Determine from map generator noise functions
+	*/
+
+	s16 level = m_emerge->getGroundLevelAtPoint(p2d);
 	return level;
+
+	//double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT;
+	//return (s16)level;
 }
 
 bool ServerMap::loadFromFolders() {
diff --git a/src/map.h b/src/map.h
index fa88109a3a57e2a16823af2a2cfa130a3068b3ef..5ec1a0b9d2f2833b99018345d67f9bb353e454a0 100644
--- a/src/map.h
+++ b/src/map.h
@@ -428,7 +428,7 @@ class ServerMap : public Map
 	void prepareBlock(MapBlock *block);
 
 	// Helper for placing objects on ground level
-	s16 findGroundLevel(v2s16 p2d, bool cacheBlocks);
+	s16 findGroundLevel(v2s16 p2d);
 
 	/*
 		Misc. helper functions for fiddling with directory and file
diff --git a/src/server.cpp b/src/server.cpp
index 0b3eb31a64e39670133e1753ea93b4153a642021..d8bedb260a39a9c7883680d977545e0663eb1a37 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -2300,9 +2300,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 		}
 
 		/*infostream<<"Server::ProcessData(): Moved player "<<peer_id<<" to "
-															<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
-															<<" pitch="<<pitch<<" yaw="<<yaw<<std::endl;*/
-
+				<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
+				<<" pitch="<<pitch<<" yaw="<<yaw<<std::endl;*/
 	}
 	else if(command == TOSERVER_GOTBLOCKS)
 	{
@@ -5336,10 +5335,10 @@ v3f findSpawnPos(ServerMap &map)
 				-range + (myrand() % (range * 2)));
 
 		// Get ground height at point
-		s16 groundheight = map.findGroundLevel(nodepos2d, g_settings->getBool("cache_block_before_spawn"));
+		s16 groundheight = map.findGroundLevel(nodepos2d);
 		if (groundheight <= water_level) // Don't go underwater
 			continue;
-		if (groundheight > water_level + g_settings->getS16("max_spawn_height")) // Don't go to high places
+		if (groundheight > water_level + 6) // Don't go to high places
 			continue;
 
 		nodepos = v3s16(nodepos2d.X, groundheight, nodepos2d.Y);