Index: binaries/data/mods/public/simulation/components/Auras.js
===================================================================
--- binaries/data/mods/public/simulation/components/Auras.js	(revision 16541)
+++ binaries/data/mods/public/simulation/components/Auras.js	(working copy)
@@ -47,6 +47,11 @@
 						"<text/>" +
 					"</element>" +
 				"</optional>" +
+				"<optional>" +
+					"<element name='OverlayIcon' a:help='Icon will be displayed on the affected units'>" +
+						"<text/>" +
+					"</element>" +
+				"</optional>" +
 				"<element name='Affects' a:help='Affected classes'>" +
 					"<text/>" +
 				"</element>" +
@@ -103,6 +108,11 @@
 	return Object.keys(this.template);
 };
 
+Auras.prototype.GetOverlayIcon = function(name)
+{
+	return this.template[name].OverlayIcon || "";
+};
+
 Auras.prototype.GetRange = function(name)
 {
 	if (!this.IsRangeAura(name))
@@ -122,6 +132,11 @@
 	return this.auras[name].modifications;
 };
 
+Auras.prototype.GetAffectedEntities = function(name)
+{
+	return this[name].targetUnits;
+};
+
 Auras.prototype.GetAffectedPlayers = function(name)
 {
 	return this.affectedPlayers[name];
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js	(revision 16550)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -26,6 +26,7 @@
 	this.timeNotificationID = 1;
 	this.timeNotifications = [];
 	this.entsRallyPointsDisplayed = [];
+	this.entsWithStatusBars = new Set();
 };
 
 /*
@@ -859,14 +860,45 @@
 	}
 };
 
+GuiInterface.prototype.GetEntsWithStatusBars = function()
+{
+	return [...this.entsWithStatusBars];
+};
+
 GuiInterface.prototype.SetStatusBars = function(player, cmd)
 {
-	for each (var ent in cmd.entities)
+	for (let ent of cmd.entities)
 	{
 		var cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
 		if (cmpStatusBars)
 			cmpStatusBars.SetEnabled(cmd.enabled);
+		if (cmd.enabled)
+			this.entsWithStatusBars.add(ent);
+		else
+			this.entsWithStatusBars.delete(ent);
+
+		var cmpAuras = Engine.QueryInterface(ent, IID_Auras);
+		if (!cmpAuras)
+			continue;
+
+		var affectedEntities = [];
+		var auraNames = cmpAuras.GetAuraNames();
+		for (let name of auraNames)
+			if (cmpAuras.GetOverlayIcon(name))
+				affectedEntities.push(...cmpAuras.GetAffectedEntities(name));
+
+		for (let affectedEnt of affectedEntities)
+		{
+			var cmpStatusBars = Engine.QueryInterface(affectedEnt, IID_StatusBars);
+			if (!cmpStatusBars)
+				continue
+			if (cmd.enabled)
+				cmpStatusBars.AddAuraSource(ent);
+			else
+				cmpStatusBars.RemoveAuraSource(ent);
+		}
 	}
+
 };
 
 GuiInterface.prototype.GetPlayerEntities = function(player)
Index: binaries/data/mods/public/simulation/components/StatusBars.js
===================================================================
--- binaries/data/mods/public/simulation/components/StatusBars.js	(revision 16541)
+++ binaries/data/mods/public/simulation/components/StatusBars.js	(working copy)
@@ -14,6 +14,7 @@
 StatusBars.prototype.Init = function()
 {
 	this.enabled = false;
+	this.auraSource = []; // entity ids of the aura sources
 };
 
 // Because this is enabled directly by the GUI and is not
@@ -37,12 +38,33 @@
 
 	this.enabled = enabled;
 
-	if (enabled)
+	if (enabled || this.auraSource.length)
 		this.RegenerateSprites();
 	else
 		this.ResetSprites();
 };
 
+StatusBars.prototype.AddAuraSource = function(ent)
+{
+	if (this.auraSource.indexOf(ent) > -1)
+		return;
+
+	this.auraSource.push(ent);
+	this.RegenerateSprites();
+};
+
+StatusBars.prototype.RemoveAuraSource = function(ent)
+{
+	var idx = this.auraSource.indexOf(ent);
+	if (idx == -1)
+		return;
+	this.auraSource.splice(idx, 1);
+	if (this.enabled || this.auraSource.length)
+		this.RegenerateSprites();
+	else
+		this.ResetSprites();
+};
+
 StatusBars.prototype.OnHealthChanged = function(msg)
 {
 	if (this.enabled)
@@ -61,6 +83,36 @@
 		this.RegenerateSprites();
 };
 
+StatusBars.prototype.OnValueModification = function(msg)
+{
+	// rebuild the aura sources list for this ent
+	var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
+	this.auraSource = [];
+	var entsWithStatusBars = cmpGuiInterface.GetEntsWithStatusBars();
+	for (let ent of entsWithStatusBars)
+	{
+		if (this.auraSource.indexOf(ent) != -1)
+			continue;
+
+		let cmpAuras = Engine.QueryInterface(ent, IID_Auras);
+		if (!cmpAuras)
+			continue;
+
+		let auraNames = cmpAuras.GetAuraNames();
+		let affected = false;
+		for (let name of auraNames)
+		{
+			if (!cmpAuras.GetOverlayIcon(name))
+				continue;
+			if (cmpAuras.GetAffectedEntities(name).indexOf(this.entity) != -1)
+				affected = true;
+		}
+		if (affected)
+			this.auraSource.push(ent);
+	}
+	this.RegenerateSprites();
+};
+
 StatusBars.prototype.ResetSprites = function()
 {
 	var cmpOverlayRenderer = Engine.QueryInterface(this.entity, IID_OverlayRenderer);
@@ -82,44 +134,76 @@
 	// Billboard offset of next bar
 	var yoffset = 0;
 
+	var iconList = []
+	for (let ent of this.auraSource)
+	{
+		let cmpAuras = Engine.QueryInterface(ent, IID_Auras);
+		if (!cmpAuras) // probably the ent just died
+			return;
+		let auraNames = cmpAuras.GetAuraNames();
+		for (let name of auraNames)
+		{
+			if (cmpAuras.GetAffectedEntities(name).indexOf(this.entity) == -1)
+				continue;
+			let icon = cmpAuras.GetOverlayIcon(name);
+			if (icon && iconList.indexOf(icon) == -1)
+				iconList.push(icon);
+		}
+	}
+
+	var iconSize = width/2;
+	for (let icon of iconList)
+	{
+		cmpOverlayRenderer.AddSprite(
+			icon,
+			{ "x": -iconSize/2, "y": yoffset - iconSize/2 },
+			{ "x": iconSize/2, "y": yoffset + iconSize/2 },
+			offset
+		);
+		yoffset += iconSize * 1.2;
+	}
+
+	if (iconList.length)
+		yoffset -= iconSize * 0.6;
+
 	var AddBar = function(type, amount)
 	{
 		cmpOverlayRenderer.AddSprite(
 			"art/textures/ui/session/icons/"+type+"_bg.png",
-			{ "x": -width/2, "y": -height/2 + yoffset },
-			{ "x": width/2, "y": height/2 + yoffset },
+			{ "x": -width/2, "y": yoffset - height/2},
+			{ "x": width/2, "y": yoffset + height/2 },
 			offset
 		);
 
 		cmpOverlayRenderer.AddSprite(
 			"art/textures/ui/session/icons/"+type+"_fg.png",
-			{ "x": -width/2, "y": -height/2 + yoffset },
-			{ "x": width*(amount - 0.5), "y": height/2 + yoffset },
+			{ "x": -width/2, "y": yoffset - height/2 },
+			{ "x": width*(amount - 0.5), "y": yoffset + height/2 },
 			offset
 		);
 
-		yoffset -= height * 1.2;
+		yoffset += height * 1.2;
 	};
 
-	var cmpMirage = Engine.QueryInterface(this.entity, IID_Mirage);
+	if (this.enabled)
+	{
+		var cmpMirage = Engine.QueryInterface(this.entity, IID_Mirage);
+		var cmpPack = Engine.QueryInterface(this.entity, IID_Pack);
+		if (cmpPack && cmpPack.IsPacking())
+			AddBar("pack", cmpPack.GetProgress());
 
-	var cmpPack = Engine.QueryInterface(this.entity, IID_Pack);
-	if (cmpPack && cmpPack.IsPacking())
-		AddBar("pack", cmpPack.GetProgress());
+		var cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
+		if (cmpHealth && cmpHealth.GetHitpoints() > 0)
+			AddBar("health", cmpHealth.GetHitpoints() / cmpHealth.GetMaxHitpoints());
+		else if (cmpMirage && cmpMirage.Health())
+			AddBar("health", cmpMirage.GetHitpoints() / cmpMirage.GetMaxHitpoints());
 
-	var cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
-	if (cmpHealth && cmpHealth.GetHitpoints() > 0)
-		AddBar("health", cmpHealth.GetHitpoints() / cmpHealth.GetMaxHitpoints());
-	else if (cmpMirage && cmpMirage.Health())
-		AddBar("health", cmpMirage.GetHitpoints() / cmpMirage.GetMaxHitpoints());
-
-	var cmpResourceSupply = Engine.QueryInterface(this.entity, IID_ResourceSupply);
-	if (cmpResourceSupply)
-		AddBar("supply", cmpResourceSupply.IsInfinite() ? 1 : cmpResourceSupply.GetCurrentAmount() / cmpResourceSupply.GetMaxAmount());
-	else if (cmpMirage && cmpMirage.ResourceSupply())
-		AddBar("supply", cmpMirage.IsInfinite() ? 1 : cmpMirage.GetAmount() / cmpMirage.GetMaxAmount());
-
-	/*
+		var cmpResourceSupply = Engine.QueryInterface(this.entity, IID_ResourceSupply);
+		if (cmpResourceSupply)
+			AddBar("supply", cmpResourceSupply.IsInfinite() ? 1 : cmpResourceSupply.GetCurrentAmount() / cmpResourceSupply.GetMaxAmount());
+		else if (cmpMirage && cmpMirage.ResourceSupply())
+			AddBar("supply", cmpMirage.IsInfinite() ? 1 : cmpMirage.GetAmount() / cmpMirage.GetMaxAmount());
+	}	/*
 	// Rank icon disabled for now - see discussion around
 	// http://www.wildfiregames.com/forum/index.php?s=&showtopic=13608&view=findpost&p=212154
 
Index: binaries/data/mods/public/simulation/templates/template_structure_civic_temple.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_structure_civic_temple.xml	(revision 16541)
+++ binaries/data/mods/public/simulation/templates/template_structure_civic_temple.xml	(working copy)
@@ -10,6 +10,7 @@
       </Modifications>
       <AuraName>Healing Aura</AuraName>
       <AuraDescription>Heals nearby units at 1 HP per second.</AuraDescription>
+      <OverlayIcon>art/textures/ui/session/auras/heal.png</OverlayIcon>
     </heal>
   </Auras>
   <BuildRestrictions>
