Index: src/lang/english.txt
===================================================================
--- src/lang/english.txt	(revision 11740)
+++ src/lang/english.txt	(working copy)
@@ -2647,6 +2647,10 @@
 STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Go non-stop to {STATION} (Transfer and leave empty)
 STR_8810_GO_NON_STOP_TO_LOAD                                    :Go non-stop to {STATION} (Load)
 STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Go non-stop to {STATION} (Transfer and wait for full load)
+STR_GO_TO_KEEP_CARGO                                            :Go to {STATION} (Do not unload)
+STR_GO_TO_LOAD_KEEP_CARGO                                       :Go to {STATION} (Load only)
+STR_GO_TO_NON_STOP_KEEP_CARGO                                   :Go non-stop to {STATION} (Do not unload)
+STR_GO_TO_NON_STOP_LOAD_KEEP_CARGO                              :Go non-stop to {STATION} (Load only)
 STR_GO_TO_TRAIN_DEPOT                                           :Go to {TOWN} Train Depot
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service at {TOWN} Train Depot
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Go non-stop to {TOWN} Train Depot
@@ -2783,6 +2787,8 @@
 STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Can't rename train vehicle type...
 STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Make the highlighted order force the vehicle to dump cargo
 STR_886F_TRANSFER                                               :{BLACK}Transfer
+STR_KEEP                                                        :{BLACK}Keep
+STR_KEEP_TIP                                                    :{BLACK}Make the highlighted order force the vehicle to not deliver cargo
 STR_CLEAR_TIME                                                  :{BLACK}Clear Time
 STR_RESET_LATENESS                                              :{BLACK}Reset Late Counter
 
Index: src/order_cmd.cpp
===================================================================
--- src/order_cmd.cpp	(revision 11740)
+++ src/order_cmd.cpp	(working copy)
@@ -209,7 +209,8 @@
 			}
 
 			/* Order flags can be any of the following for stations:
-			 * [full-load | unload] [+ transfer] [+ non-stop]
+			 * [full-load | unload] [+ transfer] [+ non-stop] or
+			 * keep [+ full-load]
 			 * non-stop orders (if any) are only valid for trains */
 			switch (new_order.flags) {
 				case 0:
@@ -218,6 +219,8 @@
 				case OF_UNLOAD:
 				case OF_UNLOAD | OF_TRANSFER:
 				case OF_TRANSFER:
+				case OF_KEEP:
+				case OF_FULL_LOAD | OF_KEEP:
 					break;
 
 				case OF_NON_STOP:
@@ -226,6 +229,8 @@
 				case OF_NON_STOP | OF_UNLOAD:
 				case OF_NON_STOP | OF_UNLOAD | OF_TRANSFER:
 				case OF_NON_STOP | OF_TRANSFER:
+				case OF_NON_STOP | OF_KEEP:
+				case OF_NON_STOP | OF_FULL_LOAD | OF_KEEP:
 					if (v->type != VEH_TRAIN) return CMD_ERROR;
 					break;
 
@@ -667,7 +672,8 @@
 	VehicleID veh   = GB(p1,  0, 16);
 
 	if (!IsValidVehicleID(veh)) return CMD_ERROR;
-	if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR;
+	if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER &&
+			p2 != OFB_KEEP) return CMD_ERROR;
 
 	v = GetVehicle(veh);
 
@@ -692,13 +698,20 @@
 		case OFB_UNLOAD:
 			ToggleBit(order->flags, OFB_UNLOAD);
 			ClrBit(order->flags, OFB_FULL_LOAD);
+			ClrBit(order->flags, OFB_KEEP);
 			break;
 		case OFB_NON_STOP:
 			ToggleBit(order->flags, OFB_NON_STOP);
 			break;
 		case OFB_TRANSFER:
 			ToggleBit(order->flags, OFB_TRANSFER);
+			ClrBit(order->flags, OFB_KEEP);
 			break;
+		case OFB_KEEP:
+			ToggleBit(order->flags, OFB_KEEP);
+			ClrBit(order->flags, OFB_UNLOAD);
+			ClrBit(order->flags, OFB_TRANSFER);
+			break;
 		default: NOT_REACHED();
 		}
 
Index: src/train_cmd.cpp
===================================================================
--- src/train_cmd.cpp	(revision 11740)
+++ src/train_cmd.cpp	(working copy)
@@ -2521,6 +2521,32 @@
 			order->dest  == v->current_order.dest)
 		return false;
 
+	/* If the order has the keep flag, check to see if the vehicle is full */
+	if (order->type == OT_GOTO_STATION && HasBit(order->flags, OFB_KEEP)) {
+		const Vehicle *u = v;
+		for (; u != NULL; u=u->Next()) {
+			/* The vehicle isn't full, so we can use the current order */
+			if (u->cargo_cap > u->cargo.Count())
+				break;
+		}
+
+		/* The vehicle is full, so skip orders until we get one without a keep flag */
+		if (u == NULL) {
+			VehicleOrderID first_idx = v->cur_order_index;
+
+			do {
+				if (++v->cur_order_index >= v->num_orders) v->cur_order_index=0;
+
+				order = GetVehicleOrder(v, v->cur_order_index);
+
+				/* If this order isn't a keep order, we can use it. */
+				if (order->type != OT_GOTO_STATION || !HasBit(order->flags, OFB_KEEP))
+					break;
+			/* Only loop until we hit the first one again (at most) to avoid infinite loops. */
+			} while (v->cur_order_index != first_idx);
+		}
+	}
+
 	/* Otherwise set it, and determine the destination tile. */
 	v->current_order = *order;
 
Index: src/order_gui.cpp
===================================================================
--- src/order_gui.cpp	(revision 11740)
+++ src/order_gui.cpp	(working copy)
@@ -40,6 +40,7 @@
 	ORDER_WIDGET_UNLOAD,
 	ORDER_WIDGET_REFIT,
 	ORDER_WIDGET_TRANSFER,
+	ORDER_WIDGET_KEEP,
 	ORDER_WIDGET_SHARED_ORDER_LIST,
 	ORDER_WIDGET_RESIZE_BAR,
 	ORDER_WIDGET_RESIZE,
@@ -102,6 +103,23 @@
 	STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD,
 	STR_8810_GO_NON_STOP_TO_LOAD,
 	STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD,
+	STR_NULL,
+	STR_NULL,
+	STR_GO_TO_KEEP_CARGO,
+	STR_NULL,
+	STR_NULL,
+	STR_NULL,
+	STR_GO_TO_LOAD_KEEP_CARGO,
+	STR_NULL,
+	STR_NULL,
+	STR_NULL,
+	STR_GO_TO_NON_STOP_KEEP_CARGO,
+	STR_NULL,
+	STR_NULL,
+	STR_NULL,
+	STR_GO_TO_NON_STOP_LOAD_KEEP_CARGO,
+	STR_NULL,
+	STR_NULL,
 	STR_NULL
 };
 
@@ -138,6 +156,7 @@
 		w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load
 		w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD,    order == NULL); // unload
 		w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER,  order == NULL); // transfer
+		w->SetWidgetDisabledState(ORDER_WIDGET_KEEP,      order == NULL); // keep
 		/* Disable list of vehicles with the same shared orders if there is no list */
 		w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL);
 		w->SetWidgetDisabledState(ORDER_WIDGET_REFIT,     order == NULL); // Refit
@@ -158,10 +177,12 @@
 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
+				w->DisableWidget(ORDER_WIDGET_KEEP);
 				break;
 
 			case OT_GOTO_DEPOT:
 				w->DisableWidget(ORDER_WIDGET_TRANSFER);
+				w->DisableWidget(ORDER_WIDGET_KEEP);
 
 				/* Remove unload and replace it with refit */
 				w->HideWidget(ORDER_WIDGET_UNLOAD);
@@ -173,6 +194,7 @@
 				w->DisableWidget(ORDER_WIDGET_NON_STOP);
 				w->DisableWidget(ORDER_WIDGET_FULL_LOAD);
 				w->DisableWidget(ORDER_WIDGET_UNLOAD);
+				w->DisableWidget(ORDER_WIDGET_KEEP);
 		}
 	}
 
@@ -452,6 +474,17 @@
 }
 
 /**
+ * Handle the click on the keep button.
+ *
+ * @param w current window
+ * @param v current vehicle
+ */
+static void OrderClick_Keep(Window* w, const Vehicle* v)
+{
+	DoCommandP(v->tile, v->index + (OrderGetSel(w) <<  16), OFB_KEEP,     NULL, CMD_MODIFY_ORDER | CMD_MSG(STR_8835_CAN_T_MODIFY_THIS_ORDER));
+}
+
+/**
  * Handle the click on the skip button.
  * If ctrl is pressed skip to selected order.
  *  Else skip to current order + 1
@@ -512,7 +545,8 @@
 	OrderClick_Goto,
 	OrderClick_FullLoad,
 	OrderClick_Unload,
-	OrderClick_Transfer
+	OrderClick_Transfer,
+	OrderClick_Keep
 };
 
 static const uint16 _order_keycodes[] = {
@@ -630,6 +664,10 @@
 			OrderClick_Transfer(w, v);
 			break;
 
+		case ORDER_WIDGET_KEEP:
+			OrderClick_Keep(w, v);
+			break;
+
 		case ORDER_WIDGET_TIMETABLE_VIEW:
 			ShowTimetableWindow(v);
 			break;
@@ -743,12 +781,12 @@
  */
 static const Widget _orders_train_widgets[] = {
 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   398,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
-	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   338,   398,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   438,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   378,   438,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
 
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   386,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   426,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
 
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   387,   398,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   427,   438,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
 
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    52,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    53,   105,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
@@ -758,17 +796,18 @@
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   265,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   372,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   373,   412,    76,    87, STR_KEEP,                STR_KEEP_TIP}, // ORDER_WIDGET_KEEP
 
-	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   373,   386,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
+	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   413,   426,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,   387,   386,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{      WWT_PANEL,   RESIZE_RTB,     14,   427,   426,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
 
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   387,   398,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   427,   438,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
 	{   WIDGETS_END},
 };
 
 static const WindowDesc _orders_train_desc = {
-	WDP_AUTO, WDP_AUTO, 399, 88, 399, 88,
+	WDP_AUTO, WDP_AUTO, 439, 88, 439, 88,
 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_orders_train_widgets,
@@ -780,12 +819,12 @@
  */
 static const Widget _orders_widgets[] = {
 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                STR_018B_CLOSE_WINDOW},               // ORDER_WIDGET_CLOSEBOX
-	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   409,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
-	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   349,   409,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
+	{    WWT_CAPTION,   RESIZE_RIGHT,   14,    11,   449,     0,    13, STR_8829_ORDERS,         STR_018C_WINDOW_TITLE_DRAG_THIS},     // ORDER_WIDGET_CAPTION
+	{ WWT_PUSHTXTBTN,   RESIZE_LR,      14,   389,   449,     0,    13, STR_TIMETABLE_VIEW,      STR_TIMETABLE_VIEW_TOOLTIP},          // ORDER_WIDGET_TIMETABLE_VIEW
 
-	{      WWT_PANEL,   RESIZE_RB,      14,     0,   397,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
+	{      WWT_PANEL,   RESIZE_RB,      14,     0,   437,    14,    75, 0x0,                     STR_8852_ORDERS_LIST_CLICK_ON_ORDER}, // ORDER_WIDGET_ORDER_LIST
 
-	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   398,   409,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
+	{  WWT_SCROLLBAR,   RESIZE_LRB,     14,   438,   449,    14,    75, 0x0,                     STR_0190_SCROLL_BAR_SCROLLS_LIST},    // ORDER_WIDGET_SCROLLBAR
 
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,     0,    63,    76,    87, STR_8823_SKIP,           STR_8853_SKIP_THE_CURRENT_ORDER},     // ORDER_WIDGET_SKIP
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,    64,   128,    76,    87, STR_8824_DELETE,         STR_8854_DELETE_THE_HIGHLIGHTED},     // ORDER_WIDGET_DELETE
@@ -795,17 +834,18 @@
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_8828_UNLOAD,         STR_8858_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_UNLOAD
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   257,   319,    76,    87, STR_REFIT,               STR_REFIT_TIP},                       // ORDER_WIDGET_REFIT
 	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   320,   383,    76,    87, STR_886F_TRANSFER,       STR_886D_MAKE_THE_HIGHLIGHTED_ORDER}, // ORDER_WIDGET_TRANSFER
+	{ WWT_PUSHTXTBTN,   RESIZE_TB,      14,   384,   423,    76,    87, STR_KEEP,                STR_KEEP_TIP}, // ORDER_WIDGET_KEEP
 
-	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   384,   397,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
+	{ WWT_PUSHIMGBTN,   RESIZE_TB,      14,   424,   437,    76,    87, SPR_SHARED_ORDERS_ICON,  STR_VEH_WITH_SHARED_ORDERS_LIST_TIP}, // ORDER_WIDGET_SHARED_ORDER_LIST
 
-	{      WWT_PANEL,   RESIZE_RTB,     14,   397,   396,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
+	{      WWT_PANEL,   RESIZE_RTB,     14,   437,   436,    76,    87, 0x0,                     STR_NULL},                            // ORDER_WIDGET_RESIZE_BAR
 
-	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   398,   409,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
+	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   438,   449,    76,    87, 0x0,                     STR_RESIZE_BUTTON},                   // ORDER_WIDGET_RESIZE
 	{   WIDGETS_END},
 };
 
 static const WindowDesc _orders_desc = {
-	WDP_AUTO, WDP_AUTO, 410, 88, 410, 88,
+	WDP_AUTO, WDP_AUTO, 450, 88, 450, 88,
 	WC_VEHICLE_ORDERS,WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
 	_orders_widgets,
@@ -832,6 +872,7 @@
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_UNLOAD
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_REFIT
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_TRANSFER
+	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_KEEP
 
 	{      WWT_EMPTY,   RESIZE_NONE,    14,     0,   319,    76,    87, 0x0,                STR_NULL},                            // ORDER_WIDGET_SHARED_ORDER_LIST
 
Index: src/economy.cpp
===================================================================
--- src/economy.cpp	(revision 11740)
+++ src/economy.cpp	(working copy)
@@ -1454,7 +1454,7 @@
 			if (!cp->paid_for &&
 					cp->source != last_visited &&
 					HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
-					(front_v->current_order.flags & OF_TRANSFER) == 0) {
+					(front_v->current_order.flags & (OF_TRANSFER | OF_KEEP)) == 0) {
 				/* Deliver goods to the station */
 				st->time_since_unload = 0;
 
@@ -1569,7 +1569,7 @@
 			uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
 			bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here?
 
-			if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & OF_TRANSFER)) {
+			if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.flags & (OF_TRANSFER | OF_KEEP))) {
 				/* The cargo has reached it's final destination, the packets may now be destroyed */
 				remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited);
 
Index: src/order.h
===================================================================
--- src/order.h	(revision 11740)
+++ src/order.h	(working copy)
@@ -49,6 +49,8 @@
 	/** Wait for full load of all vehicles, or of at least one cargo type, depending on patch setting
 	  * @todo make this two different flags */
 	OF_FULL_LOAD          = 0x4,
+	/** Do not unload or transfer any cargo, only take cargo */
+	OF_KEEP               = 0x10,
 
 	//Flags for depots:
 	/** The current depot-order was initiated because it was in the vehicle's order list */
@@ -72,6 +74,7 @@
 	OFB_TRANSFER          = 0,
 	OFB_UNLOAD            = 1,
 	OFB_FULL_LOAD         = 2,
+	OFB_KEEP              = 4,
 	OFB_PART_OF_ORDERS    = 1,
 	OFB_HALT_IN_DEPOT     = 2,
 	OFB_SERVICE_IF_NEEDED = 2,
Index: src/roadveh_cmd.cpp
===================================================================
--- src/roadveh_cmd.cpp	(revision 11740)
+++ src/roadveh_cmd.cpp	(working copy)
@@ -795,6 +795,32 @@
 		return;
 	}
 
+	/* If the order has the keep flag, check to see if the vehicle is full */
+	if (order->type == OT_GOTO_STATION && HasBit(order->flags, OFB_KEEP)) {
+		const Vehicle *u = v;
+		for (; u != NULL; u=u->Next()) {
+			/* The vehicle isn't full, so we can use the current order */
+			if (u->cargo_cap > u->cargo.Count())
+				break;
+		}
+
+		/* The vehicle is full, so skip orders until we get one without a keep flag */
+		if (u == NULL) {
+			VehicleOrderID first_idx = v->cur_order_index;
+
+			do {
+				if (++v->cur_order_index >= v->num_orders) v->cur_order_index=0;
+
+				order = GetVehicleOrder(v, v->cur_order_index);
+
+				/* If this order isn't a keep order, we can use it. */
+				if (order->type != OT_GOTO_STATION || !HasBit(order->flags, OFB_KEEP))
+					break;
+			/* Only loop until we hit the first one again (at most) to avoid infinite loops. */
+			} while (v->cur_order_index != first_idx);
+		}
+	}
+
 	v->current_order = *order;
 
 	switch (order->type) {
Index: src/vehicle.cpp
===================================================================
--- src/vehicle.cpp	(revision 11740)
+++ src/vehicle.cpp	(working copy)
@@ -3083,7 +3083,7 @@
 			this->current_order.dest == this->last_station_visited) {
 		/* Arriving at the ordered station.
 		 * Keep the load/unload flags, as we (obviously) still need them. */
-		this->current_order.flags &= OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER;
+		this->current_order.flags &= OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER | OF_KEEP;
 
 		/* Furthermore add the Non Stop flag to mark that this station
 		 * is the actual destination of the vehicle, which is (for example)
Index: src/aircraft_cmd.cpp
===================================================================
--- src/aircraft_cmd.cpp	(revision 11740)
+++ src/aircraft_cmd.cpp	(working copy)
@@ -1402,6 +1402,32 @@
 			order->dest  == v->current_order.dest)
 		return;
 
+	/* If the order has the keep flag, check to see if the vehicle is full */
+	if (order->type == OT_GOTO_STATION && HasBit(order->flags, OFB_KEEP)) {
+		const Vehicle *u = v;
+		for (; u != NULL; u=u->Next()) {
+			/* The vehicle isn't full, so we can use the current order */
+			if (u->cargo_cap > u->cargo.Count())
+				break;
+		}
+
+		/* The vehicle is full, so skip orders until we get one without a keep flag */
+		if (u == NULL) {
+			VehicleOrderID first_idx = v->cur_order_index;
+
+			do {
+				if (++v->cur_order_index >= v->num_orders) v->cur_order_index=0;
+
+				order = GetVehicleOrder(v, v->cur_order_index);
+
+				/* If this order isn't a keep order, we can use it. */
+				if (order->type != OT_GOTO_STATION || !HasBit(order->flags, OFB_KEEP))
+					break;
+			/* Only loop until we hit the first one again (at most) to avoid infinite loops. */
+			} while (v->cur_order_index != first_idx);
+		}
+	}
+
 	v->current_order = *order;
 
 	/* orders are changed in flight, ensure going to the right station */
