diff --git a/devNotes/usefulJSFunctionDocumentation.md b/devNotes/usefulJSFunctionDocumentation.md
index 54fd65dad61acfd9ad0cb4fe1eb5319641ee934c..e8a9181daa3bab7b22f465b7de7b2face8cd12c6 100644
--- a/devNotes/usefulJSFunctionDocumentation.md
+++ b/devNotes/usefulJSFunctionDocumentation.md
@@ -181,6 +181,26 @@ SlaveTitle(slave) // Returns the slave's descriptive title.
 
 relativeTerm(slave1, slave2) // Returns the term for slave2's relation to slave1. (daughter, mother, etc.)
 
+vaginaDesc(slave) // Returns the description of the slave's vagina.
+
+dickDesc(slave) // Returns the description of the slave's penis.
+
+ballsDesc(slave) // Returns the description of the slave's testicles.
+
+clitDesc(slave) // Returns the description of the slave's clitoris.
+
+anusDesc(slave) // Returns the description of the slave's anus.
+
+boobsDesc(slave) // Returns the size descriptor of the slave's breasts.
+
+boobsDescLong(slave) // Returns the full description of the slave's breasts.
+
+buttDesc(slave) // Returns the description of the slave's bottom.
+
+lipsDesc(slave) // Returns the description of the slave's lips.
+
+bellyDesc(slave, withNoun, pregReference) // Returns the description of the slave's belly.
+
 relationshipChecks [script] All work as expected with <<if X.rivalryTarget == $slaves[$i].ID>> preceding them.
  rivalryTerm(id) // Returns the rivalry term for the input. e.g. lines 99-100 of brothelReport.
   //<<if $Madam.rivalryTarget == $slaves[$i].ID>>
diff --git a/src/facilities/farmyard/animals/animals.js b/src/facilities/farmyard/animals/animals.js
index 2bddac7cad0caa4371b019bc0f92c07fa44c6dd8..a5a91a263be076cf17847af2cef432ec72081575 100644
--- a/src/facilities/farmyard/animals/animals.js
+++ b/src/facilities/farmyard/animals/animals.js
@@ -470,7 +470,7 @@ App.Facilities.Farmyard.animals = function() {
 		}
 
 		function dick() {
-			dickDiv.append(dickSize(), dickDesc());
+			dickDiv.append(dickSize(), phallusDesc());
 
 			return dickDiv;
 
@@ -490,7 +490,7 @@ App.Facilities.Farmyard.animals = function() {
 				return dickSizeDiv;
 			}
 
-			function dickDesc() {
+			function phallusDesc() {
 				const dickDescDiv = document.createElement("div");
 
 				dickDescDiv.append(
diff --git a/src/js/pregJS.js b/src/js/pregJS.js
index 71195f1e2475e784d8660ec7dae35ccebb92d5c5..5e65439bfd51c70466b48f9378d607bb74ab08a0 100644
--- a/src/js/pregJS.js
+++ b/src/js/pregJS.js
@@ -16,51 +16,6 @@ globalThis.getPregBellySize = function(s) {
 	return ((4 / 3) * (Math.PI) * (phi / 2) * (Math.pow((targetLen / 2), 3)) * fetuses);
 };
 
-/**
- * @param {FC.HumanState} slave
- * @returns {string}
- */
-globalThis.bellyAdjective = function(slave) {
-	if (slave.belly >= 1500) {
-		if (slave.belly >= 1000000) {
-			if (slave.preg > slave.pregData.normalBirth / 4) {
-				return 'unfathomably distended, brimming with life';
-			} else {
-				return `unfathomable`;
-			}
-		} else if (slave.belly >= 750000) {
-			if (slave.preg > slave.pregData.normalBirth / 4) {
-				return 'monolithic bulging';
-			} else {
-				return `monolithic`;
-			}
-		} else if (slave.belly >= 600000) {
-			if (slave.preg > slave.pregData.normalBirth / 4) {
-				return 'titanic bulging';
-			} else {
-				return `titanic`;
-			}
-		} else if (slave.belly >= 450000) {
-			if (slave.preg > slave.pregData.normalBirth / 4) {
-				return 'gigantic bulgy';
-			} else {
-				return `gigantic`;
-			}
-		} else if (slave.belly >= 300000) {
-			return 'massive';
-		} else if (slave.belly >= 100000) {
-			return 'giant';
-		} else if (slave.belly >= 15000) {
-			return 'huge';
-		} else if (slave.belly >= 10000) {
-			return 'big';
-		} else {
-			return `swollen`;
-		}
-	}
-	return "";
-};
-
 /** calculates and returns expected ovum count during conception
  * @param {FC.HumanState} actor
  */
diff --git a/src/npc/descriptions/genericDescriptions.js b/src/npc/descriptions/genericDescriptions.js
index a77951663f201e853eca308852d59706bc5ddd26..45c4fb43537991f6855630ceac0147daf4bea0e6 100644
--- a/src/npc/descriptions/genericDescriptions.js
+++ b/src/npc/descriptions/genericDescriptions.js
@@ -21,3 +21,521 @@ globalThis.beautiful = function(slave) {
 globalThis.pretty = function(slave) {
 	return slave.genes === "XX" ? `pretty` : `good-looking`;
 };
+
+/** Returns the description of the slave's vagina.
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.vaginaDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	let adj = [];
+	let noun = ["vagina", "pussy", "cunt", "pussy", "cunt"];
+	if (slave.newVag && slave.vagina > 0) {
+		return `${jsEither(["hyperelastic", "highly adaptable"])}${withNoun ? " " + jsEither(noun) : ""}`;
+	}
+	if (slave.vagina < 0) {
+		return `non-existent${withNoun ? " front hole": ""}`;
+	}
+	switch (slave.vagina) {
+		case 0:
+			adj.push(`virgin${slave.counter.reHymen ? "-again" : ""}`, "virgin");
+			noun.push("little slit", "flower");
+			break;
+		case 1:
+			adj.push("tight", "narrow");
+			break;
+		case 2:
+			adj.push("", "welcoming");
+			break;
+		case 3:
+			adj.push("veteran");
+			break;
+		case 4:
+			adj.push("baggy", "loose");
+			break;
+		case 5:
+		case 6:
+			adj.push("gaping");
+			break;
+		case 7:
+		case 8:
+		case 9:
+			adj.push("cavernous");
+			break;
+		default:
+			adj.push("ruined");
+	}
+	if (withNoun) {
+		if (slave.vagina > 2) {
+			noun.push("twat");
+		}
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's penis
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.dickDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	let adj =[];
+	let noun = ["dick", "dick", "cock", "cock", "penis", "prick", "phallus"]
+	if (slave.dick === 0) {
+		return `non-existent${withNoun ? " penis" : ""}`;
+	}
+	switch (slave.dick) {
+		case 1:
+			if (withNoun) {
+				return `${jsEither(["micropenis", "tiny prick", "tiny weenie"])}`;
+			}
+			return "tiny";
+			break;
+		case 2:
+			adj.push("cute", "small");
+			noun.push("weenie", "weenie");
+			break;
+		case 3:
+			adj.push("", "average");
+			break;
+		case 4:
+			adj.push("big");
+			break;
+		case 5:
+			adj.push("huge");
+			break;
+		case 6:
+			adj.push("gigantic");
+			break;
+		case 7:
+			adj.push("massive");
+			break;
+		case 8:
+			adj.push("titanic", "truly imposing");
+			break;
+		case 9:
+			adj.push("monstrous", "absurd");
+			break;
+		case 10:
+			adj.push("inhuman");
+			break;
+		default:
+			adj.push("hypertrophied");
+	}
+	if (withNoun) {
+		if (slave.dick > 5) {
+			noun.push("dong");
+		}
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's anus
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */globalThis.anusDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	let adj = [];
+	let noun = ["anus", "butthole", "asshole", "bumhole", "anus"];
+	switch (slave.anus) {
+		case 0:
+			adj.push("virgin");
+			noun =["sphincter", "anus", "anus"];
+			break;
+		case 1:
+			adj.push("tight", "narrow", "welcoming", "puckered");
+			break;
+		case 2:
+			adj.push("loose", "veteran");
+			break;
+		case 3:
+			adj.push("very loose", "lax");
+			break;
+		default:
+			adj.push("gaping", "gaped");
+	}
+	if (withNoun) {
+		if (slave.anus > 1) {
+			noun.push("backdoor");
+			if (slave.anus > 2) {
+				noun.push("asspussy");
+			}
+		}
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's testicles
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.ballsDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	let adj =[];
+	let noun = ["balls", "balls", "balls", "testicles"]
+	if (slave.balls === 0) {
+		return `non-existent${withNoun ? " testes" : ""}`;
+	}
+	switch (slave.balls) {
+		case 1:
+			return `vestigial${withNoun ? " " + jsEither(["testes", "testicles"]) : ""}`;
+			break;
+		case 2:
+			adj.push("small");
+			noun.push("testes");
+			break;
+		case 3:
+			adj.push("", "average", "standard");
+			break;
+		case 4:
+			adj.push("large");
+			break;
+		case 5:
+			adj.push("massive");
+			break;
+		case 6:
+			adj.push("huge");
+			break;
+		case 7:
+			adj.push("giant");
+			break;
+		case 8:
+			adj.push("enormous");
+			break;
+		case 9:
+			adj.push("monstrous");
+			break;
+		default:
+			adj.push("overly massive");
+	}
+	if (withNoun) {
+		if (slave.balls < 6) {
+			noun.push("nuts");
+		}
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the size descriptor of the slave's breasts
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.boobsDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	if (slave.boobs < 300 && slave.hormoneBalance < -20) {
+		return `masculine${withNoun ? " chest" : ""}`;
+	}
+	if (withNoun) {
+		return App.Desc.boobBits.noun(slave.boobs, false, true);
+	}
+	return App.Desc.boobBits.adjective(slave.boobs);
+}
+
+/**
+ * Returns the full description of the slave's breasts
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @param {boolean} withShape
+ * @param {boolean} withCup
+ * @param {boolean} withSurgery
+ * @param {boolean} withLactation
+ * @returns {string}
+ */
+globalThis.boobsDescLong = function(slave, withNoun = true, withShape = true, withCup = true, withSurgery = true, withLactation = true) {
+	if (!slave) {return "ERROR"}
+	if (slave.boobs < 300 && slave.hormoneBalance < -20) {
+		return `masculine${withNoun ? " chest" : ""}`;
+	}
+	let surgery = (slave.boobsImplant && withSurgery) ? "surgery improved " : (withSurgery ? "natural " : "");
+	let milk = (slave.lactation && withLactation) ? "milk laden " : "";
+	let shape = (slave.boobShape && withShape) ? slave.boobShape + " " : "";
+	if (withNoun) {
+		return `${milk}${surgery}${shape}${App.Desc.boobBits.noun(slave.boobs, withCup, true)}`;
+	}
+	return `${milk}${surgery}${shape}${withCup ? App.Desc.boobBits.cup(slave.boobs) + " " : ""}${App.Desc.boobBits.adjective(slave.boobs)}`;
+}
+
+/**
+ * Returns the description of the slave's butt
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.buttDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	let adj =[];
+	let noun = ["butt", "butt", "butt", "ass", "rear"]
+	switch (slave.butt) {
+		case 0:
+			return `flat${withNoun ? " " + jsEither(["bottom"]) : ""}`;
+			break;
+		case 1:
+			adj.push("small");
+			break;
+		case 2:
+			adj.push("plump", "curved");
+			break;
+		case 3:
+			adj.push("round", "curvy", "big bubble", "big bubble");
+			break;
+		case 4:
+			adj.push("huge", "massive");
+			break;
+		case 5:
+			adj.push("enormous", "cushion-like");
+			break;
+		case 6:
+			adj.push("gigantic", "titanic");
+			break;
+		case 7:
+			adj.push("ridiculous");
+			break;
+		case 8:
+		case 9:
+		case 10:
+			adj.push("immense");
+			break;
+		default:
+			adj.push("inhuman");
+	}
+	if (withNoun) {
+		if (slave.butt < 2) {
+			noun.push("bottom");
+		}
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's lips
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @param {boolean} withSurgery
+ * @returns {string}
+ */
+globalThis.lipsDesc = function(slave, withNoun = true, withSurgery = false) {
+	if (!slave) {return "ERROR"}
+	let adj = [];
+	let noun =["lips"];
+	let surgery = (slave.lipsImplant && withSurgery) ? "siliconed " : (withSurgery ? "natural " : "");
+	if (slave.lips < 11) {
+		adj.push("thin", "unattractive");
+	} else if (slave.lips < 21) {
+		adj.push("regular", "");
+	} else if (slave.lips < 41) {
+		adj.push("pretty", "attractive");
+	} else if (slave.lips < 71) {
+		adj.push("plump", "plush");
+	} else if (slave.lips < 96) {
+		adj.push("huge", "beestung");
+	} else {
+		adj.push("pussy-like", "fuckhole");
+	}
+	if (withNoun) {
+		return `${jsEither(adj)} ${surgery}${jsEither(noun)}`;
+	}
+	return `${surgery}${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's belly
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @param {boolean} pregReference // mentions pregnancy if slave is pregnant
+ * @returns {string}
+ */
+globalThis.bellyDesc = function(slave, withNoun = true, pregReference = true) {
+	if (!slave) {return "ERROR"}
+	let adj = [];
+	let noun =["belly"];
+	if (pregReference && !!V.seePreg && slave.preg > 0) {
+		if (slave.belly > 750000) {
+			adj.push("inhumanly overexpanded pregnant");
+		} else if (slave.belly > 600000) {
+			adj.push("immensely overexpanded pregnant");
+		} else if (slave.belly > 450000) {
+			adj.push("enormously overexpanded pregnant");
+		} else if (slave.belly > 300000) {
+			adj.push("overexpanded pregnant");
+		} else if (slave.belly > 150000) {
+			adj.push("grotesquely oversized pregnant");
+		} else if (slave.belly > 120000) {
+			adj.push("absurd pregnant");
+		} else if (slave.belly > 105000) {
+			adj.push("monstrous pregnant");
+		} else if (slave.belly > 90000) {
+			adj.push("titanic pregnant");
+		} else if (slave.belly > 75000) {
+			adj.push("massive pregnant");
+		} else if (slave.belly > 60000) {
+			adj.push("gigantic pregnant");
+		} else if (slave.belly > 45000) {
+			adj.push("huge pregnant");
+		} else if (slave.belly > 30000) {
+			adj.push("big pregnant");
+		} else if (slave.belly > 15000) {
+			adj.push("full term looking");
+		} else if (slave.belly > 10000) {
+			adj.push("very pregnant");
+		} else if (slave.belly > 5000) {
+			adj.push("obviously pregnant");
+		} else if (slave.belly > 1500) {
+			adj.push("plump");
+		} else if (slave.belly > 100) {
+			adj.push("bloated");
+		} else {
+			adj.push("flat");
+			noun = ["stomach", "tummy"];
+		}
+	} else {
+		if (slave.belly > 750000) {
+			adj.push("inhumanly overexpanded");
+		} else if (slave.belly > 600000) {
+			adj.push("immensely overexpanded");
+		} else if (slave.belly > 450000) {
+			adj.push("enormously overexpanded");
+		} else if (slave.belly > 300000) {
+			adj.push("overexpanded");
+		} else if (slave.belly > 150000) {
+			adj.push("grotesquely oversized");
+		} else if (slave.belly > 120000) {
+			adj.push("absurd");
+		} else if (slave.belly > 105000) {
+			adj.push("monstrous");
+		} else if (slave.belly > 90000) {
+			adj.push("titanic");
+		} else if (slave.belly > 75000) {
+			adj.push("massive");
+		} else if (slave.belly > 60000) {
+			adj.push("gigantic");
+		} else if (slave.belly > 45000) {
+			adj.push("huge");
+		} else if (slave.belly > 30000) {
+			adj.push("obese");
+		} else if (slave.belly > 15000) {
+			adj.push("beefy");
+		} else if (slave.belly > 10000) {
+			adj.push("porky");
+		} else if (slave.belly > 5000) {
+			adj.push("chubby");
+		} else if (slave.belly > 1500) {
+			adj.push("plump");
+		} else if (slave.belly > 100) {
+			adj.push("bloated");
+			noun.push("tummy");
+		} else {
+			adj.push("flat");
+			noun = ["tummy"];
+		}
+		noun.push("stomach");
+		if (slave.belly > 5000) {
+			noun.push("paunch", "belly");
+		}
+	}
+	if (withNoun) {
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * Returns the description of the slave's clit
+ * @param {FC.HumanState} slave // admits V.PC as argument.
+ * @param {boolean} withNoun
+ * @returns {string}
+ */
+globalThis.clitDesc = function(slave, withNoun = true) {
+	if (!slave) {return "ERROR"}
+	if (slave.dick > 0) { // slaves with dicks don't have clits
+		return dickDesc(slave, withNoun);
+	}
+	if (slave.vagina < 0) { // no vagina, no vulva, no clit
+		return `lack of${withNoun ? " clitoris" : ""}`;
+	}
+	let adj = [];
+	let noun = ["clit"];
+	switch (slave.clit) {
+		case 0:
+			adj.push("", "cute", "average");
+			noun.push("clit", "clitoris", "button", "bud");
+			break;
+		case 1:
+			adj.push("large", "big");
+			break;
+		case 2:
+			adj.push("huge", "huge", "noticeable");
+			break;
+		case 3:
+			adj.push("enormous", "prominent", "protruding")
+			break;
+		case 4:
+			adj.push("penis-like", "dick-like", "phallus-like", "hypertrophied");
+			break;
+		default:
+			adj.push("massive penis-like", "elephantine phallic", "gigantic dick-like", "immense penis-like");
+			noun.push("megaclit", "clit", "vulva appendage");
+	}
+	if (withNoun) {
+		return `${jsEither(adj)} ${jsEither(noun)}`;
+	}
+	return `${jsEither(adj)}`;
+}
+
+/**
+ * @param {FC.HumanState} slave
+ * @returns {string}
+ */
+globalThis.bellyAdjective = function(slave) {
+	if (slave.belly >= 1500) {
+		if (slave.belly >= 1000000) {
+			if (slave.preg > slave.pregData.normalBirth / 4) {
+				return 'unfathomably distended, brimming with life';
+			} else {
+				return `unfathomable`;
+			}
+		} else if (slave.belly >= 750000) {
+			if (slave.preg > slave.pregData.normalBirth / 4) {
+				return 'monolithic bulging';
+			} else {
+				return `monolithic`;
+			}
+		} else if (slave.belly >= 600000) {
+			if (slave.preg > slave.pregData.normalBirth / 4) {
+				return 'titanic bulging';
+			} else {
+				return `titanic`;
+			}
+		} else if (slave.belly >= 450000) {
+			if (slave.preg > slave.pregData.normalBirth / 4) {
+				return 'gigantic bulgy';
+			} else {
+				return `gigantic`;
+			}
+		} else if (slave.belly >= 300000) {
+			return 'massive';
+		} else if (slave.belly >= 100000) {
+			return 'giant';
+		} else if (slave.belly >= 15000) {
+			return 'huge';
+		} else if (slave.belly >= 10000) {
+			return 'big';
+		} else {
+			return `swollen`;
+		}
+	}
+	return "";
+};
diff --git a/src/npc/interaction/fondleDick.js b/src/npc/interaction/fondleDick.js
index 8f9723da8bd6ed4653505afbbc1e65dd0b0b9059..3b62e446fd05ba7ce23c9c01304b4415a39d7670 100644
--- a/src/npc/interaction/fondleDick.js
+++ b/src/npc/interaction/fondleDick.js
@@ -73,7 +73,7 @@ App.Interact.fondleDick = function(slave) {
 	}
 
 	if (slave.fetish === Fetish.MINDBROKEN) {
-		r.push(`Like a doll, ${he} dumbly remains still, watching your hands move towards ${him} without any real interest. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`Like a doll, ${he} dumbly remains still, watching your hands move towards ${him} without any real interest. You gently trace your fingers along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		if (!canAchieveErection(slave)) {
 			r.push(`${His} dick remains flaccid as it cannot get stiff and you continue tenderly stroking ${his} soft dick but, ${he} does not respond.`);
@@ -82,7 +82,7 @@ App.Interact.fondleDick = function(slave) {
 		}
 		r.push(`Since ${he} is mindbroken, ${his} responses to you are purely physiological and your actions have no affect on ${him} mentally. You leave your toy for one of your other slaves to clean and maintain.`);
 	} else if (isAmputee(slave)) {
-		r.push(`Since ${he}'s a quadruple amputee, ${he}'s yours to use as a human finger toy. While ${he}'s lying there helpless, you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`Since ${he}'s a quadruple amputee, ${he}'s yours to use as a human finger toy. While ${he}'s lying there helpless, you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		if (!canAchieveErection(slave)) {
 			r.push(`${His} dick remains flaccid as it cannot get stiff and you continue tenderly stroking ${his} soft dick but, except for the cockmilk leaking out of ${his} dick, ${he} does not respond.`);
@@ -97,12 +97,12 @@ App.Interact.fondleDick = function(slave) {
 		}
 		r.push(`you as you stop moving your hands. You leave your toy for one of your other slaves to clean and maintain.`);
 	} else if (slave.fetish === Fetish.SUBMISSIVE && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
-		r.push(`${He} comes submissively over, smiling a little submissive smile, and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`${He} comes submissively over, smiling a little submissive smile, and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		standardStiffy();
 		r.push(`Soon, ${his} movements indicate that ${he} is orgasming. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands before submissively avoiding your gaze as you get cleaned up.`);
 	} else if (slave.devotion < -20) {
-		r.push(`${He} clearly dislikes the thought of getting ${his} dick fondled by you. ${His} lower lip quivers with trepidation as ${he} watches your hands move towards ${him}. ${He} has no choice but to obey if ${he} wants to avoid punishment. ${He} gasps and shakes as you gently trace along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`${He} clearly dislikes the thought of getting ${his} dick fondled by you. ${His} lower lip quivers with trepidation as ${he} watches your hands move towards ${him}. ${He} has no choice but to obey if ${he} wants to avoid punishment. ${He} gasps and shakes as you gently trace along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		standardStiffy();
 		r.push(`${He}`);
@@ -113,7 +113,7 @@ App.Interact.fondleDick = function(slave) {
 		}
 		r.push(`and tries to stop it from moving but is unable to and despite ${his} resistant pulling against you. ${He} bites ${his} lip but ${he} cannot help but moan. Soon ${he} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} looks at you shamefully as you stop moving your hands and get cleaned up.`);
 	} else if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
-		r.push(`${He} hurriedly comes over to you, to stand between you and your desk. You lean over while ${he} lies down upon it, face-up, with ${his} dick pointed towards you. ${He} gasps when you slap ${his} ${dickDesc()} with your hand. You firmly grab it and tightly squeeze it with your fingers, stroking your hand along its shaft.`);
+		r.push(`${He} hurriedly comes over to you, to stand between you and your desk. You lean over while ${he} lies down upon it, face-up, with ${his} dick pointed towards you. ${He} gasps when you slap ${his} ${dickDesc(slave)} with your hand. You firmly grab it and tightly squeeze it with your fingers, stroking your hand along its shaft.`);
 		if (slave.balls > 0) {
 			r.push(`Simultaneously, you slap ${his} ${ballDesc()} with your other hand.`);
 		}
@@ -121,7 +121,7 @@ App.Interact.fondleDick = function(slave) {
 		standardStiffy();
 		r.push(`Your rough play leaves red marks on ${his} breasts and nipples and ${he} becomes even more aroused. Soon, ${his} movements indicate that ${he} is orgasming. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} rubs the marks on ${his} dick and balls with ${his} hands, an ecstatic look on ${his} ${slave.skin} face. ${He} looks at you longingly as you get cleaned up, hungry for more.`);
 	} else if (slave.devotion <= 20) {
-		r.push(`${He} obeys silently, standing in front of you as you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`${He} obeys silently, standing in front of you as you move your hands towards ${him}. You gently trace your fingers along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		standardStiffy();
 		r.push(`${He}`);
@@ -138,7 +138,7 @@ App.Interact.fondleDick = function(slave) {
 		}
 		r.push(`moving to match your hand movements. ${He} moans and shudders, leaking ${his} cockmilk as ${he} orgasms in your hands. ${He} dutifully looks at you as you stop moving your hands and get cleaned up.`);
 	} else {
-		r.push(`${He} devotedly comes over and gives you an impassioned kiss. ${He} smiles and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc()} before taking it gently in one hand and tenderly stroking your hand along its`);
+		r.push(`${He} devotedly comes over and gives you an impassioned kiss. ${He} smiles and points ${his} dick towards you. You gently trace your fingers along ${his} ${dickDesc(slave)} before taking it gently in one hand and tenderly stroking your hand along its`);
 		strokeAndSqueeze();
 		standardStiffy();
 		r.push(`${He} begs you not to stop. Soon, ${he} moans and ${his} movements indicate that ${he} is about to orgasm. ${He} shudders and leaks ${his} cockmilk as ${he} orgasms in your hands. ${He} looks at you passionately as you stop moving your hands and get cleaned up.`);
@@ -166,32 +166,6 @@ App.Interact.fondleDick = function(slave) {
 		}
 	}
 
-	function dickDesc() {
-		if (slave.dick === 1) {
-			return `tiny dick`;
-		} else if (slave.dick === 2) {
-			return `cute dick`;
-		} else if (slave.dick === 3) {
-			return `dick`;
-		} else if (slave.dick === 4) {
-			return `big dick`;
-		} else if (slave.dick === 5) {
-			return `impressive dick`;
-		} else if (slave.dick === 6) {
-			return `huge dick`;
-		} else if (slave.dick === 7) {
-			return `gigantic dick`;
-		} else if (slave.dick === 8) {
-			return `titanic dick`;
-		} else if (slave.dick === 9) {
-			return `absurd dick`;
-		} else if (slave.dick === 10) {
-			return `inhuman dick`;
-		} else {
-			return `hypertrophied dick`;
-		}
-	}
-
 	function strokeAndSqueeze() {
 		if (slave.balls > 0) {
 			r.push(`shaft, while simultaneously cupping ${his} ${ballDesc()} with your other hand.`);
diff --git a/src/pregmod/editGenetics.js b/src/pregmod/editGenetics.js
index 3687cb665e01cbec4a2899a194e5ce25b6cbbb75..dd638361d4df679d0830c82070ae74431d9862fa 100644
--- a/src/pregmod/editGenetics.js
+++ b/src/pregmod/editGenetics.js
@@ -246,7 +246,7 @@ App.UI.editGenetics = function() {
 		cell.setAttribute("data-max", "3");
 
 		makeHeader(`Rear`);
-		cell = App.UI.DOM.appendNewElement("td", row, buttDesc(s.butt), ["editor", "number-editor"]);
+		cell = App.UI.DOM.appendNewElement("td", row, rearDesc(s.butt), ["editor", "number-editor"]);
 		cell.setAttribute("data-param", "butt");
 		cell.setAttribute("data-min", "0");
 		cell.setAttribute("data-max", "20");
@@ -313,7 +313,7 @@ App.UI.editGenetics = function() {
 			cell.setAttribute("data-max", "3");
 
 			makeHeader(`Clitoris`);
-			cell = App.UI.DOM.appendNewElement("td", row, clitDesc(s.clit), ["editor", "number-editor"]);
+			cell = App.UI.DOM.appendNewElement("td", row, clitorisDesc(s.clit), ["editor", "number-editor"]);
 			cell.setAttribute("data-param", "clit");
 			cell.setAttribute("data-min", "0");
 			cell.setAttribute("data-max", "5");
@@ -446,7 +446,7 @@ App.UI.editGenetics = function() {
 			'3': 'inhumanly wide'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
 	}
-	function buttDesc(s) {
+	function rearDesc(s) {
 		return ({
 			'0': 'flat',
 			'1': 'small',
@@ -497,7 +497,7 @@ App.UI.editGenetics = function() {
 			'3': 'huge dangling'
 		}[s] || 'unknown') + ' (' + Number(s) + ')';
 	}
-	function clitDesc(s) {
+	function clitorisDesc(s) {
 		return ({
 			'0': 'normal',
 			'1': 'large',