diff --git a/src/facilities/farmyard/animals/animals.js b/src/facilities/farmyard/animals/animals.js
index b796a31ef0e0d19122d63725babc4f4a2c691759..f9218518571a1d4881acabe232d8554bfd85a5dc 100644
--- a/src/facilities/farmyard/animals/animals.js
+++ b/src/facilities/farmyard/animals/animals.js
@@ -206,6 +206,8 @@ App.Data.animals = {
 		domestic: [
 			{
 				name: "beagle",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.beagle;
 				},
@@ -216,6 +218,8 @@ App.Data.animals = {
 			},
 			{
 				name: "bulldog",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.bulldog;
 				},
@@ -226,6 +230,8 @@ App.Data.animals = {
 			},
 			{
 				name: "French bulldog",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.frenchBulldog;
 				},
@@ -236,6 +242,8 @@ App.Data.animals = {
 			},
 			{
 				name: "German shepherd",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.germanShepherd;
 				},
@@ -246,6 +254,8 @@ App.Data.animals = {
 			},
 			{
 				name: "golden retriever",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.goldenRetriever;
 				},
@@ -256,6 +266,8 @@ App.Data.animals = {
 			},
 			{
 				name: "labrador retriever",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.labradorRetriever;
 				},
@@ -266,6 +278,8 @@ App.Data.animals = {
 			},
 			{
 				name: "poodle",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.poodle;
 				},
@@ -276,6 +290,8 @@ App.Data.animals = {
 			},
 			{
 				name: "rottweiler",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.rottweiler;
 				},
@@ -286,6 +302,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Siberian husky",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.siberianHusky;
 				},
@@ -296,6 +314,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Yorkshire terrier",
+				species: "dog",
+
 				get purchased() {
 					return V.animalsBought.canine.domestic.yorkshireTerrier;
 				},
@@ -308,6 +328,8 @@ App.Data.animals = {
 		exotic: [
 			{
 				name: "dingo",
+				species: "dingo",
+
 				get purchased() {
 					return V.animalsBought.canine.exotic.dingo;
 				},
@@ -318,6 +340,8 @@ App.Data.animals = {
 			},
 			{
 				name: "fox",
+				species: "fox",
+
 				get purchased() {
 					return V.animalsBought.canine.exotic.fox;
 				},
@@ -328,6 +352,8 @@ App.Data.animals = {
 			},
 			{
 				name: "jackal",
+				species: "jackal",
+
 				get purchased() {
 					return V.animalsBought.canine.exotic.jackal;
 				},
@@ -338,6 +364,8 @@ App.Data.animals = {
 			},
 			{
 				name: "wolf",
+				species: "wolf",
+
 				get purchased() {
 					return V.animalsBought.canine.exotic.wolf;
 				},
@@ -352,6 +380,8 @@ App.Data.animals = {
 		domestic: [
 			{
 				name: "bull",
+				species: "bull",
+
 				get purchased() {
 					return V.animalsBought.hooved.domestic.bull;
 				},
@@ -362,6 +392,8 @@ App.Data.animals = {
 			},
 			{
 				name: "horse",
+				species: "horse",
+
 				get purchased() {
 					return V.animalsBought.hooved.domestic.horse;
 				},
@@ -372,6 +404,8 @@ App.Data.animals = {
 			},
 			{
 				name: "pig",
+				species: "pig",
+
 				get purchased() {
 					return V.animalsBought.hooved.domestic.pig;
 				},
@@ -384,6 +418,8 @@ App.Data.animals = {
 		exotic: [
 			{
 				name: "zebra",
+				species: "zebra",
+
 				get purchased() {
 					return V.animalsBought.hooved.exotic.zebra;
 				},
@@ -394,6 +430,8 @@ App.Data.animals = {
 			},
 			{
 				name: "elephant",
+				species: "elephant",
+
 				get purchased() {
 					return V.animalsBought.hooved.exotic.elephant;
 				},
@@ -408,6 +446,8 @@ App.Data.animals = {
 		domestic: [
 			{
 				name: "Abbysinian",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.abbysinian;
 				},
@@ -418,6 +458,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Bengal",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.bengal;
 				},
@@ -428,6 +470,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Birman",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.birman;
 				},
@@ -438,6 +482,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Maine coon",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.maineCoon;
 				},
@@ -448,6 +494,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Oriental shorthair",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.orientalShorthair;
 				},
@@ -458,6 +506,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Persian",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.persian;
 				},
@@ -468,6 +518,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Ragdoll",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.ragdoll;
 				},
@@ -478,6 +530,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Russian blue",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.russianBlue;
 				},
@@ -488,6 +542,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Siamese",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.siamese;
 				},
@@ -498,6 +554,8 @@ App.Data.animals = {
 			},
 			{
 				name: "Sphynx",
+				species: "cat",
+
 				get purchased() {
 					return V.animalsBought.feline.domestic.sphynx;
 				},
@@ -510,6 +568,8 @@ App.Data.animals = {
 		exotic: [
 			{
 				name: "cougar",
+				species: "cougar",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.cougar;
 				},
@@ -520,6 +580,8 @@ App.Data.animals = {
 			},
 			{
 				name: "jaguar",
+				species: "jaguar",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.jaguar;
 				},
@@ -530,6 +592,8 @@ App.Data.animals = {
 			},
 			{
 				name: "leopard",
+				species: "leopard",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.leopard;
 				},
@@ -540,6 +604,8 @@ App.Data.animals = {
 			},
 			{
 				name: "lion",
+				species: "lion",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.lion;
 				},
@@ -550,6 +616,8 @@ App.Data.animals = {
 			},
 			{
 				name: "lynx",
+				species: "lynx",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.lynx;
 				},
@@ -560,6 +628,8 @@ App.Data.animals = {
 			},
 			{
 				name: "puma",
+				species: "puma",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.puma;
 				},
@@ -570,6 +640,8 @@ App.Data.animals = {
 			},
 			{
 				name: "tiger",
+				species: "tiger",
+
 				get purchased() {
 					return V.animalsBought.feline.exotic.tiger;
 				},
diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 2428df349dee32da89a7ece86fdb835c9ea9740f..44d06174846debad9b5eebf96422fe992982fefa 100644
--- a/src/npc/interaction/fAnimal.js
+++ b/src/npc/interaction/fAnimal.js
@@ -531,24 +531,28 @@ App.Interact.fAnimal = function(slave, type) {
 		switch (animal) {
 			case V.activeCanine:
 				completionCanine();
-				return;
+				break;
 			case V.activeHooved:
+				completionHooved();
+				break;
 			case V.activeFeline:
+				completionFeline();
+				break;
 			default:
 				throw new Error(`Unexpected animal type '${type}' in completion()`);
 		}
 
+		if (act !== oral && canGetPregnant(slave) && canBreed(slave, animal)) {
+			knockMeUp(slave, 5, hole, -8);
+		}
+
 		function completionCanine() {
-			r.push(`The ${type === "canine" ? `hound` : animal} wastes no time in beginning to hammer away at ${his} ${orifice[0]}, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice[1]}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz ${act === oral ? `down ${his} throat` : `into ${his} ${orifice[0]}`}. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s ${act === oral ?
-				`mouth` :
-				act === vaginal && slave.vagina < 3 || act === anal && slave.anus < 2 ?
+			if (act === oral) {
+				r.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice[0]}, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice[1]}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz down ${his} abused throat. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s mouth, causing ${him} to immediately begin coughing and retching uncontrollably. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
+			} else {
+				r.push(`The ${animal.species === "dog" ? `hound` : animal.name} wastes no time in beginning to hammer away at ${his} ${orifice[0]}, causing ${slave.slaveName} to moan uncontrollably as its thick, veiny member probes the depths of ${his} ${orifice[1]}. A few short minutes later, ${he} gives a loud groan ${slaveApproves() ? `and shakes in orgasm ` : ``}as the ${animal.name}'s knot begins to swell and its dick begins to erupt a thick stream of jizz into ${his} ${orifice[0]}. Soon enough, the ${animal.name} finally finishes cumming and its knot is sufficiently small enough to slip out of ${slave.slaveName}'s ${act === vaginal && slave.vagina < 3 || act === anal && slave.anus < 2 ?
 					`now-gaping ${orifice[0]}` :
-					orifice[0]}, causing ${act === oral ?
-				`${him} to immediately begin coughing and retching uncontrollably` :
-				`a thick stream of cum to slide out of it`}. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
-
-			if (act !== oral && canGetPregnant(slave) && canBreed(slave, animal)) {
-				knockMeUp(slave, 5, hole, -8);
+					orifice[0]}, causing a thick stream of cum to slide out of it. Having finished its business, the ${animal.name} runs off, presumably in search of food.`);
 			}
 
 			switch (act) {
@@ -556,15 +560,65 @@ App.Interact.fAnimal = function(slave, type) {
 					slave.counter.oral++;
 					return;
 				case vaginal:
-					slave.vagina = slave.vagina < 3 ? 3 : slave.vagina;
 					slave.counter.vaginal++;
+					slave.vagina = slave.vagina < 3 ? 3 : slave.vagina;
 					return;
 				case anal:
+					slave.counter.anal++;
 					slave.anus = slave.anus < 2 ? 2 : slave.anus;
+					return;
+				default:
+					throw new Error(`Unexpected act type '${act} in completionCanine()`);
+			}
+		}
+
+		function completionHooved() {
+			if (act === oral) {
+				r.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan past the huge ${animal.species} cock stretching ${his} poor throat to its limits. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and pour its thick semen down ${his} throat and into ${his} stomach, filling it to the brim. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, causing ${slave.slaveName} to begin coughing and retching uncontrollably. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
+			} else {
+				r.push(`The ${animal.species === "horse" ? `stallion` : animal.name} begins to thrust faster and faster, causing ${him} to moan and groan as the huge ${animal.species} cock ${act === vaginal ? `batters ${his} cervix` : `fills ${him} completely`}. Before too long, the ${animal.name}'s movements begin to slow, and you can see its large testicles contract as its begins to erupt and fill ${his} ${orifice[1]} with its thick baby batter. After what seems like an impossibly long time, the ${animal.name}'s dick finally begins to soften and pull out, leaving ${slave.slaveName} panting and covered in sweat. You have another slave lead the ${animal.name} away, with a fresh apple as a treat for its good performance.`);
+			}
+
+			switch (act) {
+				case oral:
+					slave.counter.oral++;
+					return;
+				case vaginal:
+					slave.counter.vaginal++;
+					slave.vagina = slave.vagina < 4 ? 4 : slave.vagina;
+					return;
+				case anal:
+					slave.counter.anal++;
+					slave.anus = slave.anus < 3 ? 3 : slave.anus;
+					return;
+				default:
+					throw new Error(`Unexpected act type '${act} in completionHooved()`);
+			}
+		}
+
+		function completionFeline() {
+			if (act === oral) {
+				r.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} mouth and throat raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts down ${slave.slaveName}'s throat. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
+			} else {
+				r.push(`The ${animal.name} begins to move, thrusting faster and faster. The ${girl} underneath it can't stop a groan of pain from escaping ${his} lips as the ${animal.species}'s barbed dick rubs the inside of ${his} ${orifice[0]} raw. After a few minutes of painful coupling, the ${animal.species}'s thrusts finally slow, then stop completely as its ${animal.species !== "cat" ? `large` : ``} cock erupts, filling ${slave.slaveName} with its sperm. With a ${animal.species !== "cat" ? `deep bellow` : `loud meow`}, he finally dismounts, gives you a long look, then stalks off.`);
+			}
+
+			healthDamage(slave, 1);
+
+			switch (act) {
+				case oral:
+					slave.counter.oral++;
+					return;
+				case vaginal:
+					slave.counter.vaginal++;
+					slave.vagina = slave.vagina < 2 ? 2 : slave.vagina;
+					return;
+				case anal:
 					slave.counter.anal++;
+					slave.anus = slave.anus < 1 ? 1 : slave.anus;
 					return;
 				default:
-					throw new Error(`Unexpected act type '${act} in completion()`);
+					throw new Error(`Unexpected act type '${act} in completionFeline()`);
 			}
 		}
 	}