Index: src/date_type.h
===================================================================
--- src/date_type.h	(revision 16090)
+++ src/date_type.h	(working copy)
@@ -11,12 +11,15 @@
  * 1 tick is approximately 30 ms.
  * 1 day is thus about 2 seconds (74 * 30 = 2220) on a machine that can run OpenTTD normally
  */
-enum {
-	DAY_TICKS = 74,          ///< ticks per day
-	DAYS_IN_YEAR = 365,      ///< days per year
-	DAYS_IN_LEAP_YEAR = 366, ///< sometimes, you need one day more...
-};
 
+#define DAY_TICKS (74 * _settings_game.economy.daylength)
+///< ticks per day
+#define DAYS_IN_YEAR 365
+///< days per year
+#define DAYS_IN_LEAP_YEAR 366
+///< sometimes, you need one day more...
+
+
 /*
  * ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR and DAYS_TILL_ORIGINAL_BASE_YEAR are
  * primarily used for loading newgrf and savegame data and returning some
Index: src/lang/english.txt
===================================================================
--- src/lang/english.txt	(revision 16090)
+++ src/lang/english.txt	(working copy)
@@ -2629,6 +2629,10 @@
 STR_ORDER_DROP_FULL_LOAD_ALL                                    :Full load all cargo
 STR_ORDER_DROP_FULL_LOAD_ANY                                    :Full load any cargo
 STR_ORDER_DROP_NO_LOADING                                       :No loading
+STR_ORDER_DROP_SOME_LOAD                                        :Wait for some cargo
+STR_ORDER_DROP_25_LOAD                                          :Wait for 25% load
+STR_ORDER_DROP_50_LOAD                                          :Wait for 50% load
+STR_ORDER_DROP_75_LOAD                                          :Wait for 75% load
 STR_ORDER_TOGGLE_UNLOAD                                         :{BLACK}Unload all
 STR_ORDER_DROP_UNLOAD_IF_ACCEPTED                               :Unload if accepted
 STR_ORDER_DROP_UNLOAD                                           :Unload all
@@ -2637,14 +2641,20 @@
 STR_ORDER_FULL_LOAD                                             :(Full load)
 STR_ORDER_FULL_LOAD_ANY                                         :(Full load any cargo)
 STR_ORDER_NO_LOAD                                               :(No loading)
+STR_ORDER_UNITS_LOAD                                            :(Wait for {WEIGHT_S} of cargo)
+STR_ORDER_PERCENT_LOAD                                          :(Wait for {NUM}% cargo)
 STR_ORDER_UNLOAD                                                :(Unload and take cargo)
 STR_ORDER_UNLOAD_FULL_LOAD                                      :(Unload and wait for full load)
 STR_ORDER_UNLOAD_FULL_LOAD_ANY                                  :(Unload and wait for any full load)
 STR_ORDER_UNLOAD_NO_LOAD                                        :(Unload and leave empty)
+STR_ORDER_UNLOAD_UNITS_LOAD                                     :(Unload and wait for {WEIGHT_S} of cargo)
+STR_ORDER_UNLOAD_PERCENT_LOAD                                   :(Unload and wait for {NUM}% cargo)
 STR_ORDER_TRANSFER                                              :(Transfer and take cargo)
 STR_ORDER_TRANSFER_FULL_LOAD                                    :(Transfer and wait for full load)
 STR_ORDER_TRANSFER_FULL_LOAD_ANY                                :(Transfer and wait for any full load)
 STR_ORDER_TRANSFER_NO_LOAD                                      :(Transfer and leave empty)
+STR_ORDER_TRANSFER_UNITS_LOAD                                   :(Transfer and wait for {WEIGHT_S} of cargo)
+STR_ORDER_TRANSFER_PERCENT_LOAD                                 :(Transfer and wait for {NUM}% cargo)
 STR_ORDER_NO_UNLOAD                                             :(No unload and take cargo)
 STR_ORDER_NO_UNLOAD_FULL_LOAD                                   :(No unload and wait for full load)
 STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY                               :(No unload and wait for any full load)
@@ -3601,6 +3611,10 @@
 STR_STATION_NOISE                                               :{BLACK}Noise generated: {GOLD}{COMMA}
 ########
 
+############ daylength advanced setting
+STR_CONFIG_PATCHES_DAYLENGTH                                    :{LTBLUE}Daylength factor: {ORANGE}{STRING} * 2,22 seconds at normal game speed
+########
+
 ############ Downloading of content from the central server
 STR_CONTENT_NO_ZLIB                                             :{WHITE}OpenTTD is build without "zlib" support...
 STR_CONTENT_NO_ZLIB_SUB                                         :{WHITE}... downloading content is not possible!
Index: src/settings_gui.cpp
===================================================================
--- src/settings_gui.cpp	(revision 16090)
+++ src/settings_gui.cpp	(working copy)
@@ -1220,6 +1220,7 @@
 	SettingEntry(&_settings_economy_industries_page, STR_CONFIG_SETTING_ECONOMY_INDUSTRIES),
 	SettingEntry("economy.inflation"),
 	SettingEntry("economy.smooth_economy"),
+	SettingEntry("economy.daylength"),
 };
 /** Economy sub-page */
 static SettingsPage _settings_economy_page = {_settings_economy, lengthof(_settings_economy)};
Index: src/order_base.h
===================================================================
--- src/order_base.h	(revision 16090)
+++ src/order_base.h	(working copy)
@@ -30,6 +30,7 @@
 
 	uint8 type;           ///< The type of order + non-stop flags
 	uint8 flags;          ///< Load/unload types, depot order/action types.
+	uint8 load_arg;       ///< Argument to load type, for load by units/percent.
 	DestinationID dest;   ///< The destination of the order.
 
 	CargoID refit_cargo;  ///< Refit CargoID
@@ -164,6 +165,8 @@
 
 	/** How must the consist be loaded? */
 	inline OrderLoadFlags GetLoadType() const { return (OrderLoadFlags)GB(this->flags, 4, 4); }
+	/** Argument to load type, for load by units/percent. */
+	inline uint8 GetLoadArg() const { return this->load_arg; }
 	/** How must the consist be unloaded? */
 	inline OrderUnloadFlags GetUnloadType() const { return (OrderUnloadFlags)GB(this->flags, 0, 4); }
 	/** At which stations must we stop? */
@@ -185,6 +188,8 @@
 
 	/** Set how the consist must be loaded. */
 	inline void SetLoadType(OrderLoadFlags load_type) { SB(this->flags, 4, 4, load_type); }
+	/** Set argument to load type, for load by units/percent. */
+	inline void SetLoadArg(uint8 arg) { this->load_arg = arg; }
 	/** Set how the consist must be unloaded. */
 	inline void SetUnloadType(OrderUnloadFlags unload_type) { SB(this->flags, 0, 4, unload_type); }
 	/** Set whether we must stop at stations or not. */
Index: src/order_func.h
===================================================================
--- src/order_func.h	(revision 16090)
+++ src/order_func.h	(working copy)
@@ -55,4 +55,24 @@
  */
 Date GetServiceIntervalClamped(uint index);
 
+/**
+ * Check if a given OrderLoadFlags requests waiting for cargo.
+ *
+ * @param order The order's load flags.
+ * @return True if should wait for cargo, false otherwise.
+ */
+static inline int32 IsWaitOrder(uint16 order) {
+        return (order & OLFB_FULL_LOAD || order > OLFB_NO_LOAD);
+}
+
+/**
+ * Check if a given OrderLoadFlags requests not loading cargo.
+ *
+ * @param order The order's load flags.
+ * @return True if should not load cargo, false otherwise.
+ */
+static inline int32 IsNoLoadOrder(uint16 order) {
+        return (order & OLFB_NO_LOAD && order <= OLFB_NO_LOAD);
+}
+
 #endif /* ORDER_FUNC_H */
Index: src/table/settings.h
===================================================================
--- src/table/settings.h	(revision 16090)
+++ src/table/settings.h	(working copy)
@@ -425,6 +425,7 @@
 	 SDT_CONDVAR(GameSettings, economy.larger_towns,                 SLE_UINT8, 54, SL_MAX_VERSION, 0, D0,    4,     0,     255, 1, STR_CONFIG_SETTING_LARGER_TOWNS,           NULL),
 	 SDT_CONDVAR(GameSettings, economy.initial_city_size,            SLE_UINT8, 56, SL_MAX_VERSION, 0, 0,     2,     1,      10, 1, STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER,   NULL),
 	SDT_CONDBOOL(GameSettings, economy.mod_road_rebuild,                        77, SL_MAX_VERSION, 0, 0, false,                    STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD,  NULL),
+	 SDT_CONDVAR(GameSettings, economy.daylength,                    SLE_UINT8,104, SL_MAX_VERSION, 0, 0,     1,     1,      31, 1, STR_CONFIG_PATCHES_DAYLENGTH,              NULL),
 
 	SDT_CONDNULL(1, 0, 106), // previously ai-new setting.
 	    SDT_BOOL(GameSettings, ai.ai_in_multiplayer,                                                0, 0, true,                     STR_CONFIG_SETTING_AI_IN_MULTIPLAYER,      NULL),
Index: src/order_type.h
===================================================================
--- src/order_type.h	(revision 16090)
+++ src/order_type.h	(working copy)
@@ -58,9 +58,25 @@
 	OLFB_FULL_LOAD       = 1 << 1, ///< Full load the complete the consist.
 	OLF_FULL_LOAD_ANY    = 3,      ///< Full load the a single cargo of the consist.
 	OLFB_NO_LOAD         = 4,      ///< Do not load anything.
+	OLF_LOAD_UNITS       = 5,      ///< Load at least (arg) units.
+	OLF_LOAD_PERCENT     = 6,      ///< Load at least (arg)%
 };
 
 /**
+ * Loading orders in the GUI drop-down box.
+ */
+enum OrderLoadDropdown {
+	OLD_LOAD_IF_POSSIBLE = 0,      ///< Load if available
+	OLD_FULL_LOAD_ALL    = 2,      ///< Full load all cargo
+	OLD_FULL_LOAD_ANY    = 3,      ///< Full load any cargo
+	OLD_NO_LOADING       = 4,      ///< No loading
+	OLD_SOME_LOAD        = 5,      ///< Wait for some cargo
+	OLD_25_LOAD          = 6,      ///< Wait for 25% load
+	OLD_50_LOAD          = 7,      ///< Wait for 50% load
+	OLD_75_LOAD          = 8,      ///< Wait for 75% load
+};
+
+/**
  * Non-stop order flags.
  */
 enum OrderNonStopFlags {
Index: src/ship_cmd.cpp
===================================================================
--- src/ship_cmd.cpp	(revision 16090)
+++ src/ship_cmd.cpp	(working copy)
@@ -150,7 +150,7 @@
 
 Money Ship::GetRunningCost() const
 {
-	return GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _price.ship_running;
+	return GetVehicleProperty(this, 0x0F, ShipVehInfo(this->engine_type)->running_cost) * _settings_game.economy.daylength * _price.ship_running;
 }
 
 void Ship::OnNewDay()
Index: src/roadveh.h
===================================================================
--- src/roadveh.h	(revision 16090)
+++ src/roadveh.h	(working copy)
@@ -9,6 +9,7 @@
 #include "engine_func.h"
 #include "engine_base.h"
 #include "economy_func.h"
+#include "settings_type.h"
 
 /** State information about the Road Vehicle controller */
 enum {
@@ -96,7 +97,7 @@
 	SpriteID GetImage(Direction direction) const;
 	int GetDisplaySpeed() const { return this->cur_speed / 2; }
 	int GetDisplayMaxSpeed() const { return this->max_speed / 2; }
-	Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * GetPriceByIndex(RoadVehInfo(this->engine_type)->running_cost_class); }
+	Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * _settings_game.economy.daylength * GetPriceByIndex(RoadVehInfo(this->engine_type)->running_cost_class); }
 	bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; }
 	bool IsStoppedInDepot() const;
 	void Tick();
Index: src/order_cmd.cpp
===================================================================
--- src/order_cmd.cpp	(revision 16090)
+++ src/order_cmd.cpp	(working copy)
@@ -40,6 +40,7 @@
 {
 	this->type  = OT_NOTHING;
 	this->flags = 0;
+	this->load_arg = 0;
 	this->dest  = 0;
 	this->next  = NULL;
 }
@@ -119,6 +120,7 @@
 	return
 			this->type  == other.type &&
 			this->flags == other.flags &&
+			this->load_arg == other.load_arg &&
 			this->dest  == other.dest;
 }
 
@@ -131,6 +133,7 @@
 {
 	this->type    = (OrderType)GB(packed,  0,  8);
 	this->flags   = GB(packed,  8,  8);
+	this->load_arg = 0;
 	this->dest    = GB(packed, 16, 16);
 	this->next    = NULL;
 	this->refit_cargo   = CT_NO_REFIT;
@@ -169,6 +172,7 @@
 {
 	this->type  = other.type;
 	this->flags = other.flags;
+	this->load_arg = other.load_arg;
 	this->dest  = other.dest;
 
 	this->refit_cargo   = other.refit_cargo;
@@ -443,11 +447,11 @@
 			if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN && v->type != VEH_ROAD) return CMD_ERROR;
 
 			/* No load and no unload are mutual exclusive. */
-			if ((new_order.GetLoadType() & OLFB_NO_LOAD) && (new_order.GetUnloadType() & OUFB_NO_UNLOAD)) return CMD_ERROR;
+			if (IsNoLoadOrder(new_order.GetLoadType()) && (new_order.GetUnloadType() & OUFB_NO_UNLOAD)) return CMD_ERROR;
 
 			/* Filter invalid load/unload types. */
 			switch (new_order.GetLoadType()) {
-				case OLF_LOAD_IF_POSSIBLE: case OLFB_FULL_LOAD: case OLF_FULL_LOAD_ANY: case OLFB_NO_LOAD: break;
+				case OLF_LOAD_IF_POSSIBLE: case OLFB_FULL_LOAD: case OLF_FULL_LOAD_ANY: case OLFB_NO_LOAD: case OLF_LOAD_PERCENT: break;
 				default: return CMD_ERROR;
 			}
 			switch (new_order.GetUnloadType()) {
@@ -851,6 +855,7 @@
 	VehicleID veh          = GB(p1,  0, 16);
 	ModifyOrderFlags mof   = (ModifyOrderFlags)GB(p2,  0,  4);
 	uint16 data             = GB(p2, 4, 11);
+	uint8 arg              = 0;
 
 	if (mof >= MOF_END) return CMD_ERROR;
 	if (!IsValidVehicleID(veh)) return CMD_ERROR;
@@ -905,8 +910,31 @@
 			break;
 
 		case MOF_LOAD:
-			if (data > OLFB_NO_LOAD || data == 1) return CMD_ERROR;
-			if (data == order->GetLoadType()) return CMD_ERROR;
+			if (data > OLD_75_LOAD || data == 1) return CMD_ERROR;
+			switch (data) {
+				case OLD_SOME_LOAD:
+					data = OLF_LOAD_UNITS;
+					arg = 1;
+					break;
+					
+				case OLD_25_LOAD:
+					data = OLF_LOAD_PERCENT;
+					arg = 25;
+					break;
+				
+				case OLD_50_LOAD:
+					data = OLF_LOAD_PERCENT;
+					arg = 50;
+					break;
+				
+				case OLD_75_LOAD:
+					data = OLF_LOAD_PERCENT;
+					arg = 75;
+					break;
+					
+				default: break;
+			}
+			if (data == order->GetLoadType() && arg == order->GetLoadArg()) return CMD_ERROR;
 			break;
 
 		case MOF_DEPOT_ACTION:
@@ -964,14 +992,15 @@
 
 			case MOF_UNLOAD:
 				order->SetUnloadType((OrderUnloadFlags)data);
-				if ((data & OUFB_NO_UNLOAD) != 0 && (order->GetLoadType() & OLFB_NO_LOAD) != 0) {
+				if ((data & OUFB_NO_UNLOAD) != 0 && IsNoLoadOrder(order->GetLoadType())) {
 					order->SetLoadType((OrderLoadFlags)(order->GetLoadType() & ~OLFB_NO_LOAD));
 				}
 				break;
 
 			case MOF_LOAD:
 				order->SetLoadType((OrderLoadFlags)data);
-				if ((data & OLFB_NO_LOAD) != 0 && (order->GetUnloadType() & OUFB_NO_UNLOAD) != 0) {
+				order->SetLoadArg(arg);
+				if (IsNoLoadOrder(data) && (order->GetUnloadType() & OUFB_NO_UNLOAD) != 0) {
 					/* No load + no unload isn't compatible */
 					order->SetUnloadType((OrderUnloadFlags)(order->GetUnloadType() & ~OUFB_NO_UNLOAD));
 				}
@@ -1053,8 +1082,9 @@
 			 */
 			if (sel_ord == u->cur_order_index &&
 					(u->current_order.IsType(OT_GOTO_STATION) || u->current_order.IsType(OT_LOADING)) &&
-					u->current_order.GetLoadType() != order->GetLoadType()) {
+					(u->current_order.GetLoadType() != order->GetLoadType() || u->current_order.GetLoadArg() != order->GetLoadArg())) {
 				u->current_order.SetLoadType(order->GetLoadType());
+				u->current_order.SetLoadArg(order->GetLoadArg());
 			}
 			InvalidateVehicleOrder(u, 0);
 		}
Index: src/train_cmd.cpp
===================================================================
--- src/train_cmd.cpp	(revision 16090)
+++ src/train_cmd.cpp	(working copy)
@@ -4424,7 +4424,7 @@
 		/* Halve running cost for multiheaded parts */
 		if (IsMultiheaded(v)) cost_factor /= 2;
 
-		cost += cost_factor * GetPriceByIndex(rvi->running_cost_class);
+		cost += cost_factor * _settings_game.economy.daylength * GetPriceByIndex(rvi->running_cost_class);
 	} while ((v = GetNextVehicle(v)) != NULL);
 
 	return cost;
Index: src/settings_type.h
===================================================================
--- src/settings_type.h	(revision 16090)
+++ src/settings_type.h	(working copy)
@@ -326,6 +326,7 @@
 	bool   allow_town_roads;                 ///< towns are allowed to build roads (always allowed when generating world / in SE)
 	bool   station_noise_level;              ///< build new airports when the town noise level is still within accepted limits
 	uint16 town_noise_population[3];         ///< population to base decision on noise evaluation (@see town_council_tolerance)
+	byte daylength;                          ///< factor by which the daylength is multiplied (74 default ticks * setting)
 };
 
 /** Settings related to stations. */
Index: src/order_gui.cpp
===================================================================
--- src/order_gui.cpp	(revision 16090)
+++ src/order_gui.cpp	(working copy)
@@ -57,37 +57,47 @@
 };
 
 /** Order load types that could be given to station orders. */
-static const StringID _station_load_types[][5] = {
+static const StringID _station_load_types[][7] = {
 	{
 		STR_EMPTY,
 		INVALID_STRING_ID,
 		STR_ORDER_FULL_LOAD,
 		STR_ORDER_FULL_LOAD_ANY,
 		STR_ORDER_NO_LOAD,
+		STR_ORDER_UNITS_LOAD,
+		STR_ORDER_PERCENT_LOAD,
 	}, {
 		STR_ORDER_UNLOAD,
 		INVALID_STRING_ID,
 		STR_ORDER_UNLOAD_FULL_LOAD,
 		STR_ORDER_UNLOAD_FULL_LOAD_ANY,
 		STR_ORDER_UNLOAD_NO_LOAD,
+		STR_ORDER_UNLOAD_UNITS_LOAD,
+		STR_ORDER_UNLOAD_PERCENT_LOAD,
 	}, {
 		STR_ORDER_TRANSFER,
 		INVALID_STRING_ID,
 		STR_ORDER_TRANSFER_FULL_LOAD,
 		STR_ORDER_TRANSFER_FULL_LOAD_ANY,
 		STR_ORDER_TRANSFER_NO_LOAD,
+		STR_ORDER_TRANSFER_UNITS_LOAD,
+		STR_ORDER_TRANSFER_PERCENT_LOAD,
 	}, {
 		/* Unload and transfer do not work together. */
 		INVALID_STRING_ID,
 		INVALID_STRING_ID,
 		INVALID_STRING_ID,
 		INVALID_STRING_ID,
+		INVALID_STRING_ID,
+		INVALID_STRING_ID,
 	}, {
 		STR_ORDER_NO_UNLOAD,
 		INVALID_STRING_ID,
 		STR_ORDER_NO_UNLOAD_FULL_LOAD,
 		STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY,
 		INVALID_STRING_ID,
+		INVALID_STRING_ID,
+		INVALID_STRING_ID,
 	}
 };
 
@@ -105,6 +115,10 @@
 	STR_ORDER_DROP_FULL_LOAD_ALL,
 	STR_ORDER_DROP_FULL_LOAD_ANY,
 	STR_ORDER_DROP_NO_LOADING,
+	STR_ORDER_DROP_SOME_LOAD,
+	STR_ORDER_DROP_25_LOAD,
+	STR_ORDER_DROP_50_LOAD,
+	STR_ORDER_DROP_75_LOAD,
 	INVALID_STRING_ID
 };
 
@@ -202,6 +216,7 @@
 				}
 			} else {
 				SetDParam(4, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) ? STR_EMPTY : _station_load_types[unload][load]);
+				SetDParam(5, order->GetLoadArg());
 				if (v->type == VEH_TRAIN && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) {
 					SetDParam(6, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END);
 				}
Index: src/economy.cpp
===================================================================
--- src/economy.cpp	(revision 16090)
+++ src/economy.cpp	(working copy)
@@ -1551,7 +1551,7 @@
 
 	/* We have not waited enough time till the next round of loading/unloading */
 	if (--v->load_unload_time_rem != 0) {
-		if (_settings_game.order.improved_load && (v->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
+		if (_settings_game.order.improved_load && IsWaitOrder(v->current_order.GetLoadType())) {
 			/* 'Reserve' this cargo for this vehicle, because we were first. */
 			for (; v != NULL; v = v->Next()) {
 				int cap_left = v->cargo_cap - v->cargo.Count();
@@ -1646,7 +1646,7 @@
 		}
 
 		/* Do not pick up goods when we have no-load set. */
-		if (u->current_order.GetLoadType() & OLFB_NO_LOAD) continue;
+		if (IsNoLoadOrder(u->current_order.GetLoadType())) continue;
 
 		/* update stats */
 		int t;
@@ -1721,7 +1721,7 @@
 	 * all wagons at the same time instead of using the same 'improved'
 	 * loading algorithm for the wagons (only fill wagon when there is
 	 * enough to fill the previous wagons) */
-	if (_settings_game.order.improved_load && (u->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
+	if (_settings_game.order.improved_load && IsWaitOrder(u->current_order.GetLoadType())) {
 		/* Update left cargo */
 		for (v = u; v != NULL; v = v->Next()) {
 			int cap_left = v->cargo_cap - v->cargo.Count();
@@ -1741,8 +1741,26 @@
 		}
 	} else {
 		bool finished_loading = true;
-		if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) {
-			if (v->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) {
+		OrderLoadFlags load_type = v->current_order.GetLoadType();
+		if (load_type > OLFB_NO_LOAD && cargo_not_full != 0) {
+			switch (load_type) {
+			case OLF_LOAD_PERCENT: {
+				uint cargo_target = v->cargo_cap * v->current_order.GetLoadArg() / 100;
+				printf("OLF_LOAD_PERCENT: Have %d, want %d (%d%% of %d)\n",
+					(int)v->cargo.Count(), (int)cargo_target,
+					(int)v->current_order.GetLoadArg(), (int)v->cargo_cap);
+				if (v->cargo.Count() < cargo_target || v->cargo.Count() == 0) finished_loading = false;
+				} break;
+				
+			case OLF_LOAD_UNITS:
+				printf("OLF_LOAD_UNITS: Have %u, want %u.\n", v->cargo.Count(), v->current_order.GetLoadArg());
+				if (v->cargo.Count() < v->current_order.GetLoadArg() || v->cargo.Count() == 0) finished_loading = false;
+				break;
+				
+			default: break;
+			}
+		} else if (load_type & OLFB_FULL_LOAD) {
+			if (load_type == OLF_FULL_LOAD_ANY) {
 				/* if the aircraft carries passengers and is NOT full, then
 				 * continue loading, no matter how much mail is in */
 				if ((v->type == VEH_AIRCRAFT && IsCargoInClass(v->cargo_type, CC_PASSENGERS) && v->cargo_cap > v->cargo.Count()) ||
Index: src/sortlist_type.h
===================================================================
--- src/sortlist_type.h	(revision 16090)
+++ src/sortlist_type.h	(working copy)
@@ -11,6 +11,7 @@
 #include "core/sort_func.hpp"
 #include "core/smallvec_type.hpp"
 #include "date_type.h"
+#include "settings_type.h"
 
 enum SortListFlags {
 	VL_NONE       = 0,      ///< no sort
Index: src/saveload/order_sl.cpp
===================================================================
--- src/saveload/order_sl.cpp	(revision 16090)
+++ src/saveload/order_sl.cpp	(working copy)
@@ -97,6 +97,7 @@
 		 SLE_CONDVAR(Order, refit_subtype,  SLE_UINT8,   36, SL_MAX_VERSION),
 		 SLE_CONDVAR(Order, wait_time,      SLE_UINT16,  67, SL_MAX_VERSION),
 		 SLE_CONDVAR(Order, travel_time,    SLE_UINT16,  67, SL_MAX_VERSION),
+		 SLE_CONDVAR(Order, load_arg,       SLE_UINT8,  114, SL_MAX_VERSION),
 
 		/* Leftover from the minor savegame version stuff
 		 * We will never use those free bytes, but we have to keep this line to allow loading of old savegames */
Index: src/engine.cpp
===================================================================
--- src/engine.cpp	(revision 16090)
+++ src/engine.cpp	(working copy)
@@ -211,16 +211,16 @@
 {
 	switch (this->type) {
 		case VEH_ROAD:
-			return this->u.road.running_cost * GetPriceByIndex(this->u.road.running_cost_class) >> 8;
+			return this->u.road.running_cost * GetPriceByIndex(this->u.road.running_cost_class) * _settings_game.economy.daylength >> 8;
 
 		case VEH_TRAIN:
-			return GetEngineProperty(this->index, 0x0D, this->u.rail.running_cost) * GetPriceByIndex(this->u.rail.running_cost_class) >> 8;
+			return GetEngineProperty(this->index, 0x0D, this->u.rail.running_cost) * GetPriceByIndex(this->u.rail.running_cost_class) * _settings_game.economy.daylength >> 8;
 
 		case VEH_SHIP:
-			return GetEngineProperty(this->index, 0x0F, this->u.ship.running_cost) * _price.ship_running >> 8;
+			return GetEngineProperty(this->index, 0x0F, this->u.ship.running_cost) * _settings_game.economy.daylength * _price.ship_running >> 8;
 
 		case VEH_AIRCRAFT:
-			return GetEngineProperty(this->index, 0x0E, this->u.air.running_cost) * _price.aircraft_running >> 8;
+			return GetEngineProperty(this->index, 0x0E, this->u.air.running_cost) * _settings_game.economy.daylength * _price.aircraft_running >> 8;
 
 		default: NOT_REACHED();
 	}
Index: src/vehicle_base.h
===================================================================
--- src/vehicle_base.h	(revision 16090)
+++ src/vehicle_base.h	(working copy)
@@ -24,6 +24,7 @@
 #include "engine_type.h"
 #include "order_func.h"
 #include "transport_type.h"
+#include "settings_type.h"
 
 /** Road vehicle states */
 enum RoadVehicleStates {
Index: src/aircraft_cmd.cpp
===================================================================
--- src/aircraft_cmd.cpp	(revision 16090)
+++ src/aircraft_cmd.cpp	(working copy)
@@ -612,7 +612,7 @@
 
 Money Aircraft::GetRunningCost() const
 {
-	return GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _price.aircraft_running;
+	return GetVehicleProperty(this, 0x0E, AircraftVehInfo(this->engine_type)->running_cost) * _settings_game.economy.daylength * _price.aircraft_running;
 }
 
 void Aircraft::OnNewDay()
Index: Makefile.bundle.in
===================================================================
--- Makefile.bundle.in	(revision 16090)
+++ Makefile.bundle.in	(working copy)
@@ -109,6 +109,13 @@
 	$(Q)cd "$(BUNDLES_DIR)/.bzip2" && tar -jc$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.bz2" "$(BUNDLE_NAME)"
 	$(Q)rm -rf   "$(BUNDLES_DIR)/.bzip2"
 
+bundle_lzma: bundle
+	@echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.lzma'
+	$(Q)mkdir -p "$(BUNDLES_DIR)/.lzma/$(BUNDLE_NAME)"
+	$(Q)cp -R    "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.lzma/$(BUNDLE_NAME)/"
+	$(Q)cd "$(BUNDLES_DIR)/.lzma" && tar --lzma -c$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.lzma" "$(BUNDLE_NAME)"
+	$(Q)rm -rf   "$(BUNDLES_DIR)/.lzma"
+
 bundle_lha: bundle
 	@echo '[BUNDLE] Creating $(BUNDLE_NAME).lha'
 	$(Q)mkdir -p "$(BUNDLES_DIR)/.lha/$(BUNDLE_NAME)"
