Index: src/ai/default/default.cpp
===================================================================
--- src/ai/default/default.cpp	(revision 10622)
+++ src/ai/default/default.cpp	(working copy)
@@ -139,7 +139,7 @@
 	CommandCost ret;
 	EngineID i;
 
-	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
+	for (i = 0; i < NUM_TRAIN_ENGINES * MAX_ENGINE_SETS; i++) {
 		const RailVehicleInfo *rvi = RailVehInfo(i);
 		const Engine* e = GetEngine(i);
 
@@ -165,35 +165,38 @@
 {
 	EngineID best_veh_index = INVALID_ENGINE;
 	int32 best_veh_rating = 0;
-	EngineID i = ROAD_ENGINES_INDEX;
-	EngineID end = i + NUM_ROAD_ENGINES;
+	EngineID j;
+	EngineID i;
+	EngineID end = ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES;
 
-	for (; i != end; i++) {
-		const RoadVehicleInfo *rvi = RoadVehInfo(i);
-		const Engine* e = GetEngine(i);
-		int32 rating;
-		CommandCost ret;
+	for (j = 0; j < MAX_ENGINE_SETS; j++) {
+		for (i = ROAD_ENGINES_INDEX + j * 0x100; i != end + j * 0x100; i++) {
+			const RoadVehicleInfo *rvi = RoadVehInfo(i);
+			const Engine* e = GetEngine(i);
+			int32 rating;
+			CommandCost ret;
 
-		if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
-			continue;
-		}
+			if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
+				continue;
+			}
 
-		/* Skip vehicles which can't take our cargo type */
-		if (rvi->cargo_type != cargo && !CanRefitTo(i, cargo)) continue;
+			/* Skip vehicles which can't take our cargo type */
+			if (rvi->cargo_type != cargo && !CanRefitTo(i, cargo)) continue;
 
-		/* Rate and compare the engine by speed & capacity */
-		rating = rvi->max_speed * rvi->capacity;
-		if (rating <= best_veh_rating) continue;
+			/* Rate and compare the engine by speed & capacity */
+			rating = rvi->max_speed * rvi->capacity;
+			if (rating <= best_veh_rating) continue;
 
-		ret = DoCommand(tile, i, 0, 0, CMD_BUILD_ROAD_VEH);
-		if (CmdFailed(ret)) continue;
+			ret = DoCommand(tile, i, 0, 0, CMD_BUILD_ROAD_VEH);
+			if (CmdFailed(ret)) continue;
 
-		/* Add the cost of refitting */
-		if (rvi->cargo_type != cargo) ret.AddCost(GetRefitCost(i));
-		if (ret.GetCost() > money) continue;
+			/* Add the cost of refitting */
+			if (rvi->cargo_type != cargo) ret.AddCost(GetRefitCost(i));
+			if (ret.GetCost() > money) continue;
 
-		best_veh_rating = rating;
-		best_veh_index = i;
+			best_veh_rating = rating;
+			best_veh_index = i;
+		}
 	}
 
 	return best_veh_index;
@@ -203,22 +206,24 @@
 {
 	EngineID best_veh_index = INVALID_ENGINE;
 	Money best_veh_cost = 0;
-	EngineID i;
+	EngineID i, j;
 
-	for (i = AIRCRAFT_ENGINES_INDEX; i != AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; i++) {
-		const Engine* e = GetEngine(i);
-		CommandCost ret;
+	for (j = 0; j < MAX_ENGINE_SETS; j++) {
+		for (i = AIRCRAFT_ENGINES_INDEX + 0x100 * j; i != AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES + 0x100 * j; i++) {
+			const Engine* e = GetEngine(i);
+			CommandCost ret;
 
-		if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
-			continue;
-		}
+			if (!HASBIT(e->player_avail, _current_player) || e->reliability < 0x8A3D) {
+				continue;
+			}
 
-		if ((AircraftVehInfo(i)->subtype & AIR_CTOL) != flag) continue;
+			if ((AircraftVehInfo(i)->subtype & AIR_CTOL) != flag) continue;
 
-		ret = DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_AIRCRAFT);
-		if (CmdSucceeded(ret) && ret.GetCost() <= money && ret.GetCost() >= best_veh_cost) {
-			best_veh_cost = ret.GetCost();
-			best_veh_index = i;
+			ret = DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_AIRCRAFT);
+			if (CmdSucceeded(ret) && ret.GetCost() <= money && ret.GetCost() >= best_veh_cost) {
+				best_veh_cost = ret.GetCost();
+				best_veh_index = i;
+			}
 		}
 	}
 
@@ -2434,7 +2439,7 @@
 	uint16 best_speed    = 0;
 	uint speed;
 
-	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
+	for (i = 0; i < NUM_TRAIN_ENGINES * MAX_ENGINE_SETS; i++) {
 		const RailVehicleInfo *rvi = RailVehInfo(i);
 		const Engine* e = GetEngine(i);
 
Index: src/ai/trolly/build.cpp
===================================================================
--- src/ai/trolly/build.cpp	(revision 10622)
+++ src/ai/trolly/build.cpp	(working copy)
@@ -236,32 +236,34 @@
 		int32 best_veh_rating = 0;
 		EngineID start = ROAD_ENGINES_INDEX;
 		EngineID end   = ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES;
-		EngineID i;
+		EngineID i, j;
 
 		/* Loop through all road vehicles */
-		for (i = start; i != end; i++) {
-			const RoadVehicleInfo *rvi = RoadVehInfo(i);
-			const Engine* e = GetEngine(i);
-			int32 rating;
-			CommandCost ret;
+		for (j = 0; j < MAX_ENGINE_SETS; j++) {
+			for (i = start + 0x100 * MAX_ENGINE_SETS; i != end + 0x100 * MAX_ENGINE_SETS; i++) {
+				const RoadVehicleInfo *rvi = RoadVehInfo(i);
+				const Engine* e = GetEngine(i);
+				int32 rating;
+				CommandCost ret;
 
-			/* Skip vehicles which can't take our cargo type */
-			if (rvi->cargo_type != p->ainew.cargo && !CanRefitTo(i, p->ainew.cargo)) continue;
+				/* Skip vehicles which can't take our cargo type */
+				if (rvi->cargo_type != p->ainew.cargo && !CanRefitTo(i, p->ainew.cargo)) continue;
 
-			// Is it availiable?
-			// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
-			if (!HASBIT(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
+				// Is it availiable?
+				// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
+				if (!HASBIT(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
 
-			/* Rate and compare the engine by speed & capacity */
-			rating = rvi->max_speed * rvi->capacity;
-			if (rating <= best_veh_rating) continue;
+				/* Rate and compare the engine by speed & capacity */
+				rating = rvi->max_speed * rvi->capacity;
+				if (rating <= best_veh_rating) continue;
 
-			// Can we build it?
-			ret = AI_DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH);
-			if (CmdFailed(ret)) continue;
+				// Can we build it?
+				ret = AI_DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH);
+				if (CmdFailed(ret)) continue;
 
-			best_veh_rating = rating;
-			best_veh_index = i;
+				best_veh_rating = rating;
+				best_veh_index = i;
+			}
 		}
 
 		return best_veh_index;
Index: src/autoreplace_gui.cpp
===================================================================
--- src/autoreplace_gui.cpp	(revision 10622)
+++ src/autoreplace_gui.cpp	(working copy)
@@ -145,11 +145,12 @@
 	EngineID selected_engine = INVALID_ENGINE;
 	byte type = w->window_number;
 	byte i = draw_left ? 0 : 1;
+	uint tmps = 0;
 
 	EngineList *list = &WP(w, replaceveh_d).list[i];
 	EngList_RemoveAll(list);
 
-	FOR_ALL_ENGINEIDS_OF_TYPE(e, type) {
+	FOR_ALL_ENGINEIDS_OF_TYPE(e, type, tmps) {
 		if (type == VEH_TRAIN && !GenerateReplaceRailList(e, draw_left, WP(w, replaceveh_d).wagon_btnstate)) continue; // special rules for trains
 
 		if (draw_left) {
Index: src/build_vehicle_gui.cpp
===================================================================
--- src/build_vehicle_gui.cpp	(revision 10622)
+++ src/build_vehicle_gui.cpp	(working copy)
@@ -467,7 +467,8 @@
 
 	/* Purchase Cost - Engine weight */
 	SetDParam(0, GetEngineProperty(engine_number, 0x17, rvi->base_cost) * (_price.build_railvehicle >> 3) >> 5);
-	SetDParam(1, weight << multihead);
+//SetDParam(1, weight << multihead);
+SetDParam(1, engine_number);
 	DrawString(x, y, STR_PURCHASE_INFO_COST_WEIGHT, 0);
 	y += 10;
 
@@ -667,7 +668,7 @@
 /* Figure out what train EngineIDs to put in the list */
 static void GenerateBuildTrainList(Window *w)
 {
-	EngineID eid, sel_id;
+	EngineID eid, sid, sel_id;
 	int num_engines = 0;
 	int num_wagons  = 0;
 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
@@ -680,20 +681,24 @@
 	 * Also check to see if the previously selected engine is still available,
 	 * and if not, reset selection to INVALID_ENGINE. This could be the case
 	 * when engines become obsolete and are removed */
-	for (sel_id = INVALID_ENGINE, eid = 0; eid < NUM_TRAIN_ENGINES; eid++) {
-		const RailVehicleInfo *rvi = RailVehInfo(eid);
+	sel_id = INVALID_ENGINE;
+	for (sid = 0; sid < MAX_ENGINE_SETS; sid++)
+	{
+		for (eid = 0 + 0x100 * sid; eid < NUM_TRAIN_ENGINES + 0x100 * sid; eid++) {
+			const RailVehicleInfo *rvi = RailVehInfo(eid);
 
-		if (bv->filter.railtype != RAILTYPE_END && !HasPowerOnRail(rvi->railtype, bv->filter.railtype)) continue;
-		if (!IsEngineBuildable(eid, VEH_TRAIN, _local_player)) continue;
+			if (bv->filter.railtype != RAILTYPE_END && !HasPowerOnRail(rvi->railtype, bv->filter.railtype)) continue;
+			if (!IsEngineBuildable(eid, VEH_TRAIN, _local_player)) continue;
 
-		EngList_Add(&bv->eng_list, eid);
-		if (rvi->railveh_type != RAILVEH_WAGON) {
-			num_engines++;
-		} else {
-			num_wagons++;
+			EngList_Add(&bv->eng_list, eid);
+			if (rvi->railveh_type != RAILVEH_WAGON) {
+				num_engines++;
+			} else {
+				num_wagons++;
+			}
+
+			if (eid == bv->sel_engine) sel_id = eid;
 		}
-
-		if (eid == bv->sel_engine) sel_id = eid;
 	}
 
 	bv->sel_engine = sel_id;
@@ -713,19 +718,20 @@
 /* Figure out what road vehicle EngineIDs to put in the list */
 static void GenerateBuildRoadVehList(Window *w)
 {
-	EngineID eid, sel_id;
+	EngineID eid, sid, sel_id;
 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
 
 	EngList_RemoveAll(&bv->eng_list);
 
 	sel_id = INVALID_ENGINE;
+	for (sid = 0; sid < MAX_ENGINE_SETS; sid++) {
+		for (eid = ROAD_ENGINES_INDEX + 0x100 * sid; eid < ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES + 0x100 * sid; eid++) {
+			if (!IsEngineBuildable(eid, VEH_ROAD, _local_player)) continue;
+			if (!HASBIT(bv->filter.roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
+			EngList_Add(&bv->eng_list, eid);
 
-	for (eid = ROAD_ENGINES_INDEX; eid < ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES; eid++) {
-		if (!IsEngineBuildable(eid, VEH_ROAD, _local_player)) continue;
-		if (!HASBIT(bv->filter.roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
-		EngList_Add(&bv->eng_list, eid);
-
-		if (eid == bv->sel_engine) sel_id = eid;
+			if (eid == bv->sel_engine) sel_id = eid;
+		}
 	}
 	bv->sel_engine = sel_id;
 }
@@ -733,18 +739,20 @@
 /* Figure out what ship EngineIDs to put in the list */
 static void GenerateBuildShipList(Window *w)
 {
-	EngineID eid, sel_id;
+	EngineID eid, sid, sel_id;
 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
 
 	EngList_RemoveAll(&bv->eng_list);
 
 	sel_id = INVALID_ENGINE;
 
-	for (eid = SHIP_ENGINES_INDEX; eid < SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES; eid++) {
-		if (!IsEngineBuildable(eid, VEH_SHIP, _local_player)) continue;
-		EngList_Add(&bv->eng_list, eid);
+	for (sid = 0; sid < MAX_ENGINE_SETS; sid++) {
+		for (eid = SHIP_ENGINES_INDEX + 0x100 * sid; eid < SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES + 0x100 * sid; eid++) {
+			if (!IsEngineBuildable(eid, VEH_SHIP, _local_player)) continue;
+			EngList_Add(&bv->eng_list, eid);
 
-		if (eid == bv->sel_engine) sel_id = eid;
+			if (eid == bv->sel_engine) sel_id = eid;
+		}
 	}
 	bv->sel_engine = sel_id;
 }
@@ -752,7 +760,7 @@
 /* Figure out what aircraft EngineIDs to put in the list */
 static void GenerateBuildAircraftList(Window *w)
 {
-	EngineID eid, sel_id;
+	EngineID eid, sid, sel_id;
 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
 
 	EngList_RemoveAll(&bv->eng_list);
@@ -762,13 +770,15 @@
 	 * and if not, reset selection to INVALID_ENGINE. This could be the case
 	 * when planes become obsolete and are removed */
 	sel_id = INVALID_ENGINE;
-	for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) {
-		if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
-		/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
-		if (w->window_number > VEH_END && !IsAircraftBuildableAtStation(eid, w->window_number)) continue;
+	for (sid = 0; sid < MAX_ENGINE_SETS; sid++) {
+		for (eid = AIRCRAFT_ENGINES_INDEX + 0x100 * sid; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES + 0x100 * sid; eid++) {
+			if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_player)) continue;
+			/* First VEH_END window_numbers are fake to allow a window open for all different types at once */
+			if (w->window_number > VEH_END && !IsAircraftBuildableAtStation(eid, w->window_number)) continue;
 
-		EngList_Add(&bv->eng_list, eid);
-		if (eid == bv->sel_engine) sel_id = eid;
+			EngList_Add(&bv->eng_list, eid);
+			if (eid == bv->sel_engine) sel_id = eid;
+		}
 	}
 
 	bv->sel_engine = sel_id;
Index: src/depot_gui.cpp
===================================================================
--- src/depot_gui.cpp	(revision 10622)
+++ src/depot_gui.cpp	(working copy)
@@ -655,8 +655,9 @@
 	EngineID engine;
 	uint max_width  = 0;
 	uint max_height = 0;
+	uint tmps = 0;
 
-	FOR_ALL_ENGINEIDS_OF_TYPE(engine, type) {
+	FOR_ALL_ENGINEIDS_OF_TYPE(engine, type, tmps) {
 		uint x, y;
 
 		switch (type) {
Index: src/elrail.cpp
===================================================================
--- src/elrail.cpp	(revision 10622)
+++ src/elrail.cpp	(working copy)
@@ -448,7 +448,7 @@
 	const RailType new_railtype = disable ? RAILTYPE_RAIL : RAILTYPE_ELECTRIC;
 
 	/* walk through all train engines */
-	for (e_id = 0; e_id < NUM_TRAIN_ENGINES; e_id++) {
+	for (e_id = 0; e_id < NUM_TRAIN_ENGINES * MAX_ENGINE_SETS; e_id++) {
 		RailVehicleInfo *rv_info = &_rail_vehicle_info[e_id];
 		/* if it is an electric rail engine and its railtype is the wrong one */
 		if (rv_info->engclass == 2 && rv_info->railtype == old_railtype) {
Index: src/engine.cpp
===================================================================
--- src/engine.cpp	(revision 10622)
+++ src/engine.cpp	(working copy)
@@ -24,11 +24,11 @@
 #include "string.h"
 #include "strings.h"
 
-EngineInfo _engine_info[TOTAL_NUM_ENGINES];
-RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES];
-ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES];
-AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
-RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES];
+EngineInfo _engine_info[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
+RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS];
+ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES * MAX_ENGINE_SETS];
+AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES * MAX_ENGINE_SETS];
+RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES * MAX_ENGINE_SETS];
 
 enum {
 	YEAR_ENGINE_AGING_STOPS = 2050,
@@ -39,13 +39,15 @@
 
 void DeleteCustomEngineNames()
 {
-	uint i;
+	uint i, j;
 	StringID old;
 
-	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
-		old = _engine_name_strings[i];
-		_engine_name_strings[i] = i + STR_8000_KIRBY_PAUL_TANK_STEAM;
-		DeleteName(old);
+	for (i = 0; i < MAX_ENGINE_SETS; i++) {
+		for (j = 0; j != TOTAL_NUM_ENGINES; j++) {
+			old = _engine_name_strings[j + i * 0x100];
+			_engine_name_strings[j + i * 0x100] = j + STR_8000_KIRBY_PAUL_TANK_STEAM;
+			DeleteName(old);
+		}
 	}
 
 	_vehicle_design_names &= ~1;
@@ -107,12 +109,16 @@
 
 void AddTypeToEngines()
 {
+	uint i;
 	Engine* e = _engines;
 
-	do e->type = VEH_TRAIN;    while (++e < &_engines[ROAD_ENGINES_INDEX]);
-	do e->type = VEH_ROAD;     while (++e < &_engines[SHIP_ENGINES_INDEX]);
-	do e->type = VEH_SHIP;     while (++e < &_engines[AIRCRAFT_ENGINES_INDEX]);
-	do e->type = VEH_AIRCRAFT; while (++e < &_engines[TOTAL_NUM_ENGINES]);
+	for (i = 0; i < MAX_ENGINE_SETS; i++)
+	{
+		do e->type = VEH_TRAIN;    while (++e < &_engines[ROAD_ENGINES_INDEX + i * 0x100]);
+		do e->type = VEH_ROAD;     while (++e < &_engines[SHIP_ENGINES_INDEX + i * 0x100]);
+		do e->type = VEH_SHIP;     while (++e < &_engines[AIRCRAFT_ENGINES_INDEX + i * 0x100]);
+		do e->type = VEH_AIRCRAFT; while (++e < &_engines[TOTAL_NUM_ENGINES + i * 0x100]);
+	}
 }
 
 void StartupEngines()
@@ -284,7 +290,7 @@
 /* Determine if an engine type is a wagon (and not a loco) */
 static bool IsWagon(EngineID index)
 {
-	return index < NUM_TRAIN_ENGINES && RailVehInfo(index)->railveh_type == RAILVEH_WAGON;
+	return index % 0x100 < NUM_TRAIN_ENGINES && RailVehInfo(index)->railveh_type == RAILVEH_WAGON;
 }
 
 static void NewVehicleAvailable(Engine *e)
@@ -326,7 +332,7 @@
 	/* Do not introduce new rail wagons */
 	if (IsWagon(index)) return;
 
-	if (index < NUM_TRAIN_ENGINES) {
+	if (index%0x100 < NUM_TRAIN_ENGINES) {
 		/* maybe make another rail type available */
 		RailType railtype = RailVehInfo(index)->railtype;
 		assert(railtype < RAILTYPE_END);
@@ -334,7 +340,7 @@
 			if (p->is_active) SETBIT(p->avail_railtypes, railtype);
 		}
 	}
-	if ((index - NUM_TRAIN_ENGINES) < NUM_ROAD_ENGINES) {
+	if ((index%0x100 - NUM_TRAIN_ENGINES) < NUM_ROAD_ENGINES) {
 		/* maybe make another road type available */
 		FOR_ALL_PLAYERS(p) {
 			if (p->is_active) SETBIT(p->avail_roadtypes, HASBIT(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
@@ -374,7 +380,7 @@
 {
 	char buf[512];
 
-	for (EngineID i = 0; i < TOTAL_NUM_ENGINES; i++) {
+	for (EngineID i = 0; i < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; i++) {
 		SetDParam(0, i);
 		GetString(buf, STR_ENGINE_NAME, lastof(buf));
 		if (strcmp(buf, name) == 0) return false;
Index: src/engine.h
===================================================================
--- src/engine.h	(revision 10622)
+++ src/engine.h	(working copy)
@@ -147,8 +147,9 @@
 };
 
 static const EngineID INVALID_ENGINE = 0xFFFF;
+//static const byte MAX_ENGINE_SETS = 0x0F;
+static const byte MAX_ENGINE_SETS = 2;
 
-
 void AddTypeToEngines();
 void StartupEngines();
 
@@ -196,9 +197,9 @@
 	return end[type];
 }
 
-VARDEF Engine _engines[TOTAL_NUM_ENGINES];
+VARDEF Engine _engines[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 #define FOR_ALL_ENGINES(e) for (e = _engines; e != endof(_engines); e++)
-#define FOR_ALL_ENGINEIDS_OF_TYPE(e, type) for (e = GetFirstEngineOfType(type); e != GetLastEngineOfType(type); e++)
+#define FOR_ALL_ENGINEIDS_OF_TYPE(e, type, s) for (s = 0; s < MAX_ENGINE_SETS; s++) for (e = GetFirstEngineOfType(type) + s * 0x100; e != GetLastEngineOfType(type) + s * 0x100; e++)
 
 
 static inline Engine* GetEngine(EngineID i)
@@ -207,26 +208,26 @@
 	return &_engines[i];
 }
 
-VARDEF StringID _engine_name_strings[TOTAL_NUM_ENGINES];
+VARDEF StringID _engine_name_strings[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 static inline bool IsEngineIndex(uint index)
 {
-	return index < TOTAL_NUM_ENGINES;
+	return index < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS;
 }
 
 /* Access Vehicle Data */
 //#include "table/engines.h"
-extern const EngineInfo orig_engine_info[TOTAL_NUM_ENGINES];
-extern const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES];
-extern const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES];
-extern const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
-extern const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES];
+extern const EngineInfo orig_engine_info[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
+extern const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS];
+extern const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES * MAX_ENGINE_SETS];
+extern const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES * MAX_ENGINE_SETS];
+extern const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES * MAX_ENGINE_SETS];
 
-extern EngineInfo _engine_info[TOTAL_NUM_ENGINES];
-extern RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES];
-extern ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES];
-extern AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES];
-extern RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES];
+extern EngineInfo _engine_info[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
+extern RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS];
+extern ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES * MAX_ENGINE_SETS];
+extern AircraftVehicleInfo _aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES * MAX_ENGINE_SETS];
+extern RoadVehicleInfo _road_vehicle_info[NUM_ROAD_ENGINES * MAX_ENGINE_SETS];
 
 static inline const EngineInfo *EngInfo(EngineID e)
 {
@@ -236,26 +237,30 @@
 
 static inline const RailVehicleInfo* RailVehInfo(EngineID e)
 {
-	assert(e < lengthof(_rail_vehicle_info));
-	return &_rail_vehicle_info[e];
+	uint16 offset = e / 0x100;
+	assert((e % 0x100) < NUM_TRAIN_ENGINES);
+	return &_rail_vehicle_info[e - (0x100 - NUM_TRAIN_ENGINES) * offset];
 }
 
 static inline const ShipVehicleInfo* ShipVehInfo(EngineID e)
 {
-	assert(e >= SHIP_ENGINES_INDEX && e < SHIP_ENGINES_INDEX + lengthof(_ship_vehicle_info));
-	return &_ship_vehicle_info[e - SHIP_ENGINES_INDEX];
+	uint16 offset = e / 0x100;
+	assert(((e % 0x100) >= SHIP_ENGINES_INDEX) && ((e % 0x100) < (SHIP_ENGINES_INDEX + NUM_SHIP_ENGINES)));
+	return &_ship_vehicle_info[e - SHIP_ENGINES_INDEX - (0x100 - NUM_SHIP_ENGINES) * offset];
 }
 
 static inline const AircraftVehicleInfo* AircraftVehInfo(EngineID e)
 {
-	assert(e >= AIRCRAFT_ENGINES_INDEX && e < AIRCRAFT_ENGINES_INDEX + lengthof(_aircraft_vehicle_info));
-	return &_aircraft_vehicle_info[e - AIRCRAFT_ENGINES_INDEX];
+	uint16 offset = e / 0x100;
+	assert((e % 0x100) >= AIRCRAFT_ENGINES_INDEX && (e % 0x100) < (AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES));
+	return &_aircraft_vehicle_info[e - AIRCRAFT_ENGINES_INDEX - (0x100 - NUM_AIRCRAFT_ENGINES) * offset];
 }
 
 static inline const RoadVehicleInfo* RoadVehInfo(EngineID e)
 {
-	assert(e >= ROAD_ENGINES_INDEX && e < ROAD_ENGINES_INDEX + lengthof(_road_vehicle_info));
-	return &_road_vehicle_info[e - ROAD_ENGINES_INDEX];
+	uint16 offset = e / 0x100;
+	assert(e % 0x100 >= ROAD_ENGINES_INDEX && (e % 0x100) < (ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES));
+	return &_road_vehicle_info[e - ROAD_ENGINES_INDEX - (0x100 - NUM_ROAD_ENGINES) * offset];
 }
 
 /************************************************************************
Index: src/group.h
===================================================================
--- src/group.h	(revision 10622)
+++ src/group.h	(working copy)
@@ -22,7 +22,7 @@
 	VehicleTypeByte vehicle_type;           ///< Vehicle type of the group
 
 	bool replace_protection;                ///< If set to true, the global autoreplace have no effect on the group
-	uint16 num_engines[TOTAL_NUM_ENGINES];  ///< Caches the number of engines of each type the player owns (no need to save this)
+	uint16 num_engines[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];  ///< Caches the number of engines of each type the player owns (no need to save this)
 };
 
 DECLARE_OLD_POOL(Group, Group, 5, 2047)
Index: src/newgrf.cpp
===================================================================
--- src/newgrf.cpp	(revision 10622)
+++ src/newgrf.cpp	(working copy)
@@ -126,11 +126,11 @@
 	MAX_STATIONS = 256,
 };
 
-static uint16 cargo_allowed[TOTAL_NUM_ENGINES];
-static uint16 cargo_disallowed[TOTAL_NUM_ENGINES];
+static uint16 cargo_allowed[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
+static uint16 cargo_disallowed[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 /* Contains the GRF ID of the owner of a vehicle if it has been reserved */
-static uint32 _grm_engines[TOTAL_NUM_ENGINES];
+static uint32 _grm_engines[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 /* Contains the GRF ID of the owner of a cargo if it has been reserved */
 static uint32 _grm_cargos[NUM_CARGO];
@@ -287,8 +287,9 @@
 
 static void dewagonize(int condition, int engine)
 {
+	int offset = engine / 0x100;
 	EngineInfo *ei = &_engine_info[engine];
-	RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
+	RailVehicleInfo *rvi = &_rail_vehicle_info[engine - NUM_TRAIN_ENGINES * offset];
 
 	if (condition != 0) {
 		ei->unk2 &= ~0x80;
@@ -306,7 +307,8 @@
 	bool ret = false;
 
 	for (int i = 0; i < numinfo; i++) {
-		EngineInfo *ei       = &_engine_info[engine + i];
+		int offset = (engine + i) / NUM_TRAIN_ENGINES;
+		EngineInfo *ei       = &_engine_info[0x100 * offset + engine + i];
 		RailVehicleInfo *rvi = &_rail_vehicle_info[engine + i];
 
 		switch (prop) {
@@ -556,7 +558,8 @@
 	bool ret = false;
 
 	for (int i = 0; i < numinfo; i++) {
-		EngineInfo *ei       = &_engine_info[ROAD_ENGINES_INDEX + engine + i];
+		int offset = (engine + i) / NUM_ROAD_ENGINES;
+		EngineInfo *ei       = &_engine_info[ROAD_ENGINES_INDEX * (offset + 1) + 0x100 * offset + engine + i];
 		RoadVehicleInfo *rvi = &_road_vehicle_info[engine + i];
 
 		switch (prop) {
@@ -675,7 +678,8 @@
 	bool ret = false;
 
 	for (int i = 0; i < numinfo; i++) {
-		EngineInfo *ei       = &_engine_info[SHIP_ENGINES_INDEX + engine + i];
+		int offset = (engine + i) / NUM_SHIP_ENGINES;
+		EngineInfo *ei       = &_engine_info[SHIP_ENGINES_INDEX * (offset + 1) + 0x100 * offset + engine + i];
 		ShipVehicleInfo *svi = &_ship_vehicle_info[engine + i];
 
 		switch (prop) {
@@ -781,7 +785,8 @@
 	bool ret = false;
 
 	for (int i = 0; i < numinfo; i++) {
-		EngineInfo *ei           = &_engine_info[AIRCRAFT_ENGINES_INDEX + engine + i];
+		int offset = (engine + i) / NUM_AIRCRAFT_ENGINES;
+		EngineInfo *ei       = &_engine_info[AIRCRAFT_ENGINES_INDEX * (offset + 1) + 0x100 * offset + engine + i];
 		AircraftVehicleInfo *avi = &_aircraft_vehicle_info[engine + i];
 
 		switch (prop) {
@@ -5073,7 +5078,7 @@
  */
 static void CalculateRefitMasks()
 {
-	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
+	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; engine++) {
 		uint32 mask = 0;
 		uint32 not_mask = 0;
 		uint32 xor_mask = 0;
@@ -5132,23 +5137,24 @@
 
 		/* Check if this engine's cargo type is valid. If not, set to the first refittable
 		 * cargo type. Apparently cargo_type isn't a common property... */
+		int offset = engine / 0x100;
 		switch (GetEngine(engine)->type) {
 			default: NOT_REACHED();
 			case VEH_AIRCRAFT: break;
 			case VEH_TRAIN: {
-				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
+				RailVehicleInfo *rvi = &_rail_vehicle_info[engine - NUM_TRAIN_ENGINES * offset];
 				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
 				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
 				break;
 			}
 			case VEH_ROAD: {
-				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
+				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX * (offset + 1) - NUM_ROAD_ENGINES * offset];
 				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
 				if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
 				break;
 			}
 			case VEH_SHIP: {
-				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
+				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX * (offset + 1) - NUM_SHIP_ENGINES * offset];
 				if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
 				if (svi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
 				break;
Index: src/newgrf_engine.cpp
===================================================================
--- src/newgrf_engine.cpp	(revision 10622)
+++ src/newgrf_engine.cpp	(working copy)
@@ -38,14 +38,14 @@
 	WagonOverride *overrides;
 };
 
-static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
+static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
 {
 	WagonOverrides *wos;
 	WagonOverride *wo;
 
-	assert(engine < TOTAL_NUM_ENGINES);
+	assert(engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS);
 	assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargos.
 
 	wos = &_engine_wagon_overrides[engine];
@@ -94,7 +94,7 @@
 	EngineID engine;
 	int i;
 
-	for (engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
+	for (engine = 0; engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; engine++) {
 		wos = &_engine_wagon_overrides[engine];
 		for (i = 0; i < wos->overrides_count; i++) {
 			wo = &wos->overrides[i];
@@ -108,8 +108,8 @@
 }
 
 /* Space for NUM_CARGO real cargos and 2 pseudo cargos, CT_DEFAULT and CT_PURCHASE */
-static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_CARGO + 2];
-static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES];
+static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS][NUM_CARGO + 2];
+static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
 {
@@ -131,18 +131,19 @@
 	memset(_engine_grf, 0, sizeof(_engine_grf));
 }
 
-static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES];
+static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES * MAX_ENGINE_SETS];
 
 /** Load a rotor override sprite group for an aircraft */
 void SetRotorOverrideSprites(EngineID engine, const SpriteGroup *group)
 {
-	assert(engine >= AIRCRAFT_ENGINES_INDEX);
-	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
+	uint16 offset = engine / 0x100;
+	assert(engine%0x100 >= AIRCRAFT_ENGINES_INDEX);
+	assert(engine%0x100 < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
 
-	if (heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] != NULL) {
+	if (heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX - (0x100 - NUM_AIRCRAFT_ENGINES) * offset] != NULL) {
 		grfmsg(6, "SetRotorOverrideSprites: engine %d already has group -- replacing.", engine);
 	}
-	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group;
+	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX - (0x100 - NUM_AIRCRAFT_ENGINES) * offset] = group;
 }
 
 /** Unload all rotor override sprite groups */
@@ -152,8 +153,10 @@
 
 	/* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means
 	 * the context of EngineID is correct */
-	for (engine = AIRCRAFT_ENGINES_INDEX; engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; engine++) {
-		heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = NULL;
+	for (int i = 0; i < MAX_ENGINE_SETS; i++) {
+		for (engine = AIRCRAFT_ENGINES_INDEX + 0x100 * i; engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES + 0x100 * i; engine++) {
+			heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX - (0x100 - NUM_AIRCRAFT_ENGINES) * i] = NULL;
+		}
 	}
 }
 
@@ -166,7 +169,7 @@
  */
 void SetEngineGRF(EngineID engine, const GRFFile *file)
 {
-	assert(engine < TOTAL_NUM_ENGINES);
+	assert(engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS);
 	_engine_grf[engine] = file;
 }
 
@@ -178,7 +181,7 @@
  */
 const GRFFile *GetEngineGRF(EngineID engine)
 {
-	assert(engine < TOTAL_NUM_ENGINES);
+	assert(engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS);
 	return _engine_grf[engine];
 }
 
@@ -190,7 +193,7 @@
  */
 uint32 GetEngineGRFID(EngineID engine)
 {
-	assert(engine < TOTAL_NUM_ENGINES);
+	assert(engine < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS);
 	return _engine_grf[engine]->grfid;
 }
 
@@ -897,8 +900,8 @@
 	const SpriteGroup *group;
 	ResolverObject object;
 
-	assert(engine >= AIRCRAFT_ENGINES_INDEX);
-	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
+	assert(engine%0x100 >= AIRCRAFT_ENGINES_INDEX);
+	assert(engine%0x100 < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
 
 	/* Only valid for helicopters */
 	assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL));
@@ -907,7 +910,8 @@
 
 	object.info_view = info_view;
 
-	group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX];
+	int offset = engine / 0x100;
+	group = heli_rotor_custom_sprites[ - AIRCRAFT_ENGINES_INDEX - (0x100 - NUM_AIRCRAFT_ENGINES) * offset];
 	group = Resolve(group, &object);
 
 	if (group == NULL || group->type != SGT_RESULT) return 0;
@@ -1070,7 +1074,7 @@
 	DoTriggerVehicle(v, trigger, 0, true);
 }
 
-StringID _engine_custom_names[TOTAL_NUM_ENGINES];
+StringID _engine_custom_names[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS];
 
 void SetCustomEngineName(EngineID engine, StringID name)
 {
@@ -1081,7 +1085,7 @@
 void UnloadCustomEngineNames()
 {
 	EngineID i;
-	for (i = 0; i < TOTAL_NUM_ENGINES; i++) {
+	for (i = 0; i < TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; i++) {
 		_engine_custom_names[i] = 0;
 	}
 }
@@ -1093,16 +1097,18 @@
 
 /* Functions for changing the order of vehicle purchase lists
  * This is currently only implemented for rail vehicles. */
-static EngineID _engine_list_order[NUM_TRAIN_ENGINES];
-static byte _engine_list_position[NUM_TRAIN_ENGINES];
+static EngineID _engine_list_order[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS];
+static EngineID _engine_list_position[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS];
 
 void ResetEngineListOrder()
 {
-	EngineID i;
+	EngineID i, j;
 
-	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
-		_engine_list_order[i] = i;
-		_engine_list_position[i] = i;
+	for (j = 0; j < MAX_ENGINE_SETS; j++) {
+		for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
+			_engine_list_order[i + j * NUM_TRAIN_ENGINES] = i + j * 0x100;
+			_engine_list_position[i + j * 0x100] = i + j * NUM_TRAIN_ENGINES;
+		}
 	}
 }
 
@@ -1114,7 +1120,7 @@
  */
 EngineID GetRailVehAtPosition(EngineID pos)
 {
-	if (pos < NUM_TRAIN_ENGINES) return _engine_list_order[pos];
+	if (pos < lengthof(_engine_list_order)) return _engine_list_order[pos];
 	return pos;
 }
 
@@ -1126,7 +1132,7 @@
  */
 uint16 ListPositionOfEngine(EngineID engine)
 {
-	if (engine < NUM_TRAIN_ENGINES) return _engine_list_position[engine];
+	if (engine%0x100 < NUM_TRAIN_ENGINES) return _engine_list_position[engine];
 	return engine;
 }
 
Index: src/player.h
===================================================================
--- src/player.h	(revision 10622)
+++ src/player.h	(working copy)
@@ -205,7 +205,7 @@
 	bool renew_keep_length;
 	int16 engine_renew_months;
 	uint32 engine_renew_money;
-	uint16 num_engines[TOTAL_NUM_ENGINES]; ///< caches the number of engines of each type the player owns (no need to save this)
+	uint16 num_engines[TOTAL_NUM_ENGINES * MAX_ENGINE_SETS]; ///< caches the number of engines of each type the player owns (no need to save this)
 };
 
 uint16 GetDrawStringPlayerColor(PlayerID player);
Index: src/players.cpp
===================================================================
--- src/players.cpp	(revision 10622)
+++ src/players.cpp	(working copy)
@@ -586,7 +586,7 @@
 	byte rt = 0;
 	EngineID i;
 
-	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
+	for (i = 0; i != TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; i++) {
 		const Engine* e = GetEngine(i);
 		const EngineInfo *ei = EngInfo(i);
 
@@ -609,7 +609,7 @@
 	byte rt = 0;
 	EngineID i;
 
-	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
+	for (i = 0; i != TOTAL_NUM_ENGINES * MAX_ENGINE_SETS; i++) {
 		const Engine* e = GetEngine(i);
 		const EngineInfo *ei = EngInfo(i);
 
Index: src/table/engines.h
===================================================================
--- src/table/engines.h	(revision 10622)
+++ src/table/engines.h	(working copy)
@@ -320,6 +320,263 @@
 	MA( 13575,  20,  20,  40, T|A|S  ), /* 253 Tricario Helicopter */
 	MA( 28215,  20,  20,  30, T|A|S  ), /* 254 Guru X2 Helicopter */
 	MK( 13575,  20,  20,  99,       Y), /* 255  */
+/**/
+	MK(  1827,  20,  15,  30, 0      ), /*   0 Kirby Paul Tank (Steam) */
+	MK( 12784,  20,  22,  30,   A|S  ), /*   1 MJS 250 (Diesel) */
+	MK(  9497,  20,  20,  50,       Y), /*   2 Ploddyphut Choo-Choo */
+	MK( 11688,  20,  20,  30,       Y), /*   3 Powernaut Choo-Choo */
+	MK( 16802,  20,  20,  30,       Y), /*   4 Mightymover Choo-Choo */
+	MK( 18993,  20,  20,  30,       Y), /*   5 Ploddyphut Diesel */
+	MK( 20820,  20,  20,  30,       Y), /*   6 Powernaut Diesel */
+	MK(  8766,  20,  20,  30,   A|S  ), /*   7 Wills 2-8-0 (Steam) */
+	MK(  5114,  20,  21,  30, T      ), /*   8 Chaney 'Jubilee' (Steam) */
+	MK(  5479,  20,  20,  30, T      ), /*   9 Ginzu 'A4' (Steam) */
+	MK( 12419,  20,  23,  25, T      ), /*  10 SH '8P' (Steam) */
+	MK( 13149,  20,  12,  30, T      ), /*  11 Manley-Morel DMU (Diesel) */
+	MK( 23376,  20,  15,  35, T      ), /*  12 'Dash' (Diesel) */
+	MK( 14976,  20,  18,  28, T      ), /*  13 SH/Hendry '25' (Diesel) */
+	MK( 14245,  20,  20,  30, T      ), /*  14 UU '37' (Diesel) */
+	MK( 15341,  20,  22,  33, T      ), /*  15 Floss '47' (Diesel) */
+	MK( 14976,  20,  20,  25,   A|S  ), /*  16 CS 4000 (Diesel) */
+	MK( 16437,  20,  20,  30,   A|S  ), /*  17 CS 2400 (Diesel) */
+	MK( 18993,  20,  22,  30,   A|S  ), /*  18 Centennial (Diesel) */
+	MK( 13880,  20,  22,  30,   A|S  ), /*  19 Kelling 3100 (Diesel) */
+	MK( 20454,  20,  22,  30,   A|S  ), /*  20 Turner Turbo (Diesel) */
+	MK( 16071,  20,  22,  30,   A|S  ), /*  21 MJS 1000 (Diesel) */
+	MK( 20820,  20,  20,  25, T      ), /*  22 SH '125' (Diesel) */
+	MK( 16437,  20,  23,  30, T      ), /*  23 SH '30' (Electric) */
+	MK( 19359,  20,  23,  80, T      ), /*  24 SH '40' (Electric) */
+	MK( 23376,  20,  25,  30, T      ), /*  25 'T.I.M.' (Electric) */
+	MK( 26298,  20,  25,  50, T      ), /*  26 'AsiaStar' (Electric) */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  27 Passenger Carriage */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  28 Mail Van */
+	MW(  1827,  20,  20,  50, T|A    ), /*  29 Coal Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  30 Oil Tanker */
+	MW(  1827,  20,  20,  50, T|A    ), /*  31 Livestock Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  32 Goods Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  33 Grain Hopper */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  34 Wood Truck */
+	MW(  1827,  20,  20,  50, T      ), /*  35 Iron Ore Hopper */
+	MW(  1827,  20,  20,  50, T      ), /*  36 Steel Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  37 Armoured Van */
+	MW(  1827,  20,  20,  50,   A|S  ), /*  38 Food Van */
+	MW(  1827,  20,  20,  50,   A    ), /*  39 Paper Truck */
+	MW(  1827,  20,  20,  50,     S  ), /*  40 Copper Ore Hopper */
+	MW(  1827,  20,  20,  50,     S  ), /*  41 Water Tanker */
+	MW(  1827,  20,  20,  50,     S  ), /*  42 Fruit Truck */
+	MW(  1827,  20,  20,  50,     S  ), /*  43 Rubber Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  44 Sugar Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  45 Candyfloss Hopper */
+	MW(  1827,  20,  20,  50,       Y), /*  46 Toffee Hopper */
+	MW(  1827,  20,  20,  50,       Y), /*  47 Bubble Van */
+	MW(  1827,  20,  20,  50,       Y), /*  48 Cola Tanker */
+	MW(  1827,  20,  20,  50,       Y), /*  49 Sweet Van */
+	MW(  1827,  20,  20,  50,       Y), /*  50 Toy Van */
+	MW(  1827,  20,  20,  50,       Y), /*  51 Battery Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  52 Fizzy Drink Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  53 Plastic Truck */
+	MK( 28490,  20,  20,  50, T|A|S  ), /*  54 'X2001' (Electric) */
+	MK( 31047,  20,  20,  50, T|A|S  ), /*  55 'Millennium Z1' (Electric) */
+	MK( 28855,  20,  20,  50,       Y), /*  56 Wizzowow Z99 */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  57 Passenger Carriage */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  58 Mail Van */
+	MW(  1827,  20,  20,  50, T|A    ), /*  59 Coal Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  60 Oil Tanker */
+	MW(  1827,  20,  20,  50, T|A    ), /*  61 Livestock Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  62 Goods Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  63 Grain Hopper */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  64 Wood Truck */
+	MW(  1827,  20,  20,  50, T      ), /*  65 Iron Ore Hopper */
+	MW(  1827,  20,  20,  50, T      ), /*  66 Steel Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  67 Armoured Van */
+	MW(  1827,  20,  20,  50,   A|S  ), /*  68 Food Van */
+	MW(  1827,  20,  20,  50,   A    ), /*  69 Paper Truck */
+	MW(  1827,  20,  20,  50,     S  ), /*  70 Copper Ore Hopper */
+	MW(  1827,  20,  20,  50,     S  ), /*  71 Water Tanker */
+	MW(  1827,  20,  20,  50,     S  ), /*  72 Fruit Truck */
+	MW(  1827,  20,  20,  50,     S  ), /*  73 Rubber Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  74 Sugar Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  75 Candyfloss Hopper */
+	MW(  1827,  20,  20,  50,       Y), /*  76 Toffee Hopper */
+	MW(  1827,  20,  20,  50,       Y), /*  77 Bubble Van */
+	MW(  1827,  20,  20,  50,       Y), /*  78 Cola Tanker */
+	MW(  1827,  20,  20,  50,       Y), /*  79 Sweet Van */
+	MW(  1827,  20,  20,  50,       Y), /*  80 Toy Van */
+	MW(  1827,  20,  20,  50,       Y), /*  81 Battery Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  82 Fizzy Drink Truck */
+	MW(  1827,  20,  20,  50,       Y), /*  83 Plastic Truck */
+	MK( 36525,  20,  20,  50, T|A|S  ), /*  84 Lev1 'Leviathan' (Electric) */
+	MK( 39447,  20,  20,  50, T|A|S  ), /*  85 Lev2 'Cyclops' (Electric) */
+	MK( 42004,  20,  20,  50, T|A|S  ), /*  86 Lev3 'Pegasus' (Electric) */
+	MK( 42735,  20,  20,  50, T|A|S  ), /*  87 Lev4 'Chimaera' (Electric) */
+	MK( 36891,  20,  20,  60,       Y), /*  88 Wizzowow Rocketeer */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  89 Passenger Carriage */
+	MW(  1827,  20,  20,  50, T|A|S|Y), /*  90 Mail Van */
+	MW(  1827,  20,  20,  50, T|A    ), /*  91 Coal Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  92 Oil Tanker */
+	MW(  1827,  20,  20,  50, T|A    ), /*  93 Livestock Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  94 Goods Van */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  95 Grain Hopper */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  96 Wood Truck */
+	MW(  1827,  20,  20,  50, T      ), /*  97 Iron Ore Hopper */
+	MW(  1827,  20,  20,  50, T      ), /*  98 Steel Truck */
+	MW(  1827,  20,  20,  50, T|A|S  ), /*  99 Armoured Van */
+	MW(  1827,  20,  20,  50,   A|S  ), /* 100 Food Van */
+	MW(  1827,  20,  20,  50,   A    ), /* 101 Paper Truck */
+	MW(  1827,  20,  20,  50,     S  ), /* 102 Copper Ore Hopper */
+	MW(  1827,  20,  20,  50,     S  ), /* 103 Water Tanker */
+	MW(  1827,  20,  20,  50,     S  ), /* 104 Fruit Truck */
+	MW(  1827,  20,  20,  50,     S  ), /* 105 Rubber Truck */
+	MW(  1827,  20,  20,  50,       Y), /* 106 Sugar Truck */
+	MW(  1827,  20,  20,  50,       Y), /* 107 Candyfloss Hopper */
+	MW(  1827,  20,  20,  50,       Y), /* 108 Toffee Hopper */
+	MW(  1827,  20,  20,  50,       Y), /* 109 Bubble Van */
+	MW(  1827,  20,  20,  50,       Y), /* 110 Cola Tanker */
+	MW(  1827,  20,  20,  50,       Y), /* 111 Sweet Van */
+	MW(  1827,  20,  20,  50,       Y), /* 112 Toy Van */
+	MW(  1827,  20,  20,  50,       Y), /* 113 Battery Truck */
+	MW(  1827,  20,  20,  50,       Y), /* 114 Fizzy Drink Truck */
+	MW(  1827,  20,  20,  50,       Y), /* 115 Plastic Truck */
+	MK(  3378,  20,  12,  40, T|A|S  ), /* 116 MPS Regal Bus */
+	MK( 16071,  20,  15,  30, T|A|S  ), /* 117 Hereford Leopard Bus */
+	MK( 24107,  20,  15,  40, T|A|S  ), /* 118 Foster Bus */
+	MK( 32142,  20,  15,  80, T|A|S  ), /* 119 Foster MkII Superbus */
+	MK(  9132,  20,  15,  40,       Y), /* 120 Ploddyphut MkI Bus */
+	MK( 18993,  20,  15,  40,       Y), /* 121 Ploddyphut MkII Bus */
+	MK( 32873,  20,  15,  80,       Y), /* 122 Ploddyphut MkIII Bus */
+	MK(  5479,  20,  15,  55, T|A    ), /* 123 Balogh Coal Truck */
+	MK( 20089,  20,  15,  55, T|A    ), /* 124 Uhl Coal Truck */
+	MK( 33969,  20,  15,  85, T|A    ), /* 125 DW Coal Truck */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 126 MPS Mail Truck */
+	MK( 21550,  20,  15,  55, T|A|S  ), /* 127 Reynard Mail Truck */
+	MK( 35795,  20,  15,  85, T|A|S  ), /* 128 Perry Mail Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 129 MightyMover Mail Truck */
+	MK( 21550,  20,  15,  55,       Y), /* 130 Powernaught Mail Truck */
+	MK( 35795,  20,  15,  85,       Y), /* 131 Wizzowow Mail Truck */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 132 Witcombe Oil Tanker */
+	MK( 19359,  20,  15,  55, T|A|S  ), /* 133 Foster Oil Tanker */
+	MK( 31047,  20,  15,  85, T|A|S  ), /* 134 Perry Oil Tanker */
+	MK(  5479,  20,  15,  55, T|A    ), /* 135 Talbott Livestock Van */
+	MK( 21915,  20,  15,  55, T|A    ), /* 136 Uhl Livestock Van */
+	MK( 37256,  20,  15,  85, T|A    ), /* 137 Foster Livestock Van */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 138 Balogh Goods Truck */
+	MK( 19724,  20,  15,  55, T|A|S  ), /* 139 Craighead Goods Truck */
+	MK( 31047,  20,  15,  85, T|A|S  ), /* 140 Goss Goods Truck */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 141 Hereford Grain Truck */
+	MK( 21185,  20,  15,  55, T|A|S  ), /* 142 Thomas Grain Truck */
+	MK( 32873,  20,  15,  85, T|A|S  ), /* 143 Goss Grain Truck */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 144 Witcombe Wood Truck */
+	MK( 19724,  20,  15,  55, T|A|S  ), /* 145 Foster Wood Truck */
+	MK( 35430,  20,  15,  85, T|A|S  ), /* 146 Moreland Wood Truck */
+	MK(  5479,  20,  15,  55, T      ), /* 147 MPS Iron Ore Truck */
+	MK( 20820,  20,  15,  55, T      ), /* 148 Uhl Iron Ore Truck */
+	MK( 33238,  20,  15,  85, T      ), /* 149 Chippy Iron Ore Truck */
+	MK(  5479,  20,  15,  55, T      ), /* 150 Balogh Steel Truck */
+	MK( 21185,  20,  15,  55, T      ), /* 151 Uhl Steel Truck */
+	MK( 31777,  20,  15,  85, T      ), /* 152 Kelling Steel Truck */
+	MK(  5479,  20,  15,  55, T|A|S  ), /* 153 Balogh Armoured Truck */
+	MK( 22281,  20,  15,  55, T|A|S  ), /* 154 Uhl Armoured Truck */
+	MK( 33603,  20,  15,  85, T|A|S  ), /* 155 Foster Armoured Truck */
+	MK(  5479,  20,  15,  55,   A|S  ), /* 156 Foster Food Van */
+	MK( 18628,  20,  15,  55,   A|S  ), /* 157 Perry Food Van */
+	MK( 30681,  20,  15,  85,   A|S  ), /* 158 Chippy Food Van */
+	MK(  5479,  20,  15,  55,   A    ), /* 159 Uhl Paper Truck */
+	MK( 21185,  20,  15,  55,   A    ), /* 160 Balogh Paper Truck */
+	MK( 31777,  20,  15,  85,   A    ), /* 161 MPS Paper Truck */
+	MK(  5479,  20,  15,  55,     S  ), /* 162 MPS Copper Ore Truck */
+	MK( 20820,  20,  15,  55,     S  ), /* 163 Uhl Copper Ore Truck */
+	MK( 33238,  20,  15,  85,     S  ), /* 164 Goss Copper Ore Truck */
+	MK(  5479,  20,  15,  55,     S  ), /* 165 Uhl Water Tanker */
+	MK( 20970,  20,  15,  55,     S  ), /* 166 Balogh Water Tanker */
+	MK( 33388,  20,  15,  85,     S  ), /* 167 MPS Water Tanker */
+	MK(  5479,  20,  15,  55,     S  ), /* 168 Balogh Fruit Truck */
+	MK( 21335,  20,  15,  55,     S  ), /* 169 Uhl Fruit Truck */
+	MK( 33753,  20,  15,  85,     S  ), /* 170 Kelling Fruit Truck */
+	MK(  5479,  20,  15,  55,     S  ), /* 171 Balogh Rubber Truck */
+	MK( 20604,  20,  15,  55,     S  ), /* 172 Uhl Rubber Truck */
+	MK( 33023,  20,  15,  85,     S  ), /* 173 RMT Rubber Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 174 MightyMover Sugar Truck */
+	MK( 19724,  20,  15,  55,       Y), /* 175 Powernaught Sugar Truck */
+	MK( 33238,  20,  15,  85,       Y), /* 176 Wizzowow Sugar Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 177 MightyMover Cola Truck */
+	MK( 20089,  20,  15,  55,       Y), /* 178 Powernaught Cola Truck */
+	MK( 33603,  20,  15,  85,       Y), /* 179 Wizzowow Cola Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 180 MightyMover Candyfloss Truck */
+	MK( 20454,  20,  15,  55,       Y), /* 181 Powernaught Candyfloss Truck */
+	MK( 33969,  20,  15,  85,       Y), /* 182 Wizzowow Candyfloss Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 183 MightyMover Toffee Truck */
+	MK( 20820,  20,  15,  55,       Y), /* 184 Powernaught Toffee Truck */
+	MK( 34334,  20,  15,  85,       Y), /* 185 Wizzowow Toffee Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 186 MightyMover Toy Van */
+	MK( 21185,  20,  15,  55,       Y), /* 187 Powernaught Toy Van */
+	MK( 34699,  20,  15,  85,       Y), /* 188 Wizzowow Toy Van */
+	MK(  5479,  20,  15,  55,       Y), /* 189 MightyMover Sweet Truck */
+	MK( 21550,  20,  15,  55,       Y), /* 190 Powernaught Sweet Truck */
+	MK( 35064,  20,  15,  85,       Y), /* 191 Wizzowow Sweet Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 192 MightyMover Battery Truck */
+	MK( 19874,  20,  15,  55,       Y), /* 193 Powernaught Battery Truck */
+	MK( 35430,  20,  15,  85,       Y), /* 194 Wizzowow Battery Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 195 MightyMover Fizzy Drink Truck */
+	MK( 20239,  20,  15,  55,       Y), /* 196 Powernaught Fizzy Drink Truck */
+	MK( 35795,  20,  15,  85,       Y), /* 197 Wizzowow Fizzy Drink Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 198 MightyMover Plastic Truck */
+	MK( 20604,  20,  15,  55,       Y), /* 199 Powernaught Plastic Truck */
+	MK( 32873,  20,  15,  85,       Y), /* 200 Wizzowow Plastic Truck */
+	MK(  5479,  20,  15,  55,       Y), /* 201 MightyMover Bubble Truck */
+	MK( 20970,  20,  15,  55,       Y), /* 202 Powernaught Bubble Truck */
+	MK( 33023,  20,  15,  85,       Y), /* 203 Wizzowow Bubble Truck */
+	MS(  2922,   5,  30,  50, T|A|S  ), /* 204 MPS Oil Tanker */
+	MS( 17167,   5,  30,  90, T|A|S  ), /* 205 CS-Inc. Oil Tanker */
+	MS(  2192,   5,  30,  55, T|A|S  ), /* 206 MPS Passenger Ferry */
+	MS( 18628,   5,  30,  90, T|A|S  ), /* 207 FFP Passenger Ferry */
+	MS( 17257,  10,  25,  90, T|A|S  ), /* 208 Bakewell 300 Hovercraft */
+	MS(  9587,   5,  30,  40,       Y), /* 209 Chugger-Chug Passenger Ferry */
+	MS( 20544,   5,  30,  90,       Y), /* 210 Shivershake Passenger Ferry */
+	MS(  2557,   5,  30,  55, T|A|S  ), /* 211 Yate Cargo ship */
+	MS( 19724,   5,  30,  98, T|A|S  ), /* 212 Bakewell Cargo ship */
+	MS(  9587,   5,  30,  45,       Y), /* 213 Mightymover Cargo ship */
+	MS( 22371,   5,  30,  90,       Y), /* 214 Powernaut Cargo ship */
+	MA(  2922,  20,  20,  20, T|A|S  ), /* 215 Sampson U52 */
+	MA(  9922,  20,  24,  20, T|A|S  ), /* 216 Coleman Count */
+	MA( 12659,  20,  18,  20, T|A|S  ), /* 217 FFP Dart */
+	MA( 17652,  20,  25,  35, T|A|S  ), /* 218 Yate Haugan */
+	MA(  4929,  20,  30,  30, T|A|S  ), /* 219 Bakewell Cotswald LB-3 */
+	MA( 13695,  20,  23,  25, T|A|S  ), /* 220 Bakewell Luckett LB-8 */
+	MA( 16341,  20,  26,  30, T|A|S  ), /* 221 Bakewell Luckett LB-9 */
+	MA( 21395,  20,  25,  30, T|A|S  ), /* 222 Bakewell Luckett LB80 */
+	MA( 18263,  20,  20,  30, T|A|S  ), /* 223 Bakewell Luckett LB-10 */
+	MA( 25233,  20,  25,  30, T|A|S  ), /* 224 Bakewell Luckett LB-11 */
+	MA( 15371,  20,  22,  25, T|A|S  ), /* 225 Yate Aerospace YAC 1-11 */
+	MA( 15461,  20,  25,  25, T|A|S  ), /* 226 Darwin 100 */
+	MA( 16952,  20,  22,  25, T|A|S  ), /* 227 Darwin 200 */
+	MA( 17227,  20,  25,  30, T|A|S  ), /* 228 Darwin 300 */
+	MA( 22371,  20,  25,  35, T|A|S  ), /* 229 Darwin 400 */
+	MA( 22341,  20,  25,  30, T|A|S  ), /* 230 Darwin 500 */
+	MA( 27209,  20,  25,  30, T|A|S  ), /* 231 Darwin 600 */
+	MA( 17988,  20,  20,  30, T|A|S  ), /* 232 Guru Galaxy */
+	MA( 18993,  20,  24,  35, T|A|S  ), /* 233 Airtaxi A21 */
+	MA( 22401,  20,  24,  30, T|A|S  ), /* 234 Airtaxi A31 */
+	MA( 24472,  20,  24,  30, T|A|S  ), /* 235 Airtaxi A32 */
+	MA( 26724,  20,  24,  30, T|A|S  ), /* 236 Airtaxi A33 */
+	MA( 22005,  20,  25,  30, T|A|S  ), /* 237 Yate Aerospace YAe46 */
+	MA( 24107,  20,  20,  35, T|A|S  ), /* 238 Dinger 100 */
+	MA( 29310,  20,  25,  60, T|A|S  ), /* 239 AirTaxi A34-1000 */
+	MA( 35520,  20,  22,  30, T|A|S  ), /* 240 Yate Z-Shuttle */
+	MA( 36981,  20,  22,  30, T|A|S  ), /* 241 Kelling K1 */
+	MA( 38807,  20,  22,  50, T|A|S  ), /* 242 Kelling K6 */
+	MA( 42094,  20,  25,  30, T|A|S  ), /* 243 Kelling K7 */
+	MA( 44651,  20,  23,  30, T|A|S  ), /* 244 Darwin 700 */
+	MA( 40268,  20,  25,  30, T|A|S  ), /* 245 FFP Hyperdart 2 */
+	MA( 33693,  20,  25,  50, T|A|S  ), /* 246 Dinger 200 */
+	MA( 32963,  20,  20,  60, T|A|S  ), /* 247 Dinger 1000 */
+	MA(  9222,  20,  20,  35,       Y), /* 248 Ploddyphut 100 */
+	MA( 12874,  20,  20,  35,       Y), /* 249 Ploddyphut 500 */
+	MA( 16892,  20,  20,  35,       Y), /* 250 Flashbang X1 */
+	MA( 21275,  20,  20,  99,       Y), /* 251 Juggerplane M1 */
+	MA( 23832,  20,  20,  99,       Y), /* 252 Flashbang Wizzer */
+	MA( 13575,  20,  20,  40, T|A|S  ), /* 253 Tricario Helicopter */
+	MA( 28215,  20,  20,  30, T|A|S  ), /* 254 Guru X2 Helicopter */
+	MK( 13575,  20,  20,  99,       Y), /* 255  */
 };
 #undef Y
 #undef S
@@ -364,7 +621,7 @@
 #define O RAILTYPE_MONO
 #define L RAILTYPE_MAGLEV
 
-const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
+const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES * MAX_ENGINE_SETS] = {
 	//   image_index  max_speed (kph)      running_cost_base           ai_rank
 	//   |  flags     |        power (hp)  |  running_cost_class       |  railtype
 	//   |  |    base_cost     |    weight |  |   capacity             |  |
@@ -486,6 +743,123 @@
 	RVI(57, W, 196,   0,       0,  18,     0, 0, 29, CT_BATTERIES   ,  0, L, A), // 113
 	RVI(58, W, 193,   0,       0,  18,     0, 0, 32, CT_FIZZY_DRINKS,  0, L, A), // 114
 	RVI(59, W, 191,   0,       0,  18,     0, 0, 37, CT_PLASTIC     ,  0, L, A), // 115
+/**/
+	RVI( 2, G,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R, S), //   0
+	RVI(19, G,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R, D), //   1
+	RVI( 2, G,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R, S), //   2
+	RVI( 0, G,  15,  96,     900, 130,   130, S,  0, 0              , 19, R, S), //   3
+	RVI( 1, G,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R, S), //   4
+	RVI(12, G,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R, D), //   5
+	RVI(14, G,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R, D), //   6
+	RVI( 3, G,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R, S), //   7
+	RVI( 0, G,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R, S), //   8
+	RVI( 1, G,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R, S), //   9
+	RVI( 0, G,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R, S), //  10
+	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, D, 38, CT_PASSENGERS  , 10, R, D), //  11
+	RVI(10, M,  14, 120,   700/2,38/2,  70/2, D, 40, CT_PASSENGERS  , 11, R, D), //  12
+	RVI( 4, G,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R, D), //  13
+	RVI( 5, G,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R, D), //  14
+	RVI( 4, G,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R, D), //  15
+	RVI(14, G,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R, D), //  16
+	RVI(12, G,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R, D), //  17
+	RVI(13, G,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R, D), //  18
+	RVI(15, G,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R, D), //  19
+	RVI(16, M,  35, 160,  3500/2,95/2, 205/2, D,  0, 0              , 45, R, D), //  20
+	RVI(18, G,  21, 104,    2200, 120,   145, D,  0, 0              , 32, R, D), //  21
+	RVI( 6, M,  20, 200,  4500/2,70/2, 190/2, D,  4, CT_MAIL        , 50, R, D), //  22
+	RVI(20, G,  26, 160,    3600,  84,   180, E,  0, 0              , 40, C, E), //  23
+	RVI(20, G,  30, 176,    5000,  82,   205, E,  0, 0              , 41, C, E), //  24
+	RVI(21, M,  40, 240,  7000/2,90/2, 240/2, E,  0, 0              , 51, C, E), //  25
+	RVI(23, M,  43, 264,  8000/2,95/2, 250/2, E,  0, 0              , 52, C, E), //  26
+	RVI(33, W, 247,   0,       0,  25,     0, 0, 40, CT_PASSENGERS  ,  0, R, A), //  27
+	RVI(35, W, 228,   0,       0,  21,     0, 0, 30, CT_MAIL        ,  0, R, A), //  28
+	RVI(34, W, 176,   0,       0,  18,     0, 0, 30, CT_COAL        ,  0, R, A), //  29
+	RVI(36, W, 200,   0,       0,  24,     0, 0, 30, CT_OIL         ,  0, R, A), //  30
+	RVI(37, W, 192,   0,       0,  20,     0, 0, 25, CT_LIVESTOCK   ,  0, R, A), //  31
+	RVI(38, W, 190,   0,       0,  21,     0, 0, 25, CT_GOODS       ,  0, R, A), //  32
+	RVI(39, W, 182,   0,       0,  19,     0, 0, 30, CT_GRAIN       ,  0, R, A), //  33
+	RVI(40, W, 181,   0,       0,  16,     0, 0, 30, CT_WOOD        ,  0, R, A), //  34
+	RVI(41, W, 179,   0,       0,  19,     0, 0, 30, CT_IRON_ORE    ,  0, R, A), //  35
+	RVI(42, W, 196,   0,       0,  18,     0, 0, 20, CT_STEEL       ,  0, R, A), //  36
+	RVI(43, W, 255,   0,       0,  30,     0, 0, 20, CT_VALUABLES   ,  0, R, A), //  37
+	RVI(44, W, 191,   0,       0,  22,     0, 0, 25, CT_FOOD        ,  0, R, A), //  38
+	RVI(45, W, 196,   0,       0,  18,     0, 0, 20, CT_PAPER       ,  0, R, A), //  39
+	RVI(46, W, 179,   0,       0,  19,     0, 0, 30, CT_COPPER_ORE  ,  0, R, A), //  40
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 25, CT_WATER       ,  0, R, A), //  41
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 25, CT_FRUIT       ,  0, R, A), //  42
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 21, CT_RUBBER      ,  0, R, A), //  43
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 30, CT_SUGAR       ,  0, R, A), //  44
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 30, CT_COTTON_CANDY,  0, R, A), //  45
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 30, CT_TOFFEE      ,  0, R, A), //  46
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 20, CT_BUBBLES     ,  0, R, A), //  47
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 25, CT_COLA        ,  0, R, A), //  48
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 25, CT_CANDY       ,  0, R, A), //  49
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 20, CT_TOYS        ,  0, R, A), //  50
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 22, CT_BATTERIES   ,  0, R, A), //  51
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 25, CT_FIZZY_DRINKS,  0, R, A), //  52
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 30, CT_PLASTIC     ,  0, R, A), //  53
+	RVI(25, G,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O, N), //  54
+	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, E, 25, CT_PASSENGERS  , 62, O, N), //  55
+	RVI(26, G,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O, N), //  56
+	RVI(60, W, 247,   0,       0,  25,     0, 0, 45, CT_PASSENGERS  ,  0, O, A), //  57
+	RVI(62, W, 228,   0,       0,  21,     0, 0, 35, CT_MAIL        ,  0, O, A), //  58
+	RVI(61, W, 176,   0,       0,  18,     0, 0, 35, CT_COAL        ,  0, O, A), //  59
+	RVI(63, W, 200,   0,       0,  24,     0, 0, 35, CT_OIL         ,  0, O, A), //  60
+	RVI(64, W, 192,   0,       0,  20,     0, 0, 30, CT_LIVESTOCK   ,  0, O, A), //  61
+	RVI(65, W, 190,   0,       0,  21,     0, 0, 30, CT_GOODS       ,  0, O, A), //  62
+	RVI(66, W, 182,   0,       0,  19,     0, 0, 35, CT_GRAIN       ,  0, O, A), //  63
+	RVI(67, W, 181,   0,       0,  16,     0, 0, 35, CT_WOOD        ,  0, O, A), //  64
+	RVI(68, W, 179,   0,       0,  19,     0, 0, 35, CT_IRON_ORE    ,  0, O, A), //  65
+	RVI(69, W, 196,   0,       0,  18,     0, 0, 25, CT_STEEL       ,  0, O, A), //  66
+	RVI(70, W, 255,   0,       0,  30,     0, 0, 25, CT_VALUABLES   ,  0, O, A), //  67
+	RVI(71, W, 191,   0,       0,  22,     0, 0, 30, CT_FOOD        ,  0, O, A), //  68
+	RVI(72, W, 196,   0,       0,  18,     0, 0, 25, CT_PAPER       ,  0, O, A), //  69
+	RVI(73, W, 179,   0,       0,  19,     0, 0, 35, CT_COPPER_ORE  ,  0, O, A), //  70
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 30, CT_WATER       ,  0, O, A), //  71
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 30, CT_FRUIT       ,  0, O, A), //  72
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 26, CT_RUBBER      ,  0, O, A), //  73
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 35, CT_SUGAR       ,  0, O, A), //  74
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 35, CT_COTTON_CANDY,  0, O, A), //  75
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 35, CT_TOFFEE      ,  0, O, A), //  76
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 25, CT_BUBBLES     ,  0, O, A), //  77
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 30, CT_COLA        ,  0, O, A), //  78
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 30, CT_CANDY       ,  0, O, A), //  79
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 25, CT_TOYS        ,  0, O, A), //  80
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 27, CT_BATTERIES   ,  0, O, A), //  81
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 30, CT_FIZZY_DRINKS,  0, O, A), //  82
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 35, CT_PLASTIC     ,  0, O, A), //  83
+	RVI(28, G,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L, V), //  84
+	RVI(29, G,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L, V), //  85
+	RVI(30, G,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L, V), //  86
+	RVI(31, M,  95, 640, 20000/2,150/2,255/2, E,  0, 0              , 73, L, V), //  87
+	RVI(28, G,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L, V), //  88
+	RVI(60, W, 247,   0,       0,  25,     0, 0, 47, CT_PASSENGERS  ,  0, L, A), //  89
+	RVI(62, W, 228,   0,       0,  21,     0, 0, 37, CT_MAIL        ,  0, L, A), //  90
+	RVI(61, W, 176,   0,       0,  18,     0, 0, 37, CT_COAL        ,  0, L, A), //  91
+	RVI(63, W, 200,   0,       0,  24,     0, 0, 37, CT_OIL         ,  0, L, A), //  92
+	RVI(64, W, 192,   0,       0,  20,     0, 0, 32, CT_LIVESTOCK   ,  0, L, A), //  93
+	RVI(65, W, 190,   0,       0,  21,     0, 0, 32, CT_GOODS       ,  0, L, A), //  94
+	RVI(66, W, 182,   0,       0,  19,     0, 0, 37, CT_GRAIN       ,  0, L, A), //  95
+	RVI(67, W, 181,   0,       0,  16,     0, 0, 37, CT_WOOD        ,  0, L, A), //  96
+	RVI(68, W, 179,   0,       0,  19,     0, 0, 37, CT_IRON_ORE    ,  0, L, A), //  97
+	RVI(69, W, 196,   0,       0,  18,     0, 0, 27, CT_STEEL       ,  0, L, A), //  98
+	RVI(70, W, 255,   0,       0,  30,     0, 0, 27, CT_VALUABLES   ,  0, L, A), //  99
+	RVI(71, W, 191,   0,       0,  22,     0, 0, 32, CT_FOOD        ,  0, L, A), // 100
+	RVI(72, W, 196,   0,       0,  18,     0, 0, 27, CT_PAPER       ,  0, L, A), // 101
+	RVI(73, W, 179,   0,       0,  19,     0, 0, 37, CT_COPPER_ORE  ,  0, L, A), // 102
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 32, CT_WATER       ,  0, L, A), // 103
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 32, CT_FRUIT       ,  0, L, A), // 104
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 28, CT_RUBBER      ,  0, L, A), // 105
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 37, CT_SUGAR       ,  0, L, A), // 106
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 37, CT_COTTON_CANDY,  0, L, A), // 107
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 37, CT_TOFFEE      ,  0, L, A), // 108
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 27, CT_BUBBLES     ,  0, L, A), // 109
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 32, CT_COLA        ,  0, L, A), // 110
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 32, CT_CANDY       ,  0, L, A), // 111
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 27, CT_TOYS        ,  0, L, A), // 112
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 29, CT_BATTERIES   ,  0, L, A), // 113
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 32, CT_FIZZY_DRINKS,  0, L, A), // 114
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 37, CT_PLASTIC     ,  0, L, A), // 115
 };
 #undef L
 #undef O
@@ -513,7 +887,7 @@
  * @param h refittable
  */
 #define SVI(a, b, c, d, e, f, g, h) { a, b, c, d, e, f, {g}, h }
-const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES] = {
+const ShipVehicleInfo orig_ship_vehicle_info[NUM_SHIP_ENGINES * MAX_ENGINE_SETS] = {
 	//   image_index  cargo_type     cargo_amount                 refittable
 	//   |    base_cost |              |    running_cost          |
 	//   |    |    max_speed           |    |  sfx                |
@@ -529,6 +903,18 @@
 	SVI( 0, 144,  80, CT_GOODS,      190, 113, SND_06_SHIP_HORN,  1 ), /*  8 */
 	SVI( 0, 128,  48, CT_GOODS,      160, 150, SND_06_SHIP_HORN,  1 ), /*  9 */
 	SVI( 0, 144,  80, CT_GOODS,      190, 113, SND_06_SHIP_HORN,  1 ), /* 10 */
+/**/
+	SVI( 1, 160,  48, CT_OIL,        220, 140, SND_06_SHIP_HORN,  0 ), /*  0 */
+	SVI( 1, 176,  80, CT_OIL,        350, 125, SND_06_SHIP_HORN,  0 ), /*  1 */
+	SVI( 2,  96,  64, CT_PASSENGERS, 100,  90, SND_07_FERRY_HORN, 0 ), /*  2 */
+	SVI( 2, 112, 128, CT_PASSENGERS, 130,  80, SND_07_FERRY_HORN, 0 ), /*  3 */
+	SVI( 3, 148, 224, CT_PASSENGERS, 100, 190, SND_07_FERRY_HORN, 0 ), /*  4 */
+	SVI( 2,  96,  64, CT_PASSENGERS, 100,  90, SND_07_FERRY_HORN, 0 ), /*  5 */
+	SVI( 2, 112, 128, CT_PASSENGERS, 130,  80, SND_07_FERRY_HORN, 0 ), /*  6 */
+	SVI( 0, 128,  48, CT_GOODS,      160, 150, SND_06_SHIP_HORN,  1 ), /*  7 */
+	SVI( 0, 144,  80, CT_GOODS,      190, 113, SND_06_SHIP_HORN,  1 ), /*  8 */
+	SVI( 0, 128,  48, CT_GOODS,      160, 150, SND_06_SHIP_HORN,  1 ), /*  9 */
+	SVI( 0, 144,  80, CT_GOODS,      190, 113, SND_06_SHIP_HORN,  1 ), /* 10 */
 };
 #undef SVI
 
@@ -548,7 +934,7 @@
 #define H AIR_HELI
 #define P AIR_CTOL
 #define J AIR_CTOL | AIR_FAST
-const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES] = {
+const AircraftVehicleInfo orig_aircraft_vehicle_info[NUM_AIRCRAFT_ENGINES * MAX_ENGINE_SETS] = {
 	//    image_index         sfx                         acceleration
 	//    |   base_cost       |                           |   max_speed
 	//    |   |    running_cost                           |   |    mail_capacity
@@ -595,6 +981,48 @@
 	AVI(  9, 15,  81, H, SND_09_JET,                     20,  25, 15,  40 ), /* 38 */
 	AVI( 19, 17,  77, H, SND_09_JET,                     20,  40, 20,  55 ), /* 39 */
 	AVI( 25, 15,  80, H, SND_09_JET,                     20,  25, 10,  40 ), /* 40 */
+/**/
+	AVI(  1, 14,  85, P, SND_08_PLANE_TAKE_OFF,          18,  37,  4,  25 ), /*  0 */
+	AVI(  0, 15, 100, P, SND_08_PLANE_TAKE_OFF,          20,  37,  8,  65 ), /*  1 */
+	AVI(  2, 16, 130, J, SND_09_JET,                     35,  74, 10,  90 ), /*  2 */
+	AVI(  8, 75, 250, J, SND_3B_JET_OVERHEAD,            50, 181, 20, 100 ), /*  3 */
+	AVI(  5, 15,  98, P, SND_08_PLANE_TAKE_OFF,          20,  37,  6,  30 ), /*  4 */
+	AVI(  6, 18, 240, J, SND_09_JET,                     40,  74, 30, 200 ), /*  5 */
+	AVI(  2, 17, 150, P, SND_09_JET,                     35,  74, 15, 100 ), /*  6 */
+	AVI(  2, 18, 245, J, SND_09_JET,                     40,  74, 30, 150 ), /*  7 */
+	AVI(  3, 19, 192, J, SND_09_JET,                     40,  74, 40, 220 ), /*  8 */
+	AVI(  3, 20, 190, J, SND_09_JET,                     40,  74, 25, 230 ), /*  9 */
+	AVI(  2, 16, 135, J, SND_09_JET,                     35,  74, 10,  95 ), /* 10 */
+	AVI(  2, 18, 240, J, SND_09_JET,                     40,  74, 35, 170 ), /* 11 */
+	AVI(  4, 17, 155, J, SND_09_JET,                     40,  74, 15, 110 ), /* 12 */
+	AVI(  7, 30, 253, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 50, 300 ), /* 13 */
+	AVI(  4, 18, 210, J, SND_09_JET,                     40,  74, 25, 200 ), /* 14 */
+	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 240 ), /* 15 */
+	AVI(  4, 27, 230, J, SND_09_JET,                     40,  74, 40, 260 ), /* 16 */
+	AVI(  3, 25, 225, J, SND_09_JET,                     40,  74, 35, 240 ), /* 17 */
+	AVI(  4, 20, 235, J, SND_09_JET,                     40,  74, 30, 260 ), /* 18 */
+	AVI(  4, 19, 220, J, SND_09_JET,                     40,  74, 25, 210 ), /* 19 */
+	AVI(  4, 18, 170, J, SND_09_JET,                     40,  74, 20, 160 ), /* 20 */
+	AVI(  4, 26, 210, J, SND_09_JET,                     40,  74, 20, 220 ), /* 21 */
+	AVI(  6, 16, 125, P, SND_09_JET,                     50,  74, 10,  80 ), /* 22 */
+	AVI(  2, 17, 145, P, SND_09_JET,                     40,  74, 10,  85 ), /* 23 */
+	AVI( 11, 16, 130, P, SND_09_JET,                     40,  74, 10,  75 ), /* 24 */
+	AVI( 10, 16, 149, P, SND_09_JET,                     40,  74, 10,  85 ), /* 25 */
+	AVI( 15, 17, 170, P, SND_09_JET,                     40,  74, 18,  65 ), /* 26 */
+	AVI( 12, 18, 210, J, SND_09_JET,                     40,  74, 25, 110 ), /* 27 */
+	AVI( 13, 20, 230, J, SND_09_JET,                     40,  74, 60, 180 ), /* 28 */
+	AVI( 14, 21, 220, J, SND_09_JET,                     40,  74, 65, 150 ), /* 29 */
+	AVI( 16, 19, 160, J, SND_09_JET,                     40, 181, 45,  85 ), /* 30 */
+	AVI( 17, 24, 248, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 80, 400 ), /* 31 */
+	AVI( 18, 80, 251, J, SND_3B_JET_OVERHEAD,            50, 181, 45, 130 ), /* 32 */
+	AVI( 20, 13,  85, P, SND_45_PLANE_CRASHING,          18,  37,  5,  25 ), /* 33 */
+	AVI( 21, 18, 100, P, SND_46_PLANE_ENGINE_SPUTTERING, 20,  37,  9,  60 ), /* 34 */
+	AVI( 22, 25, 140, P, SND_09_JET,                     40,  74, 12,  90 ), /* 35 */
+	AVI( 23, 32, 220, J, SND_3D_ANOTHER_JET_OVERHEAD,    40,  74, 40, 200 ), /* 36 */
+	AVI( 24, 80, 255, J, SND_3B_JET_OVERHEAD,            50, 181, 30, 100 ), /* 37 */
+	AVI(  9, 15,  81, H, SND_09_JET,                     20,  25, 15,  40 ), /* 38 */
+	AVI( 19, 17,  77, H, SND_09_JET,                     20,  40, 20,  55 ), /* 39 */
+	AVI( 25, 15,  80, H, SND_09_JET,                     20,  25, 10,  40 ), /* 40 */
 };
 #undef J
 #undef P
@@ -612,7 +1040,7 @@
  * @param g cargo_type
  */
 #define ROV(a, b, c, d, e, f, g) { a, b, c, {d}, e, f, g }
-const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES] = {
+const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES * MAX_ENGINE_SETS] = {
 	//    image_index       sfx                                 max_speed
 	//    |    base_cost    |                                   |   capacity
 	//    |    |    running_cost                                |   |  cargo_type
@@ -705,6 +1133,95 @@
 	ROV( 62, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_BUBBLES      ), /* 85 */
 	ROV( 62, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_BUBBLES      ), /* 86 */
 	ROV( 62, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_BUBBLES      ), /* 87 */
+/**/
+	ROV(  0, 120,  91, SND_19_BUS_START_PULL_AWAY,            112, 31, CT_PASSENGERS   ), /*  0 */
+	ROV( 17, 140, 128, SND_1C_TRUCK_START_2,                  176, 35, CT_PASSENGERS   ), /*  1 */
+	ROV( 17, 150, 178, SND_1B_TRUCK_START,                    224, 37, CT_PASSENGERS   ), /*  2 */
+	ROV( 34, 160, 240, SND_1B_TRUCK_START,                    255, 40, CT_PASSENGERS   ), /*  3 */
+	ROV( 51, 120,  91, SND_3C_COMEDY_CAR,                     112, 30, CT_PASSENGERS   ), /*  4 */
+	ROV( 51, 140, 171, SND_3E_COMEDY_CAR_2,                   192, 35, CT_PASSENGERS   ), /*  5 */
+	ROV( 51, 160, 240, SND_3C_COMEDY_CAR,                     240, 38, CT_PASSENGERS   ), /*  6 */
+	ROV(  1, 108,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_COAL         ), /*  7 */
+	ROV( 18, 128, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COAL         ), /*  8 */
+	ROV( 35, 138, 240, SND_19_BUS_START_PULL_AWAY,            224, 28, CT_COAL         ), /*  9 */
+	ROV(  2, 115,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_MAIL         ), /* 10 */
+	ROV( 19, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 28, CT_MAIL         ), /* 11 */
+	ROV( 36, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_MAIL         ), /* 12 */
+	ROV( 57, 115,  90, SND_3E_COMEDY_CAR_2,                    96, 22, CT_MAIL         ), /* 13 */
+	ROV( 57, 135, 168, SND_3C_COMEDY_CAR,                     176, 28, CT_MAIL         ), /* 14 */
+	ROV( 57, 145, 240, SND_3E_COMEDY_CAR_2,                   224, 30, CT_MAIL         ), /* 15 */
+	ROV(  3, 110,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_OIL          ), /* 16 */
+	ROV( 20, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_OIL          ), /* 17 */
+	ROV( 37, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_OIL          ), /* 18 */
+	ROV(  4, 105,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_LIVESTOCK    ), /* 19 */
+	ROV( 21, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_LIVESTOCK    ), /* 20 */
+	ROV( 38, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_LIVESTOCK    ), /* 21 */
+	ROV(  5, 107,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_GOODS        ), /* 22 */
+	ROV( 22, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_GOODS        ), /* 23 */
+	ROV( 39, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_GOODS        ), /* 24 */
+	ROV(  6, 114,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_GRAIN        ), /* 25 */
+	ROV( 23, 133, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_GRAIN        ), /* 26 */
+	ROV( 40, 143, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_GRAIN        ), /* 27 */
+	ROV(  7, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_WOOD         ), /* 28 */
+	ROV( 24, 137, 168, SND_19_BUS_START_PULL_AWAY,            176, 22, CT_WOOD         ), /* 29 */
+	ROV( 41, 147, 240, SND_19_BUS_START_PULL_AWAY,            224, 24, CT_WOOD         ), /* 30 */
+	ROV(  8, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_IRON_ORE     ), /* 31 */
+	ROV( 25, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_IRON_ORE     ), /* 32 */
+	ROV( 42, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_IRON_ORE     ), /* 33 */
+	ROV(  9, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_STEEL        ), /* 34 */
+	ROV( 26, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_STEEL        ), /* 35 */
+	ROV( 43, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_STEEL        ), /* 36 */
+	ROV( 10, 145,  90, SND_19_BUS_START_PULL_AWAY,             96, 12, CT_VALUABLES    ), /* 37 */
+	ROV( 27, 170, 168, SND_19_BUS_START_PULL_AWAY,            176, 15, CT_VALUABLES    ), /* 38 */
+	ROV( 44, 180, 240, SND_19_BUS_START_PULL_AWAY,            224, 16, CT_VALUABLES    ), /* 39 */
+	ROV( 11, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_FOOD         ), /* 40 */
+	ROV( 28, 134, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FOOD         ), /* 41 */
+	ROV( 45, 144, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_FOOD         ), /* 42 */
+	ROV( 12, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_PAPER        ), /* 43 */
+	ROV( 29, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_PAPER        ), /* 44 */
+	ROV( 46, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_PAPER        ), /* 45 */
+	ROV( 13, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_COPPER_ORE   ), /* 46 */
+	ROV( 30, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COPPER_ORE   ), /* 47 */
+	ROV( 47, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_COPPER_ORE   ), /* 48 */
+	ROV( 14, 111,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_WATER        ), /* 49 */
+	ROV( 31, 141, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_WATER        ), /* 50 */
+	ROV( 48, 151, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_WATER        ), /* 51 */
+	ROV( 15, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 18, CT_FRUIT        ), /* 52 */
+	ROV( 32, 148, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FRUIT        ), /* 53 */
+	ROV( 49, 158, 240, SND_19_BUS_START_PULL_AWAY,            224, 23, CT_FRUIT        ), /* 54 */
+	ROV( 16, 117,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_RUBBER       ), /* 55 */
+	ROV( 33, 147, 168, SND_19_BUS_START_PULL_AWAY,            176, 19, CT_RUBBER       ), /* 56 */
+	ROV( 50, 157, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_RUBBER       ), /* 57 */
+	ROV( 52, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_SUGAR        ), /* 58 */
+	ROV( 52, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_SUGAR        ), /* 59 */
+	ROV( 52, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_SUGAR        ), /* 60 */
+	ROV( 53, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_COLA         ), /* 61 */
+	ROV( 53, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_COLA         ), /* 62 */
+	ROV( 53, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_COLA         ), /* 63 */
+	ROV( 54, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_COTTON_CANDY ), /* 64 */
+	ROV( 54, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_COTTON_CANDY ), /* 65 */
+	ROV( 54, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_COTTON_CANDY ), /* 66 */
+	ROV( 55, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_TOFFEE       ), /* 67 */
+	ROV( 55, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_TOFFEE       ), /* 68 */
+	ROV( 55, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_TOFFEE       ), /* 69 */
+	ROV( 56, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_TOYS         ), /* 70 */
+	ROV( 56, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_TOYS         ), /* 71 */
+	ROV( 56, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_TOYS         ), /* 72 */
+	ROV( 58, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_CANDY        ), /* 73 */
+	ROV( 58, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_CANDY        ), /* 74 */
+	ROV( 58, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_CANDY        ), /* 75 */
+	ROV( 59, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_BATTERIES    ), /* 76 */
+	ROV( 59, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_BATTERIES    ), /* 77 */
+	ROV( 59, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_BATTERIES    ), /* 78 */
+	ROV( 60, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_FIZZY_DRINKS ), /* 79 */
+	ROV( 60, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_FIZZY_DRINKS ), /* 80 */
+	ROV( 60, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_FIZZY_DRINKS ), /* 81 */
+	ROV( 61, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_PLASTIC      ), /* 82 */
+	ROV( 61, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_PLASTIC      ), /* 83 */
+	ROV( 61, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_PLASTIC      ), /* 84 */
+	ROV( 62, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_BUBBLES      ), /* 85 */
+	ROV( 62, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_BUBBLES      ), /* 86 */
+	ROV( 62, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_BUBBLES      ), /* 87 */
 };
 #undef ROV
 
Index: src/vehicle.cpp
===================================================================
--- src/vehicle.cpp	(revision 10622)
+++ src/vehicle.cpp	(working copy)
@@ -2652,6 +2652,7 @@
  */
 bool CanBuildVehicleInfrastructure(VehicleType type)
 {
+	uint tmps = 0;
 	assert(IsPlayerBuildableVehicleType(type));
 
 	if (_patches.always_build_infrastructure) return true;
@@ -2670,7 +2671,7 @@
 
 		/* Can we actually build the vehicle type? */
 		EngineID e;
-		FOR_ALL_ENGINEIDS_OF_TYPE(e, type) {
+		FOR_ALL_ENGINEIDS_OF_TYPE(e, type, tmps) {
 			if (HASBIT(GetEngine(e)->player_avail, _local_player)) return true;
 		}
 		return false;
