Index: binaries/data/mods/public/gui/common/tooltips.js
===================================================================
--- binaries/data/mods/public/gui/common/tooltips.js	(revision 17501)
+++ binaries/data/mods/public/gui/common/tooltips.js	(working copy)
@@ -157,7 +157,7 @@
 	else
 		var rateLabel = txtFormats.header[0] + translate("Rate:") + txtFormats.header[1];
 
-	for (var type in template.attack)
+	for (let type in template.attack)
 	{
 		if (type == "Slaughter")
 			continue; // Slaughter is not a real attack, so do not show it.
@@ -225,6 +225,21 @@
 	return attacks.join("\n");
 }
 
+function getRepairRatioTooltip(ratio)
+{
+	var unit = sprintf(translate("%(health)s / %(second)s / %(worker)s"), {
+				health: txtFormats.unit[0] + translate("Health") + txtFormats.unit[1],
+				second: txtFormats.unit[0] + translate("second") + txtFormats.unit[1],
+				worker: txtFormats.unit[0] + translate("worker") + txtFormats.unit[1]
+			});
+
+	return "\n" + sprintf(translate("%(repairRateLabel)s %(detail)s %(unit)s"), {
+				repairRateLabel: txtFormats.header[0] + translate("Repair Rate:") + txtFormats.header[1],
+				detail: ratio,
+				unit: unit
+			});
+}
+
 /**
  * Translates a cost component identifier as they are used internally
  * (e.g. "population", "food", etc.) to proper display names.
Index: binaries/data/mods/public/gui/session/selection_details.js
===================================================================
--- binaries/data/mods/public/gui/session/selection_details.js	(revision 17501)
+++ binaries/data/mods/public/gui/session/selection_details.js	(working copy)
@@ -255,11 +255,15 @@
 	var armorString = getArmorTooltip(entState.armour);
 
 	// Attack and Armor
-	if ("attack" in entState && entState.attack)
+	if (entState.attack)
 		Engine.GetGUIObjectByName("attackAndArmorStats").tooltip = getAttackTooltip(entState) + "\n" + armorString;
 	else
 		Engine.GetGUIObjectByName("attackAndArmorStats").tooltip = armorString;
 
+	// Repair Rate
+	if (entState.repairRatio)
+		Engine.GetGUIObjectByName("attackAndArmorStats").tooltip += getRepairRatioTooltip(entState.repairRatio);
+
 	// Icon Tooltip
 	var iconTooltip = "";
 
Index: binaries/data/mods/public/gui/session/unit_actions.js
===================================================================
--- binaries/data/mods/public/gui/session/unit_actions.js	(revision 17501)
+++ binaries/data/mods/public/gui/session/unit_actions.js	(working copy)
@@ -677,7 +677,7 @@
 					count += state.garrisonHolder.entities.length;
 			}
 			return {
-				"tooltip": translate("Unload All"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Unload All") + "[/font]\n" + translate("Release all garrisoned units"),
 				"icon": "garrison-out.png",
 				"count": count,
 			};
@@ -708,7 +708,7 @@
 					
 
 			return {
-				"tooltip": translate("Delete"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Delete") + "[/font]\n" + translate("Destroy everything selected"),
 				"icon": "kill_small.png"
 			};
 		},
@@ -734,7 +734,7 @@
 			if (!entState.unitAI)
 				return false;
 			return {
-				"tooltip": translate("Stop"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Stop") + "[/font]\n" + translate("Cancel all existing orders"),
 				"icon": "stop.png"
 			};
 		},
@@ -752,7 +752,7 @@
 			if (!entState.unitAI || entState.turretParent)
 				return false;
 			return {
-				"tooltip": translate("Garrison"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Garrison") + "[/font]\n" + translate("Lock selected units inside and shoot arrows from warships and defensive buildings"),
 				"icon": "garrison.png"
 			};
 		},
@@ -773,7 +773,7 @@
 			if (!p.garrisonHolder || p.garrisonHolder.entities.indexOf(entState.id) == -1)
 				return false;
 			return {
-				"tooltip": translate("Unload"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Unload") + "[/font]\n" + translate("Release one unit"),
 				"icon": "garrison-out.png"
 			};
 		},
@@ -789,7 +789,7 @@
 			if (!entState.builder)
 				return false;
 			return {
-				"tooltip": translate("Repair"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Repair") + "[/font]\n" + translate("Restore health, rate depends on structure"),
 				"icon": "repair.png"
 			};
 		},
@@ -806,7 +806,7 @@
 			if (!entState.rallyPoint)
 				return false;
 			return {
-				"tooltip": translate("Focus on Rally Point"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Focus on Rally Point") + "[/font]\n" + translate("Move camera to entity"),
 				"icon": "focus-rally.png"
 			};
 		},
@@ -829,7 +829,7 @@
 			if (!entState.unitAI || !entState.unitAI.hasWorkOrders)
 				return false;
 			return {
-				"tooltip": translate("Back to Work"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Back to Work") + "[/font]\n" + translate("Order unit the last given task"),
 				"icon": "production.png"
 			};
 		},
@@ -845,7 +845,7 @@
 			if (!entState.unitAI || !entState.unitAI.canGuard || entState.unitAI.isGuarding)
 				return false;
 			return {
-				"tooltip": translate("Guard"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Guard") + "[/font]\n" + translate("Follow another entity, repair/heal it and protect when attacked"),
 				"icon": "add-guard.png"
 			};
 		},
@@ -862,7 +862,7 @@
 			if (!entState.unitAI || !entState.unitAI.isGuarding)
 				return false;
 			return {
-				"tooltip": translate("Remove guard"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Remove guard") +"[/font]\n" + translate("Stop guarding"),
 				"icon": "remove-guard.png"
 			};
 		},
@@ -913,7 +913,7 @@
 				}
 			}
 			return {
-				"tooltip": translate("Unload All"),
+				"tooltip": '[font="sans-bold-16"]' + translate("Unload All") + "[/font]\n" + translate("Release all garrisoned units"),
 				"icon": "garrison-out.png",
 				"count": count,
 			};
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js	(revision 17501)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -342,15 +342,11 @@
     
 	var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
 	if (cmpOwnership)
-	{
 		ret.player = cmpOwnership.GetOwner();
-	}
 
 	var cmpRallyPoint = Engine.QueryInterface(ent, IID_RallyPoint);
 	if (cmpRallyPoint)
-	{
 		ret.rallyPoint = {'position': cmpRallyPoint.GetPositions()[0]}; // undefined or {x,z} object
-	}
 
 	var cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);
 	if (cmpGarrisonHolder)
@@ -432,6 +428,7 @@
 		"obstruction": null,
 		"turretParent":null,
 		"promotion": null,
+		"repairTime": null,
 		"resourceDropsite": null,
 		"resourceGatherRates": null,
 		"resourceSupply": null,
@@ -488,15 +485,11 @@
 
 	var cmpArmour = Engine.QueryInterface(ent, IID_DamageReceiver);
 	if (cmpArmour)
-	{
 		ret.armour = cmpArmour.GetArmourStrengths();
-	}
 
 	var cmpAuras = Engine.QueryInterface(ent, IID_Auras);
 	if (cmpAuras)
-	{
 		ret.auras = cmpAuras.GetDescriptions();
-	}
 
 	var cmpBuildingAI = Engine.QueryInterface(ent, IID_BuildingAI);
 	if (cmpBuildingAI)
@@ -522,6 +515,10 @@
 	if (cmpPosition && cmpPosition.GetTurretParent() != INVALID_ENTITY)
 		ret.turretParent = cmpPosition.GetTurretParent();
 
+	var cmpRepairable = Engine.QueryInterface(ent, IID_Repairable);
+		if (cmpRepairable)
+			ret.repairRatio = cmpRepairable.GetRepairRatio();
+
 	var cmpResourceSupply = QueryMiragedInterface(ent, IID_ResourceSupply);
 	if (cmpResourceSupply)
 	{
@@ -538,9 +535,7 @@
 
 	var cmpResourceGatherer = Engine.QueryInterface(ent, IID_ResourceGatherer);
 	if (cmpResourceGatherer)
-	{
 		ret.resourceGatherRates = cmpResourceGatherer.GetGatherRates();
-	}
 	
 	var cmpResourceDropsite = Engine.QueryInterface(ent, IID_ResourceDropsite);
 	if (cmpResourceDropsite)
Index: binaries/data/mods/public/simulation/components/Repairable.js
===================================================================
--- binaries/data/mods/public/simulation/components/Repairable.js	(revision 17501)
+++ binaries/data/mods/public/simulation/components/Repairable.js	(working copy)
@@ -74,4 +74,13 @@
 		Engine.PostMessage(this.entity, MT_ConstructionFinished, { "entity": this.entity, "newentity": this.entity });
 };
 
+Repairable.prototype.GetRepairRatio = function()
+{
+	let cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
+	let cmpCost = Engine.QueryInterface(this.entity, IID_Cost);
+	let repairTime = this.repairTimeRatio * cmpCost.GetBuildTime();
+	let repairRatio = (cmpHealth.GetMaxHitpoints() / repairTime);
+	return (Math.round(repairRatio * 10 ) / 10);
+};
+
 Engine.RegisterComponentType(IID_Repairable, "Repairable", Repairable);
Index: binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js	(revision 17501)
+++ binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js	(working copy)
@@ -510,6 +510,7 @@
 	obstruction: null,
 	turretParent: null,
 	promotion: null,
+	repairTime: null,
 	resourceDropsite: null,
 	resourceGatherRates: null,
 	resourceSupply: null,
