diff --git a/src/map.cpp b/src/map.cpp
index e47b1b212c44de752af391e60da26ed25a9c46ec..e1769b8eff897718ace3b053b00cdf9c20a3bd08 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2005,7 +2005,15 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos)
 {
 	/*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)) ||
+		blockpos_over_limit(blockpos + v3s16(1,1,1)))
+	{
+		data->no_op = true;
+		return;
+	}
+	
 	data->no_op = false;
 	data->seed = m_seed;
 	data->blockpos = blockpos;
@@ -2056,6 +2064,7 @@ void ServerMap::initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos)
 		neighboring blocks
 	*/
 	
+	// The area that contains this block and it's neighbors
 	v3s16 bigarea_blocks_min = blockpos - v3s16(1,1,1);
 	v3s16 bigarea_blocks_max = blockpos + v3s16(1,1,1);
 	
@@ -2080,7 +2089,7 @@ MapBlock* ServerMap::finishBlockMake(mapgen::BlockMakeData *data,
 
 	if(data->no_op)
 	{
-		dstream<<"finishBlockMake(): no-op"<<std::endl;
+		//dstream<<"finishBlockMake(): no-op"<<std::endl;
 		return NULL;
 	}
 
@@ -2332,49 +2341,54 @@ MapBlock * ServerMap::generateBlock(
 		Get central block
 	*/
 	MapBlock *block = getBlockNoCreateNoEx(p);
-	assert(block);
 
 #if 0
 	/*
 		Check result
 	*/
-	bool erroneus_content = false;
-	for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
-	for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
-	for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
+	if(block)
 	{
-		v3s16 p(x0,y0,z0);
-		MapNode n = block->getNode(p);
-		if(n.d == CONTENT_IGNORE)
+		bool erroneus_content = false;
+		for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
+		for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
+		for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
+		{
+			v3s16 p(x0,y0,z0);
+			MapNode n = block->getNode(p);
+			if(n.d == CONTENT_IGNORE)
+			{
+				dstream<<"CONTENT_IGNORE at "
+						<<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"
+						<<std::endl;
+				erroneus_content = true;
+				assert(0);
+			}
+		}
+		if(erroneus_content)
 		{
-			dstream<<"CONTENT_IGNORE at "
-					<<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"
-					<<std::endl;
-			erroneus_content = true;
 			assert(0);
 		}
 	}
-	if(erroneus_content)
-	{
-		assert(0);
-	}
 #endif
 
 #if 0
 	/*
 		Generate a completely empty block
 	*/
-	for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
-	for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
+	if(block)
 	{
-		for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
+		for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
+		for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
 		{
-			MapNode n;
-			if(y0%2==0)
-				n.d = CONTENT_AIR;
-			else
-				n.d = CONTENT_STONE;
-			block->setNode(v3s16(x0,y0,z0), n);
+			for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
+			{
+				MapNode n;
+				if(y0%2==0)
+					n.d = CONTENT_AIR;
+				else
+					n.d = CONTENT_STONE;
+				block->setNode(v3s16(x0,y0,z0), n);
+			}
 		}
 	}
 #endif
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index dfea862a5b69f19397fb21500ff3260382c9a9c9..8dda93c960e30a74cd4cd2d55e30b11ba741e882 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -1331,7 +1331,7 @@ void make_block(BlockMakeData *data)
 {
 	if(data->no_op)
 	{
-		dstream<<"makeBlock: no-op"<<std::endl;
+		//dstream<<"makeBlock: no-op"<<std::endl;
 		return;
 	}
 
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index 391e593f9548b9715de7f733169e88a50eb44f78..1e9b64989767f440e45e87061076fa3131cf8c7d 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -142,8 +142,10 @@ void init_mapnode()
 		Initially set every block to be shown as an unknown block.
 		Don't touch CONTENT_IGNORE or CONTENT_AIR.
 	*/
-	for(u16 i=0; i<=253; i++)
+	for(u16 i=0; i<256; i++)
 	{
+		if(i == CONTENT_IGNORE || i == CONTENT_AIR)
+			continue;
 		ContentFeatures *f = &g_content_features[i];
 		f->setAllTextures("unknown_block.png");
 		f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
@@ -265,10 +267,10 @@ void MapNode::serialize(u8 *dest, u8 version)
 	{
 		// In these versions, CONTENT_IGNORE and CONTENT_AIR
 		// are 255 and 254
-		if(d == CONTENT_IGNORE)
-			d = 255;
-		else if(d == CONTENT_AIR)
-			d = 254;
+		if(actual_d == CONTENT_IGNORE)
+			actual_d = 255;
+		else if(actual_d == CONTENT_AIR)
+			actual_d = 254;
 	}
 
 	if(version == 0)
@@ -315,17 +317,25 @@ void MapNode::deSerialize(u8 *source, u8 version)
 		d = source[0];
 		param = source[1];
 		param2 = source[2];
-		
-		// Convert from old version to new
-		if(version <= 18)
-		{
-			// In these versions, CONTENT_IGNORE and CONTENT_AIR
-			// are 255 and 254
-			if(d == 255)
-				d = CONTENT_IGNORE;
-			else if(d == 254)
-				d = CONTENT_AIR;
-		}
+	}
+	
+	// Convert from old version to new
+	if(version <= 18)
+	{
+		// In these versions, CONTENT_IGNORE and CONTENT_AIR
+		// are 255 and 254
+		if(d == 255)
+			d = CONTENT_IGNORE;
+		else if(d == 254)
+			d = CONTENT_AIR;
+	}
+	// version 19 is fucked up with sometimes the old values and sometimes not
+	if(version == 19)
+	{
+		if(d == 255)
+			d = CONTENT_IGNORE;
+		else if(d == 254)
+			d = CONTENT_AIR;
 	}
 }
 
diff --git a/src/test.cpp b/src/test.cpp
index 7d71552a8fbbb9f41eb83f83ba2e05288d4992ff..0487f1436a3aeea49d52872ac71e54c6f1e76aff 100644
--- a/src/test.cpp
+++ b/src/test.cpp
@@ -61,6 +61,38 @@ struct TestUtilities
 		assert(is_yes("FAlse") == false);
 	}
 };
+
+struct TestSettings
+{
+	void Run()
+	{
+		Settings s;
+		// Test reading of settings
+		s.parseConfigLine("leet = 1337");
+		s.parseConfigLine("leetleet = 13371337");
+		s.parseConfigLine("leetleet_neg = -13371337");
+		s.parseConfigLine("floaty_thing = 1.1");
+		s.parseConfigLine("stringy_thing = asd /( ¤%&(/\" BLÖÄRP");
+		s.parseConfigLine("coord = (1, 2, 4.5)");
+		assert(s.getS32("leet") == 1337);
+		assert(s.getS16("leetleet") == 32767);
+		assert(s.getS16("leetleet_neg") == -32768);
+		// Not sure if 1.1 is an exact value as a float, but doesn't matter
+		assert(fabs(s.getFloat("floaty_thing") - 1.1) < 0.001);
+		assert(s.get("stringy_thing") == "asd /( ¤%&(/\" BLÖÄRP");
+		assert(fabs(s.getV3F("coord").X - 1.0) < 0.001);
+		assert(fabs(s.getV3F("coord").Y - 2.0) < 0.001);
+		assert(fabs(s.getV3F("coord").Z - 4.5) < 0.001);
+		// Test the setting of settings too
+		s.setFloat("floaty_thing_2", 1.2);
+		s.setV3F("coord2", v3f(1, 2, 3.3));
+		assert(s.get("floaty_thing_2").substr(0,3) == "1.2");
+		assert(fabs(s.getFloat("floaty_thing_2") - 1.2) < 0.001);
+		assert(fabs(s.getV3F("coord2").X - 1.0) < 0.001);
+		assert(fabs(s.getV3F("coord2").Y - 2.0) < 0.001);
+		assert(fabs(s.getV3F("coord2").Z - 3.3) < 0.001);
+	}
+};
 		
 struct TestCompress
 {
@@ -1033,6 +1065,7 @@ void run_tests()
 	DSTACK(__FUNCTION_NAME);
 	dstream<<"run_tests() started"<<std::endl;
 	TEST(TestUtilities);
+	TEST(TestSettings);
 	TEST(TestCompress);
 	TEST(TestMapNode);
 	TEST(TestVoxelManipulator);