Index: binaries/data/mods/public/gui/session/session.xml
===================================================================
--- binaries/data/mods/public/gui/session/session.xml	(revision 8996)
+++ binaries/data/mods/public/gui/session/session.xml	(working copy)
@@ -15,6 +15,7 @@
 	<script file="gui/session/unit_commands.js"/>
 	<script file="gui/session/messages.js"/>
 	<script file="gui/session/utility_functions.js"/>
+	<script file="gui/session/freeworker.js"/>
 
 	<object name="sn" hotkey="session.gui.toggle">
 		<action on="Tick">
@@ -387,6 +388,26 @@
 	</object> <!-- END OF TOP PANEL -->
 
 	<!-- ================================  ================================ -->
+	<!-- Free Worker Button -->
+	<!-- ================================  ================================ -->
+	<object name="freeWorkerPanel"
+		size="50%-544 100%-32 50%-512 100%"
+		type="image"
+		sprite="mapPanel"
+		hidden="false"
+		ghost="false"
+	>
+		<object type="button"
+			name="freeWorkerButton"
+			size="0 0 100% 100%"
+			tooltip_style="sessionToolTip"
+		>
+			<object size="0 0 100% 100%" type="image" sprite="freeWorker" name="freeWorkerButtonImage" ghost="true" />
+			<action on="Press">findFreeWorker();</action>
+		</object>
+	</object>
+
+	<!-- ================================  ================================ -->
 	<!-- START of BOTTOM PANEL -->
 	<!-- ================================  ================================ -->
 	<object size="50%-512 100%-180 50%+512 100%">
Index: binaries/data/mods/public/gui/session/freeworker.js
===================================================================
--- binaries/data/mods/public/gui/session/freeworker.js	(revision 0)
+++ binaries/data/mods/public/gui/session/freeworker.js	(revision 0)
@@ -0,0 +1,13 @@
+function findFreeWorker()
+{
+	var ent, pos;
+
+	[ent, pos] = Engine.GuiInterfaceCall("FindFreeWorker");
+
+	if (ent)
+	{
+		g_Selection.reset()
+		g_Selection.addList([ent]);
+		Engine.SetCameraTarget(pos.x, pos.y, pos.z);
+	}
+}
\ No newline at end of file
Index: binaries/data/mods/public/gui/session/sprites.xml
===================================================================
--- binaries/data/mods/public/gui/session/sprites.xml	(revision 8996)
+++ binaries/data/mods/public/gui/session/sprites.xml	(working copy)
@@ -9,6 +9,14 @@
 		/>
 	</sprite>
 
+	<sprite name="freeWorker">
+		<image
+			texture="session/icons/single/repair.png"
+			cell_size="32 32"
+			size="0 0 100% 100%"
+		/>
+	</sprite>
+
 	<!-- ================================  ================================ -->
 	<!-- Unit Command Icons -->
 	<!-- ================================  ================================ -->
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js	(revision 8996)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -473,6 +473,58 @@
 	cmpRangeManager.SetDebugOverlay(enabled);
 };
 
+var _prevWorker = undefined
+
+GuiInterface.prototype.FindFreeWorker = function(player)
+{
+	var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
+	var nearby = rangeMan.GetEntitiesByPlayer(player); //	var nearby = rangeMan.ExecuteQuery(this.entity, 0, -1, [player], IID_UnitAI);
+
+	var worker = null;
+
+	for each (var ent in nearby)
+	{
+		var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
+		var cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
+
+		if (cmpIdentity && cmpUnitAI && cmpUnitAI.IsIdle())
+		{
+			var classes = cmpIdentity.GetClassesList();
+
+			if (classes.indexOf("Worker") != -1)
+			{
+				if (worker == null)
+				{
+					worker = ent;
+				}
+
+				if (ent > _prevWorker)
+				{
+					worker = ent;
+					break;
+				}
+			}
+		}
+	}
+
+	if (worker == null)
+	{
+		return [null, null]
+	}
+
+	var cmpPosition = Engine.QueryInterface(worker, IID_Position);
+
+	if (cmpPosition)
+	{
+		_prevWorker = worker;
+		return [worker, cmpPosition.GetPosition()];
+	}
+	else
+	{
+		return [null, null];
+	}
+};
+
 // List the GuiInterface functions that can be safely called by GUI scripts.
 // (GUI scripts are non-deterministic and untrusted, so these functions must be
 // appropriately careful. They are called with a first argument "player", which is
@@ -495,7 +547,9 @@
 	"SetPathfinderDebugOverlay": 1,
 	"SetObstructionDebugOverlay": 1,
 	"SetMotionDebugOverlay": 1,
-	"SetRangeDebugOverlay": 1
+	"SetRangeDebugOverlay": 1,
+
+	"FindFreeWorker": 1
 };
 
 GuiInterface.prototype.ScriptCall = function(player, name, args)
Index: binaries/data/mods/public/simulation/components/Identity.js
===================================================================
--- binaries/data/mods/public/simulation/components/Identity.js	(revision 8996)
+++ binaries/data/mods/public/simulation/components/Identity.js	(working copy)
@@ -77,6 +77,7 @@
 						"<value>Animal</value>" +
 						"<value>Organic</value>" +
 						"<value>Structure</value>" +
+						"<value>Worker</value>" +
 						"<value>Civic</value>" +
 						"<value>CivCentre</value>" +
 						"<value>Economic</value>" +
Index: binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml	(revision 8996)
+++ binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml	(working copy)
@@ -4,6 +4,7 @@
     <GenericName>Female Citizen</GenericName>
     <History>Women in the ancient world took on a variety of roles - from leadership (Celts) to servant (Greeks). Women are hard workers, the economic backbone of any civilisation. In history, it was typical when all the males (capable of fighting) were killed for the females, children, and elderly to be sold as slaves.</History>
     <Tooltip>Gather resources, build civic structures, and inspire nearby males to work faster.</Tooltip>
+    <Classes>Worker</Classes>
   </Identity>
   <Cost>
     <Resources>
