diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 674c6810407dd1c1a29bb9cd7a4aa7c9590b8ef6..dc15326d9624cc5e541f6fa066752b7768853bd6 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -132,9 +132,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 		Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO
 	PROTOCOL_VERSION 26:
 		Add TileDef tileable_horizontal, tileable_vertical flags
+	PROTOCOL_VERSION 27:
+		backface_culling: backwards compatibility for playing with
+		newer client on pre-27 servers.
 */
 
-#define LATEST_PROTOCOL_VERSION 26
+#define LATEST_PROTOCOL_VERSION 27
 
 // Server's supported network protocol range
 #define SERVER_PROTOCOL_VERSION_MIN 13
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 0bcc00e47bab3c5565d7dbb2bccdee4f364c5e68..e30cf6f12f92f0e2d4df2772eb25c1de61dce6b3 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -139,7 +139,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
 	}
 }
 
-void TileDef::deSerialize(std::istream &is)
+void TileDef::deSerialize(std::istream &is, bool culling_ignore)
 {
 	int version = readU8(is);
 	name = deSerializeString(is);
@@ -153,6 +153,11 @@ void TileDef::deSerialize(std::istream &is)
 		tileable_horizontal = readU8(is);
 		tileable_vertical = readU8(is);
 	}
+	// when connecting to old servers - do not use
+	// provided values here since culling needs to be
+	// disabled by default for these drawtypes
+	if (culling_ignore)
+		backface_culling = false;
 }
 
 
@@ -339,15 +344,22 @@ void ContentFeatures::deSerialize(std::istream &is)
 		groups[name] = value;
 	}
 	drawtype = (enum NodeDrawType)readU8(is);
+
+	bool ignore_culling = ((version <= 26) &&
+			((drawtype == NDT_MESH) ||
+			 (drawtype == NDT_PLANTLIKE) ||
+			 (drawtype == NDT_FIRELIKE) ||
+			 (drawtype == NDT_LIQUID)));
+
 	visual_scale = readF1000(is);
 	if(readU8(is) != 6)
 		throw SerializationError("unsupported tile count");
 	for(u32 i = 0; i < 6; i++)
-		tiledef[i].deSerialize(is);
+		tiledef[i].deSerialize(is, ignore_culling);
 	if(readU8(is) != CF_SPECIAL_COUNT)
 		throw SerializationError("unsupported CF_SPECIAL_COUNT");
 	for(u32 i = 0; i < CF_SPECIAL_COUNT; i++)
-		tiledef_special[i].deSerialize(is);
+		tiledef_special[i].deSerialize(is, ignore_culling);
 	alpha = readU8(is);
 	post_effect_color.setAlpha(readU8(is));
 	post_effect_color.setRed(readU8(is));
@@ -1258,7 +1270,6 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
 			"Unsupported version requested");
 }
 
-
 void ContentFeatures::deSerializeOld(std::istream &is, int version)
 {
 	if (version == 5) // In PROTOCOL_VERSION 13
@@ -1272,15 +1283,22 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
 			groups[name] = value;
 		}
 		drawtype = (enum NodeDrawType)readU8(is);
+
+		bool ignore_culling = ((version <= 26) &&
+				((drawtype == NDT_MESH) ||
+				(drawtype == NDT_PLANTLIKE) ||
+				(drawtype == NDT_FIRELIKE) ||
+				(drawtype == NDT_LIQUID)));
+
 		visual_scale = readF1000(is);
 		if (readU8(is) != 6)
 			throw SerializationError("unsupported tile count");
 		for (u32 i = 0; i < 6; i++)
-			tiledef[i].deSerialize(is);
+			tiledef[i].deSerialize(is, ignore_culling);
 		if (readU8(is) != CF_SPECIAL_COUNT)
 			throw SerializationError("unsupported CF_SPECIAL_COUNT");
 		for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
-			tiledef_special[i].deSerialize(is);
+			tiledef_special[i].deSerialize(is, ignore_culling);
 		alpha = readU8(is);
 		post_effect_color.setAlpha(readU8(is));
 		post_effect_color.setRed(readU8(is));
@@ -1324,12 +1342,12 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
 		if (readU8(is) != 6)
 			throw SerializationError("unsupported tile count");
 		for (u32 i = 0; i < 6; i++)
-			tiledef[i].deSerialize(is);
+			tiledef[i].deSerialize(is, drawtype);
 		// CF_SPECIAL_COUNT in version 6 = 2
 		if (readU8(is) != 2)
 			throw SerializationError("unsupported CF_SPECIAL_COUNT");
 		for (u32 i = 0; i < 2; i++)
-			tiledef_special[i].deSerialize(is);
+			tiledef_special[i].deSerialize(is, drawtype);
 		alpha = readU8(is);
 		post_effect_color.setAlpha(readU8(is));
 		post_effect_color.setRed(readU8(is));
diff --git a/src/nodedef.h b/src/nodedef.h
index 8f4942c044afe7be31424648ed305a9b6dfa9e5a..182bd09b2c2e600f294b8b7292c6c8ef5e717e2c 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -137,7 +137,7 @@ struct TileDef
 	}
 
 	void serialize(std::ostream &os, u16 protocol_version) const;
-	void deSerialize(std::istream &is);
+	void deSerialize(std::istream &is, bool culling_ignore);
 };
 
 enum NodeDrawType