Index: binaries/data/mods/public/gui/session/session.xml
===================================================================
--- binaries/data/mods/public/gui/session/session.xml	(revision 8999)
+++ 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,27 @@
 	</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="sessionToolTipBold"
+			tooltip="Find idle worker"
+		>
+			<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 8999)
+++ 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 8999)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -473,6 +473,63 @@
 	cmpRangeManager.SetDebugOverlay(enabled);
 };
 
+var _prevWorker = -1;
+
+function isFreeWorker(ent)
+{
+	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)
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+GuiInterface.prototype.FindFreeWorker = function(player)
+{
+	var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
+	var playerEntities = rangeMan.GetEntitiesByPlayer(player);
+
+	var worker = null;
+
+	for each (var ent in playerEntities)
+	{
+		if ((worker == null || ent > _prevWorker) && isFreeWorker(ent))
+		{
+			worker = ent;
+
+			if (ent > _prevWorker)
+			{
+				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 +552,9 @@
 	"SetPathfinderDebugOverlay": 1,
 	"SetObstructionDebugOverlay": 1,
 	"SetMotionDebugOverlay": 1,
-	"SetRangeDebugOverlay": 1
+	"SetRangeDebugOverlay": 1,
+
+	"FindFreeWorker": 1
 };
 
 GuiInterface.prototype.ScriptCall = function(player, name, args)
