Index: binaries/data/mods/public/gui/session/input.js
===================================================================
--- binaries/data/mods/public/gui/session/input.js	(revision 13973)
+++ binaries/data/mods/public/gui/session/input.js	(working copy)
@@ -1869,6 +1869,9 @@
 					Engine.CameraMoveTo(focusTarget.x, focusTarget.z);
 				
 				break;
+			case "back-to-work":
+				backToWork();
+				break;
 			default:
 				break;
 			}
@@ -2131,6 +2134,20 @@
 	Engine.PostNetworkCommand({"type": "unload-all", "garrisonHolders": garrisonHolders});
 }
 
+function backToWork()
+{
+	// Filter out all entities that can't go back to work.
+	var workers = g_Selection.toList().filter(function(e) {
+		var state = GetEntityState(e);
+		if (state && state.unitAI && state.unitAI.lastWorkOrder)
+			return true;
+		return false;
+	});
+	
+	Engine.PostNetworkCommand({"type": "back-to-work", "workers": workers});
+	
+}
+
 function clearSelection()
 {
 	if(inputState==INPUT_BUILDING_PLACEMENT || inputState==INPUT_BUILDING_WALL_PATHING)
Index: binaries/data/mods/public/gui/session/utility_functions.js
===================================================================
--- binaries/data/mods/public/gui/session/utility_functions.js	(revision 13973)
+++ binaries/data/mods/public/gui/session/utility_functions.js	(working copy)
@@ -293,6 +293,15 @@
 		    "icon": "focus-rally.png"
 		});
 	}
+	
+	if (entState.unitAI && entState.unitAI.lastWorkOrder)
+	{
+		commands.push({
+		    "name": "back-to-work",
+		    "tooltip": "Back to Work",
+		    "icon": "production.png"
+		});
+	}
 
 	return commands;
 }
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js	(revision 13973)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -348,6 +348,7 @@
 		ret.unitAI = {
 			"state": cmpUnitAI.GetCurrentState(),
 			"orders": cmpUnitAI.GetOrders(),
+			"lastWorkOrder": cmpUnitAI.GetLastWorkOrder(),
 		};
 		// Add some information needed for ungarrisoning
 		if (cmpUnitAI.isGarrisoned && ret.player !== undefined)
Index: binaries/data/mods/public/simulation/components/Promotion.js
===================================================================
--- binaries/data/mods/public/simulation/components/Promotion.js	(revision 13973)
+++ binaries/data/mods/public/simulation/components/Promotion.js	(working copy)
@@ -78,6 +78,8 @@
 	cmpPromotedUnitAI.Cheer();
 	var orders = cmpCurrentUnitAI.GetOrders();
 	cmpPromotedUnitAI.AddOrders(orders);
+	var lastWorkOrder = cmpCurrentUnitAI.GetLastWorkOrder();
+	cmpPromotedUnitAI.SetLastWorkOrder(lastWorkOrder);
 
 	Engine.BroadcastMessage(MT_EntityRenamed, { entity: this.entity, newentity: promotedUnitEntity });
 
Index: binaries/data/mods/public/simulation/components/UnitAI.js
===================================================================
--- binaries/data/mods/public/simulation/components/UnitAI.js	(revision 13973)
+++ binaries/data/mods/public/simulation/components/UnitAI.js	(working copy)
@@ -2525,6 +2525,9 @@
 	this.isIdle = false;
 	this.lastFormationName = "";
 	this.finishedOrder = false; // used to find if all formation members finished the order
+	
+	// To go back to work later
+	this.lastWorkOrder = undefined;
 
 	// For preventing increased action rate due to Stop orders or target death.
 	this.lastAttacked = undefined;
@@ -2801,6 +2804,17 @@
 	Engine.PostMessage(this.entity, MT_UnitAIStateChanged, { "to": state });
 };
 
+UnitAI.prototype.BackToWork = function()
+{
+	if(this.lastWorkOrder)
+	{
+		this.ReplaceOrder(this.lastWorkOrder.type, this.lastWorkOrder.data);
+		return true;
+	}
+	else
+		return false;
+};
+
 /**
  * Call when the current order has been completed (or failed).
  * Removes the current order from the queue, and processes the
@@ -2817,8 +2831,17 @@
 		error("FinishOrder called for entity " + this.entity + " (" + template + ") when order queue is empty\n" + stack);
 	}
 
-	this.orderQueue.shift();
+	// Remove the order from the queue, then forget it if it was a work to avoid trying to go back to it later.
+	var finishedOrder = this.orderQueue.shift();
+	if(finishedOrder.type == "Gather" || finishedOrder.type == "Trade" || finishedOrder.type == "Repair")
+		this.lastWorkOrder = undefined;
+	
 	this.order = this.orderQueue[0];
+	// If the worker was returning a resource, we shall 
+	//	-> (if the worker is gathering) keep remembering the "Gather" order which is this.order
+	//	-> (if the worker was directly ordered to return a resource) forget the "ReturnResource" order which is finished
+	if(finishedOrder.type == "ReturnResource" && (!this.order || this.order.type != "Gather"))
+		this.lastWorkOrder = undefined;
 
 	if (this.orderQueue.length)
 	{
@@ -2869,6 +2892,9 @@
 {
 	var order = { "type": type, "data": data };
 	this.orderQueue.push(order);
+	
+	if(type == "Gather" || type == "Trade" || type == "Repair" || type == "ReturnResource")
+		this.lastWorkOrder = order;
 
 	// If we didn't already have an order, then process this new one
 	if (this.orderQueue.length == 1)
@@ -2972,6 +2998,16 @@
 	return orders;
 };
 
+UnitAI.prototype.GetLastWorkOrder = function()
+{
+	return this.lastWorkOrder;
+};
+
+UnitAI.prototype.SetLastWorkOrder = function(order)
+{
+	this.lastWorkOrder = order;
+};
+
 UnitAI.prototype.TimerHandler = function(data, lateness)
 {
 	// Reset the timer
Index: binaries/data/mods/public/simulation/helpers/Commands.js
===================================================================
--- binaries/data/mods/public/simulation/helpers/Commands.js	(revision 13973)
+++ binaries/data/mods/public/simulation/helpers/Commands.js	(working copy)
@@ -390,6 +390,16 @@
 				notifyUnloadFailure(player, garrisonHolder)
 		}
 		break;
+		
+	case "back-to-work":
+		var entities = FilterEntityList(cmd.workers, player, controlAllUnits);
+		for each (var worker in entities)
+		{
+			var cmpUnitAI = Engine.QueryInterface(worker, IID_UnitAI);
+			if (!cmpUnitAI || !cmpUnitAI.BackToWork())
+				notifyBackToWorkFailure(player, worker)
+		}
+		break;
 
 	case "formation":
 		GetFormationUnitAIs(entities, player, cmd.name).forEach(function(cmpUnitAI) {
@@ -518,6 +528,17 @@
 }
 
 /**
+ * Sends a GUI notification about worker(s) that failed to go back to work.
+ */
+function notifyBackToWorkFailure(player, worker)
+{
+	var cmpPlayer = QueryPlayerIDInterface(player, IID_Player);
+	var notification = {"player": cmpPlayer.GetPlayerID(), "message": "Some unit(s) can't go back to work" };
+	var cmpGUIInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
+	cmpGUIInterface.PushNotification(notification);
+}
+
+/**
  * Get some information about the formations used by entities.
  * The entities must have a UnitAI component.
  */
