Index: binaries/data/mods/public/gui/session/messages.js
===================================================================
--- binaries/data/mods/public/gui/session/messages.js	(revision 16572)
+++ binaries/data/mods/public/gui/session/messages.js	(working copy)
@@ -119,7 +119,8 @@
 		addChatMessage({
 			"type": "attack",
 			"player": player,
-			"attacker": notification.attacker
+			"attacker": notification.attacker,
+			"targetIsDomesticAnimal": notification.targetIsDomesticAnimal
 		});
 	},
 	"dialog": function(notification, player)
@@ -509,7 +510,13 @@
 			return;
 
 		[username, playerColor] = getUsernameAndColor(msg.attacker);
-		formatted = sprintf(translate("You have been attacked by %(attacker)s!"), { attacker: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
+		// Since livestock can be attacked/gathered by allied players,
+		// we display a more specific notification in this case to not confuse the player
+		if (msg.targetIsDomesticAnimal)
+			var message = translate("Your livestock have been attacked by %(attacker)s!");
+		else
+			var message = translate("You have been attacked by %(attacker)s!");
+		formatted = sprintf(message, { attacker: "[color=\"" + playerColor + "\"]" + username + "[/color]" });
 		break;
 	case "message":
 		// May have been hidden by the 'team' command.
Index: binaries/data/mods/public/simulation/components/AttackDetection.js
===================================================================
--- binaries/data/mods/public/simulation/components/AttackDetection.js	(revision 16572)
+++ binaries/data/mods/public/simulation/components/AttackDetection.js	(working copy)
@@ -53,13 +53,29 @@
 	// Don't register attacks dealt by myself
 	if (cmpAttackerOwnership.GetOwner() == cmpPlayer.GetPlayerID())
 		return;
+		
+	// Since livestock can be attacked/gathered by allied players
+	// and generally not so valuable as other units/buildings,
+	// we have a lower priority notification for it, which can be
+	// later overriden by a regular one.
+	var cmpTargetIdentity = Engine.QueryInterface(target, IID_Identity); 
+	var targetIsDomesticAnimal = cmpTargetIdentity.HasClass("Animal") && cmpTargetIdentity.HasClass("Domestic"); 
 
 	var cmpPosition = Engine.QueryInterface(target, IID_Position);
 	if (!cmpPosition || !cmpPosition.IsInWorld())
 		return;
 	var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
-	var event = {target: target, position: cmpPosition.GetPosition(), time: cmpTimer.GetTime()};
+	var event = {
+		target: target,
+		position: cmpPosition.GetPosition(),
+		time: cmpTimer.GetTime(),
+		targetIsDomesticAnimal: targetIsDomesticAnimal
+	};
 
+	// If we already have a low priority livestock event in suppressed list,
+	// and now a more important target is attacked, we want to upgrade the
+	// suppressed event and send the new notification
+	var isPriorityIncreased = false;
 	for (var i = 0; i < this.suppressedList.length; i++)
 	{
 		var element = this.suppressedList[i];
@@ -69,16 +85,30 @@
 		var dist = SquaredDistance(element.position, event.position);
 		if (dist < this.suppressionRangeSquared)
 		{
+			isPriorityIncreased = element.targetIsDomesticAnimal && !targetIsDomesticAnimal;
+
 			if (dist < this.suppressionTransferRangeSquared)
 				element = event;
+
+			if (isPriorityIncreased)
+				break;
+
 			return;
 		}
 	}
 
-	this.AddSuppression(event);
+	// If priority has increased for an existing event, then we already have it
+	// in the suppression list
+	if (!isPriorityIncreased)
+		this.AddSuppression(event);
 	Engine.PostMessage(this.entity, MT_AttackDetected, { "player": cmpPlayer.GetPlayerID(), "event": event });
 	var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
-	cmpGuiInterface.PushNotification({"type": "attack", "players": [cmpPlayer.GetPlayerID()], "attacker": cmpAttackerOwnership.GetOwner() });
+	cmpGuiInterface.PushNotification({
+		"type": "attack",
+		"players": [cmpPlayer.GetPlayerID()],
+		"attacker": cmpAttackerOwnership.GetOwner(),
+		"targetIsDomesticAnimal": targetIsDomesticAnimal
+	});
 	PlaySound("attacked", target);
 };
 
