diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 8d8bf19bdc..1eefa66f6e 100644
--- a/aircraft_cmd.c
+++ b/aircraft_cmd.c
@@ -232,7 +232,7 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 
 //		v->load_unload_time_rem = 0;
 //		v->progress = 0;
-		v->last_station_visited = 0xFFFF;
+		v->last_station_visited = INVALID_STATION;
 //		v->destination_coords = 0;
 
 		v->max_speed = avi->max_speed;
diff --git a/economy.c b/economy.c
index cc92b64db8..7513fe8a40 100644
--- a/economy.c
+++ b/economy.c
@@ -1208,7 +1208,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
 	return false;
 }
 
-static int32 DeliverGoods(int num_pieces, byte cargo_type, byte source, byte dest, byte days_in_transit)
+static int32 DeliverGoods(int num_pieces, byte cargo_type, uint16 source, uint16 dest, byte days_in_transit)
 {
 	bool subsidised;
 	Station *s_from, *s_to;
@@ -1335,7 +1335,7 @@ int LoadUnloadVehicle(Vehicle *v)
 	int unloading_time = 20;
 	Vehicle *u = v;
 	int result = 0;
-	int last_visited;
+	uint16 last_visited;
 	Station *st;
 	GoodsEntry *ge;
 	int t;
@@ -1358,7 +1358,7 @@ int LoadUnloadVehicle(Vehicle *v)
 
 		/* unload? */
 		if (v->cargo_count != 0) {
-			if (v->cargo_source != (byte)last_visited && ge->waiting_acceptance & 0x8000) {
+			if (v->cargo_source != last_visited && ge->waiting_acceptance & 0x8000) {
 				// deliver goods to the station
 				unloading_time += v->cargo_count; /* TTDBUG: bug in original TTD */
 				profit += DeliverGoods(v->cargo_count, v->cargo_type, v->cargo_source, last_visited, v->cargo_days);
@@ -1376,7 +1376,7 @@ int LoadUnloadVehicle(Vehicle *v)
 					// Goods already waiting at station. Set counters to the worst value.
 					if (v->cargo_days >= ge->enroute_time)
 						ge->enroute_time = v->cargo_days;
-					if ((byte)last_visited != ge->enroute_from)
+					if (last_visited != ge->enroute_from)
 						ge->enroute_from = v->cargo_source;
 				}
 				// Update amount of waiting cargo
diff --git a/order_cmd.c b/order_cmd.c
index fe9f22e233..b03305f4b1 100644
--- a/order_cmd.c
+++ b/order_cmd.c
@@ -756,7 +756,7 @@ void DeleteDestinationFromVehicleOrder(Order dest)
 
 		/* Forget about this station if this station is removed */
 		if (v->last_station_visited == dest.station && dest.type == OT_GOTO_STATION)
-			v->last_station_visited = 0xFFFF;
+			v->last_station_visited = INVALID_STATION;
 
 		/* Check the current order */
 		if (v->current_order.type    == dest.type &&
diff --git a/roadveh_cmd.c b/roadveh_cmd.c
index 9ee7d2bf3c..63f40e1d1d 100644
--- a/roadveh_cmd.c
+++ b/roadveh_cmd.c
@@ -173,7 +173,7 @@ int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 		v->u.road.slotindex = 0;
 		v->u.road.slot_age = 0;
 
-		v->last_station_visited = 0xFFFF;
+		v->last_station_visited = INVALID_STATION;
 		v->max_speed = rvi->max_speed;
 		v->engine_type = (byte)p1;
 
@@ -639,7 +639,7 @@ static void ProcessRoadVehOrder(Vehicle *v)
 
 	if (order->type == OT_GOTO_STATION) {
 		if (order->station == v->last_station_visited)
-			v->last_station_visited = 0xFFFF;
+			v->last_station_visited = INVALID_STATION;
 		st = GetStation(order->station);
 
 		{
diff --git a/saveload.c b/saveload.c
index 7ce00b1ee1..8db82bf2c0 100644
--- a/saveload.c
+++ b/saveload.c
@@ -7,8 +7,8 @@
 #include "saveload.h"
 
 enum {
-	SAVEGAME_MAJOR_VERSION = 6,
-	SAVEGAME_MINOR_VERSION = 1,
+	SAVEGAME_MAJOR_VERSION = 7,
+	SAVEGAME_MINOR_VERSION = 0,
 
 	SAVEGAME_LOADABLE_VERSION = (SAVEGAME_MAJOR_VERSION << 8) + SAVEGAME_MINOR_VERSION
 };
diff --git a/ship_cmd.c b/ship_cmd.c
index bad5981364..42614ed1d4 100644
--- a/ship_cmd.c
+++ b/ship_cmd.c
@@ -254,7 +254,7 @@ static void ProcessShipOrder(Vehicle *v)
 		const Station *st;
 
 		if (order->station == v->last_station_visited)
-			v->last_station_visited = 0xFFFF;
+			v->last_station_visited = INVALID_STATION;
 
 		st = GetStation(order->station);
 		if (st->dock_tile != 0) {
@@ -919,7 +919,7 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 		v->cargo_cap = svi->capacity;
 		v->value = value;
 
-		v->last_station_visited = 0xFFFF;
+		v->last_station_visited = INVALID_STATION;
 		v->max_speed = svi->max_speed;
 		v->engine_type = (byte)p1;
 
diff --git a/station.h b/station.h
index 8bfb28d681..7202099c6a 100644
--- a/station.h
+++ b/station.h
@@ -9,7 +9,7 @@ typedef struct GoodsEntry {
 	uint16 waiting_acceptance;
 	byte days_since_pickup;
 	byte rating;
-	byte enroute_from;
+	uint16 enroute_from;
 	byte enroute_time;
 	byte last_speed;
 	byte last_age;
@@ -20,10 +20,13 @@ typedef enum RoadStopType {
 	RS_TRUCK
 } RoadStopType;
 
-enum { NUM_ROAD_STOPS = 250 };
-enum { ROAD_STOP_LIMIT = 8 };
-enum { NUM_SLOTS = 2 };
-enum { INVALID_SLOT = 0xFFFF };
+enum {
+	INVALID_STATION = 0xFFFF,
+	INVALID_SLOT = 0xFFFF,
+	NUM_SLOTS = 2,
+	ROAD_STOP_LIMIT = 8,
+	NUM_ROAD_STOPS = 250,
+};
 
 typedef struct RoadStop {
 	TileIndex xy;
diff --git a/station_cmd.c b/station_cmd.c
index f4a4fc8aa4..cbce2014b3 100644
--- a/station_cmd.c
+++ b/station_cmd.c
@@ -415,7 +415,7 @@ static void StationInitialize(Station *st, TileIndex tile)
 	for(i=0,ge=st->goods; i!=NUM_CARGO; i++, ge++) {
 		ge->waiting_acceptance = 0;
 		ge->days_since_pickup = 0;
-		ge->enroute_from = 0xFF;
+		ge->enroute_from = INVALID_STATION;
 		ge->rating = 175;
 		ge->last_speed = 0;
 		ge->last_age = 0xFF;
@@ -2447,7 +2447,7 @@ static void UpdateStationRating(Station *st)
 
 	ge = st->goods;
 	do {
-		if (ge->enroute_from != 0xFF) {
+		if (ge->enroute_from != INVALID_STATION) {
 			byte_inc_sat(&ge->enroute_time);
 			byte_inc_sat(&ge->days_since_pickup);
 
@@ -2589,7 +2589,7 @@ void ModifyStationRatingAround(TileIndex tile, byte owner, int amount, uint radi
 				DistanceManhattan(tile, st->xy) <= radius) {
 			ge = st->goods;
 			for(i=0; i!=NUM_CARGO; i++,ge++) {
-				if (ge->enroute_from != 0xFF) {
+				if (ge->enroute_from != INVALID_STATION) {
 					ge->rating = clamp(ge->rating + amount, 0, 255);
 				}
 			}
@@ -2808,7 +2808,7 @@ void BuildOilRig(uint tile)
 			for(j=0; j!=NUM_CARGO; j++) {
 				st->goods[j].waiting_acceptance = 0;
 				st->goods[j].days_since_pickup = 0;
-				st->goods[j].enroute_from = 0xFF;
+				st->goods[j].enroute_from = INVALID_STATION;
 				st->goods[j].rating = 175;
 				st->goods[j].last_speed = 0;
 				st->goods[j].last_age = 255;
@@ -2998,7 +2998,8 @@ static const byte _goods_desc[] = {
 	SLE_VAR(GoodsEntry,waiting_acceptance,SLE_UINT16),
 	SLE_VAR(GoodsEntry,days_since_pickup,	SLE_UINT8),
 	SLE_VAR(GoodsEntry,rating,						SLE_UINT8),
-	SLE_VAR(GoodsEntry,enroute_from,			SLE_UINT8),
+	SLE_CONDVAR(GoodsEntry,enroute_from,			SLE_FILE_U8 | SLE_VAR_U16, 0, 6),
+	SLE_CONDVAR(GoodsEntry,enroute_from,			SLE_UINT16, 7, 255),
 	SLE_VAR(GoodsEntry,enroute_time,			SLE_UINT8),
 	SLE_VAR(GoodsEntry,last_speed,				SLE_UINT8),
 	SLE_VAR(GoodsEntry,last_age,					SLE_UINT8),
@@ -3012,8 +3013,13 @@ static void SaveLoad_STNS(Station *st)
 	int i;
 
 	SlObject(st, _station_desc);
-	for (i = 0; i != NUM_CARGO; i++)
+	for (i = 0; i != NUM_CARGO; i++) {
 		SlObject(&st->goods[i], _goods_desc);
+
+		/* In older versions, enroute_from had 0xFF as INVALID_STATION, is now 0xFFFF */
+		if (_sl.full_version < 0x700 && st->goods[i].enroute_from == 0xFF)
+			st->goods[i].enroute_from = 0xFFFF;
+	}
 }
 
 static void Save_STNS(void)
diff --git a/station_gui.c b/station_gui.c
index 0d8fd0b1ec..d7316d4298 100644
--- a/station_gui.c
+++ b/station_gui.c
@@ -432,7 +432,7 @@ static void DrawStationViewWindow(Window *w)
 
 		y = 77;
 		for(i=0; i!=NUM_CARGO; i++) {
-			if (st->goods[i].enroute_from != 0xFF) {
+			if (st->goods[i].enroute_from != INVALID_STATION) {
 				SetDParam(0, _cargoc.names_s[i]);
 				SetDParam(2, st->goods[i].rating * 101 >> 8);
 				SetDParam(1, STR_3035_APPALLING + (st->goods[i].rating >> 5));
diff --git a/train_cmd.c b/train_cmd.c
index d9473be930..3f56fa801b 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -586,7 +586,7 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 			v->cargo_cap = rvi->capacity;
 			v->max_speed = rvi->max_speed;
 			v->value = value;
-			v->last_station_visited = 0xFFFF;
+			v->last_station_visited = INVALID_STATION;
 			v->dest_tile = 0;
 
 			v->engine_type = (byte)p1;
@@ -1938,7 +1938,7 @@ static bool ProcessTrainOrder(Vehicle *v)
 	switch (order->type) {
 		case OT_GOTO_STATION:
 			if (order->station == v->last_station_visited)
-				v->last_station_visited = 0xFFFF;
+				v->last_station_visited = INVALID_STATION;
 			v->dest_tile = GetStation(order->station)->xy;
 			result = CheckReverseTrain(v);
 			break;
diff --git a/vehicle.c b/vehicle.c
index aa83185b5f..01cffe049d 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -1807,7 +1807,8 @@ const byte _common_veh_desc[] = {
 
 	SLE_VAR(Vehicle,cargo_type,				SLE_UINT8),
 	SLE_VAR(Vehicle,cargo_days,				SLE_UINT8),
-	SLE_VAR(Vehicle,cargo_source,			SLE_UINT8),
+	SLE_CONDVAR(Vehicle,cargo_source,			SLE_FILE_U8 | SLE_VAR_U16, 0, 6),
+	SLE_CONDVAR(Vehicle,cargo_source,			SLE_UINT16, 7, 255),
 	SLE_VAR(Vehicle,cargo_cap,				SLE_UINT16),
 	SLE_VAR(Vehicle,cargo_count,			SLE_UINT16),
 
diff --git a/vehicle.h b/vehicle.h
index 8c626908a6..a180036d9e 100644
--- a/vehicle.h
+++ b/vehicle.h
@@ -138,7 +138,7 @@ struct Vehicle {
 
 	byte cargo_type;	// type of cargo this vehicle is carrying
 	byte cargo_days; // how many days have the pieces been in transit
-	byte cargo_source;// source of cargo
+	uint16 cargo_source;// source of cargo
 	uint16 cargo_cap;	// total capacity
 	uint16 cargo_count;// how many pieces are used