diff --git src/simutrans/vehicle/rail_vehicle.cc src/simutrans/vehicle/rail_vehicle.cc
index da2869407..80ab4c629 100644
--- src/simutrans/vehicle/rail_vehicle.cc
+++ src/simutrans/vehicle/rail_vehicle.cc
@@ -299,6 +299,10 @@ bool rail_vehicle_t::is_longblock_signal_clear(signal_t *sig, route_t::index_t n
 	if(schedule_index >= cnv->get_schedule()->get_count()) {
 		schedule_index = 0;
 	}
+	// erase reservation, we'll renew it later
+	// not doing this may cause it to be partly erased, e.g on dead ends
+	// would be bad as it wouldn't be correctly freed at the end
+	block_reserver( cnv->get_route(), next_block+1, next_next_signal, dummy, 0, false, false );
 	while(  schedule_index != cnv->get_schedule()->get_current_stop()  ) {
 		// now search
 		// search for route
@@ -315,11 +319,8 @@ bool rail_vehicle_t::is_longblock_signal_clear(signal_t *sig, route_t::index_t n
 		if(  success  ) {
 			// ok, would be free
 			if(  next_next_signal<target_rt.get_count()  ) {
-				// and here is a signal => finished
-				// (however, if it is this signal, we need to renew reservation ...
-				if(  target_rt.at(next_next_signal) == cnv->get_route()->at( next_block )  ) {
-					block_reserver( cnv->get_route(), next_block+1, next_signal, next_crossing, 0, true, false );
-				}
+				// We can go, but we need to renew reservation
+				block_reserver( cnv->get_route(), next_block+1, next_signal, next_crossing, 0, true, false );
 				sig->set_state( roadsign_t::STATE_GREEN );
 				cnv->set_next_stop_index( min( min( next_crossing, next_signal ), cnv->get_route()->get_count()-1-1 ) );
 				return true;
@@ -327,7 +328,6 @@ bool rail_vehicle_t::is_longblock_signal_clear(signal_t *sig, route_t::index_t n
 		}
 
 		if(  !success  ) {
-			block_reserver( cnv->get_route(), next_block+1, next_next_signal, dummy, 0, false, false );
 			sig->set_state( roadsign_t::STATE_RED );
 			restart_speed = 0;
 			return false;
