diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index 6171e2116..4484b08d5 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -350,18 +350,21 @@ void RemoteClient::GetNextBlocks (
 					if (!block->getIsUnderground() && !block->getDayNightDiff())
 						continue;
 				}
+			}
 
-				/*
-					Check occlusion cache first.
-				 */
-				if (m_blocks_occ.find(p) != m_blocks_occ.end())
-					continue;
+			/*
+				Check occlusion cache first.
+			 */
+			if (m_blocks_occ.find(p) != m_blocks_occ.end())
+				continue;
 
-				if (m_occ_cull && !block_not_found &&
-						env->getMap().isBlockOccluded(block, cam_pos_nodes, d >= d_cull_opt)) {
-					m_blocks_occ.insert(p);
-					continue;
-				}
+			/*
+				Note that we do this even before the block is loaded as this does not depend on its contents.
+			 */
+			if (m_occ_cull &&
+					env->getMap().isBlockOccluded(p * MAP_BLOCKSIZE, cam_pos_nodes, d >= d_cull_opt)) {
+				m_blocks_occ.insert(p);
+				continue;
 			}
 
 			/*
diff --git a/src/map.cpp b/src/map.cpp
index f63732cf4..2402b971c 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -1155,7 +1155,7 @@ bool Map::isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target,
 	return false;
 }
 
-bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check)
+bool Map::isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_check)
 {
 	// Check occlusion for center and all 8 corners of the mapblock
 	// Overshoot a little for less flickering
@@ -1172,7 +1172,7 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_chec
 		v3s16(-1, -1, -1) * bs2,
 	};
 
-	v3s16 pos_blockcenter = block->getPosRelative() + (MAP_BLOCKSIZE / 2);
+	v3s16 pos_blockcenter = pos_relative + (MAP_BLOCKSIZE / 2);
 
 	// Starting step size, value between 1m and sqrt(3)m
 	float step = BS * 1.2f;
@@ -1203,7 +1203,7 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_chec
 
 	// Additional occlusion check, see comments in that function
 	v3s16 check;
-	if (determineAdditionalOcclusionCheck(cam_pos_nodes, block->getBox(), check)) {
+	if (determineAdditionalOcclusionCheck(cam_pos_nodes, MapBlock::getBox(pos_relative), check)) {
 		// node is always on a side facing the camera, end_offset can be lower
 		if (!isOccluded(cam_pos_nodes, check, step, stepfac, start_offset,
 				-1.0f, needed_count))
diff --git a/src/map.h b/src/map.h
index 543e2e89b..4133bc4a5 100644
--- a/src/map.h
+++ b/src/map.h
@@ -305,7 +305,12 @@ public:
 		}
 	}
 
-	bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check = false);
+	bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check = false)
+	{
+		return isBlockOccluded(block->getPosRelative(), cam_pos_nodes, simple_check);
+	}
+	bool isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_check = false);
+
 protected:
 	IGameDef *m_gamedef;
 
diff --git a/src/mapblock.h b/src/mapblock.h
index 9a91a05cf..73aeaade7 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -216,10 +216,14 @@ public:
 		return m_pos_relative;
 	}
 
-	inline core::aabbox3d<s16> getBox()
+	inline core::aabbox3d<s16> getBox() {
+		return getBox(getPosRelative());
+	}
+
+	static inline core::aabbox3d<s16> getBox(const v3s16 &pos_relative)
 	{
-		return core::aabbox3d<s16>(getPosRelative(),
-				getPosRelative()
+		return core::aabbox3d<s16>(pos_relative,
+				pos_relative
 				+ v3s16(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE)
 				- v3s16(1,1,1));
 	}