Index: src/ship_cmd.cpp
===================================================================
--- src/ship_cmd.cpp	(revision 27848)
+++ src/ship_cmd.cpp	(working copy)
@@ -341,12 +341,17 @@
 	if (north_tracks && south_tracks) {
 		/* Ask pathfinder for best direction */
 		bool reverse = false;
-		bool path_found;
-		switch (_settings_game.pf.pathfinder_for_ships) {
-			case VPF_OPF: reverse = OPFShipChooseTrack(v, north_neighbour, north_dir, north_tracks, path_found) == INVALID_TRACK; break; // OPF always allows reversing
-			case VPF_NPF: reverse = NPFShipCheckReverse(v); break;
-			case VPF_YAPF: reverse = YapfShipCheckReverse(v); break;
-			default: NOT_REACHED();
+		if (v->dest_tile == 0) {
+			/* No destination, don't invoke pathfinder. */
+			reverse = HasBit(Random(), 0);
+		} else {
+			bool path_found;
+			switch (_settings_game.pf.pathfinder_for_ships) {
+				case VPF_OPF: reverse = OPFShipChooseTrack(v, north_neighbour, north_dir, north_tracks, path_found) == INVALID_TRACK; break; // OPF always allows reversing
+				case VPF_NPF: reverse = NPFShipCheckReverse(v); break;
+				case VPF_YAPF: reverse = YapfShipCheckReverse(v); break;
+				default: NOT_REACHED();
+			}
 		}
 		if (reverse) north_tracks = TRACK_BIT_NONE;
 	}
@@ -440,11 +445,37 @@
 
 	bool path_found = true;
 	Track track;
-	switch (_settings_game.pf.pathfinder_for_ships) {
-		case VPF_OPF: track = OPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
-		case VPF_NPF: track = NPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
-		case VPF_YAPF: track = YapfShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
-		default: NOT_REACHED();
+
+	if (v->dest_tile == 0) {
+		/* No destination, don't invoke pathfinder. */
+		static const TrackBits direction_to_trackbits[DIR_END] = {
+			TRACK_BIT_LEFT  | TRACK_BIT_RIGHT, // DIR_N
+			TRACK_BIT_X,                       // DIR_NE
+			TRACK_BIT_UPPER | TRACK_BIT_LOWER, // DIR_E
+			TRACK_BIT_Y,                       // DIR_SE
+			TRACK_BIT_LEFT  | TRACK_BIT_RIGHT, // DIR_S
+			TRACK_BIT_X,                       // DIR_SW
+			TRACK_BIT_UPPER | TRACK_BIT_LOWER, // DIR_W
+			TRACK_BIT_Y,                       // DIR_NW
+		};
+
+		TrackBits same = direction_to_trackbits[v->direction] & tracks;
+		if (same != 0 && GB(Random(), 0, 4) != 0) {
+			/* Continue in same direction. */
+			track = (Track)FindFirstBit(same);
+		} else {
+			/* Pick a random track. */
+			do {
+				track = (Track)(GB(Random(), 0, 3) % TRACK_END);
+			} while ((TrackToTrackBits(track) & tracks) == 0);
+		}
+	} else {
+		switch (_settings_game.pf.pathfinder_for_ships) {
+			case VPF_OPF: track = OPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
+			case VPF_NPF: track = NPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
+			case VPF_YAPF: track = YapfShipChooseTrack(v, tile, enterdir, tracks, path_found); break;
+			default: NOT_REACHED();
+		}
 	}
 
 	v->HandlePathfindingResult(path_found);
