diff --git a/src/emerge.cpp b/src/emerge.cpp
index aa2c3c5319ee7e903696af66ba08c4703dcddd28..8da1a2bfd24ea147a7043079f26a62ca22282626 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -325,15 +325,6 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 }
 
 
-u32 EmergeManager::getBlockSeed(v3s16 p)
-{
-	return (u32)(params.seed & 0xFFFFFFFF) +
-		p.Z * 38134234 +
-		p.Y * 42123 +
-		p.X * 23;
-}
-
-
 void EmergeManager::getMapgenNames(std::list<const char *> &mgnames)
 {
 	for (u32 i = 0; i != ARRLEN(reg_mapgens); i++)
@@ -547,7 +538,7 @@ void *EmergeThread::Thread()
 						VoxelArea(minp, maxp));
 					try {  // takes about 90ms with -O1 on an e3-1230v2
 						m_server->getScriptIface()->environment_OnGenerated(
-								minp, maxp, emerge->getBlockSeed(minp));
+								minp, maxp, mapgen->blockseed);
 					} catch(LuaError &e) {
 						m_server->setAsyncFatalError(e.what());
 					}
diff --git a/src/emerge.h b/src/emerge.h
index e5d1b68b22e2660ad5103696122bbb295270aaba..4ad670bde22d47dfb87065c33adc9426d57ded15 100644
--- a/src/emerge.h
+++ b/src/emerge.h
@@ -118,7 +118,6 @@ class EmergeManager {
 	Biome *getBiomeAtPoint(v3s16 p);
 	int getGroundLevelAtPoint(v2s16 p);
 	bool isBlockUnderground(v3s16 blockpos);
-	u32 getBlockSeed(v3s16 p);
 };
 
 #endif
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 24f9fc556be8f7a845bf39946d40e027d5634d2a..c1b8889a8fc56ee38fac4d881628799c82a8c721 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -101,6 +101,21 @@ Mapgen::~Mapgen()
 }
 
 
+u32 Mapgen::getBlockSeed(v3s16 p, int seed)
+{
+	return (u32)seed   +
+		p.Z * 38134234 +
+		p.Y * 42123    +
+		p.X * 23;
+}
+
+
+u32 Mapgen::getBlockSeed2(v3s16 p, int seed)
+{
+	return noise3d(p.X, p.Y, p.Z, seed);
+}
+
+
 // Returns Y one under area minimum if not found
 s16 Mapgen::findGroundLevelFull(v2s16 p2d)
 {
diff --git a/src/mapgen.h b/src/mapgen.h
index 07202f9a227cca2f7d2dd42d66e484383fe6656c..aaa89d3bc15d224ac217760cff962a6b79a51072 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -133,9 +133,11 @@ class Mapgen {
 	u32 flags;
 	bool generating;
 	int id;
+
 	ManualMapVoxelManipulator *vm;
 	INodeDefManager *ndef;
 
+	u32 blockseed;
 	s16 *heightmap;
 	u8 *biomemap;
 	v3s16 csize;
@@ -146,6 +148,8 @@ class Mapgen {
 	Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
 	virtual ~Mapgen();
 
+	static u32 getBlockSeed(v3s16 p, int seed);
+	static u32 getBlockSeed2(v3s16 p, int seed);
 	s16 findGroundLevelFull(v2s16 p2d);
 	s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
 	void updateHeightmap(v3s16 nmin, v3s16 nmax);
diff --git a/src/mapgen_singlenode.cpp b/src/mapgen_singlenode.cpp
index 8558b3b1427e9e06795ae11f185f45c40e2a5760..91cd9f2f6e34e4a7e997369c6b1df9eca3a1702e 100644
--- a/src/mapgen_singlenode.cpp
+++ b/src/mapgen_singlenode.cpp
@@ -78,6 +78,8 @@ void MapgenSinglenode::makeChunk(BlockMakeData *data) {
 	v3s16 node_min = blockpos_min*MAP_BLOCKSIZE;
 	v3s16 node_max = (blockpos_max+v3s16(1,1,1))*MAP_BLOCKSIZE-v3s16(1,1,1);
 
+	blockseed = getBlockSeed2(node_min, data->seed);
+
 	MapNode n_node(c_node);
 
 	for (s16 z = node_min.Z; z <= node_max.Z; z++)
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index a7d9698d5d945906e1a58e7713f9b93a02b0c650..c19f55b939bf2b1310e7737634a2bb86602387d0 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -240,7 +240,7 @@ void MapgenV5::makeChunk(BlockMakeData *data) {
 	full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
 
 	// Create a block-specific seed
-	blockseed = m_emerge->getBlockSeed(full_node_min);  //////use getBlockSeed2()!
+	blockseed = getBlockSeed2(full_node_min, seed);
 
 	// Make some noise
 	calculateNoise();
diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h
index ef573c7ff7d329356e6e463ca1d6a0aae718d774..dba888e6ae938efe00e28fd7726701c3b6e4105f 100644
--- a/src/mapgen_v5.h
+++ b/src/mapgen_v5.h
@@ -56,7 +56,6 @@ class MapgenV5 : public Mapgen {
 	int zstride;
 	u32 spflags;
 
-	u32 blockseed;
 	v3s16 node_min;
 	v3s16 node_max;
 	v3s16 full_node_min;
diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h
index 445888242b7efccc39efbfa8259171b1396621f5..a76d24831e26418b7f619a5013b75b3d497ca3e1 100644
--- a/src/mapgen_v6.h
+++ b/src/mapgen_v6.h
@@ -70,7 +70,6 @@ class MapgenV6 : public Mapgen {
 	int ystride;
 	u32 spflags;
 
-	u32 blockseed;
 	v3s16 node_min;
 	v3s16 node_max;
 	v3s16 full_node_min;
diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index 06a47971ef7cf50fa9f776893dbfc521a92b35e5..17d8f7f2b370bc5507be6a6a5a9f9fe27f612fe6 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -215,7 +215,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) {
 	full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
 	full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
 
-	blockseed = m_emerge->getBlockSeed(full_node_min);  //////use getBlockSeed2()!
+	blockseed = getBlockSeed2(full_node_min, seed);
 
 	// Make some noise
 	calculateNoise();
diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h
index 5c037cf440e2052c10bc60005942b6fd0f7a8c69..3ba42d7ff23fc19ca4005675ec0a6cd40f66141f 100644
--- a/src/mapgen_v7.h
+++ b/src/mapgen_v7.h
@@ -59,7 +59,6 @@ class MapgenV7 : public Mapgen {
 	int zstride;
 	u32 spflags;
 
-	u32 blockseed;
 	v3s16 node_min;
 	v3s16 node_max;
 	v3s16 full_node_min;