diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/company_gui.cpp
--- a/src/company_gui.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/company_gui.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -521,7 +521,7 @@
 	LC_OTHER,
 	LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL, LC_RAIL,
 	LC_ROAD, LC_ROAD,
-	LC_SHIP, LC_SHIP,
+	LC_SHIP, LC_SHIP, LC_SHIP, LC_SHIP, LC_SHIP, LC_SHIP,
 	LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
 	LC_ROAD, LC_ROAD,
 };
@@ -622,7 +622,7 @@
 			1,
 			13,
 			4,
-			2,
+			6,
 			3,
 		};
 
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/engine.cpp
--- a/src/engine.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/engine.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -85,6 +85,8 @@
 		this->info.base_life = 0xFF;
 		/* Set road vehicle tractive effort to the default value */
 		if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C;
+		/* Set ship class to the default value */
+		if (type == VEH_SHIP) this->u.ship.shipclass = SCL_DIESEL;
 		return;
 	}
 
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/engine_type.h
--- a/src/engine_type.h	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/engine_type.h	Tue Sep 14 20:16:33 2010 +0200
@@ -59,6 +59,14 @@
 	byte user_def_data;             ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
 };
 
+/** Class of a ship, may be used for colouring / visual effects */
+enum ShipClass {
+	SCL_STEAM,  ///< Steam ship, may emit steam
+	SCL_DIESEL, ///< Diesel-powered ship, may emit diesel fumes (default)
+	SCL_SAIL,   ///< Sailing ship (no visual effect)
+	SCL_END,
+};
+
 struct ShipVehicleInfo {
 	byte image_index;
 	byte cost_factor;
@@ -67,6 +75,7 @@
 	byte running_cost;
 	SoundID sfx;
 	bool old_refittable;   ///< Is ship refittable; only used during initialisation. Later use EngineInfo::refit_mask.
+	ShipClass shipclass;   ///< Class of the ship (steam / diesel / sail)
 };
 
 /* AircraftVehicleInfo subtypes, bitmask type.
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/lang/english.txt
--- a/src/lang/english.txt	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/lang/english.txt	Tue Sep 14 20:16:33 2010 +0200
@@ -1456,8 +1456,12 @@
 STR_LIVERY_FREIGHT_WAGON                                        :Freight Wagon
 STR_LIVERY_BUS                                                  :Bus
 STR_LIVERY_TRUCK                                                :Lorry
-STR_LIVERY_PASSENGER_SHIP                                       :Passenger Ferry
-STR_LIVERY_FREIGHT_SHIP                                         :Freight Ship
+STR_LIVERY_PASSENGER_SHIP_STEAM                                 :Passenger Ferry (Steam)
+STR_LIVERY_PASSENGER_SHIP_DIESEL                                :Passenger Ferry (Diesel)
+STR_LIVERY_PASSENGER_SHIP_SAIL                                  :Passenger Ferry (Sail)
+STR_LIVERY_FREIGHT_SHIP_STEAM                                   :Freight Ship (Steam)
+STR_LIVERY_FREIGHT_SHIP_DIESEL                                  :Freight Ship (Diesel)
+STR_LIVERY_FREIGHT_SHIP_SAIL                                    :Freight Ship (Sail)
 STR_LIVERY_HELICOPTER                                           :Helicopter
 STR_LIVERY_SMALL_PLANE                                          :Small Aeroplane
 STR_LIVERY_LARGE_PLANE                                          :Large Aeroplane
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/livery.h
--- a/src/livery.h	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/livery.h	Tue Sep 14 20:16:33 2010 +0200
@@ -43,8 +43,12 @@
 	LS_TRUCK,
 
 	/* Ships */
-	LS_PASSENGER_SHIP,
-	LS_FREIGHT_SHIP,
+	LS_PASSENGER_SHIP_STEAM,
+	LS_PASSENGER_SHIP_DIESEL,
+	LS_PASSENGER_SHIP_SAIL,
+	LS_FREIGHT_SHIP_STEAM,
+	LS_FREIGHT_SHIP_DIESEL,
+	LS_FREIGHT_SHIP_SAIL,
 
 	/* Aircraft */
 	LS_HELICOPTER,
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/newgrf.cpp
--- a/src/newgrf.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/newgrf.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -999,6 +999,12 @@
 				AlterVehicleListOrder(e->index, buf->ReadExtendedByte());
 				break;
 
+			case 0x1C: { // Ship class (steam / diesel / sail)
+				ShipClass sc = (ShipClass)buf->ReadByte();
+				if (sc < SCL_END) svi->shipclass = sc;
+				break;
+			}
+
 			default:
 				ret = CommonVehicleChangeInfo(ei, prop, buf);
 				break;
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/saveload/company_sl.cpp
--- a/src/saveload/company_sl.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/saveload/company_sl.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -285,20 +285,33 @@
 	}
 
 	/* Write each livery entry. */
-	int num_liveries = CheckSavegameVersion(63) ? LS_END - 4 : (CheckSavegameVersion(85) ? LS_END - 2: LS_END);
+	int num_liveries = LS_END;
+	if (CheckSavegameVersion(63))  num_liveries -= 2; // trams
+	if (CheckSavegameVersion(85))  num_liveries -= 2; // monorail / maglev pax wagons
+	if (CheckSavegameVersion(149)) num_liveries -= 4; // separate ship liveries
+
 	if (c != NULL) {
 		for (i = 0; i < num_liveries; i++) {
 			SlObject(&c->livery[i], _company_livery_desc);
 		}
 
-		if (num_liveries < LS_END) {
+		if (num_liveries <= (LS_END - 6)) { //pre version 85
 			/* We want to insert some liveries somewhere in between. This means some have to be moved. */
 			memmove(&c->livery[LS_FREIGHT_WAGON], &c->livery[LS_PASSENGER_WAGON_MONORAIL], (LS_END - LS_FREIGHT_WAGON) * sizeof(c->livery[0]));
 			c->livery[LS_PASSENGER_WAGON_MONORAIL] = c->livery[LS_MONORAIL];
 			c->livery[LS_PASSENGER_WAGON_MAGLEV]   = c->livery[LS_MAGLEV];
 		}
+		if (num_liveries < LS_END) { //pre version 149
+			/* Amount of ship liveries increases from 2 to 6. This requires some moving */
+			memmove(&c->livery[LS_HELICOPTER], &c->livery[LS_PASSENGER_SHIP_SAIL], (LS_END - LS_HELICOPTER) * sizeof(c->livery[0]));
+			/* Copy old passenger/freight liveries to the new slots */
+			for (LiveryScheme ls = LS_FREIGHT_SHIP_STEAM; ls <= LS_FREIGHT_SHIP_SAIL; ls++) {
+				c->livery[ls] = c->livery[LS_PASSENGER_SHIP_DIESEL]; //freight livery is now in pax-diesel slot
+			}
+			c->livery[LS_PASSENGER_SHIP_DIESEL] = c->livery[LS_PASSENGER_SHIP_SAIL] = c->livery[LS_PASSENGER_SHIP_STEAM];
+		}
 
-		if (num_liveries == LS_END - 4) {
+		if (num_liveries == LS_END - 8) { //pre version 63
 			/* Copy bus/truck liveries over to trams */
 			c->livery[LS_PASSENGER_TRAM] = c->livery[LS_BUS];
 			c->livery[LS_FREIGHT_TRAM]   = c->livery[LS_TRUCK];
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/saveload/saveload.cpp
--- a/src/saveload/saveload.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/saveload/saveload.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -211,8 +211,9 @@
  *  146   20446
  *  147   20621
  *  148   20659
+ *  149   patch_rev
  */
-extern const uint16 SAVEGAME_VERSION = 148; ///< current savegame version of OpenTTD
+extern const uint16 SAVEGAME_VERSION = 149; ///< current savegame version of OpenTTD
 
 SavegameType _savegame_type; ///< type of savegame we are loading
 
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/table/engines.h
--- a/src/table/engines.h	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/table/engines.h	Tue Sep 14 20:16:33 2010 +0200
@@ -540,8 +540,9 @@
  * @param e running_cost
  * @param f sound effect
  * @param g refittable
+ * shipclass is always SCL_DIESEL, since all default ships are diesels.
  */
-#define SVI(a, b, c, d, e, f, g) { a, b, c, d, e, f, g }
+#define SVI(a, b, c, d, e, f, g) { a, b, c, d, e, f, g, SCL_DIESEL }
 static const ShipVehicleInfo _orig_ship_vehicle_info[] = {
 	/*   image_index    capacity                   refittable
 	 *   |    cost_factor    running_cost          |
diff -r b5c43c3d5ba5 -r 87b149bc78d5 src/vehicle.cpp
--- a/src/vehicle.cpp	Tue Sep 14 17:45:13 2010 +0000
+++ b/src/vehicle.cpp	Tue Sep 14 20:16:33 2010 +0200
@@ -1542,7 +1542,18 @@
 			case VEH_SHIP: {
 				if (cargo_type == CT_INVALID) cargo_type = e->GetDefaultCargoType();
 				if (cargo_type == CT_INVALID) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo
-				scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP : LS_FREIGHT_SHIP;
+				switch (e->u.ship.shipclass) {
+					case SCL_STEAM:
+						scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP_STEAM : LS_FREIGHT_SHIP_STEAM;
+						break;
+					case SCL_DIESEL:
+						scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP_DIESEL : LS_FREIGHT_SHIP_DIESEL;
+						break;
+					case SCL_SAIL:
+						scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP_SAIL : LS_FREIGHT_SHIP_SAIL;
+						break;
+					default: NOT_REACHED();
+				}
 				break;
 			}
 
