diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 44d06174846debad9b5eebf96422fe992982fefa..7886eec678c229624aea413d28ed7443d783b41c 100644
--- a/src/npc/interaction/fAnimal.js
+++ b/src/npc/interaction/fAnimal.js
@@ -6,7 +6,7 @@ App.Interact.fAnimal = function(slave, type) {
 		frag = new DocumentFragment(),
 		r = [],
 
-		{He, he, him, his, girl} = getPronouns(slave),
+		{He, he, him, His, his, girl} = getPronouns(slave),
 
 		acts = {
 			VAGINAL: "vaginal",
@@ -139,6 +139,11 @@ App.Interact.fAnimal = function(slave, type) {
 	}
 
 	completion();
+	sexEffects();
+
+	if (V.postSexCleanUp) {
+		cleanUp();
+	}
 
 	mainDiv.append(r.join(' '));
 
@@ -625,6 +630,120 @@ App.Interact.fAnimal = function(slave, type) {
 
 
 
+	// Post-sex Functions
+
+	function sexEffects() {
+		if (random(1, 100) > 100 + slave.devotion) {
+			switch (act) {
+				case oral:
+					if (slave.energy < 95 && slave.sexualFlaw !== "hates oral") {
+						r.push(`Having ${a} ${animal} fuck ${his} throat by force has given ${him} a hatred of oral sex.`);
+					}
+					slave.sexualFlaw = "hates oral";
+					return;
+				case vaginal:
+					if (slave.energy < 95 && slave.sexualFlaw !== "hates penetration") {
+						r.push(`Having ${a} ${animal} fuck ${him} by force has given ${him} a hatred of penetration.`);
+					}
+					slave.sexualFlaw = "hates penetration";
+					return;
+				case anal:
+					if (slave.energy < 95 && slave.sexualFlaw !== "hates anal") {
+						r.push(`Having ${a} ${animal} fuck ${his} asshole by force has given ${him} a hatred of anal penetration.`);
+					}
+					slave.sexualFlaw = "hates anal";
+					return;
+				default:
+					throw new Error(`Unexpected act type '${act}' in sexEffects()`);
+			}
+		}
+	}
+
+	function cleanUp() {
+		if (act !== oral) {
+			if (act === vaginal) {
+				if (slave.vagina === 3) {
+					r.push(`${capFirstChar(animal.name)} cum drips out out of ${his} fucked-out hole.`);
+				} else if (slave.vagina === 2) {
+					r.push(`${capFirstChar(animal.name)} cum drips out out of ${his} stretched vagina.`);
+				} else if (slave.vagina === 1) {
+					r.push(`${His} still-tight pussy keeps the ${animal.name}'s cum inside ${him}.`);
+				} else {
+					r.push(`${capFirstChar(animal.name)} cum slides right out of ${his} gaping hole.`);
+				}
+			} else {
+				if (slave.anus === 1) {
+					r.push(`${His} still-tight asshole keeps the ${animal.name}'s cum inside ${him}.`);
+				} else if (slave.anus === 2) {
+					r.push(`${capFirstChar(animal.name)} cum drips out of ${his} loosened anus.`);
+				} else {
+					r.push(`${capFirstChar(animal.name)} cum slides right out of ${his} fucked-out asshole.`);
+				}
+			}
+		}
+
+		if (canWalk(slave)) {
+			if (slave.vagina > 0) {
+				r.push(`${He} uses a quick douche to clean ${his} ${slave.vagina < 2 ? `tight` : slave.vagina > 3 ? `loose` : ``} pussy,`);
+			} else {
+				r.push(`${He} uses an enema to clean ${his} ${slave.anus < 2 ? `tight` : slave.anus < 3 ? `used` : `gaping`} butthole,`);
+			}
+
+			switch (slave.assignment) {
+				case Job.BROTHEL:
+					r.push(`just like ${he} does between each customer.`);
+					return;
+				case Job.CLUB:
+					r.push(`just like ${he} does in the club.`);
+					return;
+				case Job.DAIRY:
+					r.push(`to avoid besmirching the nice clean dairy.`);
+					return;
+				case Job.FARMYARD:
+					r.push(`to avoid tainting the food in ${V.farmyardName}.`);
+					return;
+				case Job.QUARTER:
+					r.push(`mostly to keep everything ${he} has to clean from getting any dirtier.`);
+					return;
+				case Job.WHORE:
+					r.push(`before returning to offering it for sale.`);
+					return;
+				case Job.PUBLIC:
+					r.push(`before returning to offering it for free.`);
+					return;
+				case Job.REST:
+					r.push(`before crawling back into bed.`);
+					return;
+				case Job.MILKED:
+					r.push(`${slave.lactation > 0 ? `before going to get ${his} uncomfortably milk-filled tits drained` : `and then rests until ${his} balls are ready to be drained again`}.`);
+					return;
+				case Job.HOUSE:
+					r.push(`since ${his} chores didn't perform themselves while you used ${his} fuckhole.`);
+					return;
+				case Job.FUCKTOY:
+					r.push(`before returning to await your next use of ${his} fuckhole, as though nothing had happened.`);
+					return;
+				case Job.SUBORDINATE:
+					r.push(`though it's only a matter of time before another slave decides to play with ${his} fuckhole.`);
+					return;
+				case Job.HEADGIRL:
+					r.push(`worried that ${his} charges got up to trouble while ${he} enjoyed ${his} ${WrittenMaster(slave)}'s use.`);
+					return;
+				case Job.BODYGUARD:
+					r.push(`so ${he} can be fresh and ready for more sexual use even as ${he} guards your person.`);
+					return;
+				case Job.TEACHER:
+					r.push(`before ${he} returns to teaching ${his} classes.`);
+					return;
+				default:
+					r.push(`before ${he} returns to ${slave.assignment}.`);
+					return;
+			}
+		}
+	}
+
+
+
 	// MARK: Virginity Check Functions
 
 	function virginityCheck(type) {