diff --git a/src/simutrans/dataobj/route.cc b/src/simutrans/dataobj/route.cc
index 2c294034e..d5230f5db 100644
--- a/src/simutrans/dataobj/route.cc
+++ b/src/simutrans/dataobj/route.cc
@@ -142,7 +142,7 @@ bool route_t::find_route(karte_t *welt, const koord3d start, test_driver_t *tdri
 	route.clear();
 
 	// first tile is not valid?!?
-	if(  !tdriver->check_next_tile(g)  ) {
+	if(  !tdriver->check_next_tile(g,max_khm!=0)  ) {
 		return false;
 	}
 
@@ -209,7 +209,7 @@ bool route_t::find_route(karte_t *welt, const koord3d start, test_driver_t *tdri
 			    && koord_distance(start, gr->get_pos() + koord::nesw[r])<max_depth // not too far away
 			    && gr->get_neighbour(to, wegtyp, ribi_t::nesw[r])  // is connected
 			    && !marker.is_marked(to) // not already tested
-			    && tdriver->check_next_tile(to) // can be driven on
+			    && tdriver->check_next_tile(to,max_khm!=0) // can be driven on
 				&& step < MAX_STEP // do not overrun nodes[]
 			) {
 				// not in there or taken out => add new
@@ -304,7 +304,7 @@ bool route_t::intern_calc_route(karte_t *welt, const koord3d ziel, const koord3d
 	route.clear();
 
 	// first tile is not valid?!?
-	if(  !tdriver->check_next_tile(gr)  ) {
+	if(  !tdriver->check_next_tile(gr,max_speed!=0)  ) {
 		return false;
 	}
 
@@ -415,7 +415,7 @@ bool route_t::intern_calc_route(karte_t *welt, const koord3d ziel, const koord3d
 			}
 
 			// a way goes here, and it is not marked (i.e. in the closed list)
-			if((to  ||  gr->get_neighbour(to, wegtyp, next_ribi[r]))  &&  tdriver->check_next_tile(to)  &&  !marker.is_marked(to)) {
+			if((to  ||  gr->get_neighbour(to, wegtyp, next_ribi[r]))  &&  tdriver->check_next_tile(to,max_speed!=0)  &&  !marker.is_marked(to)) {
 
 				weg_t *w = to->get_weg(wegtyp);
 				// Do not go on a tile, where a oneway sign forbids going.
@@ -730,7 +730,7 @@ route_t::route_result_t route_t::calc_route(karte_t *welt, const koord3d ziel, c
 				ribi_t::ribi way_ribi  = tdriver->get_ribi(gr);
 
 				while(  max_len>0  &&  ((way_ribi & ribi) != 0)  &&  gr->get_neighbour(gr,wegtyp,ribi)  &&  gr->get_halt()==halt
-					&&   tdriver->check_next_tile(gr)) {
+					&&   tdriver->check_next_tile(gr,max_khm!=0)) {
 					// Do not go on a tile, where a oneway sign forbids going.
 					// This saves time and fixed the bug, that a oneway sign on the final tile was ignored.
 					ribi_t::ribi go_dir=gr->get_weg(wegtyp)->get_ribi_maske();
diff --git a/src/simutrans/vehicle/air_vehicle.cc b/src/simutrans/vehicle/air_vehicle.cc
index ccdf69986..8398e6191 100644
--- a/src/simutrans/vehicle/air_vehicle.cc
+++ b/src/simutrans/vehicle/air_vehicle.cc
@@ -92,14 +92,14 @@ int air_vehicle_t::get_cost(const grund_t *, const weg_t *w, const sint32, ribi_
 
 
 // whether the ground is drivable or not depends on the current state of the airplane
-bool air_vehicle_t::check_next_tile(const grund_t *bd) const
+bool air_vehicle_t::check_next_tile(const grund_t *bd, const bool need_speed) const
 {
 	switch (state) {
 		case taxiing:
 		case taxiing_to_halt:
 		case looking_for_parking:
 //DBG_MESSAGE("check_next_tile()","at %i,%i",bd->get_pos().x,bd->get_pos().y);
-			return (bd->hat_weg(air_wt)  &&  bd->get_weg(air_wt)->get_max_speed()>0);
+			return (bd->hat_weg(air_wt)  &&  (bd->get_weg(air_wt)->get_max_speed()>0)||!need_speed  );
 
 		case landing:
 		case departing:
diff --git a/src/simutrans/vehicle/air_vehicle.h b/src/simutrans/vehicle/air_vehicle.h
index 407075b02..0f7daec82 100644
--- a/src/simutrans/vehicle/air_vehicle.h
+++ b/src/simutrans/vehicle/air_vehicle.h
@@ -46,7 +46,7 @@ protected:
 	// jumps to next tile and correct the height ...
 	void hop(grund_t*) OVERRIDE;
 
-	bool check_next_tile(const grund_t *bd) const OVERRIDE;
+	bool check_next_tile(const grund_t *bd, const bool need_speed) const OVERRIDE;
 
 	void enter_tile(grund_t*) OVERRIDE;
 
diff --git a/src/simutrans/vehicle/rail_vehicle.cc b/src/simutrans/vehicle/rail_vehicle.cc
index 3d88546e3..4c8efef80 100644
--- a/src/simutrans/vehicle/rail_vehicle.cc
+++ b/src/simutrans/vehicle/rail_vehicle.cc
@@ -145,13 +145,13 @@ bool rail_vehicle_t::calc_route(koord3d start, koord3d ziel, sint32 max_speed, r
 }
 
 
-bool rail_vehicle_t::check_next_tile(const grund_t *bd) const
+bool rail_vehicle_t::check_next_tile(const grund_t *bd, const bool need_speed) const
 {
 	schiene_t const* const sch = obj_cast<schiene_t>(bd->get_weg(get_waytype()));
 	if(  !sch  ) {
 		return false;
 	}
-	if (sch->get_max_speed() == 0) {
+	if (sch->get_max_speed() == 0  &&  need_speed) {
 		// city walls etc.
 		return false;
 	}
diff --git a/src/simutrans/vehicle/rail_vehicle.h b/src/simutrans/vehicle/rail_vehicle.h
index 787a60aa6..05ef272f3 100644
--- a/src/simutrans/vehicle/rail_vehicle.h
+++ b/src/simutrans/vehicle/rail_vehicle.h
@@ -18,7 +18,7 @@
 class rail_vehicle_t : public vehicle_t
 {
 protected:
-	bool check_next_tile(const grund_t *bd) const OVERRIDE;
+	bool check_next_tile(const grund_t *bd, const bool need_speed) const OVERRIDE;
 
 	void enter_tile(grund_t*) OVERRIDE;
 
diff --git a/src/simutrans/vehicle/road_vehicle.cc b/src/simutrans/vehicle/road_vehicle.cc
index f739bd104..7a20e255b 100644
--- a/src/simutrans/vehicle/road_vehicle.cc
+++ b/src/simutrans/vehicle/road_vehicle.cc
@@ -107,10 +107,10 @@ bool road_vehicle_t::calc_route(koord3d start, koord3d ziel, sint32 max_speed, r
 }
 
 
-bool road_vehicle_t::check_next_tile(const grund_t *bd) const
+bool road_vehicle_t::check_next_tile(const grund_t *bd, const bool need_speed) const
 {
 	strasse_t *str=(strasse_t *)bd->get_weg(road_wt);
-	if(str==NULL  ||  str->get_max_speed()==0) {
+	if(str==NULL  ||  (str->get_max_speed()==0&&need_speed)) {
 		return false;
 	}
 	bool electric = cnv!=NULL  &&  cnv->needs_electrification();
diff --git a/src/simutrans/vehicle/road_vehicle.h b/src/simutrans/vehicle/road_vehicle.h
index c458bc376..a02a67aa4 100644
--- a/src/simutrans/vehicle/road_vehicle.h
+++ b/src/simutrans/vehicle/road_vehicle.h
@@ -23,7 +23,7 @@ private:
 	bool choose_route(sint32 &restart_speed, ribi_t::ribi start_direction, uint16 index);
 
 protected:
-	bool check_next_tile(const grund_t *bd) const OVERRIDE;
+	bool check_next_tile(const grund_t *bd, const bool need_speed) const OVERRIDE;
 
 public:
 	void enter_tile(grund_t*) OVERRIDE;
diff --git a/src/simutrans/vehicle/simtestdriver.h b/src/simutrans/vehicle/simtestdriver.h
index f8e151f3a..6fae15bb1 100644
--- a/src/simutrans/vehicle/simtestdriver.h
+++ b/src/simutrans/vehicle/simtestdriver.h
@@ -24,6 +24,7 @@ public:
 	virtual ~test_driver_t() {}
 
 	virtual bool check_next_tile(const grund_t* ) const = 0;
+	virtual bool check_next_tile(const grund_t* bd, const bool need_speed) const { return check_next_tile(bd); }
 
 	/**
 	 * Determine the direction bits (ribi) for the applicable vehicle,
diff --git a/src/simutrans/vehicle/vehicle.cc b/src/simutrans/vehicle/vehicle.cc
index 05bf58e8e..00352ef4a 100644
--- a/src/simutrans/vehicle/vehicle.cc
+++ b/src/simutrans/vehicle/vehicle.cc
@@ -424,7 +424,7 @@ grund_t* vehicle_t::hop_check()
 
 		// now check, if we can go here
 		grund_t *bd = welt->lookup(pos_next);
-		if(bd==NULL  ||  !check_next_tile(bd)  ||  cnv->get_route()->empty()) {
+		if(bd==NULL  ||  !check_next_tile(bd,true)  ||  cnv->get_route()->empty()) {
 			// way (weg) not existent (likely destroyed) or no route ...
 			cnv->suche_neue_route();
 			return NULL;
diff --git a/src/simutrans/vehicle/vehicle.h b/src/simutrans/vehicle/vehicle.h
index 6a25eceb7..e3bb9ceb6 100644
--- a/src/simutrans/vehicle/vehicle.h
+++ b/src/simutrans/vehicle/vehicle.h
@@ -79,7 +79,8 @@ protected:
 	bool check_for_finish:1; // true, if on the last tile
 	bool has_driven:1;
 
-	bool check_next_tile(const grund_t* ) const OVERRIDE {return false;}
+	bool check_next_tile(const grund_t*, const bool need_speed ) const OVERRIDE {return false;}
+	bool check_next_tile(const grund_t* gr) const OVERRIDE {return check_next_tile(gr, true);}
 
 public:
 	void calc_image() OVERRIDE;
diff --git a/src/simutrans/vehicle/water_vehicle.cc b/src/simutrans/vehicle/water_vehicle.cc
index 9bd44338c..0f0ec445c 100644
--- a/src/simutrans/vehicle/water_vehicle.cc
+++ b/src/simutrans/vehicle/water_vehicle.cc
@@ -61,7 +61,7 @@ void water_vehicle_t::enter_tile(grund_t* gr)
 }
 
 
-bool water_vehicle_t::check_next_tile(const grund_t *bd) const
+bool water_vehicle_t::check_next_tile(const grund_t *bd, const bool need_speed) const
 {
 	if(  bd->is_water()  ) {
 		return true;
@@ -83,7 +83,7 @@ bool water_vehicle_t::check_next_tile(const grund_t *bd) const
 		}
 	}
 #endif
-	return (w  &&  w->get_max_speed()>0);
+	return (w  &&  (w->get_max_speed()>0  ||  !need_speed));
 }
 
 
diff --git a/src/simutrans/vehicle/water_vehicle.h b/src/simutrans/vehicle/water_vehicle.h
index c26b06b19..bae3801fc 100644
--- a/src/simutrans/vehicle/water_vehicle.h
+++ b/src/simutrans/vehicle/water_vehicle.h
@@ -23,7 +23,7 @@ protected:
 
 	void calc_friction(const grund_t *gr) OVERRIDE;
 
-	bool check_next_tile(const grund_t *bd) const OVERRIDE;
+	bool check_next_tile(const grund_t *bd, const bool need_speed) const OVERRIDE;
 
 	void enter_tile(grund_t*) OVERRIDE;
 
