diff --git a/src/emerge.cpp b/src/emerge.cpp
index 569f1b80a..167473ecf 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -429,6 +429,8 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
 	if (!block || block->isDummy() || !block->isGenerated()) {
 		EMERGE_DBG_OUT("not in memory, attempting to load from disk");
 		block = map->loadBlock(p);
+		if (block && block->isGenerated())
+			map->prepareBlock(block);
 	}
 
 	// If could not load and allowed to generate,
diff --git a/src/environment.cpp b/src/environment.cpp
index dd160d1f7..8a52a143d 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -809,16 +809,6 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
 	
 	// Activate stored objects
 	activateObjects(block, dtime_s);
-	
-	// Calculate weather conditions
-	if (m_use_weather) {
-		m_map->updateBlockHeat(this, block->getPos() *  MAP_BLOCKSIZE, block);
-		m_map->updateBlockHumidity(this, block->getPos() * MAP_BLOCKSIZE, block);
-	} else {
-		block->heat     = HEAT_UNDEFINED;
-		block->humidity = HUMIDITY_UNDEFINED;
-		block->weather_update_time = 0;
-	}
 
 	// Run node timers
 	std::map<v3s16, NodeTimer> elapsed_timers =
diff --git a/src/map.cpp b/src/map.cpp
index f74011933..0dbfd42f4 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2832,32 +2832,23 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data,
 		Update weather data in blocks
 	*/
 	ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv();
-	if (senv->m_use_weather) {
-		for(s16 x=blockpos_min.X-extra_borders.X;
-			x<=blockpos_max.X+extra_borders.X; x++)
-		for(s16 z=blockpos_min.Z-extra_borders.Z;
-			z<=blockpos_max.Z+extra_borders.Z; z++)
-		for(s16 y=blockpos_min.Y-extra_borders.Y;
-			y<=blockpos_max.Y+extra_borders.Y; y++)
-		{
-			v3s16 p(x, y, z);
-			MapBlock *block = getBlockNoCreateNoEx(p);
-			block->weather_update_time = 0;
-			updateBlockHeat(senv, p * MAP_BLOCKSIZE, NULL);
-			updateBlockHumidity(senv, p * MAP_BLOCKSIZE, NULL);
-		}
-	} else {
-		for(s16 x=blockpos_min.X-extra_borders.X;
-			x<=blockpos_max.X+extra_borders.X; x++)
-		for(s16 z=blockpos_min.Z-extra_borders.Z;
-			z<=blockpos_max.Z+extra_borders.Z; z++)
-		for(s16 y=blockpos_min.Y-extra_borders.Y;
-			y<=blockpos_max.Y+extra_borders.Y; y++)
-		{
-			MapBlock *block = getBlockNoCreateNoEx(v3s16(x, y, z));
+	for(s16 x=blockpos_min.X-extra_borders.X;
+		x<=blockpos_max.X+extra_borders.X; x++)
+	for(s16 z=blockpos_min.Z-extra_borders.Z;
+		z<=blockpos_max.Z+extra_borders.Z; z++)
+	for(s16 y=blockpos_min.Y-extra_borders.Y;
+		y<=blockpos_max.Y+extra_borders.Y; y++)
+	{
+		v3s16 p(x, y, z);
+		MapBlock *block = getBlockNoCreateNoEx(p);
+		block->heat_last_update     = 0;
+		block->humidity_last_update = 0;
+		if (senv->m_use_weather) {
+			updateBlockHeat(senv, p * MAP_BLOCKSIZE, block);
+			updateBlockHumidity(senv, p * MAP_BLOCKSIZE, block);
+		} else {
 			block->heat     = HEAT_UNDEFINED;
 			block->humidity = HUMIDITY_UNDEFINED;
-			block->weather_update_time = 0;
 		}
 	}
 	
@@ -3181,6 +3172,22 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank)
 	return NULL;
 }
 
+void ServerMap::prepareBlock(MapBlock *block) {
+	ServerEnvironment *senv = &((Server *)m_gamedef)->getEnv();
+
+	// Calculate weather conditions
+	block->heat_last_update     = 0;
+	block->humidity_last_update = 0;
+	if (senv->m_use_weather) {
+		v3s16 p = block->getPos() *  MAP_BLOCKSIZE;
+		updateBlockHeat(senv, p, block);
+		updateBlockHumidity(senv, p, block);
+	} else {
+		block->heat     = HEAT_UNDEFINED;
+		block->humidity = HUMIDITY_UNDEFINED;
+	}
+}
+
 s16 ServerMap::findGroundLevel(v2s16 p2d)
 {
 #if 0
@@ -3930,7 +3937,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
 	u32 gametime = env->getGameTime();
 	
 	if (block) {
-		if (gametime - block->weather_update_time < 10)
+		if (gametime - block->heat_last_update < 10)
 			return block->heat;
 	} else {
 		block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@@ -3941,7 +3948,7 @@ s16 ServerMap::updateBlockHeat(ServerEnvironment *env, v3s16 p, MapBlock *block)
 
 	if(block) {
 		block->heat = heat;
-		block->weather_update_time = gametime;
+		block->heat_last_update = gametime;
 	}
 	return heat;
 }
@@ -3951,7 +3958,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
 	u32 gametime = env->getGameTime();
 	
 	if (block) {
-		if (gametime - block->weather_update_time < 10)
+		if (gametime - block->humidity_last_update < 10)
 			return block->humidity;
 	} else {
 		block = getBlockNoCreateNoEx(getNodeBlockPos(p));
@@ -3962,7 +3969,7 @@ s16 ServerMap::updateBlockHumidity(ServerEnvironment *env, v3s16 p, MapBlock *bl
 			
 	if(block) {
 		block->humidity = humidity;
-		block->weather_update_time = gametime;
+		block->humidity_last_update = gametime;
 	}
 	return humidity;
 }
diff --git a/src/map.h b/src/map.h
index b70b18acc..a6480c569 100644
--- a/src/map.h
+++ b/src/map.h
@@ -403,6 +403,9 @@ public:
 
 	*/
 	MapBlock * emergeBlock(v3s16 p, bool create_blank=true);
+	
+	// Carries out any initialization necessary before block is sent
+	void prepareBlock(MapBlock *block);
 
 	// Helper for placing objects on ground level
 	s16 findGroundLevel(v2s16 p2d);
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index 3fb2ec5ed..e45af9cdb 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -45,7 +45,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 MapBlock::MapBlock(Map *parent, v3s16 pos, IGameDef *gamedef, bool dummy):
 		heat(0),
 		humidity(0),
-		weather_update_time(0),
+		heat_last_update(0),
+		humidity_last_update(0),
 		m_parent(parent),
 		m_pos(pos),
 		m_gamedef(gamedef),
diff --git a/src/mapblock.h b/src/mapblock.h
index e0730ffcf..501ab75da 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -516,7 +516,8 @@ public:
 	
 	s16 heat;
 	s16 humidity;
-	u32 weather_update_time;
+	u32 heat_last_update;
+	u32 humidity_last_update;
 
 private:
 	/*