diff --git a/devTools/javaSanityCheck/SanityCheck.jar b/devTools/javaSanityCheck/SanityCheck.jar
index e7971c6d4f658b5427451dcd942522cc4a0780bf..f8d18c46a17e7426ef3e23c54cc7bc9ac96a609e 100644
Binary files a/devTools/javaSanityCheck/SanityCheck.jar and b/devTools/javaSanityCheck/SanityCheck.jar differ
diff --git a/devTools/javaSanityCheck/excluded b/devTools/javaSanityCheck/excluded
index 58f7edccba9af9ebbdc4f7f14b607cb0ea8ca1e6..6eeea37b1bfcf3a7d3e5c4750514f7cac5c40f9b 100644
--- a/devTools/javaSanityCheck/excluded
+++ b/devTools/javaSanityCheck/excluded
@@ -15,3 +15,4 @@ src/SecExp/js/secExp.js;O
 src/js/economyJS.js;S
 src/npc/assistant/assistant.js;O
 src/data/backwardsCompatibility/backwardsCompatibility.js;O
+src/data/backwardsCompatibility/datatypeCleanup.js;S
diff --git a/devTools/javaSanityCheck/htmlTags b/devTools/javaSanityCheck/htmlTags
index f47666e085ad5cf69751eede6294385a905ca051..e999ad1f5046a679067dc6215fa6816f9d41cd9a 100644
--- a/devTools/javaSanityCheck/htmlTags
+++ b/devTools/javaSanityCheck/htmlTags
@@ -18,6 +18,7 @@ br;0
 button;1
 caption;1
 center;1
+code;1
 dd;1
 div;1
 dl;1
diff --git a/devTools/javaSanityCheck/sources.zip b/devTools/javaSanityCheck/sources.zip
index 08024e87a312fddd55422916c6381160d48d12fe..0556ade3e1b3eb6bcfc052d340fae308dc4b4aec 100644
Binary files a/devTools/javaSanityCheck/sources.zip and b/devTools/javaSanityCheck/sources.zip differ
diff --git a/src/002-config/mousetrapConfig.js b/src/002-config/mousetrapConfig.js
index c82ac4be193661aef007b894ecbb0a50630f938a..ffcfcb7b0d3da9e458b5d6d55e630b34349bf52a 100644
--- a/src/002-config/mousetrapConfig.js
+++ b/src/002-config/mousetrapConfig.js
@@ -29,7 +29,7 @@ App.UI.Hotkeys = (function() {
 	const bindings = {};
 
 	/**
-	 * To ensure we only record one at at time
+	 * To ensure we only record one at a time
 	 * @type {boolean}
 	 */
 	let recording = false;
diff --git a/src/003-assets/CSS/tooltip.css b/src/003-assets/CSS/tooltip.css
deleted file mode 100644
index 719d9e6bd315955439b5c7480bf150a143fec72a..0000000000000000000000000000000000000000
--- a/src/003-assets/CSS/tooltip.css
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * pure CSS tooltip
- * based on https://codeconvey.com/pure-html5-css-tooltips-using-title-data-attribute/
- */
-.exampleTooltip, .devotion, .trust, .defiant {
-	position: relative;
-	display: inline;
-}
-
-.exampleTooltip:after, .devotion:after, .trust:after, .defiant:after {
-	display: block;
-	visibility: hidden;
-	position: absolute;
-	font-size: smaller;
-	width: 20em;
-	height: auto;
-	background-color: slategray;
-	color: black;
-	text-decoration: none;
-	font-style: normal;
-	text-align: center;
-	border-radius: 3px;
-	padding: 5px;
-	z-index: 999;
-	bottom: 0;
-	left: 10px;
-}
-
-.exampleTooltip:after {
-	content: "I am a helpful tooltip. We are very rare because we are still in development.";
-}
-
-.devotion:after {
-	content: "Devotion is a measure of a slave's love for you.";
-}
-
-.trust:after {
-	content: "Trust is a measure of a slave's expectations of you and confidence to perform well.";
-}
-
-.defiant:after {
-	content: "Defiant slaves will actively work against you.";
-}
-
-/* makes the arrow */
-.exampleTooltip:before, .devotion:before, .trust:before, .defiant:before {
-	position: absolute;
-	visibility: hidden;
-	width: 0;
-	height: 0;
-	left: 20px;
-	bottom: 0;
-	opacity: 0;
-	content: "";
-	border-style: solid;
-	border-width: 6px 6px 0 6px;
-	border-color: slategray transparent transparent transparent;
-	z-index: 999;
-}
-
-div.tooltipsEnabled .exampleTooltip:hover:after, div.tooltipsEnabled .devotion:hover:after, div.tooltipsEnabled .trust:hover:after, div.tooltipsEnabled .defiant:hover:after {
-	visibility: visible;
-	opacity: 1;
-	bottom: 20px;
-}
-
-div.tooltipsEnabled .exampleTooltip:hover:before, div.tooltipsEnabled .devotion:hover:before, div.tooltipsEnabled .trust:hover:before, div.tooltipsEnabled .defiant:hover:before {
-	visibility: visible;
-	opacity: 1;
-	bottom: 15px;
-}
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 4a37982a50aecc22e18309411ecf3bbbde1c2565..d4693f1c0875022a56fe0e8cc5d3e8860e511b7e 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -1173,6 +1173,14 @@ App.Update.globalVariables = function(node) {
 		V.StudCum = Math.max(+V.StudCum, 0) || 0;
 	}
 
+	// Recalculate finished prosthetics
+	V.adjustProstheticsCompleted = 0;
+	for (const prosthetic of V.adjustProsthetics) {
+		if (prosthetic.workLeft <= 0) {
+			V.adjustProstheticsCompleted++;
+		}
+	}
+
 	EconomyDatatypeCleanup();
 	ArcologyDatatypeCleanup();
 
diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js
index 1bef5b03cfae8bf73f6760523dced021239e3421..85876b9935cfac41f0037d3c3169eec686a75eea 100644
--- a/src/endWeek/saGetMilked.js
+++ b/src/endWeek/saGetMilked.js
@@ -901,94 +901,7 @@ App.SlaveAssignment.getMilked = (function() {
 
 	// FACILITY DECORATION IMPACTS
 	function applyFSDecoration() {
-		if (V.dairyDecoration !== "standard") {
-			let fsGain = Math.min(0.0001 * V.FSSingleSlaveRep * (milk + (5 * cum)), 1);
-			switch (V.dairyDecoration) {
-				case "Roman Revivalist":
-					arcology.FSRomanRevivalist = Math.clamp(arcology.FSRomanRevivalist += fsGain, 0, 100);
-					break;
-				case "Aztec Revivalist":
-					arcology.FSAztecRevivalist = Math.clamp(arcology.FSAztecRevivalist += fsGain, 0, 100);
-					break;
-				case "Egyptian Revivalist":
-					arcology.FSEgyptianRevivalist = Math.clamp(arcology.FSEgyptianRevivalist += fsGain, 0, 100);
-					break;
-				case "Edo Revivalist":
-					arcology.FSEdoRevivalist = Math.clamp(arcology.FSEdoRevivalist += fsGain, 0, 100);
-					break;
-				case "Arabian Revivalist":
-					arcology.FSArabianRevivalist = Math.clamp(arcology.FSArabianRevivalist += fsGain, 0, 100);
-					break;
-				case "Chinese Revivalist":
-					arcology.FSChineseRevivalist = Math.clamp(arcology.FSChineseRevivalist += fsGain, 0, 100);
-					break;
-				case "Chattel Religionist":
-					arcology.FSChattelReligionist = Math.clamp(arcology.FSChattelReligionist += fsGain, 0, 100);
-					break;
-				case "Degradationist":
-					arcology.FSDegradationist = Math.clamp(arcology.FSDegradationist += fsGain, 0, 100);
-					break;
-				case "Repopulation Focus":
-					arcology.FSRepopulationFocus = Math.clamp(arcology.FSRepopulationFocus += fsGain, 0, 100);
-					break;
-				case "Eugenics":
-					arcology.FSRestart = Math.clamp(arcology.FSRestart += fsGain, 0, 100);
-					break;
-				case "Asset Expansionist":
-					arcology.FSAssetExpansionist = Math.clamp(arcology.FSAssetExpansionist += fsGain, 0, 100);
-					break;
-				case "Transformation Fetishist":
-					arcology.FSTransformationFetishist = Math.clamp(arcology.FSTransformationFetishist += fsGain, 0, 100);
-					break;
-				case "Gender Radicalist":
-					arcology.FSGenderRadicalist = Math.clamp(arcology.FSGenderRadicalist += fsGain, 0, 100);
-					break;
-				case "Gender Fundamentalist":
-					arcology.FSGenderFundamentalist = Math.clamp(arcology.FSGenderFundamentalist += fsGain, 0, 100);
-					break;
-				case "Physical Idealist":
-					arcology.FSPhysicalIdealist = Math.clamp(arcology.FSPhysicalIdealist += fsGain, 0, 100);
-					break;
-				case "Hedonistic":
-					arcology.FSHedonisticDecadence = Math.clamp(arcology.FSHedonisticDecadence += fsGain, 0, 100);
-					break;
-				case "Supremacist":
-					arcology.FSSupremacist = Math.clamp(arcology.FSSupremacist += fsGain, 0, 100);
-					break;
-				case "Subjugationist":
-					arcology.FSSubjugationist = Math.clamp(arcology.FSSubjugationist += fsGain, 0, 100);
-					break;
-				case "Paternalist":
-					arcology.FSPaternalist = Math.clamp(arcology.FSPaternalist += fsGain, 0, 100);
-					break;
-				case "Pastoralist":
-					arcology.FSPastoralist = Math.clamp(arcology.FSPastoralist += fsGain, 0, 100);
-					break;
-				case "Maturity Preferentialist":
-					arcology.FSMaturityPreferentialist = Math.clamp(arcology.FSMaturityPreferentialist += fsGain, 0, 100);
-					break;
-				case "Youth Preferentialist":
-					arcology.FSYouthPreferentialist = Math.clamp(arcology.FSYouthPreferentialist += fsGain, 0, 100);
-					break;
-				case "Body Purist":
-					arcology.FSBodyPurist = Math.clamp(arcology.FSBodyPurist += fsGain, 0, 100);
-					break;
-				case "Slimness Enthusiast":
-					arcology.FSSlimnessEnthusiast = Math.clamp(arcology.FSSlimnessEnthusiast += fsGain, 0, 100);
-					break;
-				case "Slave Professionalism":
-					arcology.FSSlaveProfessionalism = Math.clamp(arcology.FSSlaveProfessionalism += fsGain, 0, 100);
-					break;
-				case "Intellectual Dependency":
-					arcology.FSIntellectualDependency = Math.clamp(arcology.FSIntellectualDependency += fsGain, 0, 100);
-					break;
-				case "Petite Admiration":
-					arcology.FSPetiteAdmiration = Math.clamp(arcology.FSPetiteAdmiration += fsGain, 0, 100);
-					break;
-				case "Statuesque Glorification":
-					arcology.FSStatuesqueGlorification = Math.clamp(arcology.FSStatuesqueGlorification += fsGain, 0, 100);
-					break;
-			}
-		}
+		const fsGain = 0.0001 * (milk + (5 * cum));
+		FutureSocieties.DecorationBonus(V.dairyDecoration, fsGain);
 	}
 })();
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index b375f8295923506ae842a94095021e3aef21b82d..8c9154842949a567c4682d988f682d3d3ee6b23d 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1260,94 +1260,8 @@ App.SlaveAssignment.serveThePublic = (function() {
 	 *
 	 */
 	function applyFSDecoration(slave) {
-		/* FACILITY DECORATION IMPACTS */
-		const fsBeauty = (0.0005 * V.FSSingleSlaveRep * slave.sexAmount);
-		switch (V.clubDecoration) {
-			case "Roman Revivalist":
-				arcology.FSRomanRevivalist += fsBeauty;
-				break;
-			case "Aztec Revivalist":
-				arcology.FSAztecRevivalist += fsBeauty;
-				break;
-			case "Egyptian Revivalist":
-				arcology.FSEgyptianRevivalist += fsBeauty;
-				break;
-			case "Edo Revivalist":
-				arcology.FSEdoRevivalist += fsBeauty;
-				break;
-			case "Arabian Revivalist":
-				arcology.FSArabianRevivalist += fsBeauty;
-				break;
-			case "Chinese Revivalist":
-				arcology.FSChineseRevivalist += fsBeauty;
-				break;
-			case "Chattel Religionist":
-				arcology.FSChattelReligionist += fsBeauty;
-				break;
-			case "Degradationist":
-				arcology.FSDegradationist += fsBeauty;
-				break;
-			case "Asset Expansionist":
-				arcology.FSAssetExpansionist += fsBeauty;
-				break;
-			case "Transformation Fetishist":
-				arcology.FSTransformationFetishist += fsBeauty;
-				break;
-			case "Gender Radicalist":
-				arcology.FSGenderRadicalist += fsBeauty;
-				break;
-			case "Repopulation Focus":
-				arcology.FSRepopulationFocus += fsBeauty;
-				break;
-			case "Eugenics":
-				arcology.FSRestart += fsBeauty;
-				break;
-			case "Gender Fundamentalist":
-				arcology.FSGenderFundamentalist += fsBeauty;
-				break;
-			case "Physical Idealist":
-				arcology.FSPhysicalIdealist += fsBeauty;
-				break;
-			case "Hedonistic":
-				arcology.FSHedonisticDecadence += fsBeauty;
-				break;
-			case "Supremacist":
-				arcology.FSSupremacist += fsBeauty;
-				break;
-			case "Subjugationist":
-				arcology.FSSubjugationist += fsBeauty;
-				break;
-			case "Paternalist":
-				arcology.FSPaternalist += fsBeauty;
-				break;
-			case "Pastoralist":
-				arcology.FSPastoralist += fsBeauty;
-				break;
-			case "Maturity Preferentialist":
-				arcology.FSMaturityPreferentialist += fsBeauty;
-				break;
-			case "Youth Preferentialist":
-				arcology.FSYouthPreferentialist += fsBeauty;
-				break;
-			case "Body Purist":
-				arcology.FSBodyPurist += fsBeauty;
-				break;
-			case "Slimness Enthusiast":
-				arcology.FSSlimnessEnthusiast += fsBeauty;
-				break;
-			case "Slave Professionalism":
-				arcology.FSSlaveProfessionalism += fsBeauty;
-				break;
-			case "Intellectual Dependency":
-				arcology.FSIntellectualDependency += fsBeauty;
-				break;
-			case "Petite Admiration":
-				arcology.FSPetiteAdmiration += fsBeauty;
-				break;
-			case "Statuesque Glorification":
-				arcology.FSStatuesqueGlorification += fsBeauty;
-				break;
-		}
+		const fsBeauty = 0.0005 * slave.sexAmount;
+		FutureSocieties.DecorationBonus(V.clubDecoration, fsBeauty);
 	}
 
 	/**
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index 36289d69324cf059c4859ce9c1d4c650d139d53a..8b278a575e52119b285bccb81cadf7626608882f 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -1334,93 +1334,8 @@ App.SlaveAssignment.whore = (function() {
 	 */
 	function applyFSDecoration() {
 		/* FACILITY DECORATION IMPACTS */
-		const fsBeauty = (0.0005 * V.FSSingleSlaveRep * beauty);
-		switch (V.brothelDecoration) {
-			case "Roman Revivalist":
-				arcology.FSRomanRevivalist += fsBeauty;
-				break;
-			case "Aztec Revivalist":
-				arcology.FSAztecRevivalist += fsBeauty;
-				break;
-			case "Egyptian Revivalist":
-				arcology.FSEgyptianRevivalist += fsBeauty;
-				break;
-			case "Edo Revivalist":
-				arcology.FSEdoRevivalist += fsBeauty;
-				break;
-			case "Arabian Revivalist":
-				arcology.FSArabianRevivalist += fsBeauty;
-				break;
-			case "Chinese Revivalist":
-				arcology.FSChineseRevivalist += fsBeauty;
-				break;
-			case "Chattel Religionist":
-				arcology.FSChattelReligionist += fsBeauty;
-				break;
-			case "Degradationist":
-				arcology.FSDegradationist += fsBeauty;
-				break;
-			case "Asset Expansionist":
-				arcology.FSAssetExpansionist += fsBeauty;
-				break;
-			case "Transformation Fetishist":
-				arcology.FSTransformationFetishist += fsBeauty;
-				break;
-			case "Gender Radicalist":
-				arcology.FSGenderRadicalist += fsBeauty;
-				break;
-			case "Repopulation Focus":
-				arcology.FSRepopulationFocus += fsBeauty;
-				break;
-			case "Eugenics":
-				arcology.FSRestart += fsBeauty;
-				break;
-			case "Gender Fundamentalist":
-				arcology.FSGenderFundamentalist += fsBeauty;
-				break;
-			case "Physical Idealist":
-				arcology.FSPhysicalIdealist += fsBeauty;
-				break;
-			case "Hedonistic":
-				arcology.FSHedonisticDecadence += fsBeauty;
-				break;
-			case "Supremacist":
-				arcology.FSSupremacist += fsBeauty;
-				break;
-			case "Subjugationist":
-				arcology.FSSubjugationist += fsBeauty;
-				break;
-			case "Paternalist":
-				arcology.FSPaternalist += fsBeauty;
-				break;
-			case "Pastoralist":
-				arcology.FSPastoralist += fsBeauty;
-				break;
-			case "Maturity Preferentialist":
-				arcology.FSMaturityPreferentialist += fsBeauty;
-				break;
-			case "Youth Preferentialist":
-				arcology.FSYouthPreferentialist += fsBeauty;
-				break;
-			case "Body Purist":
-				arcology.FSBodyPurist += fsBeauty;
-				break;
-			case "Slimness Enthusiast":
-				arcology.FSSlimnessEnthusiast += fsBeauty;
-				break;
-			case "Slave Professionalism":
-				arcology.FSSlaveProfessionalism += fsBeauty;
-				break;
-			case "Intellectual Dependency":
-				arcology.FSIntellectualDependency += fsBeauty;
-				break;
-			case "Petite Admiration":
-				arcology.FSPetiteAdmiration += fsBeauty;
-				break;
-			case "Statuesque Glorification":
-				arcology.FSStatuesqueGlorification += fsBeauty;
-				break;
-		}
+		const fsBeauty = 0.0005 * beauty;
+		FutureSocieties.DecorationBonus(V.brothelDecoration, fsBeauty);
 	}
 
 	/**
diff --git a/src/endWeek/saWorkAGloryHole.js b/src/endWeek/saWorkAGloryHole.js
index 4a5dacf8093322fff3e13b6ce70b854005141f3a..18eebdd88eec4f52b8a45c49dd04e9ec44b0824e 100644
--- a/src/endWeek/saWorkAGloryHole.js
+++ b/src/endWeek/saWorkAGloryHole.js
@@ -309,95 +309,9 @@ App.SlaveAssignment.workAGloryHole = (function() {
 	 *
 	 */
 	function applyFSDecoration(slave) {
-		/* FACILITY DECORATION IMPACTS */
-		if (slave.assignment === window.Job.ARCADE && V.arcadeDecoration !== "standard") {
-			const impact = (0.0001 * V.FSSingleSlaveRep * beauty);
-			switch (V.arcadeDecoration) {
-				case "Roman Revivalist":
-					V.arcologies[0].FSRomanRevivalist += impact;
-					break;
-				case "Aztec Revivalist":
-					V.arcologies[0].FSAztecRevivalist += impact;
-					break;
-				case "Egyptian Revivalist":
-					V.arcologies[0].FSEgyptianRevivalist += impact;
-					break;
-				case "Edo Revivalist":
-					V.arcologies[0].FSEdoRevivalist += impact;
-					break;
-				case "Arabian Revivalist":
-					V.arcologies[0].FSArabianRevivalist += impact;
-					break;
-				case "Chinese Revivalist":
-					V.arcologies[0].FSChineseRevivalist += impact;
-					break;
-				case "Repopulation Focus":
-					V.arcologies[0].FSRepopulationFocus += impact;
-					break;
-				case "Eugenics":
-					V.arcologies[0].FSRestart += impact;
-					break;
-				case "Chattel Religionist":
-					V.arcologies[0].FSChattelReligionist += impact;
-					break;
-				case "Degradationist":
-					V.arcologies[0].FSDegradationist += impact;
-					break;
-				case "Asset Expansionist":
-					V.arcologies[0].FSAssetExpansionist += impact;
-					break;
-				case "Transformation Fetishist":
-					V.arcologies[0].FSTransformationFetishist += impact;
-					break;
-				case "Gender Radicalist":
-					V.arcologies[0].FSGenderRadicalist += impact;
-					break;
-				case "Gender Fundamentalist":
-					V.arcologies[0].FSGenderFundamentalist += impact;
-					break;
-				case "Physical Idealist":
-					V.arcologies[0].FSPhysicalIdealist += impact;
-					break;
-				case "Hedonistic":
-					V.arcologies[0].FSHedonisticDecadence += impact;
-					break;
-				case "Supremacist":
-					V.arcologies[0].FSSupremacist += impact;
-					break;
-				case "Subjugationist":
-					V.arcologies[0].FSSubjugationist += impact;
-					break;
-				case "Paternalist":
-					V.arcologies[0].FSPaternalist += impact;
-					break;
-				case "Pastoralist":
-					V.arcologies[0].FSPastoralist += impact;
-					break;
-				case "Maturity Preferentialist":
-					V.arcologies[0].FSMaturityPreferentialist += impact;
-					break;
-				case "Youth Preferentialist":
-					V.arcologies[0].FSYouthPreferentialist += impact;
-					break;
-				case "Body Purist":
-					V.arcologies[0].FSBodyPurist += impact;
-					break;
-				case "Slimness Enthusiast":
-					V.arcologies[0].FSSlimnessEnthusiast += impact;
-					break;
-				case "Slave Professionalism":
-					V.arcologies[0].FSSlaveProfessionalism += impact;
-					break;
-				case "Intellectual Dependency":
-					V.arcologies[0].FSIntellectualDependency += impact;
-					break;
-				case "Petite Admiration":
-					V.arcologies[0].FSPetiteAdmiration += impact;
-					break;
-				case "Statuesque Glorification":
-					V.arcologies[0].FSStatuesqueGlorification += impact;
-					break;
-			}
+		if (slave.assignment === Job.ARCADE) {
+			const impact = (0.0001 * beauty);
+			FutureSocieties.DecorationBonus(V.arcadeDecoration, impact);
 		}
 	}
 
diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js
index 14a9f87f1e26063fdc2d28cd50662a26851d458c..274cfd76de013a243bc21773a4a585672bae33dd 100644
--- a/src/endWeek/saWorkTheFarm.js
+++ b/src/endWeek/saWorkTheFarm.js
@@ -558,96 +558,9 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 
 	// Close Vignettes
 
-	// Open Facility Decorations
-
-	if (V.farmyardDecoration !== "standard") {
-		const fsGain = Math.min(0.0001 * V.FSSingleSlaveRep * (food), 1);
-		switch (V.farmyardDecoration) {
-			case "Roman Revivalist":
-				arcology.FSRomanRevivalist = Math.clamp(arcology.FSRomanRevivalist += fsGain, 0, 100);
-				break;
-			case "Aztec Revivalist":
-				arcology.FSAztecRevivalist = Math.clamp(arcology.FSAztecRevivalist += fsGain, 0, 100);
-				break;
-			case "Egyptian Revivalist":
-				arcology.FSEgyptianRevivalist = Math.clamp(arcology.FSEgyptianRevivalist += fsGain, 0, 100);
-				break;
-			case "Edo Revivalist":
-				arcology.FSEdoRevivalist = Math.clamp(arcology.FSEdoRevivalist += fsGain, 0, 100);
-				break;
-			case "Arabian Revivalist":
-				arcology.FSArabianRevivalist = Math.clamp(arcology.FSArabianRevivalist += fsGain, 0, 100);
-				break;
-			case "Chinese Revivalist":
-				arcology.FSChineseRevivalist = Math.clamp(arcology.FSChineseRevivalist += fsGain, 0, 100);
-				break;
-			case "Chattel Religionist":
-				arcology.FSChattelReligionist = Math.clamp(arcology.FSChattelReligionist += fsGain, 0, 100);
-				break;
-			case "Degradationist":
-				arcology.FSDegradationist = Math.clamp(arcology.FSDegradationist += fsGain, 0, 100);
-				break;
-			case "Repopulation Focus":
-				arcology.FSRepopulationFocus = Math.clamp(arcology.FSRepopulationFocus += fsGain, 0, 100);
-				break;
-			case "Eugenics":
-				arcology.FSRestart = Math.clamp(arcology.FSRestart += fsGain, 0, 100);
-				break;
-			case "Asset Expansionist":
-				arcology.FSAssetExpansionist = Math.clamp(arcology.FSAssetExpansionist += fsGain, 0, 100);
-				break;
-			case "Transformation Fetishist":
-				arcology.FSTransformationFetishist = Math.clamp(arcology.FSTransformationFetishist += fsGain, 0, 100);
-				break;
-			case "Gender Radicalist":
-				arcology.FSGenderRadicalist = Math.clamp(arcology.FSGenderRadicalist += fsGain, 0, 100);
-				break;
-			case "Gender Fundamentalist":
-				arcology.FSGenderFundamentalist = Math.clamp(arcology.FSGenderFundamentalist += fsGain, 0, 100);
-				break;
-			case "Physical Idealist":
-				arcology.FSPhysicalIdealist = Math.clamp(arcology.FSPhysicalIdealist += fsGain, 0, 100);
-				break;
-			case "Hedonistic":
-				arcology.FSHedonisticDecadence = Math.clamp(arcology.FSHedonisticDecadence += fsGain, 0, 100);
-				break;
-			case "Supremacist":
-				arcology.FSSupremacist = Math.clamp(arcology.FSSupremacist += fsGain, 0, 100);
-				break;
-			case "Subjugationist":
-				arcology.FSSubjugationist = Math.clamp(arcology.FSSubjugationist += fsGain, 0, 100);
-				break;
-			case "Paternalist":
-				arcology.FSPaternalist = Math.clamp(arcology.FSPaternalist += fsGain, 0, 100);
-				break;
-			case "Pastoralist":
-				arcology.FSPastoralist = Math.clamp(arcology.FSPastoralist += fsGain, 0, 100);
-				break;
-			case "Maturity Preferentialist":
-				arcology.FSMaturityPreferentialist = Math.clamp(arcology.FSMaturityPreferentialist += fsGain, 0, 100);
-				break;
-			case "Youth Preferentialist":
-				arcology.FSYouthPreferentialist = Math.clamp(arcology.FSYouthPreferentialist += fsGain, 0, 100);
-				break;
-			case "Body Purist":
-				arcology.FSBodyPurist = Math.clamp(arcology.FSBodyPurist += fsGain, 0, 100);
-				break;
-			case "Slimness Enthusiast":
-				arcology.FSSlimnessEnthusiast = Math.clamp(arcology.FSSlimnessEnthusiast += fsGain, 0, 100);
-				break;
-			case "Slave Professionalism":
-				arcology.FSSlaveProfessionalism = Math.clamp(arcology.FSSlaveProfessionalism += fsGain, 0, 100);
-				break;
-			case "Intellectual Dependency":
-				arcology.FSIntellectualDependency = Math.clamp(arcology.FSIntellectualDependency += fsGain, 0, 100);
-				break;
-			case "Petite Admiration":
-				arcology.FSPetiteAdmiration = Math.clamp(arcology.FSPetiteAdmiration += fsGain, 0, 100);
-				break;
-			case "Statuesque Glorification":
-				arcology.FSStatuesqueGlorification = Math.clamp(arcology.FSStatuesqueGlorification += fsGain, 0, 100);
-				break;
-		}
-	}
+	// Facility Decorations
+	const fsGain = 0.0001 * food;
+	FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain);
+
 	return t;
 };
diff --git a/src/facilities/ads.js b/src/facilities/ads.js
index 63def7e87a51661064f5821c76ac63bb851929cb..2cc8ec00a2051e9e1a134e9101c87b5943f29c6b 100644
--- a/src/facilities/ads.js
+++ b/src/facilities/ads.js
@@ -394,7 +394,7 @@ App.Ads.report = function(building, preview) {
 			} else if (adCampaign.stacked === -1) {
 				t += `Its advertisements feature trim girls with little in the way of T&A. `;
 			} else {
-			t += `Its advertisements feature a variety of girls, some that are trim and others that are curvaceous. `;
+				t += `Its advertisements feature a variety of girls, some that are trim and others that are curvaceous. `;
 			}
 			t += `</div>`;
 		}
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
index 4fa0c863e9e028a14206a878c88c190e3c7e1d2d..f2222c9761bfa04c1fdcf81703b4a16098281770 100644
--- a/src/facilities/nursery/nursery.tw
+++ b/src/facilities/nursery/nursery.tw
@@ -224,7 +224,7 @@ Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $
 				<<set _pregWeek = $slaves[_u].pregWeek>>
 				<<set _slaveName = SlaveFullName($slaves[_u])>>
 				<div class="possible" @id="_slaveId" @data-preg-count="_WL" @data-reserved-spots="_reservedNursery" @data-preg-week="_pregWeek" @data-name="_slaveName">
-				<<print "[[_slaveName|Long Slave Description][$activeSlave = $slaves[" + _u + "], $nextLink = passage()]]">> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with
+				<<= App.UI.slaveDescriptionDialog($slaves[_u])>> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with
 				<<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>>
 				<<elseif $slaves[_u].pregSource == -1>>your
 				<<elseif $slaves[_u].pregSource == -2>>a citizen's
diff --git a/src/facilities/nursery/widgets/utils/nurseryUtils.js b/src/facilities/nursery/widgets/utils/nurseryUtils.js
index a189ed588a38b647cfad8655fe7b81ce8547f376..c2e3edb40ac58e61dd3e1ae2a21727fe188e4c39 100644
--- a/src/facilities/nursery/widgets/utils/nurseryUtils.js
+++ b/src/facilities/nursery/widgets/utils/nurseryUtils.js
@@ -755,7 +755,7 @@ App.Facilities.Nursery.nurserySort = function nurserySort() {
 
 				r += `<div class="possible" @id="${slaveID}" @data-preg-count="${WL}" @data-reserved-spots="${reservedNursery}" @data-preg-week="${pregWeek}" @data-name="${slaveName}">`;
 
-				r += `${App.UI.passageLink(`${slaveName}`, "Long Slave Description", `${V.activeSlave = slave}, ${V.nextLink = passage()}`)} is ${pregWeek} weeks pregnant with `;
+				r += `${App.UI.SlaveDescriptionDialog(slave)} is ${pregWeek} weeks pregnant with `;
 
 				switch (slave.pregSource) {
 					case 0:
diff --git a/src/gui/options/options.tw b/src/gui/options/options.tw
index 0e9795e5680bfbad00d784b9423d087cfe1b9fda..46bd823470bfb6f6f3a1375c1257db830ed263f3 100644
--- a/src/gui/options/options.tw
+++ b/src/gui/options/options.tw
@@ -32,7 +32,7 @@
 
 <div>
 	This save was created using FC version $ver build $releaseID. You are currently playing version: <<= App.Version.base>>, mod version: <<= App.Version.pmod>>, build: <<= App.Version.release>><<if App.Version.commitHash>>, commit: <<= App.Version.commitHash>><</if>>
-<div>
+</div>
 <div class="indent">
 	[[Apply Backwards Compatibility Update|Backwards Compatibility]]
 	<<if $secExpEnabled == 1>>
diff --git a/src/gui/tooltips.js b/src/gui/tooltips.js
new file mode 100644
index 0000000000000000000000000000000000000000..b821534873d7be11baabcc19c973a73f3067f71d
--- /dev/null
+++ b/src/gui/tooltips.js
@@ -0,0 +1,55 @@
+(function() {
+	// The performance impact is around O(tooltips * nodes), with large passages (main, slave assignment report) adding
+	// tooltips could potentially take a significant amount of time when there are many potential tooltips.
+	const tooltips = {
+		exampleTooltip: "I am a helpful tooltip. We are very rare because we are still in development.",
+
+		devotion: "Devotion is a measure of a slave's love for you.",
+		trust: "Trust is a measure of a slave's expectations of you and confidence to perform well.",
+		defiant: "Defiant slaves will actively work against you.",
+
+		flaw: "Flaws impend your slaves performance. Try removing or converting them into quirks.",
+		intelligent: "More intelligent slaves tend to perform better.",
+		health: "The healthier your slaves, the better they perform.",
+		positive: "This is good.",
+		// noteworthy: "This is important.",
+		warning: "This is very bad. Try removing the cause for this.",
+
+		error: "Something just broke. Please report this.",
+
+		cash: "Money. Always useful.",
+		reputation: "Your reputation as a slaveowner. The more, the better.",
+		/*
+		skill: "t",
+		fetish: "t",
+		relationship: "t",
+		change: "t",
+		virginity: "t",
+		pregnant: "t",
+		stupid: "t",
+		education: "t",
+		*/
+	};
+
+	/**
+	 * @param {HTMLElement} container
+	 */
+	function addTooltips(container) {
+		if (V.tooltipsEnabled === 0) {
+			return;
+		}
+		for (const tooltipsKey in tooltips) {
+			const elements = container.getElementsByClassName(tooltipsKey);
+			for (const element of elements) {
+				element.title += `${tooltips[tooltipsKey]}\n`;
+			}
+		}
+	}
+
+	// passage
+	$(document).on(':passagerender', e => addTooltips(e.content));
+	// story caption
+	$(document).on(':passageend', () => addTooltips(document.getElementById("story-caption")));
+	// dialog
+	$(document).on(':dialogopening', e => addTooltips(e.target));
+})();
diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 3e4d868891266afe5e50cb12e934b676bbea274f..2e97d25564d2f57542eb635e44a231c047e0a389 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -410,6 +410,16 @@ globalThis.getNonlocalPronouns = function(dickRatio) {
 	return getPronouns(slave);
 };
 
+/** Get the origin for a given slave, with the correct pronouns.
+ * @param {App.Entity.SlaveState} slave
+ * @param {string} prop
+ * @returns {string}
+ */
+globalThis.pronounsForSlaveProp = function(slave, prop) {
+	const pronouns = getPronouns(slave);
+	return prop.replace(/\$([A-Z]?[a-z]+)/g, (match, cap1) => pronouns[cap1] || match);
+};
+
 /** Get the written title for a given slave, without messing with global state.
  * @param {App.Entity.SlaveState} slave
  * @returns {string}
diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js
index c467ec7bcb5b56fab5970e9e910ba256e1a11444..9ab734dfd28864e16f266cb1827f00fe78e56243 100644
--- a/src/js/extendedFamilyModeJS.js
+++ b/src/js/extendedFamilyModeJS.js
@@ -279,7 +279,7 @@ globalThis.mutualChildren = function(slave1, slave2, slaves) {
 
 /** Returns a random slave related to a given entity
  * @param {Relative} slave
- * @param {function(App.Entity.SlaveState): boolean} filterFunction
+ * @param {function(App.Entity.SlaveState): boolean} [filterFunction]
  * @returns {App.Entity.SlaveState}
  */
 globalThis.randomRelatedSlave = function(slave, filterFunction) {
diff --git a/src/js/futureSocietyJS.js b/src/js/futureSocietyJS.js
index cfba77e9bdf49917629d0406c1d60cd714e0ce15..25ae6ddfa38a2932d80225df6830d3044219d7af 100644
--- a/src/js/futureSocietyJS.js
+++ b/src/js/futureSocietyJS.js
@@ -100,6 +100,7 @@ globalThis.FutureSocieties = (function() {
 		overflowToInfluence: overflowToInfluence,
 		remove: removeFS,
 		DecorationCleanup: DecorationCleanup,
+		DecorationBonus: FSDecorationBonus,
 		Change: FSChange,
 		ChangePorn: FSChangePorn,
 		HighestDecoration: FSHighestDecoration
@@ -438,6 +439,25 @@ globalThis.FutureSocieties = (function() {
 		}
 	}
 
+	/** Apply the decoration bonus for a slave working in a facility to the FS
+	 * call as FutureSocieties.DecorationBonus()
+	 * @param {string} decoration - not quoted, just pass it straight in
+	 * @param {number} magnitude - will be multiplied by V.FSSingleSlaveRep
+	 */
+	function FSDecorationBonus(decoration, magnitude) {
+		if (decoration === "standard") {
+			return; // no bonus
+		}
+
+		const FSString = decoration.replace(/ /g, ''); // removes spaces
+		const FSProp = FSString2Property[FSString]; // gets the property name
+		const arc = V.arcologies[0];
+
+		if (FSProp && Number.isFinite(arc[FSProp])) {
+			arc[FSProp] = Math.clamp(arc[FSProp] + magnitude * V.FSSingleSlaveRep, 0, 100);
+		}
+	}
+
 	/* call as FutureSocieties.Change() */
 	/* FSString should be in the FSString2Property object above */
 	function FSChange(FSString, magnitude, bonusMultiplier = 1) {
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index 7b8889be1d68e76a982bbae69575f25013469e88..bb016cc5a2faab9105a6aac1e6ef01c69f56766e 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -319,15 +319,6 @@ App.Utils.htmlToElement = function(text) {
 	return template.content.firstChild;
 };
 
-/*
- * Shows tooltips if they are enabled. Must be called on every passage load, because <body> gets reset.
- */
-$(document).on(":passagestart", event => {
-	if (V.tooltipsEnabled === 1) {
-		event.content.classList.add("tooltipsEnabled");
-	}
-});
-
 /**
  * Show a list of links (or disabled links) as a delimited strip
  * @param {Node[]} links
diff --git a/src/npc/descriptions/arms.js b/src/npc/descriptions/arms.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8ccb8e33b04230e95dae236ef77feb85dc15332
--- /dev/null
+++ b/src/npc/descriptions/arms.js
@@ -0,0 +1,102 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.arms = function(slave) {
+	const r = [];
+	const {
+		his, He
+	} = getPronouns(slave);
+
+	if (hasAnyNaturalArms(slave)) {
+		if (slave.weight > 190) {
+			r.push(`${He} has`);
+			if (hasBothNaturalArms(slave)) {
+				r.push(`hugely thick arms`);
+			} else {
+				r.push(`a hugely thick arm`);
+			}
+			r.push(`with sagging fat`);
+			if (slave.muscles > 5) {
+				r.push(`rolls and`);
+			} else {
+				r.push(`rolls.`);
+			}
+		} else if (slave.weight > 160) {
+			r.push(`${He} has`);
+			if (hasBothNaturalArms(slave)) {
+				r.push(`thick arms`);
+			} else {
+				r.push(`a thick arm`);
+			}
+			r.push(`with drooping fat`);
+			if (slave.muscles > 5) {
+				r.push(`folds and`);
+			} else {
+				r.push(`folds.`);
+			}
+		} else if (slave.weight > 130) {
+			r.push(`${He} has`);
+			if (hasBothNaturalArms(slave)) {
+				if (slave.muscles > 5) {
+					r.push(`plump arms with`);
+				} else {
+					r.push(`plump arms.`);
+				}
+			} else {
+				if (slave.muscles > 5) {
+					r.push(`a plump arm with`);
+				} else {
+					r.push(`a plump arm.`);
+				}
+			}
+		} else if (slave.weight > 97) {
+			r.push(`${He} has`);
+			if (hasBothNaturalArms(slave)) {
+				if (slave.muscles > 5) {
+					r.push(`chubby arms with`);
+				} else {
+					r.push(`chubby arms.`);
+				}
+			} else {
+				if (slave.muscles > 5) {
+					r.push(`a chubby arm with`);
+				} else {
+					r.push(`a chubby arm.`);
+				}
+			}
+		} else if (slave.muscles > 5) {
+			r.push(`${He} has`);
+			if (hasBothNaturalArms(slave)) {
+				r.push(`normal arms`);
+			} else {
+				r.push(`a normal arm`);
+			}
+			r.push(`with`);
+		}
+
+		if (slave.muscles > 95) {
+			if (slave.weight > 95) {
+				r.push(`huge muscles hidden beneath ${his} soft flesh.`);
+			} else {
+				r.push(`huge muscles.`);
+			}
+		} else if (slave.muscles > 30) {
+			if (slave.weight > 95) {
+				r.push(`obvious muscles hidden beneath ${his} soft flesh.`);
+			} else {
+				r.push(`obvious muscles.`);
+			}
+		} else if (slave.muscles > 5) {
+			if (slave.weight > 30) {
+				r.push(`toned muscles hidden beneath ${his} soft flesh.`);
+			} else {
+				r.push(`toned muscles.`);
+			}
+		} else {
+			// little muscle to them.
+		}
+	}
+	return r.join(" ");
+};
+
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index 01c06dd0e43024e1041e337e0db90e971d5a1382..afa2d2f1906bf815dfbfc517658585306a2e35f6 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -1265,7 +1265,7 @@ App.Desc.sexualHistory = function(slave) {
 	}
 
 	if (slave.lactation > 0 && slave.counter.milk < 20) {
-		r += `${He} has given a small quantity of milk `;
+		r += `${He} has given a small quantity of milk`;
 		if (slave.counter.cum > 0) {
 			r += ` and about ${num(slave.counter.cum)} deciliters of cum`;
 		}
diff --git a/src/npc/descriptions/dimensions.js b/src/npc/descriptions/dimensions.js
new file mode 100644
index 0000000000000000000000000000000000000000..6a5a25208ba98965e4637b38701fed034c7f7c23
--- /dev/null
+++ b/src/npc/descriptions/dimensions.js
@@ -0,0 +1,285 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.dimensions = function(slave) {
+	const r = [];
+	const {
+		he, him, his, himself, He, His
+	} = getPronouns(slave);
+
+	r.push(height());
+
+	r.push(`and`);
+
+	r.push(weight());
+
+	if (slave.hips > 2) {
+		r.push(`${His} hips are unrealistically wide, it is obvious they have been artificially widened.`);
+	}
+
+	r.push(App.Desc.waist(slave));
+
+	r.push(FS());
+	r.push(travel());
+
+	r.push(App.Desc.heightImplant(slave));
+
+	r.push(muscles());
+	r.push(App.Desc.arms(slave));
+
+	return r.join(" ");
+
+
+	function height() {
+		const r = [];
+		const averageHeight = Height.mean(slave);
+		const age = slave.physicalAge < 16 ? ` for ${his} age` : ``;
+
+		r.push(`is`);
+		if (slave.height <= (averageHeight + 5) && slave.height >= (averageHeight - 5)) {
+			r.push(`an average height${age}`);
+		} else if (slave.height < (averageHeight - 15)) {
+			r.push(`petite${age}`);
+		} else if (slave.height < (averageHeight - 5)) {
+			r.push(`short${age}`);
+		} else if (slave.height > (averageHeight + 15)) {
+			r.push(`very tall${age}`);
+		} else if (slave.height > (averageHeight + 5)) {
+			r.push(`tall${age}`);
+		}
+		if (V.showHeightCMs === 1) {
+			r.push(`at ${heightToEitherUnit(slave.height)},`);
+		}
+		return r.join(" ");
+	}
+	function weight() {
+		const r = [];
+		if (slave.weight > 190) {
+			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+				r.push(either(`perfectly curvy.`, `perfectly plush.`));
+			} else {
+				r.push(`<span class="red">${either(`dangerously fat`, `dangerously overweight`, `extremely obese`)}.</span>`);
+			}
+		} else if (slave.weight > 160) {
+			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+				r.push(either(`spectacularly curvy.`, `spectacularly plush.`));
+			} else {
+				r.push(`<span class="red">${either(`extremely fat`, `extremely overweight`, `very obese`)}.</span>`);
+			}
+		} else if (slave.weight > 130) {
+			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+				r.push(either(`amazingly curvy.`, `amazingly plush.`));
+			} else {
+				r.push(`<span class="red">${either(`obese`, `very fat`, `very overweight`)}.</span>`);
+			}
+		} else if (slave.weight > 95) {
+			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+				if (slave.hips > 1) {
+					r.push(`${either(`extremely curvy`, `extremely plush`)}, ${his} huge hips complementing ${his} plushness perfectly.`);
+				} else {
+					r.push(`${either(`extremely curvy`, `extremely plush`)}.`);
+				}
+			} else if (slave.hips > 1) {
+				r.push(`${either(`extremely curvy`, `extremely plush`)}, but ${his} huge hips make the extra weight attractive on ${him}.`);
+			} else {
+				r.push(`<span class="red">${either(`carrying a lot of extra weight`, `fat`, `overweight`)}.</span>`);
+			}
+		} else if (slave.weight > 30) {
+			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
+				if (slave.hips > 1) {
+					r.push(`${either(`quite curvy`, `very plush`)}, ${his} motherly hips adding to ${his} soft appeal.`);
+				} else {
+					r.push(`${either(`quite curvy`, `very plush`)}.`);
+				}
+			} else if (slave.hips > 1) {
+				r.push(`${either(`quite curvy`, `very plush`)}, but ${his} motherly hips make the extra weight attractive on ${him}.`);
+			} else {
+				r.push(`<span class="red">${either(`carrying extra weight`, `chubby`)}.</span>`);
+			}
+		} else if (slave.weight > 10) {
+			r.push(either(`nicely plush.`, `pleasingly curvy.`));
+		} else if (slave.weight >= -10) {
+			r.push(either(`a healthy weight.`, `an attractive weight for ${his} frame.`, `neither too fat nor too skinny.`));
+		} else if (slave.weight >= -30) {
+			r.push(either(`appealingly skinny.`, `pleasingly thin.`));
+		} else if (slave.weight >= -95) {
+			if (slave.hips > 1) {
+				r.push(`${either(`quite skinny`, `very thin`)}, but ${his} wide hips make the gap between ${his} thighs very noticeable.`);
+			} else if (slave.hips < -1) {
+				r.push(`${either(`quite skinny`, `very thin`)}, but ${his} trim hips make ${him} look like a model.`);
+			} else {
+				r.push(`<span class="red">${either(`rail thin`, `too skinny`, `underweight`)}.</span>`);
+			}
+		} else {
+			r.push(`<span class="red">${either(`dangerously skinny`, `emaciated`)}.</span>`);
+		}
+		return r.join(" ");
+	}
+	function FS() {
+		const r = [];
+
+		if (V.arcologies[0].FSStatuesqueGlorification !== "unset") {
+			if (heightPass(slave)) {
+				r.push(`${He} is tall enough`);
+				if (setup.heightBoostingShoes.includes(slave.shoes)) {
+					r.push(`in ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`);
+				}
+				r.push(`to measure up to society's strict tastes.`);
+			} else {
+				r.push(`${He} fails to measure up to society's strict`);
+				if (setup.heightBoostingShoes.includes(slave.shoes)) {
+					r.push(`tastes even with ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`);
+				} else {
+					r.push(`tastes.`);
+				}
+			}
+		} else if (V.arcologies[0].FSPetiteAdmiration !== "unset") {
+			if (heightPass(slave)) {
+				r.push(`Society finds ${him} adorably short.`);
+			} else if (slave.height >= 170) {
+				r.push(`Society finds ${him} distastefully tall.`);
+			}
+		}
+
+		if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty > 0) {
+			if (V.arcologies[0].FSHedonisticDecadence === "unset" && V.arcologies[0].FSPhysicalIdealistStrongFat === 0) {
+				if (slave.weight > 130) {
+					r.push(`${He} is much too fat for the fashionable feminine ideal.`);
+				} else if (slave.weight > 30) {
+					r.push(`${He} is too fat for the fashionable feminine ideal.`);
+				} else if (slave.weight < -30) {
+					r.push(`${He} is too skinny for the fashionable feminine ideal.`);
+				}
+			} else {
+				if (slave.weight > 130) {
+					r.push(`${He} is much too fat for the fashionable feminine ideal.`);
+				} else if (slave.weight < -30) {
+					r.push(`${He} is too skinny for the fashionable feminine ideal.`);
+				}
+			}
+		} else if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) {
+			if (V.arcologies[0].FSHedonisticDecadence === "unset" && V.arcologies[0].FSPhysicalIdealistStrongFat === 0) {
+				if (slave.weight > 30) {
+					r.push(`${He} is much too fat for the fashionable feminine ideal.`);
+				} else if (slave.weight > 10) {
+					r.push(`${He} is too fat for the fashionable feminine ideal.`);
+				}
+			} else {
+				if (slave.weight > 60) {
+					r.push(`${He} is much too fat for the fashionable feminine ideal.`);
+				} else if (slave.weight > 30) {
+					r.push(`${He} is too fat for the fashionable feminine ideal.`);
+				}
+			}
+		} else if (V.arcologies[0].FSHedonisticDecadenceLaw2 === 1) {
+			if (slave.weight <= 95) {
+				r.push(`${He} is too thin for the fashionable feminine ideal.`);
+			} else if (slave.weight <= 10) {
+				r.push(`${He} is much too thin for the fashionable feminine ideal.`);
+			}
+		}
+		return r.join(" ");
+	}
+	function travel() {
+		const r = [];
+		if (canWalk(slave)) {
+			if (slave.weight > (170 + (slave.muscles / 5)) && slave.physicalAge >= 18) {
+				r.push(`${He} is so fat that it is difficult for ${him} to move.`);
+				if (slave.muscles > 95) {
+					r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`);
+				} else if (slave.muscles > 30) {
+					r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`);
+				} else if (slave.muscles > 5) {
+					r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`);
+				} else {
+					r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`);
+				}
+			} else if (slave.weight > (110 + (slave.muscles / 20)) && slave.physicalAge <= 3) {
+				r.push(`${He} is so fat that it is difficult for ${him} to move.`);
+				if (slave.muscles > 95) {
+					r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`);
+				} else if (slave.muscles > 30) {
+					r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`);
+				} else if (slave.muscles > 5) {
+					r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`);
+				} else {
+					r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`);
+				}
+			} else if (slave.weight > (140 + (slave.muscles / 15)) && slave.physicalAge <= 12) {
+				r.push(`${He} is so fat that it is difficult for ${him} to move.`);
+				if (slave.muscles > 95) {
+					r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`);
+				} else if (slave.muscles > 30) {
+					r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`);
+				} else if (slave.muscles > 5) {
+					r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`);
+				} else {
+					r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`);
+				}
+			} else if (slave.weight > (165 + (slave.muscles / 10)) && slave.physicalAge < 18) {
+				r.push(`${He} is so fat that it is difficult for ${him} to move.`);
+				if (slave.muscles > 95) {
+					r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, though ${he} often has to stop for breaks.`);
+				} else if (slave.muscles > 30) {
+					r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks alongside objects to help relieve the weight.`);
+				} else if (slave.muscles > 5) {
+					r.push(`${He} requires assistance to get to ${his} feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.`);
+				} else {
+					r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`);
+				}
+			}
+		}
+		return r.join(" ");
+	}
+	function muscles() {
+		const r = [];
+		r.push(`${He} is`);
+		if (slave.muscles > 95) {
+			r.push(`<span class="pink">extremely muscular,</span> with defined pecs, powerful glutes, and massive`);
+			if (slave.weight > 95) {
+				r.push(`traps hidden beneath a layer of fat`);
+			} else {
+				r.push(`traps.`);
+			}
+		} else if (slave.muscles > 50) {
+			r.push(`<span class="pink">quite muscular,</span> with ripped abs, strong shoulders, and defined`);
+			if (slave.weight > 95) {
+				r.push(`lats hidden beneath a layer of fat`);
+			} else {
+				r.push(`lats.`);
+			}
+		} else if (slave.muscles > 30) {
+			r.push(`<span class="pink">well built,</span> yet feminine with defined abs and strong shapely`);
+			if (slave.weight > 95) {
+				r.push(`muscles hidden beneath a layer of fat`);
+			} else {
+				r.push(`muscles.`);
+			}
+		} else if (slave.muscles > 5) {
+			r.push(`<span class="pink">well built,</span> yet feminine, with just-visible`);
+			if (slave.weight > 30) {
+				r.push(`muscles hidden beneath a layer of fat`);
+			} else {
+				r.push(`muscles.`);
+			}
+		} else if (slave.muscles > -6) {
+			r.push(`<span class="pink">soft and feminine,</span> with no visible muscles.`);
+		} else if (slave.muscles > -31) {
+			r.push(`<span class="pink">rather weak,</span> with barely any muscles.`);
+		} else if (slave.muscles > -96) {
+			r.push(`<span class="pink">very weak;</span> ${he} struggles with day-to-day tasks.`);
+		} else {
+			r.push(`<span class="red">frail;</span> ${he} can barely hold ${himself} up.`);
+		}
+
+		if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty + V.arcologies[0].FSSlimnessEnthusiastLaw > 0 && V.arcologies[0].FSPhysicalIdealist === "unset" && V.arcologies[0].FSHedonisticDecadenceStrongFat === 0) {
+			if (V.arcologies[0].FSPhysicalIdealistLaw > 0 && slave.muscles > 50) {
+				r.push(`${He} is entirely too muscular for the fashionable feminine ideal.`);
+			} else if (slave.muscles > 30) {
+				r.push(`${He} is entirely too muscular for the fashionable feminine ideal.`);
+			}
+		}
+		return r.join(" ");
+	}
+};
diff --git a/src/npc/descriptions/legs.js b/src/npc/descriptions/legs.js
new file mode 100644
index 0000000000000000000000000000000000000000..1282f78d05cc4b8aebf05b61471aa2a4d6fb9a69
--- /dev/null
+++ b/src/npc/descriptions/legs.js
@@ -0,0 +1,131 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.legs = function(slave) {
+	const r = [];
+	const {
+		his, He
+	} = getPronouns(slave);
+
+	if (hasAnyNaturalLegs(slave)) {
+		if (slave.weight > 190) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`extremely fat legs with immense soft, rather uneven`);
+				if (slave.muscles > 5) {
+					r.push(`thighs and`);
+				} else {
+					r.push(`thighs.`);
+				}
+			} else {
+				r.push(`an extremely fat leg with an immense soft, rather uneven`);
+				if (slave.muscles > 5) {
+					r.push(`thigh and`);
+				} else {
+					r.push(`thigh.`);
+				}
+			}
+		} else if (slave.weight > 160) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`very fat legs with massively thick, soft, somewhat uneven`);
+				if (slave.muscles > 5) {
+					r.push(`thighs and`);
+				} else {
+					r.push(`thighs.`);
+				}
+			} else {
+				r.push(`a very fat leg with a massively thick, soft, somewhat uneven`);
+				if (slave.muscles > 5) {
+					r.push(`thigh and`);
+				} else {
+					r.push(`thigh.`);
+				}
+			}
+		} else if (slave.weight > 130) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`fat legs with hugely thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thighs and`);
+				} else {
+					r.push(`thighs.`);
+				}
+			} else {
+				r.push(`a fat leg with a hugely thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thigh and`);
+				} else {
+					r.push(`thigh.`);
+				}
+			}
+		} else if (slave.weight > 97) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`fat legs with thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thighs and`);
+				} else {
+					r.push(`thighs.`);
+				}
+			} else {
+				r.push(`a fat leg with a thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thigh and`);
+				} else {
+					r.push(`thigh.`);
+				}
+			}
+		} else if (slave.weight > 95) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`normal legs with thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thighs and`);
+				} else {
+					r.push(`thighs.`);
+				}
+			} else {
+				r.push(`a normal leg with a thick, soft`);
+				if (slave.muscles > 5) {
+					r.push(`thigh and`);
+				} else {
+					r.push(`thigh.`);
+				}
+			}
+		} else if (slave.muscles > 5) {
+			r.push(`${He} has`);
+			if (hasBothNaturalLegs(slave)) {
+				r.push(`relatively normal legs and thighs`);
+			} else {
+				r.push(`a relatively normal leg and thigh`);
+			}
+			r.push(`with`);
+		}
+
+		if (slave.muscles > 95) {
+			if (slave.weight > 95) {
+				r.push(`huge muscles hidden beneath ${his} soft flab.`);
+			} else {
+				r.push(`huge muscles.`);
+			}
+		} else if (slave.muscles > 30) {
+			if (slave.weight > 95) {
+				r.push(`obvious muscles hidden beneath ${his} soft flab.`);
+			} else {
+				r.push(`obvious muscles.`);
+			}
+		} else if (slave.muscles > 5) {
+			if (slave.weight > 30) {
+				r.push(`toned muscles hidden beneath ${his} soft flab.`);
+			} else {
+				r.push(`toned muscles.`);
+			}
+		} else {
+			// barely any muscle in them.
+		}
+	}
+	return r.join(" ");
+};
+
diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ebeb71c204ee9011e8d1e6ff90db757a7e3ac5a
--- /dev/null
+++ b/src/npc/descriptions/longSlave.js
@@ -0,0 +1,587 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.longSlave = function({slave = V.activeSlave, saleDescription = V.saleDescription, showClothing = V.showClothing, eventDescription = V.eventDescription} = {}) {
+	const r = [];
+	const {
+		He, His, him, he, his
+	} = getPronouns(slave);
+
+	SlaveStatClamp(slave);
+
+	r.push(`<span id="artFrame">`);
+	if (V.seeImages === 1 && eventDescription !== 1 && passage() !== "Slave Interact") {
+		if (V.imageChoice === 1) {
+			r.push(`<div class="imageRef lrgVector"><div class="mask">&nbsp;</div>${SlaveArt(slave, 3, 0)}</div>`);
+		} else {
+			r.push(`<div class="imageRef lrgRender"><div class="mask">&nbsp;</div>${SlaveArt(slave, 3, 0)}</div>`);
+		}
+	}
+	r.push(`</span>`);
+
+	r.push(`<p><span class="slave name simple">${SlaveFullName(slave)}</span>`);
+
+	if (slave.custom.label) {
+		r.push(`(<span class="yellow"><span style="font-weight:bold">${slave.custom.label}</span></span>)`);
+	}
+
+	if (saleDescription === 1 && V.ui !== "start") {
+		if (V.applyLaw === 1) {
+			r.push(`has passed inspection to be sold in your arcology.`);
+			r.push(App.Desc.lawCompliance(slave)); // includes CheckForGingering
+		} else {
+			r.push(`is for sale and is available to inspect.`);
+			if (V.prisonCrime) {
+				// reports a slave's crime in the criminal market
+				r.push(`${He} ${V.prisonCrime}`);
+				V.prisonCrime = 0;
+			}
+		}
+		r.push(`</p><p class="indent"><span style="font-weight:bold">${slave.slaveName}</span>`);
+	}
+
+	r.push(`is`);
+	if (slave.devotion < -95) {
+		r.push(`a <span class="darkviolet">hate-filled,</span>`);
+	} else if (slave.devotion < -50) {
+		r.push(`a <span class="darkviolet">hateful,</span>`);
+	} else if (slave.devotion < -20) {
+		r.push(`a <span class="mediumorchid">reluctant,</span>`);
+	} else if (slave.devotion <= 20) {
+		r.push(`a <span class="yellow">hesitant,</span>`);
+	} else if (slave.devotion <= 50) {
+		r.push(`an <span class="hotpink">accepting,</span>`);
+	} else if (slave.devotion <= 95) {
+		r.push(`a <span class="deeppink">devoted,</span>`);
+	} else {
+		r.push(`a <span class="magenta">worshipful,</span>`);
+	}
+	if (slave.trust < -95) {
+		r.push(`<span class="goldenrod">abjectly terrified</span>`);
+	} else if (slave.trust < -50) {
+		r.push(`<span class="goldenrod">terrified</span>`);
+	} else if (slave.trust < -20) {
+		r.push(`<span class="gold">frightened</span>`);
+	} else if (slave.trust < 20) {
+		r.push(`<span class="yellow">fearful</span>`);
+	} else if (slave.trust <= 50) {
+		if (slave.devotion < -20) {
+			r.push(`<span class="orange">careful</span>`);
+		} else {
+			r.push(`<span class="mediumaquamarine">careful</span>`);
+		}
+	} else if (slave.trust < 95) {
+		if (slave.devotion < -20) {
+			r.push(`<span class="orangered">bold</span>`);
+		} else {
+			r.push(`<span class="mediumseagreen">trusting</span>`);
+		}
+	} else {
+		if (slave.devotion < -20) {
+			r.push(`<span class="darkred">defiant</span>`);
+		} else {
+			r.push(`<span class="seagreen">profoundly trusting</span>`);
+		}
+	}
+
+	r.push(`<span class="coral name">${SlaveTitle(slave)}.</span>`);
+
+	if (slave.indenture > -1) {
+		r.push(`${His}`);
+		if (slave.indentureRestrictions > 1) {
+			r.push(`restrictive`);
+		} else if (slave.indentureRestrictions > 0) {
+			r.push(`protective`);
+		} else {
+			r.push(`unrestricted`);
+		}
+		r.push(`indenture`);
+		if (slave.indenture > 0) {
+			if (slave.indenture > 1) {
+				r.push(`has ${slave.indenture} weeks left to run.`);
+			} else {
+				r.push(`expires next week.`);
+			}
+		} else {
+			r.push(`expires this week.`);
+		}
+	}
+
+	r.push(App.Desc.sceneIntro(slave));
+
+	r.push(App.Desc.name(slave));
+
+	r.push(App.Desc.ageAndHealth(slave));
+
+	if (saleDescription !== 1) {
+		if (V.clinic !== 0 && V.clinicUpgradeScanner === 1) {
+			if (slave.chem > 15) {
+				r.push(`${V.clinicNameCaps}'s scanners score long term carcinogenic buildup in ${his} body at <span class="cyan">${Math.ceil(slave.chem / 10)}.</span>`);
+			} else {
+				r.push(`${V.clinicNameCaps}'s scanners confirm that ${he} has good prospects for long term health.`);
+			}
+		}
+
+		r.push(App.Desc.geneticQuirkAssessment(slave));
+
+		if (V.showSexualHistory === 1 && V.ui !== "start") {
+			r.push(App.Desc.sexualHistory(slave));
+		}
+	}
+
+	r.push(App.Desc.mind(slave));
+
+	if (saleDescription === 0) {
+		if (eventDescription === 0) {
+			if (canSee(slave)) {
+				if (slave.attrKnown === 1) {
+					if (slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting > 1) {
+						if (slave.attrXX > 85 && V.PC.boobs >= 400) {
+							r.push(`${His} attraction to women is obvious: ${he} can't seem to stop staring at your breasts.`);
+						} else if ((slave.attrXY > 85) && (V.PC.dick !== 0)) {
+							r.push(`${His} attraction to men is obvious: ${he} can't seem to stop glancing down at your package.`);
+						} else if ((slave.attrXY > 85) && V.PC.title === 1 && (V.PC.boobs < 300)) {
+							r.push(`${His} attraction to men is obvious: ${he} can't seem to stop checking out your broad chest.`);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	r.push(App.Desc.family(slave));
+
+	r.push(App.Desc.relationRival(slave));
+
+	if (slave.bodySwap > 0) {
+		if (slave.origBodyOwner !== "") {
+			r.push(`${He} currently possesses ${slave.origBodyOwner}'s body.`);
+		}
+		if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0 && slave.origBodyOwnerID > 0) {
+			if (getSlave(slave.origBodyOwnerID)) {
+				r.push(`${He} is fully aware that ${SlaveFullName(getSlave(slave.origBodyOwnerID))} is in ${his} old body.`);
+			}
+		}
+	}
+
+	r.push(`</p><p class="indent">`);
+
+	if (saleDescription === 0) {
+		if (slave.origin !== 0) {
+			r.push(pronounsForSlaveProp(slave, slave.origin));
+		}
+	}
+
+	r.push(App.Desc.career(slave));
+
+	r.push(App.Desc.prestige(slave));
+
+	r.push(App.Desc.skills(slave));
+
+	if (slave.custom.desc !== "" && slave.custom.desc) {
+		r.push(slave.custom.desc);
+	}
+
+	if (V.arcologies[0].FSGenderFundamentalistLawBeauty + V.arcologies[0].FSGenderRadicalistLawBeauty > 0) {
+		if (genderLawPass(slave) === 1) {
+			r.push(`${His} body is a perfect example of the fashionable feminine ideal.`);
+		}
+	} else if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) {
+		if (slimLawPass(slave) === 1) {
+			r.push(`${His} body is a perfect example of the fashionable ideal flat body.`);
+		}
+	} else if (V.arcologies[0].FSHedonisticDecadenceLaw2 === 1) {
+		if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) {
+			r.push(`${His} body is a perfect example of the fashionable plump body.`);
+		}
+	}
+
+	if (V.arcologies[0].FSRestartSMR > 0 && V.arcologies[0].FSRestart > 80 && (slave.dick === 0) && (slave.balls === 0) && (slave.ovaries === 0) && (slave.mpreg === 0) && (slave.vagina < 0)) {
+		r.push(`${His} body is a perfect example of a subhuman who has accepted their place in society.`);
+	}
+
+	if (V.arcologies[0].FSIntellectualDependencyLawBeauty === 1) {
+		r.push(`${He} currently is graded`);
+		switch (bimboScore(slave)) {
+			case 6:
+				r.push(`an S-class`);
+				break;
+			case 5:
+				r.push(`an A-class`);
+				break;
+			case 4:
+				r.push(`a B-class`);
+				break;
+			case 3:
+				r.push(`a C-class`);
+				break;
+			case 2:
+				r.push(`a D-class`);
+				break;
+			case 1:
+				r.push(`an E-class`);
+				break;
+			default:
+				r.push(`an F-class`);
+		}
+		r.push(`bimbo by societal trends.`);
+	}
+
+	if (V.showScores !== 0) {
+		r.push(`Currently, ${he} has an`);
+		r.push(`<span class="pink">`);
+		r.push(`<span style="font-weight:bold">`);
+		r.push(`attractiveness score`);
+		r.push(`</span>`);
+		r.push(`of`);
+		r.push(`<span class="text-decoration-line: underline">`);
+		r.push(`<span id="BeautyTooltip" style="font-weight:bold">`);
+		if (V.cheatMode || V.debugMode) {
+			r.push(App.UI.link(Beauty(slave), () => BeautyTooltip(slave)));
+		} else {
+			r.push(Beauty(slave));
+		}
+		r.push(`</span>`);
+		r.push(`</span>`);
+		r.push(`</span>`);
+		r.push(`and a`);
+		r.push(`<span class="lightcoral">`);
+		r.push(`<span style="font-weight:bold">`);
+		r.push(`sexual score`);
+		r.push(`</span>`);
+		r.push(`of`);
+		r.push(`<span class="text-decoration-line: underline">`);
+		r.push(`<span id="FResultTooltip" style="font-weight:bold">`);
+		if (V.cheatMode || V.debugMode) {
+			r.push(App.UI.link(FResult(slave), () => FResultTooltip(slave)));
+		} else {
+			r.push(`${FResult(slave)}.`);
+		}
+		r.push(`</span>`);
+		r.push(`</span>`);
+		r.push(`</span>`);
+	}
+
+	r.push(`</p><p class="indent">`);
+
+	r.push(App.Desc.limbs(slave));
+
+	r.push(App.Desc.clothing(slave));
+	r.push(App.Desc.armwear(slave));
+	if (V.showBodyMods === 1) {
+		r.push(App.Desc.clothingCorset(slave));
+	}
+
+	if (showClothing === 1 && saleDescription === 0) {
+		r.push(`${He}`);
+	} else {
+		r.push(`${slave.slaveName}`);
+	}
+
+	r.push(App.Desc.dimensions(slave));
+
+	r.push(App.Desc.bodyguard(slave));
+
+	if ((slave.counter.pitWins + slave.counter.pitLosses) > 0) {
+		r.push(`${He} has participated in ${num(slave.counter.pitWins + slave.counter.pitLosses)} pit fights, with ${slave.counter.pitWins} wins and ${slave.counter.pitLosses} losses.`);
+	}
+
+	if (slave.counter.pitKills > 0) {
+		r.push(`${slave.counter.pitKills} slaves have died by ${his} hand in pit fights.`);
+	}
+
+	r.push(App.Desc.piercing(slave, "corset"));
+
+	r.push(App.Desc.pregnancy(slave));
+
+	r.push(App.Desc.legs(slave));
+
+	r.push(App.Desc.mods(slave, "thigh"));
+	r.push(App.Desc.mods(slave, "calf"));
+	r.push(App.Desc.mods(slave, "ankle"));
+	r.push(App.Desc.mods(slave, "foot"));
+	r.push(App.Desc.heels(slave, "foot"));
+	r.push(App.Desc.skin(slave));
+
+	if (saleDescription === 1) {
+		r.push(App.Desc.accent(slave));
+	}
+
+	let scarCounter = 0;
+	for (let scarName in slave.scar) {
+		if (slave.ID === V.Bodyguard.ID && scarCounter > 1) {
+			r.push(`${His} scars make ${him} look even more menacing than ${he} actually is.`);
+			break;
+		} else if ((slave.ID === V.Bodyguard.ID) && slave.scar[scarName].menacing > 0) {
+			r.push(`${His} menacing scar makes ${him} look terrifying.`);
+			break;
+		} else if ((slave.ID === V.Wardeness.ID) && scarCounter > 1) {
+			r.push(`${His} scars make ${him} look like ${he}'s in the right place.`);
+			break;
+		}
+		scarCounter++;
+	}
+
+	if (slave.fuckdoll === 0) {
+		if (slave.markings === "birthmark" && slave.prestige === 0 && slave.porn.prestige < 2) {
+			r.push(`${He} has a large, liver-colored birthmark, detracting from ${his} beauty.`);
+		}
+		if (slave.skin === "sun tanned") {
+			if ((slave.rules.release.slaves === 1) || App.Utils.hasFamilySex(slave)) {
+				if (slave.fetishStrength > 60 && slave.fetishKnown === 1) {
+					r.push(`${His} tan is slightly uneven, since ${he} enjoys`);
+					if (slave.fetish === "buttslut") {
+						r.push(`letting other tanned slaves share a tanning bed with ${him} so they can sodomize ${him} while ${he} tans.`);
+					} else if ((slave.fetish === "cumslut")) {
+						r.push(`letting other tanned slaves share a tanning bed with ${him} so they get oral from ${him} while ${he} tans.`);
+					} else if ((slave.fetish === "sadist")) {
+						r.push(`forcing inferior slaves into the tanning beds with ${him} so ${he} can sodomize them while ${he} tans.`);
+					} else if ((slave.fetish === "dom")) {
+						r.push(`bringing other slaves into the tanning beds with ${him} so ${he} can fuck them while ${he} tans.`);
+					} else if ((slave.fetish === "masochist") || (slave.fetish === "submissive")) {
+						r.push(`letting other slaves into the tanning beds with ${him} so they can fuck ${him} while ${he} tans.`);
+					} else if ((slave.fetish === "boobs")) {
+						r.push(`bringing other slaves into the tanning beds with ${him} so ${he} can tittyfuck them while ${he} tans.`);
+					} else if ((slave.fetish === "pregnancy") && (jsRandom(0, 99) < V.seeDicks)) {
+						r.push(`letting slaves with dicks into the tanning beds with ${him} so they can cum inside ${him} while ${he} tans.`);
+					} else {
+						r.push(`bringing other slaves into the tanning beds with ${him} to have sex while ${he} tans.`);
+					}
+				}
+			}
+		}
+	}
+
+	if (slave.fuckdoll === 0) {
+		// Describe any brands that are not directly addressed elsewhere in longSlave
+		r.push(App.Desc.mods(slave, "extra"));
+	}
+
+	if (showClothing === 1 && saleDescription === 0) {
+		r.push(App.Desc.ears(slave));
+		r.push(App.Desc.upperFace(slave));
+		r.push(App.Desc.hair(slave));
+	} else {
+		r.push(`${His} hair is ${slave.hColor}`);
+	}
+	if (slave.hColor !== slave.eyebrowHColor) {
+		r.push(r.pop() + `, with ${slave.eyebrowHColor} eyebrows`);
+	} else {
+		r.push(r.pop() + `.`);
+	}
+
+	if (slave.fuckdoll === 0) {
+		if (slave.hColor === "red") {
+			if (slave.hLength >= 10) {
+				if (slave.markings === "freckles" || slave.markings === "heavily freckled") {
+					if (skinToneLevel(slave.skin) > 5 && skinToneLevel(slave.skin) < 10) {
+						r.push(`It goes perfectly with ${his} ${slave.skin} skin and freckles.`);
+					}
+				}
+			}
+		}
+
+		const pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+		if (slave.physicalAge < pubertyAge - 2) {
+			r.push(`${He} is too sexually immature to have armpit hair.`);
+		} else if (slave.underArmHStyle === "hairless") {
+			r.push(`${His} armpits are perfectly smooth and naturally hairless.`);
+		} else if (slave.underArmHStyle === "bald") {
+			r.push(`${His} armpits no longer grow hair, leaving them smooth and hairless.`);
+		} else if (slave.underArmHStyle === "waxed") {
+			if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+				r.push(`${His} armpit hair has been removed to prevent chafing.`);
+			} else {
+				r.push(`${His} armpits are waxed and smooth.`);
+			}
+		} else if ((slave.physicalAge < pubertyAge - 1)) {
+			r.push(`${He} has a few ${slave.underArmHColor} wisps of armpit hair.`);
+		} else if ((slave.physicalAge < pubertyAge)) {
+			r.push(`${He} is on the verge of puberty and has a small patch of ${slave.underArmHColor} armpit hair.`);
+		} else if (slave.underArmHStyle === "shaved") {
+			r.push(`${His} armpits appear hairless, but closer inspection reveals light, ${slave.underArmHColor} stubble.`);
+		} else if (slave.underArmHStyle === "neat") {
+			r.push(`${His} armpit hair is neatly trimmed`);
+			if (!hasBothArms(slave)) {
+				r.push(`since`);
+				if (hasAnyArms(slave)) {
+					r.push(`at least half`);
+				} else {
+					r.push(`it`);
+				}
+				r.push(`is always in full view.`);
+			} else {
+				r.push(`to not be visible unless ${he} lifts ${his} arms.`);
+			}
+		} else if (slave.underArmHStyle === "bushy") {
+			r.push(`${His} ${slave.underArmHColor} armpit hair has been allowed to grow freely,`);
+			if (!hasAnyArms(slave)) {
+				r.push(`creating two bushy patches under where ${his} arms used to be.`);
+			} else {
+				r.push(`so it can be seen poking out from under ${his}`);
+				if (hasBothArms(slave)) {
+					r.push(`arms`);
+				} else {
+					r.push(`arm`);
+				}
+				r.push(`at all times.`);
+			}
+		}
+	}
+
+	if (slave.voice === 0) {
+		r.push(`${He} is <span class="pink">completely silent,</span> which is understandable, since ${he}'s mute.`);
+	} else {
+		if (slave.lips > 95) {
+			r.push(`${He} is <span class="pink">effectively mute,</span> since ${his} lips are so large that ${he} can no longer speak intelligibly. ${He} can still`);
+			if (slave.devotion > 50) {
+				r.push(`moan`);
+			} else if (slave.devotion > 20) {
+				r.push(`whimper`);
+			} else {
+				r.push(`scream`);
+			}
+			r.push(`through them, though.`);
+		}
+	}
+
+	if (V.showBodyMods === 1) {
+		if (slave.fuckdoll > 0) {
+			if (slave.earPiercing + slave.eyebrowPiercing + slave.nosePiercing > 0) {
+				r.push(`The piercings on ${his} head run through ${his} suit, helping secure the material to ${his} head.`);
+			}
+		} else {
+			r.push(App.Desc.mods(slave, "ear"));
+			r.push(App.Desc.mods(slave, "nose"));
+			r.push(App.Desc.mods(slave, "eyebrow"));
+			r.push(App.Desc.mods(slave, "cheek"));
+			r.push(App.Desc.mods(slave, "neck"));
+			if (slave.custom.tattoo !== "" && slave.custom.tattoo) {
+				r.push(slave.custom.tattoo);
+			}
+		}
+	}
+
+	r.push(App.Desc.horns(slave));
+	r.push(App.Desc.face(slave));
+	r.push(App.Desc.mouth(slave));
+
+	if (showClothing === 1 && saleDescription === 0) {
+		if (slave.fuckdoll === 0) {
+			r.push(App.Desc.collar(slave));
+			r.push(App.Desc.faceAccessory(slave));
+			r.push(App.Desc.mouthAccessory(slave));
+			if (slave.relationship > 4) {
+				if (hasAnyArms(slave)) {
+					r.push(`${He} has a simple gold band on the little finger of ${his}`);
+					if (!hasLeftArm(slave)) {
+						r.push(`right`);
+					} else {
+						r.push(`left`);
+					}
+					r.push(`hand.`);
+				} else {
+					r.push(`${He} has a simple gold band on a length of chain around ${his} neck.`);
+				}
+			} else if ((slave.relationship === -3)) {
+				if (hasAnyArms(slave)) {
+					r.push(`${He} has a simple steel band on the little finger of ${his}`);
+					if (!hasLeftArm(slave)) {
+						r.push(`right`);
+					} else {
+						r.push(`left`);
+					}
+					r.push(`hand.`);
+				} else {
+					r.push(`${He} has a simple steel band on a length of cord around ${his} neck.`);
+				}
+			}
+		}
+	}
+
+	if (slave.fuckdoll === 0) {
+		r.push(App.Desc.nails(slave));
+	}
+	r.push(App.Desc.mods(slave, "back"));
+	r.push(App.Desc.mods(slave, "shoulder"));
+	r.push(App.Desc.mods(slave, "upper arm"));
+	r.push(App.Desc.mods(slave, "lower arm"));
+	r.push(App.Desc.mods(slave, "hand"));
+	r.push(App.Desc.mods(slave, "wrist"));
+
+	if (slave.fuckdoll === 0) {
+		if (slave.minorInjury !== 0) {
+			if (slave.minorInjury !== "sore ass") {
+				r.push(`${He} is sporting a <span class="red">${slave.minorInjury},</span> covered by makeup.`);
+			}
+		}
+	}
+	if (slave.health.illness > 0) {
+		if (slave.fuckdoll === 0) {
+			r.push(`${He}`);
+		} else {
+			r.push(`${His} suit reports that ${he}`);
+		}
+		if (slave.health.illness === 1) {
+			if (slave.fuckdoll === 0) {
+				r.push(`is <span class="red">feeling under the weather.</span>`);
+			} else {
+				r.push(`has <span class="red">fallen ill.</span>`);
+			}
+		} else if (slave.health.illness === 2) {
+			r.push(`is <span class="red">somewhat ill.</span>`);
+		} else if (slave.health.illness === 3) {
+			r.push(`is <span class="red">sick.</span>`);
+		} else if (slave.health.illness === 4) {
+			r.push(`is <span class="red">very sick.</span>`);
+		} else if (slave.health.illness === 5) {
+			r.push(`is <span class="red">terribly ill.</span>`);
+		}
+	}
+
+	r.push(`</p><p class="indent">`);
+
+	// Calling all boob widgets
+	r.push(App.Desc.boobs(slave));
+	r.push(App.Desc.boobsShape(slave));
+	r.push(App.Desc.boobsExtra(slave));
+	r.push(App.Desc.mods(slave, "chest"));
+	r.push(App.Desc.mods(slave, "breast"));
+	r.push(App.Desc.shoulders(slave));
+	r.push(App.Desc.nipples(slave));
+	r.push(App.Desc.mods(slave, "nipple"));
+	r.push(App.Desc.areola(slave));
+	r.push(App.Desc.mods(slave, "areolae"));
+
+	if (slave.inflation > 0) {
+		// to be obsoleted with phase 4
+		r.push(App.Desc.bellyInflation(slave));
+	} else if (slave.bellyImplant >= 2000) {
+		r.push(App.Desc.bellyImplant(slave));
+	} else {
+		r.push(App.Desc.belly(slave));
+	}
+	r.push(App.Desc.mods(slave, "belly"));
+	r.push(App.Desc.butt(slave));
+
+	r.push(`</p><p class="indent">`);
+
+	r.push(App.Desc.crotch(slave));
+	r.push(App.Desc.dick(slave));
+	r.push(App.Desc.vagina(slave));
+
+	r.push(App.Desc.anus(slave));
+
+	if (slave.fuckdoll === 0) {
+		r.push(`</p><p class="indent">`);
+		r.push(App.Desc.drugs(slave));
+	}
+	r.push(`</p>`);
+	V.saleDescription = 0;
+	V.applyLaw = 0;
+	// clear sale and law flags, if set
+
+	return r.join(" ");
+};
+
diff --git a/src/npc/descriptions/prestige.js b/src/npc/descriptions/prestige.js
new file mode 100644
index 0000000000000000000000000000000000000000..a64107b3ea33215bbcb2a036addd20b9fbb652a4
--- /dev/null
+++ b/src/npc/descriptions/prestige.js
@@ -0,0 +1,44 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.prestige = function(slave) {
+	const r = [];
+	const {
+		He, him, he, his
+	} = getPronouns(slave);
+
+	if (slave.prestige > 0) {
+		if (slave.prestigeDesc) {
+			r.push(pronounsForSlaveProp(slave, slave.prestigeDesc));
+		}
+		if (slave.prestige > 2) {
+			r.push(`<span class="green">It is extremely prestigious to own ${him}.</span>`);
+		} else if (slave.prestige > 1) {
+			r.push(`<span class="green">It is quite prestigious to own ${him}.</span>`);
+		} else {
+			r.push(`<span class="green">It is fairly prestigious to own ${him}.</span>`);
+		}
+	}
+
+	if (slave.porn.prestige > 0) {
+		if (slave.porn.prestigeDesc) {
+			r.push(pronounsForSlaveProp(slave, slave.porn.prestigeDesc));
+		}
+		if (slave.porn.prestige > 2) {
+			r.push(`As such, ${he} tends to gain a following wherever ${he} goes.`);
+		} else if (slave.porn.prestige > 1) {
+			r.push(`As such, ${he} is recognized often.`);
+		} else {
+			r.push(`As such, ${he} is recognized occasionally.`);
+		}
+	}
+
+	if (slave.prestige > 0 || slave.porn.prestige > 1) {
+		if (slave.fuckdoll === 0 && slave.markings === "birthmark") {
+			r.push(`${He} has a large, liver-colored birthmark, but since ${he}'s well known, this uniqueness adds to ${his} beauty rather than detracting from it.`);
+		}
+	}
+	return r.join(" ");
+};
+
diff --git a/src/npc/descriptions/relationRival.js b/src/npc/descriptions/relationRival.js
new file mode 100644
index 0000000000000000000000000000000000000000..68650051dd28a3ea874131233ae4f977416fff9c
--- /dev/null
+++ b/src/npc/descriptions/relationRival.js
@@ -0,0 +1,45 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.relationRival = function(slave) {
+	const r = [];
+	const {
+		his, He
+	} = getPronouns(slave);
+
+	r.push(relative());
+	r.push(rival());
+
+	return r.join(" ");
+
+	function relative() {
+		if (slave.relationship >= 3 && totalRelatives(slave) > 0) {
+			const lover = getSlave(slave.relationshipTarget);
+			if (lover) {
+				if (relativeTerm(slave, lover) !== null) {
+					return `${He} is in an <span class="lightgreen">incestuous relationship with ${his} ${relativeTerm(slave, lover)}, ${SlaveFullName(lover)}.</span>`;
+				}
+			}
+		} else if (slave.relationship <= -2) {
+			if (relativeTerm(slave, V.PC) !== null) {
+				return `${He} is in an <span class="lightgreen">incestuous relationship with ${his} ${relativeTerm(slave, V.PC)}, you.</span>`;
+			}
+		}
+	}
+
+	function rival() {
+		if (slave.rivalry !== 0) {
+			if (getSlave(slave.rivalryTarget)) {
+				if (slave.rivalry <= 1) {
+					return `${He} <span class="lightsalmon">dislikes</span> ${SlaveFullName(getSlave(slave.rivalryTarget))}.`;
+				} else if (slave.rivalry <= 2) {
+					return `${He} is ${SlaveFullName(getSlave(slave.rivalryTarget))}'s <span class="lightsalmon">rival.</span>`;
+				} else {
+					return `${He} <span class="lightsalmon">bitterly hates</span> ${SlaveFullName(getSlave(slave.rivalryTarget))}.`;
+				}
+			}
+		}
+	}
+};
+
diff --git a/src/npc/descriptions/skills.js b/src/npc/descriptions/skills.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ee1394458dd474ed055a2e7092a98ac13e4248c
--- /dev/null
+++ b/src/npc/descriptions/skills.js
@@ -0,0 +1,75 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.skills = function(slave) {
+	const r = [];
+	const {
+		He, girl
+	} = getPronouns(slave);
+
+
+	if (slave.fuckdoll > 0) {
+		r.push(`${He} is`);
+		if (slave.fuckdoll <= 10) {
+			r.push(`poorly adapted to life as a living sex toy.`);
+		} else if (slave.fuckdoll <= 30) {
+			r.push(`<span class="aquamarine">moderately adapted to life as a living sex toy.</span>`);
+		} else if (slave.fuckdoll <= 60) {
+			r.push(`<span class="aquamarine">well adapted to life as a living sex toy.</span>`);
+		} else if (slave.fuckdoll < 100) {
+			r.push(`<span class="aquamarine">almost perfectly adapted to life as a living sex toy.</span>`);
+		} else {
+			r.push(`<span class="aquamarine">perfectly adapted to life as a living sex toy.</span>`);
+		}
+		r.push(`Entertainment and prostitution skills are irrelevant for a Fuckdoll.`);
+	} else {
+		if (slave.skill.whoring <= 10) {
+			if (slave.skill.entertainment <= 10) {
+			} else if (slave.skill.entertainment <= 30) {
+				r.push(`${He} is <span class="aquamarine">reasonably entertaining.</span>`);
+			} else if (slave.skill.entertainment <= 60) {
+				r.push(`${He} is a <span class="aquamarine">skilled entertainer.</span>`);
+			} else if (slave.skill.entertainment < 100) {
+				r.push(`${He} is an <span class="aquamarine">expert entertainer.</span>`);
+			} else {
+				r.push(`${He} is a <span class="aquamarine">master of entertainment.</span>`);
+			}
+		} else {
+			if (slave.skill.entertainment <= 10) {
+			} else if (slave.skill.entertainment <= 30) {
+				r.push(`${He} is <span class="aquamarine">reasonably entertaining</span> and`);
+			} else if (slave.skill.entertainment <= 60) {
+				r.push(`${He} is a <span class="aquamarine">skilled entertainer</span> and`);
+			} else if (slave.skill.entertainment < 100) {
+				r.push(`${He} is an <span class="aquamarine">expert entertainer</span> and`);
+			} else {
+				r.push(`${He} is a <span class="aquamarine">master of entertainment</span> and`);
+			}
+		}
+		if (slave.skill.whoring <= 10) {
+		} else if (slave.skill.whoring <= 30) {
+			if (slave.skill.entertainment <= 10) {
+				r.push(`${He}`);
+			}
+			r.push(`has <span class="aquamarine">basic experience as a prostitute.</span>`);
+		} else if (slave.skill.whoring <= 60) {
+			if (slave.skill.entertainment <= 10) {
+				r.push(`${He} is`);
+			}
+			r.push(`a <span class="aquamarine">skilled streetwalker.</span>`);
+		} else if (slave.skill.whoring < 100) {
+			if (slave.skill.entertainment <= 10) {
+				r.push(`${He} is`);
+			}
+			r.push(`an <span class="aquamarine">expert working ${girl}.</span>`);
+		} else {
+			if (slave.skill.entertainment <= 10) {
+				r.push(`${He} is`);
+			}
+			r.push(`a <span class="aquamarine">masterful whore.</span>`);
+		}
+	}
+	return r.join(" ");
+};
+
diff --git a/src/pregmod/incubator.tw b/src/pregmod/incubator.tw
index c55f0fcccab0610563a335c5103ed679fb71278f..cd8bed8614fee169bc544f58f8682b9767ce38e6 100644
--- a/src/pregmod/incubator.tw
+++ b/src/pregmod/incubator.tw
@@ -85,7 +85,7 @@ Reserve an eligible mother-to-be's child to be placed in a tank upon birth. Of $
 			<<set _pregWeek = $slaves[_u].pregWeek>>
 			<<set _slaveName = SlaveFullName($slaves[_u])>>
 			<div class="possible" @id="_slaveId" @data-preg-count="_pregCount" @data-reserved-spots="_reservedIncubator" @data-preg-week="_pregWeek" @data-name="_slaveName">
-			<<print "[[_slaveName|Long Slave Description][$activeSlave = $slaves[" + _u + "], $nextLink = passage()]]">> is $slaves[_u].pregWeek week<<if $slaves[_u].pregWeek > 1>>s<</if>> pregnant with
+			<<= App.UI.slaveDescriptionDialog($slaves[_u])>> is $slaves[_u].pregWeek week<<if $slaves[_u].pregWeek > 1>>s<</if>> pregnant with
 			<<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>>
 			<<elseif $slaves[_u].pregSource == -1>>your
 			<<elseif $slaves[_u].pregSource == -2>>a citizen's
diff --git a/src/pregmod/killSlave.tw b/src/pregmod/killSlave.tw
index 3cb552dfd4e32927b900631597aadb68aea68cdd..79161249e9934f79eef68a671c11ea63e2040de5 100644
--- a/src/pregmod/killSlave.tw
+++ b/src/pregmod/killSlave.tw
@@ -185,13 +185,11 @@ you <<if canHear($activeSlave)>>quietly <</if>>reach behind your desk and pull o
 				$slaves[_ss].slaveName is @@.mediumorchid;grieved@@ that you have killed _his2 best source of comfort and companionship in a life of bondage.
 				<br><br>
 				<<set $slaves[_ss].devotion -= $slaves[_ss].relationship*10>>
-				<<set $display = 1>>
 			<</if>>
 		<<elseif $activeSlave.relationship == -3>>
 			Killing one of your slave $wives is @@.red;socially unacceptable.@@ In addition, your other devoted slaves are @@.gold;worried@@ that you may not respect their status.
 			<br><br>
 			<<run repX(-200, "event")>>
-			<<set $display = 1>>
 			<<for _ss = 0; _ss < $slaves.length; _ss++>>
 				<<if $slaves[_ss].devotion > 50>>
 					<<set $slaves[_ss].trust -= 10>>
@@ -205,7 +203,6 @@ you <<if canHear($activeSlave)>>quietly <</if>>reach behind your desk and pull o
 				$slaves[_ss].slaveName is @@.hotpink;pleased@@ that $he won't have to see _his2 rival any more.
 				<br><br>
 				<<set $slaves[_ss].devotion += $slaves[_ss].rivalry*3>>
-				<<set $display = 1>>
 			<</if>>
 		<</if>>
 
diff --git a/src/uncategorized/clubReport.tw b/src/uncategorized/clubReport.tw
index 930a6c113e0044a91fed43750ae0bb7eeed6f9b3..c3537777ab0b052f913f4f6546b45ec0192fce45 100644
--- a/src/uncategorized/clubReport.tw
+++ b/src/uncategorized/clubReport.tw
@@ -1,6 +1,6 @@
 :: Club Report [nobr]
 
-<span id="clubstats" />
+<span id="clubstats"></span>
 
 <<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.club)>>
 <<set _DL = _slaves.length, _SL = $slaves.length, $clubBonuses = 0, $legendaryEntertainerID = 0, _FLsFetish = 0>>
diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw
index d94d60c5a4c80811714c271b8b99d70a76058303..2a94314a41f7534dc7c75281748c93e7441993eb 100644
--- a/src/uncategorized/longSlaveDescription.tw
+++ b/src/uncategorized/longSlaveDescription.tw
@@ -1,858 +1,2 @@
 :: Long Slave Description [nobr]
-
-<<run SlaveStatClamp($activeSlave)>>
-<<setLocalPronouns $activeSlave>>
-
-<span id="artFrame">
-	<<if $seeImages == 1 && $eventDescription != 1 && passage() != "Slave Interact">>
-		<<if $imageChoice == 1>>
-			<div class="imageRef lrgVector"><div class="mask">&nbsp;</div><<= SlaveArt($activeSlave, 3, 0)>></div>
-		<<else>>
-			<div class="imageRef lrgRender"><div class="mask">&nbsp;</div><<= SlaveArt($activeSlave, 3, 0)>></div>
-		<</if>>
-	<</if>>
-</span>
-
-<span style="font-weight:bold"><span class="pink"><<= SlaveFullName($activeSlave)>></span></span>
-
-<<if $activeSlave.custom.label>> (<span class="yellow"><span style="font-weight:bold"><<print $activeSlave.custom.label>></span></span>)<</if>>
-
-<<if $ui == "start">>
-<<elseif $saleDescription == 1>>
-	<<if $applyLaw == 1>>
-		has passed inspection to be sold in your arcology.
-		<<= App.Desc.lawCompliance($activeSlave)>> /* includes CheckForGingering */
-	<<else>>
-		is for sale and is available to inspect.
-		<<if $prisonCrime>> /* reports a slave's crime in the criminal market */
-			$He $prisonCrime
-			<<set $prisonCrime = 0>>
-		<</if>>
-	<</if>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight:bold">$activeSlave.slaveName</span>
-<</if>>
-
-is
-
-<<if $activeSlave.devotion < -95>>a <span class="darkviolet">hate-filled,</span>
-<<elseif $activeSlave.devotion < -50>>a <span class="darkviolet">hateful,</span>
-<<elseif $activeSlave.devotion < -20>>a <span class="mediumorchid">reluctant,</span>
-<<elseif $activeSlave.devotion <= 20>>a <span class="yellow">hesitant,</span>
-<<elseif $activeSlave.devotion <= 50>>an <span class="hotpink">accepting,</span>
-<<elseif $activeSlave.devotion <= 95>>a <span class="deeppink">devoted,</span>
-<<else>>a <span class="magenta">worshipful,</span>
-<</if>>
-<<if $activeSlave.trust < -95>><span class="goldenrod">abjectly terrified</span>
-<<elseif $activeSlave.trust < -50>><span class="goldenrod">terrified</span>
-<<elseif $activeSlave.trust < -20>><span class="gold">frightened</span>
-<<elseif $activeSlave.trust < 20>><span class="yellow">fearful</span>
-<<elseif $activeSlave.trust <= 50>>
-	<<if $activeSlave.devotion < -20>>
-		<span class="orange">careful</span>
-	<<else>>
-		<span class="mediumaquamarine">careful</span>
-	<</if>>
-<<elseif $activeSlave.trust < 95>>
-	<<if $activeSlave.devotion < -20>>
-		<span class="orangered">bold</span>
-	<<else>>
-		<span class="mediumseagreen">trusting</span>
-	<</if>>
-<<else>>
-	<<if $activeSlave.devotion < -20>>
-		<span class="darkred">defiant</span>
-	<<else>>
-		<span class="seagreen">profoundly trusting</span>
-	<</if>>
-<</if>>
-
-<<set $desc = SlaveTitle($activeSlave)>>
-<span style="font-weight:bold"><span class="coral">$desc.</span></span>
-
-<<if $activeSlave.indenture > -1>>
-	$His <<if $activeSlave.indentureRestrictions > 1>>restrictive<<elseif $activeSlave.indentureRestrictions > 0>>protective<<else>>unrestricted<</if>> indenture
-	<<if $activeSlave.indenture > 0>>
-		<<if $activeSlave.indenture > 1>>
-			has $activeSlave.indenture weeks left to run.
-		<<else>>
-			expires next week.
-		<</if>>
-	<<else>>
-		expires this week.
-	<</if>>
-<</if>>
-
-<<= App.Desc.sceneIntro($activeSlave)>>
-
-<<= App.Desc.name($activeSlave)>>
-
-<<= App.Desc.ageAndHealth($activeSlave)>>
-
-<<if $saleDescription != 1>>
-	<<if $clinic != 0 && $clinicUpgradeScanner == 1>>
-		<<if $activeSlave.chem > 15>>
-			$clinicNameCaps's scanners score long term carcinogenic buildup in $his body at <span class="cyan"><<print Math.ceil($activeSlave.chem/10)>>.</span>
-		<<else>>
-			$clinicNameCaps's scanners confirm that $he has good prospects for long term health.
-		<</if>>
-	<</if>>
-
-	<<print App.Desc.geneticQuirkAssessment($activeSlave)>>
-
-	<<if $showSexualHistory == 1 && $ui != "start">>
-		<<= App.Desc.sexualHistory($activeSlave)>>
-	<</if>>
-<</if>>
-
-<<= App.Desc.mind($activeSlave)>>
-
-<<if $saleDescription == 0>>
-	<<if $eventDescription == 0>>
-		<<if canSee($activeSlave)>>
-			<<if ($activeSlave.attrKnown == 1)>>
-				<<if ($activeSlave.assignment != "work in the dairy") || ($dairyRestraintsSetting > 1)>>
-					<<if ($activeSlave.attrXX > 85) && ($PC.boobs >= 400)>>
-						$His attraction to women is obvious: $he can't seem to stop staring at your breasts.
-					<<elseif ($activeSlave.attrXY > 85) && ($PC.dick != 0)>>
-						$His attraction to men is obvious: $he can't seem to stop glancing down at your package.
-					<<elseif ($activeSlave.attrXY > 85) && $PC.title == 1 && ($PC.boobs < 300)>>
-						$His attraction to men is obvious: $he can't seem to stop checking out your broad chest.
-					<</if>>
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<= App.Desc.family($activeSlave)>>
-
-<<if $activeSlave.relationship >= 3 && totalRelatives($activeSlave) > 0>>
-	<<set _lover = getSlave($activeSlave.relationshipTarget)>>
-	<<if def _lover>>
-		<<set _relTerm = relativeTerm($activeSlave, _lover)>>
-		<<if _relTerm !== null>>
-			$He is in an <span class="lightgreen">incestuous relationship with $his _relTerm, <<= SlaveFullName(_lover)>>.</span>
-		<</if>>
-	<</if>>
-<<elseif $activeSlave.relationship <= -2>>
-	<<set _relTerm = relativeTerm($activeSlave, $PC)>>
-	<<if _relTerm !== null>>
-		$He is in an <span class="lightgreen">incestuous relationship with $his _relTerm, you.</span>
-	<</if>>
-<</if>>
-
-<<if $activeSlave.rivalry != 0>>
-	<<set _lsd = $slaveIndices[$activeSlave.rivalryTarget]>>
-	<<if def _lsd>>
-		$He
-		<<if $activeSlave.rivalry <= 1>>
-			<span class="lightsalmon">dislikes</span> <<= SlaveFullName($slaves[_lsd])>>.
-		<<elseif $activeSlave.rivalry <= 2>>
-			is <<= SlaveFullName($slaves[_lsd])>>'s <span class="lightsalmon">rival.</span>
-		<<else>>
-			<span class="lightsalmon">bitterly hates</span> <<= SlaveFullName($slaves[_lsd])>>.
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $activeSlave.bodySwap > 0>>
-	<<if $activeSlave.origBodyOwner !== "">>
-		$He currently possesses <<print $activeSlave.origBodyOwner>>'s body.
-	<</if>>
-	<<if $activeSlave.fetish != "mindbroken" && $activeSlave.fuckdoll == 0 && $activeSlave.origBodyOwnerID > 0>>
-		<<set _lsd = $slaveIndices[$activeSlave.origBodyOwnerID]>>
-		<<if def _lsd>>
-			$He is fully aware that <<= SlaveFullName($slaves[_lsd])>> is in $his old body.
-		<</if>>
-	<</if>>
-<</if>>
-
-<br>&nbsp;&nbsp;&nbsp;&nbsp;
-
-<<if $saleDescription == 0>>
-	<<if $activeSlave.origin != 0>>
-		$activeSlave.origin
-	<</if>>
-<</if>>
-
-<<= App.Desc.career($activeSlave)>>
-
-<<if $activeSlave.prestige > 0>>
-	<<if $activeSlave.prestigeDesc>>$activeSlave.prestigeDesc<</if>>
-	<<if $activeSlave.prestige > 2>>
-		<span class="green">It is extremely prestigious to own $him.</span>
-	<<elseif $activeSlave.prestige > 1>>
-		<span class="green">It is quite prestigious to own $him.</span>
-	<<else>>
-		<span class="green">It is fairly prestigious to own $him.</span>
-	<</if>>
-<</if>>
-
-<<if $activeSlave.porn.prestige > 0>>
-	<<if $activeSlave.porn.prestigeDesc>>$activeSlave.porn.prestigeDesc<</if>>
-	<<if $activeSlave.porn.prestige > 2>>
-		As such, $he tends to gain a following wherever $he goes.
-	<<elseif $activeSlave.porn.prestige > 1>>
-		As such, $he is recognized often.
-	<<else>>
-		As such, $he is recognized occasionally.
-	<</if>>
-<</if>>
-
-<<if $activeSlave.prestige > 0 || $activeSlave.porn.prestige > 1>>
-	<<if $activeSlave.fuckdoll == 0 && $activeSlave.markings == "birthmark">>
-		$He has a large, liver-colored birthmark, but since $he's well known, this uniqueness adds to $his beauty rather than detracting from it.
-	<</if>>
-<</if>>
-
-<<if $activeSlave.fuckdoll > 0>>
-	$He is
-	<<if $activeSlave.fuckdoll <= 10>>
-		poorly adapted to life as a living sex toy.
-	<<elseif $activeSlave.fuckdoll <= 30>>
-		<span class="aquamarine">moderately adapted to life as a living sex toy.</span>
-	<<elseif $activeSlave.fuckdoll <= 60>>
-		<span class="aquamarine">well adapted to life as a living sex toy.</span>
-	<<elseif $activeSlave.fuckdoll < 100>>
-		<span class="aquamarine">almost perfectly adapted to life as a living sex toy.</span>
-	<<else>>
-		<span class="aquamarine">perfectly adapted to life as a living sex toy.</span>
-	<</if>>
-	Entertainment and prostitution skills are irrelevant for a Fuckdoll.
-<<else>>
-	<<if $activeSlave.skill.whoring <= 10>>
-		<<if $activeSlave.skill.entertainment <= 10>>
-		<<elseif $activeSlave.skill.entertainment <= 30>>
-			$He is <span class="aquamarine">reasonably entertaining.</span>
-		<<elseif $activeSlave.skill.entertainment <= 60>>
-			$He is a <span class="aquamarine">skilled entertainer.</span>
-		<<elseif $activeSlave.skill.entertainment < 100>>
-			$He is an <span class="aquamarine">expert entertainer.</span>
-		<<else>>
-			$He is a <span class="aquamarine">master of entertainment.</span>
-		<</if>>
-	<<else>>
-		<<if $activeSlave.skill.entertainment <= 10>>
-		<<elseif $activeSlave.skill.entertainment <= 30>>
-			$He is <span class="aquamarine">reasonably entertaining</span> and
-		<<elseif $activeSlave.skill.entertainment <= 60>>
-			$He is a <span class="aquamarine">skilled entertainer</span> and
-		<<elseif $activeSlave.skill.entertainment < 100>>
-			$He is an <span class="aquamarine">expert entertainer</span> and
-		<<else>>
-			$He is a <span class="aquamarine">master of entertainment</span> and
-		<</if>>
-	<</if>>
-	<<if $activeSlave.skill.whoring <= 10>>
-	<<elseif $activeSlave.skill.whoring <= 30>>
-		<<if $activeSlave.skill.entertainment <= 10>>$He <</if>>has <span class="aquamarine">basic experience as a prostitute.</span>
-	<<elseif $activeSlave.skill.whoring <= 60>>
-		<<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>a <span class="aquamarine">skilled streetwalker.</span>
-	<<elseif $activeSlave.skill.whoring < 100>>
-		<<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>an <span class="aquamarine">expert working $girl.</span>
-	<<else>>
-		<<if $activeSlave.skill.entertainment <= 10>>$He is <</if>>a <span class="aquamarine">masterful whore.</span>
-	<</if>>
-<</if>>
-
-<<if ($activeSlave.custom.desc != "") && (def $activeSlave.custom.desc)>>
-	<<print $activeSlave.custom.desc>>
-<</if>>
-
-<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty > 0>>
-	<<if genderLawPass($activeSlave) == 1>>
-		$His body is a perfect example of the fashionable feminine ideal.
-	<</if>>
-<<elseif $arcologies[0].FSSlimnessEnthusiastLaw == 1>>
-	<<if slimLawPass($activeSlave) == 1>>
-		$His body is a perfect example of the fashionable ideal flat body.
-	<</if>>
-<<elseif $arcologies[0].FSHedonisticDecadenceLaw2 == 1>>
-	<<if ($activeSlave.boobs >= 2000) && ($activeSlave.butt >= 5) && ($activeSlave.weight > 95)>>
-		$His body is a perfect example of the fashionable plump body.
-	<</if>>
-<</if>>
-
-<<if $arcologies[0].FSRestartSMR > 0 && $arcologies[0].FSRestart > 80 && ($activeSlave.dick == 0) && ($activeSlave.balls == 0) && ($activeSlave.ovaries == 0) && ($activeSlave.mpreg == 0) && ($activeSlave.vagina < 0)>>
-	$His body is a perfect example of a subhuman who has accepted their place in society.
-<</if>>
-
-<<if $arcologies[0].FSIntellectualDependencyLawBeauty == 1>>
-	$He currently is graded
-	<<switch bimboScore($activeSlave)>>
-	<<case 6>>
-		an S-class
-	<<case 5>>
-		an A-class
-	<<case 4>>
-		a B-class
-	<<case 3>>
-		a C-class
-	<<case 2>>
-		a D-class
-	<<case 1>>
-		an E-class
-	<<default>>
-		an F-class
-	<</switch>>
-	bimbo by societal trends.
-<</if>>
-
-<<if ($showScores != 0)>>
-	Currently, $he has an
-	<span class="pink">
-		<span style="font-weight:bold">
-			attractiveness score
-		</span>
-		of
-		<span class="text-decoration-line: underline">
-			<span id="BeautyTooltip" style="font-weight:bold">
-				<<if $cheatMode || $debugMode>>
-					<<link "<<= Beauty($activeSlave)>>">>
-						<<run BeautyTooltip($activeSlave)>>
-					<</link>>
-				<<else>>
-					<<= Beauty($activeSlave)>>
-				<</if>>
-			</span>
-		</span>
-	</span>
-	and a
-	<span class="lightcoral">
-		<span style="font-weight:bold">
-			sexual score
-		</span>
-		of
-		<span class="text-decoration-line: underline">
-			<span id="FResultTooltip" style="font-weight:bold">
-				<<if $cheatMode || $debugMode>>
-					<<link "<<= FResult($activeSlave)>>.">>
-						<<run FResultTooltip($activeSlave)>>
-					<</link>>
-				<<else>>
-					<<= FResult($activeSlave)>>.
-				<</if>>
-			</span>
-		</span>
-	</span>
-<</if>>
-
-<br>&nbsp;&nbsp;&nbsp;&nbsp;
-
-<<= App.Desc.limbs($activeSlave)>>
-
-<<= App.Desc.clothing($activeSlave)>>
-<<= App.Desc.armwear($activeSlave)>>
-<<if $showBodyMods == 1>>
-	<<= App.Desc.clothingCorset($activeSlave)>>
-<</if>>
-
-<<if ($showClothing == 1) && ($saleDescription == 0)>>
-	$He
-<<else>>
-	$activeSlave.slaveName
-<</if>>
-<<set _averageHeight = Height.mean($activeSlave)>>
-is
-<<if $activeSlave.height <= (_averageHeight+5) && $activeSlave.height >= (_averageHeight-5)>>
-	an average height<<if $activeSlave.physicalAge < 16>> for $his age<</if>>
-<<elseif $activeSlave.height < (_averageHeight-15)>>
-	petite<<if $activeSlave.physicalAge < 16>> for $his age<</if>>
-<<elseif $activeSlave.height < (_averageHeight-5)>>
-	short<<if $activeSlave.physicalAge < 16>> for $his age<</if>>
-<<elseif $activeSlave.height > (_averageHeight+15)>>
-	very tall<<if $activeSlave.physicalAge < 16>> for $his age<</if>>
-<<elseif $activeSlave.height > (_averageHeight+5)>>
-	tall<<if $activeSlave.physicalAge < 16>> for $his age<</if>>
-<</if>>
-<<if $showHeightCMs == 1>> at <<= heightToEitherUnit($activeSlave.height)>>,<</if>>
-
-and
-
-<<if $activeSlave.weight > 190 >>
-	<<if $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<print either("perfectly curvy", "perfectly plush")>>.
-	<<else>>
-		<span class="red"><<print either("dangerously fat", "dangerously overweight", "extremely obese")>>.</span>
-	<</if>>
-<<elseif $activeSlave.weight > 160 >>
-	<<if $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<print either("spectacularly curvy", "spectacularly plush")>>.
-	<<else>>
-		<span class="red"><<print either("extremely fat", "extremely overweight", "very obese")>>.</span>
-	<</if>>
-<<elseif $activeSlave.weight > 130 >>
-	<<if $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<print either("amazingly curvy", "amazingly plush")>>.
-	<<else>>
-		<span class="red"><<print either("obese", "very fat", "very overweight")>>.</span>
-	<</if>>
-<<elseif $activeSlave.weight > 95>>
-	<<if $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<print either("extremely curvy", "extremely plush")>><<if $activeSlave.hips > 1>>, $his huge hips complementing $his plushness perfectly<</if>>.
-	<<elseif $activeSlave.hips > 1>>
-		<<print either("extremely curvy", "extremely plush")>>, but $his huge hips make the extra weight attractive on $him.
-	<<else>>
-		<span class="red"><<print either("carrying a lot of extra weight", "fat", "overweight")>>.</span>
-	<</if>>
-<<elseif $activeSlave.weight > 30>>
-	<<if $arcologies[0].FSHedonisticDecadence != "unset">>
-		<<print either("quite curvy", "very plush")>><<if $activeSlave.hips > 1>>, $his motherly hips adding to $his soft appeal<</if>>.
-	<<elseif $activeSlave.hips > 1>>
-		<<print either("quite curvy", "very plush")>>, but $his motherly hips make the extra weight attractive on $him.
-	<<else>>
-		<span class="red"><<print either("carrying extra weight", "chubby")>>.</span>
-	<</if>>
-<<elseif $activeSlave.weight > 10 >><<print either("nicely plush", "pleasingly curvy")>>.
-<<elseif $activeSlave.weight >= -10>><<print either("a healthy weight", "an attractive weight for $his frame", "neither too fat nor too skinny")>>.
-<<elseif $activeSlave.weight >= -30>><<print either("appealingly skinny", "pleasingly thin")>>.
-<<elseif $activeSlave.weight >= -95>>
-	<<if $activeSlave.hips > 1>>
-		<<print either("quite skinny", "very thin")>>, but $his wide hips make the gap between $his thighs very noticeable.
-	<<elseif $activeSlave.hips < -1>>
-		<<print either("quite skinny", "very thin")>>, but $his trim hips make $him look like a model.
-	<<else>>
-		<span class="red"><<print either("rail thin", "too skinny", "underweight")>>.</span>
-	<</if>>
-<<else>><span class="red"><<print either("dangerously skinny", "emaciated")>>.</span>
-<</if>>
-
-<<if $activeSlave.hips > 2>>
-	$His hips are unrealistically wide, it is obvious they have been artificially widened.
-<</if>>
-
-<<= App.Desc.waist($activeSlave)>>
-
-<<if $arcologies[0].FSStatuesqueGlorification != "unset">>
-	<<if heightPass($activeSlave)>>
-		$He is tall enough <<if setup.heightBoostingShoes.includes($activeSlave.shoes)>>in $his <<= heightToEitherUnit(heelLength($activeSlave))>> $activeSlave.shoes <</if>>to measure up to society's strict tastes.
-	<<else>>
-		$He fails to measure up to society's strict tastes<<if setup.heightBoostingShoes.includes($activeSlave.shoes)>> even with $his <<= heightToEitherUnit(heelLength($activeSlave))>> $activeSlave.shoes<</if>>.
-	<</if>>
-<<elseif $arcologies[0].FSPetiteAdmiration != "unset">>
-	<<if heightPass($activeSlave)>>
-		Society finds $him adorably short.
-	<<elseif $activeSlave.height >= 170>>
-		Society finds $him distastefully tall.
-	<</if>>
-<</if>>
-
-<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty > 0>>
-	<<if $arcologies[0].FSHedonisticDecadence == "unset" && $arcologies[0].FSPhysicalIdealistStrongFat == 0>>
-		<<if $activeSlave.weight > 130>>
-			$He is much too fat for the fashionable feminine ideal.
-		<<elseif $activeSlave.weight > 30>>
-			$He is too fat for the fashionable feminine ideal.
-		<<elseif $activeSlave.weight < -30>>
-			$He is too skinny for the fashionable feminine ideal.
-		<</if>>
-	<<else>>
-		<<if $activeSlave.weight > 130>>
-			$He is much too fat for the fashionable feminine ideal.
-		<<elseif $activeSlave.weight < -30>>
-			$He is too skinny for the fashionable feminine ideal.
-		<</if>>
-	<</if>>
-<<elseif $arcologies[0].FSSlimnessEnthusiastLaw == 1>>
-	<<if $arcologies[0].FSHedonisticDecadence == "unset" && $arcologies[0].FSPhysicalIdealistStrongFat == 0>>
-		<<if $activeSlave.weight > 30>>
-			$He is much too fat for the fashionable feminine ideal.
-		<<elseif $activeSlave.weight > 10>>
-			$He is too fat for the fashionable feminine ideal.
-		<</if>>
-	<<else>>
-		<<if $activeSlave.weight > 60>>
-			$He is much too fat for the fashionable feminine ideal.
-		<<elseif $activeSlave.weight > 30>>
-			$He is too fat for the fashionable feminine ideal.
-		<</if>>
-	<</if>>
-<<elseif $arcologies[0].FSHedonisticDecadenceLaw2 == 1>>
-	<<if $activeSlave.weight <= 95>>
-		$He is too thin for the fashionable feminine ideal.
-	<<elseif $activeSlave.weight <= 10>>
-		$He is much too thin for the fashionable feminine ideal.
-	<</if>>
-<</if>>
-
-<<if canWalk($activeSlave)>>
-	<<if $activeSlave.weight > (170+($activeSlave.muscles/5)) && $activeSlave.physicalAge >= 18>>
-		$He is so fat that it is difficult for $him to move.
-		<<if $activeSlave.muscles > 95>>
-			However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks.
-		<<elseif $activeSlave.muscles > 30>>
-			$He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight.
-		<<elseif $activeSlave.muscles > 5>>
-			$He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.
-		<<else>>
-			$He cannot get to $his feet unaided, and tries to stay seated as much as $he can.
-		<</if>>
-	<<elseif $activeSlave.weight > (110+($activeSlave.muscles/20)) && $activeSlave.physicalAge <= 3>>
-		$He is so fat that it is difficult for $him to move.
-		<<if $activeSlave.muscles > 95>>
-			However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks.
-		<<elseif $activeSlave.muscles > 30>>
-			$He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight.
-		<<elseif $activeSlave.muscles > 5>>
-			$He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.
-		<<else>>
-			$He cannot get to $his feet unaided, and tries to stay seated as much as $he can.
-		<</if>>
-	<<elseif $activeSlave.weight > (140+($activeSlave.muscles/15)) && $activeSlave.physicalAge <= 12>>
-		$He is so fat that it is difficult for $him to move.
-		<<if $activeSlave.muscles > 95>>
-			However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks.
-		<<elseif $activeSlave.muscles > 30>>
-			$He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight.
-		<<elseif $activeSlave.muscles > 5>>
-			$He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.
-		<<else>>
-			$He cannot get to $his feet unaided, and tries to stay seated as much as $he can.
-		<</if>>
-	<<elseif $activeSlave.weight > (165+($activeSlave.muscles/10)) && $activeSlave.physicalAge < 18>>
-		$He is so fat that it is difficult for $him to move.
-		<<if $activeSlave.muscles > 95>>
-			However, $he is so powerfully built that $he can manage it with effort, though $he often has to stop for breaks.
-		<<elseif $activeSlave.muscles > 30>>
-			$He can barely manage to get to $his feet unaided, and usually walks alongside objects to help relieve the weight.
-		<<elseif $activeSlave.muscles > 5>>
-			$He requires assistance to get to $his feet, and tends to lean on things to help relieve the weight. Much furniture has met an early demise thanks to this habit.
-		<<else>>
-			$He cannot get to $his feet unaided, and tries to stay seated as much as $he can.
-		<</if>>
-	<</if>>
-<</if>>
-
-<<= App.Desc.heightImplant($activeSlave)>>
-
-$He is
-<<if $activeSlave.muscles > 95>>
-	<span class="pink">extremely muscular,</span> with defined pecs, powerful glutes, and massive traps<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>.
-<<elseif $activeSlave.muscles > 50>>
-	<span class="pink">quite muscular,</span> with ripped abs, strong shoulders, and defined lats<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>.
-<<elseif $activeSlave.muscles > 30>>
-	<span class="pink">well built,</span> yet feminine with defined abs and strong shapely muscles<<if $activeSlave.weight > 95>> hidden beneath a layer of fat<</if>>.
-<<elseif $activeSlave.muscles > 5>>
-	<span class="pink">well built,</span> yet feminine, with just-visible muscles<<if $activeSlave.weight > 30>> hidden beneath a layer of fat<</if>>.
-<<elseif $activeSlave.muscles > -6>>
-	<span class="pink">soft and feminine,</span> with no visible muscles.
-<<elseif $activeSlave.muscles > -31>>
-	<span class="pink">rather weak,</span> with barely any muscles.
-<<elseif $activeSlave.muscles > -96>>
-	<span class="pink">very weak;</span> $he struggles with day-to-day tasks.
-<<else>>
-	<span class="red">frail;</span> $he can barely hold $himself up.
-<</if>>
-
-<<if $arcologies[0].FSGenderFundamentalistLawBeauty + $arcologies[0].FSGenderRadicalistLawBeauty + $arcologies[0].FSSlimnessEnthusiastLaw > 0 && $arcologies[0].FSPhysicalIdealist == "unset" && $arcologies[0].FSHedonisticDecadenceStrongFat == 0>>
-	<<if $arcologies[0].FSPhysicalIdealistLaw > 0 && $activeSlave.muscles > 50>>
-		$He is entirely too muscular for the fashionable feminine ideal.
-	<<elseif $activeSlave.muscles > 30>>
-		$He is entirely too muscular for the fashionable feminine ideal.
-	<</if>>
-<</if>>
-
-<<if hasAnyNaturalArms($activeSlave)>>
-	<<if $activeSlave.weight > 190>>
-		$He has <<if hasBothNaturalArms($activeSlave)>>hugely thick arms<<else>>a hugely thick arm<</if>> with sagging fat rolls<<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 160>>
-		$He has <<if hasBothNaturalArms($activeSlave)>>thick arms<<else>>a thick arm<</if>> with drooping fat folds<<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 130>>
-		$He has <<if hasBothNaturalArms($activeSlave)>>plump arms<<else>>a plump arm<</if>><<if $activeSlave.muscles > 5>> with<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 97>>
-		$He has <<if hasBothNaturalArms($activeSlave)>>chubby arms<<else>>a chubby arm<</if>><<if $activeSlave.muscles > 5>> with<<else>>.<</if>>
-	<<elseif $activeSlave.muscles > 5>>
-		$He has <<if hasBothNaturalArms($activeSlave)>>normal arms<<else>>a normal arm<</if>> with
-	<</if>>
-	<<if $activeSlave.muscles > 95>>
-		huge muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flesh<</if>>.
-	<<elseif $activeSlave.muscles > 30>>
-		obvious muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flesh<</if>>.
-	<<elseif $activeSlave.muscles > 5>>
-		toned muscles<<if $activeSlave.weight > 30>> hidden beneath $his soft flesh<</if>>.
-	<<else>>
-		/*little muscle to them.*/
-	<</if>>
-<</if>>
-
-<<= App.Desc.bodyguard($activeSlave)>>
-
-<<if ($activeSlave.counter.pitWins + $activeSlave.counter.pitLosses) > 0>>
-	$He has participated in <<print num($activeSlave.counter.pitWins + $activeSlave.counter.pitLosses)>> pit fights, with $activeSlave.counter.pitWins wins and $activeSlave.counter.pitLosses losses.
-<</if>>
-
-<<if $activeSlave.counter.pitKills > 0>>
-	$activeSlave.counter.pitKills slaves have died by $his hand in pit fights.
-<</if>>
-
-<<= App.Desc.piercing($activeSlave, "corset")>>
-
-<<= App.Desc.pregnancy($activeSlave)>>
-
-<<if hasAnyNaturalLegs($activeSlave)>>
-	<<if $activeSlave.weight > 190>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>extremely fat legs with immense soft, rather uneven thighs<<else>>an extremely fat leg with an immense soft, rather uneven thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 160>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>very fat legs with massively thick, soft, somewhat uneven thighs<<else>>a very fat leg with a massively thick, soft, somewhat uneven thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 130>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>fat legs with hugely thick, soft thighs<<else>>a fat leg with a hugely thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 97>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>fat legs with thick, soft thighs<<else>>a fat leg with a thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.weight > 95>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>normal legs with thick, soft thighs<<else>> a normal leg with a thick, soft thigh<</if>><<if $activeSlave.muscles > 5>> and<<else>>.<</if>>
-	<<elseif $activeSlave.muscles > 5>>
-		$He has <<if hasBothNaturalLegs($activeSlave)>>relatively normal legs and thighs<<else>>a relatively normal leg and thigh<</if>> with
-	<</if>>
-	<<if $activeSlave.muscles > 95>>
-		huge muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flab<</if>>.
-	<<elseif $activeSlave.muscles > 30>>
-		obvious muscles<<if $activeSlave.weight > 95>> hidden beneath $his soft flab<</if>>.
-	<<elseif $activeSlave.muscles > 5>>
-		toned muscles<<if $activeSlave.weight > 30>> hidden beneath $his soft flab<</if>>.
-	<<else>>
-		/*barely any muscle in them.*/
-	<</if>>
-<</if>>
-
-<<= App.Desc.mods($activeSlave, "thigh")>>
-<<= App.Desc.mods($activeSlave, "calf")>>
-<<= App.Desc.mods($activeSlave, "ankle")>>
-<<= App.Desc.mods($activeSlave, "foot")>>
-<<= App.Desc.heels($activeSlave, "foot")>>
-<<= App.Desc.skin($activeSlave)>>
-
-<<if $saleDescription == 1>>
-
-	<<= App.Desc.accent($activeSlave)>>
-
-<</if>>
-
-<<set _scarCounter = 0>>
-<<for _scarName, _scar range $activeSlave.scar>>
-	<<if ($activeSlave.ID == $Bodyguard.ID) && _scarCounter > 1>>
-		$His scars make $him look even more menacing than $he actually is.
-		<<break>>
-	<<elseif ($activeSlave.ID == $Bodyguard.ID) && $activeSlave.scar[_scarName].menacing > 0>>
-		$His menacing scar makes $him look terrifying.
-		<<break>>
-	<<elseif ($activeSlave.ID == $Wardeness.ID) && _scarCounter > 1>>
-		$His scars make $him look like $he's in the right place.
-	<</if>>
-	<<set _scarCounter++>>
-<</for>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	<<if $activeSlave.markings == "birthmark" && $activeSlave.prestige == 0 && $activeSlave.porn.prestige < 2>>
-		$He has a large, liver-colored birthmark, detracting from $his beauty.
-	<</if>>
-	<<if ($activeSlave.skin == "sun tanned")>>
-		<<if (($activeSlave.rules.release.slaves === 1) || App.Utils.hasFamilySex($activeSlave))>>
-			<<if ($activeSlave.fetishStrength > 60) && ($activeSlave.fetishKnown == 1)>>
-				$His tan is slightly uneven, since $he enjoys
-				<<if ($activeSlave.fetish == "buttslut")>>
-					letting other tanned slaves share a tanning bed with $him so they can sodomize $him while $he tans.
-				<<elseif ($activeSlave.fetish == "cumslut")>>
-					letting other tanned slaves share a tanning bed with $him so they get oral from $him while $he tans.
-				<<elseif ($activeSlave.fetish == "sadist")>>
-					forcing inferior slaves into the tanning beds with $him so $he can sodomize them while $he tans.
-				<<elseif ($activeSlave.fetish == "dom")>>
-					bringing other slaves into the tanning beds with $him so $he can fuck them while $he tans.
-				<<elseif ($activeSlave.fetish == "masochist") || ($activeSlave.fetish == "submissive")>>
-					letting other slaves into the tanning beds with $him so they can fuck $him while $he tans.
-				<<elseif ($activeSlave.fetish == "boobs")>>
-					bringing other slaves into the tanning beds with $him so $he can tittyfuck them while $he tans.
-				<<elseif ($activeSlave.fetish == "pregnancy") && (random(0,99) < $seeDicks)>>
-					letting slaves with dicks into the tanning beds with $him so they can cum inside $him while $he tans.
-				<<else>>
-					bringing other slaves into the tanning beds with $him to have sex while $he tans.
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	/* Describe any brands that are not directly addressed elsewhere in longSlave */
-	<<= App.Desc.mods($activeSlave, "extra")>>
-<</if>>
-
-<<if ($showClothing == 1) && ($saleDescription == 0)>>
-
-	<<= App.Desc.ears($activeSlave)>>
-
-	<<= App.Desc.upperFace($activeSlave)>>
-
-	<<= App.Desc.hair($activeSlave)>>
-
-<<else>>
-	$His hair is $activeSlave.hColor<<if $activeSlave.hColor != $activeSlave.eyebrowHColor>>, with $activeSlave.eyebrowHColor eyebrows<</if>>.
-<</if>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	<<if ($activeSlave.hColor == "red")>>
-		<<if ($activeSlave.hLength >= 10)>>
-			<<if ($activeSlave.markings == "freckles") || ($activeSlave.markings == "heavily freckled")>>
-				<<if (skinToneLevel($activeSlave.skin) > 5) && (skinToneLevel($activeSlave.skin) < 10)>>
-					It goes perfectly with $his $activeSlave.skin skin and freckles.
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-
-	<<set _pubertyAge = Math.min($activeSlave.pubertyAgeXX, $activeSlave.pubertyAgeXY)>>
-	<<if ($activeSlave.physicalAge < _pubertyAge-2)>>
-		$He is too sexually immature to have armpit hair.
-	<<elseif $activeSlave.underArmHStyle == "hairless">>
-		$His armpits are perfectly smooth and naturally hairless.
-	<<elseif $activeSlave.underArmHStyle == "bald">>
-		$His armpits no longer grow hair, leaving them smooth and hairless.
-	<<elseif ($activeSlave.underArmHStyle == "waxed")>>
-		<<if ($activeSlave.assignment == "work in the dairy") && ($dairyRestraintsSetting > 1)>>
-			$His armpit hair has been removed to prevent chafing.
-		<<else>>
-			$His armpits are waxed and smooth.
-		<</if>>
-	<<elseif ($activeSlave.physicalAge < _pubertyAge-1)>>
-		$He has a few $activeSlave.underArmHColor wisps of armpit hair.
-	<<elseif ($activeSlave.physicalAge < _pubertyAge)>>
-		$He is on the verge of puberty and has a small patch of $activeSlave.underArmHColor armpit hair.
-	<<elseif $activeSlave.underArmHStyle == "shaved">>
-		$His armpits appear hairless, but closer inspection reveals light, $activeSlave.underArmHColor stubble.
-	<<elseif $activeSlave.underArmHStyle == "neat">>
-		$His armpit hair is neatly trimmed <<if !hasBothArms($activeSlave)>>since <<if hasAnyArms($activeSlave)>>at least half<<else>>it<</if>> is always in full view<<else>>to not be visible unless $he lifts $his arms<</if>>.
-	<<elseif $activeSlave.underArmHStyle == "bushy">>
-		$His $activeSlave.underArmHColor armpit hair has been allowed to grow freely, <<if !hasAnyArms($activeSlave)>>creating two bushy patches under where $his arms used to be<<else>>so it can be seen poking out from under $his arm<<if hasBothArms($activeSlave)>>s<</if>> at all times<</if>>.
-	<</if>>
-<</if>>
-
-<<if $activeSlave.voice == 0>>
-	$He is <span class="pink">completely silent,</span> which is understandable, since $he's mute.
-<<else>>
-	<<if $activeSlave.lips > 95>>
-		$He is <span class="pink">effectively mute,</span> since $his lips are so large that $he can no longer speak intelligibly. $He can still <<if $activeSlave.devotion > 50>>moan<<elseif $activeSlave.devotion > 20>>whimper<<else>>scream<</if>> through them, though.
-	<</if>>
-<</if>>
-
-<<if $showBodyMods == 1>>
-	<<if $activeSlave.fuckdoll > 0>>
-		<<if $activeSlave.earPiercing+$activeSlave.eyebrowPiercing+$activeSlave.nosePiercing > 0>>
-			The piercings on $his head run through $his suit, helping secure the material to $his head.
-		<</if>>
-	<<else>>
-		<<= App.Desc.mods($activeSlave, "ear")>>
-		<<= App.Desc.mods($activeSlave, "nose")>>
-		<<= App.Desc.mods($activeSlave, "eyebrow")>>
-		<<= App.Desc.mods($activeSlave, "cheek")>>
-		<<= App.Desc.mods($activeSlave, "neck")>>
-		<<if ($activeSlave.custom.tattoo != "") && (def $activeSlave.custom.tattoo)>>
-			<<print $activeSlave.custom.tattoo>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<= App.Desc.horns($activeSlave)>>
-<<= App.Desc.face($activeSlave)>>
-<<= App.Desc.mouth($activeSlave)>>
-
-<<if ($showClothing == 1) && ($saleDescription == 0)>>
-
-	<<if $activeSlave.fuckdoll == 0>>
-		<<= App.Desc.collar($activeSlave)>>
-		<<= App.Desc.faceAccessory($activeSlave)>>
-		<<= App.Desc.mouthAccessory($activeSlave)>>
-		<<if ($activeSlave.relationship > 4)>>
-			<<if hasAnyArms($activeSlave)>>
-				$He has a simple gold band on the little finger of $his <<if !hasLeftArm($activeSlave)>>right<<else>>left<</if>> hand.
-			<<else>>
-				$He has a simple gold band on a length of chain around $his neck.
-			<</if>>
-		<<elseif ($activeSlave.relationship == -3)>>
-			<<if hasAnyArms($activeSlave)>>
-				$He has a simple steel band on the little finger of $his <<if !hasLeftArm($activeSlave)>>right<<else>>left<</if>> hand.
-			<<else>>
-				$He has a simple steel band on a length of cord around $his neck.
-			<</if>>
-		<</if>>
-	<</if>>
-
-<</if>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	<<= App.Desc.nails($activeSlave)>>
-<</if>>
-<<= App.Desc.mods($activeSlave, "back")>>
-<<= App.Desc.mods($activeSlave, "shoulder")>>
-<<= App.Desc.mods($activeSlave, "upper arm")>>
-<<= App.Desc.mods($activeSlave, "lower arm")>>
-<<= App.Desc.mods($activeSlave, "hand")>>
-<<= App.Desc.mods($activeSlave, "wrist")>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	<<if $activeSlave.minorInjury != 0>>
-		<<if $activeSlave.minorInjury != "sore ass">>
-			$He is sporting a <span class="red">$activeSlave.minorInjury,</span> covered by makeup.
-		<</if>>
-	<</if>>
-<</if>>
-<<if $activeSlave.health.illness > 0>>
-	<<if $activeSlave.fuckdoll == 0>>
-		$He
-	<<else>>
-		$His suit reports that $he
-	<</if>>
-	<<if ($activeSlave.health.illness === 1)>>
-		<<if $activeSlave.fuckdoll == 0>>
-			is <span class="red">feeling under the weather.</span>
-		<<else>>
-			has <span class="red">fallen ill.</span>
-		<</if>>
-	<<elseif ($activeSlave.health.illness === 2)>>
-		is <span class="red">somewhat ill.</span>
-	<<elseif ($activeSlave.health.illness === 3)>>
-		is <span class="red">sick.</span>
-	<<elseif ($activeSlave.health.illness === 4)>>
-		is <span class="red">very sick.</span>
-	<<elseif ($activeSlave.health.illness === 5)>>
-		is <span class="red">terribly ill.</span>
-	<</if>>
-<</if>>
-
-<br>&nbsp;&nbsp;&nbsp;&nbsp;
-
-/* Calling all boob widgets */
-<<print App.Desc.boobs($activeSlave)>>
-<<= App.Desc.boobsShape($activeSlave)>>
-<<print App.Desc.boobsExtra($activeSlave)>>
-<<= App.Desc.mods($activeSlave, "chest")>>
-<<= App.Desc.mods($activeSlave, "breast")>>
-<<= App.Desc.shoulders($activeSlave)>>
-<<print App.Desc.nipples($activeSlave)>>
-<<= App.Desc.mods($activeSlave, "nipple")>>
-<<print App.Desc.areola($activeSlave)>>
-<<= App.Desc.mods($activeSlave, "areolae")>>
-
-<<if $activeSlave.inflation > 0>> /* to be obsoleted with phase 4 */
-	<<= App.Desc.bellyInflation($activeSlave)>>
-<<elseif $activeSlave.bellyImplant >= 2000>>
-	<<= App.Desc.bellyImplant($activeSlave)>>
-<<else>>
-	<<= App.Desc.belly($activeSlave)>>
-<</if>>
-<<= App.Desc.mods($activeSlave, "belly")>>
-/*<<= App.Desc.mods($activeSlave, "navel")>> Currently contained in App.Desc.belly()*/
-<<= App.Desc.butt($activeSlave)>>
-
-<br>&nbsp;&nbsp;&nbsp;&nbsp;
-
-<<= App.Desc.crotch($activeSlave)>>
-<<= App.Desc.dick($activeSlave)>>
-<<= App.Desc.vagina($activeSlave)>>
-
-<<= App.Desc.anus($activeSlave)>>
-
-<<if $activeSlave.fuckdoll == 0>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;
-	<<= App.Desc.drugs($activeSlave)>>
-<</if>>
-
-<<set $saleDescription = 0, $applyLaw = 0>> /* clear sale and law flags, if set */
+<<= App.Desc.longSlave({slave: $activeSlave})>>
\ No newline at end of file
diff --git a/src/uncategorized/multiImplant.tw b/src/uncategorized/multiImplant.tw
index 0fd30c4d0c73eef8a3b0972ca3ca6d04e82de5d9..09e661aec1177c6ea24c58aa7994f95c0258f07a 100644
--- a/src/uncategorized/multiImplant.tw
+++ b/src/uncategorized/multiImplant.tw
@@ -87,6 +87,7 @@ that are ready be sent down.
 		<<set _p = $adjustProsthetics[_k]>>
 		<<if _p.slaveID == $activeSlave.ID && _p.workLeft <= 0>>
 			<<set $adjustProsthetics.splice(_k, 1), _k-->>
+			<<set $adjustProstheticsCompleted-->>
 			<<set addProsthetic($activeSlave, _p.id)>>
 			<br><hr>
 			<<switch _p.id>>
@@ -205,7 +206,6 @@ that are ready be sent down.
 	/* updates the interrogated slave */
 	<<set $slaves[_i] = $activeSlave>>
 <</for>> /* end of the $slaves loop */
-<<set $adjustProstheticsCompleted = 0>>
 
 /* This needs to be down here to over-ride any Surgery Degradation calls */
 <<set $nextButton = "Continue">>
diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw
index ec4c8c7e9ce1d8800604ee5aed776c71ffd94573..ee545303c1bbbf2fd3cb6c3c11d6e56331822e02 100644
--- a/src/uncategorized/nextWeek.tw
+++ b/src/uncategorized/nextWeek.tw
@@ -334,7 +334,7 @@
 
 /% These are variables that either should be made into _temp vars or should be Zeroed out once done with them instead of here. This can also interfere with debugging or hide NaN's as zeroing things out would clear a NaN. Also could stop from NaN's getting worse? %/
 /% Integer and float variables. No real need to zero them out but doesn't hurt to have them in a known state, though this might mask variables NaN'ing out. Takes up the least amount of Memory besides a "" string. %/
-<<set $i = 0, $j = 0, $averageProsperity = 0, $motherSlave = -1, $daughterSlave = -1, $devMother = -1, $devDaughter = -1, $alphaTwin = -1, $betaTwin = -1, $youngerSister = -1, $olderSister = -1, $recruiterSlave = -1>>
+<<set $i = 0, $j = 0, $averageProsperity = 0, $motherSlave = -1, $daughterSlave = -1, $devMother = -1, $devDaughter = -1, $alphaTwin = -1, $betaTwin = -1, $youngerSister = -1, $olderSister = -1>>
 <<set $boobsID = -1, $boobsInterestTargetID = -1, $buttslutID = -1, $buttslutInterestTargetID = -1, $cumslutID = -1, $cumslutInterestTargetID = -1, $humiliationID = -1, $humiliationInterestTargetID = -1, $sadistID = -1, $sadistInterestTargetID = -1, $masochistID = -1, $masochistInterestTargetID = -1, $domID = -1, $dominantInterestTargetID = -1, $subID = -1, $submissiveInterestTargetID = -1, $shelterGirlID = -1>>
 
 /% Other arrays %/
diff --git a/src/uncategorized/randomNonindividualEvent.tw b/src/uncategorized/randomNonindividualEvent.tw
index 5d762d66439cbc3aa860d235528445e3f62d1864..24abf725ceeb0aaf86e753276edcb44241b8e4f3 100644
--- a/src/uncategorized/randomNonindividualEvent.tw
+++ b/src/uncategorized/randomNonindividualEvent.tw
@@ -21,7 +21,7 @@
 <<else>>
 	<<silently>>
 	/* initialize event lists as arrays [], not objects {} */
-	<<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, $recruiterSlave = 0, _recruitEvents = []>>
+	<<set $events = [], $RecETSevent = [], $REFIevent = [], $PESSevent = [], $PETSevent = [], $REFSevent = [], $activeSlave = 0, _recruitEvents = []>>
 
 	<<set $seed = 0>>
 
diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw
index 35a67630ff54d57499637f1ca16dbc5ea410750e..fa8c05175ae6765b09e7d554a9678baddd11bde4 100644
--- a/src/uncategorized/saLongTermEffects.tw
+++ b/src/uncategorized/saLongTermEffects.tw
@@ -6410,7 +6410,7 @@
 		<<if ($slaves[$i].dick > 8)>>
 			Society @@.green;approves@@ of $his massive member, which might be nonfunctional, but is a wonder of expansionism.
 			<<set _Dic = $slaves[$i].dick-8>>
-			<<= FutureSocieties.ChangePorn("AssetExpansionist", _Dic, $pornFameBonus)>>
+			<<= FutureSocieties.ChangePorn("AssetExpansionist", _Dic)>>
 		<<elseif ($slaves[$i].dick > 6)>>
 			Society @@.green;approves@@ of $his enormous penis; $his cock furthers the fashion for dangling dicks on slaves.
 			<<= FutureSocieties.ChangePorn("AssetExpansionist", 1)>>
diff --git a/src/uncategorized/saRelationships.tw b/src/uncategorized/saRelationships.tw
index e6968eeabedcb1843698379463205605bb9b438e..74330ad71a1f22b9f27fb20ae828770a2ccecdfd 100644
--- a/src/uncategorized/saRelationships.tw
+++ b/src/uncategorized/saRelationships.tw
@@ -70,7 +70,7 @@
 					<<set _seed = random(1, 80)>>
 				<</if>>
 			<<if _seed > 75>>
-			<<set $resentment = 0>>
+			<<set _resentment = 0>>
 			<<for _j = 0; _j < _SL; _j++>>
 				<<set _SlaveJ = $slaves[_j]>>
 				<<setLocalPronouns _SlaveJ 2>>
@@ -193,9 +193,9 @@
 							<<set _SlaveJ.relationship = 1, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 1, _SlaveI.relationshipTarget = _SlaveJ.ID>>
 							<<break>>
 						<<else>>
-							<<if $resentment == 0>>
+							<<if _resentment == 0>>
 								_SlaveI.slaveName tries to strike up a friendship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being castigated for simple sociability.
-								<<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, $resentment++>>
+								<<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, _resentment++>>
 							<</if>>
 						<</if>>
 					<</if>>
@@ -217,18 +217,20 @@
 							<<set _SlaveJ.relationship = 3, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 3, _SlaveI.relationshipTarget = _SlaveJ.ID>>
 							<<break>>
 						<<else>>
-							_SlaveI.slaveName tries to strike up a sexual relationship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being prevented from pursuing _him2.
-							<<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2>>
-											<</if>>
-										<</if>>
-									<</if>>
-								<</if>>
-							<</for>>
-						<<if _SlaveI.relationshipTarget != _SlaveJ.ID>>
-						<<set _SlaveJ = null>>
+							<<if _resentment == 0>>
+								_SlaveI.slaveName tries to strike up a sexual relationship with _SlaveJ.slaveName and is @@.gold;punished@@ for breaking the rules against such things; $he @@.mediumorchid;resents@@ being prevented from pursuing _him2.
+								<<set _SlaveI.devotion -= 2, _SlaveI.trust -= 2, _resentment++>>
+							<</if>>
+						<</if>>
 					<</if>>
 				<</if>>
+				<</if>>
+			<</for>>
+			<<if _SlaveI.relationshipTarget != _SlaveJ.ID>>
+				<<set _SlaveJ = null>>
 			<</if>>
+			<</if>> /*seed*/
+			<</if>> /*devotion*/
 		<</if>>
 		<<set _drop = 1>>
 	<</if>>
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 2f93c43e57c449adf40942bba792985756156c68..cc7ee6ee6c7f43b7bf8713546df864b3dbee0020 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -53,7 +53,7 @@
 
 <<set _slavesInLine = App.UI.SlaveInteract.placeInLine(getSlave($AS))>>
 
-<<set _desc = `<<set $activeSlave = getSlave($AS)>><<include "Long Slave Description">>`>>
+<<set _desc = App.Desc.longSlave({slave: getSlave($AS), saleDescription: false, showClothing: true})>>
 
 <p align="center">
 	<<if $cheatMode == 1>>
diff --git a/src/uncategorized/slaveSold.tw b/src/uncategorized/slaveSold.tw
index e301f46239399c5e12cd2160f2b6097ce8621c92..cc796ef8c4a0fe2055ac6d062be4716f3800124a 100644
--- a/src/uncategorized/slaveSold.tw
+++ b/src/uncategorized/slaveSold.tw
@@ -3,7 +3,6 @@
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Main", $encyclopedia = "Personal Assistant">>
 
 <<setLocalPronouns $activeSlave>>
-<<set $display = 0>>
 
 <<if !["abortion TV", "elite auction", "eugenics arcology", "organ crafter", "peacekeepers", "repopulationist arcology", "tentacle bred", "womb filler"].includes($buyer) && ((($activeSlave.actualAge < $retirementAge-1) && $policies.retirement.physicalAgePolicy == 0) || (($activeSlave.physicalAge < $retirementAge-1) && $policies.retirement.physicalAgePolicy == 1))>> /* organ crafter is not viable now, the elite/peacekeepers won't part so easily with a prize, some take place x months later when the event's max is 15 weeks, and the rest are snuff events. You don't want that slave back. */
 	<<if !$boomerangSlave || $boomerangWeeks > 15>>
@@ -124,13 +123,11 @@
 		$slaves[_ss].slaveName is @@.mediumorchid;grieved@@ that you are selling _his2 best source of comfort and companionship in a life of bondage.
 		<br><br>
 		<<set $slaves[_ss].devotion -= $slaves[_ss].relationship*10>>
-		<<set $display = 1>>
 	<</if>>
 <<elseif $activeSlave.relationship == -3>>
 	Selling one of your slave $wives is @@.red;socially unacceptable.@@ In addition, your other devoted slaves are @@.gold;worried@@ that you may not respect their status.
 	<br><br>
 	<<run repX(-200, "slaveTransfer")>>
-	<<set $display = 1>>
 	<<for _ss = 0; _ss < $slaves.length; _ss++>>
 		<<if $slaves[_ss].devotion > 50>>
 			<<set $slaves[_ss].trust -= 5>>
@@ -144,7 +141,6 @@
 		$slaves[_ss].slaveName is @@.hotpink;pleased@@ that _he2 won't have to see _his2 rival any more.
 		<br><br>
 		<<set $slaves[_ss].devotion += $slaves[_ss].rivalry*3>>
-		<<set $display = 1>>
 	<</if>>
 <</if>>