diff --git a/src/aircraft.h b/src/aircraft.h
index 34e6e20825..6afe4ef61e 100644
--- a/src/aircraft.h
+++ b/src/aircraft.h
@@ -58,17 +58,10 @@ void AircraftNextAirportPos_and_Order(Aircraft *v);
 void SetAircraftPosition(Aircraft *v, int x, int y, int z);
 byte GetAircraftFlyingAltitude(const Aircraft *v);
 
-/** Cached oftenly queried (NewGRF) values */
-struct AircraftCache {
-	uint16 cached_max_speed; ///< Cached maximum speed of the aircraft.
-};
-
 /**
  * Aircraft, helicopters, rotors and their shadows belong to this class.
  */
 struct Aircraft : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
-	AircraftCache acache;          ///< Cache of often used calculated values
-
 	uint16 crashed_counter;        ///< Timer for handling crash animations.
 	byte pos;                      ///< Next desired position of the aircraft.
 	byte previous_pos;             ///< Previous desired position of the aircraft.
@@ -90,8 +83,8 @@ struct Aircraft : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
 	bool IsPrimaryVehicle() const                  { return this->IsNormalAircraft(); }
 	SpriteID GetImage(Direction direction) const;
 	int GetDisplaySpeed() const    { return this->cur_speed; }
-	int GetDisplayMaxSpeed() const { return this->acache.cached_max_speed; }
-	int GetSpeedOldUnits() const   { return this->acache.cached_max_speed * 10 / 128; }
+	int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
+	int GetSpeedOldUnits() const   { return this->vcache.cached_max_speed * 10 / 128; }
 	Money GetRunningCost() const;
 	bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
 	bool Tick();
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 1f9df1853c..ed71962612 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -535,10 +535,10 @@ void UpdateAircraftCache(Aircraft *v)
 		/* Convert from original units to km-ish/h */
 		max_speed = (max_speed * 128) / 10;
 
-		v->acache.cached_max_speed = max_speed;
+		v->vcache.cached_max_speed = max_speed;
 	} else {
 		/* Use the default max speed of the vehicle. */
-		v->acache.cached_max_speed = v->max_speed;
+		v->vcache.cached_max_speed = v->max_speed;
 	}
 }
 
@@ -570,9 +570,9 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
 	 * and take-off speeds being too low. */
 	speed_limit *= _settings_game.vehicle.plane_speed;
 
-	if (v->acache.cached_max_speed < speed_limit) {
+	if (v->vcache.cached_max_speed < speed_limit) {
 		if (v->cur_speed < speed_limit) hard_limit = false;
-		speed_limit = v->acache.cached_max_speed;
+		speed_limit = v->vcache.cached_max_speed;
 	}
 
 	v->subspeed = (t = v->subspeed) + (byte)spd;
@@ -640,7 +640,7 @@ byte GetAircraftFlyingAltitude(const Aircraft *v)
 	}
 
 	/* Make faster planes fly higher so that they can overtake slower ones */
-	base_altitude += min(20 * (v->acache.cached_max_speed / 200), 90);
+	base_altitude += min(20 * (v->vcache.cached_max_speed / 200), 90);
 
 	return base_altitude;
 }
diff --git a/src/economy.cpp b/src/economy.cpp
index 810e997011..f7326f4e2c 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1228,7 +1228,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
 		/* update stats */
 		int t;
 		switch (u->type) {
-			case VEH_TRAIN:    t = Train::From(u)->tcache.cached_max_speed; break;
+			case VEH_TRAIN:    t = u->vcache.cached_max_speed; break;
 			case VEH_ROAD:     t = u->max_speed / 2;        break;
 			case VEH_SHIP:     t = u->max_speed;            break;
 			case VEH_AIRCRAFT: t = Aircraft::From(u)->GetSpeedOldUnits(); break; // Convert to old units.
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp
index 1d683430c6..d93159fe17 100644
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -718,7 +718,7 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
 			uint max_speed;
 			switch (v->type) {
 				case VEH_TRAIN:
-					max_speed = Train::From(v)->tcache.cached_max_speed;
+					max_speed = v->vcache.cached_max_speed;
 					break;
 
 				case VEH_AIRCRAFT:
diff --git a/src/openttd.cpp b/src/openttd.cpp
index f1d7aebbaa..e324eeba12 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -1134,14 +1134,15 @@ static void CheckCaches()
 		for (const Vehicle *u = v; u != NULL; u = u->Next()) length++;
 
 		NewGRFCache       *grf_cache = CallocT<NewGRFCache>(length);
+		VehicleCache      *veh_cache = CallocT<VehicleCache>(length);
 		AccelerationCache *acc_cache = CallocT<AccelerationCache>(length);
 		TrainCache        *tra_cache = CallocT<TrainCache>(length);
 		RoadVehicleCache  *roa_cache = CallocT<RoadVehicleCache>(length);
-		AircraftCache     *air_cache = CallocT<AircraftCache>(length);
 
 		length = 0;
 		for (const Vehicle *u = v; u != NULL; u = u->Next()) {
 			grf_cache[length] = u->grf_cache;
+			veh_cache[length] = u->vcache;
 			switch (u->type) {
 				case VEH_TRAIN:
 					acc_cache[length] = Train::From(u)->acc_cache;
@@ -1151,8 +1152,6 @@ static void CheckCaches()
 					acc_cache[length] = RoadVehicle::From(u)->acc_cache;
 					roa_cache[length] = RoadVehicle::From(u)->rcache;
 					break;
-				case VEH_AIRCRAFT:
-					air_cache[length] = Aircraft::From(u)->acache;
 				default:
 					break;
 			}
@@ -1171,6 +1170,9 @@ static void CheckCaches()
 			if (memcmp(&grf_cache[length], &u->grf_cache, sizeof(NewGRFCache)) != 0) {
 				DEBUG(desync, 2, "newgrf cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
 			}
+			if (memcmp(&veh_cache[length], &u->vcache, sizeof(VehicleCache)) != 0) {
+				DEBUG(desync, 2, "vehicle cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
+			}
 			switch (u->type) {
 				case VEH_TRAIN:
 					if (memcmp(&acc_cache[length], &Train::From(u)->acc_cache, sizeof(AccelerationCache)) != 0) {
@@ -1188,11 +1190,6 @@ static void CheckCaches()
 						DEBUG(desync, 2, "road vehicle cache mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
 					}
 					break;
-				case VEH_AIRCRAFT:
-					if (memcmp(&air_cache[length], &Aircraft::From(u)->acache, sizeof(AircraftCache)) != 0) {
-						DEBUG(desync, 2, "aircraft cache mismatch: vehicle %i, company %i, unit number %i", v->index, (int)v->owner, v->unitnumber);
-					}
-					break;
 				default:
 					break;
 			}
@@ -1200,10 +1197,10 @@ static void CheckCaches()
 		}
 
 		free(grf_cache);
+		free(veh_cache);
 		free(acc_cache);
 		free(tra_cache);
 		free(roa_cache);
-		free(air_cache);
 	}
 
 	/* Check whether the caches are still valid */
diff --git a/src/train.h b/src/train.h
index c1dd3af24a..b334c0b92f 100644
--- a/src/train.h
+++ b/src/train.h
@@ -76,7 +76,6 @@ struct TrainCache {
 	bool cached_tilt;           ///< train can tilt; feature provides a bonus in curves
 
 	/* cached max. speed / acceleration data */
-	uint16 cached_max_speed;    ///< max speed of the consist. (minimum of the max speed of all vehicles in the consist)
 	int cached_max_curve_speed; ///< max consist speed limited by curves
 
 	/**
@@ -127,7 +126,7 @@ struct Train : public GroundVehicle<Train, VEH_TRAIN> {
 	bool IsPrimaryVehicle() const { return this->IsFrontEngine(); }
 	SpriteID GetImage(Direction direction) const;
 	int GetDisplaySpeed() const { return this->tcache.last_speed; }
-	int GetDisplayMaxSpeed() const { return this->tcache.cached_max_speed; }
+	int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
 	Money GetRunningCost() const;
 	int GetDisplayImageWidth(Point *offset = NULL) const;
 	bool IsInDepot() const;
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 2983f76f15..5749726947 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -285,7 +285,7 @@ void Train::ConsistChanged(bool same_length)
 	}
 
 	/* store consist weight/max speed in cache */
-	this->tcache.cached_max_speed = max_speed;
+	this->vcache.cached_max_speed = max_speed;
 	this->tcache.cached_tilt = train_can_tilt;
 	this->tcache.cached_max_curve_speed = this->GetCurveSpeedLimit();
 
@@ -1984,7 +1984,7 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
 				 * third of its maximum speed spectrum. Steam emission finally normalises at very close to train's maximum speed.
 				 * REGULATION:
 				 * - instead of 1, 4 / 2^smoke_amount (max. 2) is used to provide sufficient regulation to steam puffs' amount. */
-				if (GB(v->tick_counter, 0, ((4 >> _settings_game.vehicle.smoke_amount) + ((u->cur_speed * 3) / u->tcache.cached_max_speed))) == 0) {
+				if (GB(v->tick_counter, 0, ((4 >> _settings_game.vehicle.smoke_amount) + ((u->cur_speed * 3) / u->vcache.cached_max_speed))) == 0) {
 					CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
 					sound = true;
 				}
@@ -2002,8 +2002,8 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
 				 * REGULATION:
 				 * - up to which speed a diesel train is emitting smoke (with reduced/small setting only until 1/2 of max_speed),
 				 * - in Chance16 - the last value is 512 / 2^smoke_amount (max. smoke when 128 = smoke_amount of 2). */
-				if (u->cur_speed < (u->tcache.cached_max_speed >> (2 >> _settings_game.vehicle.smoke_amount)) &&
-						Chance16((64 - ((u->cur_speed << 5) / u->tcache.cached_max_speed) + (32 >> (u->acc_cache.cached_power >> 10)) - (32 >> (u->acc_cache.cached_weight >> 9))), (512 >> _settings_game.vehicle.smoke_amount))) {
+				if (u->cur_speed < (u->vcache.cached_max_speed >> (2 >> _settings_game.vehicle.smoke_amount)) &&
+						Chance16((64 - ((u->cur_speed << 5) / u->vcache.cached_max_speed) + (32 >> (u->acc_cache.cached_power >> 10)) - (32 >> (u->acc_cache.cached_weight >> 9))), (512 >> _settings_game.vehicle.smoke_amount))) {
 					CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
 					sound = true;
 				}
@@ -2017,7 +2017,7 @@ static void HandleLocomotiveSmokeCloud(const Train *v)
 				 * REGULATION:
 				 * - in Chance16 the last value is 360 / 2^smoke_amount (max. sparks when 90 = smoke_amount of 2). */
 				if (GB(v->tick_counter, 0, 2) == 0 &&
-						Chance16((6 - ((u->cur_speed << 2) / u->tcache.cached_max_speed)), (360 >> _settings_game.vehicle.smoke_amount))) {
+						Chance16((6 - ((u->cur_speed << 2) / u->vcache.cached_max_speed)), (360 >> _settings_game.vehicle.smoke_amount))) {
 					CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
 					sound = true;
 				}
diff --git a/src/vehicle_base.h b/src/vehicle_base.h
index 13f71c1c73..e757ef581b 100644
--- a/src/vehicle_base.h
+++ b/src/vehicle_base.h
@@ -64,6 +64,11 @@ struct NewGRFCache {
 	uint8  cache_valid;               ///< Bitset that indicates which cache values are valid.
 };
 
+/** Cached often queried values common to all vehicles. */
+struct VehicleCache {
+	uint16 cached_max_speed; ///< Maximum speed of the consist (minimum of the max speed of all vehicles in the consist).
+};
+
 /** A vehicle pool for a little over 1 million vehicles. */
 typedef Pool<Vehicle, VehicleID, 512, 0xFF000> VehiclePool;
 extern VehiclePool _vehicle_pool;
@@ -199,6 +204,7 @@ public:
 	byte subtype;                       ///< subtype (Filled with values from #EffectVehicles/#TrainSubTypes/#AircraftSubTypes)
 
 	NewGRFCache grf_cache;              ///< Cache of often used calculated NewGRF values
+	VehicleCache vcache;                ///< Cache of often used vehicle values.
 
 	/** Create a new vehicle */
 	Vehicle(VehicleType type = VEH_INVALID);
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index 23b1e1e423..7c788b3eb1 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -807,10 +807,8 @@ static int CDECL VehicleReliabilitySorter(const Vehicle * const *a, const Vehicl
 static int CDECL VehicleMaxSpeedSorter(const Vehicle * const *a, const Vehicle * const *b)
 {
 	int r = 0;
-	if ((*a)->type == VEH_TRAIN && (*b)->type == VEH_TRAIN) {
-		r = Train::From(*a)->tcache.cached_max_speed - Train::From(*b)->tcache.cached_max_speed;
-	} if ((*a)->type == VEH_AIRCRAFT && (*b)->type == VEH_AIRCRAFT) {
-		r = Aircraft::From(*a)->acache.cached_max_speed - Aircraft::From(*b)->acache.cached_max_speed;
+	if (((*a)->type == VEH_TRAIN && (*b)->type == VEH_TRAIN) || ((*a)->type == VEH_AIRCRAFT && (*b)->type == VEH_AIRCRAFT)) {
+		r = (*a)->vcache.cached_max_speed - (*b)->vcache.cached_max_speed;
 	} else {
 		r = (*a)->max_speed - (*b)->max_speed;
 	}