diff --git a/src/simutrans/builder/brueckenbauer.cc b/src/simutrans/builder/brueckenbauer.cc
index 82df8f9b0..de200b32d 100644
--- a/src/simutrans/builder/brueckenbauer.cc
+++ b/src/simutrans/builder/brueckenbauer.cc
@@ -440,8 +440,9 @@ const char *bridge_builder_t::can_span_bridge(const player_t* player, koord3d st
 		return "";	// just two tiles next to each other on flat ground => no bridge needed!
 	}
 
-	// test max length
-	if (desc->get_max_length() > 0  &&  length-1 > desc->get_max_length()) {
+	// test max length: max_length is the distance between the two ramps. r11608 compared
+	// length-1 here, which let every limited bridge span one tile more than its dat asked.
+	if (desc->get_max_length() > 0  &&  length > desc->get_max_length()) {
 		return "Bridge is too long for this type!\n";
 	}
 
@@ -1023,8 +1024,9 @@ const char* bridge_builder_t::renovate(player_t* player, koord3d pos_start, wayt
 		}
 	}
 
-	// Check whether the bridge would be too long
-	if (desc->get_max_length() > 0 && part_list.get_count() > desc->get_max_length()) {
+	// Check whether the bridge would be too long. part_list holds the tiles between the
+	// ends, so the ramp distance can_span_bridge() limits is one more than that.
+	if (desc->get_max_length() > 0 && part_list.get_count() + 1 > desc->get_max_length()) {
 		return "Bridge is too long for this type!\n";
 	}
 
diff --git a/src/simutrans/script/api/api_pathfinding.cc b/src/simutrans/script/api/api_pathfinding.cc
index 48be4e001..b805b72e4 100644
--- a/src/simutrans/script/api/api_pathfinding.cc
+++ b/src/simutrans/script/api/api_pathfinding.cc
@@ -139,8 +139,8 @@ koord3d bridge_builder_find_end_pos(player_t *player, koord3d pos, my_ribi_t mri
 	// a script must not search further than the player could build
 	uint32 limit = min( welt->get_settings().way_max_bridge_len, MAX_SCRIPT_BRIDGE_LEN );
 	if (bridge->get_max_length() > 0) {
-		// a bridge of max_length spans a distance of max_length+1, see bridge_builder_t::can_span_bridge
-		limit = min( limit, (uint32)bridge->get_max_length() + 1 );
+		// max_length is the distance between the two ramps, see bridge_builder_t::can_span_bridge
+		limit = min( limit, (uint32)bridge->get_max_length() );
 	}
 	// max_length <= 0 means: as far as this bridge and the settings allow
 	const uint32 length = max_length <= 0 ? limit : min( (uint32)max_length, limit );
diff --git a/tests/tests/test_way_bridge.nut b/tests/tests/test_way_bridge.nut
index 0e25bbbf5..ca4489a53 100644
--- a/tests/tests/test_way_bridge.nut
+++ b/tests/tests/test_way_bridge.nut
@@ -736,8 +736,9 @@ function test_way_bridge_planner_desc_limits()
 	ASSERT_EQUAL(BRIDGE_FIND_END(pl, unlimited, start_pos, 12, 0, null), coord3d(11, 13, 0).tostring())
 	ASSERT_EQUAL(BRIDGE_FIND_END(pl, unlimited, start_pos, 12, 10, null), invalid)
 
-	// a bridge with own limit spans get_max_length()+1 tiles, no matter what the caller asks for
-	local max_span = short_one.get_max_length() + 1
+	// a bridge with own limit reaches exactly get_max_length() tiles from its start ramp,
+	// no matter what the caller asks for. Before this was fixed it reached one tile more.
+	local max_span = short_one.get_max_length()
 	ASSERT_EQUAL(BRIDGE_FIND_END(pl, short_one, start_pos, max_span,     20, null), (start_pos + coord3d(0, max_span, 0)).tostring())
 	ASSERT_EQUAL(BRIDGE_FIND_END(pl, short_one, start_pos, max_span + 1, 20, null), invalid)
 
