diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 891a807c524c5e02916e7632b7f55648085ff0a9..1e6d3ffc6884e58c497b16e0a9dd267f25a5a3a9 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1947,6 +1947,7 @@ Node definition (register_node)
     liquid_alternative_source = "", -- Source version of flowing liquid
     liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
     liquid_renewable = true, -- Can new liquid source be created by placing
+    liquid_range = 8, -- number of flowing nodes arround source (max. 8)
     drowning = true, -- Player will drown in these 
     two or more sources nearly?
     light_source = 0, -- Amount of light emitted by node
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index bc17e19aa07754d49f55a1ed4288ec62efede909..d2509ad5ab2849574796fa39fb65b811b6519b97 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -395,6 +395,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 				l = getInteriorLight(n, 0, data);
 			video::SColor c = MapBlock_LightColor(f.alpha, l, decode_light(f.light_source));
 			
+			u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 0, 8);
+
 			// Neighbor liquid levels (key = relative position)
 			// Includes current node
 			std::map<v3s16, f32> neighbor_levels;
@@ -426,9 +428,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 
 					if(n2.getContent() == c_source)
 						level = (-0.5+node_liquid_level) * BS;
-					else if(n2.getContent() == c_flowing)
-						level = (-0.5 + ((float)(n2.param2&LIQUID_LEVEL_MASK)
-								+ 0.5) / (float)LIQUID_LEVEL_SOURCE * node_liquid_level) * BS;
+					else if(n2.getContent() == c_flowing){
+						u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK) - (LIQUID_LEVEL_MAX+1-range);
+						level = (-0.5 + ((float)liquid_level+ 0.5) / (float)range * node_liquid_level) * BS;
+					}
 
 					// Check node above neighbor.
 					// NOTE: This doesn't get executed if neighbor
diff --git a/src/map.cpp b/src/map.cpp
index e458f3376b5f44fccfa6daabe146658b12521a4d..11f5d6483092002c4f2c2a6cb50f625a412eb361 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2166,7 +2166,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
 			} else
 				new_node_level = max_node_level;
 
-			if (new_node_level >= 0)
+			u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
+			if (new_node_level >= (LIQUID_LEVEL_MAX+1-range))
 				new_node_content = liquid_kind;
 			else
 				new_node_content = CONTENT_AIR;
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index b264151684a471e1357807951b28d618d6a63dd8..b1ce7bbc8435b2caa1597ba3b25ba4a4ac2b8d39 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -213,6 +213,7 @@ void ContentFeatures::reset()
 	liquid_alternative_source = "";
 	liquid_viscosity = 0;
 	liquid_renewable = true;
+	liquid_range = LIQUID_LEVEL_MAX+1;
 	drowning = true;
 	light_source = 0;
 	damage_per_second = 0;
@@ -284,6 +285,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
 	// the protocol version
 	writeU8(os, drowning);
 	writeU8(os, leveled);
+	writeU8(os, liquid_range);
 }
 
 void ContentFeatures::deSerialize(std::istream &is)
@@ -350,6 +352,7 @@ void ContentFeatures::deSerialize(std::istream &is)
 		// otherwise changes the protocol version
 		drowning = readU8(is);
 		leveled = readU8(is);
+		liquid_range = readU8(is);
 	}catch(SerializationError &e) {};
 }
 
diff --git a/src/nodedef.h b/src/nodedef.h
index e9ac2472702f6bff20773e98b985f7a7a897f295..3a8210304ec4a92d79bc65a47665da95377ce50a 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -224,6 +224,8 @@ struct ContentFeatures
 	u8 liquid_viscosity;
 	// Is liquid renewable (new liquid source will be created between 2 existing)
 	bool liquid_renewable;
+	// Number of flowing liquids surrounding source
+	u8 liquid_range;
 	bool drowning;
 	// Amount of light the node emits
 	u8 light_source;
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 7b80cc5ee9086c0a9c87a14002bd6ab5fa7dfd45..7d18454fd724b681f9fa2fffaae9ac0ee8bbe350 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -391,6 +391,8 @@ ContentFeatures read_content_features(lua_State *L, int index)
 	// the slowest possible
 	f.liquid_viscosity = getintfield_default(L, index,
 			"liquid_viscosity", f.liquid_viscosity);
+	f.liquid_range = getintfield_default(L, index,
+			"liquid_range", f.liquid_range);
 	f.leveled = getintfield_default(L, index, "leveled", f.leveled);
 
 	getboolfield(L, index, "liquid_renewable", f.liquid_renewable);