diff --git a/devNotes/legacy files/walkPast.txt b/devNotes/legacy files/walkPast.txt
index 86815322cb783f7639119d665bc121098b7b60fd..ebb49e201b388dcd9645dffcddd0bd814ce83674 100644
--- a/devNotes/legacy files/walkPast.txt	
+++ b/devNotes/legacy files/walkPast.txt	
@@ -3540,7 +3540,7 @@
 	<<set _target = "FAnus">>
 <<elseif (_seed > 0)>>
 	<<= App.Desc.face($activeSlave)>>
-	<<mouthDescription>>
+	<<= App.Desc.mouth($activeSlave)>>
 	<<switch $activeSlave.collar>>
 	<<case "a Fuckdoll suit">>
 		Its suit is expressly designed to encourage use of its face hole.
diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 635b1fcc947c9aa6e341094ae717daf55309d1ef..6cd79298ef745a60d0703b0df3036f66fdb6b32d 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -9140,7 +9140,9 @@ globalThis.walkPast = (function() {
 		} = getPronouns(slave);
 
 		t += App.Desc.face(slave);
-		t += ` <<mouthDescription>>`;
+		t += ` `;
+		t += App.Desc.mouth(slave);
+		t += ` `;
 		switch (slave.collar) {
 			case "uncomfortable leather":
 				t += `${His} uncomfortable leather collar makes ${him} swallow and lick ${his} lips periodically, making it look like ${he}'s offering oral even though ${he}'s just trying to relieve the discomfort.`;
diff --git a/src/npc/descriptions/mouth.js b/src/npc/descriptions/mouth.js
new file mode 100644
index 0000000000000000000000000000000000000000..50f45594b00ac84e784d242834e70a15a7309265
--- /dev/null
+++ b/src/npc/descriptions/mouth.js
@@ -0,0 +1,157 @@
+App.Desc.mouth = function(slave) {
+	const r = [];
+	const {
+		he, him, his, hers, himself, boy, He, His
+	} = getPronouns(slave);
+
+	r.push(`${He} has`);
+	if (slave.lips <= 10) {
+		r.push(`thin, unattractive lips.`);
+	} else if (slave.lips <= 20) {
+		r.push(`normal lips.`);
+	} else if (slave.lips <= 40) {
+		r.push(`full, attractive lips.`);
+	} else if (slave.lips <= 70) {
+		r.push(`plump, beestung lips.`);
+	} else if (slave.lips <= 95) {
+		r.push(`huge, obviously augmented lips.`);
+	} else {
+		r.push(`a facepussy: ${his} lips are so huge that they're always a bit parted in the middle, forming a moist, inviting`);
+		if (V.PC.dick !== 0) {
+			r.push(`hole for cock.`);
+		} else {
+			r.push(`hole.`);
+		}
+	}
+
+	if (V.showImplantEffects === 1) {
+		if (V.arcologies[0].FSTransformationFetishist !== "unset") {
+			if (slave.lipsImplant > 0) {
+				r.push(`They are about ${Math.floor((slave.lipsImplant / slave.lips) * 100)}% implant.`);
+			}
+			if (V.arcologies[0].FSTransformationFetishist > 20) {
+				if (slave.lips > 70) {
+					if (slave.lipsImplant / slave.lips < .50) {
+						r.push(`${His} lips are huge and < span class="red" > disgustingly natural</span > for their size.`);
+					} else {
+						r.push(`${His} lips are huge and < span class="green" > obviously implants,</span > as they should be.`);
+					}
+				}
+			}
+		}
+	}
+
+	if (slave.fuckdoll > 0) {
+		r.push(`${His} mouth is held open by the suit's oral insert.`);
+	} else if ((slave.assignment === "work in the dairy") && (V.dairyRestraintsSetting > 1)) {
+		if (V.dairyFeedersSetting > 1) {
+			r.push(`${His} milking machine has a phallus a long way down ${his} throat to rehydrate ${him}.`);
+		} else {
+			r.push(`${He}'s got ${his} mouth wrapped around a phallus provided by ${his} milking machine, and is sucking it off for hydration.`);
+		}
+	} else {
+		if (canTalk(slave)) {
+			if (slave.lips > 70) {
+				r.push(`${He} can barely enunciate past ${his} dick-sucking lips; '${WrittenMaster(slave)}' comes out as '${lispReplace(WrittenMaster(slave))}.'`);
+			}
+		}
+		if (slave.teeth !== "normal") {
+			if (slave.teeth === "crooked") {
+				r.push(`${His} teeth are <span class="yellow">crooked,</span> detracting from ${his} beauty whenever ${he} opens ${his} mouth.`);
+			} else if (slave.teeth === "straightening braces") {
+				r.push(`${He} has braces,`);
+				if (slave.visualAge > 35) {
+					r.push(`an amusing sight on such a mature ${woman}.`);
+				} else if ((slave.visualAge > 14) && (slave.visualAge < 18)) {
+					r.push(`a cute look on such a young ${girl}.`);
+				} else {
+					r.push(`and occasionally looks preoccupied with discomfort as they straighten ${his} teeth.`);
+				}
+			} else if (slave.teeth === "cosmetic braces") {
+				r.push(`${He}'s wearing braces despite ${his} straight teeth,`);
+				if (slave.visualAge > 35) {
+					r.push(`an amusing sight on such a mature ${woman}.`);
+				} else if ((slave.visualAge > 14) && (slave.visualAge < 18)) {
+					r.push(`a cute look on such a young ${girl}.`);
+				} else {
+					r.push(`just for appearances.`);
+				}
+			} else if (slave.teeth === "gapped") {
+				r.push(`${He} has a prominent gap between ${his} front`);
+				if (slave.faceShape === "cute") {
+					r.push(`teeth that suits ${his} cute face surprisingly well.`);
+				} else {
+					r.push(`teeth.`);
+				}
+				if (canTalk(slave)) {
+					r.push(`It also leaves ${him} with a slight lisp.`);
+				}
+			} else if (slave.teeth === "removable") {
+				r.push(`${His} teeth have been removed and replaced with high-quality dentures. It's difficult to tell anything's unusual until you take them out for gummy oral sex.`);
+			} else if (slave.teeth === "pointy") {
+				r.push(`${His} teeth have been replaced with realistic implants that mimic the dentition of a carnivore. ${His} smiles are frightening, and ${he} can bare them to become truly terrifying.`);
+			} else if (slave.teeth === "fangs") {
+				r.push(`${His} upper canine teeth have been replaced with realistic implants that mimic fangs. ${His} smiles are frightening, and ${he} can bare them to become truly terrifying.`);
+			} else if (slave.teeth === "fang") {
+				r.push(`One of ${his} upper canine teeth has been replaced with realistic implant shaped like a fang.`);
+				if (slave.faceShape === "cute") {
+					r.push(`It gives ${his} cute face an added`);
+					if (slave.lips <= 50) {
+						r.push(`charm, especially when it rests over ${his} lower lip.`);
+					} else {
+						r.push(`charm.`);
+					}
+				} else {
+					if (slave.lips <= 50) {
+						r.push(`It stands out when it rests over ${his} lower lip.`);
+					} else {
+						r.push(`It doesn't fit well in ${his} mouth and frequently prods ${his} fat lower lip.`);
+					}
+				}
+			} else if (slave.teeth === "baby") {
+				r.push(`${He} still has ${his} baby teeth.`);
+			} else if (slave.teeth === "mixed") {
+				r.push(`${He} is in the process of replacing ${his} baby teeth.`);
+			}
+		}
+	}
+	if (slave.tastes === -1) {
+		r.push(`${He} has no sense of taste, but this isn't immediately obvious just by looking at ${his} tongue.`);
+	}
+
+	r.push(App.Desc.mods(slave, "lips"));
+	r.push(App.Desc.mods(slave, "tongue"));
+
+	if (slave.fuckdoll > 0) {
+		if (V.PC.dick !== 0) {
+			r.push(`Sticking a dick`);
+		} else {
+			r.push(`Sliding a dildo`);
+		}
+		r.push(`into ${his}`);
+		if (slave.lips > 95) {
+			r.push(`facepussy`);
+		} else {
+			r.push(`mouth insert`);
+		}
+		if (slave.fuckdoll <= 45) {
+			r.push(`mostly results in gagging.`);
+		} else {
+			r.push(`offers its user a selection of delightful face hole massage options.`);
+		}
+	} else {
+		r.push(`${He} is`);
+		if (slave.skill.oral >= 100) {
+			r.push(`an <span class="aquamarine">oral sex master.</span>`);
+		} else if (slave.skill.oral > 60) {
+			r.push(`an <span class="aquamarine">expert at oral.</span>`);
+		} else if (slave.skill.oral > 30) {
+			r.push(`<span class="aquamarine">orally skilled.</span>`);
+		} else if (slave.skill.oral > 10) {
+			r.push(`<span class="aquamarine">capable of basic oral sex.</span>`);
+		} else {
+			r.push(`unskilled at oral sex.`);
+		}
+	}
+	return r.join(" ");
+};
diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw
index 8bbb9f9c97d0240c4ca2ade8ad37f43b317269af..7f532488d4704659f767d39abaa390135036455f 100644
--- a/src/uncategorized/longSlaveDescription.tw
+++ b/src/uncategorized/longSlaveDescription.tw
@@ -1910,7 +1910,7 @@ $He is
 
 <<= App.Desc.horns($activeSlave)>>
 <<= App.Desc.face($activeSlave)>>
-<<mouthDescription>>
+<<= App.Desc.mouth($activeSlave)>>
 
 <<if ($showClothing == 1) && ($saleDescription == 0)>>
 
diff --git a/src/utility/descriptionWidgetsFlesh.tw b/src/utility/descriptionWidgetsFlesh.tw
index f402b7849ed723dac51141f861b6b5b3e8935fc0..5366bf49529eb1e96ec204656a0b94a90fadf721 100644
--- a/src/utility/descriptionWidgetsFlesh.tw
+++ b/src/utility/descriptionWidgetsFlesh.tw
@@ -1,129 +1,5 @@
 :: flesh description widgets [widget nobr]
 
-<<widget "mouthDescription">>
-
-$He has
-<<if $activeSlave.lips <= 10>>
-	thin, unattractive lips.
-<<elseif $activeSlave.lips <= 20>>
-	normal lips.
-<<elseif $activeSlave.lips <= 40>>
-	full, attractive lips.
-<<elseif $activeSlave.lips <= 70>>
-	plump, beestung lips.
-<<elseif $activeSlave.lips <= 95>>
-	huge, obviously augmented lips.
-<<else>>
-	a facepussy: $his lips are so huge that they're always a bit parted in the middle, forming a moist, inviting hole<<if $PC.dick != 0>> for cock<</if>>.
-<</if>>
-
-<<if $showImplantEffects == 1>>
-	<<if $arcologies[0].FSTransformationFetishist != "unset">>
-		<<if $activeSlave.lipsImplant > 0>>
-			They are about <<print Math.floor(($activeSlave.lipsImplant/$activeSlave.lips)*100)>>% implant.
-		<</if>>
-		<<if ($arcologies[0].FSTransformationFetishist > 20)>>
-			<<if $activeSlave.lips > 70>>
-				<<if ($activeSlave.lipsImplant/$activeSlave.lips < .50)>>
-					$His lips are huge and @@.red;disgustingly natural@@ for their size.
-				<<else>>
-					$His lips are huge and @@.green;obviously implants,@@ as they should be.
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $activeSlave.fuckdoll > 0>>
-	$His mouth is held open by the suit's oral insert.
-<<elseif ($activeSlave.assignment == "work in the dairy") && ($dairyRestraintsSetting > 1)>>
-	<<if ($dairyFeedersSetting > 1)>>
-		$His milking machine has a phallus a long way down $his throat to rehydrate $him.
-	<<else>>
-		$He's got $his mouth wrapped around a phallus provided by $his milking machine, and is sucking it off for hydration.
-	<</if>>
-<<else>>
-	<<if canTalk($activeSlave)>>
-		<<if $activeSlave.lips > 70>>
-			$He can barely enunciate past $his dick-sucking lips; '<<= WrittenMaster($activeSlave)>>' comes out as '<<= lispReplace(WrittenMaster($activeSlave))>>.'
-		<</if>>
-	<</if>>
-	<<if $activeSlave.teeth != "normal">>
-		<<if $activeSlave.teeth == "crooked">>
-			$His teeth are @@.yellow;crooked,@@ detracting from $his beauty whenever $he opens $his mouth.
-		<<elseif $activeSlave.teeth == "straightening braces">>
-			$He has braces,
-			<<if $activeSlave.visualAge > 35>>
-				an amusing sight on such a mature $woman.
-			<<elseif ($activeSlave.visualAge > 14) && ($activeSlave.visualAge < 18)>>
-				a cute look on such a young $girl.
-			<<else>>
-				and occasionally looks preoccupied with discomfort as they straighten $his teeth.
-			<</if>>
-		<<elseif $activeSlave.teeth == "cosmetic braces">>
-			$He's wearing braces despite $his straight teeth,
-			<<if $activeSlave.visualAge > 35>>
-				an amusing sight on such a mature $woman.
-			<<elseif ($activeSlave.visualAge > 14) && ($activeSlave.visualAge < 18)>>
-				a cute look on such a young $girl.
-			<<else>>
-				just for appearances.
-			<</if>>
-		<<elseif $activeSlave.teeth == "gapped">>
-			$He has a prominent gap between $his front teeth<<if $activeSlave.faceShape == "cute">> that suits $his cute face surprisingly well<</if>>.
-			<<if canTalk($activeSlave)>>
-				It also leaves $him with a slight lisp.
-			<</if>>
-		<<elseif $activeSlave.teeth == "removable">>
-			$His teeth have been removed and replaced with high-quality dentures. It's difficult to tell anything's unusual until you take them out for gummy oral sex.
-		<<elseif $activeSlave.teeth == "pointy">>
-			$His teeth have been replaced with realistic implants that mimic the dentition of a carnivore. $His smiles are frightening, and $he can bare them to become truly terrifying.
-		<<elseif $activeSlave.teeth == "fangs">>
-			$His upper canine teeth have been replaced with realistic implants that mimic fangs. $His smiles are frightening, and $he can bare them to become truly terrifying.
-		<<elseif $activeSlave.teeth == "fang">>
-			One of $his upper canine teeth has been replaced with realistic implant shaped like a fang.
-			<<if $activeSlave.faceShape == "cute">>
-				It gives $his cute face an added charm<<if $activeSlave.lips <= 50>>, especially when it rests over $his lower lip<</if>>.
-			<<else>>
-				<<if $activeSlave.lips <= 50>>
-					It stands out when it rests over $his lower lip.
-				<<else>>
-					It doesn't fit well in $his mouth and frequently prods $his fat lower lip.
-				<</if>>
-			<</if>>
-		<<elseif $activeSlave.teeth == "baby">>
-			$He still has $his baby teeth.
-		<<elseif $activeSlave.teeth == "mixed">>
-			$He is in the process of replacing $his baby teeth.
-		<</if>>
-	<</if>>
-<</if>>
-<<if $activeSlave.tastes == -1>>
-	$He has no sense of taste, but this isn't immediately obvious just by looking at $his tongue.
-<</if>>
-
-<<= App.Desc.mods($activeSlave, "lips")>>
-<<= App.Desc.mods($activeSlave, "tongue")>>
-
-<<if $activeSlave.fuckdoll > 0>>
-	<<if $PC.dick != 0>>Sticking a dick<<else>>Sliding a dildo<</if>> into $his <<if $activeSlave.lips > 95>>facepussy<<else>>mouth insert<</if>>
-	<<if $activeSlave.fuckdoll <= 45>>
-		mostly results in gagging.
-	<<else>>
-		offers its user a selection of delightful face hole massage options.
-	<</if>>
-<<else>>
-	$He is
-	<<if $activeSlave.skill.oral >= 100>>an @@.aquamarine;oral sex master.@@
-	<<elseif $activeSlave.skill.oral > 60>>an @@.aquamarine;expert at oral.@@
-	<<elseif $activeSlave.skill.oral > 30>>@@.aquamarine;orally skilled.@@
-	<<elseif $activeSlave.skill.oral > 10>>@@.aquamarine;capable of basic oral sex.@@
-	<<else>>unskilled at oral sex.
-	<</if>>
-<</if>>
-
-<</widget>>
-
 <<widget "pregnancyDescription">>
 
 <<if $activeSlave.pregSource > 0>>