diff --git a/po/en/minetest.pot b/po/en/minetest.pot
index e242c494b5f0569e4665866878ee750a0c89ead1..8fbac78d0b3c05dbff1828850f74beea1a8eb04d 100644
--- a/po/en/minetest.pot
+++ b/po/en/minetest.pot
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: minetest\n"
+"Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-07-22 11:02+0200\n"
+"POT-Creation-Date: 2011-07-24 11:32+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/src/map.cpp b/src/map.cpp
index 1c63943c4c775f696a8bebef3b428b5b8f6bb85b..f0ea2f6f1f84f346b8988c0ce7ab56a79baca625 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2012,8 +2012,8 @@ ServerMap::~ServerMap()
 
 void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos)
 {
-	/*dstream<<"initBlockMake(): ("<<blockpos.X<<","<<blockpos.Y<<","
-			<<blockpos.Z<<")"<<std::endl;*/
+	dstream<<"initBlockMake(): ("<<blockpos.X<<","<<blockpos.Y<<","
+			<<blockpos.Z<<")"<<std::endl;
 	
 	// Do nothing if not inside limits (+-1 because of neighbors)
 	if(blockpos_over_limit(blockpos - v3s16(1,1,1)) ||
@@ -2043,25 +2043,28 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos)
 
 			for(s16 y=-1; y<=1; y++)
 			{
-				//MapBlock *block = createBlock(blockpos);
+				v3s16 p(blockpos.X+x, blockpos.Y+y, blockpos.Z+z);
+				//MapBlock *block = createBlock(p);
 				// 1) get from memory, 2) load from disk
-				MapBlock *block = emergeBlock(blockpos, false);
+				MapBlock *block = emergeBlock(p, false);
 				// 3) create a blank one
 				if(block == NULL)
-					block = createBlock(blockpos);
+				{
+					block = createBlock(p);
+
+					/*
+						Block gets sunlight if this is true.
+
+						Refer to the map generator heuristics.
+					*/
+					bool ug = mapgen::block_is_underground(data->seed, p);
+					block->setIsUnderground(ug);
+				}
 
 				// Lighting will not be valid after make_chunk is called
 				block->setLightingExpired(true);
 				// Lighting will be calculated
 				//block->setLightingExpired(false);
-
-				/*
-					Block gets sunlight if this is true.
-
-					This should be set to true when the top side of a block
-					is completely exposed to the sky.
-				*/
-				block->setIsUnderground(false);
 			}
 		}
 	}
@@ -2137,10 +2140,14 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
 	assert(block);
 
 	/*
-		Set is_underground flag for lighting with sunlight
+		Set is_underground flag for lighting with sunlight.
+
+		Refer to map generator heuristics.
+
+		NOTE: This is done in initChunkMake
 	*/
+	//block->setIsUnderground(mapgen::block_is_underground(data->seed, blockpos));
 
-	block->setIsUnderground(mapgen::block_is_underground(data->seed, blockpos));
 
 	/*
 		Add sunlight to central block.
@@ -2171,6 +2178,13 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
 #if 1
 		// Center block
 		lighting_update_blocks.insert(block->getPos(), block);
+
+		/*{
+			s16 x = 0;
+			s16 z = 0;
+			v3s16 p = block->getPos()+v3s16(x,1,z);
+			lighting_update_blocks[p] = getBlockNoCreateNoEx(p);
+		}*/
 #endif
 #if 0
 		// All modified blocks
@@ -2187,8 +2201,28 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
 			lighting_update_blocks.insert(i.getNode()->getKey(),
 					i.getNode()->getValue());
 		}
+		/*// Also force-add all the upmost blocks for proper sunlight
+		for(s16 x=-1; x<=1; x++)
+		for(s16 z=-1; z<=1; z++)
+		{
+			v3s16 p = block->getPos()+v3s16(x,1,z);
+			lighting_update_blocks[p] = getBlockNoCreateNoEx(p);
+		}*/
 #endif
 		updateLighting(lighting_update_blocks, changed_blocks);
+		
+		/*
+			Set lighting to non-expired state in all of them.
+			This is cheating, but it is not fast enough if all of them
+			would actually be updated.
+		*/
+		for(s16 x=-1; x<=1; x++)
+		for(s16 y=-1; y<=1; y++)
+		for(s16 z=-1; z<=1; z++)
+		{
+			v3s16 p = block->getPos()+v3s16(x,y,z);
+			getBlockNoCreateNoEx(p)->setLightingExpired(false);
+		}
 
 		if(enable_mapgen_debug_info == false)
 			t.stop(true); // Hide output
@@ -2479,7 +2513,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool allow_generate)
 	
 	{
 		MapBlock *block = getBlockNoCreateNoEx(p);
-		if(block)
+		if(block && block->isDummy() == false)
 			return block;
 	}
 
@@ -4081,10 +4115,16 @@ void ManualMapVoxelManipulator::blitBackAll(
 			i = m_loaded_blocks.getIterator();
 			i.atEnd() == false; i++)
 	{
+		v3s16 p = i.getNode()->getKey();
 		bool existed = i.getNode()->getValue();
 		if(existed == false)
+		{
+			// The Great Bug was found using this
+			/*dstream<<"ManualMapVoxelManipulator::blitBackAll: "
+					<<"Inexistent ("<<p.X<<","<<p.Y<<","<<p.Z<<")"
+					<<std::endl;*/
 			continue;
-		v3s16 p = i.getNode()->getKey();
+		}
 		MapBlock *block = m_map->getBlockNoCreateNoEx(p);
 		if(block == NULL)
 		{
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index ead26dd1f8088ccaf8a4a2037ef5abb36f02eec7..49d215bf6d5b2f14a7a1eff78a4595533b9fd57d 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -242,7 +242,12 @@ bool MapBlock::propagateSunlight(core::map<v3s16, bool> & light_sources,
 			// Check if node above block has sunlight
 			try{
 				MapNode n = getNodeParent(v3s16(x, MAP_BLOCKSIZE, z));
-				if(n.getContent() == CONTENT_IGNORE || n.getLight(LIGHTBANK_DAY) != LIGHT_SUN)
+				if(n.getContent() == CONTENT_IGNORE)
+				{
+					// Trust heuristics
+					no_sunlight = is_underground;
+				}
+				else if(n.getLight(LIGHTBANK_DAY) != LIGHT_SUN)
 				{
 					no_sunlight = true;
 				}