diff --git a/binaries/data/mods/public/gui/session/unit_actions.js b/binaries/data/mods/public/gui/session/unit_actions.js
index 45cb732..21ea868 100644
--- a/binaries/data/mods/public/gui/session/unit_actions.js
+++ b/binaries/data/mods/public/gui/session/unit_actions.js
@@ -367,6 +367,8 @@ var unitActions =
 		{
 			if (!hasClass(entState, "Unit") || !targetState.garrisonHolder)
 				return false;
+            if (!entState.unitAI || !entState.unitAI.canGarrison)
+                return false;
 			if (!playerCheck(entState, targetState, ["Player", "Ally"]))
 				return false;
 			var tooltip = sprintf(translate("Current garrison: %(garrisoned)s/%(capacity)s"), {
@@ -749,7 +751,7 @@ var g_EntityCommands =
 	 "garrison": {
 		"getInfo": function(entState)
 		{
-			if (!entState.unitAI || entState.turretParent)
+			if (!entState.unitAI || !entState.unitAI.canGarrison || entState.turretParent)
 				return false;
 			return {
 				"tooltip": translate("Garrison"),
diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js
index d55ffae..55eefa2 100644
--- a/binaries/data/mods/public/simulation/components/GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/GuiInterface.js
@@ -351,6 +351,7 @@ GuiInterface.prototype.GetEntityState = function(player, ent)
 			"orders": cmpUnitAI.GetOrders(),
 			"hasWorkOrders": cmpUnitAI.HasWorkOrders(),
 			"canGuard": cmpUnitAI.CanGuard(),
+            "canGarrison": cmpUnitAI.IsGarrisonable(),
 			"isGuarding": cmpUnitAI.IsGuardOf(),
 			"possibleStances": cmpUnitAI.GetPossibleStances(),
 			"isIdle":cmpUnitAI.IsIdle(),
diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js
index 5d88429..5c4686e 100644
--- a/binaries/data/mods/public/simulation/components/UnitAI.js
+++ b/binaries/data/mods/public/simulation/components/UnitAI.js
@@ -24,6 +24,9 @@ UnitAI.prototype.Schema =
 	"<element name='CanGuard'>" +
 		"<data type='boolean'/>" +
 	"</element>" +
+	"<element name='CanGarrison'>" +
+		"<data type='boolean'/>" +
+	"</element>" +
 	"<optional>" +
 		"<interleave>" +
 			"<element name='NaturalBehaviour' a:help='Behaviour of the unit in the absence of player commands (intended for animals)'>" +
@@ -5625,27 +5628,29 @@ UnitAI.prototype.CanAttack = function(target, forceResponse)
 	return false;
 };
 
+UnitAI.prototype.IsGarrisonable = function() {
+    return (this.template.CanGarrison == "true");
+}
+
 UnitAI.prototype.CanGarrison = function(target)
 {
 	// Formation controllers should always respond to commands
 	// (then the individual units can make up their own minds)
 	if (this.IsFormationController())
 		return true;
-
-	var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder);
-	if (!cmpGarrisonHolder)
-		return false;
-
-	// Verify that the target is owned by this entity's player or a mutual ally of this player
-	var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
-	if (!cmpOwnership || !(IsOwnedByPlayer(cmpOwnership.GetOwner(), target) || IsOwnedByMutualAllyOfPlayer(cmpOwnership.GetOwner(), target)))
-		return false;
-
-	// Don't let animals garrison for now
-	// (If we want to support that, we'll need to change Order.Garrison so it
-	// doesn't move the animal into an INVIDIDUAL.* state)
-	if (this.IsAnimal())
-		return false;
+    
+    // Check if the unit is able to Garrison based on their template
+    if (!this.isGarrisonable())
+        return false;
+
+    var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder);
+    if (!cmpGarrisonHolder)
+        return false;
+
+    // Verify that the target is owned by this entity's player or a mutual ally of this player
+    var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
+    if (!cmpOwnership || !(IsOwnedByPlayer(cmpOwnership.GetOwner(), target) || IsOwnedByMutualAllyOfPlayer(cmpOwnership.GetOwner(), target)))
+        return false;
 
 	return true;
 };
diff --git a/binaries/data/mods/public/simulation/templates/template_formation.xml b/binaries/data/mods/public/simulation/templates/template_formation.xml
index c310825..655ecf8 100644
--- a/binaries/data/mods/public/simulation/templates/template_formation.xml
+++ b/binaries/data/mods/public/simulation/templates/template_formation.xml
@@ -34,6 +34,7 @@
     <FleeDistance>12.0</FleeDistance>
     <FormationController>true</FormationController>
     <CanGuard>true</CanGuard>
+    <CanGarrison>true</CanGarrison>
   </UnitAI>
   <UnitMotion>
     <FormationController>true</FormationController>
diff --git a/binaries/data/mods/public/simulation/templates/template_unit.xml b/binaries/data/mods/public/simulation/templates/template_unit.xml
index 3654f4b..23d8d58 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit.xml
@@ -101,6 +101,7 @@
     <FleeDistance>12.0</FleeDistance>
     <FormationController>false</FormationController>
     <CanGuard>true</CanGuard>
+    <CanGarrison>true</CanGarrison>
   </UnitAI>
   <Guard/>
   <UnitMotion>
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
index b15d93a..873cc64 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml
@@ -28,6 +28,7 @@
     <RoamTimeMax>8000</RoamTimeMax>
     <FeedTimeMin>15000</FeedTimeMin>
     <FeedTimeMax>60000</FeedTimeMax>
+    <CanGarrison>false</CanGarrison>
   </UnitAI>
   <Guard disable=""/>
   <UnitMotion>
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
index 9ede543..ecd13dd 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_decorative.xml
@@ -31,6 +31,7 @@
     <RoamTimeMax>100000</RoamTimeMax>
     <FeedTimeMin>1</FeedTimeMin>
     <FeedTimeMax>2</FeedTimeMax>
+    <CanGarrison>false</CanGarrison>
   </UnitAI>
   <UnitMotion>
     <FormationController>false</FormationController>
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship.xml b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship.xml
index 32379af..7c61cd1 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship.xml
@@ -70,4 +70,7 @@
   <Vision>
     <Range>90</Range>
   </Vision>
+  <UnitAI>
+    <CanGarrison>false</CanGarrison>
+  </UnitAI>
 </Entity>
