diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index b2f6656f91a1bfb95e24d6aa2b023b25cdcd3a5e..4c6933ee222c41cddc34066d37e09388f5b78d5c 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -54,6 +54,7 @@ App.Medicine.Modification.Brands = {};
 App.Medicine.Modification.Select = {};
 App.Medicine.OrganFarm = {};
 App.Medicine.OrganFarm.Organs = {};
+App.Medicine.Salon = {};
 App.Medicine.Surgery = {};
 App.RA = {};
 App.Reminders = {};
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 77854e982ad0a54bd4b81558fee78ffe1129e132..42887f82a0e8310816fb004af21ff6e9a0ac48b5 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -320,10 +320,20 @@ App.Data.resetOnNGPlus = {
 		oralAppeal: 0,
 		vaginalAppeal: 0,
 		analAppeal: 0,
-		sexualOpeness: 0
+		sexualOpeness: 0,
+		bestialityOpeness: 0
 	},
 
-	FCTV: {},
+	FCTV: {
+		receiver: -1,
+		channel: {},
+		pcViewership: {
+			count: 0,
+			frequency: 4,
+		},
+		remote: 0,
+		weekEnabled: 0
+	},
 	assistant: {},
 	targetArcology: {fs: "New"},
 	readySlaves: 0,
@@ -560,6 +570,7 @@ App.Data.resetOnNGPlus = {
 	nurseryGrowthStimsSetting: 0,
 	MadamIgnoresFlaws: 0,
 	farmyardBreeding: 0,
+	farmyardRestraints: 0,
 	farmyardShows: 0,
 	DJignoresFlaws: 0,
 	slaveFightingBG: 0,
@@ -768,10 +779,10 @@ App.Data.resetOnNGPlus = {
 	masterSuiteNameCaps: "The Master Suite",
 
 	// Nursery Subsection
-	nursery: 0,						/* counts the number of children the nursery can support */
+	nursery: 0,							/* counts the number of children the nursery can support */
 	nurseryNannies: 0,					/* counts the number of nannies the nursery can support */
 	nurseryBabies: 0,					/* counts the number of children currently in the nursery */
-	MatronInfluence: 0,				/* check for whether the children are influenced by the Matron */
+	MatronInfluence: 0,					/* check for whether the children are influenced by the Matron */
 	nannyInfluence: 0,					/* check for whether the children are influenced by the nannies */
 	nurseryDecoration: "standard",
 	nurseryWeight: 0,
@@ -790,25 +801,72 @@ App.Data.resetOnNGPlus = {
 	sortNurseryList: "Unsorted",
 	targetAgeNursery: 18,
 
-	// Farmyard Subsection %/
+	// Farmyard Subsection
 	farmyard: 0,
 	farmyardShowgirls: [],			/* array of farmhands putting on shows */
 	farmyardFarmers: [],			/* array of farmhands farming */
 	farmMenials: 0,
 	farmMenialsSpace: 0,
 	farmyardDecoration: "standard",
-	farmyardUpgrade: {
-		pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0
+	farmyardUpgrades: {
+		pump: 0,
+		fertilizer: 0,
+		hydroponics: 0,
+		machinery: 0,
+		seeds: 0,
 	},
 	farmyardCrops: 0,
-	farmyardStable: 0,
+	farmyardStables: 0,
 	farmyardKennels: 0,
 	farmyardCages: 0,
 	activeCanine: 0,
 	activeHooved: 0,
 	activeFeline: 0,
 	animalsBought: {
-		canines: 0, hooved: 0, felines: 0, labradorRetrievers: 0, germanShepherds: 0, goldenRetrievers: 0, frenchBulldogs: 0, bulldogs: 0, beagles: 0, poodles: 0, rottweilers: 0, yorkshireTerriers: 0, siberianHuskies: 0, horses: 0, bulls: 0, pigs: 0, siameses: 0, persians: 0, maineCoons: 0, ragdolls: 0, bengals: 0, abbysinians: 0, birmans: 0, orientalShorthairs: 0, sphynxes: 0, russianBlues: 0, wolves: 0, foxes: 0, jackals: 0, dingos: 0, zebras: 0, cougars: 0, jaguars: 0, pumas: 0, lynx: 0, leopards: 0, lions: 0, tigers: 0
+		canines: 0,
+		felines: 0,
+		hooved: 0,
+
+		beagles: 0,
+		bulldogs: 0,
+		frenchBulldogs: 0,
+		germanShepherds: 0,
+		goldenRetrievers: 0,
+		labradorRetrievers: 0,
+		poodles: 0,
+		rottweilers: 0,
+		siberianHuskies: 0,
+		yorkshireTerriers: 0,
+
+		bulls: 0,
+		horses: 0,
+		pigs: 0,
+
+		abbysinians: 0,
+		bengals: 0,
+		birmans: 0,
+		maineCoons: 0,
+		orientalShorthairs: 0,
+		persians: 0,
+		ragdolls: 0,
+		russianBlues: 0,
+		siameses: 0,
+		sphynxes: 0,
+
+		dingos: 0,
+		foxes: 0,
+		jackals: 0,
+		wolves: 0,
+
+		zebras: 0,
+
+		cougars: 0,
+		jaguars: 0,
+		leopards: 0,
+		lions: 0,
+		lynx: 0,
+		pumas: 0,
+		tigers: 0,
 	},
 	canines: [],
 	hooved: [],
diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js
index 90610f5a58d21fbc6250685ace9cd24b6822d33e..edbe529ea86d206fb4c53e2937d89c7f07980e3c 100644
--- a/js/003-data/miscData.js
+++ b/js/003-data/miscData.js
@@ -1544,7 +1544,7 @@ App.Data.misc = {
 	/* stuff that reveals genitals */
 	humiliatingClothes: ["a bra", "a button-up shirt", "a chattel habit", "a fallen nuns habit", "a skimpy loincloth", "a sports bra", "a string bikini", "a striped bra", "a succubus outfit", "a sweater", "a t-shirt", "a tank-top", "a thong", "a tube top", "clubslut netting", "pasties", "restrictive latex", "shibari ropes", "slutty jewelry", "uncomfortable straps", "Western clothing"],
 
-	highHeels: ["boots", "extreme heels", "extreme platform heels", "heels", "platform heels", "pumps"],
+	highHeels: ["boots", "extreme heels", "extreme platform heels", "heels", "platform heels"],
 	heightBoostingShoes: ["extreme heels", "extreme platform heels", "heels", "platform heels", "platform shoes", "pumps"],
 
 	veryYoungCareers: ["a babysitter", "a beggar", "a beggar", "a bully hunter", "a bully", "a camp counselor", "a cheerleader", "a child actress", "a child prodigy", "a child prostitute", "a child prostitute", "a child soldier", "a child soldier", "a club manager", "a club recruiter", "a club treasurer", "a cum dump", "a dropout", "a dropout", "a drug mule", "a farmer's daughter", "a girl scout", "a girl scout", "a hall monitor", "a handmaiden", "a hospital volunteer", "a housesitter", "a juvenile delinquent", "a juvenile delinquent", "a latchkey kid", "a lemonade stand operator", "a marching band leader", "a meat toilet", "a military brat", "a model-UN star", "a model", "a noblewoman", "a pageant star", "a paper girl", "a part-time farm laborer", "a pick-pocket", "a refugee", "a refugee", "a refugee", "a school nurse's assistant", "a shrine maiden", "a street thug", "a street urchin", "a street urchin", "a street urchin", "a student council president", "a student from a boarding school", "a student from a private school", "a student from a public school", "a student from a public school", "a student from a public school", "a student from a public school", "a student from a public school", "a sweatshop worker", "a sweatshop worker", "a sweatshop worker", "a sweatshop worker", "a teacher's pet", "an apprentice", "an aspiring pop star", "an idol", "an orphan", "an orphan", "an orphan", "an orphan", "an orphan", "being homeschooled by her parents", "captain of the kendo club", "from a lower class family", "from a lower class family", "from a lower class family", "from a middle class family", "from a middle class family", "from an upper class family", "homeless", "homeless", "homeless"],
diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index e5be2e88b0319cee5ad61244fd044c3367071b55..36a63d97ba43d0e04c20b3073a257e7b672fb972 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -319,6 +319,14 @@ App.Data.Policies.Selection = {
 				requirements: function() { return (V.arcologies[0].FSEgyptianRevivalist === "unset"); },
 			}
 		],
+		"policies.bestialityOpeness": [
+			{
+				title: "Bestiality Acceptance",
+				text: "you will use your personal influence to spur acceptance of bestiality.",
+				activatedText: "you are using your personal influence to spur the acceptance of bestiality.",
+				requirements: function() { return (V.seeBestiality === 1); },
+			}
+		]
 	},
 	PopulationPolicies: {
 		"policies.proRefugees": [
@@ -1712,7 +1720,7 @@ App.Data.Policies.Selection = {
 				note: `Will help advance Edo Revivalism`
 			}
 		],
-		"arcologies[0].FSEdoRevivalist >= 90": [
+		"arcologies[0].FSEdoRevivalistLaw": [
 			{
 				title: "Cultural Insularity",
 				titleClass: "lime",
@@ -1876,6 +1884,7 @@ App.Data.Policies.Selection = {
 				requirements: function() { return (V.arcologies[0].FSRestartDecoration >= 100 && V.rep >= 5000); },
 				onImplementation: function() {
 					repX(-4000, "policies");
+					SugarCube.Engine.play("Breeder Proposal");
 				},
 				hide: {ifActivated: 1}, // Repeal is not possible.
 				note: `Will greatly damage your reputation for even proposing`
diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js
index 781a17b19982bf75c7c2b558769c65df06a4ac3c..b5d8e78164b5f2378e5cb699a66c5dbab78dfc3a 100644
--- a/js/003-data/slaveMods.js
+++ b/js/003-data/slaveMods.js
@@ -191,3 +191,208 @@ App.Medicine.Modification.Brands = {
 		},
 	}
 };
+
+
+App.Medicine.Modification.Color = {
+	Primary: [
+		{value: "auburn"},
+		{value: "black"},
+		{value: "blazing red"},
+		{value: "blonde"},
+		{value: "blue-violet"},
+		{value: "blue"},
+		{value: "brown"},
+		{value: "burgundy"},
+		{value: "chestnut"},
+		{value: "chocolate brown"},
+		{value: "copper"},
+		{value: "dark blue"},
+		{value: "dark brown"},
+		{value: "dark orchid"},
+		{value: "deep red"},
+		{value: "ginger"},
+		{value: "golden"},
+		{value: "green-yellow"},
+		{value: "green"},
+		{value: "grey"},
+		{value: "hazel"},
+		{value: "jet black"},
+		{value: "neon blue"},
+		{value: "neon green"},
+		{value: "neon pink"},
+		{value: "pink"},
+		{value: "platinum blonde"},
+		{value: "purple"},
+		{value: "red"},
+		{value: "sea green"},
+		{value: "silver"},
+		{value: "strawberry-blonde"},
+		{value: "white"},
+	],
+	Secondary: [
+		{
+			title: "None",
+			value: ""
+		},
+		{
+			title: "Black",
+			value: " with black highlights"
+		},
+		{
+			title: "Blazing red",
+			value: " with blazing red highlights"
+		},
+		{
+			title: "Blonde",
+			value: " with blonde highlights"
+		},
+		{
+			title: "Grey",
+			value: " with grey highlights"
+		},
+		{
+			title: "Neon blue",
+			value: " with neon blue highlights"
+		},
+		{
+			title: "Neon green",
+			value: " with neon green highlights"
+		},
+		{
+			title: "Neon pink",
+			value: " with neon pink highlights"
+		},
+		{
+			title: "Rainbow",
+			value: " with rainbow highlights"
+		},
+		{
+			title: "Silver",
+			value: " with silver highlights"
+		},
+		{
+			title: "White",
+			value: " with white highlights"
+		},
+	]
+};
+
+App.Medicine.Modification.hairStyles = {
+	Normal: [
+		{
+			title: "Afro",
+			value: "afro"
+		},
+		{
+			title: "Braided",
+			value: "braided"
+		},
+		{
+			title: "Cornrows",
+			value: "cornrows"
+		},
+		{
+			title: "Curled",
+			value: "curled"
+		},
+		{
+			title: "Dreadlocks",
+			value: "dreadlocks"
+		},
+		{
+			title: "Eary",
+			value: "eary"
+		},
+		{
+			title: "In a bun",
+			value: "bun"
+		},
+		{
+			title: "In a messy bun",
+			value: "messy bun"
+		},
+		{
+			title: "In a ponytail",
+			value: "ponytail"
+		},
+		{
+			title: "In tails",
+			value: "tails"
+		},
+		{
+			title: "Luxurious",
+			value: "luxurious"
+		},
+		{
+			title: "Messy",
+			value: "messy"
+		},
+		{
+			title: "Neat",
+			value: "neat"
+		},
+		{
+			title: "Permed",
+			value: "permed"
+		},
+		{
+			title: "Shaved sides",
+			value: "strip"
+		},
+		{
+			title: "Up",
+			value: "up"
+		},
+	],
+	Cut: [
+		{
+			title: "Shaved",
+			value: "shaved",
+			hLength: 0
+		},
+		{
+			title: "Trimmed short",
+			value: "Salon",
+			hLength: 10
+		},
+		{
+			title: "Buzzcut",
+			value: "buzzcut",
+			hLength: 1
+		},
+	],
+	Length: [
+		{
+			title: "Very short",
+			hLength: 5
+		},
+		{
+			title: "Short",
+			hLength: 10
+		},
+		{
+			title: "Shoulder length",
+			hLength: 30
+		},
+		{
+			title: "Long",
+			hLength: 60
+		},
+		{
+			title: "Very long",
+			hLength: 100
+		},
+		{
+			title: "Apply hair growth stimulating treatment",
+			hLength: 0,
+			requirements: function(slave) { return (slave.hLength === 1); }
+		},
+		{
+			title: "Apply extensions",
+			onApplication: function(slave) { slave.hLength += 10; },
+			requirements: function(slave) { return (!slave.hLength === 1 && slave.hLength < 150); }
+		},
+	]
+};
+
+
diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt
index e5db8973851d24928b25034ddc4d665ec0ebb965..b6d2f7d04d96dad84685d95ef6a49eab2bf6a3bc 100644
--- a/slave variables documentation - Pregmod.txt	
+++ b/slave variables documentation - Pregmod.txt	
@@ -2934,10 +2934,13 @@ shoes:
 may accept strings, use at own risk
 "none"
 "heels"
+"platform heels"
 "pumps"
 "extreme heels"
+"extreme platform heels"
 "boots"
 "flats"
+"platform shoes"
 
 vaginalAccessory:
 
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index 95c56fcc0df620841bf4063ade116cdcc98f4d10..c708b0e83f7310be88e2450530cc6a2eca0b2123 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "3.5.4",
 	commitHash: null,
-	release: 1076
+	release: 1077
 };
diff --git a/src/003-assets/CSS/table.css b/src/003-assets/CSS/table.css
index 2df00a8ec002373692e4e2ee1bcdf43ce5f314f7..d71878e44483a7243eb66aa161bf63a4a53419a2 100644
--- a/src/003-assets/CSS/table.css
+++ b/src/003-assets/CSS/table.css
@@ -21,6 +21,24 @@ table.budget {
 	padding: 5px;
 	font-family: "monospace";
 }
-table.budget tr.colored {
+table.budget .colored {
 	background-color: #001700;
 }
+
+table.budget .accordion:not(.closed) .cash {
+	color: gray;
+}
+
+table.budget .accordion > :first-child {
+	position: relative;
+}
+
+table.budget .accordion > :first-child::before {
+	font-family: "tme-fa-icons";
+	position: absolute;
+	left: 10px;
+	content: "\e81c";
+}
+table.budget .accordion.closed > :first-child::before {
+	content: "\e81e";
+}
diff --git a/src/004-base/organFarmBase.js b/src/004-base/organFarmBase.js
index b6e2c6a7e2627f9f63c7158e6ca6686452bc2ccf..4e8e6e50ba1fb0323e53379d2bc3133575695090 100644
--- a/src/004-base/organFarmBase.js
+++ b/src/004-base/organFarmBase.js
@@ -2,7 +2,7 @@ App.Medicine.OrganFarm.Organ = class {
 	/**
 	 * @param {string} type - unique type of organ, used as key
 	 * @param {string} name - display name
-	 * @param {string} tooltip - full sentence, uncapitalized and unpunctuated
+	 * @param {string|function(App.Entity.SlaveState):string} tooltip - full sentence, uncapitalized and unpunctuated
 	 * @param {number} cost - how much it costs to grow the organ
 	 * @param {number} time - how long it takes to grow the organ (without upgrades)
 	 * @param {function(App.Entity.SlaveState):boolean} canGrow
diff --git a/src/Mods/DinnerParty/dinnerPartyPreparations.tw b/src/Mods/DinnerParty/dinnerPartyPreparations.tw
index 777778de6c05068b7cf04155c168d347dea2d0a0..21d00fcdb1547c57eb1901b7fb4329c5080ad9df 100644
--- a/src/Mods/DinnerParty/dinnerPartyPreparations.tw
+++ b/src/Mods/DinnerParty/dinnerPartyPreparations.tw
@@ -29,7 +29,7 @@ Your assistant will take care of the invitations and all the arrangements; all y
 
 __Select Your Meat:__
 <br><br>
-<<= App.UI.SlaveList.slaveSelectionList(
+<<includeDOM App.UI.SlaveList.slaveSelectionList(
 		s => assignmentVisible(s) && s.fuckdoll === 0,
 		App.UI.SlaveList.SlaveInteract.stdInteract,
 		null,
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index ad1c54f0f63d5e5437efeb7c2cc63440a87d4aa0..a739c0e6192ea9c13dc460d49ffec937b713aa23 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -370,246 +370,7 @@ App.SecExp.Check = (function() {
 	};
 
 	function general() {
-		if (jsDef(V.secExp)) {
-			if (V.secExpEnabled !== 1) {
-				V.secExpEnabled = V.secExp;
-			}
-			delete V.secExp;
-		}
-		if (typeof V.secExpEnabled !== "number") {
-			V.secExpEnabled = 0;
-		}
-		V.SecExp = V.SecExp || SecExpBase();
-		V.SecExp.settings = V.SecExp.settings || {};
-		delete V.SecExp.settings.show;
-
-		delete V.SecExp.army;
-
-		if (V.secExpEnabled > 0) {
-			Object.assign(V.secBots, {
-				active: V.secBots.active || V.arcologyUpgrade.drones > 0 ? 1 : 0,
-				ID: -1,
-				isDeployed: V.secBots.isDeployed || 0,
-				troops: Math.max(V.secBots.troops, V.arcologyUpgrade.drones > 0 ? 30 : 0),
-				maxTroops: Math.max(V.secBots.maxTroops, V.arcologyUpgrade.drones > 0 ? 30 : 0)
-			});
-
-			V.SecExp.core = V.SecExp.core || {};
-
-			V.SecExp.core.trade = V.SecExp.core.trade || 0;
-			if (passage() === "Acquisition" || V.SecExp.core.trade === 0) {
-				let init = jsRandom(20, 30);
-				if (V.terrain === "urban") {
-					init += jsRandom(10, 10);
-				} else if (V.terrain === "ravine") {
-					init -= jsRandom(5, 5);
-				}
-				if (["BlackHat", "capitalist", "celebrity", "wealth"].includes(V.PC.career)) {
-					init += jsRandom(5, 5);
-				} else if (["escort", "gang", "servant"].includes(V.PC.career)) {
-					init -= jsRandom(5, 5);
-				}
-				V.SecExp.core.trade = init;
-			}
-			if (jsDef(V.trade)) {
-				V.SecExp.core.trade = V.trade;
-			}
-
-			V.SecExp.core.authority = V.SecExp.core.authority || 0;
-			if (jsDef(V.authority)) {
-				V.SecExp.core.authority = V.authority;
-			}
-
-			V.SecExp.security = V.SecExp.security || {};
-			V.SecExp.security.cap = V.SecExp.security.cap || 100;
-			if (jsDef(V.security)) {
-				V.SecExp.security.cap = V.security;
-			}
-			V.SecExp.core.crimeLow = V.SecExp.core.crimeLow || 30;
-			if (jsDef(V.crime)) {
-				V.SecExp.core.crimeLow = V.crime;
-			}
-
-			V.SecExp.settings.difficulty = V.SecExp.settings.difficulty || 1;
-			if (jsDef(V.difficulty)) {
-				V.SecExp.settings.difficulty = V.difficulty;
-			}
-
-			V.SecExp.settings.battle = V.SecExp.settings.battle || {};
-			if (!jsDef(V.SecExp.settings.battle.enabled)) {
-				V.SecExp.settings.battle.enabled = 1;
-			}
-			if (jsDef(V.battlesEnabled)) {
-				V.SecExp.settings.battle.enabled = V.battlesEnabled;
-			}
-			delete V.SecExp.battle;
-
-			V.SecExp.settings.battle.major = V.SecExp.settings.battle.major || {};
-			V.SecExp.settings.battle.frequency = V.SecExp.settings.battle.frequency || 1;
-			if (jsDef(V.battleFrequency)) {
-				V.SecExp.settings.battle.frequency = V.battleFrequency;
-			}
-			V.SecExp.settings.battle.force = V.SecExp.settings.battle.force || 0;
-			if (jsDef(V.forceBattle)) {
-				V.SecExp.settings.battle.force = V.forceBattle;
-			}
-
-			if (jsDef(V.readiness)) {
-				if(V.readiness === 10) {
-					V.sectionInFirebase = 1;
-				}
-			}
-
-			V.SecExp.settings.unitDescriptions = V.SecExp.settings.unitDescriptions || 0;
-
-			if (!jsDef(V.SecExp.settings.battle.allowSlavePrestige)) {
-				V.SecExp.settings.battle.allowSlavePrestige = 1;
-			}
-			if (jsDef(V.allowPrestigeFromBattles)) {
-				V.SecExp.settings.battle.allowSlavePrestige = V.allowPrestigeFromBattles;
-			}
-
-			V.SecExp.settings.battle.major.enabled = V.SecExp.settings.battle.major.enabled || 0;
-			if (jsDef(V.majorBattlesEnabled)) {
-				V.SecExp.settings.battle.major.enabled = V.majorBattlesEnabled;
-			}
-
-			if (!jsDef(V.SecExp.settings.battle.major.gameOver)) {
-				V.SecExp.settings.battle.major.gameOver = 1;
-			}
-			if (jsDef(V.majorBattleGameOver)) {
-				V.SecExp.settings.battle.major.gameOver = V.majorBattleGameOver;
-			}
-			V.SecExp.settings.battle.major.force = V.SecExp.settings.battle.major.force || 0;
-			if (jsDef(V.forceMajorBattle)) {
-				V.SecExp.settings.battle.major.force = V.forceMajorBattle;
-			}
-			V.SecExp.settings.battle.major.mult = V.SecExp.settings.battle.major.mult || 1;
-
-			V.SecExp.settings.rebellion = V.SecExp.settings.rebellion || {};
-			if (!jsDef(V.SecExp.settings.rebellion.enabled)) {
-				V.SecExp.settings.rebellion.enabled = 1;
-			}
-			if (jsDef(V.rebellionsEnabled)) {
-				V.SecExp.settings.rebellion.enabled = V.rebellionsEnabled;
-			}
-
-			V.SecExp.settings.rebellion.force = V.SecExp.settings.rebellion.force || 0;
-			if (jsDef(V.forceRebellion)) {
-				V.SecExp.settings.rebellion.force = V.forceRebellion;
-			}
-			if (!jsDef(V.SecExp.settings.rebellion.gameOver)) {
-				V.SecExp.settings.rebellion.gameOver = 1;
-			}
-			if (jsDef(V.rebellionGameOver)) {
-				V.SecExp.settings.rebellion.gameOver = V.rebellionGameOver;
-			}
-
-			V.SecExp.settings.rebellion.speed = V.SecExp.settings.rebellion.speed || 1;
-			if (jsDef(V.rebellionSpeed)) {
-				V.SecExp.settings.rebellion.speed = V.rebellionSpeed;
-			}
-
-			if (V.SecExp.settings.battle.enabled + V.SecExp.settings.rebellion.enabled > 0) {
-				V.SecExp.settings.showStats = V.SecExp.settings.showStats || 0;
-				if (jsDef(V.showBattleStatistics)) {
-					V.SecExp.settings.showStats = V.showBattleStatistics;
-				}
-			}
-
-			V.SecExp.buildings = V.SecExp.buildings || {};
-			V.SecExp.buildings.propHub = V.SecExp.buildings.propHub || {};
-			V.SecExp.buildings.propHub.active = V.SecExp.buildings.propHub.active || 0;
-			if (V.SecExp.buildings.pr === null) {
-				delete V.SecExp.buildings.pr;
-			}
-			if (jsDef(V.SecExp.buildings.pr)) {
-				V.SecExp.buildings.propHub = V.SecExp.buildings.pr;
-				delete V.SecExp.buildings.pr;
-			}
-			if (jsDef(V.propHub)) {
-				V.SecExp.buildings.propHub.active = V.propHub;
-			}
-
-			if (V.SecExp.buildings.propHub.active > 0) {
-				V.SecExp.buildings.propHub.recuriterOffice = V.SecExp.buildings.propHub.recuriterOffice || 0;
-				V.SecExp.buildings.propHub.campaign = V.SecExp.buildings.propHub.campaign || 0;
-				if (jsDef(V.propCampaign)) {
-					V.SecExp.buildings.propHub.campaign = V.propCampaign;
-				}
-
-				V.SecExp.buildings.propHub.miniTruth = V.SecExp.buildings.propHub.miniTruth || 0;
-				if (jsDef(V.miniTruth)) {
-					V.SecExp.buildings.propHub.miniTruth = V.miniTruth;
-				}
-
-				V.SecExp.buildings.propHub.secretService = V.SecExp.buildings.propHub.secretService || 0;
-				if (jsDef(V.secretService)) {
-					V.SecExp.buildings.propHub.secretService = V.secretService;
-				}
-				if (jsDef(V.SecExp.buildings.propHub.SS)) {
-					V.SecExp.buildings.propHub.secretService = V.SecExp.buildings.propHub.SS;
-					delete V.SecExp.buildings.propHub.SS;
-				}
-
-				if (V.SecExp.buildings.propHub.campaign >= 1) {
-					V.SecExp.buildings.propHub.focus = V.SecExp.buildings.propHub.focus || "social engineering";
-					if (jsDef(V.propFocus) && V.propFocus !== "none") {
-						V.SecExp.buildings.propHub.focus = V.propFocus;
-					}
-				}
-
-				if (jsDef(V.RecuriterOffice)) {
-					V.recuriterOffice = V.RecuriterOffice;
-				}
-				const vars = ['recuriterOffice', 'fakeNews', 'controlLeaks', 'marketInfiltration', 'blackOps'];
-				for(let i = 0; i < vars.length; i++) {
-					if (jsDef(V[vars[i]]) && V[vars[i]] > 0) {
-						V.SecExp.buildings.propHub[vars[i]] = V[vars[i]];
-						delete V[vars[i]];
-					} else {
-						V.SecExp.buildings.propHub[vars[i]] = V.SecExp.buildings.propHub[vars[i]] || 0;
-					}
-				}
-			}
-
-			V.SecExp.buildings.barracks = V.SecExp.buildings.barracks || {};
-			V.SecExp.buildings.barracks.active = V.SecExp.buildings.barracks.active || 0;
-			if (jsDef(V.secBarracks)) {
-				V.SecExp.buildings.barracks.active = V.secBarracks;
-			}
-
-			if (V.SecExp.buildings.barracks.active > 0) {
-				V.SecExp.buildings.barracks.upgrades = V.SecExp.buildings.barracks.upgrades || {};
-				V.SecExp.buildings.barracks.upgrades.size = V.SecExp.buildings.barracks.upgrades.size || 0;
-				V.SecExp.buildings.barracks.upgrades.luxury = V.SecExp.buildings.barracks.upgrades.luxury || 0;
-				V.SecExp.buildings.barracks.upgrades.training = V.SecExp.buildings.barracks.upgrades.training || 0;
-				V.SecExp.buildings.barracks.upgrades.loyaltyMod = V.SecExp.buildings.barracks.upgrades.loyaltyMod || 0;
-				if (jsDef(V.secBarracksUpgrades)) {
-					V.SecExp.buildings.barracks.upgrades = V.secBarracksUpgrades;
-				}
-			}
-
-			V.SecExp.proclamation = V.SecExp.proclamation || {};
-			V.SecExp.proclamation.cooldown = V.SecExp.proclamation.cooldown || 0;
-			if (jsDef(V.proclamationsCooldown)) {
-				V.SecExp.proclamation.cooldown = V.proclamationsCooldown;
-			}
-			V.SecExp.proclamation.currency = V.SecExp.proclamation.currency || "";
-			if (jsDef(V.proclamationCurrency)) {
-				V.SecExp.proclamation.currency = V.proclamationCurrency;
-			}
-			V.SecExp.proclamation.type = V.SecExp.proclamation.type || "crime";
-			if (jsDef(V.proclamationType)) {
-				if (V.proclamationType !== "none") {
-					V.SecExp.proclamation.type = V.proclamationType;
-				}
-			}
-		}
-
-		if (jsDef(V.SecExp.core)) {
-			delete V.SecExp.core.crimeCap;
-		}
+		App.SecExp.generalBC();
 	} // Closes general check function.
 
 	function secRestPoint() {
diff --git a/src/Mods/SecExp/js/secExpBC.js b/src/Mods/SecExp/js/secExpBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..efbc3f89b41104e62e9f9cb74b4c3a268f8dcdf7
--- /dev/null
+++ b/src/Mods/SecExp/js/secExpBC.js
@@ -0,0 +1,243 @@
+// @ts-nocheck
+App.SecExp.generalBC = function (){
+	if (jsDef(V.secExp)) {
+		if (V.secExpEnabled !== 1) {
+			V.secExpEnabled = V.secExp;
+		}
+		delete V.secExp;
+	}
+	if (typeof V.secExpEnabled !== "number") {
+		V.secExpEnabled = 0;
+	}
+	V.SecExp = V.SecExp || SecExpBase();
+	V.SecExp.settings = V.SecExp.settings || {};
+	delete V.SecExp.settings.show;
+
+	delete V.SecExp.army;
+
+	if (V.secExpEnabled > 0) {
+		Object.assign(V.secBots, {
+			active: V.secBots.active || V.arcologyUpgrade.drones > 0 ? 1 : 0,
+			ID: -1,
+			isDeployed: V.secBots.isDeployed || 0,
+			troops: Math.max(V.secBots.troops, V.arcologyUpgrade.drones > 0 ? 30 : 0),
+			maxTroops: Math.max(V.secBots.maxTroops, V.arcologyUpgrade.drones > 0 ? 30 : 0)
+		});
+
+		V.SecExp.core = V.SecExp.core || {};
+
+		V.SecExp.core.trade = V.SecExp.core.trade || 0;
+		if (passage() === "Acquisition" || V.SecExp.core.trade === 0) {
+			let init = jsRandom(20, 30);
+			if (V.terrain === "urban") {
+				init += jsRandom(10, 10);
+			} else if (V.terrain === "ravine") {
+				init -= jsRandom(5, 5);
+			}
+			if (["BlackHat", "capitalist", "celebrity", "wealth"].includes(V.PC.career)) {
+				init += jsRandom(5, 5);
+			} else if (["escort", "gang", "servant"].includes(V.PC.career)) {
+				init -= jsRandom(5, 5);
+			}
+			V.SecExp.core.trade = init;
+		}
+		if (jsDef(V.trade)) {
+			V.SecExp.core.trade = V.trade;
+		}
+
+		V.SecExp.core.authority = V.SecExp.core.authority || 0;
+		if (jsDef(V.authority)) {
+			V.SecExp.core.authority = V.authority;
+		}
+
+		V.SecExp.security = V.SecExp.security || {};
+		V.SecExp.security.cap = V.SecExp.security.cap || 100;
+		if (jsDef(V.security)) {
+			V.SecExp.security.cap = V.security;
+		}
+		V.SecExp.core.crimeLow = V.SecExp.core.crimeLow || 30;
+		if (jsDef(V.crime)) {
+			V.SecExp.core.crimeLow = V.crime;
+		}
+
+		V.SecExp.settings.difficulty = V.SecExp.settings.difficulty || 1;
+		if (jsDef(V.difficulty)) {
+			V.SecExp.settings.difficulty = V.difficulty;
+		}
+
+		V.SecExp.settings.battle = V.SecExp.settings.battle || {};
+		if (!jsDef(V.SecExp.settings.battle.enabled)) {
+			V.SecExp.settings.battle.enabled = 1;
+		}
+		if (jsDef(V.battlesEnabled)) {
+			V.SecExp.settings.battle.enabled = V.battlesEnabled;
+		}
+		delete V.SecExp.battle;
+
+		V.SecExp.settings.battle.major = V.SecExp.settings.battle.major || {};
+		V.SecExp.settings.battle.frequency = V.SecExp.settings.battle.frequency || 1;
+		if (jsDef(V.battleFrequency)) {
+			V.SecExp.settings.battle.frequency = V.battleFrequency;
+		}
+		V.SecExp.settings.battle.force = V.SecExp.settings.battle.force || 0;
+		if (jsDef(V.forceBattle)) {
+			V.SecExp.settings.battle.force = V.forceBattle;
+		}
+
+		if (jsDef(V.readiness)) {
+			if(V.readiness === 10) {
+				V.sectionInFirebase = 1;
+			}
+		}
+
+		V.SecExp.settings.unitDescriptions = V.SecExp.settings.unitDescriptions || 0;
+
+		if (!jsDef(V.SecExp.settings.battle.allowSlavePrestige)) {
+			V.SecExp.settings.battle.allowSlavePrestige = 1;
+		}
+		if (jsDef(V.allowPrestigeFromBattles)) {
+			V.SecExp.settings.battle.allowSlavePrestige = V.allowPrestigeFromBattles;
+		}
+
+		V.SecExp.settings.battle.major.enabled = V.SecExp.settings.battle.major.enabled || 0;
+		if (jsDef(V.majorBattlesEnabled)) {
+			V.SecExp.settings.battle.major.enabled = V.majorBattlesEnabled;
+		}
+
+		if (!jsDef(V.SecExp.settings.battle.major.gameOver)) {
+			V.SecExp.settings.battle.major.gameOver = 1;
+		}
+		if (jsDef(V.majorBattleGameOver)) {
+			V.SecExp.settings.battle.major.gameOver = V.majorBattleGameOver;
+		}
+		V.SecExp.settings.battle.major.force = V.SecExp.settings.battle.major.force || 0;
+		if (jsDef(V.forceMajorBattle)) {
+			V.SecExp.settings.battle.major.force = V.forceMajorBattle;
+		}
+		V.SecExp.settings.battle.major.mult = V.SecExp.settings.battle.major.mult || 1;
+
+		V.SecExp.settings.rebellion = V.SecExp.settings.rebellion || {};
+		if (!jsDef(V.SecExp.settings.rebellion.enabled)) {
+			V.SecExp.settings.rebellion.enabled = 1;
+		}
+		if (jsDef(V.rebellionsEnabled)) {
+			V.SecExp.settings.rebellion.enabled = V.rebellionsEnabled;
+		}
+
+		V.SecExp.settings.rebellion.force = V.SecExp.settings.rebellion.force || 0;
+		if (jsDef(V.forceRebellion)) {
+			V.SecExp.settings.rebellion.force = V.forceRebellion;
+		}
+		if (!jsDef(V.SecExp.settings.rebellion.gameOver)) {
+			V.SecExp.settings.rebellion.gameOver = 1;
+		}
+		if (jsDef(V.rebellionGameOver)) {
+			V.SecExp.settings.rebellion.gameOver = V.rebellionGameOver;
+		}
+
+		V.SecExp.settings.rebellion.speed = V.SecExp.settings.rebellion.speed || 1;
+		if (jsDef(V.rebellionSpeed)) {
+			V.SecExp.settings.rebellion.speed = V.rebellionSpeed;
+		}
+
+		if (V.SecExp.settings.battle.enabled + V.SecExp.settings.rebellion.enabled > 0) {
+			V.SecExp.settings.showStats = V.SecExp.settings.showStats || 0;
+			if (jsDef(V.showBattleStatistics)) {
+				V.SecExp.settings.showStats = V.showBattleStatistics;
+			}
+		}
+
+		V.SecExp.buildings = V.SecExp.buildings || {};
+		V.SecExp.buildings.propHub = V.SecExp.buildings.propHub || {};
+		V.SecExp.buildings.propHub.active = V.SecExp.buildings.propHub.active || 0;
+		if (V.SecExp.buildings.pr === null) {
+			delete V.SecExp.buildings.pr;
+		}
+		if (jsDef(V.SecExp.buildings.pr)) {
+			V.SecExp.buildings.propHub = V.SecExp.buildings.pr;
+			delete V.SecExp.buildings.pr;
+		}
+		if (jsDef(V.propHub)) {
+			V.SecExp.buildings.propHub.active = V.propHub;
+		}
+
+		if (V.SecExp.buildings.propHub.active > 0) {
+			V.SecExp.buildings.propHub.recuriterOffice = V.SecExp.buildings.propHub.recuriterOffice || 0;
+			V.SecExp.buildings.propHub.campaign = V.SecExp.buildings.propHub.campaign || 0;
+			if (jsDef(V.propCampaign)) {
+				V.SecExp.buildings.propHub.campaign = V.propCampaign;
+			}
+
+			V.SecExp.buildings.propHub.miniTruth = V.SecExp.buildings.propHub.miniTruth || 0;
+			if (jsDef(V.miniTruth)) {
+				V.SecExp.buildings.propHub.miniTruth = V.miniTruth;
+			}
+
+			V.SecExp.buildings.propHub.secretService = V.SecExp.buildings.propHub.secretService || 0;
+			if (jsDef(V.secretService)) {
+				V.SecExp.buildings.propHub.secretService = V.secretService;
+			}
+			if (jsDef(V.SecExp.buildings.propHub.SS)) {
+				V.SecExp.buildings.propHub.secretService = V.SecExp.buildings.propHub.SS;
+				delete V.SecExp.buildings.propHub.SS;
+			}
+
+			if (V.SecExp.buildings.propHub.campaign >= 1) {
+				V.SecExp.buildings.propHub.focus = V.SecExp.buildings.propHub.focus || "social engineering";
+				if (jsDef(V.propFocus) && V.propFocus !== "none") {
+					V.SecExp.buildings.propHub.focus = V.propFocus;
+				}
+			}
+
+			if (jsDef(V.RecuriterOffice)) {
+				V.recuriterOffice = V.RecuriterOffice;
+			}
+			const vars = ['recuriterOffice', 'fakeNews', 'controlLeaks', 'marketInfiltration', 'blackOps'];
+			for(let i = 0; i < vars.length; i++) {
+				if (jsDef(V[vars[i]]) && V[vars[i]] > 0) {
+					V.SecExp.buildings.propHub[vars[i]] = V[vars[i]];
+					delete V[vars[i]];
+				} else {
+					V.SecExp.buildings.propHub[vars[i]] = V.SecExp.buildings.propHub[vars[i]] || 0;
+				}
+			}
+		}
+
+		V.SecExp.buildings.barracks = V.SecExp.buildings.barracks || {};
+		V.SecExp.buildings.barracks.active = V.SecExp.buildings.barracks.active || 0;
+		if (jsDef(V.secBarracks)) {
+			V.SecExp.buildings.barracks.active = V.secBarracks;
+		}
+
+		if (V.SecExp.buildings.barracks.active > 0) {
+			V.SecExp.buildings.barracks.upgrades = V.SecExp.buildings.barracks.upgrades || {};
+			V.SecExp.buildings.barracks.upgrades.size = V.SecExp.buildings.barracks.upgrades.size || 0;
+			V.SecExp.buildings.barracks.upgrades.luxury = V.SecExp.buildings.barracks.upgrades.luxury || 0;
+			V.SecExp.buildings.barracks.upgrades.training = V.SecExp.buildings.barracks.upgrades.training || 0;
+			V.SecExp.buildings.barracks.upgrades.loyaltyMod = V.SecExp.buildings.barracks.upgrades.loyaltyMod || 0;
+			if (jsDef(V.secBarracksUpgrades)) {
+				V.SecExp.buildings.barracks.upgrades = V.secBarracksUpgrades;
+			}
+		}
+
+		V.SecExp.proclamation = V.SecExp.proclamation || {};
+		V.SecExp.proclamation.cooldown = V.SecExp.proclamation.cooldown || 0;
+		if (jsDef(V.proclamationsCooldown)) {
+			V.SecExp.proclamation.cooldown = V.proclamationsCooldown;
+		}
+		V.SecExp.proclamation.currency = V.SecExp.proclamation.currency || "";
+		if (jsDef(V.proclamationCurrency)) {
+			V.SecExp.proclamation.currency = V.proclamationCurrency;
+		}
+		V.SecExp.proclamation.type = V.SecExp.proclamation.type || "crime";
+		if (jsDef(V.proclamationType)) {
+			if (V.proclamationType !== "none") {
+				V.SecExp.proclamation.type = V.proclamationType;
+			}
+		}
+	}
+
+	if (jsDef(V.SecExp.core)) {
+		delete V.SecExp.core.crimeCap;
+	}
+};
diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js
index dc53b2c38a1a24b3924d8d15b79f41dc01696d13..88ca2598303e22be61244f454caadede97a07118 100644
--- a/src/Mods/SpecialForce/SpecialForce.js
+++ b/src/Mods/SpecialForce/SpecialForce.js
@@ -215,359 +215,6 @@ App.SF.Init = function() {
 	// V.arcologies[0].SFRaid = 1; V.arcologies[0].SFRaidTarget = -1;
 };
 
-/* no-usedOnce */
-App.SF.BC = function() {
-	function InitClean() {
-		delete V.SFMODToggle;
-		delete V.securityForceActive;
-		delete V.securityForceCreate;
-		delete V.securityForceEventSeen;
-	}
-
-	function MainClean() {
-		delete V.securityForceActive;
-		delete V.securityForceRecruit;
-		delete V.securityForceTrade;
-		delete V.securityForceBooty;
-		delete V.securityForceIncome;
-		delete V.securityForceMissionEfficiency;
-		delete V.securityForceProfitable;
-		delete V.TierTwoUnlock;
-		delete V.securityForceDepravity;
-		delete V.SFAO;
-		delete V.securityForceUpgradeTokenReset;
-		delete V.securityForceUpgradeToken;
-		delete V.securityForceGiftToken;
-		delete V.securityForceRulesOfEngagement;
-		delete V.securityForceFocus;
-		delete V.securityForceAccountability;
-		delete V.securityForceName;
-		delete V.SubsidyActive;
-		delete V.securityForceSubsidyActive;
-	}
-
-	function ColonelClean() {
-		delete V.ColonelCore;
-		delete V.securityForceColonelToken;
-		delete V.securityForceColonelSexed;
-		delete V.ColonelRelationship;
-		delete V.securityForceSexedColonelToken;
-	}
-
-	function TradeShowClean() {
-		delete V.OverallTradeShowAttendance;
-		delete V.CurrentTradeShowAttendance;
-		delete V.TradeShowIncome;
-		delete V.TotalTradeShowIncome;
-		delete V.TradeShowHelots;
-		delete V.TotalTradeShowHelots;
-	}
-
-	function UnitsClean() {
-		delete V.securityForceInfantryPower;
-		delete V.securityForceArcologyUpgrades;
-		delete V.securityForceVehiclePower;
-		delete V.securityForceDronePower;
-		delete V.securityForceStimulantPower;
-		delete V.securityForceHeavyBattleTank;
-		delete V.securityForceAircraftPower;
-		delete V.securityForceSpacePlanePower;
-		delete V.securityForceAC130;
-		delete V.securityForceSatellitePower;
-		delete V.securityForceGiantRobot;
-		delete V.securityForceMissileSilo;
-		delete V.securityForceAircraftCarrier;
-		delete V.securityForceSubmarine;
-		delete V.securityForceHeavyAmphibiousTransport;
-		delete V.securityForcePersonnel;
-		delete V.securityForceFortressZeppelin;
-		delete V.securityForceHeavyTransport;
-	}
-
-	if (typeof V.SF !== "object") {
-		if (V.securityForceEventSeen < 1) {
-			V.securityForceActive = -1;
-		} else {
-			V.securityForceActive = 2;
-		}
-		V.SF = {Toggle: V.SFMODToggle, Active: V.securityForceActive};
-		InitClean();
-		if (V.securityForceName === undefined) {
-			V.securityForceName = "the special force";
-		}
-		if (V.SF.Active >= 1) {
-			Object.assign(V.SF, {
-				Depravity: V.securityForceDepravity,
-				Upgrade: V.securityForceUpgradeToken,
-				Gift: V.securityForceGiftToken,
-				UC: {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock},
-				ROE: V.securityForceRulesOfEngagement,
-				Target: V.securityForceFocus,
-				Regs: V.securityForceAccountability,
-				Lower: V.securityForceName,
-			});
-			MainClean();
-
-			if (V.ColonelCore === undefined) {
-				V.ColonelCore = "";
-			}
-			if (V.ColonelDiscussion === undefined) {
-				V.ColonelDiscussion = 0;
-			}
-			if (V.ColonelSexed === undefined) {
-				V.ColonelSexed = 0;
-			}
-			V.SF.Colonel = {
-				Core: V.ColonelCore,
-				Talk: V.securityForceColonelToken,
-				Fun: V.securityForceColonelSexed,
-				Status: V.ColonelRelationship
-			};
-			ColonelClean();
-
-			if (V.TradeShowIncome === undefined) {
-				V.TradeShowIncome = 0;
-			}
-			if (V.TotalTradeShowIncome === undefined) {
-				V.TotalTradeShowIncome = 0;
-			}
-			if (V.TradeShowHelots === undefined) {
-				V.TradeShowHelots = 0;
-			}
-			if (V.TotalTradeShowHelots === undefined) {
-				V.TotalTradeShowHelots = 0;
-			}
-			V.SF.MercCon = {
-				History: V.OverallTradeShowAttendance,
-				CanAttend: V.CurrentTradeShowAttendance,
-				Income: V.TradeShowIncome,
-				Revenue: V.TotalTradeShowIncome,
-				Menials: V.TradeShowHelots,
-				TotalMenials: V.TotalTradeShowHelots,
-				Mercs: 0,
-				TotalMercs: 0
-			};
-			TradeShowClean();
-			if (V.SF.MercCon.History > 0) {
-				V.SF.MercCon.CanAttend = 1;
-			}
-
-			if (V.securityForceHeavyBattleTank === undefined) {
-				V.securityForceHeavyBattleTank = 0;
-			}
-			if (V.securityForceSpacePlanePower === undefined) {
-				V.securityForceSpacePlanePower = 0;
-			}
-			if (V.securityForceAC130 === undefined) {
-				V.securityForceAC130 = 0;
-			}
-			if (V.securityForceSatellitePower === undefined) {
-				V.securityForceSatellitePower = 0;
-			}
-			if (V.securityForceGiantRobot === undefined) {
-				V.securityForceGiantRobot = 0;
-			}
-			if (V.securityForceMissileSilo === undefined) {
-				V.securityForceMissileSilo = 0;
-			}
-			if (V.securityForceAircraftCarrier === undefined) {
-				V.securityForceAircraftCarrier = 0;
-			}
-			if (V.securityForceSubmarine === undefined) {
-				V.securityForceSubmarine = 0;
-			}
-			if (V.securityForceHeavyAmphibiousTransport === undefined) {
-				V.securityForceHeavyAmphibiousTransport = 0;
-			}
-
-			V.SF.ArmySize = V.securityForcePersonnel;
-
-			V.SF.SatLaunched = 0;
-
-			V.SF.Squad = {
-				Armoury: V.securityForceInfantryPower,
-				Firebase: V.securityForceArcologyUpgrades,
-				AV: V.securityForceVehiclePower,
-				TV: V.securityForceVehiclePower,
-				Drones: V.securityForceDronePower,
-				Drugs: V.securityForceStimulantPower,
-				PGT: V.securityForceHeavyBattleTank,
-				AA: V.securityForceAircraftPower,
-				TA: V.securityForceAircraftPower,
-				SpacePlane: V.securityForceSpacePlanePower,
-				GunS: V.securityForceAC130,
-				Satellite: V.securityForceSatellitePower,
-				GiantRobot: V.securityForceGiantRobot,
-				MissileSilo: V.securityForceMissileSilo,
-				AircraftCarrier: V.securityForceAircraftCarrier,
-				Sub: V.securityForceSubmarine,
-				HAT: V.securityForceHeavyAmphibiousTransport
-			};
-			UnitsClean();
-		} else {
-			App.SF.Init();
-		}
-	} else if (typeof V.SF === "object") {
-		V.SF.FS = V.SF.FS || {};
-		V.SF.FS.Tension = V.SF.FS.Tension || -1;
-
-		if (V.SF.Toggle && V.SF.Active >= 1) {
-			V.SF.UC = V.SF.UC || {};
-			V.SF.Depravity = V.SF.Depravity || 0;
-			V.SF.Upgrade = V.SF.Upgrade || 0;
-			V.SF.Gift = V.SF.Gift || 0;
-			V.SF.UC.Assign = V.SF.UC.Assign || 0;
-			V.SF.UC.Lock = V.SF.UC.Lock || 0;
-			V.SF.ROE = V.SF.ROE || "hold";
-			V.SF.Target = V.SF.Target || "recruit";
-			V.SF.Regs = V.SF.Regs || "strict";
-			V.SF.Lower = V.SF.Lower || "the special force";
-
-			V.SF.ArmySize = V.SF.ArmySize || 40;
-
-			V.SF.Squad = V.SF.Squad || {};
-			for (let i = 0; i < App.SF.upgrades.list('all').length; i++) {
-				V.SF.Squad[App.SF.upgrades.list('all')[i]] = V.SF.Squad[App.SF.upgrades.list('all')[i]] || 0;
-			}
-
-			V.SF.SatLaunched = V.SF.SatLaunched || 0;
-
-			V.SF.Colonel = V.SF.Colonel || {};
-			V.SF.Colonel.Core = V.SF.Colonel.Core || "";
-			V.SF.Colonel.Talk = V.SF.Colonel.Talk || 0;
-			V.SF.Colonel.Fun = V.SF.Colonel.Fun || 0;
-			V.SF.Colonel.Status = V.SF.Colonel.Status || 0;
-
-			V.SF.MercCon = V.SF.MercCon || {};
-			V.SF.MercCon.History = V.SF.MercCon.History || 0;
-			V.SF.MercCon.CanAttend = V.SF.MercCon.CanAttend || 0;
-			if (V.SF.MercCon.History >= 1) {
-				V.SF.MercCon.CanAttend = -1;
-			}
-			V.SF.MercCon.Income = V.SF.MercCon.Income || 0;
-			V.SF.MercCon.Revenue = V.SF.MercCon.Revenue || 0;
-			V.SF.MercCon.Mercs = V.SF.MercCon.Mercs || 0;
-			V.SF.MercCon.Menials = V.SF.MercCon.Menials || 0;
-			V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalMenials || 0;
-			V.SF.MercCon.TotalMercs = V.SF.MercCon.TotalMercs || 0;
-
-			if (typeof V.SF.Squad.Satellite === "object") {
-				if (V.SF.Squad.Satellite.InOrbit > 0) {
-					V.SF.SatLaunched = V.SF.Squad.Satellite.InOrbit; delete V.SF.Squad.Satellite.InOrbit;
-				}
-				V.SF.Squad.Satellite = V.SF.Squad.Satellite.lv;
-			}
-
-			delete V.SF.FS.upgrade; delete V.SF.UC.num;
-
-			if (jsDef(V.choice)) {
-				V.SF.Gift = V.choice;
-			}
-
-			if (V.Tour !== undefined) {
-				V.SF.tour = V.Tour || 0;
-			}
-
-			if (V.SF.Squad.Troops) {
-				V.SF.ArmySize = V.SF.Squad.Troops;
-				delete V.SF.Squad.Troops;
-			}
-
-			if (V.SF.MercCon !== undefined) {
-				if( V.SF.MercCon.View !== undefined) {
-					delete V.SF.MercCon.View;
-				}
-				if (V.SF.MercCon.Helots !== undefined) {
-					V.SF.MercCon.Menials = V.SF.MercCon.Helots;
-					delete V.SF.MercCon.Helots;
-				}
-				if (V.SF.MercCon.TotalHelots !== undefined) {
-					V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots;
-					delete V.SF.MercCon.TotalHelots;
-				}
-			}
-
-			if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) {
-				V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock};
-			}
-
-			if (V.SFUC !== undefined) {
-				V.SF.UC.num = V.SFUC || 0;
-			}
-
-			if (V.SpecOpsLock !== undefined) {
-				V.SF.SpecOpsLock = V.SpecOpsLock;
-			}
-
-			if (V.SF.U !== undefined) {
-				V.SF.Upgrade = V.SF.U || 0;
-			}
-
-			if (V.SF.WG !== undefined) {
-				V.SF.Gift = V.SF.WG || 0;
-			}
-
-			if (V.SF.Depravity < 0) {
-				V.SF.Depravity = 0;
-			}
-
-			if (V.SFUnit !== undefined) {
-				if (V.SFUnit.AT !== undefined) {
-					V.SFUnitTA = 0;
-				}
-				if (V.SFTradeShow !== undefined) {
-					V.SF.MercCon = V.SFTradeShow;
-				}
-				delete V.SFTradeShow;
-				if (V.SFColonel !== undefined) {
-					V.SF.Colonel = V.SFColonel;
-				}
-
-				if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) {
-					V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched};
-					V.SF.Squad.Satellite = V.SF.Squad.Sat;
-					delete V.SF.Squad.Sat;
-					delete V.SatLaunched;
-				}
-			}
-		} // closes: V.SF.Toggle && V.SF.Active >= 1
-	}
-
-	delete V.Tour; delete V.SFColonel; delete V.SFUnit;
-	delete V.SF.tour; delete V.SF.Caps; delete V.SF.Size; delete V.choice;
-	delete V.SF.Units; delete V.SpecOpsLock; delete V.SF.U; delete V.SF.WG;
-	delete V.SF.Subsidy; delete V.SF.SpecOps; delete V.SF.SpecOpsLock; delete V.SFUC;
-
-	if (V.SF.BadOutcome !== undefined) {
-		delete V.SF.BadOutcome;
-	}
-	if (V.arcologies[0].SFRaid !== undefined) {
-		delete V.arcologies[0].SFRaid;
-	}
-	if (V.arcologies[0].SFRaidTarget !== undefined) {
-		delete V.arcologies[0].SFRaidTarget;
-	}
-	if (V.SF.Facility !== undefined) {
-		delete V.SF.Facility;
-	}
-
-	if (V.SF.MWU !== undefined) {
-		delete V.SF.MWU;
-	}
-	if (V.SF.Bonus !== undefined) {
-		delete V.SF.Bonus;
-	}
-
-	InitClean();
-	MainClean();
-	ColonelClean();
-	TradeShowClean();
-	UnitsClean();
-
-	if (V.week < 72 && V.SF.Active !== -1) { V.SF.Active = -1; }
-};
-/* usedOnce */
-
 App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100) {
 	const Revivalisms = ['Arabian_Revivalism', 'Aztec_Revivalism', 'Chinese_Revivalism', 'Edo_Revivalism', 'Egyptian_Revivalism', 'Multiculturalism', 'Roman_Revivalism'];
 	let FS_OPTIONS = ['Asset_Expansionism', 'Body_Purism', 'Chattel_Religionism', 'Degradationism', 'Eugenics', 'Gender_radicalism', 'Gender_traditionalism', 'Hedonistic_Decadence', 'Maturity_Preferentialism', 'Paternalism', 'Physical_Idealism', 'Repopulation', 'Slave_Pastoralism', 'Slimness_Enthusiasm', 'Transformation_Fetishism', 'Youth_Preferentialism'];
diff --git a/src/Mods/SpecialForce/SpecialForceBC.js b/src/Mods/SpecialForce/SpecialForceBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b848c1b539e874ff337b2cf52eee7749d799c8d
--- /dev/null
+++ b/src/Mods/SpecialForce/SpecialForceBC.js
@@ -0,0 +1,353 @@
+// @ts-nocheck
+/* no-usedOnce */
+App.SF.BC = function() {
+	function InitClean() {
+		delete V.SFMODToggle;
+		delete V.securityForceActive;
+		delete V.securityForceCreate;
+		delete V.securityForceEventSeen;
+	}
+
+	function MainClean() {
+		delete V.securityForceActive;
+		delete V.securityForceRecruit;
+		delete V.securityForceTrade;
+		delete V.securityForceBooty;
+		delete V.securityForceIncome;
+		delete V.securityForceMissionEfficiency;
+		delete V.securityForceProfitable;
+		delete V.TierTwoUnlock;
+		delete V.securityForceDepravity;
+		delete V.SFAO;
+		delete V.securityForceUpgradeTokenReset;
+		delete V.securityForceUpgradeToken;
+		delete V.securityForceGiftToken;
+		delete V.securityForceRulesOfEngagement;
+		delete V.securityForceFocus;
+		delete V.securityForceAccountability;
+		delete V.securityForceName;
+		delete V.SubsidyActive;
+		delete V.securityForceSubsidyActive;
+	}
+
+	function ColonelClean() {
+		delete V.ColonelCore;
+		delete V.securityForceColonelToken;
+		delete V.securityForceColonelSexed;
+		delete V.ColonelRelationship;
+		delete V.securityForceSexedColonelToken;
+	}
+
+	function TradeShowClean() {
+		delete V.OverallTradeShowAttendance;
+		delete V.CurrentTradeShowAttendance;
+		delete V.TradeShowIncome;
+		delete V.TotalTradeShowIncome;
+		delete V.TradeShowHelots;
+		delete V.TotalTradeShowHelots;
+	}
+
+	function UnitsClean() {
+		delete V.securityForceInfantryPower;
+		delete V.securityForceArcologyUpgrades;
+		delete V.securityForceVehiclePower;
+		delete V.securityForceDronePower;
+		delete V.securityForceStimulantPower;
+		delete V.securityForceHeavyBattleTank;
+		delete V.securityForceAircraftPower;
+		delete V.securityForceSpacePlanePower;
+		delete V.securityForceAC130;
+		delete V.securityForceSatellitePower;
+		delete V.securityForceGiantRobot;
+		delete V.securityForceMissileSilo;
+		delete V.securityForceAircraftCarrier;
+		delete V.securityForceSubmarine;
+		delete V.securityForceHeavyAmphibiousTransport;
+		delete V.securityForcePersonnel;
+		delete V.securityForceFortressZeppelin;
+		delete V.securityForceHeavyTransport;
+	}
+
+	if (typeof V.SF !== "object") {
+		if (V.securityForceEventSeen < 1) {
+			V.securityForceActive = -1;
+		} else {
+			V.securityForceActive = 2;
+		}
+		V.SF = {Toggle: V.SFMODToggle, Active: V.securityForceActive};
+		InitClean();
+		if (V.securityForceName === undefined) {
+			V.securityForceName = "the special force";
+		}
+		if (V.SF.Active >= 1) {
+			Object.assign(V.SF, {
+				Depravity: V.securityForceDepravity,
+				Upgrade: V.securityForceUpgradeToken,
+				Gift: V.securityForceGiftToken,
+				UC: {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock},
+				ROE: V.securityForceRulesOfEngagement,
+				Target: V.securityForceFocus,
+				Regs: V.securityForceAccountability,
+				Lower: V.securityForceName,
+			});
+			MainClean();
+
+			if (V.ColonelCore === undefined) {
+				V.ColonelCore = "";
+			}
+			if (V.ColonelDiscussion === undefined) {
+				V.ColonelDiscussion = 0;
+			}
+			if (V.ColonelSexed === undefined) {
+				V.ColonelSexed = 0;
+			}
+			V.SF.Colonel = {
+				Core: V.ColonelCore,
+				Talk: V.securityForceColonelToken,
+				Fun: V.securityForceColonelSexed,
+				Status: V.ColonelRelationship
+			};
+			ColonelClean();
+
+			if (V.TradeShowIncome === undefined) {
+				V.TradeShowIncome = 0;
+			}
+			if (V.TotalTradeShowIncome === undefined) {
+				V.TotalTradeShowIncome = 0;
+			}
+			if (V.TradeShowHelots === undefined) {
+				V.TradeShowHelots = 0;
+			}
+			if (V.TotalTradeShowHelots === undefined) {
+				V.TotalTradeShowHelots = 0;
+			}
+			V.SF.MercCon = {
+				History: V.OverallTradeShowAttendance,
+				CanAttend: V.CurrentTradeShowAttendance,
+				Income: V.TradeShowIncome,
+				Revenue: V.TotalTradeShowIncome,
+				Menials: V.TradeShowHelots,
+				TotalMenials: V.TotalTradeShowHelots,
+				Mercs: 0,
+				TotalMercs: 0
+			};
+			TradeShowClean();
+			if (V.SF.MercCon.History > 0) {
+				V.SF.MercCon.CanAttend = 1;
+			}
+
+			if (V.securityForceHeavyBattleTank === undefined) {
+				V.securityForceHeavyBattleTank = 0;
+			}
+			if (V.securityForceSpacePlanePower === undefined) {
+				V.securityForceSpacePlanePower = 0;
+			}
+			if (V.securityForceAC130 === undefined) {
+				V.securityForceAC130 = 0;
+			}
+			if (V.securityForceSatellitePower === undefined) {
+				V.securityForceSatellitePower = 0;
+			}
+			if (V.securityForceGiantRobot === undefined) {
+				V.securityForceGiantRobot = 0;
+			}
+			if (V.securityForceMissileSilo === undefined) {
+				V.securityForceMissileSilo = 0;
+			}
+			if (V.securityForceAircraftCarrier === undefined) {
+				V.securityForceAircraftCarrier = 0;
+			}
+			if (V.securityForceSubmarine === undefined) {
+				V.securityForceSubmarine = 0;
+			}
+			if (V.securityForceHeavyAmphibiousTransport === undefined) {
+				V.securityForceHeavyAmphibiousTransport = 0;
+			}
+
+			V.SF.ArmySize = V.securityForcePersonnel;
+
+			V.SF.SatLaunched = 0;
+
+			V.SF.Squad = {
+				Armoury: V.securityForceInfantryPower,
+				Firebase: V.securityForceArcologyUpgrades,
+				AV: V.securityForceVehiclePower,
+				TV: V.securityForceVehiclePower,
+				Drones: V.securityForceDronePower,
+				Drugs: V.securityForceStimulantPower,
+				PGT: V.securityForceHeavyBattleTank,
+				AA: V.securityForceAircraftPower,
+				TA: V.securityForceAircraftPower,
+				SpacePlane: V.securityForceSpacePlanePower,
+				GunS: V.securityForceAC130,
+				Satellite: V.securityForceSatellitePower,
+				GiantRobot: V.securityForceGiantRobot,
+				MissileSilo: V.securityForceMissileSilo,
+				AircraftCarrier: V.securityForceAircraftCarrier,
+				Sub: V.securityForceSubmarine,
+				HAT: V.securityForceHeavyAmphibiousTransport
+			};
+			UnitsClean();
+		} else {
+			App.SF.Init();
+		}
+	} else if (typeof V.SF === "object") {
+		V.SF.FS = V.SF.FS || {};
+		V.SF.FS.Tension = V.SF.FS.Tension || -1;
+
+		if (V.SF.Toggle && V.SF.Active >= 1) {
+			V.SF.UC = V.SF.UC || {};
+			V.SF.Depravity = V.SF.Depravity || 0;
+			V.SF.Upgrade = V.SF.Upgrade || 0;
+			V.SF.Gift = V.SF.Gift || 0;
+			V.SF.UC.Assign = V.SF.UC.Assign || 0;
+			V.SF.UC.Lock = V.SF.UC.Lock || 0;
+			V.SF.ROE = V.SF.ROE || "hold";
+			V.SF.Target = V.SF.Target || "recruit";
+			V.SF.Regs = V.SF.Regs || "strict";
+			V.SF.Lower = V.SF.Lower || "the special force";
+
+			V.SF.ArmySize = V.SF.ArmySize || 40;
+
+			V.SF.Squad = V.SF.Squad || {};
+			for (let i = 0; i < App.SF.upgrades.list('all').length; i++) {
+				V.SF.Squad[App.SF.upgrades.list('all')[i]] = V.SF.Squad[App.SF.upgrades.list('all')[i]] || 0;
+			}
+
+			V.SF.SatLaunched = V.SF.SatLaunched || 0;
+
+			V.SF.Colonel = V.SF.Colonel || {};
+			V.SF.Colonel.Core = V.SF.Colonel.Core || "";
+			V.SF.Colonel.Talk = V.SF.Colonel.Talk || 0;
+			V.SF.Colonel.Fun = V.SF.Colonel.Fun || 0;
+			V.SF.Colonel.Status = V.SF.Colonel.Status || 0;
+
+			V.SF.MercCon = V.SF.MercCon || {};
+			V.SF.MercCon.History = V.SF.MercCon.History || 0;
+			V.SF.MercCon.CanAttend = V.SF.MercCon.CanAttend || 0;
+			if (V.SF.MercCon.History >= 1) {
+				V.SF.MercCon.CanAttend = -1;
+			}
+			V.SF.MercCon.Income = V.SF.MercCon.Income || 0;
+			V.SF.MercCon.Revenue = V.SF.MercCon.Revenue || 0;
+			V.SF.MercCon.Mercs = V.SF.MercCon.Mercs || 0;
+			V.SF.MercCon.Menials = V.SF.MercCon.Menials || 0;
+			V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalMenials || 0;
+			V.SF.MercCon.TotalMercs = V.SF.MercCon.TotalMercs || 0;
+
+			if (typeof V.SF.Squad.Satellite === "object") {
+				if (V.SF.Squad.Satellite.InOrbit > 0) {
+					V.SF.SatLaunched = V.SF.Squad.Satellite.InOrbit; delete V.SF.Squad.Satellite.InOrbit;
+				}
+				V.SF.Squad.Satellite = V.SF.Squad.Satellite.lv;
+			}
+
+			delete V.SF.FS.upgrade; delete V.SF.UC.num;
+
+			if (jsDef(V.choice)) {
+				V.SF.Gift = V.choice;
+			}
+
+			if (V.Tour !== undefined) {
+				V.SF.tour = V.Tour || 0;
+			}
+
+			if (V.SF.Squad.Troops) {
+				V.SF.ArmySize = V.SF.Squad.Troops;
+				delete V.SF.Squad.Troops;
+			}
+
+			if (V.SF.MercCon !== undefined) {
+				if( V.SF.MercCon.View !== undefined) {
+					delete V.SF.MercCon.View;
+				}
+				if (V.SF.MercCon.Helots !== undefined) {
+					V.SF.MercCon.Menials = V.SF.MercCon.Helots;
+					delete V.SF.MercCon.Helots;
+				}
+				if (V.SF.MercCon.TotalHelots !== undefined) {
+					V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots;
+					delete V.SF.MercCon.TotalHelots;
+				}
+			}
+
+			if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) {
+				V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock};
+			}
+
+			if (V.SFUC !== undefined) {
+				V.SF.UC.num = V.SFUC || 0;
+			}
+
+			if (V.SpecOpsLock !== undefined) {
+				V.SF.SpecOpsLock = V.SpecOpsLock;
+			}
+
+			if (V.SF.U !== undefined) {
+				V.SF.Upgrade = V.SF.U || 0;
+			}
+
+			if (V.SF.WG !== undefined) {
+				V.SF.Gift = V.SF.WG || 0;
+			}
+
+			if (V.SF.Depravity < 0) {
+				V.SF.Depravity = 0;
+			}
+
+			if (V.SFUnit !== undefined) {
+				if (V.SFUnit.AT !== undefined) {
+					V.SFUnitTA = 0;
+				}
+				if (V.SFTradeShow !== undefined) {
+					V.SF.MercCon = V.SFTradeShow;
+				}
+				delete V.SFTradeShow;
+				if (V.SFColonel !== undefined) {
+					V.SF.Colonel = V.SFColonel;
+				}
+
+				if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) {
+					V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched};
+					V.SF.Squad.Satellite = V.SF.Squad.Sat;
+					delete V.SF.Squad.Sat;
+					delete V.SatLaunched;
+				}
+			}
+		} // closes: V.SF.Toggle && V.SF.Active >= 1
+	}
+
+	delete V.Tour; delete V.SFColonel; delete V.SFUnit;
+	delete V.SF.tour; delete V.SF.Caps; delete V.SF.Size; delete V.choice;
+	delete V.SF.Units; delete V.SpecOpsLock; delete V.SF.U; delete V.SF.WG;
+	delete V.SF.Subsidy; delete V.SF.SpecOps; delete V.SF.SpecOpsLock; delete V.SFUC;
+
+	if (V.SF.BadOutcome !== undefined) {
+		delete V.SF.BadOutcome;
+	}
+	if (V.arcologies[0].SFRaid !== undefined) {
+		delete V.arcologies[0].SFRaid;
+	}
+	if (V.arcologies[0].SFRaidTarget !== undefined) {
+		delete V.arcologies[0].SFRaidTarget;
+	}
+	if (V.SF.Facility !== undefined) {
+		delete V.SF.Facility;
+	}
+
+	if (V.SF.MWU !== undefined) {
+		delete V.SF.MWU;
+	}
+	if (V.SF.Bonus !== undefined) {
+		delete V.SF.Bonus;
+	}
+
+	InitClean();
+	MainClean();
+	ColonelClean();
+	TradeShowClean();
+	UnitsClean();
+
+	if (V.week < 72 && V.SF.Active !== -1) { V.SF.Active = -1; }
+};
+/* usedOnce */
diff --git a/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw b/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw
index 5f78ca87af81bba2e840704827e8dc9ee8fc1027..005c0e3a00652c292e405f25d89be27537382be0 100644
--- a/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw
+++ b/src/cheats/PCCheatMenuCheatDatatypeCleanup.tw
@@ -71,6 +71,7 @@
 You perform the dark rituals, pray to the dark gods, and sell your soul for the power to reshape your body and life at will. What a cheater!
 
 <<set $PC = clone($tempSlave)>>
+<<run ibc.recalculate_id(-1)>>
 <<run PCDatatypeCleanup()>>
 <<set $upgradeMultiplierArcology = upgradeMultiplier('engineering')>>
 <<set $upgradeMultiplierMedicine = upgradeMultiplier('medicine')>>
diff --git a/src/cheats/mod_EditChildCheatDatatypeCleanupNew.tw b/src/cheats/mod_EditChildCheatDatatypeCleanupNew.tw
index 9ac0b8c1f7773a1ede8b558f13872d319296675a..283f230b8ca21b397bc7728936812e07caf97b93 100644
--- a/src/cheats/mod_EditChildCheatDatatypeCleanupNew.tw
+++ b/src/cheats/mod_EditChildCheatDatatypeCleanupNew.tw
@@ -327,3 +327,4 @@ You perform the dark rituals, pray to the dark gods, and sell your soul for the
 <<if def _escn>>
 	<<set $cribs[_escn] = clone($activeSlave)>>
 <</if>>
+<<run ibc.recalculate_coeff_id($activeSlave.ID)>>
diff --git a/src/cheats/mod_EditSlaveCheat.tw b/src/cheats/mod_EditSlaveCheat.tw
index 3ece6b32dae265ec7fbb3d01c04316340cab7bc0..0b39e745e74003940fcdae98070a18c0ff4e0a59 100644
--- a/src/cheats/mod_EditSlaveCheat.tw
+++ b/src/cheats/mod_EditSlaveCheat.tw
@@ -2,7 +2,6 @@
 
 <<set $nextButton = "Continue">>
 <<set $nextLink = "MOD_Edit Slave Cheat Datatype Cleanup">>
-<<set $oldName = $activeSlave.slaveName, $oldSurname = $activeSlave.slaveSurname>>
 <<set $tempSlave = clone($activeSlave)>>
 <<setLocalPronouns $tempSlave>>
 
diff --git a/src/cheats/mod_EditSlaveCheatDatatypeCleanup.tw b/src/cheats/mod_EditSlaveCheatDatatypeCleanup.tw
index 259d748bfbaa74c177b5e2c72ed4ca88aa5e50b6..015bbf3689f12cfe7aa5def560e7729c99d46c73 100644
--- a/src/cheats/mod_EditSlaveCheatDatatypeCleanup.tw
+++ b/src/cheats/mod_EditSlaveCheatDatatypeCleanup.tw
@@ -71,3 +71,4 @@ You perform the dark rituals, pray to the dark gods, and sell your soul for the
 <<if def _escdc>>
 	<<set $slaves[_escdc] = $activeSlave>>
 <</if>>
+<<run ibc.recalculate_coeff_id($activeSlave.ID)>>
diff --git a/src/cheats/mod_EditSlaveCheatDatatypeCleanupNew.tw b/src/cheats/mod_EditSlaveCheatDatatypeCleanupNew.tw
index 3dd6e0e84971868e55ea3238e7bfc1ec30e46916..043d863a43e53d02bd68d7404ded8b01fa599212 100644
--- a/src/cheats/mod_EditSlaveCheatDatatypeCleanupNew.tw
+++ b/src/cheats/mod_EditSlaveCheatDatatypeCleanupNew.tw
@@ -230,3 +230,4 @@ You perform the dark rituals, pray to the dark gods, and sell your soul for the
 <<if def _escn>>
 	<<set $slaves[_escn] = clone($activeSlave)>>
 <</if>>
+<<run ibc.recalculate_coeff_id($activeSlave.ID)>>
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 64ed155782408677cfc8c1b7f75ffe62b9be8d78..e595875d8c85665ffc837754889a2a6187195cef 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -302,8 +302,8 @@ App.Update.globalVariables = function(node) {
 	// Farmyard Subsection
 	const animalsBought = ["abbysinians", "beagles", "bengals", "birmans", "bulldogs", "bulls", "canines", "cougars", "dingos", "felines", "foxes", "frenchBulldogs", "germanShepherds", "goldenRetrievers", "hooved", "horses", "jackals", "jaguars", "labradorRetrievers", "leopards", "lions", "lynx", "maineCoons", "orientalShorthairs", "persians", "pigs", "poodles", "pumas", "ragdolls", "rottweilers", "russianBlues", "siameses", "siberianHuskies", "sphynxes", "tigers", "wolves", "yorkshireTerriers", "zebras"];
 	animalsBought.forEach(function(species) { V.animalsBought[species] = V.animalsBought[species] || 0; });
-	if (typeof V.farmyardUpgrade !== "object") {
-		V.farmyardUpgrade = {
+	if (typeof V.farmyardUpgrades !== "object") {
+		V.farmyardUpgrades = {
 			pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0
 		};
 	}
@@ -914,7 +914,7 @@ App.Update.globalVariables = function(node) {
 		}
 	}
 
-	policies.BC();
+	App.Update.policies();
 
 	// Player Arcology
 	{
@@ -923,7 +923,7 @@ App.Update.globalVariables = function(node) {
 		} else {
 			assistant.object();
 		}
-		FCTV.manage();
+		App.Update.FCTV();
 		if (jQuery.isEmptyObject(V.FSPromenade)) {
 			V.FSPromenade = {
 				Subjugationist: 0,
@@ -1258,6 +1258,7 @@ App.Update.slaveRecords = function(node) {
 					child.spermY = normalRandInt(50, 5);
 				}
 				App.Facilities.Nursery.InfantDatatypeCleanup(child);
+				child.inbreedingCoeff = ibc.coeff(child);
 			} else {
 				App.Update.Slave(child);
 				App.Entity.Utils.SlaveDataSchemeCleanup(child, true);
@@ -1280,6 +1281,17 @@ App.Update.slaveRecords = function(node) {
 };
 
 App.Update.genePoolRecords = function(node) {
+	Object.values(V.missingTable).forEach(s => {
+		if (!jsDef(s.mother))
+			s.mother = 0;
+		if (!jsDef(s.father))
+			s.father = 0;
+		if (!jsDef(s.inbreedingCoeff))
+			s.inbreedingCoeff = 0;
+	});
+
+	let ib_coeff = ibc.coeff_slaves(V.genePool);
+	V.genePool.forEach(g => {g.inbreedingCoeff = ib_coeff[g.ID]});
 	V.slaveIndices = slaves2indices(); // we're going to need to compare to active slaves, if they exist
 
 	for (let bci = 0; bci < V.genePool.length; bci++) {
diff --git a/src/data/backwardsCompatibility/policiesBC.js b/src/data/backwardsCompatibility/policiesBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..861bd621fd7562681ca91ba7aedaac0713191f97
--- /dev/null
+++ b/src/data/backwardsCompatibility/policiesBC.js
@@ -0,0 +1,85 @@
+// @ts-nocheck
+App.Update.policies = function() {
+	function convertMain(variable, pro, anti) {
+		if (V[pro]) {
+			V.policies[variable] = 1;
+		} else if (V[anti]) {
+			V.policies[variable] = -1;
+		}
+	}
+
+	function convertRetirement(variable, retireType, amountRequired) {
+		if (V[retireType] && V[amountRequired]) {
+			V.policies.retirement[variable] = V[amountRequired];
+		}
+	}
+
+	if (V.releaseID < 1069) {
+		V.policies.childProtectionAct = V.childProtectionAct;
+		V.policies.culturalOpenness = V.CulturalOpenness;
+		V.policies.sexualOpeness = V.sexualOpeness;
+		V.policies.proRefugees = V.ProRefugees;
+		V.policies.publicFuckdolls = V.publicFuckdolls;
+
+		V.policies.proRecruitment = V.ProRecruitment;
+		V.policies.cash4Babies = V.Cash4Babies;
+		V.policies.regularParties = V.RegularParties;
+		V.policies.publicPA = V.PAPublic;
+		V.policies.coursingAssociation = V.CoursingAssociation;
+
+		V.policies.raidingMercenaries = V.RaidingMercenaries;
+		V.policies.mixedMarriage = V.MixedMarriage;
+		V.policies.goodImageCampaign = V.goodImageCampaign;
+		V.policies.alwaysSubsidizeRep = V.alwaysSubsidizeRep;
+		V.policies.alwaysSubsidizeGrowth = V.alwaysSubsidizeGrowth;
+
+		convertMain('immmigrationCash', 'ProImmigrationCash', 'AntiImmigrationCash');
+		convertMain('immmigrationRep', 'ProImmigrationRep', 'AntiImmigrationRep');
+		convertMain('enslavementCash', 'ProEnslavementCash', 'AntiEnslavementCash');
+		convertMain('enslavementRep', 'ProEnslavementRep', 'AntiEnslavementRep');
+		convertMain('cashForRep', 'CashForRep', 'RepForCash');
+
+		convertMain('oralAppeal', 'OralEncouragement', 'OralDiscouragement');
+		convertMain('vaginalAppeal', 'VaginalEncouragement', 'VaginalDiscouragement');
+		convertMain('analAppeal', 'AnalEncouragement', 'AnalDiscouragement');
+
+		convertRetirement('sex', 'SexMilestoneRetirement', 'retirementSex');
+		convertRetirement('milk', 'MilkMilestoneRetirement', 'retirementMilk');
+		convertRetirement('cum', 'CumMilestoneRetirement', 'retirementCum');
+		convertRetirement('births', 'BirthsMilestoneRetirement', 'retirementBirths');
+		convertRetirement('kills', 'KillsMilestoneRetirement', 'retirementKills');
+
+		if (V.BioreactorRetirement) {
+			V.policies.retirement.fate = "bioreactor";
+		} else if (V.ArcadeRetirement) {
+			V.policies.retirement.fate = "arcade";
+		} else if (V.CitizenRetirement) {
+			V.policies.retirement.fate = "citizen";
+		}
+
+		V.policies.retirement.menial2Citizen = V.citizenRetirementMenials;
+		V.policies.retirement.customAgePolicy = V.policies.retirement.customAgePolicySet || V.CustomRetirementAgePolicy;
+		V.policies.retirement.physicalAgePolicy = V.PhysicalRetirementAgePolicy;
+
+		V.policies.SMR.basicSMR = V.BasicSMR;
+		V.policies.SMR.healthInspectionSMR = V.HealthInspectionSMR;
+		V.policies.SMR.educationSMR = V.EducationSMR;
+		V.policies.SMR.frigiditySMR = V.FrigiditySMR;
+
+		V.policies.SMR.weightSMR = V.BasicWeightSMR;
+		V.policies.SMR.honestySMR = V.HonestySMR;
+
+		V.policies.SMR.beauty.basicSMR = V.BasicBeautySMR;
+		V.policies.SMR.beauty.qualitySMR = V.QualityBeautySMR;
+
+		V.policies.SMR.height.basicSMR = V.BasicHeightSMR;
+		V.policies.SMR.height.advancedSMR = V.AdvancedHeightSMR;
+
+		V.policies.SMR.intelligence.basicSMR = V.BasicIntelligenceSMR;
+		V.policies.SMR.intelligence.qualitySMR = V.QualityIntelligenceSMR;
+
+		V.policies.SMR.eugenics.faceSMR = V.FaceEugenicsSMR;
+		V.policies.SMR.eugenics.heightSMR = V.HeightEugenicsSMR;
+		V.policies.SMR.eugenics.intelligenceSMR = V.IntelligenceEugenicsSMR;
+	}
+};
diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js
index aecfcbe7fa6955dd6bcd935feeccb640287555e0..af4d2a0f912cce2c041bb8905211d3c6ec82020f 100644
--- a/src/data/backwardsCompatibility/updateSlaveObject.js
+++ b/src/data/backwardsCompatibility/updateSlaveObject.js
@@ -1026,4 +1026,14 @@ App.Update.Slave = function(slave, genepool = false) {
 			}
 		}
 	}
+
+	if (!jsDef(slave.inbreedingCoeff)) {
+		slave.inbreedingCoeff = ibc.coeff(slave);
+		slave.womb.forEach(f => {
+			// Use null as the ID, since fetuses are missing it
+			f.genetics.inbreedingCoeff = ibc.coeff(
+				{ID: null, mother: f.genetics.mother, father: f.genetics.father}
+			);
+		});
+	}
 };
diff --git a/src/data/newGamePlus.js b/src/data/newGamePlus.js
index f5a569ea612662e0a39f428dcde935087e67530a..bc771401033f017391fc9c69d2c3dc11f1b9476f 100644
--- a/src/data/newGamePlus.js
+++ b/src/data/newGamePlus.js
@@ -69,18 +69,77 @@ App.Data.NewGamePlus = (function() {
 
 		const ngUpdateMissingTable = function(missingTable) {
 			const newTable = {};
+			let needed = [];
 
 			(V.slaves || [])
 				.forEach(s => ([s.pregSource + NGPOffset, s.mother + NGPOffset, s.father + NGPOffset]
 					.filter(i => (i in missingTable))
 					.forEach(i => {
-						newTable[i - NGPOffset] = missingTable[i];
-						newTable[i - NGPOffset].ID -= NGPOffset;
+						if (needed.indexOf(i) === -1)
+							needed.push(i);
 					})));
+			(V.slaves || []).forEach(s => (s.womb
+				.forEach(f => ([f.fatherID, f.genetics.father, f.genetics.mother]
+					.filter(i => (i in missingTable))
+					.forEach(i => {
+						if (needed.indexOf(i) === -1)
+							needed.push(i);
+					})))));
+
+			while (needed.length > 0) {
+				let i = needed.shift();
+				let s = missingTable[i];
+				newTable[i - NGPOffset] = s;
+				s.ID -= NGPOffset;
+				if (s.mother in missingTable) {
+					s.mother -= NGPOffset;
+					if (!(s.mother in newTable) && needed.indexOf(s.mother + NGPOffset) === -1)
+						needed.push(s.mother + NGPOffset);
+				} 
+				if (s.father in missingTable) {
+					s.father -= NGPOffset;
+					if (!(s.father in newTable) && needed.indexOf(s.father + NGPOffset) === -1)
+						needed.push(s.father + NGPOffset);
+				}
+			}
 
 			return newTable;
 		};
 
+		if (typeof V.missingTable !== undefined) {
+			let oldMissingParentID = Math.min(-10000, ...Object.keys(V.missingTable)) - 1;
+			V.slaves.filter(s => (s.assignment !== Job.IMPORTED)).forEach(s => {
+				V.missingTable[oldMissingParentID] = {
+					slaveName: s.slaveName,
+					slaveSurname: s.slaveSurname,
+					fullName: SlaveFullName(s),
+					dick: s.dick,
+					vagina: s.vagina,
+					ID: oldMissingParentID,
+					mother: s.mother,
+					father: s.father,
+					inbreedingCoeff: s.inbreedingCoeff
+				};
+				Object.values(V.missingTable).forEach(so => {
+					if (so.mother === s.ID)
+						so.mother = oldMissingParentID;
+					if (so.father === s.ID)
+						so.father = oldMissingParentID;
+				});
+				V.slaves.concat([V.PC]).forEach(so => {
+					if (so.mother === s.ID)
+						so.mother = oldMissingParentID;
+					if (so.father === s.ID)
+						so.father = oldMissingParentID;
+					if (so.assignment === Job.IMPORTED || so.ID === -1) {
+						WombChangeID(so, s.ID, oldMissingParentID);
+						WombChangeGeneID(so, s.ID, oldMissingParentID);
+					}
+				});
+				oldMissingParentID--;
+			});
+		}
+
 		V.slaves.deleteWith((s) => s.assignment !== Job.IMPORTED);
 
 		for (let slave of V.slaves) {
@@ -117,11 +176,7 @@ App.Data.NewGamePlus = (function() {
 			slave.relationshipTarget = slaveOrZero(slave.relationshipTarget);
 		}
 		V.genePool = ngUpdateGenePool(V.genePool);
-		if (typeof V.missingTable === undefined || V.showMissingSlaves === false) {
-			V.missingTable = {};
-		} else {
-			V.missingTable = ngUpdateMissingTable(V.missingTable);
-		}
+		V.missingTable = ngUpdateMissingTable(V.missingTable);
 		let validRelationship = (s) => (s.relationshipTarget !== 0 && getSlave(s.relationshipTarget).relationshipTarget === s.ID);
 		for (let slave of V.slaves) {
 			if ((slave.relationship < 0 && V.freshPC === 1) || (slave.relationship > 0 && !validRelationship(slave))) {
diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js
index a4b2880469355e543e0d9b8dcf6c8f70050b8557..12ef6da75cb1446e4732db60814a6c5fdaeb4773 100644
--- a/src/descriptions/arcologyDescription.js
+++ b/src/descriptions/arcologyDescription.js
@@ -134,8 +134,12 @@ App.Desc.playerArcology = function(lastElement) {
 		if (A.FSAssetExpansionistDecoration === 100) {
 			buffer.push(`The slaves' breasts are unrealistically huge, almost as large as the rest of their bodies.`);
 		}
-		if (A.FSRepopulationFocusDecoration === 100) {
-			buffer.push(`The slaves are heavily pregnant${V.PC.vagina !== -1 ? `, as is the central${V.PC.dick !== 0 ? " futanari" : " female"}` : ""} figure.`);
+		if (A.FSRepopulationFocusDecoration === 100) { /* Can this be made one line? */
+			if (V.PC.vagina !== -1) {
+				buffer.push(`The slaves are heavily pregnant, as is the central ${V.PC.dick !== 0 ? "futanari" : "female"} figure.`);
+			} else {
+				buffer.push(`The slaves are heavily pregnant.`);
+			}
 		}
 		if (A.FSRestartDecoration === 100) {
 			buffer.push(`The central`);
diff --git a/src/descriptions/familySummaries.js b/src/descriptions/familySummaries.js
index 5db6e4def0c6fbc5cd77dd2e2f9e8758cd4d9c45..f962d0a076090a3469a5eaaa5bc7c7ab0ccff19d 100644
--- a/src/descriptions/familySummaries.js
+++ b/src/descriptions/familySummaries.js
@@ -490,6 +490,20 @@ App.Desc.family = (function() {
 			r.push(`${He} has ${numberWithPlural(slave.sisters, "sister")} and ${numberWithPlural(slave.daughters, "daughter")}.`);
 		}
 
+		if (V.inbreeding && slave.inbreedingCoeff > 0) {
+			r.push(`${He} is`);
+			if (slave.inbreedingCoeff >= 0.5)
+				r.push("extremely");
+			else if (slave.inbreedingCoeff >= 0.25)
+				r.push("very");
+			else if (slave.inbreedingCoeff >= 0.125);
+			else if (slave.inbreedingCoeff >= 0.0625)
+				r.push("somewhat");
+			else
+				r.push("slightly");
+			r.push(`inbred, with a CoI of ${slave.inbreedingCoeff}.`);
+		}
+
 		return r.join(" ");
 	}
 
@@ -675,6 +689,20 @@ App.Desc.family = (function() {
 			r.push(`<br>You have ${numberWithPlural(V.PC.sisters, "sister")} and ${numberWithPlural(V.PC.daughters, "daughter")}.`);
 		}
 
+		if (V.inbreeding && V.PC.inbreedingCoeff > 0) {
+			r.push(`You are`);
+			if (V.PC.inbreedingCoeff >= 0.5)
+				r.push("extremely");
+			else if (V.PC.inbreedingCoeff >= 0.25)
+				r.push("very");
+			else if (V.PC.inbreedingCoeff >= 0.125); // No adjective in this case
+			else if (V.PC.inbreedingCoeff >= 0.0625)
+				r.push("somewhat");
+			else
+				r.push("slightly");
+			r.push(`inbred, with a CoI of ${V.PC.inbreedingCoeff}.`);
+		}
+
 		return r.join(" ");
 	}
 
diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js
index 8461bfc531bcaede0e9f50d46fbe08f2f87f722e..f59942c5d265bb168672a53b52526c62d52b1b84 100644
--- a/src/endWeek/saChoosesOwnClothes.js
+++ b/src/endWeek/saChoosesOwnClothes.js
@@ -1032,7 +1032,7 @@ App.SlaveAssignment.choosesOwnClothes = (function() {
 
 		if (slave.fetish === "mindbroken") {
 			if (hasBothLegs(slave) && slave.heels === 1) {
-				shoes.push({text: `${He} finds ${he} can inexplicably walk if ${he} wears heels; a daily lesson for ${him}, as ${he} forgets shortly after leaving.`, shoes: jsEither(["boots", "extreme heels", "heels", "pumps"])});
+				shoes.push({text: `${He} finds ${he} can inexplicably walk if ${he} wears heels; a daily lesson for ${him}, as ${he} forgets shortly after leaving.`, shoes: jsEither(["boots", "extreme heels", "heels"])});
 			}
 			if (V.arcologies[0].FSIntellectualDependencyLawBeauty === 1 || V.arcologies[0].FSStatuesqueGlorification > 0) {
 				shoes.push({text: `A fleeting thought of heels crosses ${his} mind, so ${he} grabs the nearest pair.`, shoes: jsEither(["extreme heels", "heels", "pumps"])});
diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js
index 39e21d396acf790e065deaebe4f49dd805989812..3ba0331829ad501fd5dfb6ecdd4cbee127db4798 100644
--- a/src/endWeek/saClothes.js
+++ b/src/endWeek/saClothes.js
@@ -867,21 +867,6 @@ App.SlaveAssignment.clothes = (function() {
 				if (slave.shoes === "pumps") {
 					r.push(`While ${he} can just barely stand with ${his} heeled pumps, ${he} is incapable of taking a step in them.`);
 				}
-				if (slave.devotion >= -20 && slave.fetish === "submissive" && slave.fetishKnown === 1) {
-					r.push(`${He} <span class="hotpink">loves being forced</span> to crawl around like some kind of animal.`);
-					slave.devotion += 1;
-				} else if (slave.devotion > 50) {
-					r.push(`${He} accepts being forced to crawl around on`);
-					if (hasAllLimbs(slave)) {
-						r.push(`all fours.`);
-					} else {
-						r.push(`the ground.`);
-					}
-				} else {
-					r.push(`${He} <span class="mediumorchid">resents being forced</span> to crawl around like some kind of animal, but it keeps ${him} properly <span class="gold">afraid.</span>`);
-					slave.devotion -= 2;
-					slave.trust -= 4;
-				}
 			}
 		}
 	}
diff --git a/src/endWeek/saPleaseYou.js b/src/endWeek/saPleaseYou.js
index 351b644217e763232430745b0211b3ce8cfe71e8..835972b037a1c1f0750595b42e182ba09a108e01 100644
--- a/src/endWeek/saPleaseYou.js
+++ b/src/endWeek/saPleaseYou.js
@@ -1211,7 +1211,7 @@ App.SlaveAssignment.pleaseYou = (function() {
 			}
 			slave.trust += 1;
 		} else if (!canWalk(slave)) {
-			r.push(`You carry ${him} around with you all week, using ${him} as your personal sex toy and bedwarmer.`);
+			r.push(`You keep ${him} around you all week, using ${him} as your personal sex toy and bedwarmer.`);
 			if (isAmputee(slave)) {
 				r.push(`Without arms and legs,`);
 			} else if (!hasAnyLegs(slave)) {
@@ -1220,16 +1220,18 @@ App.SlaveAssignment.pleaseYou = (function() {
 				r.push(`With just one leg,`);
 			} else if (tooFatSlave(slave)) {
 				r.push(`Immobilized by ${his} own weight,`);
+			} else if (!canMove(eventSlave)) {
+				r.push(`Immobilized by ${his} own swollen body,`);
 			} else if (tooBigBreasts(slave)) {
-				r.push(`Immobilized by ${his} own tits,`);
+				r.push(`Restricted by ${his} own tits,`);
 			} else if (tooBigBelly(slave)) {
-				r.push(`Immobilized by ${his} own swollen orb of a midsection,`);
+				r.push(`Restricted by ${his} own swollen orb of a midsection,`);
 			} else if (tooBigBalls(slave)) {
-				r.push(`Immobilized by ${his} own oversized testicles,`);
+				r.push(`Restricted by ${his} own oversized testicles,`);
 			} else if (tooBigDick(slave)) {
-				r.push(`Immobilized by ${his} own oversized cock,`);
+				r.push(`Restricted by ${his} own oversized cock,`);
 			} else if (tooBigButt(slave)) {
-				r.push(`Immobilized by ${his} own massive ass,`);
+				r.push(`Restricted by ${his} own massive ass,`);
 			} else {
 				r.push(`With ${his} clipped heels,`);
 			}
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index fea31cb0dafea7f40d70e490c8592772ed314ca8..46d73d5fa14b874532dbbffcb8e72a77c91be374 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -110,13 +110,13 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 		if (slave.fuckdoll > 0) {
 			r.push(`is positioned as a sperm dispenser for fertile slaves to ride or milk at their discretion.`);
 		} else if (slave.fetish === "mindbroken") {
-			if (slave.career === "a breeding bull" && canWalk(slave)) {
+			if (slave.career === "a breeding bull" && canMove(slave)) {
 				r.push(`is allowed to freely breed any fertile slaves ${he} can find.`);
 			} else {
 				r.push(`is left as a sperm dispenser for fertile slaves to ride or milk at their discretion.`);
 			}
 		} else if (slave.career === "a breeding bull") {
-			r.push(`sees it as ${his} duty to impregnate everyone in ${his} path. A role ${he} <span class="hotpink">appreciates</span> you <span class="mediumaquamarine">untrusting ${him} with.</span>`);
+			r.push(`sees it as ${his} duty to impregnate everyone in ${his} path. A role ${he} <span class="hotpink">appreciates</span> you <span class="mediumaquamarine">entrusting ${him} with.</span>`);
 			slave.devotion += 1;
 			slave.trust += 1;
 			if (slave.fetishKnown === 1) {
@@ -230,8 +230,10 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 				slave.devotion += 1;
 			}
 		}
-		if (hasAnyLegs(slave) && !canWalk(slave)) {
+		if (!canWalk(slave) && canMove(slave)) {
 			r.push(`Since ${he}'s forced to crawl around, ${he}'s especially vulnerable.`);
+		} else if (!canMove(slave)) {
+			r.push(`Since ${he}'s completely immobile, ${he}'s especially vulnerable.`);
 		}
 		if (V.subSlaves <= 0) {
 			V.subSlaves = 1;
@@ -331,8 +333,8 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 		}
 
 		r.push(`is serving <strong>${domName}</strong> this week.`);
-		if (hasAnyLegs(domSlave) && !canWalk(slave)) {
-			r.push(`Since ${subName} cannot stand, ${domName} has no trouble taking whatever ${he2} wants from ${him}.`);
+		if (hasAnyLegs(domSlave) && !canMove(slave)) {
+			r.push(`Since ${subName} cannot move, ${domName} has no trouble taking whatever ${he2} wants from ${him}.`);
 		} else if (isAmputee(domSlave)) {
 			r.push(`Since ${he2} has no limbs, ${domName} has to put forth extra effort taking whatever ${he2} wants from ${subName}.`);
 		}
@@ -862,7 +864,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 					r.push(`${domName}, it turns out, <span class="lightcoral">really likes cum,</span> and ${subName} has balls, so`);
 					domSlave.fetishKnown = 1;
 				}
-				r.push(`Since ${domName} loves cum, and ${subName} has balls, ${domName} has ${his2} own private semen dispenser. ${domName} sometimes gets tired of having to work hard for cum, so ${he2} spends the week`);
+				r.push(`${domName} has ${his2} own private semen dispenser. ${domName} sometimes gets tired of having to work hard for cum, so ${he2} spends the week`);
 				if (hasAnyArms(domSlave)) {
 					r.push(`stimulating poor ${subName}'s`);
 				} else {
@@ -1180,7 +1182,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 					domSlave.fetishKnown = 1;
 				}
 				r.push(`the first indication ${subName} gets of what ${he}'s in for this week is when ${domName}`);
-				if (canWalk(domSlave)) {
+				if (canStand(domSlave)) {
 					if (domName.mpreg > 0 || domName.ovaries > 0) {
 						r.push(`pushes a full-term belly into ${subName}'s back and`);
 					}
diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js
index 274cfd76de013a243bc21773a4a585672bae33dd..a06295b7d42b9f1d5446f91068281ad89ac61b80 100644
--- a/src/endWeek/saWorkTheFarm.js
+++ b/src/endWeek/saWorkTheFarm.js
@@ -1,566 +1,361 @@
+// FIXME: needs further review
+
 /**
  * @param {App.Entity.SlaveState} slave
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 App.SlaveAssignment.workTheFarm = function(slave) {
-	const arcology = V.arcologies[0];
-	const {
-			he, him, his, He, His
-		} = getPronouns(slave),
-		incomeStats = getSlaveStatisticData(slave, V.facility.farmyard);
-
-	let food = Math.trunc(App.Facilities.Farmyard.foodAmount(slave));
-	let t = `works as a farmhand this week. `;
-
-
-	const foodTotal = (slave, food) => {
-		t += foodFarmer();
-		t += foodDevotion(slave);
-		t += foodMuscles(slave);
-		t += foodWeight(slave);
-		t += foodHealth(slave);
-		t += foodSight(slave);
-		t += foodHearing(slave);
-
-		t += V.foodMarket ? `As a result, ${he} produces <span class="chocolate">${massFormat(food)}</span> of food over the week. ` : ``;
-	};
-
-	const foodFarmer = () => {
-		if (V.Farmer) {
-			return `${V.Farmer.slaveName} watches over ${him}, making sure that ${he} doesn't slack off and works as hard as ${he} should. `;
+	let frag = document.createDocumentFragment();
+
+	const
+		{ he, him, his, He, His } = getPronouns(slave),
+		incomeStats = getSlaveStatisticData(slave, V.facility.farmyard),
+
+		slaveApproves = () => sexualQuirks.includes(slave.sexualQuirk) || behavioralQuirks.includes(slave.behavioralQuirk) || fetishes.includes(slave.fetish),
+
+		sexualQuirks = ["perverted", "unflinching"],
+		behavioralQuirks = ["sinful"],
+		fetishes = ["humiliation", "masochist"],
+
+		foodAmount = Math.trunc(App.Facilities.Farmyard.foodAmount(slave));
+
+	function fullReport(slave) {
+		const report = App.UI.DOM.appendNewElement("div", frag);
+
+		let r = [];
+
+		r.push(intro());
+		r.push(farmer(slave));
+		r.push(devotion(slave));
+		r.push(muscles(slave));
+		r.push(weight(slave));
+		r.push(health(slave));
+		r.push(sight(slave));
+		r.push(hearing(slave));
+		r.push(food());
+
+		r.push(slaveShows(slave));
+		r.push(longTermEffects(slave));
+		r.push(slaveVignettes());
+
+		$(report).append(r.join(' '));
+	}
+
+	const intro = () => `${He} works as a farmhand this week.`;
+
+	function farmer(slave) {
+		const F = getPronouns(S.Farmer);
+
+		if (S.Farmer) {
+			if (slave.devotion < V.FarmerDevotionThreshold) {
+				slave.devotion += V.FarmerDevotionBonus;
+			}
+
+			if (slave.devotion < V.FarmerTrustThreshold) {
+				slave.trust += V.FarmerTrustBonus;
+			}
+
+			if (slave.health.condition < 100) {
+				improveCondition(slave, V.FarmerHealthBonus);
+			}
+
+			return `${S.Farmer.slaveName} watches over ${him}, making sure that ${he} doesn't slack off and works as hard as ${he} should. ${F.He}'s a tough boss, but a fair one. ${slave.slaveName} benefits from ${F.his} care while working in ${V.farmyardName}.`;
 		}
-		return ``;
-	};
+	}
 
-	const foodDevotion = slave => {
+	function devotion(slave) {
 		if (slave.devotion > 50) {
-			return `${He}'s so devoted to you that ${he} works harder and produces more food. `;
+			return `${He}'s so devoted to you that ${he} works harder and produces more food.`;
 		} else if (slave.devotion < -50) {
-			return `${He}'s so resistant that ${he} doesn't work as hard, and thus produces less food. `;
+			return `${He}'s so resistant that ${he} doesn't work as hard, and thus produces less food.`;
 		} else {
-			return ``; // TODO: third case for neutral?
+			return `${He} doesn't feel particularly compelled to work hard or slack off and produces an average amount of food.`;
 		}
-	};
+	}
+
+	function health(slave) {
+		let r = [];
 
-	const foodHealth = slave => {
-		return foodHealthCondition(slave) + foodHealthIllness(slave);
-	};
+		r.push(healthCondition(slave));
+		r.push(healthIllness(slave));
 
-	const foodHealthCondition = slave => {
+		return r.join(' ');
+	}
+
+	function healthCondition(slave) {
 		if (slave.health.condition > 50) {
-			return `${His} shining health helps ${him} work harder and longer. `;
+			return `${His} shining health helps ${him} work harder and longer.`;
 		} else if (slave.health.condition < -50) {
-			return `${His} poor health impedes ${his} ability to work efficiently. `;
-		} else {
-			return ``; // TODO: third case?
+			return `${His} poor health impedes ${his} ability to work efficiently.`;
 		}
-	};
+	}
+
+	function healthIllness(slave) {
+		let
+			r = [],
+			health = ``,
+			exhaustion = ``;
 
-	const foodHealthIllness = slave => {
-		let t = ``;
 		if (slave.health.illness > 0 || slave.health.tired > 60) {
-			t += ` ${He} performed worse this week due to<span class="red">`;
 			if (slave.health.illness === 1) {
-				t += ` feeling under the weather`;
+				health = `feeling under the weather`;
 			} else if (slave.health.illness === 2) {
-				t += ` a minor illness`;
+				health = `a minor illness`;
 			} else if (slave.health.illness === 3) {
-				t += ` being sick`;
+				health = `being sick`;
 			} else if (slave.health.illness === 4) {
-				t += ` being very sick`;
+				health = `being very sick`;
 			} else if (slave.health.illness === 5) {
-				t += ` a terrible illness`;
-			}
-			if (slave.health.illness > 0 && slave.health.tired > 60) {
-				t += ` and`;
-				foodHealthTired(slave);
+				health = `a terrible illness`;
 			}
 
-			t += `.</span> `;
-			t += foodTired(slave);
-		}
-		return t;
-	};
-
-	const foodHealthTired = slave => {
-		if (slave.health.tired > 90) {
-			return ` exhaustion`;
-		} else if (slave.health.tired > 60) {
-			return ` being tired`;
-		}
-		return ``;
-	};
-
-	const foodTired = slave => {
-		let t = ``;
-		if (!slave.fuckdoll) {
-			if (slaveResting(slave)) {
-				t = ` ${He} spends reduced hours working the soil in order to <span class="green">offset ${his} lack of rest.</span>`;
-			} else if (slave.health.tired + 20 >= 90 && !willWorkToDeath(slave)) {
-				t = ` ${He} attempts to refuse work due to ${his} exhaustion, but can do little to stop it or the resulting <span class="trust dec">severe punishment.</span> ${He} <span class="devotion dec">purposefully underperforms,</span> choosing ${his} overall well-being over the consequences, <span class="red">greatly reducing yields.</span>`;
-				slave.devotion -= 10;
-				slave.trust -= 5;
-			} else {
-				t = ` Hours of manual labor quickly add up, leaving ${him} <span class="red">physically drained</span> by the end of the day.`;
+			if (slave.health.tired > 90) {
+				exhaustion = `exhaustion`;
+			} else if (slave.health.tired > 60) {
+				exhaustion = `being tired`;
 			}
+
+			r.push(`${He} performed worse this week due to <span class="health dec">${health}${slave.health.illness > 0 && slave.health.tired > 60 ? ` and ` : ``}${exhaustion}.</span>`);
+
+			r.push(tired(slave));
 		}
-		tired(slave);
 
-		return t;
-	};
+		return r;
+	}
 
-	const foodMuscles = slave => {
+	function tired(slave) {
+		if (slaveResting(slave)) {
+			return `${He} spends reduced hours working the soil in order to <span class="health dec">offset ${his} lack of rest.</span>`;
+		} else if (slave.health.tired + 20 >= 90 && !willWorkToDeath(slave)) {
+			return `${He} attempts to refuse work due to ${his} exhaustion, but can do little to stop it or the resulting <span class="trust dec">severe punishment.</span> ${He} <span class="devotion dec">purposefully underperforms,</span> choosing ${his} overall well-being over the consequences, <span class="health dec">greatly reducing yields.</span>`;
+		} else {
+			return `Hours of manual labor quickly add up, leaving ${him} <span class="health dec">physically drained</span> by the end of the day.`;
+		}
+	}
+
+	function muscles(slave) {
 		if (slave.muscles > 50) {
-			return `${His} muscular form helps ${him} work better, increasing ${his} productivity. `;
+			return `${His} muscular form helps ${him} work better, increasing ${his} productivity.`;
 		} else if (slave.muscles < -50) {
-			return `${He} is so weak that ${he} is not able to work effectively. `;
-		} else {
-			return ``; // TODO: third case?
+			return `${He} is so weak that ${he} is not able to work effectively.`;
 		}
-	};
+	}
 
-	const foodWeight = slave => {
-		return slave.weight > 95 ? `${He} is so overweight that ${he} has to stop every few minutes to catch ${his} breath, and so ${his} productivity suffers. ` : ``;
-	};
+	function weight(slave) {
+		if (slave.weight > 95) {
+			return `${He} is so overweight that ${he} has to stop every few minutes to catch ${his} breath, and so ${his} productivity suffers. `;
+		}
+	}
 
-	const foodSight = slave => {
+	function sight(slave) {
 		if (!canSee(slave)) {
-			return `${His} blindness makes it extremely difficult for ${him} to work, severely limiting ${his} production. `;
+			return `${His} blindness makes it extremely difficult for ${him} to work, severely limiting ${his} production.`;
 		} else if (!canSeePerfectly(slave)) {
-			return `${His} nearsightedness makes it harder for ${him} to work as hard as ${he} otherwise would. `;
-		} else {
-			return ``; // TODO: third case?
+			return `${His} nearsightedness makes it harder for ${him} to work as hard as ${he} otherwise would.`;
 		}
-	};
+	}
 
-	const foodHearing = slave => {
+	function hearing(slave) {
 		if (slave.hears === -1) {
-			return `${He} is hard-of-hearing, which gets in the way of ${his} work whenever ${he} misses directions${V.Farmer ? ` from ${V.Farmer.slaveName}` : ``}. `;
+			return `${He} is hard-of-hearing, which gets in the way of ${his} work whenever ${he} misses directions${S.Farmer ? ` from ${S.Farmer.slaveName}` : ``}.`;
 		} else if (slave.hears < -1) {
-			return `${He} is deaf, which gets in the way of ${his} work whenever ${he} misses directions${V.Farmer ? ` from ${V.Farmer.slaveName}` : ``}. `;
-		} else {
-			return ``; // TODO: third case?
+			return `${He} is deaf, which gets in the way of ${his} work whenever ${he} misses directions${S.Farmer ? ` from ${S.Farmer.slaveName}` : ``}.`;
 		}
-	};
+	}
 
+	function food() {
+		const fsGain = 0.0001 * foodAmount;
 
-	if (V.Farmer) {
-		// TODO: keep oral check? replace with something else?
-		t += `While there, ${he} benefits from ${V.Farmer.slaveName}'s ${V.Farmer.physicalAge < 21 ? `youthful energy` : `care`} ${V.Farmer.skill.oral ? ` and talented tongue` : ``}.`;
-		if (slave.devotion < V.FarmerDevotionThreshold) {
-			slave.devotion += V.FarmerDevotionBonus;
-		}
-		if (slave.devotion < V.FarmerTrustThreshold) {
-			slave.trust += V.FarmerTrustBonus;
-		}
-		if (slave.health.condition < 100) {
-			improveCondition(slave, V.FarmerHealthBonus);
+		FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain);
+
+		if (V.foodMarket) {
+			return `As a result, ${he} produces <span class="chocolate">${massFormat(foodAmount)}</span> of food over the week.`;
 		}
 	}
 
 	// Open Food Production
 
 	if (V.foodMarket) {
-		if (food < 1) {
-			food = 1;
-		}
-		V.food += food;
-		V.foodTotal += food;
-		incomeStats.food += food;
-
-		foodTotal(slave, food);
+		V.food += foodAmount;
+		V.foodTotal += foodAmount;
+		incomeStats.food += foodAmount;
 	}
 
 	// Close Food Production
 
 	// Open Shows
 
-	incomeStats.income += App.Facilities.Farmyard.farmShowsIncome(slave);
+	function slaveShows(slave) {
+		if (V.farmyardShows) {
+			return App.Facilities.Farmyard.putOnShows(slave);
+		}
+	}
 
-	if (V.farmyardShows) {
-		t += `${He} also puts on shows with animals this week. `;
+	// Close Shows
 
-		// Open FS Subsection
+	// Open Long-Term Effects
 
-		if (arcology.FSSupremacist !== "unset") {
-			if (slave.race === arcology.FSSupremacistRace) {
-				t += `Society <span class="red">disapproves</span> of your allowing a member of the elite race to be degraded in such a fashion, and thus ${he} didn't earn as much. `;
-			}
-		}
-		if (arcology.FSSubjugationist !== "unset") {
-			if (slave.race === arcology.FSSubjugationistRace) {
-				t += `Society <span class="green">approves</span> of the degradation you submit your ${arcology.FSSubjugationistRace} slaves to, and so ${he} earns you a bit more. `;
-			} else {
-				t += `Society doesn't disapprove of ${him} not being ${arcology.FSSubjugationistRace}, but ${he} doesn't earn as much as ${he} would if ${he} was. `;
-			}
-		}
-		if (arcology.FSRepopulationFocus !== "unset") {
-			if (slave.pregWeek > 16) {
-				if (slave.eggType !== "human") {
-					t += `Society is <span class="red">disgusted</span> by ${his} pregnancy when they realize that what it is in ${his} womb is not human. `;
-				} else {
-					t += `Society <span class="green">greatly approves</span> of your having pregnant slaves ${V.seeBestiality ? `have sex` : `put on shows`} with animals. `;
-				}
-			}
-		}
-		if (arcology.FSRestart !== "unset") {
-			if (slave.pregWeek > 16) {
-				if (slave.eggType !== "human") {
-					t += `Society is disgusted by ${his} pregnancy until they learn that what is in ${his} womb is not human. `;
+	function longTermEffects(slave) {
+		let r = [];
+
+		if (slave.fetishKnown && slaveApproves || slave.energy > 95) {
+			if (V.farmyardShows) {
+				if (V.seeBestiality) {
+					r.push(`Getting fucked by animals is the perfect job for ${him}, as far as ${he} can tell. <span class="devotion inc">${He} is happy</span> to spend ${his} days being utterly degraded.`);
+					slave.devotion += 1;
 				} else {
-					t += `Society is <span class="red">extremely disgusted</span> by ${his} pregnancy and the fact that you would have ${him} ${V.seeBestiality ? `have sex` : `put on shows`} with animals while sporting a baby bump. `;
+					r.push(`${He} loves putting on shows with animals, and as far as ${he} can tell, it's the perfect job for ${him}. It isn't as degrading as ${he} would like, but <span class="devotion inc">${he} is happy nonetheless.</span>`);
+					slave.devotion += 2;
 				}
 			}
+
+			slave.need = 0;
 		}
-		if (arcology.FSGenderRadicalist !== "unset") {
-			if (slave.dick > 0) {
-				t += `${His} patrons <span class="green">approve</span> of the fact that ${he} has a dick. `;
-			} else {
-				t += `${His} patrons <span class="red">are disappointed</span> that ${he} doesn't have a dick. `;
-			}
-		}
-		if (arcology.FSGenderFundamentalist !== "unset") {
-			if (slave.pregWeek > 16) {
-				t += `${His} viewers <span class="green">approve</span> of the fact that ${he} is sporting a baby bump. `;
-			} else {
-				t += `${His} viewers <span class="red">are disappointed</span> that ${he} isn't pregnant. `;
-			}
-			if (slave.dick > 0) {
-				// TODO: something here?
-			}
-		}
-		if (arcology.FSPaternalist !== "unset") {
-			if (V.seeBestiality && V.farmyardBreeding) {
-				t += `Your citizens are <span class="red">very disapproving</span> of the fact that you would allow something as degrading as having your slaves be knocked up by filthy beasts. `;
-			} else {
-				t += `Your citizens <span class="red">disapprove</span> of the fact that you would allow your slaves to be degraded in such a manner. `;
-			}
-		}
-		if (arcology.FSDegradationist !== "unset") {
-			if (V.seeBestiality && V.farmyardBreeding) {
-				t += `Your citizens are <span class="green">very approving</span> of the fact that you would allow something as degrading as having your slaves be knocked up by filthy beasts. `;
-			} else {
-				t += `Your citizens <span class="green">approve</span> of the fact that you would allow your slaves to be degraded in such a manner. `;
-			}
-		}
-		if (arcology.FSBodyPurist !== "unset") {
-			/* TODO: requirements for these might change */
-			if (slave.boobsImplant > 0) {
-				// TODO: add stuff here
-			}
-			if (slave.buttImplant > 0) {
-				// TODO: add stuff here
-			}
-			if (slave.faceImplant > 0) {
-				// TODO: add stuff here
-			}
-			if (slave.lipsImplant > 0) {
-				// TODO: add stuff here
+
+		return r;
+	}
+
+	// Close Long-Term Effects
+
+	// Open Vignettes
+
+	function slaveVignettes() {
+		if (V.showVignettes) {
+			const
+				vignette = GetVignette(slave);
+
+			let r = [];
+
+			r.push(`<span class="story-label">This week</span> ${vignette.text}`);
+
+			if (vignette.type === "cash") {
+				r.push(vignetteCash(vignette));
 			}
-		}
-		if (arcology.FSTransformationFetishist !== "unset") {
-			/* TODO: requirements for these might change */
-			if (slave.boobsImplant > 0) {
-				// TODO: add stuff here
+
+			if (vignette.type === "devotion") {
+				r.push(vignetteDevotion(vignette));
 			}
-			if (slave.buttImplant > 0) {
-				// TODO: add stuff here
+
+			if (vignette.type === "trust") {
+				r.push(vignetteTrust(vignette));
 			}
-			if (slave.faceImplant > 0) {
-				// TODO: add stuff here
+
+			if (vignette.type === "health") {
+				r.push(vignetteHealth(vignette));
 			}
-			if (slave.lipsImplant > 0) {
-				// TODO: add stuff here
+
+			if (vignette.type === "rep") {
+				r.push(vignetteReputation(vignette));
 			}
+
+			return r.join(' ');
 		}
-		if (arcology.FSYouthPreferentialist !== "unset") {
-			if (slave.visualAge > 25) { // TODO: not sure about this age
-				t += `${arcology.name}'s citizens <span class="red">disapprove</span> of your using such old slaves to put on shows. `;
-			} else {
-				t += `${arcology.name}'s citizens <span class="green">approve</span> of your using young slaves to put on shows. `;
-			}
+	}
+
+	function vignetteCash(vignette) {
+		const
+			FResultNumber = FResult(slave),
+			cash = Math.trunc(FResultNumber * vignette.effect);
+
+		incomeStats.income += cash;
+
+		if (vignette.effect > 0) {
+			cashX(cash, "slaveAssignmentFarmyardVign", slave);
+
+			return `<span class="yellowgreen">making you an extra ${cashFormat(cash)}.</span>`;
+		} else if (vignette.effect < 0) {
+			cashX(forceNeg(cash), "slaveAssignmentFarmyardVign", slave);
+
+			return `<span class="reputation dec">losing you ${cashFormat(Math.abs(cash))}.</span>`;
+		} else {
+			return `an incident without lasting effect.`;
 		}
-		if (arcology.FSMaturityPreferentialist !== "unset") {
-			if (slave.visualAge > 25) { // TODO: not sure about this age
-				t += `${arcology.name}'s citizens <span class="green">approve</span> of your using mature slaves to put on shows. `;
+	}
+
+	function vignetteDevotion(vignette) {
+		slave.devotion += 1 * vignette.effect;
+
+		if (vignette.effect > 0) {
+			if (slave.devotion > 50) {
+				return `<span class="devotion inc">increasing ${his} devotion to you.</span>`;
+			} else if (slave.devotion >= 20) {
+				return `<span class="devotion inc">increasing ${his} acceptance of you.</span>`;
+			} else if (slave.devotion >= -20) {
+				return `<span class="devotion inc">reducing ${his} dislike of you.</span>`;
 			} else {
-				t += `${arcology.name}'s citizens <span class="red">disapprove</span> of your using such young slaves to put on shows. `;
-			}
-		}
-		if (arcology.FSSlimnessEnthusiast !== "unset") {
-			if (slave.weight > 10) {
-				t += `Society finds your using a slave with such a flabby body <span class="red">absolutely disgusting.</span> `;
-			}
-			if (slave.boobs > 799) {
-				t += `Your citizens ${slave.weight > 10 ? `also ` : ``} don't approve of you using a slave with such large tits as a showgirl. `;
-			}
-			if (slave.butt > 3) {
-				// TODO: write this
-			}
-		}
-		if (arcology.FSAssetExpansionist !== "unset") {
-			if (slave.weight > 10) {
-				// TODO: should weight be in here?
-			}
-			if (slave.boobs > 799) {
-				// TODO: write this
-			}
-			if (slave.butt > 3) {
-				// TODO: write this
-			}
-		}
-		if (arcology.FSPastoralist !== "unset") {
-			if (slave.boobs > 799) {
-				// TODO: does this make sense?
-			}
-			if (slave.lactation > 0) {
-				// TODO: write this
-			}
-		}
-		if (arcology.FSPhysicalIdealist !== "unset") {
-			if (slave.height > 169) {
-				// TODO: write this
+				return `<span class="devotion inc">reducing ${his} hatred of you.</span>`;
+			}
+		} else if (vignette.effect < 0) {
+			if (slave.devotion > 50) {
+				return `<span class="devotion dec">reducing ${his} devotion to you.</span>`;
+			} else if (slave.devotion >= 20) {
+				return `<span class="devotion dec">reducing ${his} acceptance of you.</span>`;
+			} else if (slave.devotion >= -20) {
+				return `<span class="devotion dec">increasing ${his} dislike of you.</span>`;
 			} else {
-				// TODO: write this
+				return `<span class="devotion dec">increasing ${his} hatred of you.</span>`;
 			}
+		} else {
+			return `an incident without lasting effect.`;
 		}
-		if (arcology.FSHedonisticDecadence !== "unset") {
-			if (slave.weight > 10) {
-				// TODO: write this
+	}
+
+	function vignetteTrust(vignette) {
+		slave.trust += 1 * vignette.effect;
+
+		if (vignette.effect > 0) {
+			if (slave.trust > 20) {
+				return `<span class="trust inc">increasing ${his} trust in you.</span>`;
+			} else if (slave.trust >= -20) {
+				return `<span class="trust inc">reducing ${his} fear of you.</span>`;
 			} else {
-				// TODO: write this
+				return `<span class="trust inc">reducing ${his} terror of you.</span>`;
 			}
-		}
-		if (arcology.FSChattelReligionist !== "unset") {
-			if (slave.devotion <= 20) {
-				// TODO: write this
+		} else if (vignette.effect < 0) {
+			if (slave.trust > 20) {
+				return `<span class="trust dec">reducing ${his} trust in you.</span>`;
+			} else if (slave.trust >= -20) {
+				return `<span class="trust dec">increasing ${his} fear of you.</span>`;
 			} else {
-				// TODO: write this
+				return `<span class="trust dec">increasing ${his} terror of you.</span>`;
 			}
-		}
-
-		// Close FS Subsection
-
-		if (setup.entertainmentCareers.includes(slave.career)) {
-			t += ` ${He} has experience with putting on shows from ${his} life before ${he} was a slave, making ${him} more effective at putting on shows. `;
-		}
-		if (setup.farmerCareers.includes(slave.career)) { // TODO: does this even make sense to include?
-			// TODO: write this
-		}
-		if (slave.prestige === 1) {
-			t += `Because some of your citizens already know of ${him}, ${he} earns more. `;
-		} else if (slave.prestige === 2) {
-			t += `Because a lot of your citizens already know of ${him}, ${he} earns quite a bit more. `;
-		} else if (slave.prestige === 3) {
-			t += `Because ${he} is so famous, ${he} earns a lot more then ${he} would otherwise. `;
-		}
-		if (slave.porn.prestige === 1) { // TODO: are prestige and pornPrestige mutually exclusive?
-			t += `${He} earns a bit more because some of your citizens already know ${him} from porn. `;
-		} else if (slave.porn.prestige === 2) {
-			t += `${He} earns quite a bit more because a lot of your citizens already know ${him} from porn. `;
-		} else if (slave.porn.prestige === 3) {
-			t += `${He} earns a lot more because ${he} is so famous from porn. `;
-		}
-		if (slave.health.condition > 20) {
-			t += `${He} is in such excellent health that ${he} is able to put on longer and more energetic shows, earning you more. `;
-		} else if (slave.health.condition < -20) {
-			t += `${His} poor health negatively affects ${his} ability to put on good shows, cutting into your profits. `;
-		}
-		if (slave.face > 40) {
-			t += `${He} is so ${slave.genes === "XY" ? `handsome` : `beautiful`} that ${his} audience is willing to pay more to watch ${him} put on shows. `;
-		} else if (slave.face > 10) {
-			t += `${He} is so ${slave.genes === "XY" ? `good-looking` : `pretty`} that ${his} audience is willing to pay more to watch ${him} put on shows. `;
-		} else if (slave.face < -10) {
-			t += `${His} audience isn't willing to pay as much because of how unattractive ${his} face is. `;
-		} else if (slave.face < -40) {
-			t += `${His} audience isn't willing to pay as much because of how hard ${his} face is to look at. `;
-		}
-		// TODO: write this block with different combinations of trust / devotion
-		if (slave.devotion > 50) {
-			// TODO: write this
-		} else if (slave.devotion < -50) {
-			// TODO: write this
-		}
-		if (slave.trust > 50) {
-			// TODO: write this
-		} else if (slave.trust < -50) {
-			// TODO: write this
-		}
-		if (slave.weight > 30 && arcology.FSHedonisticDecadence === "unset") {
-			t += `Your citizens are not willing to pay as much to see such a fat slave put on shows, so ${he} loses some income. `;
-		} else if (slave.weight < -30) {
-			t += `Your citizens don't like watching such a sickly-looking slaves put on shows, so ${he} loses some income. `;
-		}
-		if (slave.muscles > 30) {
-			// TODO: write this - do we want something for muscles?
-		} else if (slave.muscles < -30) {
-			// TODO: write this - maybe something about the slave's ability to handle the animal?
-		}
-		if (!canSeePerfectly(slave)) {
-			t += `${His} ${!canSee(slave) ? `blindness makes it impossible` : `nearsightedness makes it harder`}} for ${him} to see what ${he}'s doing, affecting ${his} ability to put on a good show. `;
-		}
-		if (slave.hears < 0) {
-			t += `${His} ${slave.hears < -1 ? `lack of` : `poor`} hearing makes it difficult for ${him} to do a good job of putting on a show. `;
-		}
-		if (slave.boobs > 800) {
-			// TODO: write this
-		}
-		if (slave.butt > 4) {
-			// TODO: write this
-		}
-		if (slave.preg > 10) {
-			// TODO: write this
-		}
-		if (slave.health.tired > 60) {
-			t += `${He} is so tired that the energy in ${his} shows is basically nonexistent, affecting ${his} profits. `;
-		}
-		if (slave.chem > 10) {
-			// TODO: write this - would this make sense to include?
-		}
-		if (slave.intelligence > 50) {
-			// TODO: write this - include something about .intelligenceImplant?
-		} else if (slave.intelligence < -50) {
-			// TODO: write this
-		}
-		if (slave.energy <= 20) {
-			// TODO: write this
-		} else if (slave.energy <= 40) {
-			// TODO: write this
-		} else if (slave.energy <= 60) {
-			// TODO: write this
-		} else if (slave.energy <= 80) {
-			// TODO: write this
-		} else if (slave.energy <= 95) {
-			// TODO: write this
 		} else {
-			// TODO: write this
+			return `an incident without lasting effect.`;
 		}
-		if (slave.fetish === "submissive") {
-			// TODO: write this
-		} else if (slave.fetish === "humiliation") {
-			// TODO: write this
-		} else if (slave.fetish === "masochist") {
-			// TODO: write this
-		} // TODO: incorporate quirks
 	}
 
-	// Close Shows
+	function vignetteHealth(vignette) {
+		if (vignette.effect > 0) {
+			improveCondition(slave, 2 * vignette.effect);
 
-	// Open Long-Term Effects
+			return `<span class="reputation inc">improving ${his} health.</span>`;
+		} else if (vignette.effect < 0) {
+			healthDamage(slave, 2 * vignette.effect);
 
-	if (slave.fetishKnown && (slave.fetish === "submissive" || slave.fetish === "humiliation" || slave.fetish === "masochist") || slave.energy > 95) {
-		if (V.farmyardShows) {
-			if (V.seeBestiality) {
-				t += `Getting fucked by animals is the perfect job for ${him}, as far as ${he} can tell. <span class="devotion inc">${He} is happy</span> to spend ${his} days being utterly degraded. `;
-			} else {
-				t += `${He} loves putting on shows with animals, and as far as ${he} can tell, it's the perfect job for ${him}. <span class="devotion inc">${He} is happy</span> to spend ${his} days doing something so degrading. `; // TODO: not sure how degrading putting on shows is
-			}
-		}
-		slave.devotion += 1;
-		if (slave.need) {
-			slave.need = 0;
+			return `<span class="reputation dec">affecting ${his} health.</span>`;
+		} else {
+			return `an incident without lasting effect.`;
 		}
 	}
-	if (slave.behavioralQuirk === "fitness") {
-		t += `${slave.slaveName} <span class="devotion inc">privately enjoys</span> the exercise ${he} receives while working in ${V.farmyardName}. `;
-		slave.devotion += 1;
-	}
 
-	// Close Long-Term Effects
+	function vignetteReputation(vignette) {
+		const FResultNumber = FResult(slave);
 
-	// Open Vignettes
+		repX(Math.trunc(FResultNumber * vignette.effect * 0.1), "vignette", slave);
+		incomeStats.rep += Math.trunc(FResultNumber * vignette.effect * 0.1);
 
-	if (V.showVignettes) {
-		const vignette = GetVignette(slave);
-		t += `<span class="story-label">This week</span> ${vignette.text}`;
-		if (vignette.type === "cash") {
-			let FResultNumber = FResult(slave);
-			const cashVign = Math.trunc(FResultNumber * vignette.effect);
-			if (vignette.effect > 0) {
-				t += ` <span class="yellowgreen">making you an extra ${cashFormat(cashVign)}.</span> `;
-				cashX(cashVign, "slaveAssignmentFarmyardVign", slave);
-			} else if (vignette.effect < 0) {
-				t += ` <span class="red">losing you ${cashFormat(Math.abs(cashVign))}.</span> `;
-				cashX(forceNeg(cashVign), "slaveAssignmentFarmyardVign", slave);
-			} else {
-				t += ` an incident without lasting effect. `;
-			}
-			incomeStats.income += cashVign;
-		} else if (vignette.type === "devotion") {
-			if (vignette.effect > 0) {
-				if (slave.devotion > 50) {
-					t += ` <span class="devotion inc">increasing ${his} devotion to you.</span> `;
-				} else if (slave.devotion >= 20) {
-					t += ` <span class="devotion inc">increasing ${his} acceptance of you.</span> `;
-				} else if (slave.devotion >= -20) {
-					t += ` <span class="devotion inc">reducing ${his} dislike of you.</span> `;
-				} else {
-					t += ` <span class="devotion inc">reducing ${his} hatred of you.</span> `;
-				}
-			} else if (vignette.effect < 0) {
-				if (slave.devotion > 50) {
-					t += ` <span class="devotion dec">reducing ${his} devotion to you.</span> `;
-				} else if (slave.devotion >= 20) {
-					t += ` <span class="devotion dec">reducing ${his} acceptance of you.</span> `;
-				} else if (slave.devotion >= -20) {
-					t += ` <span class="devotion dec">increasing ${his} dislike of you.</span> `;
-				} else {
-					t += ` <span class="devotion dec">increasing ${his} hatred of you.</span> `;
-				}
-			} else {
-				t += ` an incident without lasting effect. `;
-			}
-			slave.devotion += 1 * vignette.effect;
-		} else if (vignette.type === "trust") {
-			if (vignette.effect > 0) {
-				if (slave.trust > 20) {
-					t += ` <span class="trust inc">increasing ${his} trust in you.</span> `;
-				} else if (slave.trust >= -20) {
-					t += ` <span class="trust inc">reducing ${his} fear of you.</span> `;
-				} else {
-					t += ` <span class="trust inc">reducing ${his} terror of you.</span> `;
-				}
-			} else if (vignette.effect < 0) {
-				if (slave.trust > 20) {
-					t += ` <span class="trust dec">reducing ${his} trust in you.</span> `;
-				} else if (slave.trust >= -20) {
-					t += ` <span class="trust dec">increasing ${his} fear of you.</span> `;
-				} else {
-					t += ` <span class="trust dec">increasing ${his} terror of you.</span> `;
-				}
-			} else {
-				t += ` an incident without lasting effect. `;
-			}
-			slave.trust += 1 * vignette.effect;
-		} else if (vignette.type === "health") {
-			if (vignette.effect > 0) {
-				t += ` <span class="green">improving ${his} health.</span> `;
-				improveCondition(slave, 2 * vignette.effect);
-			} else if (vignette.effect < 0) {
-				t += ` <span class="red">affecting ${his} health.</span> `;
-				healthDamage(slave, 2 * vignette.effect);
-			} else {
-				t += ` an incident without lasting effect. `;
-			}
+		if (vignette.effect > 0) {
+			return `<span class="reputation inc">gaining you a bit of reputation.</span>`;
+		} else if (vignette.effect < 0) {
+			return `<span class="reputation dec">losing you a bit of reputation.</span>`;
 		} else {
-			let FResultNumber = FResult(slave);
-			if (vignette.effect > 0) {
-				t += ` <span class="green">gaining you a bit of reputation.</span> `;
-			} else if (vignette.effect < 0) {
-				t += ` <span class="red">losing you a bit of reputation.</span> `;
-			} else {
-				t += ` an incident without lasting effect. `;
-			}
-			repX(Math.trunc(FResultNumber * vignette.effect * 0.1), "vignette", slave);
-			incomeStats.rep += Math.trunc(FResultNumber * vignette.effect * 0.1);
+			return `an incident without lasting effect.`;
 		}
 	}
 
 	// Close Vignettes
 
-	// Facility Decorations
-	const fsGain = 0.0001 * food;
-	FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain);
+	fullReport(slave);
 
-	return t;
+	return frag;
 };
diff --git a/src/events/RESS/comfortableSeat.js b/src/events/RESS/comfortableSeat.js
index 628ecfe0cb5ecaecc37f9500385d31bad3319cb7..30b7b5be276103467e6d24287187dcd2e8e2626e 100644
--- a/src/events/RESS/comfortableSeat.js
+++ b/src/events/RESS/comfortableSeat.js
@@ -30,7 +30,7 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 		const {s, say, title: Master} = getEnunciation(eventSlave);
 		const desc = SlaveTitle(eventSlave);
 		const belly = bellyAdjective(eventSlave);
-		const dickSize = ["tiny", "", "big"][Math.ceil(Math.clamp(eventSlave.dick, 1, 5) / 2) - 1]; // ranges are "tiny" <= 2 < "" <= 4 < "big"
+		const dickSize = eventSlave.dick > 4 ? "big" : (eventSlave.dick > 2 ? "" : "tiny");
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -151,10 +151,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
 						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 							t.push(`letting ${his} weight slide it inside ${his} wet pussy.`);
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`letting ${his} weight push it up ${his} asshole.`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`putting it between ${his} thighs.`);
 						}
@@ -168,10 +168,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, leaning back against you and making sure all the other slaves who pass by can see`);
 						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 							t.push(`where it penetrates ${his} cunt.`);
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`where it's lodged up ${his} butt.`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`where it's rubbing ${him} intimately between ${his} thighs.`);
 						}
@@ -180,7 +180,7 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 					case "buttslut":
 						if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`turns around and shivers with pleasure as ${he} hilts ${his} anal sphincter around the base of ${PC.dick !== 0 ? "your cock" : "the phallus"}. ${He} bounces on it happily, reaming ${his} own ass,`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`turns around and shivers with pleasure as ${he} feels ${PC.dick !== 0 ? "your cock" : "the phallus"} slip between ${his} buttcheeks. ${He} rubs against it, happy to share ${his} butt with you,`);
 						}
@@ -216,7 +216,7 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 							}
 							t.push(`${He} rides you hungrily,`);
 
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 							if (canImpreg(eventSlave, PC)) {
 								knockMeUp(eventSlave, 40, 0, -1);
 							}
@@ -228,10 +228,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`turns around and sits right down on ${PC.dick !== 0 ? "your cock" : "the phallus"}, eagerly`);
 						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 							t.push(`taking it into ${his} cunt.`);
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`getting it shoved up ${his} butt.`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`squeezing it between ${his} thighs.`);
 						}
@@ -241,10 +241,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`turns around and hesitantly sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, letting`);
 						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 							t.push(`it slide into ${his} cunt.`);
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`it slide up ${his} butt.`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`it slide between ${his} thighs.`);
 						}
@@ -254,10 +254,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
 						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 							t.push(`letting ${his} weight slide it inside ${his} wet pussy at an uncomfortable angle.`);
-							VCheck.Vaginal(1, eventSlave);
+							t.push(VCheck.Vaginal(1, eventSlave));
 						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 							t.push(`letting ${his} weight push it up ${his} asshole at an uncomfortable angle.`);
-							VCheck.Anal(1, eventSlave);
+							t.push(VCheck.Anal(1, eventSlave));
 						} else {
 							t.push(`putting it between ${his} thighs at an uncomfortable angle.`);
 						}
@@ -269,10 +269,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 				t.push(`${eventSlave.fetishKnown === 1 ? `${He} can't really think of how to accommodate the situation to ${his} own preferred approach to sex` : `${He} isn't well versed in how ${his} own sexual needs might fit into the situation`}, so ${he} just services you like a good ${girl}. ${He} turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
 				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 					t.push(`squatting to bounce ${his} cunt up and down on it.`);
-					VCheck.Vaginal(1, eventSlave);
+					t.push(VCheck.Vaginal(1, eventSlave));
 				} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 					t.push(`squatting to bounce ${his} butthole up and down on it.`);
-					VCheck.Anal(1, eventSlave);
+					t.push(VCheck.Anal(1, eventSlave));
 				} else {
 					t.push(`putting it between ${his} thighs for some intercrural sex, since ${his} ${eventSlave.vagina > -1 ? "holes aren't" : "hole isn't"} appropriate.`);
 				}
@@ -304,10 +304,10 @@ App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.Ba
 			t.push(`Deciding that ${he} shouldn't use ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} to guide it, ${he} lowers ${himself} slowly,`);
 			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
 				t.push(`breathing a little harder as ${he} feels its head spread ${his} pussylips and then slide inside ${him}.`);
-				VCheck.Vaginal(1, eventSlave);
+				t.push(VCheck.Vaginal(1, eventSlave));
 			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
 				t.push(`letting out a breath and relaxing as ${he} feels its head press past ${his} sphincter and then all the way up ${his} butt.`);
-				VCheck.Anal(1, eventSlave);
+				t.push(VCheck.Anal(1, eventSlave));
 			} else {
 				t.push(`getting it situated between ${his} thighs, since that's the best option ${he} has available.`);
 			}
diff --git a/src/events/RESS/devotedAnalVirgin.js b/src/events/RESS/devotedAnalVirgin.js
index a710cd1c96dcc41af2c5ec7fa54c92b54c4e464c..f9a354087fef606b341f9244bd503d7271601a28 100644
--- a/src/events/RESS/devotedAnalVirgin.js
+++ b/src/events/RESS/devotedAnalVirgin.js
@@ -92,12 +92,12 @@ App.Events.RESSDevotedAnalVirgin = class RESSDevotedAnalVirgin extends App.Event
 				}
 				t.push(`lavishing attention on ${his} nipples to ensure that ${he} has fun, too.`);
 			}
-			t.push(`${He} leaves your office feeling <span class="hotpink">very close to ${his} ${WrittenMaster()} indeed,</span> and seems to have forgotten ${his} unfucked butthole, for now.`);
-
-			eventSlave.devotion += 4;
+			t.push(`${He} leaves your office feeling <span class="hotpink">very close to ${his} ${WrittenMaster(eventSlave)} indeed,</span> and seems to have forgotten ${his} unfucked butthole, for now.`);
 			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
-				VCheck.Vaginal(1, eventSlave);
+				t.push(VCheck.Vaginal(1, eventSlave));
 			}
+
+			eventSlave.devotion += 4;
 			return t;
 		}
 
diff --git a/src/events/RESS/devotedVirgin.js b/src/events/RESS/devotedVirgin.js
index dd9089ef9c5523106b44669b65fdaa8afc95122f..5a9b3cd19076eff58f32c2f0cf91c82e1d33fb6e 100644
--- a/src/events/RESS/devotedVirgin.js
+++ b/src/events/RESS/devotedVirgin.js
@@ -74,7 +74,7 @@ App.Events.RESSDevotedVirgin = class RESSDevotedVirgin extends App.Events.BaseEv
 			if (eventSlave.belly >= 5000) {
 				t.push(`${eventSlave.bellyPreg >= 3000 ? "gravid" : "rounded"}`);
 			}
-			t.push(`body against you and shivering with delight. ${He} shudders, almost uncontrollably, when you grind your ${PC.dick === 0 ? "clitoris" : "dick"} against ${his} moistened, wet pussy between ${his} thighs, taking extra care not to penetrate the willing slave. ${He} leaves your office feeling <span class="hotpink">very close to ${his} ${WrittenMaster()} indeed,</span> and seems to have forgotten ${his} unfucked vagina, for now.`);
+			t.push(`body against you and shivering with delight. ${He} shudders, almost uncontrollably, when you grind your ${PC.dick === 0 ? "clitoris" : "dick"} against ${his} moistened, wet pussy between ${his} thighs, taking extra care not to penetrate the willing slave. ${He} leaves your office feeling <span class="hotpink">very close to ${his} ${WrittenMaster(eventSlave)} indeed,</span> and seems to have forgotten ${his} unfucked vagina, for now.`);
 
 			eventSlave.devotion += 4;
 			return t;
diff --git a/src/events/RESS/devotedWaist.js b/src/events/RESS/devotedWaist.js
index 442acee4c650e32687de8544f7a900bd32c30cdb..0665172859d59da1ec849d8b4e943120e941d48c 100644
--- a/src/events/RESS/devotedWaist.js
+++ b/src/events/RESS/devotedWaist.js
@@ -102,18 +102,18 @@ App.Events.RESSDevotedWaist = class RESSDevotedWaist extends App.Events.BaseEven
 				t.push(`This can be applied during sex many ways. First, ${he} sits on the bathroom counter and bends ${himself} almost double for`);
 				if (canDoAnal(eventSlave)) {
 					t.push(`anal. Your control over the pace is perfected by your grip around ${his} tiny middle.`);
-					VCheck.Anal(1, eventSlave);
+					t.push(VCheck.Anal(1, eventSlave));
 				} else {
 					t.push(`vaginal. Your control over the pace is perfected by your grip around ${his} tiny middle.`);
-					VCheck.Vaginal(1, eventSlave);
+					t.push(VCheck.Vaginal(1, eventSlave));
 				}
 				t.push(`Finally, ${he} goes down on ${hasAllLimbs(eventSlave) ? "all fours" : "the floor"} for a hard`);
 				if (canDoVaginal(eventSlave)) {
 					t.push(`pounding, doggy style, losing ${himself} in the intense penetration as you use your hold around ${him} to give it to ${him} even harder.`);
-					VCheck.Vaginal(1, eventSlave);
+					t.push(VCheck.Vaginal(1, eventSlave));
 				} else {
 					t.push(`buttfuck, doggy style, losing ${himself} in the intense anal as you use your hold around ${him} to give it to ${him} even harder.`);
-					VCheck.Anal(1, eventSlave);
+					t.push(VCheck.Anal(1, eventSlave));
 				}
 				t.push(`By the end ${he}'s tired but <span class="mediumaquamarine">confident in ${his} sexual uniqueness.</span>`);
 			}
@@ -145,9 +145,9 @@ App.Events.RESSDevotedWaist = class RESSDevotedWaist extends App.Events.BaseEven
 			if (canDoAnal(eventSlave) || canDoVaginal(eventSlave)) {
 				t.push(`${eventSlave.slaveName}'s gown allows you to take ${him} in a ${eventSlave.belly >= 5000 ? "tight" : "close"} lotus position on the cleared table, face to face.`);
 				if (canDoVaginal(eventSlave)) {
-					VCheck.Vaginal(1, eventSlave);
+					t.push(VCheck.Vaginal(1, eventSlave));
 				} else {
-					VCheck.Anal(1, eventSlave);
+					t.push(VCheck.Anal(1, eventSlave));
 				}
 			} else {
 				t.push(`you and ${eventSlave.slaveName} enjoy the ${canSee(eventSlave) ? "sights" : "atmosphere"} while fooling around. While you'd love to use ${him}, ${his} chastity keeps you at bay.`);
diff --git a/src/events/RESS/frighteningDick.js b/src/events/RESS/frighteningDick.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8e44b8aa08da94bae98d58900ddb6937e503aa7
--- /dev/null
+++ b/src/events/RESS/frighteningDick.js
@@ -0,0 +1,149 @@
+App.Events.RESSFrighteningDick = class RESSFrighteningDick extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.PC.dick > 0,
+			() => V.PC.belly < 5000
+		];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				canMove,
+				canTalk,
+				s => s.assignment === Job.HOUSE,
+				s => s.attrXY <= 35 || s.behavioralFlaw === "hates men" || s.sexualFlaw === "repressed",
+				s => s.trust > 20,
+				s => s.devotion >= -20,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, His, his, him, himself
+		} = getPronouns(eventSlave);
+		const {s, say, title: Master} = getEnunciation(eventSlave);
+		const desc = SlaveTitle(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		/** @type {App.Entity.PlayerState} */
+		let PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let t = [];
+
+		t.push("In a fortuitous confluence of circumstances,");
+		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(`happens to be polishing your office one evening. Keeping every surface in the penthouse at a state of perfect shine is one of your servants' endless tasks, and your office is ${his} area of responsibility today. At the key moment, ${he}'s working on an area at waist height, directly next to the door that leads to your suite; and ${he}'s crouching to polish this area most comfortably. ${He} is working diligently, and is paying close attention to what ${he}'s doing. Meanwhile, and for completely unrelated reasons, you have just finished having fun inside said suite. You are naked, and your penis remains fully erect despite your having climaxed only moments before; you are in excellent physical and sexual condition and this happens frequently. You have decided to address a likewise unrelated matter in your office, and walk into it from your suite, naked and erect.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		t.push(`This is how ${eventSlave.slaveName} comes face to face with your cock, unexpectedly, at a distance of only a few ${V.showInches === 2 ? "inches" : "centimeters"}.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		t.push(`${He} shrieks, backpedaling, and then falls backward, ${his}`);
+		if (eventSlave.butt > 6) {
+			t.push("monstrous bottom");
+		} else if (eventSlave.butt > 3) {
+			t.push("healthy rear end");
+		} else {
+			t.push("cute butt");
+		}
+		t.push(`hitting the floor with an audible whack. The light cloth ${he} was using to polish with went flying, and flutters to the ground accusingly. After scrabbling back a short distance, looking up at you hesitantly, and visibly recollecting ${himself}, ${he} swallows twice and then says, "I'm ${s}orry, ${Master}," in a tone of voice with a great deal of effort applied to keep it even. A frantic, embarrassed search for ${his} cloth ensues. Finding it at last, ${he} returns to ${his} original, low position, and crouch-walks back to the place ${he} was polishing, doing ${his} absolute best to look diligent and industrious and not at all aware that your cock is pointing at ${him} like a gun barrel.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		App.Events.addResponses(node, [
+			new App.Events.Result("Polish this", polish),
+			new App.Events.Result(`Talk to ${him} about ${his} issues with dick`, coach),
+			canDoAnal(eventSlave) || canDoVaginal(eventSlave)
+				? new App.Events.Result(`Rape ${him}`, rape, virginityWarning())
+				: new App.Events.Result()
+		]);
+
+		function polish() {
+			t = [];
+
+			t.push(`You tell ${him} to polish this instead, advancing even closer. ${He} turns, finding your cockhead so close to ${his} face that ${his} eyes cross ludicrously as they attempt to focus on it. ${He} does not like dicks, and obviously does not find the prospect of sucking this one appealing right now, but ${he} knows it's in ${his} best interests to ${eventSlave.skill.oral > 10 ? `put ${his} oral knowledge to work` : `do ${his} best`} right now. ${He} closes ${his} eyes and takes you into ${his} mouth, forming a seal around your cock with ${his}`);
+			if (eventSlave.lips > 40) {
+				t.push(`ridiculous`);
+			} else if (eventSlave.lips > 20) {
+				t.push(`pillowy`);
+			} else if (eventSlave.lips > 10) {
+				t.push(`pretty`);
+			} else {
+				t.push(`disappointingly thin`);
+			}
+			t.push(`lips before starting to suck dick. Dissatisfied with ${his} reluctance, you order ${him} to open ${his} eyes and look up at you; ${he} obeys, the ${App.Desc.eyesColor(eventSlave, "", "orb", "orbs")} glittering with a little moisture as ${he} concentrates on breathing past your penis. You ask if your cock ${canTaste(eventSlave) ? "tastes" : "feels"} any different than usual. "Mmm hmm, M'," ${he} mumbles, producing a nice humming sensation against your cock. You tell ${him} that ${he}'s ${canTaste(eventSlave) ? "tasting" : "feeling"} another slave's ${eventSlave.vagina > -1 ? "pussy" : "ass"}. ${He} gags, but only slightly, and controls ${himself} immediately. Your dick is desensitized from vigorous use, and ${he} has to suck it a long time before you cup the back of ${his} head, ram yourself all the way in, and blow your load straight down ${his} gullet. You tell ${him} ${he}'s a good ${desc}. "Thank you, ${Master}," ${he} ${say}s <span class="hotpink">submissively,</span> going back to ${his} polishing.`);
+
+			seX(eventSlave, "oral", PC, "penetrative");
+			eventSlave.devotion += 5;
+			return t;
+		}
+
+		function coach() {
+			t = [];
+
+			t.push(`You sit yourself down in the doorway, right next to ${him}, and pat your thighs. ${He} sits on your lap, obeying despite some evident reluctance to sit atop your moist cock. It nestles easily between ${his} lower buttocks and upper thighs, and ${he} gets ${himself} situated, doing ${his} best to ignore the feeling of your hot hard meat, hard against ${his} fundament. You encircle ${him} with your arms, possessively and dominantly but not sexually, and tell ${him} that you're concerned about ${his} relationship with cock. ${He} shifts uncomfortably. "${Spoken(eventSlave, `Sorry, ${Master}, sorry I'm not better at hiding that. I should be a good ${desc} and not react like that. I mean, in a bad way. You startled me, but I don't always react well to dick even when I'm not startled. I'll try harder.`)}" This is more contrition and submission than you were expecting, and you probe further, asking ${him} pointedly whether ${he}'s attracted to dicks now. "N-no," ${he} admits, after only a moment's hesitation to remember that honesty is the most important rule for ${him} to follow. "${Spoken(eventSlave, `No, I don't like them. But I'll do my best to be a good sex slave anyway, ${Master}.`)}" Pleased, you tell ${him} that things will get easier for ${him}.`);
+			if (eventSlave.hormoneBalance >= 50) {
+				t.push(`The hormone treatments ${he}'s currently taking will slowly reorient ${his} sexuality, and eventually ${he}'ll lust after every cock ${he} sees.`);
+			} else if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
+				t.push(`The aphrodisiacs ${he}'s on will make ${him} so omnisexually horny that soon ${he} won't care how anyone's equipped, as long as they'll fuck ${him}.`);
+			} else if (eventSlave.energy > 60) {
+				t.push(`${His} excellent and improving libido will eventually soften ${him} to all kinds of sex, with all kinds of people.`);
+			} else {
+				t.push(`Habit and training will get ${him} used to dick, and eventually ${he}'ll barely remember that ${he} ever had a problem with sucking a quick cock.`);
+			}
+			t.push(`${He}'s a little unsure whether or not to be reassured by this, but ${he}'s <span class="mediumaquamarine">relieved ${he}'s not in trouble.</span>`);
+
+			eventSlave.trust += 5;
+			return t;
+		}
+
+		function rape() {
+			t = [];
+
+			t.push(`Sometimes there's really no need to overthink things. You reach down, grab ${him} under the armpits, and haul ${him} up, throwing ${him} across your desk. ${He} lands on ${his} back, and the impact drives the wind out of ${him}, so ${he} lies there, <span class="gold">all possibility of resistance driven out of ${him}.</span> ${eventSlave.clothes === "no clothing" ? `${He}'s already naked, so there's no need to` : "You"} tear the clothes off ${him}. You force yourself in between ${his} legs as ${he} struggles to get ${his} breath back, and ${he} gets another good look at the formidable dick that's about to be slammed inside ${him}`);
+			if (eventSlave.belly >= 5000) {
+				t.push(`before it disappears beneath ${his} ${eventSlave.bellyPreg >= 3000 ? "pregnant" : belly } belly`);
+			}
+			t.push(t.pop() + `. ${His} eyes go wide with fear, and you enhance the effect by smacking yourself against`);
+			if (canDoVaginal(eventSlave)) {
+				t.push(`${his} ${eventSlave.vagina === 0 ? "virgin" : ""} vulva.`);
+			} else if (eventSlave.dick > 0) {
+				t.push(`limp bitchclit.`);
+			} else {
+				t.push(`${his} buttocks.`);
+			}
+			t.push(`You tell ${him} not to worry, because you're still pretty wet from the last slave you fucked, so this shouldn't hurt too much. Then you ram your cock`);
+			if (eventSlave.vagina > 0) {
+				t.push(`inside ${him}.`);
+				t.push(VCheck.Vaginal(1, eventSlave));
+			} else {
+				t.push(`up ${his} spasming ass.`);
+				t.push(VCheck.Anal(1, eventSlave));
+			}
+			t.push(`${He} whines and bucks, but ${he}'s entirely at your mercy. ${He} doesn't like dicks, and to go by ${his} facial expression as you piston in and out of ${him}, this experience isn't going to make ${him} reconsider. When you fill ${him} with cum, pull out, and let ${him} retreat to clean ${himself} up, ${he}'s relieved to go.`);
+
+			eventSlave.trust -= 5;
+			return t;
+		}
+
+		function virginityWarning() {
+			if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
+				return `This option will take ${his}  virginity`;
+			} else if (eventSlave.anus === 0 && !canDoVaginal(eventSlave)) {
+				return `This option will take ${his} anal virginity`;
+			}
+		}
+	}
+};
diff --git a/src/events/RESS/imScared.js b/src/events/RESS/imScared.js
new file mode 100644
index 0000000000000000000000000000000000000000..8df132ff2c21793c445e651a2e4250edd2d23297
--- /dev/null
+++ b/src/events/RESS/imScared.js
@@ -0,0 +1,208 @@
+App.Events.RESSImScared = class RESSImScared extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				canMove,
+				canTalk,
+				s => s.assignment !== Job.QUARTER,
+				s => s.trust < -50,
+				s => s.devotion <= 50,
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him, himself
+		} = getPronouns(eventSlave);
+		const {say, title: Master} = getEnunciation(eventSlave);
+
+		/** @type {App.Entity.PlayerState} */
+		let PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "no clothing");
+
+		let t = [];
+
+		t.push(`During ${his} weekly inspection,`);
+		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(`has trouble following the routine orders that position ${him} so you can examine ${his} body. The cause is not difficult to determine: ${he}'s so cripplingly terrified that ${he}'s having difficulty functioning. ${He} seems to be trying to obey you, but ${he}'s so scared that ${his} mind is having trouble translating your simple verbal commands into physical obedience. You ask ${him} what ${he}'s so frightened of. The question stuns ${him}, and ${he} ${canSee(eventSlave) ? "stares at" : "faces"} you in mute horror, looking even more terrified than ${he} has up to this point and completely devoid of any idea how to respond. You order ${him} to respond, and this starts ${him} out of ${his} fugue. ${He} begins to cry, makes two false starts, sobs, and then begins forcing out words.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		t.push(`"E-e-everything," ${he} cries. "${Spoken(eventSlave, "I'm s-so s-sorry b-but I c-can't help")}," ${he} chokes on a sob and hiccups, "${Spoken(eventSlave, "help it. This, this place, being a sex slave")},`);
+		switch (eventSlave.rules.punishment) {
+			case "confinement":
+				t.push(Spoken(eventSlave, "b-being sh-shut up in the d-dark"));
+				break;
+			case "whipping":
+				t.push(Spoken(eventSlave, "b-being wh-wh-whip-ped"));
+				break;
+			case "chastity":
+				t.push(Spoken(eventSlave, "h-having my p-parts locked up in ch-chastity"));
+				break;
+			default:
+				t.push(Spoken(eventSlave, "n-never knowing what th-the p-punishment will be"));
+		}
+		t.push(`${Spoken(eventSlave, `wh-when I'm bad, e-everything, ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}. Oh, oh, I'm sorry, p-please, I'm sorry I, I'm like this, I'm crying, p-please ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}, please don't...`)}" ${He} trails off, giving you a look of supplication.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Punish ${him}`, punish),
+			new App.Events.Result(`Comfort ${him}`, comfort),
+			(V.dairyRestraintsSetting === 2
+				? new App.Events.Result(`Threaten ${him} with the industrial Dairy`, industrial)
+				: new App.Events.Result()),
+			(V.seeExtreme === 1
+				? new App.Events.Result(`Threaten to convert ${him} into a Fuckdoll`, fuckdoll)
+				: new App.Events.Result())
+		]);
+
+		function punish() {
+			t = [];
+
+			t.push(`${He} obviously knows that breaking down like this would displease you, but you patiently explain that it's against the rules anyway. ${He} cries harder, nodding through ${his} tears. ${He} knows that interrupting you to beg would be profoundly stupid, so ${he} clasps ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} in wordless submission. You tell ${him} that ${he}'s to keep ${himself} under control; if ${he} fails, ${he} will be punished. Since ${he} failed, ${he} will now suffer ${his} standard punishment, and be`);
+
+			switch (eventSlave.rules.punishment) {
+				case "confinement":
+					t.push(`shut up in a box. <span class="gold">${He} breaks down,</span> falling to ${his} knees, begging abjectly for mercy.`);
+					if (eventSlave.belly >= 100000 || eventSlave.boobs > 25000 || eventSlave.weight > 190) {
+						t.push(Spoken(eventSlave, `"It's too cramped in there,"`));
+					} else {
+						t.push(Spoken(eventSlave, `"It's dark in there,"`));
+					}
+					t.push(`${he} screams as you open the box for ${him}. ${He} knows that if ${he} doesn't climb in, it'll be longer before ${he}'s let out, so ${he} does, scrabbling inside and sobbing desperately as you close the lid.`);
+					break;
+				case "whipping":
+					t.push(`whipped. <span class="gold">${He} breaks down,</span> falling to ${his} knees, begging abjectly for mercy. "It'll h-hu-hurt," ${he} blubbers weakly as you attach ${his} handif (hasBothArms(eventSlave)) {s} to shackles high on the office wall. The first stroke across ${his} buttocks draws a long shriek out of ${him}.`);
+					break;
+				case "chastity":
+					t.push(`locked up in chastity. <span class="gold">${He} breaks down,</span> falling to ${his} knees, begging abjectly for mercy. "I c-can't," ${he} moans. "I can't take it. I can't stand it." As you lock the chastity onto ${him}, ${he} sobs inconsolably, knowing that any arousal will be torturous until ${he}'s released.`);
+					break;
+				default:
+					t.push(`gagged, since that's the appropriate castigation for failure to control ${his} mouth and deportment. ${He} tries to behave, but <span class="gold">breaks down</span> as you slide a dildo gag into ${his} throat, choking and struggling to breathe as ${he} tries to cry past it.`);
+			}
+			t.push(`The thing ${he}'s most frightened of is that ${he} won't be able to control ${his} fear in the future, and will continue to suffer.`);
+
+			eventSlave.trust -= 5;
+			return t;
+		}
+
+		function comfort() {
+			t = [];
+
+			t.push(`You rise from behind your desk, and ${eventSlave.slaveName} collapses to the floor, sure that ${he}'s about to be severely punished. ${He}'s shocked to feel your arms encircle ${him} as you kneel down beside ${him} and embrace ${his} huddled form. You pull ${his} head`);
+			if (V.PC.boobs >= 1400) {
+				t.push(`against your enormous, ${PC.boobsImplant !== 0 ? "hard" : "soft"} breasts,`);
+			} else if (V.PC.boobs >= 1200) {
+				t.push(`against your huge ${PC.boobsImplant !== 0 ? "firm" : "soft"} breasts,`);
+			} else if (V.PC.boobs >= 1000) {
+				t.push(`against your big ${PC.boobsImplant !== 0 ? "firm" : "soft"} breasts,`);
+			} else if (V.PC.boobs >= 300) {
+				t.push(`against your soft breasts,`);
+			} else if (V.PC.title === 0) {
+				t.push(`against your flat chest,`);
+			} else {
+				t.push(`into your shoulder,`);
+			}
+			t.push(`stroking it reassuringly and murmuring kindness. ${He} clings to you, mostly for lack of any other comfort in the whole world, and sobs convulsively, <span class="mediumaquamarine">${his} terror flowing out of ${him}</span> in a torrent as you gently rub ${his} back. When ${he}'s mostly cried ${himself} out, you tell ${him} that ${he}'ll be all right. You're sure ${he}'ll be a good slave one day. You understand that ${his} life is hard. ${He}'ll make mistakes, and you'll punish ${him} for them, but that's part of slave training, and that's all right. If ${he} does ${his} best, ${he}'ll be all right. ${He} sniffles, cuffing tears away. "${Spoken(eventSlave, `Th-thank you, ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}, I'll d-do my b-best`)}," ${he} manages to ${say}.`);
+
+			eventSlave.trust += 5;
+			return t;
+		}
+
+		function industrial() {
+			t = [];
+			const watchListenFreezes = canSee(eventSlave) ? "watches" : (canHear(eventSlave) ? "listens" : "freezes");
+
+			t.push(`You grab ${him} by the scruff of ${his} neck and drag ${him} down to ${V.dairyName}. ${He} tries to control ${himself}, but breaks down in tears when you haul ${him} to a stop, forcing ${him} to get a good`);
+			if (canSee(eventSlave)) {
+				t.push(`look at the`);
+			} else if (canHear(eventSlave)) {
+				t.push(`listen of the sound of`);
+			} else {
+				t.push(`feel for the omnipresent aura of`);
+			}
+			t.push(`rows of bodies being mercilessly milked. You explain that if ${he} continues to fail to control ${himself}, your patience with ${his} will eventually expire, and you'll be forced to immure ${him} here. ${canSee(eventSlave) ? "Indicating" : `Facing ${him} towards`} a slave who's being`);
+			if (eventSlave.balls > 0 && V.dairyStimulatorsSetting === 2) {
+				t.push(`cockmilked by the machines, you tell ${eventSlave.slaveName} to pay close attention. ${He} ${watchListenFreezes} in horror as a dildo the size of ${his} forearm slides in and out of the slave's rectum, pounding it harder and harder until the slave stiffens and the transparent tubing coming off its cockhead whitens with cum. As the slave relaxes slightly in the restrains, the powerful milkers continue their relentless tugging at ${his} gigantic udders.`);
+				if (!canSee(eventSlave)) {
+					t.push(`As the dildo begins its efforts to loose a second cumming, you grab the horrified slave's hands and push them to the cow's throbbing dick just in time for ${him} to feel the ejaculate forced out by its unwilling orgasm.`);
+				}
+				t.push(`You run a hand down to ${eventSlave.slaveName}'s own balls and, squeezing them slightly, tell ${him} that unless ${he} wants ${his} ass ruined by constant machine rape, ${his} tits turned into immobilizing milk factories and ${his} balls drained of every last drop of seed,`);
+			} else if ((eventSlave.ovaries === 1 || eventSlave.mpreg === 1) && V.dairyPregSetting === 2) {
+				t.push(`used for reproduction by the machines, you tell ${eventSlave.slaveName} to pay close attention. ${He} ${watchListenFreezes} in horror as a dildo the size of ${his} forearm fucks the slave's enormous cunt, keeping it as gaped as possible to ease birth and constantly ejaculating preparatory drugs against ${his} cervix. The slave is gigantically pregnant. You tell ${eventSlave.slaveName} that this is the vaginal treatment ${he} can expect when pregnant; when impregnation is required, the dildos ejaculate more than a liter of cum a minute.`);
+				if (!canSee(eventSlave)) {
+					t.push(`As the dildo retracts from the cow's gaping cunt, you grab the horrified slave's hands and push them to its gravid middle just in time for ${him} to feel a massive contraction.`);
+				}
+				t.push(`You run a hand down to ${eventSlave.slaveName}'s own middle and, patting it gently, tell ${him} that unless ${he} wants ${his} womb converted into an industrial component,`);
+			} else if ((eventSlave.ovaries === 1 || eventSlave.mpreg === 1) && V.dairyPregSetting === 3) {
+				t.push(`used for mass reproduction by the machines, you tell ${eventSlave.slaveName} to pay close attention. ${He} ${watchListenFreezes} in horror as a dildo the size of ${his} forearm fucks the slave's cavernous cunt, keeping it as gaped as possible to ease birth and constantly ejaculating preparatory drugs against ${his} tortured cervix. The slave is absolutely enormous, more a taut sphere of a belly than a person; so pregnant that the children within ${his} are visibly forced to bulge the skin covering ${his} straining womb by their sisters. You tell ${eventSlave.slaveName} that this is the treatment ${he} can expect when pregnant here; when impregnation is required, the dildos ejaculate more than a liter of cum a minute.`);
+				if (!canSee(eventSlave)) {
+					t.push(`As the cow takes the huge dildo absentmindedly, you grab the horrified slave's ${hasBothArms(eventSlave) ? "hands" : "hand"} and push ${hasBothArms(eventSlave) ? "them" : "it"} to its gravid middle, forcing ${him} to feel the children squirming within its packed womb. ${He} squeals in terror at the feeling of so many babies moving under ${his} fingers.`);
+				}
+				t.push(`You run a hand down to ${eventSlave.slaveName}'s own middle and, patting it gently, tell ${him} that unless ${he} wants to become an industrial breeder,`);
+			} else {
+				t.push(`drained of ${his} milk, you tell ${eventSlave.slaveName} to pay close attention. ${He} ${watchListenFreezes} in horror as the slave's gigantic breasts are massaged and squeezed, while the milkers attached to ${his} absurd nipples tug and pull with industrial power. ${He} can't ${canSee(eventSlave) ? "look away; the orbs of jiggling flesh being manipulated are each as big as the slave's torso" : "shut out the sound of those enormous jiggling orbs of flesh being so roughly manipulated"}. It's good for milk production to drain slaves completely on occasion, and the machine doesn't stop until every drop is wrung from both udders.`);
+				if (!canSee(eventSlave)) {
+					t.push(`You force the horrified slave's ${hasBothArms(eventSlave) ? "hands" : "hand"} onto its breasts so that ${he} may get a good sense of just how big and swollen they are and how hard the milker is pulling at them.`);
+				}
+				t.push(`You run a hand over to ${eventSlave.slaveName}'s own breast and, teasing ${his} nipple, tell ${him} that unless ${he} wants to experience that twice a day,`);
+			}
+			t.push(`${he} had better behave ${himself}. ${He} nods furiously, <span class="gold">terrified beyond the ability to speak.</span>`);
+
+			eventSlave.trust -= 8;
+			return t;
+		}
+
+		function fuckdoll() {
+			t = [];
+
+			t.push(`You order a Fuckdoll brought to your office. ${eventSlave.slaveName} `);
+			if (canSee(eventSlave)) {
+				t.push(`watches it totter in,`);
+			} else if (canHear(eventSlave)) {
+				t.push(`listens to the clicks of its approaching heels and the ominous squeaking of its latex shell,`);
+			} else {
+				t.push(`feels the uncomfortable latex skin of its suit when it brushes up against ${him},`);
+			}
+			t.push(`automatically following the tugs on its leash and the tonal commands passed by its suit. ${He} already understands the implicit threat, and ${he} shivers uncontrollably, <span class="gold">almost falling to ${his} knees in fear.</span> Not content with that, you tell ${him} that ${he}'s trying your patience with ${his} behavior. If ${he} doesn't control ${himself} better in the future, you'll give up on ${him} and convert ${him} into a Fuckdoll. At the spoken threat ${eventSlave.slaveName} does collapse, but you order ${him} to get back to ${his} feet and ${canSee(eventSlave) ? "watch" : "pay attention"}. ${He} does, shakily, tears streaming down ${his} face as you put the Fuckdoll on all fours, as though it were about to take dick. Its`);
+			if (eventSlave.vagina > -1) {
+				t.push(`holes are pointed straight at ${eventSlave.slaveName}'s face,`);
+				if (canSee(eventSlave)) {
+					t.push(`and ${he} can't avoid seeing how loose and used they look.`);
+				} else {
+					t.push(`so you grab both ${his} hands and force one into each of its blown out holes. ${eventSlave.slaveName} shrieks in horror at the recognizable sensation.`);
+				}
+			} else {
+				t.push(`rear hole is pointed straight at ${eventSlave.slaveName}'s face,`);
+				if (canSee(eventSlave)) {
+					t.push(`and ${he} can't avoid seeing how loose and used it looks.`);
+				} else {
+					t.push(`so you grab both ${his} hands and force them into its blown out ass. ${eventSlave.slaveName} shrieks in horror at the recognizable sensation.`);
+				}
+			}
+			t.push(`Suddenly, you activate the Fuckdoll's suit's punishment systems. It does not and cannot scream, but `);
+			if (canSee(eventSlave)) {
+				t.push(`a slight stiffening of its posture communicates extreme anguish, and its sphincter spasms tightly closed with obviously involuntary force.`);
+			} else {
+				t.push(`the sudden, pitiful attempt to clamp down on ${his} arms makes it perfectly clear that you just forced it to undergo extreme anguish.`);
+			}
+			t.push(`${eventSlave.slaveName} is almost incapacitated by terror.`);
+
+			eventSlave.trust -= 8;
+			return t;
+		}
+	}
+};
diff --git a/src/events/RESS/obedientAddict.js b/src/events/RESS/obedientAddict.js
index d660ef44cb7c62042b626fcf32cc4e764550bd0f..a29fd53a586abd4b2075e0bace36f303ff37ff76 100644
--- a/src/events/RESS/obedientAddict.js
+++ b/src/events/RESS/obedientAddict.js
@@ -38,7 +38,7 @@ App.Events.RESSObedientAddict = class RESSObedientAddict extends App.Events.Base
 		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
 		t.push(`takes ${his} aphrodisiacs in pill form, with ${his} food. They're dispensed alongside ${his} nutrition in the kitchen. You happen to be passing by when ${he}'s being issued ${his} drugs, and you see ${him} ${canSee(eventSlave) ? "staring" : "gazing"} thoughtfully at the insignificant-looking little pill, just holding it in ${his} hand and considering it for a long time. When ${he} realizes you're watching, ${he} turns to you and you realize ${his} eyes are moist.`);
 		if (canTalk(eventSlave)) {
-			t.push(`${He} ${SlaveStatsChecker.checkForLisp(eventSlave) ? "lisps through huge, quivering lips" : "mutters"}, "${Master}, ${Spoken(eventSlave, "I hate this shit. I come and come and come but it's just physical. I haven't felt close to anyone ever since I've been on these fucking aphrodisiacs.")}" ${He} shrugs bitterly. ${Spoken(eventSlave, "Still crave them though.")}`);
+			t.push(`${He} ${SlaveStatsChecker.checkForLisp(eventSlave) ? "lisps through huge, quivering lips" : "mutters"}, "${Master}, ${Spoken(eventSlave, "I hate this shit. I come and come and come but it's just physical. I haven't felt close to anyone ever since I've been on these fucking aphrodisiacs.")}" ${He} shrugs bitterly. ${Spoken(eventSlave, `"Still crave them though."`)}`);
 		} else {
 			t.push(`${He} uses trembling gestures to pour out dissatisfaction with life as an aphrodisiac addict. ${He} is emotionally unsatisfied with the mechanical orgasms ${he} gets on the drugs, but craves them intensely.`);
 		}
@@ -100,13 +100,13 @@ App.Events.RESSObedientAddict = class RESSObedientAddict extends App.Events.Base
 				t.push(`${He} indicates through ${his} weeping that ${he} can't climax without the drugs.`);
 			}
 			t.push(`You pass ${him} the pill, and ${he} continues to weep inconsolably, apologizing all the while, until the drug takes away ${his} ability to care about anything but getting fucked. When you finish and extract ${PC.dick === 0 ? `yourself from between ${his} legs` : `your cock from ${his} well-used hole`}, though, you think you can detect a deep sadness in ${his} eyes that it cannot reach.`);
-
-			eventSlave.devotion += 4;
 			if (canDoVaginal(eventSlave)) {
-				VCheck.Vaginal(1, eventSlave);
+				t.push(VCheck.Vaginal(1, eventSlave));
 			} else {
-				VCheck.Anal(1, eventSlave);
+				t.push(VCheck.Anal(1, eventSlave));
 			}
+
+			eventSlave.devotion += 4;
 			return t;
 		}
 
diff --git a/src/events/RESS/obedientGirlish.js b/src/events/RESS/obedientGirlish.js
index 67e148be597c71fc3e2c33961528bdb82907c648..5900257f1235057431b562b56ebbc8d16dea5471 100644
--- a/src/events/RESS/obedientGirlish.js
+++ b/src/events/RESS/obedientGirlish.js
@@ -106,12 +106,12 @@ App.Events.RESSObedientGirlish = class RESSObedientGirlish extends App.Events.Ba
 			} else {
 				t.push(`${he}'s wet and ready and moans happily as you enter ${him}.`);
 			}
-			t.push(`There's no hesitation or fear at all on ${his} face when ${he} ${canSee(eventSlave) ? "sees" : "notices"} you're returning ${him} to your penthouse; <span class="mediumaquamarine">${his} trust in you has increased.</span>`);
 			if (canDoVaginal(eventSlave)) {
-				VCheck.Vaginal(1, eventSlave);
+				t.push(VCheck.Vaginal(1, eventSlave));
 			} else {
-				VCheck.Anal(1, eventSlave);
+				t.push(VCheck.Anal(1, eventSlave));
 			}
+			t.push(`There's no hesitation or fear at all on ${his} face when ${he} ${canSee(eventSlave) ? "sees" : "notices"} you're returning ${him} to your penthouse; <span class="mediumaquamarine">${his} trust in you has increased.</span>`);
 
 			eventSlave.trust += 4;
 			return t;
@@ -142,8 +142,8 @@ App.Events.RESSObedientGirlish = class RESSObedientGirlish extends App.Events.Ba
 				t.push(`lie face-down on the couch${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
 			}
 			t.push(`${He} does doubtfully, only realizing what you intend when ${he} feels ${PC.dick === 0 ? "the strap-on" : "your dickhead"} forcing its way between ${his} narrow buttcheeks. ${He} whimpers and moans ${eventSlave.belly < 300000 ? "into the couch" : ""} as you roughly sodomize ${him}. It's true, ${he}'s pretty androgynous from this angle, especially while ${he} takes it up the butthole. <span class="hotpink">${He} has become more submissive to you,</span> but there's <span class="gold">some fear there, too.</span>`);
+			t.push(VCheck.Anal(1, eventSlave));
 
-			VCheck.Anal(1, eventSlave);
 			eventSlave.trust -= 2;
 			eventSlave.devotion += 4;
 			return t;
diff --git a/src/events/RESS/obedientShemale.js b/src/events/RESS/obedientShemale.js
index 54dc9773fb94f60f445836424168575265e8e909..eb7e880c5c498cf7a87b223d93ffe9e6235b4f6b 100644
--- a/src/events/RESS/obedientShemale.js
+++ b/src/events/RESS/obedientShemale.js
@@ -28,7 +28,7 @@ App.Events.RESSObedientShemale = class RESSObedientShemale extends App.Events.Ba
 			He, he, His, his, him, himself, girl
 		} = getPronouns(eventSlave);
 		const {title: Master} = getEnunciation(eventSlave);
-		const anusDesc = ["tight", "loose", "gaping"][Math.ceil(Math.clamp(eventSlave.anus, 1, 3)) - 1];
+		const anusDesc = eventSlave.anus > 2 ? "gaping" : (eventSlave.anus > 1 ? "loose" : "tight");
 
 		/** @type {App.Entity.PlayerState} */
 		let PC = V.PC;
@@ -76,9 +76,9 @@ App.Events.RESSObedientShemale = class RESSObedientShemale extends App.Events.Ba
 				t.push("shakes with release");
 			}
 			t.push(`after just a few strokes of your ${PC.dick === 0 ? "strap-on" : "cock"} up ${his} butt. ${His} ${anusDesc} ass spasms and tightens with ${his} climax${PC.dick !== 0 ? ", a wonderful sensation" : ""}. You aren't finished with ${him}, but ${he} rubs ${himself} languidly and enjoys the hard anal reaming more than ${he} ever has previously. ${His} devotion to you <span class="hotpink">has increased.</span>`);
+			t.push(VCheck.Anal(1, eventSlave));
 
 			eventSlave.devotion += 4;
-			VCheck.Anal(1, eventSlave);
 			return t;
 		}
 
@@ -86,9 +86,9 @@ App.Events.RESSObedientShemale = class RESSObedientShemale extends App.Events.Ba
 			t = [];
 
 			t.push(`${He} obeys your orders to keep ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} off ${his} dick, but can't hide ${his} disappointment and frustration. You keep a close watch on ${him}, and buttfuck ${him} every chance you get, teaching ${him} the finer points of taking a ${PC.dick === 0 ? "strap-on" : "dick"} up the butt. You focus entirely on your pleasure, teaching ${him} how to use ${his} ${anusDesc} anal ring to extract orgasms from cocks. This experience was hard for ${him} but has increased ${his} anal skill.`);
+			t.push(VCheck.Anal(9, eventSlave));
 
 			SkillIncrease.Anal(eventSlave, 10);
-			VCheck.Anal(9, eventSlave);
 			return t;
 		}
 
@@ -106,7 +106,7 @@ App.Events.RESSObedientShemale = class RESSObedientShemale extends App.Events.Ba
 				t.push(`Despite being used as an anal slut for a whole week, ${he} was not significantly affected.`);
 			}
 
-			VCheck.Anal(9, eventSlave);
+			t.push(VCheck.Anal(9, eventSlave));
 			return t;
 		}
 	}
diff --git a/src/events/RESS/passingDeclaration.js b/src/events/RESS/passingDeclaration.js
new file mode 100644
index 0000000000000000000000000000000000000000..9784ff3543611c360f62387a020232d0702413f6
--- /dev/null
+++ b/src/events/RESS/passingDeclaration.js
@@ -0,0 +1,271 @@
+App.Events.RESSPassingDeclaration = class RESSPassingDeclaration extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				canWalk,
+				canTalk,
+				s => s.devotion > 50,
+				s => s.trust > 50,
+				s => s.health.condition > 90,
+				s => s.muscles > 5,
+				s => s.weight >= -30,
+				s => s.weight <= 30
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, His, his, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {say, title: Master} = getEnunciation(eventSlave);
+		const desc = SlaveTitle(eventSlave);
+		const belly = bellyAdjective(eventSlave);
+
+		/** @type {App.Entity.PlayerState} */
+		let PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let t = [];
+
+		t.push("As you manage your empire from your office, a constant traffic of slaves passes by its door. The glass walls allow a good view of them, and since you naturally own what you find appealing, the passing chattel often draws your eye. For example, this morning you notice");
+		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(`almost bounce into view. ${He}'s physically fit, at a healthy weight,`);
+		if (eventSlave.belly >= 10000) {
+			if (eventSlave.bellyPreg >= 3000) {
+				t.push(`heavily pregnant,`);
+			} else if (eventSlave.bellyImplant >= 3000) {
+				t.push(`despite ${his} ${belly} fake belly,`);
+			} else {
+				t.push(`completely full of ${eventSlave.inflationType},`);
+			}
+		}
+		if (eventSlave.physicalAge > 35) {
+			t.push(`and is getting such excellent modern medical care that despite ${his} age, ${he} has the energy of a teenager.`);
+		} else if (eventSlave.physicalAge > 19) {
+			t.push(`is full of youth and vigor, and is in truly perfect health due to the miracles of modern medicine.`);
+		} else if (eventSlave.physicalAge > 12) {
+			t.push(`and is a teenager, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
+		} else {
+			t.push(`and is a little ${girl}, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
+		}
+		if (eventSlave.energy > 95) {
+			t.push(`Apart from ${his} absurd sex drive,`);
+		} else if (eventSlave.energy > 40) {
+			t.push(`In addition to ${his} very healthy libido,`);
+		} else {
+			t.push(`Despite ${his} mediocre libido,`);
+		}
+		t.push(`${he}'s overflowing with energy. ${He} half-runs, half-skips down the hallway, slowing in the doorway as ${he} feels your gaze. Without stopping, ${he} turns to meet your eyes, winks trustingly, and bursts out, "${Spoken(eventSlave, `Hi ${Master}! Love you!`)}" Then ${he} continues on ${his} merry way.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		t.push(`Someone's a happy ${desc} today.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Follow ${him}`, follow),
+			new App.Events.Result(`Play with ${him}`, play),
+			new App.Events.Result(`Punish ${him}`, punish)
+		]);
+
+		function follow() {
+			t = [];
+
+			t.push(`${His} sheer 'joie de vivre' is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where ${he}'s going, so you catch up quickly. ${He} gives you the careful measuring glance of a devoted sex slave who's checking whether ${his} owner wants to fuck ${him} right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction ${he} was going, and ${he} follows. "${Master}," ${he} ${say}s hesitantly, "I hope that was an okay thing for me to do." You assure ${him} it was. "Thanks, ${Master}," ${he} beams, grinning like an idiot. Smiling at ${his} infectious enthusiasm for life, you ask ${him} why ${he}'s so happy this morning. ${He} looks momentarily ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `perplexed, not a common look for a slave as smart as ${him}` : "perplexed"}.`);
+			t.push(`"${Spoken(eventSlave, `I don't know! I just woke up this morning feeling really, really good. ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `I'm sure the fact that I'm benefiting from incredibly advanced medicine has something to do with it; thank you very much for that, ${Master}. Other than that,` : ""} I just feel happy.`)}" This has to be some sort of milestone for ${him}, and for you, and maybe for slavery in general: if ${he} can be this pleased with life, something must be going right. You walk ${him} to where ${he}'s going`);
+			switch (eventSlave.assignment) {
+				case "whore":
+					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day selling ${his} body),`);
+					break;
+				case "serve the public":
+					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day flirting with citizens and having sex with anyone that's willing),`);
+					break;
+				case "work a glory hole":
+					t.push(`(a wall mounting that will render ${him} a helpless target for dicks all day),`);
+					break;
+				case "get milked":
+					t.push(`(${his} favorite milker in the penthouse),`);
+					break;
+				case "take classes":
+					t.push(`(a quiet area with a touchscreen where ${he} can review material from the slave etiquette class ${he}'s working on),`);
+					break;
+				case "please you":
+					t.push(`(the wardrobe, where ${he}'ll get dressed before attending to you for the rest of the day),`);
+					break;
+				case "be a subordinate slave":
+					t.push(`(the living area of the slave ${he}'s been assigned to serve),`);
+					break;
+				case "work as a servant":
+				case "be a servant":
+					t.push(`(the closet that contains the cleaning items ${he}'ll use to dust and polish the penthouse today),`);
+					break;
+				case "work as a nanny":
+					t.push(`(${V.nurseryName}, where ${he} is tending to the children),`);
+					break;
+				case "stay confined":
+					t.push(`(${his} cell),`);
+					break;
+				case "guard you":
+					t.push(`(the armory where ${his} weapons are kept),`);
+					break;
+				case "be your Head Girl":
+					t.push(`(the assignment location of a slave who needs some hands-on guidance from your Head Girl),`);
+					break;
+				case "recruit girls":
+					t.push(`(the camera station ${he} uses to convince people from the old world that becoming your slave is a good idea),`);
+					break;
+				case "serve in the master suite":
+					t.push(`(your bedroom, where ${he}'ll ready ${himself} for later),`);
+					break;
+				case "be the DJ":
+					t.push(`(the back of ${V.clubName} where ${he} decides the playlist for the day),`);
+					break;
+				case "be the Attendant":
+					t.push(`(the back of ${V.spaName}, where ${he}'ll decide the perfect mixture for today's baths),`);
+					break;
+				case "be the Madam":
+					t.push(`(${his} office in ${V.brothelName}, where ${he}'ll decide the slaves on display),`);
+					break;
+				case "be the Schoolteacher":
+					t.push(`(${his} office in ${V.schoolroomName}, where ${he}'ll decide today's lesson),`);
+					break;
+				case "be the Stewardess":
+					t.push(`(${his} office in ${V.servantsQuartersName}, where ${he}'ll divvy out today's tasks),`);
+					break;
+				case "be the Milkmaid":
+					t.push(`(${V.dairyName}, to check on the cattle),`);
+					break;
+				case "be the Farmer":
+					t.push(`(${V.farmyardName}, to tend to the crops),`);
+					break;
+				case "be the Wardeness":
+					t.push(`(${V.cellblockName}, to oversee the inmates),`);
+					break;
+				case "be your Concubine":
+					t.push(`(your bed),`);
+					break;
+				case "be the Nurse":
+					t.push(`(${V.clinicName}, to check on the patients),`);
+					break;
+				case "be the Matron":
+					t.push(`(${V.nurseryName}, where ${he} is managing children and nannies),`);
+					break;
+				case "live with your Head Girl":
+					break;
+				default:
+					t.push(`(a waiting area for further assignment),`);
+			}
+			t.push(`and when you get there, ${he} gives you a peck on the cheek. ${eventSlave.height < 170 ? `The short ${desc} has to go up on tiptoe to reach.` : ""} "<span class="hotpink">${Spoken(eventSlave, "I really do love you")},</span> ${Master}," ${he} ${say}s, ${canSee(eventSlave) ? `${App.Desc.eyesColor(eventSlave)} shining` : "face filled with joy"}.`);
+
+			eventSlave.devotion += 5;
+			return t;
+		}
+
+		function play() {
+			t = [];
+
+			t.push(`You're not a slave, so you can't understand ${his} inner workings through direct empathy. But in your experience, a quick orgasm never fails to make a good day better. You're not slow, and of course you know where ${he}'s going, so you catch up to ${him} on quiet feet and`);
+			if (eventSlave.butt > 12) {
+				t.push(`sink both hands into ${his} immense rear.`);
+			} else if (eventSlave.butt > 6) {
+				t.push(`set ${his} enormous ass jiggling with a smack.`);
+			} else if (eventSlave.butt > 3) {
+				t.push(`give ${his} womanly bottom a squeeze.`);
+			} else {
+				t.push(`pinch ${his} cute rear.`);
+			}
+			t.push(`${He} squeals and whirls around, ${eventSlave.energy > 60 ? `eagerly flinging ${himself} into your arms, ready for some action` : `trustingly throwing ${himself} into your arms`}. Feeling spontaneous, you decide to get everyone off quickly and cleanly, right here.`);
+			switch (eventSlave.fetish) {
+				case "submissive":
+					t.push(`You place a dominant hand around ${his} throat, firmly but not harshly, almost sending the submissive to ${his} knees. Your other hand`);
+					break;
+				case "cumslut":
+					t.push(`You kiss ${him}, sliding your tongue all the way into ${his} mouth. ${He} melts into you, rhapsodically entranced by the intense oral stimulation, and ${his} tongue presses against yours with frankly sexual significance. Your hand`);
+					break;
+				case "humiliation":
+					t.push(`Slaves are constantly passing the two of you, and you constantly turn ${him} to show ${his} body to each of them, spreading ${him} to display ${his} most intimate parts. ${His} cheeks flush with arousal and delicious shame. Your hand`);
+					break;
+				case "buttslut":
+					t.push(`You slide a hand all the way under ${him}, pulling the flesh of ${his} buttock to one side and then nestling possessive fingers over ${his} anus, teasing and stimulating, but not penetrating. Your other hand`);
+					break;
+				case "boobs":
+					t.push(`${He} gasps as your hot mouth finds one of ${his} eventSlave.nipples nipples, and then moans openly as one of your hands mauls ${his} other breast. Your other hand`);
+					break;
+				case "pregnancy":
+					t.push(`One of your hands begins to caress ${his} ${belly} ${eventSlave.pregKnown === 1 ? "pregnant" : ""} belly, worshipping its curve. Your other hand`);
+					break;
+				case "dom":
+				case "sadist":
+					t.push(`You press yourself aggressively against ${him}, and ${he} presses back; you grind harder still, letting ${him} know that ${he} can let ${himself} be a little aggressive, too. Groaning with pleasure and satisfaction, ${he} kisses you furiously. One of your hands`);
+					break;
+				case "masochist":
+					t.push(`You caress one of ${his} nipples, ${eventSlave.nipples !== "fuckable" ? "bringing it completely erect before gripping it firmly. You twist it, pull it, pinch it" : "letting it swell completely shut before driving your entire fist into it"}; ${he} moans with masochistic pleasure. Your other hand`);
+					break;
+				default:
+					t.push(`Your hand`);
+			}
+			if (canDoVaginal(eventSlave)) {
+				t.push(`finds ${his} pussy`);
+			} else if (canDoAnal(eventSlave)) {
+				t.push(`reaches around behind ${him} to tease ${his} ass and play with ${his} sensitive perineum`);
+			} else {
+				t.push(`traces ${his} chastity`);
+			}
+			t.push(`and you press your groin towards ${him}. Getting the idea, ${he} begins to ${PC.dick !== 0 ? "jack you off" : "finger your clit"} energetically, taking the pace from your lusty demeanor and ${his} own feeling of energy and well-being. The two of you orgasm almost together. ${PC.dick !== 0 ? "You angle your hips to shoot your seed onto the floor" : "You climax so violently that some of your femcum makes it onto the floor"}.`);
+			if (eventSlave.chastityPenis === 1) {
+				t.push(`${His} ejaculate steadily drips from ${his} chastity cage,`);
+			} else if (canAchieveErection(eventSlave)) {
+				t.push(`${He} blows ${his} own load right after,`);
+			} else if (eventSlave.balls > 0) {
+				t.push(`${His} limp dick pours cum,`);
+			} else if (eventSlave.dick > 0) {
+				t.push(`${His} bitchclit produces a little watery fluid,`);
+			} else if (eventSlave.vaginaLube > 1) {
+				t.push(`${He} squirts copiously,`);
+			} else {
+				t.push(`Unusually for ${him}, ${he} manages to squirt a little,`);
+			}
+			t.push(`adding to the mess. You tell ${him} another slave will clean up, and order ${him} to go about ${his} business. ${He} turns to go, <span class="mediumaquamarine">smiling with sexual satisfaction.</span>`);
+
+			eventSlave.trust += 5;
+			return t;
+		}
+
+		function punish() {
+			t = [];
+
+			t.push(`That was not quite the prescribed way of greeting you, there was no need to greet you as ${he} passed, and most importantly, ${he}'s simply too cheery. Resolving to crush ${his} happiness, you call ${him} back to the office in a thunderous voice you know will reach ${him}. ${He} knows ${he}'s made a mistake, but comes promptly, lower lip quivering. ${His} feelings are plain to see on ${his} face: surprise, <span class="mediumorchid">betrayal,</span> <span class="gold">fear.</span> ${He} thought ${he} could be friendly, and now ${he} knows ${he} was wrong. What's more, ${he} thought ${he} could be happy, and now ${he}'s realizing that that was also wrong. As you`);
+			switch (eventSlave.rules.punishment) {
+				case "confinement":
+					t.push(`close ${him} into a confinement cell,`);
+					break;
+				case "whipping":
+					t.push(`tie ${him} up for a brief whipping,`);
+					break;
+				case "chastity":
+					t.push(`lock ${him} into harsh chastity,`);
+					break;
+				default:
+					t.push(`gag ${him} for speaking out of turn,`);
+			}
+			t.push(`a wail of despair tears its way out of ${his} throat, far out of proportion to the standard punishment you're applying. It's perhaps the saddest sound you've ever heard a slave make. Slaves cry all the time, but usually they already understand that happiness is out of their reach. This one just woke up thinking that ${he} could be happy and was happy, and now ${he}'s realizing it isn't allowed.`);
+
+			eventSlave.devotion -= 10;
+			eventSlave.trust -= 10;
+			return t;
+		}
+	}
+};
diff --git a/src/events/RESS/tooThinForCumDiet.js b/src/events/RESS/tooThinForCumDiet.js
new file mode 100644
index 0000000000000000000000000000000000000000..c2c416234e03caf2ef8a7f0b07a3549db7ba2027
--- /dev/null
+++ b/src/events/RESS/tooThinForCumDiet.js
@@ -0,0 +1,366 @@
+App.Events.RESSTooThinForCumDiet = class RESSTooThinForCumDiet extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [];
+	}
+
+
+	actorPrerequisites() {
+		return [
+			/** @param {App.Entity.SlaveState} s */
+			[
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				canWalk,
+				canTalk,
+				s => s.dietCum > 0,
+				s => s.diet === "fattening",
+				s => s.trust >= -50,
+				s => s.fetish !== "cumslut",
+				s => s.weight < -30,
+				s => s.health.condition > -80,
+				s => s.behavioralFlaw !== "anorexic",
+				s => s.sexualFlaw !== "self hating",
+				s => (s.fetishStrength <= 60 || s.fetishKnown !== 1),
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, His, his, hers, him, himself, girl
+		} = getPronouns(eventSlave);
+		const {title: Master} = getEnunciation(eventSlave);
+
+		V.nextLink = "Next Week";
+		const belly = bellyAdjective(eventSlave);
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let t = [];
+		t.push(`You are in your office, tending to the tedious business of requisition orders for your penthouse when you see`);
+		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(`appear outside your door. ${He} hovers outside in the hall, peeking ${his} head around the entry-way, looking very unsure about disturbing you. You stop what you're doing and call ${him} in. ${He}'s reticent at first, but then ${he} obediently steps into your office. ${He} is`);
+		if (eventSlave.clothes === "no clothing") {
+			t.push(`forced to remain naked at all times, and the most striking thing about ${his} body is how`);
+			if (eventSlave.belly >= 100000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} ${belly} pregnancy utterly dwarfs ${his} skinny body.`);
+				} else {
+					t.push(`${his} ${belly} distended belly utterly dwarfs ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 15000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} full pregnancy completely dominates ${his} skinny body.`);
+				} else {
+					t.push(`${his} hugely distended belly completely dominates ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 10000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} advanced pregnancy dominates ${his} skinny body.`);
+				} else {
+					t.push(`${his} hugely distended belly dominates ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 5000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`massive ${his} pregnant belly is compared to ${his} skinny body.`);
+				} else {
+					t.push(`massive ${his} distended belly is compared to ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 1500) {
+				if (eventSlave.bellyPreg > 0) {
+					t.push(`noticeable ${his} growing pregnancy is against ${his} skinny body.`);
+				} else {
+					t.push(`noticeable the curve of ${his} belly is against ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 150) {
+				if (eventSlave.bellyPreg > 0) {
+					t.push(`noticeable ${his} early pregnancy is against ${his} skinny body.`);
+				} else {
+					t.push(`noticeable the curve of ${his} implant is against ${his} skinny body.`);
+				}
+			} else {
+				t.push(`skinny ${he} is.`);
+			}
+		} else {
+			t.push(`forced to wear ${eventSlave.clothes} all day, but even through ${his} outfit, it's easy to see how`);
+			if (eventSlave.belly >= 100000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} ${belly} pregnancy utterly dwarfs ${his} skinny body.`);
+				} else {
+					t.push(`${his} ${belly} distended belly utterly dwarfs ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 15000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} heavy pregnancy completely dominates ${his} skinny body.`);
+				} else {
+					t.push(`${his} hugely distended belly completely dominates ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 10000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`${his} advanced pregnancy dominates ${his} skinny body.`);
+				} else {
+					t.push(`${his} hugely distended belly dominates ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 5000) {
+				if (eventSlave.bellyPreg >= 3000) {
+					t.push(`massive ${his} pregnant belly is compared to ${his} skinny body.`);
+				} else {
+					t.push(`massive ${his} distended belly is compared to ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 1500) {
+				if (eventSlave.bellyPreg > 0) {
+					t.push(`noticeable ${his} growing pregnancy is against ${his} skinny body.`);
+				} else {
+					t.push(`noticeable the curve of ${his} belly is against ${his} skinny body.`);
+				}
+			} else if (eventSlave.belly >= 150) {
+				if (eventSlave.bellyPreg > 0) {
+					t.push(`noticeable ${his} early pregnancy is against ${his} skinny body.`);
+				} else {
+					t.push(`noticeable the curve of ${his} implant is against ${his} skinny body.`);
+				}
+			} else {
+				t.push(`impossibly skinny ${he} is.`);
+			}
+		}
+		if (eventSlave.weight > -80) {
+			t.push(`${He}'s not exclusively skin and bones, but ${he}'s close. ${His}`);
+		} else {
+			t.push(`${He}'s so thin that ${he} doesn't look entirely healthy. ${His}`);
+		}
+
+		if (eventSlave.boobs < 600) {
+			if (eventSlave.boobs < 300) {
+				t.push(`tiny`);
+			} else if (eventSlave.boobs < 600) {
+				t.push(`small`);
+			}
+			t.push("boobs are barely noticeable");
+			t.push(eventSlave.belly >= 5000 ? `above ${his} bloated` : `against ${his} concave`);
+			if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
+				t.push(`tummy, and that can be a very appealing look given the predilection your arcology has for slim ${girl}s.`);
+			} else {
+				t.push(`tummy, and to most clients, this makes ${him} a less appealing whore.`);
+			}
+		} else {
+			t.push(eventSlave.boobs < 900 ? "large" : "massive");
+			t.push(`tits are a sharp contrast to ${his}`);
+			t.push(eventSlave.belly >= 150 ? "thin, bloated frame," : "concave belly");
+			t.push(`and although impressive, they seem to especially stick out on a ${girl} who, in all other ways, seems`);
+			t.push(eventSlave.weight > -80 ? "slightly" : "alarmingly");
+			t.push(`malnourished. ${His} ${eventSlave.faceShape} face is clearly conflicted, and`);
+		}
+		t.push(canSee(eventSlave) ? `${his} ${App.Desc.eyesColor(eventSlave)} shift` : `${he} glances about`);
+		t.push(`with nervous energy. ${He} is clearly unsure whether ${he} should say what ${he} came here to say.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+		t.push(`When you finally ask ${him} what ${he} wants, ${he} hesitates for a moment and then suddenly seems to gain ${his}`);
+		if (eventSlave.accent > 1) {
+			t.push(`courage, speaking in an atrociously thick accent.`);
+		} else if (eventSlave.accent > 0) {
+			t.push(`courage, speaking in a cute little accent.`);
+		} else {
+			t.push("courage.");
+		}
+		t.push(Spoken(eventSlave, `"Please ${Master}, I'm so hungry! It's seems like all I get to eat is cum. It's disgusting! Please! I have to eat so much of it. Can I be allowed to eat regular food again? Please ${Master}, I'm so hungry. I need real food!"`));
+		App.Events.addParagraph(node, t);
+		t = [];
+		t.push(`It's true, cum`);
+		t.push(eventSlave.dietCum === 1 ? "supplemented" : "based");
+		t.push(`food can be hard on ${girl}s`);
+		t.push(`who are not fully habituated to being toys for sexual amusement — particularly when you've ordered them to gain weight on it. You look at the`);
+		if (eventSlave.belly >= 1500) {
+			t.push(`gravid,`);
+		}
+		t.push(`skinny whore and consider your options.`);
+
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		App.Events.addResponses(node, [
+			(eventSlave.chastityAnus === 1)
+				? new App.Events.Result(`Give the poor ${girl} a break and take ${him} off ${his} cum diet so ${he} can safely get to a healthier weight`, safely)
+				: new App.Events.Result(),
+			(canDoAnal(eventSlave))
+				? new App.Events.Result(`Give the emaciated slut your answer in the form of a rough butt-fuck`, buttfuck, virginityWarning())
+				: new App.Events.Result(),
+			new App.Events.Result(`Use aphrodisiacs and positive reinforcement to make ${his} cum diet more palatable`, aphrodisiac),
+		]);
+
+		function virginityWarning() {
+			if ((eventSlave.anus === 0) && (eventSlave.dietMilk === 1)) {
+				return `This option will take ${his} anal virginity and remove milk from ${his} diet.`;
+			} else if (eventSlave.anus === 0) {
+				return `This option will take ${his} anal virginity`;
+			} else if (eventSlave.dietMilk === 1) {
+				return `This option will remove milk from ${his} diet.`;
+			}
+			return null;
+		}
+
+
+		function safely() {
+			t = [];
+			t.push(`You silently appraise ${eventSlave.slaveName}'s desperate face and lean forward in your chair to check your terminal. You confirm that`);
+			if (eventSlave.dietCum === 1) {
+				t.push(`${his} food is supplemented with cum for flavor.`);
+			} else {
+				t.push(`${he} is being fed significant amounts of ejaculate.`);
+			}
+			t.push(`While ${his}`);
+			if (eventSlave.dietCum === 2) {
+				t.push(`extreme`);
+			}
+			t.push(`diet is still engineered to`);
+			if (eventSlave.dietCum === 2) {
+				t.push(`barely`);
+			}
+			t.push(`provide the nutrition ${he} needs, if ${he} can't hold the stuff down, ${he} can't gain`);
+			if (eventSlave.pregKnown === 1 && eventSlave.preg > eventSlave.pregData.normalBirth / 4) {
+				t.push(`weight, especially with ${his} growing`);
+				if (eventSlave.pregType > 1) {
+					t.push(`children taking whatever nutrients they can.`);
+				} else {
+					t.push(`child taking whatever nutrients it can.`);
+				}
+			} else {
+				t.push("weight.");
+			}
+			t.push(`With a few taps on the keyboard you change ${his} orders so that ${he} will be fed a much more nutritionally rich diet that is free of ejaculate. However, you make sure to warn ${him} that ${V.assistant.name} will be monitoring ${him}, and you may change your mind once ${he} reaches a more attractive weight. ${He} thanks you profusely,`);
+			if (eventSlave.vagina !== 0) {
+				t.push(`even attempting to offer ${his} body for use in gratitude,`);
+			}
+			t.push(`but you simply send ${him} away. You find yourself concerned that you are becoming soft by allowing slaves to dictate what they will and won't eat, but your benevolent decision has already had a <span class="hotpink">positive effect on ${his} attitude.</span> ${He} <span class="mediumaquamarine">trusts you a little more</span> too.`);
+			eventSlave.trust += 2;
+			eventSlave.devotion += 2;
+			eventSlave.dietCum = 0;
+			return t;
+		}
+
+		function buttfuck() {
+			t = [];
+			let frag = document.createDocumentFragment();
+			t.push(`You stand up behind your desk. ${He} flinches, but holds ${his} ground, ${his} lip quivering slightly. You slowly walk toward ${him}, appraising ${his}`);
+			t.push(eventSlave.belly >= 100 ? `bloated,` : `smooth,`);
+			t.push(`skinny body, touching ${his} shoulder as you disappear behind ${him}. ${He} starts to cry as you`);
+			if (V.PC.dick === 0) {
+				t.push(`pull a massive rubber dong attachment off the wall and hook it to your strap-on.`);
+			} else {
+				t.push(`unbuckle your pants and ${him} feel your warm dick harden against ${his} tight, bony thigh.`);
+			}
+			t.push(`Without word or ceremony, you shove ${him} forward so that ${he} is bent over and crushed against your desk. The tears start to flow out of ${him} as ${he} feels your`);
+			t.push(V.PC.dick === 0 ? `massive rubber dong` : `hard, thick cock`);
+			t.push(`pressing against ${his} unprotected anus.`);
+			App.Events.addParagraph(frag, t);
+
+			t = [];
+			t.push(`When you offer ${him} the opportunity to revise ${his} request, ${he} does.`);
+			t.push(Spoken(eventSlave, `"Please, ${Master} I'm sorry! Please don't fuck my ass! I'll eat all the cum you want! Please!"`));
+			t.push(`${He} screams`);
+			if (eventSlave.accent > 1) {
+				t.push(`in ${his} thick accent`);
+			}
+			t.push(`as you force your`);
+			if (V.PC.dick === 0) {
+				t.push(`strap-on`);
+			} else {
+				t.push(`self`);
+			}
+			t.push(`inside ${his} butt-hole and subdue ${his} weak, struggling body against your unforgiving desk. <span class="gold">Horrified tears</span> stream down ${his} face with each brutal thrust as you speak into ${his} ear and remind ${him} that slaves are not allowed to dictate their needs to their owners. You know what's best for ${him}, and right now, ${his} proper role is as an eager little depository for the products of the free-cities ejaculate market. It's ${his} job to suck down cum at the whim of ${his} owner, plain and simple, until ${he}'s told otherwise. You butt-fuck the cum-fed slag until ${he} simply lays there and accepts ${his} corrective assrape.`);
+			if (eventSlave.anus === 0) {
+				t.push(`<span class="lime">${His}</span>`);
+				if (eventSlave.butt < 5) {
+					t.push(`<span class="lime">skinny little</span>`);
+				} else {
+					t.push(`<span class="lime">plump little</span>`);
+				}
+				t.push(`<span class="lime">ass is now broken in.</span>`);
+			}
+			t.push(`${He} sobs quietly with each thrust of your hips, and when you finally`);
+			if (V.PC.dick !== 0) {
+				t.push(`make yet another cum deposit into ${his}`);
+				t.push(eventSlave.weight < -80 ? `emaciated body and` : `bony body and`);
+			}
+			t.push(`pull out, you instruct`);
+			if (eventSlave.dietCum === 1) {
+				t.push(`${V.assistant.name} to dramatically increase the amount of cum in ${his} diet from now on. You won't have a slave telling you what ${he} eats. ${eventSlave.slaveName}`);
+				if (canHear(eventSlave)) {
+					t.push(`hears your instructions`);
+				} else {
+					t.push(`correctly guesses the meaning behind your body language`);
+				}
+				t.push(`and whimpers before rubbing ${his} sore bottom while heading`);
+			} else {
+				t.push(`another slave to drag the broken slut to the kitchen, where ${he}'s to receive an additional feeding of thick, creamy ejaculate-based nutrients before proceeding`);
+			}
+			t.push(`to ${his} next assignment.`);
+			App.Events.addParagraph(frag, t);
+			t = [];
+			t.push(`${He}'s learned a valuable lesson about what it truly means to be a slave today, and it's one ${he} <span class="orchid">won't soon forget.</span>`);
+			eventSlave.devotion -= 5;
+			eventSlave.trust -= 5;
+			if (eventSlave.anus === 0) {
+				eventSlave.anus += 1;
+			}
+			VCheck.Anal(1, eventSlave);
+			if (eventSlave.dietCum === 1) {
+				eventSlave.dietCum = 2;
+				eventSlave.dietMilk = 0;
+			}
+
+			App.Events.addParagraph(frag, t);
+			return [frag];
+		}
+
+
+		function aphrodisiac() {
+			t = [];
+			let frag = document.createDocumentFragment();
+			t.push(`You do a quick check at your terminal. ${He} is indeed being fed`);
+			if (eventSlave.dietCum === 1) {
+				t.push(`food that is supplemented with cum for flavor.`);
+			} else {
+				t.push(`large amounts of human ejaculate.`);
+			}
+			t.push(`You tell ${him} that it can't be helped. When you assign a slave ${his} diet, it's for a reason, and in ${eventSlave.slaveName}'s case, you are using ${his} diet to make ${him} into a better whore. By the look on ${his} distressed face, you can tell ${he} doesn't understand or appreciate your perspective, but you tell ${him} you have just the thing to help change ${his} outlook.`);
+			App.Events.addParagraph(frag, t);
+			t = [];
+			t.push(`You pull out a heavy dose of aphrodisiacs from the drawer in your desk. They are expensive, but powerful drugs that can be used in a brute force way to manipulate the sexual urges and tastes of even the most frigid sluts. The mild dose included in every slave's food is usually enough to affect a slow, inevitable change in attitude for resistant slaves, but sometimes a more acute dose can be an amusing way to turn disgust into dependence.`);
+			App.Events.addParagraph(frag, t);
+			t = [];
+			t.push(`${eventSlave.slaveName} shivers as you reassure ${him} and inject ${his}`);
+			t.push(eventSlave.weight < -80 ? `bony` : `tiny`);
+			t.push(`body with the powerful drugs. You know they are working when ${he} begins to perspire a little, and`);
+			if (eventSlave.vagina > -1) {
+				t.push(`${he} starts to leak fresh girl-juice down ${his} shivering thighs.`);
+			} else if (eventSlave.dick === 0) {
+				t.push(`starts to turn instinctively to offer you ${his} only hole.`);
+			} else {
+				t.push(`${his} dick starts to come to attention.`);
+			}
+			t.push(`You then book ${him} to be the main attraction at a corporate office party that afternoon, where ${he} will be the target of a blow-bang and bukkake. You see that ${he}'s dosed heavily with the drugs every day this week, and then book the rest of ${his} afternoons for similar duties, making sure ${he} still tends to ${his} regular assignments as well. In the meantime, you also instruct the kitchen that ${he} is to eat as much cum-based food from the dispensers as ${he} can suck down in order to fuel up for these exhausting escapades.`);
+			App.Events.addParagraph(frag, t);
+			t = [];
+			t.push(`By the end of the week, the aphrodisiacs and ${his} slide into an inescapable routine of cum immersion have done their job, and ${he} has begun to <span class="lightcoral">view cum as an inevitable component of ${his} daily life.</span> ${He} also manages to <span class="green">gain a little weight.</span> Thanks to your manipulation of ${his} Pavlovian responses through extreme drug therapy, ${his} <span class="red">health has suffered a bit,</span> but ${he} is also <span class="hotpink">more dependent on you</span> thanks to ${his}`);
+			if (eventSlave.addict === 0) {
+				t.push(`<span class="cyan">new</span>`);
+			} else {
+				t.push(`<span class="cyan">developing</span>`);
+			}
+			t.push(`<span class="cyan">addiction to aphrodisiacs.</span>`);
+			eventSlave.devotion += 5;
+			eventSlave.weight += 10;
+			eventSlave.fetish = "cumslut";
+			eventSlave.fetishKnown = 1;
+			eventSlave.fetishStrength = 10;
+			eventSlave.addict += 1;
+			seX((eventSlave), "oral", "public", "penetrative", 50);
+			healthDamage((eventSlave), 10);
+
+			App.Events.addParagraph(frag, t);
+			return [frag];
+		}
+	}
+};
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index 805d3a2de7f43e0c8c0250b8aba087835e02ee78..7badfb5f5cc6bd9e9f76cbf00caa4d9b635d6843 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -17,7 +17,9 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSDevotedVirgin(),
 		new App.Events.RESSDevotedWaist(),
 		new App.Events.RESSEscapee(),
+		new App.Events.RESSFrighteningDick(),
 		new App.Events.RESSHotPC(),
+		new App.Events.RESSImScared(),
 		new App.Events.RESSLazyEvening(),
 		new App.Events.RESSMoistPussy(),
 		new App.Events.RESSMuscles(),
@@ -26,8 +28,10 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSObedientGirlish(),
 		new App.Events.RESSObedientIdiot(),
 		new App.Events.RESSObedientShemale(),
+		new App.Events.RESSPassingDeclaration(),
 		new App.Events.RESSRetchingCum(),
 		new App.Events.RESSSuppositoryResistance(),
+		new App.Events.RESSTooThinForCumDiet(),
 		new App.Events.RESSWaistlineWoes(),
 
 		new App.Events.RECIButthole(),
diff --git a/src/facilities/farmyard/farmerSelect.tw b/src/facilities/farmyard/farmerSelect.tw
index 8ea9151878320174b1fb79caa18beaa0fa466853..2c66982b707aa3e92ba7e53540ddbfb5a36cd695 100644
--- a/src/facilities/farmyard/farmerSelect.tw
+++ b/src/facilities/farmyard/farmerSelect.tw
@@ -12,4 +12,4 @@
 <br><br>''Appoint a Farmer from your obedient slaves:''
 <br><br>[[None|Farmyard][removeJob($Farmer, "be the Farmer")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.farmyard, "Farmyard")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.farmyard, "Farmyard")>>
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbc376eeab74c58e6bbf98f16402e498a82a6802
--- /dev/null
+++ b/src/facilities/farmyard/farmyard.js
@@ -0,0 +1,357 @@
+App.Facilities.Farmyard.clearAnimalsBought = function() {
+	for (const i in V.animalsBought) {
+		V.animalsBought[i] = 0;
+	}
+};
+
+App.Facilities.Farmyard.upgrades = function() {
+	const frag = new DocumentFragment(),
+
+		farmyardUpgrades = V.farmyardUpgrades,
+
+		pumpCost = Math.trunc(5000 * V.upgradeMultiplierArcology),
+		fertilizerCost = Math.trunc(10000 * V.upgradeMultiplierArcology),
+		hydroponicsCost = Math.trunc(20000 * V.upgradeMultiplierArcology),
+		seedsCost = Math.trunc(25000 * V.upgradeMultiplierArcology),
+		machineryCost = Math.trunc(50000 * V.upgradeMultiplierArcology);
+
+	if (!farmyardUpgrades.pump) {
+		const
+			desc = document.createElement("div"),
+			upgrade = document.createElement("div"),
+			note = document.createElement("span");
+
+		upgrade.classList.add("indent");
+		note.classList.add("note");
+
+		upgrade.append(App.UI.DOM.passageLink("Upgrade the water pump", "Farmyard", () => {
+			cashX(forceNeg(pumpCost));
+			farmyardUpgrades.pump = 1;
+		}));
+
+		note.append(` Costs ${cashFormat(pumpCost)} and slightly decreases upkeep costs.`);
+
+		desc.append(`${V.farmyardNameCaps} is currently using the basic water pump that it came with.`);
+
+		upgrade.append(note);
+		frag.append(desc, upgrade);
+	} else {
+		const desc = document.createElement("div");
+
+		desc.append(`The water pump in ${V.farmyardName} is a more efficient model, slightly improving the amount of crops it produces.`);
+
+		frag.append(desc);
+
+		if (!farmyardUpgrades.fertilizer) {
+			const
+				upgrade = document.createElement("div"),
+				note = document.createElement("span");
+
+			upgrade.classList.add("indent");
+			note.classList.add("note");
+
+			upgrade.append(App.UI.DOM.passageLink("Use a higher-quality fertilizer", "Farmyard", () => {
+				cashX(forceNeg(fertilizerCost));
+				farmyardUpgrades.fertilizer = 1;
+			}));
+			note.append(` Costs ${cashFormat(fertilizerCost)} and moderately increases crop yield and slightly increases upkeep costs.`);
+
+			upgrade.append(note);
+			frag.append(upgrade);
+		} else {
+			const desc = document.createElement("div");
+
+			desc.append(`${V.farmyardNameCaps} is using a higher-quality fertilizer, moderately increasing the amount of crops it produces and raising slightly raising upkeep costs.`);
+
+			frag.append(desc);
+
+			if (!farmyardUpgrades.hydroponics) {
+				const
+					upgrade = document.createElement("div"),
+					note = document.createElement("span");
+
+				upgrade.classList.add("indent");
+				note.classList.add("note");
+
+				upgrade.append(App.UI.DOM.passageLink("Purchase an advanced hydroponics system", "Farmyard", () => {
+					cashX(forceNeg(hydroponicsCost));
+					farmyardUpgrades.hydroponics = 1;
+				}));
+
+				note.append(` Costs ${cashFormat(hydroponicsCost)} and moderately decreases upkeep costs.`);
+
+				upgrade.append(note);
+				frag.append(upgrade);
+			} else {
+				const desc = document.createElement("div");
+
+				desc.append(`${V.farmyardNameCaps} is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus moderately reducing upkeep costs.`);
+
+				frag.append(desc);
+
+				if (!farmyardUpgrades.seeds) {
+					const
+						upgrade = document.createElement("div"),
+						note = document.createElement("span");
+
+					upgrade.classList.add("indent");
+					note.classList.add("note");
+
+					upgrade.append(App.UI.DOM.passageLink("Purchase genetically modified seeds", "Farmyard", () => {
+						cashX(forceNeg(seedsCost));
+						farmyardUpgrades.seeds = 1;
+					}));
+
+					note.append(` Costs ${cashFormat(seedsCost)} and moderately increases crop yield and slightly increases upkeep costs.`);
+
+					upgrade.append(note);
+					frag.append(upgrade);
+				} else {
+					const desc = document.createElement("div");
+
+					desc.append(`${V.farmyardNameCaps} is using genetically modified seeds, significantly increasing the amount of crops it produces and moderately increasing upkeep costs.`);
+
+					frag.append(desc);
+
+					if (!farmyardUpgrades.machinery) {
+						const
+							upgrade = document.createElement("div"),
+							note = document.createElement("span");
+
+						upgrade.classList.add("indent");
+						note.classList.add("note");
+
+						upgrade.append(App.UI.DOM.passageLink("Upgrade the machinery", "Farmyard", () => {
+							cashX(forceNeg(machineryCost));
+							farmyardUpgrades.machinery = 1;
+						}));
+
+						note.append(` Costs ${cashFormat(machineryCost)} and moderately increases crop yield and slightly increases upkeep costs.`);
+
+						upgrade.append(note);
+						frag.append(upgrade);
+					} else {
+						const desc = document.createElement("div");
+
+						desc.append(`The machinery in ${V.farmyardName} has been upgraded, and is more efficient, significantly increasing crop yields and significantly decreasing upkeep costs.`);
+
+						frag.append(desc);
+					}
+				}
+			}
+		}
+	}
+
+	return frag;
+};
+
+App.Facilities.Farmyard.animalHousing = function() {
+	const frag = new DocumentFragment(),
+
+		baseCost = Math.trunc(5000 * V.upgradeMultiplierArcology),
+		upgradedCost = Math.trunc(10000 * V.upgradeMultiplierArcology);
+
+	let
+		farmyardKennels = V.farmyardKennels,
+		farmyardStables = V.farmyardStables,
+		farmyardCages = V.farmyardCages;
+
+
+
+	// MARK: Kennels
+
+	const
+		CL = V.canines.length,
+
+		dogs = CL === 1 ? V.canines[0] : CL < 3 ?
+			`several different breeds of dogs` :
+			`all kinds of dogs`,
+		canines = CL === 1 ? V.canines[0].species === "dog" ?
+			V.canines[0].breed : V.canines[0].speciesPlural : CL < 3 ?
+				`several different ${V.canines.every(
+					c => c.species === "dog") ?
+					`breeds of dogs` : `species of canines`}` :
+				`all kinds of canines`,
+
+		kennels = document.createElement("div"),
+		kennelsNote = document.createElement("span"),
+		kennelsUpgrade = document.createElement("div");
+
+	kennelsNote.classList.add("note");
+	kennelsUpgrade.classList.add("indent");
+
+	if (farmyardKennels === 0) {
+		kennels.append(App.UI.DOM.passageLink("Add kennels", "Farmyard",
+			() => {
+				cashX(forceNeg(baseCost));
+				V.farmyardKennels = 1;
+			}));
+
+		kennelsNote.append(` Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic canines`);
+
+		kennels.append(kennelsNote);
+	} else if (farmyardKennels === 1) {
+		kennels.append(App.UI.DOM.passageLink("Kennels", "Farmyard Animals"));
+		kennels.append(` have been built in one corner of ${V.farmyardName}, and are currently ${CL < 1 ? `empty` : `occupied by ${dogs}.`}`);
+
+		if (V.rep > 10000) {
+			kennelsUpgrade.append(App.UI.DOM.passageLink("Upgrade kennels", "Farmyard",
+				() => {
+					cashX(forceNeg(upgradedCost));
+					V.farmyardKennels = 2;
+				}));
+
+			kennelsNote.append(` Costs ${cashFormat(upgradedCost)}, will incur additional upkeep costs, and unlocks exotic canines`);
+
+			kennelsUpgrade.append(kennelsNote);
+			kennels.append(kennelsUpgrade);
+		}
+	} else if (farmyardKennels === 2) {
+		kennels.append(App.UI.DOM.passageLink("Large kennels", "Farmyard Animals"));
+		kennels.append(` have been built in one corner of ${V.farmyardName}, and are currently ${CL < 1 ? `empty` : `occupied by ${canines}`} `);
+	}
+
+
+
+	// MARK: Stables
+
+	const
+		HL = V.hooved.length,
+
+		hooved = HL === 1 ? V.hooved[0] : HL < 3 ?
+			`several different types of hooved animals` :
+			`all kinds of hooved animals`,
+
+		stables = document.createElement("div"),
+		stablesNote = document.createElement("span"),
+		stablesUpgrade = document.createElement("div");
+
+	stablesNote.classList.add("note");
+	stablesUpgrade.classList.add("indent");
+
+	if (farmyardStables === 0) {
+		stables.append(App.UI.DOM.passageLink("Add stables", "Farmyard",
+			() => {
+				cashX(forceNeg(baseCost));
+				V.farmyardStables = 1;
+			}));
+
+		stablesNote.append(` Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic hooved animals`);
+
+		stables.append(stablesNote);
+	} else if (farmyardStables === 1) {
+		stables.append(App.UI.DOM.passageLink("Stables", "Farmyard Animals"));
+		stables.append(` have been built in one corner of ${V.farmyardName}, and are currently ${HL < 1 ? `empty` : `occupied by ${hooved}.`}`);
+
+		if (V.rep > 10000) {
+			stablesUpgrade.append(App.UI.DOM.passageLink("Upgrade stables", "Farmyard",
+				() => {
+					cashX(forceNeg(upgradedCost));
+					V.farmyardStables = 2;
+				}));
+
+			stablesNote.append(` Costs ${cashFormat(upgradedCost)}, will incur additional upkeep costs, and unlocks exotic hooved animals`);
+
+			stablesUpgrade.append(stablesNote);
+			stables.append(stablesUpgrade);
+		}
+	} else if (farmyardStables === 2) {
+		stables.append(App.UI.DOM.passageLink("Large stables", "Farmyard Animals"));
+		stables.append(` have been built in one corner of ${V.farmyardName}, and are currently ${HL < 1 ? `empty` : `occupied by ${hooved}`} `);
+	}
+
+
+
+	// MARK: Cages
+
+	const
+		FL = V.felines.length,
+
+		cats = FL === 1 ? V.felines[0] : FL < 3 ?
+			`several different breeds of cats` :
+			`all kinds of cats`,
+		felines = FL === 1 ? V.felines[0].species === "cat" ?
+			V.felines[0].breed : V.felines[0].speciesPlural : FL < 3 ?
+				`several different ${V.felines.every(
+					c => c.species === "cat") ?
+					`breeds of cats` : `species of felines`}` :
+				`all kinds of felines`,
+
+		cages = document.createElement("div"),
+		cagesNote = document.createElement("span"),
+		cagesUpgrade = document.createElement("div");
+
+	cagesNote.classList.add("note");
+	cagesUpgrade.classList.add("indent");
+
+	if (farmyardCages === 0) {
+		cages.append(App.UI.DOM.passageLink("Add cages", "Farmyard",
+			() => {
+				cashX(forceNeg(baseCost));
+				V.farmyardCages = 1;
+			}));
+
+		cagesNote.append(` Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic felines`);
+
+		cages.append(cagesNote);
+	} else if (farmyardCages === 1) {
+		cages.append(App.UI.DOM.passageLink("Cages", "Farmyard Animals"));
+		cages.append(` have been built in one corner of ${V.farmyardName}, and are currently ${FL < 1 ? `empty` : `occupied by ${cats}.`}`);
+
+		if (V.rep > 10000) {
+			cagesUpgrade.append(App.UI.DOM.passageLink("Upgrade cages", "Farmyard",
+				() => {
+					cashX(forceNeg(upgradedCost));
+					V.farmyardCages = 2;
+				}));
+
+			cagesNote.append(` Costs ${cashFormat(upgradedCost)}, will incur additional upkeep costs, and unlocks exotic felines`);
+
+			cagesUpgrade.append(cagesNote);
+			cages.append(cagesUpgrade);
+		}
+	} else if (farmyardCages === 2) {
+		cages.append(App.UI.DOM.passageLink("Large cages", "Farmyard Animals"));
+		cages.append(` have been built in one corner of ${V.farmyardName}, and are currently ${FL < 1 ? `empty` : `occupied by ${felines}`} `);
+	}
+
+
+
+	// MARK: Remove Housing
+
+	const
+		removeHousing = document.createElement("div"),
+		removeCost = ((farmyardKennels + farmyardStables + farmyardCages) * 5000) * V.upgradeMultiplierArcology;
+
+	if (farmyardKennels || farmyardStables || farmyardCages) {
+		removeHousing.append(document.createElement("br"));
+
+		removeHousing.append(App.UI.DOM.passageLink("Remove the animal housing", "Farmyard",
+			() => {
+				V.farmyardKennels = 0;
+				V.farmyardStables = 0;
+				V.farmyardCages = 0;
+
+				V.farmyardShows = 0;
+				V.farmyardBreeding = 0;
+				V.farmyardRestraints = 0;
+
+				V.canines = [];
+				V.hooved = [];
+				V.felines = [];
+
+				App.Facilities.Farmyard.clearAnimalsBought();
+			}));
+
+		removeHousing.append(` Will cost ${cashFormat(removeCost)}`);
+	}
+
+
+
+	frag.append(" ", kennels);
+	frag.append(" ", stables);
+	frag.append(" ", cages);
+	frag.append(" ", removeHousing);
+
+	return frag;
+};
diff --git a/src/facilities/farmyard/farmyard.tw b/src/facilities/farmyard/farmyard.tw
index 60d10497b5c54964ad83dc078deb82b11b090c34..f86e94f17325ec1f3aa2b260f6012bea1daa9c6b 100644
--- a/src/facilities/farmyard/farmyard.tw
+++ b/src/facilities/farmyard/farmyard.tw
@@ -12,58 +12,58 @@
 
 <<set _CL = $canines.length, _HL = $hooved.length, _FL = $felines.length, _FyL = App.Entity.facilities.farmyard.employeesIDs().size>>
 <p class="scene-intro">
-	$farmyardNameCaps is an oasis of growth in the midst of the jungle of steel and concrete that is $arcologies[0].name. Animals are kept in pens, tended to by your slaves, while <<if $farmyardUpgrade.hydroponics == 1>>rows of hydroponics equipment<<else>>makeshift fields<</if>> grow crops.
+	$farmyardNameCaps is an oasis of growth in the midst of the jungle of steel and concrete that is $arcologies[0].name. Animals are kept in pens, tended to by your slaves, while <<if $farmyardUpgrades.hydroponics == 1>>rows of hydroponics equipment<<else>>makeshift fields<</if>> grow crops.
 	<<switch $farmyardDecoration>>
 		<<case "Roman Revivalist">>
-			Its red tiles and white stone walls are the very picture of a Roman farm villa's construction, as are the marble statues and reliefs. Saturn and Ceres look over the prosperity of the fields<<if $seeBestiality == 1>>, Mercury watches over the health of the animals, and Feronia ensures strong litters in your slaves.<<else>> and Mercury watches over the health of the animals.<</if>>. The slaves here are all looked after well, as they have one of the most important jobs in $arcologies[0].name.
+			Its red tiles and white stone walls are the very picture of a Roman farm villa's construction, as are the marble statues and reliefs. Saturn and Ceres look over the prosperity of the fields<<if $seeBestiality>>, Mercury watches over the health of the animals, and Feronia ensures strong litters in your slaves.<<else>> and Mercury watches over the health of the animals.<</if>>. The slaves here are all looked after well, as they have one of the most important jobs in $arcologies[0].name.
 		<<case "Aztec Revivalist">>
 			It can't completely recreate the floating farms in the ancient Aztec fashion, but it comes as close as it can, shallow pseudo-canals dividing each field into multiple sections. Smooth stone and colorful murals cover the walls, depicting bloody stories of gods and mortals alike.
 		<<case "Egyptian Revivalist">>
-			It does its best to capture the wide open nature of ancient Egyptian farms, including mimicking the irrigation systems fed by the Nile. The stone walls are decorated with murals detailing its construction and your prowess in general, <<if $seeBestiality == 1>>with animal-bloated slaves featured prominently.<<else>>hieroglyphs spelling out a volumes of praise.<</if>>
+			It does its best to capture the wide open nature of ancient Egyptian farms, including mimicking the irrigation systems fed by the Nile. The stone walls are decorated with murals detailing its construction and your prowess in general, <<if $seeBestiality>>with animal-bloated slaves featured prominently.<<else>>hieroglyphs spelling out a volumes of praise.<</if>>
 		<<case "Edo Revivalist">>
 			It does its best to mimic the rice patties and thatch roofed buildings of the Edo period despite the wide variety of crops tended by various slaves. Not every crop can thrive in flooded fields, but the ones that can take advantage of your attention to detail.
 		<<case "Arabian Revivalist">>
-			//This is a placeholder//
+			Large plots of olive trees and date palms line the outer edges of the main crop area, while a combination of wheat, flax, and barley occupies the interior space. Irrigation canals snake through the area, ensuring every inch of cropland is well-watered.
 		<<case "Chinese Revivalist">>
-			It does its best to capture the terraces that covered the ancient Chinese hills and mountains, turning every floor into ribbons of fields following a slight incline. Slaves wade through crops that can handle flooding and splash through the irrigation of the others when they aren't tending <<if $seeBestiality == 1>>or breeding with<</if>> your animals.
+			It does its best to capture the terraces that covered the ancient Chinese hills and mountains, turning every floor into ribbons of fields following a slight incline. Slaves wade through crops that can handle flooding and splash through the irrigation of the others when they aren't tending <<if $seeBestiality>>or breeding with<</if>> your animals.
 		<<case "Chattel Religionist">>
-			It runs like a well oiled machine, slaves bent in humble service as they tend crops grown on the Prophet's command, or see to the animals' needs. Their clothing is tucked up and out of the way as they see to their tasks, keeping them clean as they work <<if $seeBestiality == 1>>around animal bloated bellies<</if>> as divine will dictates.
+			It runs like a well oiled machine, slaves bent in humble service as they tend crops grown on the Prophet's command, or see to the animals' needs. Their clothing is tucked up and out of the way as they see to their tasks, keeping them clean as they work <<if $seeBestiality>>around animal bloated bellies<</if>> as divine will dictates.
 		<<case "Degradationist">>
-			It is constructed less as a converted warehouse and more as something to visit, allowing guests to enjoy the spectacle of slaves <<if $seeBestiality == 1>>being pounded by eager animals<<else>>elbow deep in scrubbing animal waste<</if>> to their satisfaction.
+			It is constructed less as a converted warehouse and more as something to visit, allowing guests to enjoy the spectacle of slaves <<if $seeBestiality>>being pounded by eager animals<<else>>elbow deep in scrubbing animal waste<</if>> to their satisfaction.
 		<<case "Repopulation Focus">>
-			It teems with life, both in the belly of every animal and the belly of every slave, though the latter makes tending the fields difficult. They're ordered to take care, as they carry the future <<if $seeBestiality == 1>>of this farm<<else>>of the arcology<</if>> in their bellies.
+			It teems with life, both in the belly of every animal and the belly of every slave, though the latter makes tending the fields difficult. They're ordered to take care, as they carry the future <<if $seeBestiality>>of this farm<<else>>of the arcology<</if>> in their bellies.
 		<<case "Eugenics">>
-			It holds a wide variety of crops and animals, but the best of the best is easy to find. They're set apart from the others, given only the best care and supplies<<if $seeBestiality == 1>>and bred with only the highest quality slaves<</if>>, while the sub-par stock is neglected off to the side.
+			It holds a wide variety of crops and animals, but the best of the best is easy to find. They're set apart from the others, given only the best care and supplies<<if $seeBestiality>>and bred with only the highest quality slaves<</if>>, while the sub-par stock is neglected off to the side.
 		<<case "Asset Expansionist">>
 			It is not easy to look after animals and till fields with such enormous body parts, but your slaves are diligent regardless, working hard to provide food and livestock for the arcology.
 		<<case "Transformation Fetishist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Gender Radicalist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Gender Fundamentalist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Physical Idealist">>
-			Its animals are in exceptional shape, their coats unable to hide how muscular they are, requiring your slaves to be equally toned to control them. There's plenty of space for their exercise as well<<if $seeBestiality == 1>> and an abundance of curatives for the slaves full of their fierce kicking offspring<</if>>.
+			Its animals are in exceptional shape, their coats unable to hide how muscular they are, requiring your slaves to be equally toned to control them. There's plenty of space for their exercise as well<<if $seeBestiality>> and an abundance of curatives for the slaves full of their fierce kicking offspring<</if>>.
 		<<case "Supremacist">>
 			It is a clean and orderly operation, stables and cages mucked by a multitude of inferior slaves, along with grooming your animals and harvesting your crops.
 		<<case "Subjugationist">>
 			It is a clean and orderly operation, stables and cages mucked by a multitude of $arcologies[0].FSSubjugationistRace slaves, while the others are tasked with grooming your animals and harvesting your crops.
 		<<case "Paternalist">>
-			It's full of healthy animals, crops, and slaves, the former's every need diligently looked after by the latter. The fields flourish to capacity under such care, and the animals give the distinct impression of happiness. <<if $seeBestiality == 1>>Some more than others if the growing bellies of your slaves are anything to go by, the only indication that such rutting takes place.<</if>>	/* TODO: this sentence seems weird */
+			It's full of healthy animals, crops, and slaves, the former's every need diligently looked after by the latter. The fields flourish to capacity under such care, and the animals give the distinct impression of happiness<<if $seeBestiality>> — some more than others if the growing bellies of your slaves are anything to go by, the only indication that such rutting takes place<</if>>.
 		<<case "Pastoralist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Maturity Preferentialist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Youth Preferentialist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Body Purist">>
-			//This is a placeholder//
+			/* TODO: */
 		<<case "Slimness Enthusiast">>
 			It features trim animals and slaves alike, not a pound of excess among them. The feed for both livestock and crops are carefully maintained to ensure optimal growth without waste, letting them flourish without being weighed down.
 		<<case "Hedonistic">>
-			It features wider gates and stalls, for both the humans visiting or tending the occupants, and the animals starting to mimic their handlers <<if $seeBestiality == 1>>and company<</if>>, with plenty of seats along the way.
+			It features wider gates and stalls, for both the humans visiting or tending the occupants, and the animals starting to mimic their handlers <<if $seeBestiality>>and company<</if>>, with plenty of seats along the way.
 		<<default>>
-			It is very much a converted warehouse still, sectioned off in various 'departments'<<if $farmyardUpgrade.machinery == 1>> with machinery placed where it can be<<if $farmyardUpgrade.hydroponics > 0>> and plumbing for the hydroponics system running every which way<</if>><</if>>.
+			It is very much a converted warehouse still, sectioned off in various 'departments'<<if $farmyardUpgrades.machinery == 1>> with machinery placed where it can be<<if $farmyardUpgrades.hydroponics > 0>> and plumbing for the hydroponics system running every which way<</if>><</if>>.
 	<</switch>>
 
 	<<if _FyL > 2>>
@@ -79,7 +79,8 @@
 				<<if $farmMenials > 0>>
 					<<set $menials += $farmMenials>>
 				<</if>>
-				<<set $farmyardName = "the Farmyard", $farmyard = 0, $farmyardDecoration = "standard", $farmMenials = 0, $farmMenialsSpace = 0, $farmyardShows = 0, $farmyardBreeding = 0, $farmyardUpgrade = {pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0}, $farmyardCrops = 0, $farmyardKennels = 0, $farmyardStable = 0, $farmyardCages = 0, $activeCanine = 0, $activeHooved = 0, $activeFeline = 0, $animalsBought = {canines: 0, hooved: 0, felines: 0, labradorRetrievers: 0, germanShepherds: 0, goldenRetrievers: 0, frenchBulldogs: 0, bulldogs: 0, beagles: 0, poodles: 0, rottweilers: 0, yorkshireTerriers: 0, siberianHuskies: 0, horses: 0, bulls: 0, pigs: 0, siameses: 0, persians: 0, maineCoons: 0, ragdolls: 0, bengals: 0, abbysinians: 0, birmans: 0, orientalShorthairs: 0, sphynxes: 0, russianBlues: 0, wolves: 0, foxes: 0, jackals: 0, dingos: 0, zebras: 0, cougars: 0, jaguars: 0, pumas: 0, lynx: 0, leopards: 0, lions: 0, tigers: 0}, $pitAnimal = 0, $pitAnimalType = 0, $canines = [], $hooved = [], $felines = []>>
+				<<set $farmyardName = "the Farmyard", $farmyard = 0, $farmyardDecoration = "standard", $farmMenials = 0, $farmMenialsSpace = 0, $farmyardShows = 0, $farmyardBreeding = 0, $farmyardUpgrade = {pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0}, $farmyardCrops = 0, $farmyardKennels = 0, $farmyardStables = 0, $farmyardCages = 0, $activeCanine = 0, $activeHooved = 0, $activeFeline = 0, $pitAnimal = 0, $pitAnimalType = 0, $canines = [], $hooved = [], $felines = []>>
+				<<run App.Facilities.Farmyard.clearAnimalsBought()>>
 				<<run App.Arcology.cellUpgrade($building, App.Arcology.Cell.Manufacturing, "Farmyard", "Manufacturing")>>
 			<</link>>
 		</div>
@@ -226,236 +227,17 @@
 </span>
 
 <span id="upgrades">
-<<if $farmyardUpgrade.pump == 0>>
-	[[Upgrade the water pump|Farmyard][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "farmyard"), $farmyardUpgrade.pump = 1]]
-	<span class="note">
-		Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and slightly increases crop yield.
-	</span>
-	<br>
-<<else>>
-	The water pump in $farmyardName is a more efficient model, slightly improving the amount of crops $farmyardName produces.
-	<br>
-	<<if $farmyardUpgrade.fertilizer == 0>>
-		[[Use a higher-quality fertilizer|Farmyard][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "farmyard"), $farmyardUpgrade.fertilizer = 1]]
-		<span class="note">
-			Costs <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>> moderately increases crop yield and slightly increases upkeep costs.
-		</span>
-		<br>
-	<<else>>
-		$farmyardNameCaps is using a higher-quality fertilizer, moderately increasing the amount of crops it produces and raising slightly raising upkeep costs.
-		<br>
-		<<if $farmyardUpgrade.hydroponics == 0>>
-			[[Purchase a hydroponics system|Farmyard][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "farmyard"), $farmyardUpgrade.hydroponics = 1]]
-			<span class="note">
-				Costs <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>> and moderately decreases upkeep costs.
-			</span>
-			<br>
-		<<else>>
-			$farmyardNameCaps is outfitted with an advanced hydroponics system, reducing the amount of water your crops consume and thus moderately reducing upkeep costs.
-			<br>
-			<<if $farmyardUpgrade.seeds == 0>>
-				[[Purchase genetically modified seeds|Farmyard][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"),$farmyardUpgrade.seeds = 1]]
-				<span class="note">
-					Costs <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology))>> and significantly increases crop yield and moderately increases upkeep costs.
-				</span>
-				<br>
-			<<else>>
-				$farmyardNameCaps is using genetically modified seeds, significantly increasing the amount of crops it produces and moderately increasing upkeep costs.
-				<br>
-				<<if $farmyardUpgrade.machinery == 0>>
-					[[Upgrade the machinery|Farmyard][cashX(forceNeg(Math.trunc(50000*$upgradeMultiplierArcology)), "farmyard"), $farmyardUpgrade.machinery = 1]]
-					<span class="note">
-						Costs <<print cashFormat(Math.trunc(50000*$upgradeMultiplierArcology))>> significantly increases crop yield and significantly decreases upkeep costs.
-					</span>
-					<br>
-				<<else>>
-					The machinery in $farmyardName has been upgraded, and is more efficient, significantly increasing crop yields and significantly decreasing upkeep costs.
-					<br>
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
+<<includeDOM App.Facilities.Farmyard.upgrades()>>
+<br>
 </span>
 
 <span id="animalhousing">
-<<if ($farmyardKennels == 0)>>
-	<br>
-	[[Add kennels|Farmyard][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "farmyard"), $farmyardKennels = 1]]
-	<span class="note">
-		Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and allows you to keep dogs
-	</span>
-	<br>
-<<elseif ($farmyardKennels == 1)>>
-	<br>
-	<<link "Kennels" "FarmyardAnimals">><</link>> have been built in one corner of $farmyardName, and are currently <<if _CL <= 0>>empty.<<else>>occupied by
-		<<if _CL == 1>>
-			<<print $canines>>.
-		<<elseif _CL <= 3>>
-			a couple different breeds of dogs.
-		<<else>>
-			all kinds of dogs.
-		<</if>>
-	<</if>>
-
-	<<if $rep > 10000>>
-	<br>
-		[[Upgrade kennels|Farmyard][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $farmyardKennels = 2]]
-		<span class="note">
-			Costs <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology))>> and allows you to keep exotic canines
-		</span>
-	<</if>>
-<<elseif ($farmyardKennels == 2)>>
-	<br>
-	<<link "Large kennels" "FarmyardAnimals">><</link>> have been built in one corner of $farmyardName, and are currently <<if _CL <= 0>>empty.<<else>>occupied by
-		<<if _CL == 1>>
-			<<print $canines>>.
-		<<elseif _CL <= 3>>
-			a couple different
-			<<set $onlyDogs = $canines.every(c => c.species == "dog")>>
-			<<if $onlyDogs>>
-				breeds of dogs.
-			<<else>>
-				types of canines.
-			<</if>>
-		<<else>>
-			all kinds of canines.
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if ($farmyardStable == 0)>>
-	<br>
-	[[Add stables|Farmyard][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "farmyard"), $farmyardStable = 1]]
-	<span class="note">
-		Costs <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>> and allows you to keep hooved animals
-	</span>
-	<br>
-<<elseif ($farmyardStable == 1)>>
-	<br>
-	<<link "Stables" "FarmyardAnimals">><</link>> have been built at the far end of $farmyardName, and are currently <<if _HL <= 0>>empty.<<else>>occupied by
-		<<if _HL == 1>>
-			<<print $hooved>>.
-		<<elseif _HL <= 3>>
-			a couple different types of hooved animals.
-		<<else>>
-			all kinds of hooved animals.
-		<</if>>
-	<</if>>
-	<<if $rep > 15000>>
-	<br>
-		[[Upgrade stables|Farmyard][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $farmyardStable = 2]]
-		<span class="note">
-			Costs <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology))>> and allows you to keep exotic hooved animals
-		</span>
-	<</if>>
-<<elseif $farmyardStable == 2>>
-	<br>
-	<<link "Large stables" "FarmyardAnimals">><</link>> have been build at the far end of $farmyardName, and are currently <<if _HL <= 0>>empty.<<else>>occupied by
-		<<if _HL == 1>>
-			<<print $hooved>>.
-		<<elseif _HL <= 3>>
-			a couple different types of hooved animals.
-		<<else>>
-			all kinds of hooved animals.
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if ($farmyardCages == 0)>>
-	<br>
-	[[Add cages|Farmyard][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "farmyard"), $farmyardCages = 1]]
-	<span class="note">
-		Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and allows you to keep cats
-	</span>
-	<br>
-<<elseif ($farmyardCages == 1)>>
-	<br>
-	<<link "Cages" "FarmyardAnimals">><</link>> have been built in one corner of $farmyardName, and are currently <<if _FL <= 0>>empty.<<else>>occupied by
-		<<if _FL == 1>>
-			<<print $felines>>.
-		<<elseif _FL <= 3>>
-			a couple different breeds of cats.
-		<<else>>
-			all kinds of cats.
-		<</if>>
-	<</if>>
-	<<if $rep > 15000>>
-		<br>
-		[[Upgrade cages|Farmyard][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $farmyardCages = 2]]
-		<span class="note">
-			Costs <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology))>> and allows to keep exotic felines
-		</span>
-	<</if>>
-	<br>
-<<elseif ($farmyardCages == 2)>>
-	<br>
-	<<link "Large cages" "FarmyardAnimals">><</link>> have been built in one corner of $farmyardName, and are currently <<if _FL <= 0>>empty.<<else>>occupied by
-		<<if _FL == 1>>
-			<<print $felines>>.
-		<<elseif _FL <= 3>>
-			a couple different
-			<<set $onlyCats = $felines.every(f => f.species == "cat")>>
-			<<if $onlyCats>>
-				breeds of cats.
-			<<else>>
-				types of felines.
-			<</if>>
-		<<else>>
-			all kinds of felines.
-		<</if>>
-	<</if>>
-	<br>
-<</if>>
-<br>
-
-<<if $farmyardKennels > 0 || $farmyardStable > 0 || $farmyardCages > 0>>
-	<<set _removeCost = Math.trunc(($farmyardKennels+$farmyardStable+$farmyardCages)*5000)*$upgradeMultiplierArcology>>
-	[[Remove the animal housing|Farmyard][cashX(forceNeg(_removeCost), "farmyard"), $farmyardKennels = 0, $farmyardStable = 0, $farmyardCages = 0, $activeCanine = 0, $activeHooved = 0, $activeFeline = 0, $farmyardShows = 0, $farmyardBreeding = 0, $farmyardRestraints = 0, $animalsBought = {
-		canines: 0,
-		hooved: 0,
-		felines: 0,
-		labradorRetrievers: 0,
-		germanShepherds: 0,
-		goldenRetrievers: 0,
-		frenchBulldogs: 0,
-		bulldogs: 0,
-		beagles: 0,
-		poodles: 0,
-		rottweilers: 0,
-		yorkshireTerriers: 0,
-		siberianHuskies: 0,
-		horses: 0,
-		siameses: 0,
-		persians: 0,
-		maineCoons: 0,
-		ragdolls: 0,
-		bengals: 0,
-		abbysinians: 0,
-		birmans: 0,
-		orientalShorthairs: 0,
-		sphynxes: 0,
-		russianBlues: 0,
-		wolves: 0,
-		foxes: 0,
-		jackals: 0,
-		dingos: 0,
-		zebras: 0,
-		cougars: 0,
-		jaguars: 0,
-		pumas: 0,
-		lynx: 0,
-		leopards: 0,
-		lions: 0,
-		tigers: 0
-		}, $canines = [], $hooved = [], $felines = []]]
-	//Will cost @@.yellowgreen;<<print cashFormat(_removeCost)>>@@//
-<</if>>
+<<includeDOM App.Facilities.Farmyard.animalHousing()>>
 </span>
 
 <br><hr><br>
 
-<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard)>>
+<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard)>>
 
 <br><br>Rename $farmyardName: <<textbox "$farmyardName" $farmyardName "Farmyard">> //Use a noun or similar short phrase//
 
diff --git a/src/facilities/farmyard/farmyardAnimals.tw b/src/facilities/farmyard/farmyardAnimals.tw
index 9ab40b0e9d5b48597187d3fe392dbd5652ef551f..ede08720990317141f558c395a6802701d75547f 100644
--- a/src/facilities/farmyard/farmyardAnimals.tw
+++ b/src/facilities/farmyard/farmyardAnimals.tw
@@ -1,10 +1,10 @@
-:: FarmyardAnimals [nobr]
+:: Farmyard Animals [nobr]
 
-<<set $nextButton = "Back", $nextLink = "Farmyard", $returnTo = "FarmyardAnimals", $encyclopedia = "Farmyard">>
+<<set $nextButton = "Back", $nextLink = "Farmyard", $returnTo = "Farmyard Animals", $encyclopedia = "Farmyard">>
 
 /* TODO: write some descriptions for the different animals in their cages */
 
-<<if $farmyardKennels > 0 || $farmyardStable > 0 || $farmyardCages > 0>>
+<<if $farmyardKennels > 0 || $farmyardStables > 0 || $farmyardCages > 0>>
 <br>
 ''Domestic Animals''
 <hr>
@@ -15,12 +15,14 @@
 	<br>//Cost <<print cashFormat(20000)>> each// /* TODO: this number is mostly a placeholder, will need adjusting */
 	<br>
 	<<if $animalsBought.labradorRetrievers <= 0>>
-		<<link "Purchase dogs" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.labradorRetrievers = 1, $animalsBought.canines += 1, $canines.push("Labrador Retrievers")>><</link>>
+		<<link "Purchase dogs" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.labradorRetrievers = 1, $animalsBought.canines += 1, $canines.push({
+			species: "dog", speciesPlural: "dogs", breed: "Labrador Retrievers", type: "canine", dickSize: "big", ballType: "dog"
+		})>><</link>>
 		<br>
 	<<else>>
 		Dogs
 		<<if $activeCanine.breed != "Labrador Retriever">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Labrador Retriever", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Labrador Retriever", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
@@ -28,42 +30,42 @@
 	<</if>>
 <</if>>
 
-<<if $farmyardStable > 0>>
+<<if $farmyardStables > 0>>
 	<br>
 	__Hooved Animals__
 	<br>//Cost <<print cashFormat(20000)>> each// /* TODO: this number is mostly a placeholder, will need adjusting */
 	<br>
 	<<if $animalsBought.horses <= 0>>
-		<<link "Purchase horses" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.horses = 1, $animalsBought.hooved += 1, $hooved.push("horses")>><</link>>
+		<<link "Purchase horses" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.horses = 1, $animalsBought.hooved += 1, $hooved.push("horses")>><</link>>
 		<br>
 	<<else>>
 		Horses
 		<<if $activeHooved.species != "horse">>
-			[[Set as active hooved|FarmyardAnimals][$activeHooved = {species: "horse", speciesCap: "Horse", speciesPlural: "horses", type: "hooved", dickSize: "huge", ballType: "horse"}]]
+			[[Set as active hooved|Farmyard Animals][$activeHooved = {species: "horse", speciesCap: "Horse", speciesPlural: "horses", type: "hooved", dickSize: "huge", ballType: "horse"}]]
 		<<else>>
 			//Set as active hooved//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.bulls <= 0>>
-		<<link "Purchase bulls" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bulls = 1, $animalsBought.hooved += 1, $hooved.push("bulls")>><</link>>
+		<<link "Purchase bulls" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bulls = 1, $animalsBought.hooved += 1, $hooved.push("bulls")>><</link>>
 		<br>
 	<<else>>
 		Bulls
 		<<if $activeHooved.species != "bull">>
-			[[Set as active hooved|FarmyardAnimals][$activeHooved = {species: "bull", speciesCap: "Bull", speciesPlural: "bulls", type: "hooved", dickSize: "huge", ballType: "horse"}]]
+			[[Set as active hooved|Farmyard Animals][$activeHooved = {species: "bull", speciesCap: "Bull", speciesPlural: "bulls", type: "hooved", dickSize: "huge", ballType: "horse"}]]
 		<<else>>
 			//Set as active hooved//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.pigs <= 0>>
-		<<link "Purchase pigs" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.pigs = 1, $animalsBought.hooved += 1, $hooved.push("pigs")>><</link>>
+		<<link "Purchase pigs" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.pigs = 1, $animalsBought.hooved += 1, $hooved.push("pigs")>><</link>>
 		<br>
 	<<else>>
 		Pigs
 		<<if $activeHooved.species != "pig">>
-			[[Set as active hooved|FarmyardAnimals][$activeHooved = {species: "pig", speciesCap: "Pig", speciesPlural: "pigs", type: "hooved", dickSize: "large", ballType: "horse"}]]
+			[[Set as active hooved|Farmyard Animals][$activeHooved = {species: "pig", speciesCap: "Pig", speciesPlural: "pigs", type: "hooved", dickSize: "large", ballType: "horse"}]]
 		<<else>>
 			//Set as active hooved//
 		<</if>>
@@ -73,7 +75,7 @@
 <</if>>
 <br>
 
-<<if $farmyardKennels > 1 || $farmyardStable > 1 || $farmyardCages > 1>>
+<<if $farmyardKennels > 1 || $farmyardStables > 1 || $farmyardCages > 1>>
 <br>
 ''Exotic Animals''
 <hr>
@@ -84,13 +86,15 @@
 	<br>//Cost <<print cashFormat(20000)>> each//
 	<br>
 	<<if $animalsBought.wolves <= 0>>
-		<<link "Purchase wolves" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.wolves = 1, $animalsBought.canines += 1, $canines.push("wolves")>><</link>>
+		<<link "Purchase wolves" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.wolves = 1, $animalsBought.canines += 1, $canines.push({
+			species: "wolf", speciesPlural: "wolves", type: "canine", dickSize: "large", ballType: "wolf"
+		})>><</link>>
 		<br>
 	<<else>>
 		/*A couple of adult wolves are lounging about in their kennels.(OLD)*/
 		Wolves
 		<<if $activeCanine.species != "wolf">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "wolf", speciesCap: "Wolf", speciesPlural: "wolves", type: "canine", dickSize: "large", ballType: "wolf"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "wolf", speciesCap: "Wolf", speciesPlural: "wolves", type: "canine", dickSize: "large", ballType: "wolf"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
@@ -104,13 +108,14 @@
 	<br>//Cost <<print cashFormat(30000)>> each// /* TODO: this number is mostly a placeholder, will need adjusting */
 	<br>
 	<<if $animalsBought.lions <= 0>>
-		<<link "Purchase lions" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.lions = 1, $animalsBought.felines += 1, $felines.push("lions")>><</link>>
+		<<link "Purchase lions" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.lions = 1, $animalsBought.felines += 1, $felines.push({
+			species: "lion", speciesPlural: "lions", type: "feline", dickSize: "large", ballType: "lion"})>><</link>>
 		<br>
 	<<else>>
 		/*Most of the lions are sunning themselves. (OLD)*/
 		Lions
 		<<if $activeFeline.species != "lion">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "lion", speciesCap: "Lion", speciesPlural: "lions", type: "feline", dickSize: "large", ballType: "lion"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "lion", speciesCap: "Lion", speciesPlural: "lions", type: "feline", dickSize: "large", ballType: "lion"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
diff --git a/src/facilities/farmyard/farmyardReport.tw b/src/facilities/farmyard/farmyardReport.tw
index 7d002ca8e0004040250904520b70ab5918708443..f1f3443c0b0576a383498b8498646cc3c34cac52 100644
--- a/src/facilities/farmyard/farmyardReport.tw
+++ b/src/facilities/farmyard/farmyardReport.tw
@@ -1,3 +1,3 @@
 :: Farmyard Report [nobr]
 
-<<print App.Facilities.Farmyard.farmyardReport()>>
+<<includeDOM App.Facilities.Farmyard.farmyardReport()>>
diff --git a/src/facilities/farmyard/food/foodAmount.js b/src/facilities/farmyard/food/foodAmount.js
new file mode 100644
index 0000000000000000000000000000000000000000..af0650ff655820872849bdab1d2a43bf34bd86fc
--- /dev/null
+++ b/src/facilities/farmyard/food/foodAmount.js
@@ -0,0 +1,86 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {number}
+ */
+App.Facilities.Farmyard.foodAmount = function(slave) {
+	let food = 150;
+
+	if (!slave) {
+		throw `Current slave is not valid. Please report this`;
+	}
+
+	if (V.farmyardUpgrades.pump) {
+		food += 15;
+	}
+
+	if (V.farmyardUpgrades.fertilizer) {
+		food += 35;
+	}
+
+	if (V.farmyardUpgrades.seeds) {
+		food += 65;
+	}
+
+	if (V.farmyardUpgrades.machinery) {
+		food += 65;
+	}
+
+	if (S.Farmer !== 0) {
+		food *= 1.1;
+
+		if (S.Farmer.skill.farmer >= V.masteredXP) {
+			food *= 1.2;
+		}
+
+		if (setup.farmerCareers.includes(S.Farmer.career)) {
+			food *= 1.2;
+		}
+	}
+
+	if (slave.devotion > 50) {
+		food *= 1.1;
+	} else if (slave.devotion < -50) {
+		food *= 0.8;
+	}
+
+	if (slaveResting(slave)) {
+		food *= 0.9;
+	} else if (slave.health.tired + 20 >= 90 && !willWorkToDeath(slave)) {
+		slave.devotion -= 10;
+		slave.trust -= 5;
+		food *= 0.9;
+	}
+
+	if (slave.muscles > 30) {										// slave is muscular or more
+		food *= 1.1;
+	} else if (slave.muscles <= -6) {								// slave is weak or less
+		food *= 0.8;
+	}
+
+	if (slave.weight > 95) {										// slave is overweight or more
+		food *= 0.9;
+	} else if (slave.weight > 130) {								// slave is fat or more
+		food *= 0.8;
+	} else if (slave.weight > 160) {								// slave is obese or more
+		food *= 0.7;
+	} else if (slave.weight > 190) {								// slave is very obese or more
+		food *= 0.6;
+	}
+
+	if (!canSee(slave)) {											// slave is blind
+		food *= 0.6;
+	} else if (!canSeePerfectly(slave)) {							// slave is nearsighted
+		food *= 0.8;
+	}
+
+	if (slave.hears === -1) {										// slave is hard of hearing
+		food *= 0.8;
+	} else if (slave.hears < -1) {									// slave is deaf
+		food *= 0.6;
+	}
+
+	food *= restEffects(slave, 20);
+	food = Math.trunc(Math.max(food, 1));
+
+	return food;
+};
diff --git a/src/facilities/farmyard/futureAnimals.tw b/src/facilities/farmyard/futureAnimals.tw
index eda757aaee2bf7455bb3eafbf37d40d74b2229e2..f4d1ab464f04368977ba10d8a05b8df03935f976 100644
--- a/src/facilities/farmyard/futureAnimals.tw
+++ b/src/facilities/farmyard/futureAnimals.tw
@@ -1,108 +1,108 @@
 /* Putting them here because commenting them out was breaking for some reason */
 
 	<<if $animalsBought.germanShepherds == 0>>
-		<<link "Purchase German Shepherds" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.germanShepherds = 1, $animalsBought.canines += 1, $canines.push("German Shepherds")>><</link>>
+		<<link "Purchase German Shepherds" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.germanShepherds = 1, $animalsBought.canines += 1, $canines.push("German Shepherds")>><</link>>
 		<br>
 	<<elseif $animalsBought.germanShepherds == 1>>
 		German Shepherds
 		<<if $activeCanine.breed != "German Shepherd">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "German Shepherd", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "German Shepherd", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.goldenRetrievers == 0>>
-		<<link "Purchase Golden Retrievers" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.goldenRetrievers = 1, $animalsBought.canines += 1, $canines.push("Golden Retrievers")>><</link>>
+		<<link "Purchase Golden Retrievers" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.goldenRetrievers = 1, $animalsBought.canines += 1, $canines.push("Golden Retrievers")>><</link>>
 		<br>
 	<<elseif $animalsBought.goldenRetrievers == 1>>
 		Golden Retrievers
 		<<if $activeCanine.breed != "Golden Retriever">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Golden Retriever", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Golden Retriever", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.frenchBulldogs == 0>>
-		<<link "Purchase French Bulldogs" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.frenchBulldogs = 1, $animalsBought.canines += 1, $canines.push("French Bulldogs")>><</link>>
+		<<link "Purchase French Bulldogs" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.frenchBulldogs = 1, $animalsBought.canines += 1, $canines.push("French Bulldogs")>><</link>>
 		<br>
 	<<elseif $animalsBought.frenchBulldogs == 1>>
 		French Bulldogs
 		<<if $activeCanine.breed != "French Bulldog">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "French Bulldog", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "French Bulldog", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.bulldogs == 0>>
-		<<link "Purchase Bulldogs" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bulldogs = 1, $animalsBought.canines += 1, $canines.push("Bulldogs")>><</link>>
+		<<link "Purchase Bulldogs" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bulldogs = 1, $animalsBought.canines += 1, $canines.push("Bulldogs")>><</link>>
 		<br>
 	<<elseif $animalsBought.bulldogs == 1>>
 		Bulldogs
 		<<if $activeCanine.breed != "Bulldog">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Bulldog", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Bulldog", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.beagles == 0>>
-		<<link "Purchase Beagles" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.beagles = 1, $animalsBought.canines += 1, $canines.push("Beagles")>><</link>>
+		<<link "Purchase Beagles" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.beagles = 1, $animalsBought.canines += 1, $canines.push("Beagles")>><</link>>
 		<br>
 	<<elseif $animalsBought.beagles == 1>>
 		Beagles
 		<<if $activeCanine.breed != "Beagle">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Beagle", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Beagle", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.poodles == 0>>
-		<<link "Purchase Poodles" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.poodles = 1, $animalsBought.canines += 1, $canines.push("Poodles")>><</link>>
+		<<link "Purchase Poodles" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.poodles = 1, $animalsBought.canines += 1, $canines.push("Poodles")>><</link>>
 		<br>
 	<<elseif $animalsBought.poodles == 1>>
 		Poodles
 		<<if $activeCanine.breed != "Poodle">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Poodle", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Poodle", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.rottweilers == 0>>
-		<<link "Purchase Rottweilers" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.rottweilers = 1, $animalsBought.canines += 1, $canines.push("Rottweilers")>><</link>>
+		<<link "Purchase Rottweilers" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.rottweilers = 1, $animalsBought.canines += 1, $canines.push("Rottweilers")>><</link>>
 		<br>
 	<<elseif $animalsBought.rottweilers == 1>>
 		Rottweilers
 		<<if $activeCanine.breed != "Rottweiler">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Rottweiler", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Rottweiler", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.yorkshireTerriers == 0>>
-		<<link "Purchase Yorkshire Terriers" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.yorkshireTerriers = 1, $animalsBought.canines += 1, $canines.push("Yorkshire Terriers")>><</link>>
+		<<link "Purchase Yorkshire Terriers" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.yorkshireTerriers = 1, $animalsBought.canines += 1, $canines.push("Yorkshire Terriers")>><</link>>
 		<br>
 	<<elseif $animalsBought.yorkshireTerriers == 1>>
 		Yorkshire Terriers
 		<<if $activeCanine.breed != "Yorkshire Terrier">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Yorkshire Terrier", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Yorkshire Terrier", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.siberianHuskies == 0>>
-		<<link "Purchase Siberian Huskies" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.siberianHuskies = 1, $animalsBought.canines += 1, $canines.push("Siberian Huskies")>><</link>>
+		<<link "Purchase Siberian Huskies" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.siberianHuskies = 1, $animalsBought.canines += 1, $canines.push("Siberian Huskies")>><</link>>
 		<br>
 	<<elseif $animalsBought.siberianHuskies == 1>>
 		Siberian Huskies
 		<<if $activeCanine.breed != "Siberian Husky">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Siberian Husky", type: "canine", dickSize: "big", ballType: "dog"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dog", speciesCap: "Dog", speciesPlural: "dogs", breed: "Siberian Husky", type: "canine", dickSize: "big", ballType: "dog"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
@@ -114,120 +114,120 @@
 	Cats:
 	<br><br>
 	<<if $animalsBought.siameses == 0>>
-		<<link "Purchase Siamese cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.siameses = 1, $animalsBought.felines += 1, $felines.push("Siamese cats")>><</link>>
+		<<link "Purchase Siamese cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.siameses = 1, $animalsBought.felines += 1, $felines.push("Siamese cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.siameses == 1>>
 		Siamese cats
 		<<if $activeFeline.breed != "Siamese">>
-			[[Set as active canine|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Siamese", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active canine|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Siamese", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.persians == 0>>
-		<<link "Purchase Persian cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.persians = 1, $animalsBought.felines += 1, $felines.push("Persian cats")>><</link>>
+		<<link "Purchase Persian cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.persians = 1, $animalsBought.felines += 1, $felines.push("Persian cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.persians == 1>>
 		Persian cats
 		<<if $activeFeline.breed != "Persian">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Persian", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Persian", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.maineCoons == 0>>
-		<<link "Purchase Maine Coon cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.maineCoons = 1, $animalsBought.felines += 1, $felines.push("Maine Coon cats")>><</link>>
+		<<link "Purchase Maine Coon cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.maineCoons = 1, $animalsBought.felines += 1, $felines.push("Maine Coon cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.maineCoons == 1>>
 		Maine Coon cats
 		<<if $activeFeline.breed != "Maine Coon">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Maine Coon", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Maine Coon", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.ragdolls == 0>>
-		<<link "Purchase Ragdoll cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.ragdolls = 1, $animalsBought.felines += 1, $felines.push("Ragdoll cats")>><</link>>
+		<<link "Purchase Ragdoll cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.ragdolls = 1, $animalsBought.felines += 1, $felines.push("Ragdoll cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.ragdolls == 1>>
 		Ragdoll cats
 		<<if $activeFeline.breed != "Ragdoll">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Ragdoll", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Ragdoll", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.bengals == 0>>
-		<<link "Purchase Bengal cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bengals = 1, $animalsBought.felines += 1, $felines.push("Bengal cats")>><</link>>
+		<<link "Purchase Bengal cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.bengals = 1, $animalsBought.felines += 1, $felines.push("Bengal cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.bengals == 1>>
 		Bengal cats
 		<<if $activeFeline.breed != "Bengal">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Bengal", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Bengal", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.abbysinians == 0>>
-		<<link "Purchase Abbysinian cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.abbysinians = 1, $animalsBought.felines += 1, $felines.push("Abbysinian cats")>><</link>>
+		<<link "Purchase Abbysinian cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.abbysinians = 1, $animalsBought.felines += 1, $felines.push("Abbysinian cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.abbysinians == 1>>
 		Abbysinian cats
 		<<if $activeFeline.breed != "Abbysinian">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Abbysinian", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Abbysinian", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.birmans == 0>>
-		<<link "Purchase Birman cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.birmans = 1, $animalsBought.felines += 1, $felines.push("Birman cats")>><</link>>
+		<<link "Purchase Birman cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.birmans = 1, $animalsBought.felines += 1, $felines.push("Birman cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.birmans == 1>>
 		Birman cats
 		<<if $activeFeline.breed != "Birman">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Birman", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Birman", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.orientalShorthairs == 0>>
-		<<link "Purchase Oriental Shorthair cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.orientalShorthairs = 1, $animalsBought.felines += 1, $felines.push("Oriental Shorthair cats")>><</link>>
+		<<link "Purchase Oriental Shorthair cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.orientalShorthairs = 1, $animalsBought.felines += 1, $felines.push("Oriental Shorthair cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.orientalShorthairs == 1>>
 		Oriental Shorthair cats
 		<<if $activeFeline.breed != "Oriental Shorthair">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Oriental Shorthair", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Oriental Shorthair", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.sphynxes == 0>>
-		<<link "Purchase Sphynx cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.sphynxes = 1, $animalsBought.felines += 1, $felines.push("Sphynx cats")>><</link>>
+		<<link "Purchase Sphynx cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.sphynxes = 1, $animalsBought.felines += 1, $felines.push("Sphynx cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.sphynxes == 1>>
 		Sphynx cats
 		<<if $activeFeline.breed != "Sphynx">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Sphynx", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Sphynx", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.russianBlues == 0>>
-		<<link "Purchase Russian Blue cats" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.russianBlues = 1, $animalsBought.felines += 1, $felines.push("Russian Blue cats")>><</link>>
+		<<link "Purchase Russian Blue cats" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.russianBlues = 1, $animalsBought.felines += 1, $felines.push("Russian Blue cats")>><</link>>
 		<br>
 	<<elseif $animalsBought.russianBlues == 1>>
 		Russian Blue cats
 		<<if $activeFeline.breed != "Russian Blue">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Russian Blue", type: "feline", dickSize: "small", ballType: "cat"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cat", speciesCap: "Cat", speciesPlural: "cats", breed: "Russian Blue", type: "feline", dickSize: "small", ballType: "cat"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
@@ -236,39 +236,39 @@
 <</if>>
 
 	<<if $animalsBought.foxes == 0>>
-		<<link "Purchase foxes" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.foxes = 1, $animalsBought.canines += 1, $canines.push("foxes")>><</link>>
+		<<link "Purchase foxes" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.foxes = 1, $animalsBought.canines += 1, $canines.push("foxes")>><</link>>
 		<br>
 	<<elseif $animalsBought.foxes == 1>>
 		/*Red foxes play in one corner of their kennels, chasing one another.(OLD)*/
 		Foxes
 		<<if $activeCanine.species != "fox">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "fox", speciesCap: "Fox", speciesPlural: "foxes", type: "canine", dickSize: "large", ballType: "fox"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "fox", speciesCap: "Fox", speciesPlural: "foxes", type: "canine", dickSize: "large", ballType: "fox"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.jackals == 0>>
-		<<link "Purchase jackals" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.jackals = 1, $animalsBought.canines += 1, $canines.push("jackals")>><</link>>
+		<<link "Purchase jackals" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.jackals = 1, $animalsBought.canines += 1, $canines.push("jackals")>><</link>>
 		<br>
 	<<elseif $animalsBought.jackals == 1>>
 		/*A group of male jackals are fighting over a potential mate, causing quite a ruckus.(OLD)*/
 		Jackals
 		<<if $activeCanine.species != "jackal">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "jackal", speciesCap: "Jackal", speciesPlural: "jackals", type: "canine", dickSize: "large", ballType: "jackal"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "jackal", speciesCap: "Jackal", speciesPlural: "jackals", type: "canine", dickSize: "large", ballType: "jackal"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.dingos == 0>>
-		<<link "Purchase dingos" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.dingos = 1, $animalsBought.canines += 1, $canines.push("dingos")>><</link>>
+		<<link "Purchase dingos" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.dingos = 1, $animalsBought.canines += 1, $canines.push("dingos")>><</link>>
 		<br>
 	<<elseif $animalsBought.dingos == 1>>
 		/*The dingos are eating their meal, growling at each other when one gets to close to another's food.(OLD)*/
 		Dingos
 		<<if $activeCanine.species != "dingo">>
-			[[Set as active canine|FarmyardAnimals][$activeCanine = {species: "dingo", speciesCap: "Dingo", speciesPlural: "dingos", type: "canine", dickSize: "large", ballType: "dingo"}]]
+			[[Set as active canine|Farmyard Animals][$activeCanine = {species: "dingo", speciesCap: "Dingo", speciesPlural: "dingos", type: "canine", dickSize: "large", ballType: "dingo"}]]
 		<<else>>
 			//Set as active canine//
 		<</if>>
@@ -276,16 +276,16 @@
 	<</if>>
 
 
-<<if $farmyardStable > 1>>
+<<if $farmyardStables > 1>>
 	<br>
 	Hooved Animals:
 	<br><br>
 	<<if $animalsBought.zebras == 0>>
-		<<link "Purchase zebras" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.zebras = 1, $animalsBought.hooved += 1, $hooved.push("zebras")>><</link>>
+		<<link "Purchase zebras" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.zebras = 1, $animalsBought.hooved += 1, $hooved.push("zebras")>><</link>>
 	<<elseif $animalsBought.zebras == 1>>
 		Zebras
 		<<if $activeHooved.species != "zebra">>
-			[[Set as active hooved|FarmyardAnimals][$activeHooved = {species: "zebra", speciesCap: "Zebra", speciesPlural: "zebras", type: "hooved", dickSize: "huge", ballType: "zebra"}]]
+			[[Set as active hooved|Farmyard Animals][$activeHooved = {species: "zebra", speciesCap: "Zebra", speciesPlural: "zebras", type: "hooved", dickSize: "huge", ballType: "zebra"}]]
 		<<else>>
 			//Set as active hooved//
 		<</if>>
@@ -294,65 +294,65 @@
 <</if>>
 
 <<if $animalsBought.cougars == 0>>
-		<<link "Purchase cougars" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.cougars = 1, $animalsBought.felines += 1, $felines.push("cougars")>><</link>>
+		<<link "Purchase cougars" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.cougars = 1, $animalsBought.felines += 1, $felines.push("cougars")>><</link>>
 		<br>
 	<<elseif $animalsBought.cougars == 1>>
 		/*The cougars are sleeping, their lean bodies scattered around under trees. (OLD)*/
 		Cougars
 		<<if $activeFeline.species != "cougar">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "cougar", speciesCap: "Cougar", speciesPlural: "cougars", type: "feline", dickSize: "large", ballType: "cougar"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "cougar", speciesCap: "Cougar", speciesPlural: "cougars", type: "feline", dickSize: "large", ballType: "cougar"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.jaguars == 0>>
-		<<link "Purchase jaguars" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.jaguars = 1, $animalsBought.felines += 1, $felines.push("jaguars")>><</link>>
+		<<link "Purchase jaguars" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.jaguars = 1, $animalsBought.felines += 1, $felines.push("jaguars")>><</link>>
 		<br>
 	<<elseif $animalsBought.jaguars == 1>>
 		/*You can see a few jaguars laying around in the trees in their enclosure. (OLD)*/
 		Jaguars
 		<<if $activeFeline.species != "jaguar">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "jaguar", speciesCap: "Jaguar", speciesPlural: "jaguars", type: "feline", dickSize: "large", ballType: "jaguar"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "jaguar", speciesCap: "Jaguar", speciesPlural: "jaguars", type: "feline", dickSize: "large", ballType: "jaguar"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.lynx == 0>>
-		<<link "Purchase lynxs" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.lynx = 1, $animalsBought.felines += 1, $felines.push("lynx")>><</link>>
+		<<link "Purchase lynxs" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.lynx = 1, $animalsBought.felines += 1, $felines.push("lynx")>><</link>>
 		<br>
 	<<elseif $animalsBought.lynx == 1>>
 		/*The lynxes are playfully running around their enclosure. (OLD)*/
 		Lynx
 		<<if $activeFeline.species != "lynx">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "lynx", speciesCap: "Lynx", speciesPlural: "lynx", type: "feline", dickSize: "large", ballType: "lynx"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "lynx", speciesCap: "Lynx", speciesPlural: "lynx", type: "feline", dickSize: "large", ballType: "lynx"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.leopards == 0>>
-		<<link "Purchase leopards" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.leopards = 1, $animalsBought.felines += 1, $felines.push("leopards")>><</link>>
+		<<link "Purchase leopards" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.leopards = 1, $animalsBought.felines += 1, $felines.push("leopards")>><</link>>
 		<br>
 	<<elseif $animalsBought.leopards == 1>>
 		/*The leopards are lazing about in the trees in their enclosure. (OLD)*/
 		Leopards
 		<<if $activeFeline.species != "leopard">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "leopard", speciesCap: "Leopard", speciesPlural: "leopards", type: "feline", dickSize: "large", ballType: "leopard"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "leopard", speciesCap: "Leopard", speciesPlural: "leopards", type: "feline", dickSize: "large", ballType: "leopard"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
 		<br>
 	<</if>>
 	<<if $animalsBought.tigers == 0>>
-		<<link "Purchase tigers" "FarmyardAnimals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.tigers = 1, $animalsBought.felines += 1, $felines.push("tigers")>><</link>>
+		<<link "Purchase tigers" "Farmyard Animals">><<set cashX(forceNeg(Math.trunc(30000*$upgradeMultiplierArcology)), "farmyard"), $animalsBought.tigers = 1, $animalsBought.felines += 1, $felines.push("tigers")>><</link>>
 		<br>
 	<<elseif $animalsBought.tigers == 1>>
 		/*Some of the tigers are swimming, and the ones that aren't are lazing about. (OLD)*/
 		Tigers
 		<<if $activeFeline.species != "tiger">>
-			[[Set as active feline|FarmyardAnimals][$activeFeline = {species: "tiger", speciesCap: "Tiger", speciesPlural: "tigers", type: "feline", dickSize: "large", ballType: "tiger"}]]
+			[[Set as active feline|Farmyard Animals][$activeFeline = {species: "tiger", speciesCap: "Tiger", speciesPlural: "tigers", type: "feline", dickSize: "large", ballType: "tiger"}]]
 		<<else>>
 			//Set as active feline//
 		<</if>>
diff --git a/src/facilities/farmyard/reports/farmyardReport.js b/src/facilities/farmyard/reports/farmyardReport.js
index e1905757b1b701bb909a612a68664c10dd0be6ce..05b0ae7a5b814ac304e302f0c80f5736a59f9a66 100644
--- a/src/facilities/farmyard/reports/farmyardReport.js
+++ b/src/facilities/farmyard/reports/farmyardReport.js
@@ -1,77 +1,57 @@
 App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
-	"use strict";
+	let frag = document.createDocumentFragment();
 
 	const
-		Farmer = V.Farmer,
-		FL = App.Entity.facilities.farmyard.employeesIDs().size;
+		slaves = App.Utils.sortedEmployees(App.Entity.facilities.farmyard),
+		devBonus = (V.farmyardDecoration !== "standard") ? 1 : 0,
+		Farmer = S.Farmer;
 
 	let
-		t = ``,
 		profits = 0,
-		foodWeek = 0;
-	let he, him, his, hers, himself, girl, loli, He, His;   // TODO: alternative method?
+		foodWeek = 0,
+		farmerBonus = 0;
 
 
 
-	// FARMER
+	// MARK: Farmer
 
-	const farmerHealth = slave => {
+	function farmerChanges() {
+		farmerHealth(Farmer);
+		farmerDevotion(Farmer);
+		farmerTrust(Farmer);
+		farmerLivingRules(Farmer);
+		farmerCashBonus(Farmer);
+	}
+
+	function farmerHealth(slave) {
 		if (slave.health.condition < -80) {
-			improveCondition(slave, 20);
+			improveCondition(Farmer, 20);
 		} else if (slave.health.condition < -40) {
-			improveCondition(slave, 15);
+			improveCondition(Farmer, 15);
 		} else if (slave.health.condition < 0) {
-			improveCondition(slave, 10);
+			improveCondition(Farmer, 10);
 		} else if (slave.health.condition < 90) {
-			improveCondition(slave, 7);
+			improveCondition(Farmer, 7);
 		}
-	};
+	}
 
-	const farmerFetish = slave => {
-		if (slave.fetish !== 'dom') {
-			if (fetishChangeChance(slave) > jsRandom(0, 100)) {
-				slave.fetishKnown = 1;
-				slave.fetish = 'dom';
-				return 1;
-			}
-		} else if (!slave.fetishKnown) {
-			slave.fetishKnown = 1;
-			return 1;
-		} else {
-			slave.fetishStrength += 4;
-			return 2;
-		}
-	};
+	function farmerDevotion(slave) {
+		slave.devotion += devBonus;
 
-	const farmerFetishEffects = (fetish = 0) => {
-		if (fetish === 1) {
-			return `${He} isn't above sampling the merchandise ${himself}; before long it's obvious to ${his} workers that ${he} <span class="lightcoral">really likes fucking them.</span> `;
-		} else if (fetish === 2) {
-			return `${He}'s careful that all of the farmhands under ${his} supervision are all ready to work every morning, and ${he} <span class="lightsalmon">becomes more dominant.</span> `;
+		if (slave.devotion < 45) {
+			slave.devotion += 5;
 		}
-	};
-
-	const farmerSkill = slave => {
-		let t = ``;
+	}
 
-		if (slave.skill.farmer <= 10) {
-			t += `Though ${slave.slaveName} does ${his} best to manage the farmyard, with ${his} lack of skill ${he} can do little. `;
-		} else if (slave.skill.farmer <= 30) {
-			t += `${slave.slaveName}'s basic skills marginally <span class="yellowgreen">improve</span> business at ${V.farmyardName}. `;
-		} else if (slave.skill.farmer <= 60) {
-			t += `${slave.slaveName}'s skills <span class="yellowgreen">improve</span> business at ${V.farmyardName}. `;
-		} else if (slave.skill.farmer < 100) {
-			t += `${slave.slaveName}'s skills greatly <span class="yellowgreen">improve</span> business at ${V.farmyardName}. `;
-		} else {
-			t += `${slave.slaveName}'s mastery immensely <span class="yellowgreen">improves</span> business at ${V.farmyardName}. `;
+	function farmerTrust(slave) {
+		if (slave.trust < 45) {
+			slave.trust += 5;
 		}
+	}
 
-		t += slave.actualAge > 35 ?`${His} age and experience also contribute. ` : ``;
-
-		return t;
-	};
+	const farmerLivingRules = slave => slave.rules.living = 'luxurious';
 
-	const farmerCashBonus = slave => {
+	function farmerCashBonus(slave) {
 		let FarmerCashBonus = Math.min(0.2, slave.skill.farmer * 0.002);
 
 		FarmerCashBonus += slave.intelligence + slave.intelligenceImplant > 15 ? 0.05 : 0;
@@ -93,6 +73,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 			FarmerCashBonus += 0.05;
 		}
 
+		// TODO: keep this?
 		if (Farmer.relationshipTarget === slave.ID) {
 			FarmerCashBonus -= 0.05;
 		} else if (areRelated(Farmer, slave)) {
@@ -100,142 +81,209 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		}
 
 		return FarmerCashBonus;
-	};
+	}
 
 
-	const farmerExperience = slave => {
-		if (setup.farmerCareers.includes(slave.career)) {
-			return `${He} has experience from ${his} life before ${he} was a slave that helps ${him} in the difficult life of managing animals and property. `;
-		} else if (slave.skill.farmer >= V.masteredXP) {
-			return `${He} has experience from working for you that helps ${him} in the difficult life of managing animals and property. `;
+
+	function farmerText() {
+		let r = [];
+
+		r.push(farmerIntro(Farmer));
+		r.push(farmerRelationshipPC(Farmer));
+		r.push(farmerFetishEffects(Farmer, farmerFetish(Farmer)));
+		r.push(farmerSkill(Farmer));
+		r.push(farmerAgeSkill(Farmer));
+		r.push(farmerExperience(Farmer));
+		r.push(farmerIntelligence(Farmer));
+		r.push(farmerSmell(Farmer));
+		r.push(farmerRelationshipSlaves(Farmer));
+		r.push(farmerContracts(Farmer));
+
+		return r.join(' ');
+	}
+
+	function farmerFetish(slave) {
+		if (slave.fetish !== 'dom') {
+			if (fetishChangeChance(slave) > jsRandom(0, 100)) {
+				slave.fetishKnown = 1;
+				slave.fetish = 'dom';
+				return 1;
+			}
+		} else if (!slave.fetishKnown) {
+			slave.fetishKnown = 1;
+			return 1;
 		} else {
-			slave.skill.farmer += jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 32));
+			slave.fetishStrength += 4;
+			return 2;
 		}
-	};
+	}
+
+	function farmerFetishEffects(slave, fetish = 0) {
+		const
+			{ he, his, himself, He } = getPronouns(slave);
 
+		if (fetish === 1) {
+			return `${He} isn't above sampling the merchandise ${himself}; before long it's obvious to ${his} workers that ${he} <span class="lightcoral">really likes fucking them.</span> `;
+		} else if (fetish === 2) {
+			return `${He}'s careful that all of the farmhands under ${his} supervision are all ready to work every morning, and ${he} <span class="lightsalmon">becomes more dominant.</span> `;
+		}
+	}
+
+	function farmerSkill(slave) {
+		const
+			{ he, his, His } = getPronouns(slave);
+
+		let r = [];
+
+		if (slave.skill.farmer <= 10) {
+			r.push(`Though ${slave.slaveName} does ${his} best to manage the farmyard, with ${his} lack of skill ${he} can do little.`);
+		} else if (slave.skill.farmer <= 30) {
+			r.push(`${slave.slaveName}'s basic skills marginally <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`);
+		} else if (slave.skill.farmer <= 60) {
+			r.push(`${slave.slaveName}'s skills <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`);
+		} else if (slave.skill.farmer < 100) {
+			r.push(`${slave.slaveName}'s skills greatly <span class="yellowgreen">improve</span> business at ${V.farmyardName}.`);
+		} else {
+			r.push(`${slave.slaveName}'s mastery immensely <span class="yellowgreen">improves</span> business at ${V.farmyardName}.`);
+		}
 
-	const farmerDick = slave => {
-		if (slave.dick > 2 && canPenetrate(slave)) {
-			return `${His} turgid dick helps ${him} manage ${his} workers. `;
+		if (slave.actualAge > 35) {
+			r.push(`${His} age and experience also contribute.`);
 		}
-	};
 
+		return r.join(' ');
+	}
+
+	function farmerExperience(slave) {
+		const { he, his, him, He } = getPronouns(slave);
+
+		if (setup.farmerCareers.includes(slave.career)) {
+			return `${He} has experience from ${his} life before ${he} was a slave that helps ${him} in the difficult life of managing animals and property.`;
+		} else if (slave.skill.farmer >= V.masteredXP) {
+			return `${He} has experience from working for you that helps ${him} in the difficult life of managing animals and property.`;
+		} else {
+			slave.skill.farmer += jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 32));
+		}
+	}
 
-	/** @param {App.Entity.SlaveState} Farmer */
 	function farmerRelationshipSlaves(Farmer) {
-		const p = getPronouns(Farmer);
-		for (const slave of App.Utils.sortedEmployees(App.Entity.facilities.farmyard)) {
+		const { he, his, He } = getPronouns(Farmer);
 
-			let t = ``;
+		for (const slave of slaves) {
+			let r = [];
 
 			if (Farmer.rivalryTarget === slave.ID) {
-				t += `${p.He} forces ${p.his} ${rivalryTerm(Farmer)} to service all the slaves in ${V.farmyardName}. `;    // TODO: not sure about this
+				r.push(`${He} leverages the fact that ${he} is ${slave.slaveName}'s superior to make ${his} ${rivalryTerm(Farmer)}'s life a living hell.`);
 				slave.devotion -= 2; slave.trust -= 2;
+
 				if (canDoVaginal(slave)) {
 					seX(slave, 'vaginal', 'public', 'penetrative', 10);
 				}
+
 				if (canDoAnal(slave)) {
 					seX(slave, 'anal', 'public', 'penetrative', 10);
 				}
+
 				seX(slave, 'oral', 'public', 'penetrative', 10);
 				if (jsRandom(1, 100) > 65) {
 					Farmer.rivalry++; slave.rivalry++;
 				}
 			} else if (Farmer.relationshipTarget === slave.ID) {
-				t += `${p.He} dotes over ${p.his} ${relationshipTerm(Farmer)}, ${slave.slaveName}, making sure ${he} isn't worked too hard, but unfortunately manages to get in the way of ${his} work. `;
+				r.push(`${He} dotes over ${his} ${relationshipTerm(Farmer)}, ${slave.slaveName}, making sure ${he} isn't worked too hard, but unfortunately manages to get in the way of ${his} work.`);
 				slave.devotion++;
 			} else if (areRelated(Farmer, slave)) {
-				t += `${p.He} pays special attention to ${p.his} ${relativeTerm(Farmer, slave)}, ${slave.slaveName}, making sure ${he} is treated well and showing off ${his} skills. `;
+				r.push(`${He} pays special attention to ${his} ${relativeTerm(Farmer, slave)}, ${slave.slaveName}, making sure ${he} is treated well and showing off ${his} skills.`);
 				slave.trust++;
 			}
 
-			return t;
+			return r;
 		}
 	}
 
-	const farmerWorks = slave => {
+	function farmerContracts(slave) {
+		const { he, his, himself } = getPronouns(slave);
+
 		let
-			t = ``,
-			oldCash = V.cash,
-			seed,
-			beauty;
+			r = [],
+			seed = V.farmyardShowgirls ? App.Facilities.Farmyard.farmShowsIncome(slave) : jsRandom(1, 10) * (jsRandom(150, 170) + (farmerBonus * 10));
 
-		if (V.showEWD) {
-			t += `<br>&nbsp;&nbsp;&nbsp;&nbsp;${He} ${App.SlaveAssignment.workTheFarm(slave)}`;
-		} else {
-			App.SlaveAssignment.workTheFarm(slave);
+		if (V.farmyardShows && !V.farmyardShowgirls) {
+			r.push(`<p class="indent">Since ${he} doesn't have enough showgirls to entertain your arcology's citizens, ${he} puts on shows with your animals on ${his} own, earning <span class="yellowgreen">${cashFormat(seed)}.</span></p>`);
+		} else if (!V.farmyardFarmers) {
+			r.push(`<p class="indent">Since ${V.farmyardName} doesn't have anyone tending to the crops, ${he} looks after them ${himself}, earning <span class="yellowgreen">${cashFormat(seed)}.</span></p>`);
 		}
 
-		seed = V.cash - oldCash;
-		cashX(Math.trunc(0.5 * seed), 'farmyard');
-		seed = Math.trunc(1.5 * seed);
-		profits += seed;
-		beauty = Beauty(V.activeSlave);
+		return r;
+	}
 
-		t += `<br>&nbsp;&nbsp;&nbsp;&nbsp;Since ${he} doesn't have enough farmhands to manage to keep ${him} busy, ${he} sees ${beauty} customers ${himself} (${Math.trunc(beauty / 7)} a day), earning you <span class="yellowgreen">${cashFormat(seed)}</span> ${He} can charge more for ${his} time, since many citizens find it erotic to fuck the Farmer. `;
+	function farmerRelationshipPC(slave) {
+		const { he, his, wife } = getPronouns(slave);
 
-		return t;
-	};
+		if (slave.relationship === -3 && slave.devotion > 50) {
+			return `As your loving ${wife}, ${he} does ${his} best to ensure ${V.farmyardName} runs smoothly.`;
+		}
+	}
 
-	const farmerEndWeek = slave => {
-		let t = ``;
+	function farmerAgeSkill(slave) {
+		const { His } = getPronouns(slave);
 
-		if (V.showEWD) {
-			t += `<br><br>`;
-			/* 000-250-006 */   // TODO: legacy - needed?
-			if (V.seeImages && V.seeReportImages) {
-				t += `<div class="imageRef tinyImg">
-					  ${SlaveArt(slave, 0, 0)}
-				  </div>`;
-			}
-			/* 000-250-006 */
-			t += `<span class="slave-name">${SlaveFullName(slave)}</span> is serving as the Farmer. `;
-			t += `<br>&nbsp;&nbsp;&nbsp;&nbsp;`;
-			t += App.SlaveAssignment.choosesOwnClothes(slave);
-			t += `<<include "SA rules">>`;
-			t += `<<include "SA diet">>`;
-			t += `<<include "SA long term effects">>`;
-			t += App.SlaveAssignment.drugs(slave);
-			t += `<<include "SA relationships">>`;
-			t += `<<include "SA rivalries">>`;
-			t += `<br><<include "SA devotion">>`;
-		} else {
-			App.SlaveAssignment.choosesOwnClothes(slave);
-			t += `<<silently>><<include "SA rules">><</silently>>`;
-			t += `<<silently>><<include "SA diet">><</silently>>`;
-			t += `<<silently>><<include "SA long term effects">><</silently>>`;
-			App.SlaveAssignment.drugs(slave);
-			t += `<<silently>><<include "SA relationships">><</silently>>`;
-			t += `<<silently>><<include "SA rivalries">><</silently>>`;
-			t += `<<silently>><br><<include "SA devotion">><</silently>>`;
+		if (slave.actualAge > 35) {
+			return `${His} age and experience also contribute.`;
 		}
+	}
 
-		return t;
-	};
+	function farmerIntelligence(slave) {
+		const { He } = getPronouns(slave);
 
-	const farmerRelationshipPC = slave => slave.relationship === -3 && slave.devotion > 50 ? `As your loving ${wife}, ${he} does ${his} best to ensure ${V.farmyardName} runs smoothly. ` : ``;
+		if (slave.intelligence + slave.intelligenceImplant > 15) {
+			return `${He} is a clever manager.`;
+		}
+	}
 
-	const farmerAgeSkill = slave => slave.actualAge > 35 ? `${His} age and experience also contribute. ` : ``;
+	function farmerSmell(slave) {
+		const { him, His } = getPronouns(slave);
 
-	const farmerIntelligence = slave => slave.intelligence + slave.intelligenceImplant > 15 ? `${He} is a clever manager. ` : ``;
+		if (!canSmell(slave)) {
+			return `${His} lack of a sense of smell protects ${him} from that omnipresent barnyard stench.`;
+		}
+	}
 
-	const farmerSmell = slave => !canSmell(slave) ? `${His} lack of a sense of smell protects ${him} from that omnipresent barnyard stench. ` : ``;
+	const farmerIntro = slave => `<span class="indent">${SlaveFullName(slave)} is serving as the Farmer</span>.`;
 
-	const farmerIntro = slave => `&nbsp;&nbsp;&nbsp;&nbsp;${SlaveFullName(slave)} is serving as the Farmer. `;
+	if (Farmer) {
+		const
+			farmerEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
 
-	const farmerDevotion = slave => slave.devotion < 45 ? slave.devotion += 5 : null;
+		V.i = V.slaveIndices[Farmer.ID];
+		App.Utils.setLocalPronouns(Farmer);	// needed for "include"s
 
-	const farmerTrust = slave => slave.trust < 45 ? slave.trust += 5 : null;
+		if (V.showEWD) {
+			const
+				farmerEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 
-	const farmerLivingRules = slave => slave.rules.living !== 'luxurious' ? slave.rules.living = 'luxurious' : null;
+			if (V.seeImages && V.seeReportImages) {
+				App.UI.DOM.appendNewElement("div", farmerEntry, App.Art.SlaveArtElement(Farmer, 0, 0), ["imageRef", "tinyImg"]);
+			}
 
+			$(farmerEntry).append(`<span class="slave-name">${SlaveFullName(Farmer)}</span> is serving as the Farmer.`);
+			$(farmerEntry).append(App.SlaveAssignment.standardSlaveReport(Farmer, false));
+		} else {
+			App.SlaveAssignment.standardSlaveReport(Farmer, true);
+		}
+
+		farmerChanges();
+		$(farmerEffects).append(farmerText());
+	}
 
 
-	// FARMHANDS
 
-	const farmhandCount = count => count > 0 ? `&nbsp;&nbsp;&nbsp;&nbsp;There ${count !== 1 ? `are ${count} farmhands` : `is one farmhand`} working out of ${V.farmyardName}.` : ``;
+	// MARK: Farmhands
 
-	const farmhandLivingRules = slave => {
+	function farmhandCount(count) {
+		return `<strong>There ${count > 1 ? `are ${count} farmhands` : `is one farmhand`} working out of ${V.farmyardName}.</strong>`;
+	}
+
+	function farmhandLivingRules(slave) {
 		switch (V.farmyardDecoration) {
 			case 'Degradation':
 			case 'standard':
@@ -246,11 +294,11 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 				break;
 			default:
 				slave.rules.living = 'normal';
+				break;
 		}
-		// TODO: should FS with 'spare' living rules cause minor health damage and devotion / trust loss?
-	};
+	}
 
-	const farmhandHealth = slave => {
+	function farmhandHealth(slave) {
 		if (slave.health.condition < -80) {
 			improveCondition(slave, 20);
 		} else if (slave.health.condition < -40) {
@@ -260,10 +308,9 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		} else if (slave.health.condition < 90) {
 			improveCondition(slave, 7);
 		}
-	};
+	}
 
-	// TODO: check over all of these numbers, make sure they make sense
-	const farmhandDevotion = slave => {
+	function farmhandDevotion(slave) {
 		if (slave.devotion <= 20 && slave.trust >= -20) {
 			slave.devotion -= 5; slave.trust -= 5;
 		} else if (slave.devotion < 45) {
@@ -271,84 +318,109 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		} else if (slave.devotion > 50) {
 			slave.devotion -= 4;
 		}
-	};
-
-	const farmhandEndWeek = slave => {
-		let t = ``;
-
-		if (V.showEWD) {
-			t += `<br><br>`;
-			/* 000-250-006 */   // TODO: legacy - needed?
-			if (V.seeImages && V.seeReportImages) {
-				t += `<div class="imageRef tinyImg">
-					  ${SlaveArt(slave, 0, 0)}
-				  </div>`;
-			}
-			/* 000-250-006 */
-			t += `<span class="slave-name">${SlaveFullName(slave)}</span> ${slave.choosesOwnAssignment === 2 ? `<<include "SA chooses own job">>` : `is working out of ${V.farmyardName}`}. `;
-			t += `<br>&nbsp;&nbsp;&nbsp;&nbsp;${He} ${App.SlaveAssignment.workTheFarm(slave)}`;
-			t += `<br>&nbsp;&nbsp;&nbsp;&nbsp;`;
-			t += App.SlaveAssignment.choosesOwnClothes(slave);
-			t += `<<include "SA rules">>`;
-			t += `<<include "SA diet">>`;
-			t += `<<include "SA long term effects">>`;
-			t += App.SlaveAssignment.drugs(slave);
-			t += `<<include "SA relationships">>`;
-			t += `<<include "SA rivalries">>`;
-			t += `<br><<include "SA devotion">>`;
-		} else {
-			t += `<<silently>><<include "SA chooses own job">><</silently>>`;
-			App.SlaveAssignment.choosesOwnClothes(slave);
-			t += `<<silently>><<include "SA rules">><</silently>>`;
-			t += `<<silently>><<include "SA diet">><</silently>>`;
-			t += `<<silently>><<include "SA long term effects">><</silently>>`;
-			App.SlaveAssignment.drugs(slave);
-			t += `<<silently>><<include "SA relationships">><</silently>>`;
-			t += `<<silently>><<include "SA rivalries">><</silently>>`;
-			t += `<<silently>><br><<include "SA devotion">><</silently>>`;
-		}
-
-		return t;
-	};
+	}
 
-	const farmhandProfit = slave => {
+	function farmhandProfit(slave) {
 		let incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
 		return incomeStats.income;
-	};
+	}
 
-	const farmhandFood = slave => {
+	function farmhandFood(slave) {
 		let
 			incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined),
-			foodWeek = 0;
+			foodWeek = incomeStats.food || 0;
 
-		foodWeek += incomeStats.food;
 		if (V.farmMenials > 0) {
 			foodWeek += (V.farmMenials * 350);
 		}
 
 		return foodWeek;
-	};
+	}
 
-	const farmhandTrust = slave => slave.trust < 30 ? slave.trust += 5 : null;
+	function farmhandTrust(slave) {
+		if (slave.trust < 30) {
+			slave.trust += 5;
+		}
+	}
 
-	const farmhandEnergy = slave => slave.energy > 40 && slave.energy < 95 ? slave.energy++ : null;
+	function farmhandEnergy(slave) {
+		if (slave.energy > 40 && slave.energy < 95) {
+			slave.energy++;
+		}
+	}
 
+	if (slaves) {
+		const intro = App.UI.DOM.appendNewElement("p", frag, '', "indent");
 
-	// MENIALS
+		let r = [];
+
+		r.push(farmhandCount(slaves.length));
+
+		for (const slave of slaves) {
+			V.i = V.slaveIndices[slave.ID];
+
+			slave.devotion += devBonus;
+
+			App.Utils.setLocalPronouns(slave);	// needed for "include"s
+
+			if (V.showEWD) {
+				const
+					slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
+
+				if (V.seeImages && V.seeReportImages) {
+					App.UI.DOM.appendNewElement("div", slaveEntry, App.Art.SlaveArtElement(slave, 0, 0), ["imageRef", "tinyImg"]);
+				}
+
+				$(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `);
+
+				if (slave.choosesOwnAssignment === 2) {
+					$(slaveEntry).append(App.UI.DOM.renderPassage("SA chooses own job"));
+				} else {
+					$(slaveEntry).append(`is working out of ${V.farmyardName}.`);
+				}
 
-	if (V.farmMenials > 0) {
+				farmhandLivingRules(slave);
+				farmhandHealth(slave);
+				farmhandDevotion(slave);
+				farmhandTrust(slave);
+				farmhandEnergy(slave);
+				farmhandFood(slave);
+
+				profits += farmhandProfit(slave);
+
+				const farmhandContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', "indent");
+
+				$(farmhandContent).append(App.SlaveAssignment.workTheFarm(slave));
+				$(slaveEntry).append(App.SlaveAssignment.standardSlaveReport(slave, false));
+			} else {	// silently discard return values
+				App.SlaveAssignment.workTheFarm(slave);
+				App.SlaveAssignment.standardSlaveReport(slave, true);
+			}
+		}
+
+		$(intro).append(r);
+	}
+
+
+
+	// MARK: Menials
+
+	if (V.farmMenials) {
 		let farmMenialProductivity = 9;
 
-		if (V.farmyardUpgrade.pump) {
+		if (V.farmyardUpgrades.pump) {
 			farmMenialProductivity += 1;
 		}
-		if (V.farmyardUpgrade.fertilizer) {
+
+		if (V.farmyardUpgrades.fertilizer) {
 			farmMenialProductivity += 2;
 		}
-		if (V.farmyardUpgrade.seeds) {
+
+		if (V.farmyardUpgrades.seeds) {
 			farmMenialProductivity += 3;
 		}
-		if (V.farmyardUpgrade.machinery) {
+
+		if (V.farmyardUpgrades.machinery) {
 			farmMenialProductivity += 3;
 		}
 
@@ -356,19 +428,20 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 	}
 
 
-	// FARMYARD
 
-	const farmyardStatsRecords = () => {
-		// TODO: check over these setters and remove those we don't need
+	// MARK: Farmyard
+
+	function farmyardStatsRecords() {
 		const f = V.facility.farmyard;
+
 		if (typeof f === "undefined") {
 			return;
 		}
+
 		f.farmhandIncome = 0;
 		f.customers = 0;
 		f.farmhandCosts = 0;
 		f.rep = 0;
-		f.adsCosts = V.farmyardAdsSpending;
 		f.maintenance = V.farmyard * V.facilityCost;
 		f.totalIncome = f.farmhandIncome + f.adsIncome;
 		f.totalExpenses = f.farmhandCosts + f.maintenance;
@@ -380,117 +453,72 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 			f.farmhandCosts += i.cost;
 			f.rep += i.rep;
 		}
-	};
+	}
 
-	const farmyardDecoration = () => {
-		let t = ``;
+	function farmyardDecoration() {
+		let r = [];
 
 		// TODO: add checks for the different FSs
 		if (V.farmyardDecoration !== 'standard') {
-			if (!profits && !foodWeek) {
-				t += `<br>`;
-			}
-			t += `<br>${V.farmyardNameCaps}'s customer's enjoyed `;
-			if (V.seeBestiality && V.farmyardBreeding > 0 && (V.canines.length || V.hooved.length || V.felines.length)) {
-				t += `<span class="green">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`;
-			} else if (V.farmyardShows) {
-				t += `<span class="green">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`;
-			} else {
-				// TODO: not sure about this one
-				t += `<span class="green">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`;
-			}
-		}
+			const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
 
-		return t;
-	};
+			$(decorationEffects).append(document.createElement("br"));
 
-	const farmyardProfit = (profit, foodWeek) => {
-		let t = ``;
+			r.push(`${V.farmyardNameCaps}'s customer's enjoyed`);
 
-		if (profit || foodWeek) {
-			t += `<br><br>${V.farmyardNameCaps} `;
-			if (profit) {
-				t += `makes you <span class="yellowgreen">${cashFormat(Math.trunc(profit))}</span>`;
-			}
-			if (profit && foodWeek && V.foodMarket) {
-				t += ` and `;
-			}
-			if (foodWeek && V.foodMarket) {
-				t += `produced <span class="chocolate"> ${massFormat(foodWeek)}</span> of food`;
+			if (V.seeBestiality && V.policies.bestialityOpeness && (V.canines || V.hooved || V.felines)) {
+				r.push(`<span class="green">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`);
+			} else if (V.farmyardShows) {
+				r.push(`<span class="green">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`);
+			} else {
+				r.push(`<span class="green">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`);
 			}
-			t += ` this week. `;
-		}
 
-		return t;
-	};
-
-	const farmyardStatsDisplay = () => `<<includeDOM App.Facilities.Farmyard.Stats(false)>><<timed 50ms>><<replace #farmyardstats>><<includeDOM App.Facilities.Farmyard.Stats(true)>><</replace>><</timed>>`;
-
-	t += `<span id="farmyardstats"></span>`;
-
-	// MAIN LOOP
+			$(decorationEffects).append(r.join(' '));
+		}
 
-	if (Farmer) {
-		t += farmerHealth(Farmer);
-		t += farmerDevotion(Farmer);
-		t += farmerTrust(Farmer);
-		t += farmerLivingRules(Farmer);
-
-		getSlaveStatisticData(Farmer, V.facility.farmyard); // make sure we have registered living expenses
-
-		t += farmerIntro(Farmer);
-		t += farmerRelationshipPC(Farmer);
-		t += farmerFetishEffects(farmerFetish(Farmer));
-		t += farmerSkill(Farmer);
-		t += farmerCashBonus(Farmer);
-		t += farmerAgeSkill(Farmer);
-		t += farmerExperience(Farmer);
-		t += farmerIntelligence(Farmer);
-		t += farmerDick(Farmer);
-		t += farmerSmell(Farmer);
-		t += farmerRelationshipSlaves(Farmer);
-		t += farmerWorks(Farmer);
+		return r;
 	}
 
-	t += farmhandCount(FL);
+	function farmyardProfit(profit, food) {
+		const profitContent = App.UI.DOM.appendNewElement("p", frag, '', "indent");
 
-	if (Farmer) {
-		t += farmerEndWeek(Farmer);
-	}
-
-	if (FL > 0) {
-		let oldCash = V.cash,
-			oldFood = V.food;
+		let r = [];
 
-		for (const slave of App.Utils.sortedEmployees(App.Entity.facilities.farmyard)) {
-			V.i = V.slaveIndices[slave.ID];
+		$(profitContent).append(document.createElement("br"));
 
-			({
-				he, him, his, hers, himself, girl, He, His, loli
-			} = getPronouns(slave));
+		if (profit || food) {
+			r.push(V.farmyardNameCaps);
 
-			farmhandLivingRules(slave);
-			farmhandHealth(slave);
-			farmhandDevotion(slave);
-			farmhandTrust(slave);
-			farmhandEnergy(slave);
-			farmhandFood(slave);
-			profits += farmhandProfit(slave);
+			if (profit) {
+				r.push(`makes you <span class="yellowgreen">${cashFormat(Math.trunc(profit))}</span>`);
+			}
 
-			t += farmhandEndWeek(slave);
+			if (V.foodMarket) {
+				if (profit && food) {
+					r.push(`and`);
+				}
+				if (food) {
+					r.push(`produced <span class="chocolate"> ${massFormat(food)}</span> of food`);
+				}
+			}
+			r.push(`this week.`);
 		}
 
-		profits += V.cash - oldCash;    // FIXME: equal to 0 - what is this supposed to represent?
-		oldCash = V.cash;
-		foodWeek += V.food + oldFood;
+		return $(profitContent).append(r.join(' '));
 	}
 
+	// FIXME: no idea what I'm doing here
+	const statsSpan = document.createElement("span");
+
 	farmyardStatsRecords();
-	t += farmyardProfit(profits, foodWeek);
-	t += farmyardDecoration();
-	t += farmyardStatsDisplay();
+	farmyardProfit(profits, foodWeek);
+	farmyardDecoration();
 
 	V.food += foodWeek;
 
-	return t;
+	frag.append(App.Facilities.Farmyard.Stats(false));
+	statsSpan.append(App.Facilities.Farmyard.Stats(true));
+
+	return frag;
 };
diff --git a/src/facilities/farmyard/shows/farmShowsIncome.js b/src/facilities/farmyard/shows/farmShowsIncome.js
new file mode 100644
index 0000000000000000000000000000000000000000..f80c965449435cfc3a0d8bfc0563f561d8d50390
--- /dev/null
+++ b/src/facilities/farmyard/shows/farmShowsIncome.js
@@ -0,0 +1,602 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {number}
+ */
+App.Facilities.Farmyard.farmShowsIncome = function(slave) {
+	const
+		arcology = V.arcologies[0],
+		heavyMods = SlaveStatsChecker.modScore(slave).total > 20,
+
+		sexualQuirks = ["perverted", "unflinching"],
+		behavioralQuirks = ["sinful"],
+		fetishes = ["humiliation", "masochist"];
+
+	let cash = 7500;
+
+	if (!slave) {
+		return null;
+	} else {
+		if (S.Farmer) {
+			cash *= 1.1;
+			if (S.Farmer.skill.farmer >= V.masteredXP) {
+				cash *= 1.1;
+			}
+		}
+
+		// MARK: FS Effects
+
+		if (arcology.FSSupremacist !== "unset") {
+			if (isSuperiorRace(slave)) {
+				if (V.seeBestiality) {
+					cash *= 0.8;
+					repX(-10, "shows");
+				} else {
+					cash *= 1.2;
+				}
+			} else {
+				cash *= 0.9;
+			}
+		}
+
+		if (arcology.FSSubjugationist !== "unset") {
+			if (isInferiorRace(slave)) {
+				if (V.seeBestiality) {
+					cash *= 1.2;
+					repX(10, "shows");
+				} else {
+					cash *= 0.8;
+				}
+			} else {
+				cash *= 0.9;
+			}
+		}
+
+		if (arcology.FSRepopulationFocus !== "unset") {
+			if (isPreg(slave)) {
+				if (slave.eggType === "human") {
+					cash *= 1.2;
+					repX(15, "shows");
+				} else {
+					cash *= 0.8;
+					repX(-15, "shows");
+				}
+			}
+		}
+
+		if (arcology.FSRestart !== "unset") {
+			if (isPreg(slave)) {
+				if (isEliteBreeder(slave)) {
+					if (slave.eggType === "human") {
+						cash *= 0.7;
+						repX(-20, "shows");
+					} else {
+						cash *= 0.6;
+						repX(-25, "shows");
+					}
+				} else {
+					if (slave.eggType === "human") {
+						cash *= 0.8;
+						repX(-15, "shows");
+					} else {
+						cash += 0.9;
+						repX(-10, "shows");
+					}
+				}
+			} else {
+				if (V.seeBestiality && isEliteBreeder(slave)) {
+					cash *= 0.7;
+					repX(-10, "shows");
+				}
+			}
+		}
+
+		if (arcology.FSGenderRadicalist !== "unset") {
+			if (slave.genes === "XX") {
+				if (slave.dick > 0) {
+					cash *= 1.2;
+					repX(10, "shows");
+				} else {
+					cash *= 0.9;
+					repX(-5, "shows");
+				}
+			}
+		}
+
+		if (arcology.FSGenderFundamentalist !== "unset") {
+			if (isPreg(slave) || setup.fakeBellies.includes(slave.bellyAccessory)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			} else {
+				cash *= 0.9;
+				repX(-5, "shows");
+			}
+
+			// FIXME: keep this? not sure it makes sense
+			if (slave.genes === "XX") {
+				if (slave.dick > 0) {
+					cash *= 0.8;
+				} else {
+					cash *= 1.1;
+				}
+			}
+		}
+
+		if (arcology.FSPaternalist !== "unset") {
+			if (V.seeBestiality) {
+				if (V.farmyardBreeding) {
+					if (V.farmyardRestraints) {
+						cash *= 0.5;
+					} else {
+						cash *= 0.7;
+					}
+				} else {
+					if (V.farmyardRestraints) {
+						cash *= 0.8;
+					} else {
+						cash *= 0.9;
+					}
+				}
+			} else {
+				// TODO: something here?
+			}
+		}
+
+		if (arcology.FSDegradationist !== "unset") {
+			if (V.seeBestiality) {
+				if (V.farmyardBreeding) {
+					if (V.farmyardRestraints) {
+						cash *= 1.5;
+					} else {
+						cash *= 1.3;
+					}
+				} else {
+					if (V.farmyardRestraints) {
+						cash *= 1.2;
+					} else {
+						cash *= 1.1;
+					}
+				}
+			} else {
+				// TODO: something here?
+			}
+		}
+
+		if (arcology.FSBodyPurist !== "unset") {
+			if (SlaveStatsChecker.isModded(slave)) {
+				if (heavyMods) {
+					cash *= 0.7;
+					repX(-15, "shows");
+				} else {
+					cash *= 0.8;
+					repX(-10, "shows");
+				}
+			}
+		}
+
+		if (arcology.FSTransformationFetishist !== "unset") {
+			if (SlaveStatsChecker.isModded(slave)) {
+				if (heavyMods) {
+					cash *= 1.3;
+					repX(15, "shows");
+				} else {
+					cash *= 1.2;
+					repX(10, "shows");
+				}
+			}
+		}
+
+		if (arcology.FSYouthPreferentialist !== "unset") {
+			if (isYoung(slave)) {
+				cash *= 1.2;
+				repX(10, "shows");
+			} else {
+				cash *= 0.8;
+				repX(-5, "shows");
+			}
+		}
+
+		if (arcology.FSMaturityPreferentialist !== "unset") {
+			if (!isYoung(slave)) {
+				cash *= 1.2;
+				repX(10, "shows");
+			} else {
+				cash *= 0.8;
+				repX(-5, "shows");
+			}
+		}
+
+		if (arcology.FSSlimnessEnthusiast !== "unset") {
+			if (slimLawPass(slave)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			} else {
+				cash *= 0.9;
+				repX(-5, "shows");
+			}
+		}
+
+		// FIXME: marked for possible rewrite
+		if (arcology.FSAssetExpansionist !== "unset") {
+			if (isStacked(slave)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			}
+		}
+
+		if (arcology.FSPastoralist !== "unset") {
+			if (slave.boobs >= 1000) {
+				cash *= 1.2;
+				repX(10, "shows");
+			}
+
+			if (slave.lactation > 0) {
+				cash *= 1.1;
+				repX(5, "shows");
+			}
+		}
+
+		// FIXME: marked for review
+		if (arcology.FSPhysicalIdealist !== "unset") {
+			if (genderLawPass(slave)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			} else {
+				cash *= 0.9;
+				repX(-5, "shows");
+			}
+
+			if (slave.muscles > 30) {								// slave is muscular or more
+				cash *= 1.1;
+			} else {
+				cash *= 0.9;
+			}
+		}
+
+		if (arcology.FSHedonisticDecadence !== "unset") {
+			if (slave.weight > 10) {								// slave is curvy or more
+				cash *= 1.1;
+			} else {
+				cash *= 0.9;
+			}
+		}
+
+		if (arcology.FSChattelReligionist !== "unset") { 			// TODO: I don't know what to put for this one
+			if (slave.devotion < 21) { 								// if slave is careful or less
+				cash *= 0.9;
+			}
+		}
+
+		if (arcology.FSPetiteAdmiration !== "unset") {
+			if (heightPass(slave)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			} else {
+				cash *= 0.9;
+				repX(-5, "shows");
+			}
+		}
+
+		if (arcology.FSStatuesqueGlorification !== "unset") {
+			if (heightPass(slave)) {
+				cash *= 1.1;
+				repX(10, "shows");
+			} else {
+				cash *= 0.9;
+				repX(-5, "shows");
+			}
+		}
+
+		if (arcology.FSRomanRevivalist !== "unset") {
+			// TODO:
+		}
+
+		if (arcology.FSAztecRevivalist !== "unset") {
+			// TODO:
+		}
+
+		if (arcology.FSEgyptianRevivalist !== "unset") {
+			// TODO:
+		}
+
+		if (arcology.FSEdoRevivalist !== "unset") {
+			// TODO:
+		}
+
+		if (arcology.FSArabianRevivalist !== "unset") {
+			// TODO:
+		}
+
+		if (arcology.FSChineseRevivalist !== "unset") {
+			// TODO:
+		}
+
+		// Close FS Effects
+
+		if (setup.entertainmentCareers.includes(slave.career)) {
+			cash *= 1.1;
+		}
+
+		// FIXME: can slaves' careers overlap categories?
+		if (setup.farmerCareers.includes(slave.career)) {
+			cash *= 1.1;
+		}
+
+		if (slave.prestige === 1) { 								// slave is prestigious
+			cash *= 1.1;
+		} else if (slave.prestige === 2) { 							// slave is very prestigious
+			cash *= 1.5;
+		} else if (slave.prestige === 3) { 							// slave is extremely prestigious
+			cash *= 1.9;
+		}
+
+		if (slave.porn.prestige === 1) { 							// slave is prestigious from porn
+			cash *= 1.1;
+		} else if (slave.porn.prestige === 2) { 					// slave is very prestigious from porn
+			cash *= 1.4;
+		} else if (slave.porn.prestige === 3) { 					// slave is extremely prestigious from porn
+			cash *= 1.7;
+		}
+
+		// FIXME: needed when using healthPenalty()?
+		if (slave.health.condition > 50) {							// slave is very healthy or more
+			cash *= 1.2;
+		} else if (slave.health.condition < -20) {
+			cash *= 0.9;
+		}
+
+		// TODO: add checks for family and relationships
+
+		if (slave.face > 40) {										// slave is beautiful or more
+			cash *= 1.4;
+		} else if (slave.face > 10) {								// slave is very pretty or more
+			cash *= 1.1;
+		} else if (slave.face < -10) {								// slave is less than unattractive
+			cash *= 0.9;
+		} else if (slave.face < -40) {								// slave is less than ugly
+			cash *= 0.7;
+		}
+
+		setSlaveDevotion(cash);
+		setSlaveTrust(cash);
+
+		if (slave.weight > 30) { 									// slave is curvy or more
+			if (arcology.FSHedonisticDecadence !== "unset") {
+				cash *= 0.8;
+			}
+		} else if (slave.weight < -30) { 							// slave is very thin or less
+			cash *= 0.8;											// TODO: put this on a scale
+		}
+
+		// FIXME: marked for rewrite
+		if (slave.muscles > 30) { 									// slave is muscular or more
+			cash *= 0.9;
+		} else if (slave.muscles < -30) {							// slave is very weak or less
+			cash *= 0.6;
+		}
+
+		if (!canSeePerfectly(slave)) {
+			if (canSee(slave)) {
+				cash *= 0.8;
+			} else {
+				cash *= 0.6;
+			}
+		}
+
+		if (!canHear(slave)) {
+			cash *= 0.8;
+		}
+
+		if (isPreg(slave)) {
+			cash *= 0.8;											// TODO: not sure how to incorporate pregnancy
+		}
+		// TODO: incorporate skills
+		cash *= healthPenalty(slave);
+
+		if (slave.intelligence > 50) {								// slave is very smart or better
+			cash *= 1.4;
+		} else if (slave.intelligence < -50) {						// slave is very slow or less
+			cash *= 0.6;
+		}
+
+		if (slave.energy > 95) {									// slave is a nymphomaniac
+			cash *= 1.5;
+		} else if (slave.energy > 80) {								// slave has powerful sex drive
+			cash *= 1.3;
+		} else if (slave.energy > 60) {								// slave has good sex drive
+			cash *= 1.1;
+		} else if (slave.energy > 40) {								// slave has average sex drive
+			cash *= 0.9;
+		} else if (slave.energy > 20) {								// slave has poor sex drive
+			cash *= 0.8;
+		} else {													// slave has no sex drive
+			cash *= 0.6;
+		}
+
+		switch (slave.fetish) {
+			case "submissive":
+			case "humiliation":
+				if (V.seeBestiality) {
+					if (slave.fetishKnown) {
+						cash *= 1.1;
+					} else {
+						slave.fetishKnown = jsRandom(1, 100) > 80 ? 1 : 0;
+					}
+				} else {
+					if (slave.fetishKnown) {
+						cash *= 0.9;
+					} else {
+						slave.fetishKnown = jsRandom(1, 100) > 80 ? 1 : 0;
+					}
+				}
+				break;
+
+			default:
+				break;
+		}
+
+		switch (slave.behavioralFlaw) {
+			case "devout":
+			case "arrogant":
+				cash *= 0.9;
+				break;
+
+			default:
+				break;
+		}
+
+		switch (slave.behavioralQuirk) {
+			case "sinful":
+				cash *= 1.1;
+				break;
+
+			default:
+				break;
+		}
+
+		switch (slave.sexualFlaw) {
+			case "shamefast":
+				cash *= 1.1;
+				break;
+
+			default:
+				break;
+		}
+
+		switch (slave.sexualQuirk) {
+			case "perverted":
+				cash *= 1.1;
+				break;
+
+			default:
+				break;
+		}
+
+		return cash;
+	}
+
+	function setSlaveDevotion(amount) {
+		const slaveApproves = () =>
+			sexualQuirks.includes(slave.sexualQuirk) ||
+			behavioralQuirks.includes(slave.behavioralQuirk) ||
+			fetishes.includes(slave.fetish);
+
+		if (slave.devotion > 50) {
+			amount *= 1.5;
+
+			if (V.seeBestiality) {
+				if (slaveApproves) {
+					slave.devotion += 2;
+				} else {
+					slave.devotion--;
+				}
+			}
+
+			if (V.farmyardBreeding) {
+				if (slaveApproves) {
+					slave.devotion += 2;
+				} else {
+					slave.devotion--;
+				}
+			}
+
+			if (V.farmyardRestraints) {
+				if (slaveApproves) {
+					slave.devotion += 3;
+				} else {
+					slave.devotion -= 2;
+				}
+			}
+		} else if (slave.devotion < -50) {
+			amount *= 0.5;
+
+			if (V.seeBestiality) {
+				if (slaveApproves) {
+					slave.devotion++;
+				} else {
+					slave.devotion -= 2;
+				}
+			}
+
+			if (V.farmyardBreeding) {
+				if (slaveApproves) {
+					slave.devotion++;
+				} else {
+					slave.devotion -= 2;
+				}
+			}
+
+			if (V.farmyardRestraints) {
+				if (slaveApproves) {
+					slave.devotion += 2;
+				} else {
+					slave.devotion -= 3;
+				}
+			}
+		}
+
+		return amount;
+	}
+
+	function setSlaveTrust(amount) {
+		const slaveApproves = () =>
+			sexualQuirks.includes(slave.sexualQuirk) ||
+			behavioralQuirks.includes(slave.behavioralQuirk) ||
+			fetishes.includes(slave.fetish);
+
+		if (slave.trust > 50) {
+			amount *= 1.2;
+
+			if (V.seeBestiality) {
+				if (slaveApproves) {
+					slave.trust += 2;
+				} else {
+					slave.trust--;
+				}
+			}
+
+			if (V.farmyardBreeding) {
+				if (slaveApproves) {
+					slave.trust += 2;
+				} else {
+					slave.trust--;
+				}
+			}
+
+			if (V.farmyardRestraints) {
+				if (slaveApproves) {
+					slave.trust += 3;
+				} else {
+					slave.trust -= 2;
+				}
+			}
+		} else if (slave.trust < -50) {
+			amount *= slave.devotion > 50 ? 1.2 : 0.9;
+
+			if (V.seeBestiality) {
+				if (slaveApproves) {
+					slave.trust++;
+				} else {
+					slave.trust -= 2;
+				}
+			}
+
+			if (V.farmyardBreeding) {
+				if (slaveApproves) {
+					slave.trust++;
+				} else {
+					slave.trust -= 2;
+				}
+			}
+
+			if (V.farmyardRestraints) {
+				if (slaveApproves) {
+					slave.trust += 2;
+				} else {
+					slave.trust -= 3;
+				}
+			}
+		}
+
+		return amount;
+	}
+};
diff --git a/src/facilities/farmyard/shows/saFarmyardShows.js b/src/facilities/farmyard/shows/saFarmyardShows.js
new file mode 100644
index 0000000000000000000000000000000000000000..f871fd325b800bd9ec6580ce1237443050279a30
--- /dev/null
+++ b/src/facilities/farmyard/shows/saFarmyardShows.js
@@ -0,0 +1,443 @@
+/**
+ * Returns a string describing the effects of the slave putting on shows only
+ * To see full effects, see farmyardShows.js
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Facilities.Farmyard.putOnShows = function(slave) {
+	const
+		{ he, him, his, hers, He, His } = getPronouns(slave),
+		incomeStats = getSlaveStatisticData(slave, V.facility.farmyard),
+		arcology = V.arcologies[0],
+		_beautiful = beautiful(slave),
+		_pretty = pretty(slave),
+
+		heavyMods = SlaveStatsChecker.modScore(slave).total > 20;
+
+	let r = [];
+
+	incomeStats.income += App.Facilities.Farmyard.farmShowsIncome(slave);
+
+	r.push(`${He} also puts on shows with animals this week.`);
+
+	// Open FS Subsection
+
+	if (arcology.FSSupremacist !== "unset") {
+		if (isSuperiorRace(slave)) {
+			if (V.seeBestiality) {
+				r.push(`Society <span class="reputation dec">disapproves</span> of your allowing a member of the elite race to be degraded in such a fashion, and thus ${he} didn't earn as much.`);
+			} else {
+				r.push(`Since ${arcology.FSSupremacistRace} slaves are in fashion, ${he} attracts a little more attention than if ${he} wasn't ${arcology.FSSupremacistRace}.`);
+			}
+		} else {
+			r.push(`Society doesn't disapprove of ${him} not being ${arcology.FSSupremacistRace}, but ${he} doesn't earn as much as ${he} would if ${he} was.`);
+		}
+	}
+
+	if (arcology.FSSubjugationist !== "unset") {
+		if (isInferiorRace(slave)) {
+			if (V.seeBestiality) {
+				r.push(`Society <span class="reputation inc">approves</span> of the degradation you submit your ${arcology.FSSubjugationistRace} slaves to, and so ${he} earns you a bit more.`);
+			} else {
+				r.push(`Fewer people want to go see a ${arcology.FSSubjugationistRace} slave put on a show, and so ${he} doesn't earn as much as ${he} otherwise could.`);
+			}
+		} else {
+			r.push(`Society doesn't disapprove of ${him} not being ${arcology.FSSubjugationistRace}, but ${he} doesn't earn as much as ${he} would if ${he} was.`);
+		}
+	}
+
+	if (arcology.FSRepopulationFocus !== "unset") {
+		if (isPreg(slave)) {
+			if (slave.eggType === "human") {
+				r.push(`Society <span class="reputation inc">greatly approves</span> of your having pregnant slaves ${V.seeBestiality ? `have sex` : `put on shows`} with animals.`);
+			} else {
+				r.push(`Society is <span class="reputation dec">disgusted</span> by ${his} pregnancy when they realize that what it is in ${his} womb is not human.`);
+			}
+		}
+	}
+
+	if (arcology.FSRestart !== "unset") {
+		if (isPreg(slave)) {
+			if (isEliteBreeder(slave)) {
+				if (slave.eggType === "human") {
+					r.push(`Society is <span class="reputation dec">horrified</span> by the fact that you would dare defile a slave deemed fit for humanity's revival in such a manner, especially one that is carrying the future of the planet.`);
+				} else {
+					r.push(`Society is <span class="reputation dec">absolutely repulsed</span> by the fact that you would dare defile a slave deemed fit for humanity's revival in such a manner, especially when they learn that what is in ${his} womb is not even human.`);
+				}
+			} else {
+				if (slave.eggType === "human") {
+					r.push(`Society is <span class="reputation dec">extremely disgusted</span> by ${his} pregnancy and the fact that you would have ${him} ${V.seeBestiality ? `have sex` : `put on shows`} with animals while sporting a baby bump.`);
+				} else {
+					r.push(`Society is disgusted by ${his} pregnancy until they learn that what is in ${his} womb is not human.`);
+				}
+			}
+		} else {
+			if (V.seeBestiality && isEliteBreeder(slave)) {
+				r.push(`Society is <span class="reputation dec">heavily disapproving</span> of the fact that you would dare defile a slave deemed fit for humanity's revival in such a manner.`);
+			}
+		}
+	}
+
+	if (arcology.FSGenderRadicalist !== "unset") {
+		if (slave.dick > 0) {
+			r.push(`${His} patrons <span class="reputation inc">approve</span> of the fact that ${he} has a dick.`);
+		} else {
+			r.push(`${His} patrons <span class="reputation dec">are disappointed</span> that ${he} doesn't have a dick.`);
+		}
+	}
+
+	if (arcology.FSGenderFundamentalist !== "unset") {
+		if (isPreg(slave) || setup.fakeBellies.includes(slave.bellyAccessory)) {
+			r.push(`${His} viewers <span class="reputation inc">approve</span> of the fact that ${he} is sporting a baby bump${setup.fakeBellies.includes(slave.bellyAccessory) ? `, even though ${hers} isn't real` : ``}.`);
+		} else {
+			r.push(`${His} viewers <span class="reputation dec">are disappointed</span> that ${he} isn't pregnant.`);
+		}
+	}
+
+	if (arcology.FSPaternalist !== "unset") {
+		if (V.seeBestiality) {
+			if (V.farmyardBreeding) {
+				if (V.farmyardRestraints) {
+					r.push(`Your citizens are <span class="reputation dec">extremely disapproving</span> of the fact that you would allow your slaves to be treated as nothing more than a bound breeding toy for your animals.`);
+				} else {
+					r.push(`Your citizens are <span class="reputation dec">highly disapproving</span> of the fact that you would allow your slaves to be treated as nothing more than a breeding toy for your animals.`);
+				}
+			} else {
+				if (V.farmyardRestraints) {
+					r.push(`Your citizens are <span class="reputation dec">very disapproving</span> of the fact that you would allow your slaves to be treated as nothing more than a bound toy for your animals.`);
+				} else {
+					r.push(`Your citizens are <span class="reputation dec">disapproving</span> of the fact that you would allow your slaves to be treated as nothing more than a toy for your animals.`);
+				}
+			}
+		} else {
+			// TODO:
+		}
+	}
+
+	if (arcology.FSDegradationist !== "unset") {
+		if (V.seeBestiality) {
+			if (V.farmyardBreeding) {
+				if (V.farmyardRestraints) {
+					r.push(`Your citizens are <span class="reputation dec">extremely approving</span> of the fact that you would allow your slaves to be treated as nothing more than a bound breeding toy for your animals.`);
+				} else {
+					r.push(`Your citizens are <span class="reputation dec">highly approving</span> of the fact that you would allow your slaves to be treated as nothing more than a breeding toy for your animals.`);
+				}
+			} else {
+				if (V.farmyardRestraints) {
+					r.push(`Your citizens are <span class="reputation dec">very approving</span> of the fact that you would allow your slaves to be treated as nothing more than a bound toy for your animals.`);
+				} else {
+					r.push(`Your citizens are <span class="reputation dec">approving</span> of the fact that you would allow your slaves to be treated as nothing more than a toy for your animals.`);
+				}
+			}
+		} else {
+			// TODO:
+		}
+	}
+
+	if (arcology.FSBodyPurist !== "unset") {
+		if (SlaveStatsChecker.isModded(slave)) {
+			r.push(`The members of the audience <span class="reputation dec">disapprove</span> that you would use a slave with ${heavyMods ? `such heavy` : ``} modifications to put on shows.`);
+		}
+	}
+
+	if (arcology.FSTransformationFetishist !== "unset") {
+		if (SlaveStatsChecker.isModded(slave)) {
+			r.push(`The members of the audience <span class="reputation inc">approve</span> that you would use a slave with ${heavyMods ? `such heavy` : ``} modifications to put on shows.`);
+		}
+	}
+
+	if (arcology.FSYouthPreferentialist !== "unset") {
+		if (isYoung(slave)) {
+			r.push(`${arcology.name}'s citizens <span class="reputation dec">disapprove</span> of your using such old slaves to put on shows.`);
+		} else {
+			r.push(`${arcology.name}'s citizens <span class="reputation inc">approve</span> of your using young slaves to put on shows.`);
+		}
+	}
+
+	if (arcology.FSMaturityPreferentialist !== "unset") {
+		if (isYoung(slave)) {
+			r.push(`${arcology.name}'s citizens <span class="reputation inc">approve</span> of your using mature slaves to put on shows.`);
+		} else {
+			r.push(`${arcology.name}'s citizens <span class="reputation dec">disapprove</span> of your using such young slaves to put on shows.`);
+		}
+	}
+
+	if (arcology.FSSlimnessEnthusiast !== "unset") {
+		if (slimLawPass(slave)) {
+			r.push(`${His} slim body <span class="reputation inc">attracts a wider audience.</span>`);
+		} else {
+			r.push(`Society finds your using a slave with such a flabby body <span class="reputation dec">disgusting.</span>`);
+		}
+	}
+
+	// FIXME: marked for possible rewrite
+	if (arcology.FSAssetExpansionist !== "unset") {
+		if (isStacked(slave)) {
+			r.push(`Society <span class="reputation inc">approves</span> of the fact that you respect their ideals in using a slave with larger assets.`);
+		}
+	}
+
+	if (arcology.FSPastoralist !== "unset") {
+		if (slave.boobs >= 1000) {
+			r.push(`The fact that ${slave.slaveName} has such large udders <span class="reputation inc">pleases your citizens.</span>`);
+		}
+
+		if (slave.lactation > 0) {
+			r.push(`Your citizens ${slave.boobs >= 1000 ? `also ` : ``}<span class="reputation inc">approve</span> of the fact that ${he} is visibly lactating.`);
+		}
+	}
+
+	// FIXME: marked for review
+	if (arcology.FSPhysicalIdealist !== "unset") {
+		if (genderLawPass(slave)) {
+			r.push(`The fact that ${slave.slaveName} has what is considered the ideal form also <span class="reputation inc">helps ${him} attract attention,</span> and so ${he} earns a bit more.`);
+		} else {
+			r.push(`${His} form isn't exactly what ${arcology.name}'s citizens consider ideal, and so ${he} doesn't <span class="reputation dec">earn as much.</span>`);
+		}
+	}
+
+	// FIXME: marked for rewrite
+	if (arcology.FSHedonisticDecadence !== "unset") {
+		if (slave.weight > 10) {
+			r.push(`Since ${slave.slaveName} is large enough for ${arcology.name}'s citizens, ${he} earns slightly more.`);
+		} else {
+			r.push(`${He} doesn't earn quite as much ${he} would have if ${he} was a bit larger in size.`);
+		}
+	}
+
+	if (arcology.FSChattelReligionist !== "unset") {
+		if (slave.devotion <= 20) {
+			// TODO: write this
+		} else {
+			// TODO: write this
+		}
+	}
+
+	if (arcology.FSPetiteAdmiration !== "unset") {
+		if (heightPass(slave)) {
+			r.push(`The fact that you are using such small slaves <span class="reputation inc">pleases your citizens.</span>`);
+		} else {
+			r.push(`The fact that you are using such small slaves <span class="reputation dec">displeases your citizens.</span>`);
+		}
+	}
+
+	if (arcology.FSStatuesqueGlorification !== "unset") {
+		if (heightPass(slave)) {
+			r.push(`Your citizens <span class="reputation inc">approve</span> of your using such statuesque slaves for putting on shows.`);
+		} else {
+			r.push(`Your citizens <span class="reputation dec">disapprove</span> of your not using taller slaves for putting on shows.`);
+		}
+	}
+
+	if (arcology.FSRomanRevivalist !== "unset") {
+		// TODO:
+	}
+
+	if (arcology.FSAztecRevivalist !== "unset") {
+		// TODO:
+	}
+
+	if (arcology.FSEgyptianRevivalist !== "unset") {
+		// TODO:
+	}
+
+	if (arcology.FSEdoRevivalist !== "unset") {
+		// TODO:
+	}
+
+	if (arcology.FSArabianRevivalist !== "unset") {
+		// TODO:
+	}
+
+	if (arcology.FSChineseRevivalist !== "unset") {
+		// TODO:
+	}
+
+	// Close FS Subsection
+
+	if (setup.entertainmentCareers.includes(slave.career)) {
+		r.push(`${He} has experience with putting on shows from ${his} life before ${he} was a slave, making ${him} more effective at putting on shows.`);
+	}
+
+	// FIXME: can slaves' careers overlap categories?
+	if (setup.farmerCareers.includes(slave.career)) {
+		r.push(`${He} ${setup.entertainmentCareers.includes(slave.career) ? `also` : ``} has experience in working with animals from ${his} life before ${he} was a slave, making ${him} more effective at putting on shows.`);
+	}
+
+	if (slave.prestige === 1) {
+		r.push(`Because some of your citizens already know of ${him}, ${he} earns more.`);
+	} else if (slave.prestige === 2) {
+		r.push(`Because a lot of your citizens already know of ${him}, ${he} earns quite a bit more.`);
+	} else if (slave.prestige === 3) {
+		r.push(`Because ${he} is so famous, ${he} earns a lot more then ${he} would otherwise.`);
+	}
+
+	if (slave.porn.prestige === 1) {
+		r.push(`${He} earns a bit more because some of your citizens already know ${him} from porn.`);
+	} else if (slave.porn.prestige === 2) {
+		r.push(`${He} earns quite a bit more because a lot of your citizens already know ${him} from porn.`);
+	} else if (slave.porn.prestige === 3) {
+		r.push(`${He} earns a lot more because ${he} is so famous from porn.`);
+	}
+
+	if (slave.health.condition > 50) {
+		r.push(`${He} is in such excellent health that ${he} is able to put on longer and more energetic shows, earning you more.`);
+	} else if (slave.health.condition < -20) {
+		r.push(`${His} poor health negatively affects ${his} ability to put on good shows, cutting into your profits.`);
+	}
+
+	// TODO: add checks for family and relationships
+
+	if (slave.face > 40) {
+		r.push(`${He} is so ${_beautiful} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
+	} else if (slave.face > 10) {
+		r.push(`${He} is so ${_pretty} that ${his} audience is willing to pay more to watch ${him} put on shows.`);
+	} else if (slave.face < -10) {
+		r.push(`${His} audience isn't willing to pay as much because of how unattractive ${his} face is.`);
+	} else if (slave.face < -40) {
+		r.push(`${His} audience isn't willing to pay as much because of how hard ${his} face is to look at.`);
+	}
+
+	// TODO: incorporate seeBestiality, breeding, and restraints
+	if (slave.devotion > 50) {
+		if (slave.trust > 50) {
+			r.push(`${He} is so devoted that ${he} works ${his} hardest to make ${his} show a good one.`);
+		} else if (slave.trust < -50) {
+			r.push(`${He} is both devoted to you and terrified of you, so ${he} tries ${his} best to make ${his} show a good one.`);
+		}
+	} else if (slave.devotion < -50) {
+		if (slave.trust > 50) {
+			r.push(`${slave.slaveName} purposefully does the bare minimum ${he} can get away with to spite you.`);
+		} else if (slave.trust < -50) {
+			r.push(`${slave.slaveName} refuses to do anything without punishment, which is evident from ${his} meager earnings.`);
+		}
+	}
+
+	// FIXME: marked for rewrite
+	if (slave.weight > 30) {
+		if (arcology.FSHedonisticDecadence === "unset") {
+			r.push(`Your citizens are not willing to pay as much to see such a fat slave put on shows, so ${he} loses some income.`);
+		}
+	} else if (slave.weight < -30) {
+		r.push(`Your citizens don't like watching such a sickly-looking slaves put on shows, so ${he} loses some income.`);
+	}
+
+	if (slave.muscles > 30) {
+		// TODO: write this - do we want something for muscles?
+	} else if (slave.muscles < -30) {
+		r.push(`${slave.slaveName} is so weak that ${he} cannot even properly handle the animals ${he}'s assigned to ${V.seeBestiality ? `fuck` : `work with`}, and isn't able to put on any sort of meaningful show.`);
+	}
+
+	if (!canSeePerfectly(slave)) {
+		r.push(`${His} ${!canSee(slave) ? `blindness makes it impossible` : `nearsightedness makes it harder`} for ${him} to see what ${he}'s doing, affecting ${his} ability to put on a good show.`);
+	}
+
+	if (slave.hears < 0) {
+		r.push(`${His} ${slave.hears < -1 ? `lack of` : `poor`} hearing makes it difficult for ${him} to hear what ${his} audience wants from ${him}, which really affects ${his} earnings.`);
+	}
+
+	// FIXME: marked for rewrite
+	if (isPreg(slave)) {
+		r.push(`${His}${slave.bellyPreg > 100000 ? ` advanced` : ``} pregnancy makes it more difficult for him to effectively put on a good show.`);
+	}
+
+	if (slave.health.tired > 60) {
+		r.push(`${He} is so tired that the energy in ${his} shows is basically nonexistent, affecting ${his} profits.`);
+	}
+
+	if (slave.intelligence > 50) {
+		r.push(`Because ${he} is so intelligent, ${he} is able to tailor ${his} shows to ${his} audience, helping ${him} bring in more in profits.`);
+	} else if (slave.intelligence < -50) {
+		r.push(`${He} is so slow that all ${he} can really do is just ${V.seeBestiality ? `lie there and take it` : `put on the most basic of moves`}, which your audience finds dull and uninteresting.`);
+	}
+
+	if (slave.energy > 95) {
+		r.push(`The fact that ${he} is a nymphomaniac helps ${him} to go for longer, allowing ${him} to really put on an amazing show.`);
+	} else if (slave.energy > 80) {
+		r.push(`The fact that ${his} sex drive is so powerful helps ${him} to really put on good shows.`);
+	} else if (slave.energy > 60) {
+		r.push(`The fact that ${his} sex drive is so good helps ${him} to put on good shows.`);
+	} else if (slave.energy > 40) {
+		r.push(`${His} average sex drive allows ${him} to put on a decent show.`);
+	} else if (slave.energy > 20) {
+		r.push(`The fact that ${his} sex drive is so poor affects ${his} performance.`);
+	} else {
+		r.push(`The fact that ${his} sex drive is nonexistent really hinders ${his} ability to put on a decent show.`);
+	}
+
+	// TODO: add more to the fetishes and flaws / quirks
+	switch (slave.fetish) {
+		case "submissive":
+			if (V.seeBestiality) {
+				if (slave.fetishKnown) {
+					r.push(`${He} is so submissive that ${he} willingly accepts ${his} position as an animal's fucktoy and <span class="reputation inc">is able to put on a decent show</span>.`);
+				} else {
+					r.push(`${S.HeadGirl ? `${S.HeadGirl.slaveName} notices` : `You notice`} that ${slave.slaveName} seems to have really taken to ${his} position as a fucktoy for animals. <span class="lightcoral">${He}'s a submissive!</span>`);
+				}
+			} else {
+				if (slave.fetishKnown) {
+					r.push(`Being a submissive, ${he} <span class="reputation dec">doesn't have the confidence required</span> to really put on a good show.`);
+				} else {
+					r.push(`${slave.slaveName} doesn't seem to have the type of fortitude needed to put on a show, and after some probing, you discover why - it turns out <span class="lightcoral">${he}'s a submissive!</span>`);
+				}
+			}
+			break;
+
+		case "humiliation":
+			if (V.seeBestiality) {
+				if (slave.fetishKnown) {
+					r.push(`${slave.slaveName} uses the most of this humiliating experience to really put on a show, to <span class="reputation inc">the approval of ${his} audience</span>.`);
+				} else {
+					// TODO:
+				}
+			} else {
+				// TODO: not sure about this one
+			}
+			break;
+
+		default:
+			break;
+	}
+
+	switch (slave.behavioralFlaw) {
+		case "arrogant":
+			r.push(`Because ${he} is so arrogant, ${he} tries ${his} hardest to avoid ${V.seeBestiality ? `fucking animals` : `putting on shows`}, <span class="cash dec">which affects ${his} profits</span> and <span class="reputation dec">your reputation.</span>`);
+			break;
+
+		case "devout":
+			r.push(`${He} often prays ${V.seeBestiality ? ` while getting fucked by animals` : ` during ${his} shows`}, which your citizens <span class="reputation dec">find off-putting.</span>`);
+			break;
+
+		default:
+			break;
+	}
+
+	switch (slave.behavioralQuirk) {
+		case "sinful":
+			r.push(`${He} relishes in ${his} ability to do something so sinful and depraved, and <span class="reputation inc">really puts on a show.</span>`);
+			break;
+
+		default:
+			break;
+	}
+
+	switch (slave.sexualFlaw) {
+		case "shamefast":
+			r.push(`${His} crippling shamefastness <span class="reputation dec">limits ${his} ability</span> to put on a decent show.`);
+			break;
+
+		default:
+			break;
+	}
+
+	switch (slave.sexualQuirk) {
+		case "perverted":
+			r.push(`${His} shows are a <span class="reputation inc">real spectacle,</span> since ${he} is so perverted that ${he} is willing to go far beyond the bare minimum.`);
+			break;
+
+		default:
+			break;
+	}
+
+	return r.join(' ');
+};
diff --git a/src/facilities/nursery/childInteract.tw b/src/facilities/nursery/childInteract.tw
index e485043b328268ab1281a47770ff9fb2b561f76d..76f18de06ba35e10122e1f6d252958317d3cf364 100644
--- a/src/facilities/nursery/childInteract.tw
+++ b/src/facilities/nursery/childInteract.tw
@@ -60,7 +60,7 @@
 FIXME:
 <br><br>__Take slave to another room:__
 [[Wardrobe|Wardrobe Use][$degradation = 0]]
-| [[Auto salon|Salon][$degradation = 0, $primaryHairColor = "", $secondaryHairColor = "", $artificialEyeColor = "" ,$artificialEyeShape = "", $artificialEyeFill = "", $tattooChoice = "", $piercingLevel = ""]]
+| [[Auto salon|Salon][$degradation = 0, $tattooChoice = "", $piercingLevel = ""]]
 | [[Body mod studio|Body Modification][$degradation = 0, $tattooChoice = undefined]]
 | [[Remote surgery|Remote Surgery][$degradation = 0]]
 | [[Configure cybernetics|Prosthetics Configuration][$prostheticsConfig = "main"]]
@@ -305,7 +305,7 @@ FIXME:
 				<<replace "#miniscene">><<include "BeastFucked">><br>&nbsp;&nbsp;&nbsp;&nbsp;<</replace>>
 			<</link>> |
 		<</if>>
-		<<if $farmyardStable > 0 && $activeHooved.species != 0>>
+		<<if $farmyardStables > 0 && $activeHooved.species != 0>>
 			<<link "Let a $activeHooved.species mount $him">>
 				<<set $animalType = "hooved">>
 				<<replace "#miniscene">><<include "BeastFucked">><br>&nbsp;&nbsp;&nbsp;&nbsp;<</replace>>
diff --git a/src/facilities/nursery/customizeChild.tw b/src/facilities/nursery/customizeChild.tw
index e8d5fbab17fc1e5e417497f681ed109c78dacf68..243dec682954c23a60aad9dc166508eff67a68c3 100644
--- a/src/facilities/nursery/customizeChild.tw
+++ b/src/facilities/nursery/customizeChild.tw
@@ -1,7 +1,9 @@
 :: Customize Child [nobr]
 
-<<set $nextButton = "Continue", $nextLink = "Rename Child">>
-<<set $oldName = $activeChild.slaveName, $oldSurname = $activeChild.slaveSurname>>
+<<set $nextButton = "Continue">>
+<<set _oldName = $activeChild.slaveName, _oldSurname = $activeChild.slaveSurname>>
+
+<p id="rename"></p>
 
 You may enter custom descriptors for the child's hair color, hair style, tattoos, or anything else here. After typing, press enter to commit your change. These custom descriptors will appear in descriptions of the child, but will have no gameplay effect. Changing them is free.
 	<br><br>
@@ -62,35 +64,61 @@ You may enter custom descriptors for the child's hair color, hair style, tattoos
 
 <<if ((($activeChild.devotion >= -50) || ($activeChild.trust < -20)) && ($activeChild.birthName != $activeChild.slaveName)) || (($activeChild.devotion > 20) || ($activeChild.trust < -20))>>
 	Change $his given name<<if $activeChild.birthName != $activeChild.slaveName>> ($his birth name was $activeChild.birthName)<</if>>:
-		<<textbox "$activeChild.slaveName" $activeChild.slaveName "Rename Child">>
-	<<link "Restore $his birth name" "Rename Child">>
+		<<includeDom App.UI.DOM.makeTextBox(
+			$activeChild.slaveName,
+			v => {
+				$activeChild.slaveName = v;
+				App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname});
+			},
+			false
+		)>>
+	<<link "Restore $his birth name">>
 		<<set $activeChild.slaveName = $activeChild.birthName>>
+		<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 	<</link>>
 	<<if $arcologies[0].FSPastoralist != "unset">>
 		<<if $activeChild.lactation > 0>>
-			| <<link "Give $him a random cow given name" "Rename Child">>
+			| <<link "Give $him a random cow given name">>
 				<<set $activeChild.slaveName = setup.cowSlaveNames.random()>>
+				<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 			<</link>>
 		<</if>>
 	<</if>>
 	<<if $arcologies[0].FSChattelReligionist != "unset">>
-		| <<link "Give $him a random devotional given name" "Rename Child">>
+		| <<link "Give $him a random devotional given name">>
 			<<set $activeChild.slaveName = setup.chattelReligionistSlaveNames.random()>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<</if>>
 	<br><br>
 	Change $his surname<<if $activeChild.birthSurname != $activeChild.slaveSurname>> ($his birth surname was $activeChild.birthSurname)<</if>>:
 	<<if $activeChild.slaveSurname>>
-		<<textbox "$activeChild.slaveSurname" $activeChild.slaveSurname "Rename Child">>
+		<<includeDom App.UI.DOM.makeTextBox(
+			$activeChild.slaveSurname,
+			v => {
+				$activeChild.slaveSurname = v;
+				App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname});
+			},
+			false
+		)>>
 	<<else>>
-		<<textbox "$activeChild.slaveSurname" "" "Rename Child">>
+		<<includeDom App.UI.DOM.makeTextBox(
+			"",
+			v => {
+				$activeChild.slaveSurname = v;
+				App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname});
+			},
+			false
+		)>>
 	<</if>>
-	<<link "Restore $his birth surname" "Rename Child">>
+	<<link "Restore $his birth surname">>
 		<<set $activeChild.slaveSurname = $activeChild.birthSurname>>
+		<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 	<</link>>
 	<<if $activeChild.slaveSurname>>
-		| <<link "Take $his surname away" "Rename Child">>
+		| <<link "Take $his surname away">>
 			<<set $activeChild.slaveSurname = 0>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<</if>>
 	<<if $activeChild.relationship >= 5>>
@@ -98,8 +126,9 @@ You may enter custom descriptors for the child's hair color, hair style, tattoos
 			<<if $activeChild.relationshipTarget == $slaves[_i].ID>>
 				<<if $slaves[_i].slaveSurname>>
 					<<if $activeChild.slaveSurname != $slaves[_i].slaveSurname>>
-						| <<link "Give $him $his wife's surname" "Rename Child">>
+						| <<link "Give $him $his wife's surname">>
 							<<set $activeChild.slaveSurname = $slaves[_i].slaveSurname>>
+							<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 						<</link>>
 						<<break>>
 					<</if>>
@@ -110,33 +139,43 @@ You may enter custom descriptors for the child's hair color, hair style, tattoos
 	<<if $activeChild.relationship == -3>>
 		<<if $PC.slaveSurname>>
 			<<if $activeChild.slaveSurname != $PC.slaveSurname>>
-				| <<link "Give $him your surname" "Rename Child">>
+				| <<link "Give $him your surname">>
 					<<set $activeChild.slaveSurname = $PC.slaveSurname>>
+					<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 				<</link>>
 			<</if>>
 		<</if>>
 	<</if>>
 	<<if $arcologies[0].FSRomanRevivalist != "unset">>
-		| <<link "Give $him a random full Roman name" "Rename Child">>
-			<<set $activeChild.slaveName = setup.romanSlaveNames.random(), $activeChild.slaveSurname = setup.romanSlaveSurnames.random()>>
+		| <<link "Give $him a random full Roman name">>
+			<<set $activeChild.slaveName = setup.romanSlaveNames.random()>>
+			<<set $activeChild.slaveSurname = setup.romanSlaveSurnames.random()>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<<elseif $arcologies[0].FSAztecRevivalist != "unset">>
-		| <<link "Give $him a random full Aztec name" "Rename Child">>
-			<<set $activeChild.slaveName = setup.aztecSlaveNames.random(), $activeChild.slaveSurname = 0>>
+		| <<link "Give $him a random full Aztec name">>
+			<<set $activeChild.slaveName = setup.aztecSlaveNames.random()>>
+			<<set $activeChild.slaveSurname = 0>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<<elseif $arcologies[0].FSEgyptianRevivalist != "unset">>
-		| <<link "Give $him a random full ancient Egyptian name" "Rename Child">>
-			<<set $activeChild.slaveName = setup.ancientEgyptianSlaveNames.random(), $activeChild.slaveSurname = 0>>
+		| <<link "Give $him a random full ancient Egyptian name">>
+			<<set $activeChild.slaveName = setup.ancientEgyptianSlaveNames.random()>>
+			<<set $activeChild.slaveSurname = 0>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<<elseif $arcologies[0].FSEdoRevivalist != "unset">>
-		| <<link "Give $him a random full feudal Japanese name" "Rename Child">>
-			<<set $activeChild.slaveName = setup.edoSlaveNames.random(), $activeChild.slaveSurname = setup.edoSlaveSurnames.random()>>
+		| <<link "Give $him a random full feudal Japanese name">>
+			<<set $activeChild.slaveName = setup.edoSlaveNames.random()>>
+			<<set $activeChild.slaveSurname = setup.edoSlaveSurnames.random()>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
 		<</link>>
 	<</if>>
 	<<if $arcologies[0].FSDegradationist > -1>>
-		| <<link "Give $him a degrading full name" "Rename Child">>
-	<<run DegradingName($activeChild)>>
-	<</link>>
+		| <<link "Give $him a degrading full name">>
+			<<run DegradingName($activeChild)>>
+			<<run App.UI.SlaveInteract.rename($activeChild, {oldName:_oldName, oldSurname:_oldSurname})>>
+		<</link>>
 	<</if>>
 <<else>>
 	//You must break $his will further before you can successfully force a new name on $him.//
diff --git a/src/facilities/nursery/customizeInfant.tw b/src/facilities/nursery/customizeInfant.tw
index 6969f6b8aedc0cf7b049b779f3c582cbb31dd857..c4687bfe6128d2180f0281bb1080c60d895896df 100644
--- a/src/facilities/nursery/customizeInfant.tw
+++ b/src/facilities/nursery/customizeInfant.tw
@@ -1,7 +1,6 @@
 :: Customize Infant [nobr]
 
-<<set $nextButton = "Continue", $nextLink = "Rename Child">>
-<<set $oldName = $activeChild.slaveName, $oldSurname = $activeChild.slaveSurname>>
+<<set $nextButton = "Continue">>
 
 /* TODO: all of this */
 You may enter custom descriptors for your child's hair color, hair style, tattoos, or anything else here. After typing, press enter to commit your change. These custom descriptors will appear in descriptions of your child, but will have no gameplay effect. Changing them is free.
diff --git a/src/facilities/nursery/matronSelect.tw b/src/facilities/nursery/matronSelect.tw
index 0b52309d0ff93d1b91e2d27dc1f76f066caefa6b..70531aff189aa069180438c3e283ddcd1e3a943a 100644
--- a/src/facilities/nursery/matronSelect.tw
+++ b/src/facilities/nursery/matronSelect.tw
@@ -12,4 +12,4 @@
 <br><br>''Appoint a Matron from your devoted slaves:''
 <br><br>[[None|Nursery][removeJob($Matron, "be the Matron")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.nursery, "Nursery")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.nursery, "Nursery")>>
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
index 86e754f2f8c30e6c56794f2fc1d3c93e2cbf5820..00445ff9cbd6b2ae6fd8118bbb858d55f3e10b88 100644
--- a/src/facilities/nursery/nursery.tw
+++ b/src/facilities/nursery/nursery.tw
@@ -151,7 +151,7 @@
 		</div>
 
 		<p>
-			<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.nursery)>>
+			<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.nursery)>>
 		</p>
 		/*
 	</div>
diff --git a/src/facilities/nursery/renameChild.tw b/src/facilities/nursery/renameChild.tw
deleted file mode 100644
index f3536031727f4f4a8749dab19f4fe407e98a4454..0000000000000000000000000000000000000000
--- a/src/facilities/nursery/renameChild.tw
+++ /dev/null
@@ -1,142 +0,0 @@
-:: Rename Child [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Slave Interact">>
-
-<<if $activeChild.slaveName === $oldName && $activeChild.slaveSurname === $oldSurname>>
-	<<goto "Slave Interact">>
-<<else>>
-/* First time renaming reaction */
-<<if $activeChild.slaveName === "" || ndef $activeChild.slaveName>>
-	$oldName needs to be called something on the records, so $oldName $he stays.
-	<<set $activeChild.slaveName = $oldName>>
-<<elseif $activeChild.fetish == "mindbroken">>
-	$activeChild.slaveName doesn't even recognize that $he's been renamed. It simply does not register.
-<<elseif ($oldName != $activeChild.birthName && $oldSurname != $activeChild.birthSurname) && ($activeChild.slaveName == $activeChild.birthName || $activeChild.slaveSurname == $activeChild.birthSurname)>>
-	$activeChild.slaveName
-	<<if $activeChild.devotion > 50>>
-		cheerfully accepts $his old name back.
-	<<elseif $activeChild.devotion >= -20>>
-		obediently accepts $his old name back.
-	<<elseif $activeChild.devotion >= -50>>
-		happily accepts $his original name.
-	<<elseif $activeChild.trust > 20>>
-		scoffs at the notion that $he was ever anything other than <<= SlaveFullBirthName($activeChild)>>, @@.orangered;weakening your control over $him.@@
-		<<set $activeChild.trust += 5>>
-	<<else>>
-		cautiously accepts the return of $his name.
-	<</if>>
-<<elseif $oldName == $activeChild.birthName || $oldSurname == $activeChild.birthSurname>>
-	$activeChild.slaveName
-	<<if $activeChild.devotion > 50>>
-		accepts $his new name cheerfully. This attachment to you @@.hotpink; increases $his devotion.@@
-		<<set $activeChild.devotion += 4>>
-	<<elseif $activeChild.devotion >= -20>>
-		obediently accepts $his new name. This surrender to you @@.hotpink; increases $his obedience.@@
-		<<set $activeChild.devotion += 4>>
-	<<elseif $activeChild.devotion >= -50>>
-		reluctantly accepts $his new name.
-	<<else>>
-		angrily tries to resist $his new name, insisting that $his name is <<= SlaveFullBirthName($activeChild)>>. This resistance @@.mediumorchid; increases $his rebelliousness.@@
-		<<set $activeChild.devotion -= 5>>
-	<</if>>
-<<else>>
-	Since $activeChild.slaveName has already had a new name <<if $activeChild.devotion > 20>>given to<<else>>forced on<</if>> $him before, the mere fact of having it changed again doesn't really affect $him.
-<</if>>
-
-<<set _insultingName = 0>>
-<<if $oldName != $activeChild.slaveName && typeof $activeChild.slaveName == "string">>
-	<<set _toSearch = $activeChild.slaveName.toLowerCase()>>
-	<<for $i = 0; $i < setup.badWords.length; $i++>>
-		<<if _toSearch.indexOf(setup.badWords[$i]) != -1>>
-			<<set _insultingName = 1>>
-			<<break>>
-		<</if>>
-	<</for>>
-<</if>>
-<<if !_insultingName>>
-	<<if $oldSurname != $activeChild.slaveSurname && typeof $activeChild.slaveSurname == "string">>
-		<<set _toSearch = $activeChild.slaveSurname.toLowerCase()>>
-		<<for $i = 0; $i < setup.badWords.length; $i++>>
-			<<if _toSearch.indexOf(setup.badWords[$i]) != -1>>
-				<<set _insultingName = 1>>
-				<<break>>
-			<</if>>
-		<</for>>
-	<</if>>
-<</if>>
-<<if _insultingName == 1>>
-	<<if $activeChild.fetish == "mindbroken">>
-		$His new name would be insulting to a normal $girl, but $he dully accepts that it is an accurate description and goes about $his duties.
-	<<elseif $activeChild.devotion < -50>>
-		Being given such a degrading name @@.mediumorchid;further increases $his hatred@@ of you.
-		<<set $activeChild.devotion -= 5>>
-	<<elseif $activeChild.devotion <= 50>>
-		Being given such a degrading name @@.gold;terrifies $him,@@ since $he thinks it's fair warning for what $he'll suffer in the future.
-		<<set $activeChild.trust -= 5>>
-	<</if>>
-<</if>>
-
-/* Wife's surname reaction */
-<<if $oldSurname != $activeChild.slaveSurname>>
-	<<if $activeChild.relationship >= 5>>
-		<<set _i = $slaveIndices[$activeChild.relationshipTarget]>>
-		<<if ndef _i>>@@.red;Error, relationshipTarget not found.@@<</if>>
-			<<if $slaves[_i].slaveSurname>>
-			<<if $activeChild.slaveSurname == $slaves[_i].slaveSurname>>
-				$He's touched that $he now shares a surname with $his wife $slaves[_i].slaveName $slaves[_i].slaveSurname, and is @@.mediumaquamarine;more confident than ever@@ that you intend to keep them together in marital bliss.
-				<<set $activeChild.trust += 5>>
-			<<elseif $oldSurname == $slaves[_i].slaveSurname>>
-				$He's concerned that $he no longer shares a surname with $his wife $slaves[_i].slaveName $slaves[_i].slaveSurname, and is @@.gold;very worried@@ that you might be considering splitting them up.
-				<<set $activeChild.trust -= 5>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-/* PC's surname reaction */
-<<if $oldSurname != $activeChild.slaveSurname>>
-	<<if $activeChild.relationship == -3>>
-		<<if $PC.slaveSurname>>
-			<<if $activeChild.fetish == "mindbroken">>
-				Names are meaningless to $him and it is unlikely $he'll remember it.
-			<<elseif $activeChild.devotion+$activeChild.trust >= 175>>
-				<<if $activeChild.slaveSurname == $PC.slaveSurname>>
-					<<if hasAnyArms($activeChild)>>
-						When you tell $him that $he's to be known as $activeChild.slaveName $activeChild.slaveSurname now, $he starts to cry. $He tries to get $himself under control and thank you as best $he can, wiping at the tears running down $his $activeChild.skin cheeks, but $he can't seem to stop weeping as $he thanks you over and over. $He's a sex slave, your property, and it's understandable that some doubts about the permanence of $his place as your slave wife. This has @@.mediumaquamarine;helped reassure $him,@@ and explains the strength of $his emotional reaction. The next time you make love to $him, $he @@.hotpink;presses $himself as close to you as $he can,@@ eager to drink in as much of your presence as $he can get.
-					<<else>>
-						$He's @@.hotpink;deeply touched@@ that $he now shares a surname with you, and has @@.mediumaquamarine;an additional source of confidence@@ that $he'll remain your amputee slave wife.
-					<</if>>
-					<<set $activeChild.devotion += 5, $activeChild.trust += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He's devastated that you'd rename $him something other than your name. $He's @@.gold;terrified@@ that you intend to discard $him as your slave wife, and @@.mediumorchid;saddened@@ that you would take away something that was precious to $him.
-					<<set $activeChild.devotion -= 5, $activeChild.trust -= 5>>
-				<</if>>
-			<<elseif $activeChild.devotion < -20 && $activeChild.trust > 20>>
-				<<if $activeChild.slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as $activeChild.slaveName $activeChild.slaveSurname now, $he shows no reaction. You already took everything from $him, what's a name at this point?
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He doesn't care about losing your surname at first, but it quickly sets in that $he may have @@.gold;pushed $his position too far.@@
-					<<set $activeChild.trust -= 20>>
-				<</if>>
-			<<elseif $activeChild.devotion < -20>>
-				<<if $activeChild.slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as $activeChild.slaveName $activeChild.slaveSurname now, $he pleads with you not to steal $his name. It matters little to you, and $he is forced to @@.hotpink;accept your will.@@
-					<<set $activeChild.devotion += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He's @@.mediumorchid;happy@@ to no longer have to share a name with $his tormentor, but the bliss doesn't last long as @@.gold;dread@@ quickly sets in about what this may mean.
-					<<set $activeChild.devotion += 5, $activeChild.trust -= 10>>
-				<</if>>
-			<<else>>
-				<<if $activeChild.slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as $activeChild.slaveName $activeChild.slaveSurname now, $he nods with approval feeling @@.mediumaquamarine;that $he may hold at least some value in your eyes.@@
-					<<set $activeChild.trust += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He accepts that you'd rename $him something other than your name. $He's @@.gold;a little scared@@ that you intend to discard $him as your slave wife, or worse, but realizes this was not only a possibility, but likely.
-					<<set $activeChild.trust -= 5>>
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<</if>> /* close new name check */
diff --git a/src/facilities/nursery/widgets/children/ChildState.js b/src/facilities/nursery/widgets/children/ChildState.js
index 8de31f2d3e8fb185dbe124bb6123328325e7dd3b..4adb08d4e2c425c7988eda3e9315ba5bc86acd24 100644
--- a/src/facilities/nursery/widgets/children/ChildState.js
+++ b/src/facilities/nursery/widgets/children/ChildState.js
@@ -1931,5 +1931,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		this.lastWeeksRepIncome = 0;
 		/** Not currently used, will work similarly to the cash variables above */
 		this.lastWeeksRepExpenses = 0;
+		/** Slave's inbreeding coefficient */
+		this.inbreedingCoeff = 0;
 	}
 };
diff --git a/src/facilities/nursery/widgets/children/longChildDescription.js b/src/facilities/nursery/widgets/children/longChildDescription.js
index c4aa78761a622c029132e842c450a625e3437158..450353465b8c4f5e4969c136c4f78de75959b799 100644
--- a/src/facilities/nursery/widgets/children/longChildDescription.js
+++ b/src/facilities/nursery/widgets/children/longChildDescription.js
@@ -11,15 +11,15 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 		PC = V.PC,
 		slaves = V.slaves,
 		desc = child.actualAge < 13 ? `child` : `teen`, // TODO:
-		girl = V.girl,
 		father = child.father === -1 ? PC : getSlave(child.father),
 		mother = child.mother === -1 ? PC : getSlave(child.mother);
 
 	let
 		r = ``;
 
-	const
-		{ he, him, his, hers, himself, boy, He, His } = getPronouns(child);
+	const {
+		he, him, his, hers, himself, boy, He, His, girl
+	} = getPronouns(child);
 
 	// helper functions
 	function accent(child) {
diff --git a/src/facilities/nursery/widgets/infants/InfantState.js b/src/facilities/nursery/widgets/infants/InfantState.js
index f50c3506b54d851f0bbd744d250c0b8ab9f8644b..bad32d731988231611f9575cd12549d622658b95 100644
--- a/src/facilities/nursery/widgets/infants/InfantState.js
+++ b/src/facilities/nursery/widgets/infants/InfantState.js
@@ -187,5 +187,7 @@ App.Facilities.Nursery.InfantState = class InfantState {
 		this.spermY = 50;
 		/** how many weeks until the child is ready for release */
 		this.growTime = 156;
+		/** Slave's inbreeding coefficient */
+		this.inbreedingCoeff = 0;
 	}
 };
diff --git a/src/facilities/statistics.js b/src/facilities/statistics.js
index 4690d66e91ef59ebbc4d6f56cd9696a336838a46..448b0da00ff0648068614b0ab03032249c2f60de 100644
--- a/src/facilities/statistics.js
+++ b/src/facilities/statistics.js
@@ -507,7 +507,7 @@ App.Facilities.Farmyard.Stats = (function() {
 	const H = new App.Facilities.StatsHelper();
 	const assureList = [ "farmhandIncome", "farmhandCosts", "maintenance", "totalIncome", "totalExpenses", "food", "profit" ];
 
-	/** Generate the arcade statistics table
+	/** Generate the Farmyard statistics table
 	 * @param {boolean} showDetails
 	 * @returns {HTMLElement|DocumentFragment}
 	 */
diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 8140c9442d83218be401d606ebcb797e8e93eb15..61134d4fdcf1cfbf9c3ccfb1d257594439bc8ae6 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -3179,6 +3179,13 @@ MODS
 	What would a slaveowner be without the ability to customize their slaves' bodies? The Free Cities offer a variety of ways to achieve this for an arcology owner. Choose a more particular entry below:
 	<br>
 
+<<case "Inbreeding">>
+	At the intersection of incest and pregnancy lies inbreeding. As seen in royal families throughout history, high levels of inbreeding can result in severe issues, often manifesting as facial deformities or reduced intellectual capacity.
+
+	<br><br>One metric for quantifying inbreeding is the coefficient of inbreeding (CoI), which is the probability that both copies of a person's genes come from the same common ancestor. For example, without any previous inbreeding a child from self-fertilization has a CoI of 0.5, a child of two full siblings has a CoI of 0.25, and a child of two first cousins has a CoI of 0.0625.
+
+	<br><br>Enterprising breeders trying to breed specific traits should be mindful of the inbreeding coefficients of their stock: the higher the coefficient, the higher the chance that children will be slow or deformed.
+
 <<default>>
 	Error: bad title.
 <</switch>>
diff --git a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw
index 977e489706c77724ea61c26500adbdee70b913f6..7fddb42e1033992d8e5f3ea2d6e8e22c61271a87 100644
--- a/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw
+++ b/src/gui/Encyclopedia/encyclopediaRelatedLinks.tw
@@ -244,7 +244,7 @@ SLAVE RELATIONSHIPS
 /**********
 PREGNANCY
 **********/
-<<case "Artificial Insemination" "Breeders Dietary Blend" "Childbirth and C-Secs" "Cloning" "Fertility Mix" "Gestation Drugs and Labor Suppressants" "Hyper-Pregnancy" "Ova Transplantation" "Player Pregnancy" "Pregnancy" "Pregnancy Generator" "Slave Fertility" "Super Fertility Drugs" "Surrogacy">>
+<<case "Artificial Insemination" "Breeders Dietary Blend" "Childbirth and C-Secs" "Cloning" "Fertility Mix" "Gestation Drugs and Labor Suppressants" "Hyper-Pregnancy" "Ova Transplantation" "Player Pregnancy" "Pregnancy" "Pregnancy Generator" "Slave Fertility" "Super Fertility Drugs" "Surrogacy" "Inbreeding">>
 	<<= App.Encyclopedia.Dialog.linkSC("Pregnancy", "Pregnancy")>>
 	| <<= App.Encyclopedia.Dialog.linkSC("Slave Fertility", "Slave Fertility")>>
 	| <<= App.Encyclopedia.Dialog.linkSC("Player Pregnancy", "Player Pregnancy")>>
@@ -261,6 +261,7 @@ PREGNANCY
 	| <<= App.Encyclopedia.Dialog.linkSC("Ova Transplantation", "Ova Transplantation")>>
 	| <<= App.Encyclopedia.Dialog.linkSC("Eugenics Breeding Proposal", "Eugenics Breeding Proposal")>>
 	| <<= App.Encyclopedia.Dialog.linkSC("Repopulationist Breeding School", "Repopulationist Breeding School")>>
+	| <<= App.Encyclopedia.Dialog.linkSC("Inbreeding", "Inbreeding")>>
 
 /**********
 INFLATION
diff --git a/src/gui/css/accordion.css b/src/gui/css/accordion.css
index 18afe84877c3117cba07ff730f7596977ad735fd..81c02b3b460fbcf8d2c8e7b90639453e0e16bc26 100644
--- a/src/gui/css/accordion.css
+++ b/src/gui/css/accordion.css
@@ -1,3 +1,17 @@
+/* --- base functionality --- */
+
+.accordion-content.hidden {
+	display: none;
+}
+
+/* --- no button case --- */
+
+:not(button).accordion {
+	cursor: pointer;
+}
+
+/* --- button/div case --- */
+
 /* style button */
 button.accordion {
 	width: 100%;
@@ -5,13 +19,13 @@ button.accordion {
 	border: 2px solid var(--button-border-color);
 	padding: 10px;
 	padding-left: 2.2em;
-	background-color: var(--button-color);
-	/* for the absolute positioned elements */
+	background-color: var(--button-selected-color);
+	/* to position the open/close symbol */
 	position: relative;
 }
 
-button.accordion.open {
-	background-color: var(--button-selected-color);
+button.accordion.closed {
+	background-color: var(--button-color);
 }
 
 button.accordion.empty {
@@ -28,11 +42,11 @@ button.accordion::before {
 	font-family: "tme-fa-icons";
 	position: absolute;
 	left: 10px;
-	content: "\e81e";
+	content: "\e81c";
 }
 
-button.accordion.open::before {
-	content: "\e81c";
+button.accordion.closed::before {
+	content: "\e81e";
 }
 
 button.accordion.empty::before {
@@ -44,10 +58,6 @@ div.accordion-content {
 	margin: 0 15px;
 }
 
-div.accordion-content.hidden {
-	display: none;
-}
-
 /* modifiers for the toggle button */
 button.accordion span.title {
 	float: left;
@@ -55,4 +65,4 @@ button.accordion span.title {
 
 button.accordion span.info {
 	float: right;
-}
\ No newline at end of file
+}
diff --git a/src/gui/options/summaryOptions.tw b/src/gui/options/summaryOptions.tw
index bb269e7d04b462c6a004bc93f6468a106ef0d059..9c079d55801ba4aedaed37a3247503a442dcf52e 100644
--- a/src/gui/options/summaryOptions.tw
+++ b/src/gui/options/summaryOptions.tw
@@ -43,11 +43,7 @@
 
 <h2>Individual panels</h2>
 Sample summary:
-<<= App.UI.SlaveList.render.listMarkup(
-	[$activeSlave.ID],
-	[],
-	App.UI.SlaveList.SlaveInteract.stdInteract
-)>>
+<<includeDOM App.UI.SlaveList.render([$activeSlave.ID], new Array(), App.UI.SlaveList.SlaveInteract.stdInteract)>>
 
 <<set _options = (new App.UI.OptionsGroup()).enableDoubleColumn()>>
 
diff --git a/src/init/storyInit.tw b/src/init/storyInit.tw
index 326153feebfb9de116e42e385fa908fcc02ddb89..c73026fe4263074d52d6341330cf7fa3143fc67a 100644
--- a/src/init/storyInit.tw
+++ b/src/init/storyInit.tw
@@ -40,7 +40,6 @@ You should have received a copy of the GNU General Public License along with thi
 <</for>>
 
 <<run assistant.object()>>
-<<run FCTV.manage()>>
 <<run repX(1000, "event")>>
 <<run setup.prostheticIDs.forEach(function(id) {
 	$prosthetics[id] = {amount: 0, research: 0};
diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 60ffe65235274f9f99f47bd72db652c28b06260a..d12cd289cfaf93b0ed9bea9b31bbf1c08be0fc0e 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -1873,19 +1873,15 @@ globalThis.walkPast = (function() {
 				t += `is working in ${V.dairyName}, looking after your stock.`;
 				break;
 			default: /* WALKPASTS START HERE */
-				if (slave.heels === 1 && !["flats", "none"].includes(slave.shoes) && canWalk(slave)) {
-					t += `walks past your desk with the tiny swaying steps ${he} must take in order to walk on ${his} surgically altered leg`;
-					if (hasBothLegs(slave)) {
-						t += `s`;
-					}
-					t += `. ${He} is on ${his} way to `;
-				} else if (["heels", "pumps"].includes(slave.shoes) && canWalk(slave)) {
+				if (slave.heels === 1 && canWalk(slave)) {
+					t += `walks past your desk with the tiny swaying steps ${he} must take in order to walk on ${his} surgically altered legs. ${He} is on ${his} way to `;
+				} else if (["heels", "platform heels", "pumps"].includes(slave.shoes) && canWalk(slave)) {
 					t += `walks past your desk with the swaying steps ${he} must take in ${his} high heels. ${He} is on ${his} way to `;
 				} else if (slave.shoes === "boots" && canWalk(slave)) {
 					t += `walks past your desk with the confident gait encouraged by ${his} high heeled boots. ${He} is on ${his} way to `;
-				} else if (slave.shoes === "extreme heels" && canWalk(slave)) {
+				} else if (["extreme heels", "extreme platform heels"].includes(slave.shoes) && canWalk(slave)) {
 					t += `walks past your desk with the tiny swaying steps ${he} must take in ${his} ridiculous heels. ${He} is on ${his} way to `;
-				} else if (slave.heels === 1) {
+				} else if (slave.heels === 1 && canMove(slave)) {
 					t += `crawls past your desk on `;
 					if (hasBothArms(slave) && hasBothLegs(slave)) {
 						t += `all fours, `;
@@ -1896,7 +1892,21 @@ globalThis.walkPast = (function() {
 				} else if (!hasAnyLegs(slave)) {
 					t += `is carried past your desk by one of your other slaves. ${He} is on ${his} way to `;
 				} else if (!canWalk(slave)) {
-					t += `is helped past your desk by one of your other slaves. ${He} is on ${his} way to `;
+					if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							t += `wheels past your desk on ${his} way to`;
+						} else {
+							t += `crawls past your desk on `;
+							if (hasBothArms(slave) && hasBothLegs(slave)) {
+								t += `all fours, `;
+							} else {
+								t += `the ground, `;
+							}
+							t += `since ${he} has expanded past the point of being able to walk. ${He} is on ${his} way to `;
+						}
+					} else {
+						t += `is helped past your desk by one of your other slaves. ${He} is on ${his} way to `;
+					}
 				} else {
 					t += `walks past your desk on ${his} way to `;
 				}
diff --git a/src/interaction/policies/policies.js b/src/interaction/policies/policies.js
index a266ae3e29fca26bd3ea82b645142664a8aba8d5..b2e5ee597a90982a3ddcee19cb83096e3d8a470d 100644
--- a/src/interaction/policies/policies.js
+++ b/src/interaction/policies/policies.js
@@ -1,7 +1,6 @@
 globalThis.policies = (function() {
 	return {
 		countEugenicsSMRs: countEugenicsSMRs,
-		BC: BC,
 		cost: cost,
 	};
 
@@ -19,91 +18,6 @@ globalThis.policies = (function() {
 		return value;
 	}
 
-	function BC() {
-		function convertMain(variable, pro, anti) {
-			if (V[pro]) {
-				V.policies[variable] = 1;
-			} else if (V[anti]) {
-				V.policies[variable] = -1;
-			}
-		}
-
-		function convertRetirement(variable, retireType, amountRequired) {
-			if (V[retireType] && V[amountRequired]) {
-				V.policies.retirement[variable] = V[amountRequired];
-			}
-		}
-
-		if (V.releaseID < 1069) {
-			V.policies.childProtectionAct = V.childProtectionAct;
-			V.policies.culturalOpenness = V.CulturalOpenness;
-			V.policies.sexualOpeness = V.sexualOpeness;
-			V.policies.proRefugees = V.ProRefugees;
-			V.policies.publicFuckdolls = V.publicFuckdolls;
-
-			V.policies.proRecruitment = V.ProRecruitment;
-			V.policies.cash4Babies = V.Cash4Babies;
-			V.policies.regularParties = V.RegularParties;
-			V.policies.publicPA = V.PAPublic;
-			V.policies.coursingAssociation = V.CoursingAssociation;
-
-			V.policies.raidingMercenaries = V.RaidingMercenaries;
-			V.policies.mixedMarriage = V.MixedMarriage;
-			V.policies.goodImageCampaign = V.goodImageCampaign;
-			V.policies.alwaysSubsidizeRep = V.alwaysSubsidizeRep;
-			V.policies.alwaysSubsidizeGrowth = V.alwaysSubsidizeGrowth;
-
-			convertMain('immmigrationCash', 'ProImmigrationCash', 'AntiImmigrationCash');
-			convertMain('immmigrationRep', 'ProImmigrationRep', 'AntiImmigrationRep');
-			convertMain('enslavementCash', 'ProEnslavementCash', 'AntiEnslavementCash');
-			convertMain('enslavementRep', 'ProEnslavementRep', 'AntiEnslavementRep');
-			convertMain('cashForRep', 'CashForRep', 'RepForCash');
-
-			convertMain('oralAppeal', 'OralEncouragement', 'OralDiscouragement');
-			convertMain('vaginalAppeal', 'VaginalEncouragement', 'VaginalDiscouragement');
-			convertMain('analAppeal', 'AnalEncouragement', 'AnalDiscouragement');
-
-			convertRetirement('sex', 'SexMilestoneRetirement', 'retirementSex');
-			convertRetirement('milk', 'MilkMilestoneRetirement', 'retirementMilk');
-			convertRetirement('cum', 'CumMilestoneRetirement', 'retirementCum');
-			convertRetirement('births', 'BirthsMilestoneRetirement', 'retirementBirths');
-			convertRetirement('kills', 'KillsMilestoneRetirement', 'retirementKills');
-
-			if (V.BioreactorRetirement) {
-				V.policies.retirement.fate = "bioreactor";
-			} else if (V.ArcadeRetirement) {
-				V.policies.retirement.fate = "arcade";
-			} else if (V.CitizenRetirement) {
-				V.policies.retirement.fate = "citizen";
-			}
-
-			V.policies.retirement.menial2Citizen = V.citizenRetirementMenials;
-			V.policies.retirement.customAgePolicy = V.policies.retirement.customAgePolicySet || V.CustomRetirementAgePolicy;
-			V.policies.retirement.physicalAgePolicy = V.PhysicalRetirementAgePolicy;
-
-			V.policies.SMR.basicSMR = V.BasicSMR;
-			V.policies.SMR.healthInspectionSMR = V.HealthInspectionSMR;
-			V.policies.SMR.educationSMR = V.EducationSMR;
-			V.policies.SMR.frigiditySMR = V.FrigiditySMR;
-
-			V.policies.SMR.weightSMR = V.BasicWeightSMR;
-			V.policies.SMR.honestySMR = V.HonestySMR;
-
-			V.policies.SMR.beauty.basicSMR = V.BasicBeautySMR;
-			V.policies.SMR.beauty.qualitySMR = V.QualityBeautySMR;
-
-			V.policies.SMR.height.basicSMR = V.BasicHeightSMR;
-			V.policies.SMR.height.advancedSMR = V.AdvancedHeightSMR;
-
-			V.policies.SMR.intelligence.basicSMR = V.BasicIntelligenceSMR;
-			V.policies.SMR.intelligence.qualitySMR = V.QualityIntelligenceSMR;
-
-			V.policies.SMR.eugenics.faceSMR = V.FaceEugenicsSMR;
-			V.policies.SMR.eugenics.heightSMR = V.HeightEugenicsSMR;
-			V.policies.SMR.eugenics.intelligenceSMR = V.IntelligenceEugenicsSMR;
-		}
-	}
-
 	function cost() { return 5000; }
 })();
 /**
diff --git a/src/interaction/prostheticConfig.tw b/src/interaction/prostheticConfig.tw
index 9a070a53933a6e406785c591216302b9d9ee3be2..8a68dbe21a99b923a830f662d4882e026c8c74ad 100644
--- a/src/interaction/prostheticConfig.tw
+++ b/src/interaction/prostheticConfig.tw
@@ -115,7 +115,7 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a
 	</p>
 
 	<p class="indent">
-	$He has <<print App.Desc.eyesColor(getSlave($AS))>>. To change $his eye color visit the [[auto salon|Salon][$primaryHairColor = "", $secondaryHairColor = "", $primaryEarColor = "", $secondaryEarColor = "", $primaryTailColor = "", $secondaryTailColor = "", $artificialEyeColor = "", $artificialEyeShape = "",$artificialEyeFill = ""]].
+	$He has <<print App.Desc.eyesColor(getSlave($AS))>>. To change $his eye color visit the [[auto salon|Salon]].
 	</p>
 <</if>>
 
diff --git a/src/interaction/rename.js b/src/interaction/rename.js
new file mode 100644
index 0000000000000000000000000000000000000000..c852ef4feb9d553cb105f6a7a60f7e76823d2799
--- /dev/null
+++ b/src/interaction/rename.js
@@ -0,0 +1,152 @@
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @param {object} params
+ * @param {string} [params.oldName] Their name before you renamed them by calling this function
+ * @param {string} [params.oldSurname] Their surname before you renamed them by calling this function
+ */
+App.UI.SlaveInteract.rename = function(slave, {oldName = "", oldSurname = ""} = {}) {
+	const r = [];
+	const {He, he, His, his, him, girl, himself, wife} = getPronouns(slave);
+	if (slave.slaveName === oldName && slave.slaveSurname === oldSurname) {
+		return;
+	} else {
+		/* First time renaming reaction */
+		if (slave.slaveName === "" || !(slave.hasOwnProperty("slaveName"))) {
+			r.push(`${oldName} needs to be called something on the records, so ${oldName} ${he} stays.`);
+			slave.slaveName = oldName;
+		} else if (slave.fetish === "mindbroken") {
+			r.push(`${slave.slaveName} doesn't even recognize that ${he}'s been renamed. It simply does not register.`);
+		} else if ((oldName !== slave.birthName && slave.slaveName === slave.birthName) || (oldSurname !== slave.birthSurname && slave.slaveSurname === slave.birthSurname)) {
+			r.push(`${slave.slaveName}`);
+			if (slave.devotion > 50) {
+				r.push(`cheerfully accepts ${his} old name back.`);
+			} else if (slave.devotion >= -20) {
+				r.push(`obediently accepts ${his} old name back.`);
+			} else if (slave.devotion >= -50) {
+				r.push(`happily accepts ${his} original name.`);
+			} else if (slave.trust > 20) {
+				r.push(`scoffs at the notion that ${he} was ever anything other than ${SlaveFullBirthName(slave)}, <span class="orangered">weakening your control over ${him}.</span>`);
+				slave.trust += 5;
+			} else {
+				r.push(`cautiously accepts the return of ${his} name.`);
+			}
+		} else if ((oldName === slave.birthName && slave.slaveName !== slave.birthName) || (oldSurname === slave.birthSurname && slave.slaveSurname !== slave.birthSurname)) {
+			r.push(`${slave.slaveName}`);
+			if (slave.devotion > 50) {
+				r.push(`accepts ${his} new name cheerfully. This attachment to you <span class="devotion inc"> increases ${his} devotion.</span>`);
+				slave.devotion += 4;
+			} else if (slave.devotion >= -20) {
+				r.push(`obediently accepts ${his} new name. This surrender to you <span class="devotion inc"> increases ${his} obedience.</span>`);
+				slave.devotion += 4;
+			} else if (slave.devotion >= -50) {
+				r.push(`reluctantly accepts ${his} new name.`);
+			} else {
+				r.push(`angrily tries to resist ${his} new name, insisting that ${his} name is ${SlaveFullBirthName(slave)}. This resistance <span class="devotion dec"> increases ${his} rebelliousness.</span>`);
+				slave.devotion -= 5;
+			}
+		} else {
+			r.push(`Since ${slave.slaveName} has already had a new name`);
+			if (slave.devotion > 20) {
+				r.push(`given to`);
+			} else {
+				r.push(`forced on`);
+			}
+			r.push(`${him} before, the mere fact of having it changed again doesn't really affect ${him}.`);
+		}
+
+		let insultingName = false;
+		let toSearch;
+		if (oldName !== slave.slaveName && typeof slave.slaveName === "string") {
+			toSearch = slave.slaveName.toLowerCase();
+			insultingName = setup.badWords.some((s) => toSearch.includes(s));
+		}
+		if (!insultingName) {
+			if (oldSurname !== slave.slaveSurname && typeof slave.slaveSurname === "string") {
+				toSearch = slave.slaveSurname.toLowerCase();
+				insultingName = setup.badWords.some((s) => toSearch.includes(s));
+			}
+		}
+		if (insultingName) {
+			if (slave.fetish === "mindbroken") {
+				r.push(`${His} new name would be insulting to a normal ${girl}, but ${he} dully accepts that it is an accurate description and goes about ${his} duties.`);
+			} else if (slave.devotion < -50) {
+				r.push(`Being given such a degrading name <span class="devotion dec">further increases ${his} hatred</span> of you.`);
+				slave.devotion -= 5;
+			} else if (slave.devotion <= 50) {
+				r.push(`Being given such a degrading name <span class="trust dec">terrifies ${him},</span> since ${he} thinks it's fair warning for what ${he}'ll suffer in the future.`);
+				slave.trust -= 5;
+			}
+		}
+
+		/* Wife's surname reaction */
+		if (oldSurname !== slave.slaveSurname) {
+			if (slave.relationship >= 5) {
+				const slaveWife = getSlave(slave.relationshipTarget);
+				if (!slaveWife) {
+					r.push(`<span class="red">Error, relationshipTarget not found.</span>`);
+				} else {
+					if (slaveWife.slaveSurname) {
+						const {wife2} = getPronouns(slaveWife).appendSuffix('2');
+						if (slave.slaveSurname === slaveWife.slaveSurname) {
+							r.push(`${He}'s touched that ${he} now shares a surname with ${his} ${wife2} ${slaveWife.slaveName} ${slaveWife.slaveSurname}, and is <span class="trust inc">more confident than ever</span> that you intend to keep them together in marital bliss.`);
+							slave.trust += 5;
+						} else if (oldSurname === slaveWife.slaveSurname) {
+							r.push(`${He}'s concerned that ${he} no longer shares a surname with ${his} ${wife2} ${slaveWife.slaveName} ${slaveWife.slaveSurname}, and is <span class="trust dec">very worried</span> that you might be considering splitting them up.`);
+							slave.trust -= 5;
+						}
+					}
+				}
+			}
+		}
+
+		/* PC's surname reaction */
+		if (oldSurname !== slave.slaveSurname) {
+			if (slave.relationship === -3) {
+				if (V.PC.slaveSurname) {
+					if (slave.fetish === "mindbroken") {
+						r.push(`Names are meaningless to ${him} and it is unlikely ${he}'ll remember it.`);
+					} else if (slave.devotion + slave.trust >= 175) {
+						if (slave.slaveSurname === V.PC.slaveSurname) {
+							r.push(`When you tell ${him} that ${he}'s to be known as ${slave.slaveName} ${slave.slaveSurname} now, ${he} starts to cry. ${He} tries to get ${himself} under control and thank you as best ${he} can,`);
+							if (hasAnyArms(slave)) {
+								r.push(`wiping at the tears running down ${his} ${slave.skin} cheeks,`);
+							}
+							r.push(`but ${he} can't seem to stop weeping as ${he} thanks you over and over. ${He}'s a sex slave, your property, and it's understandable that some doubts about the permanence of ${his} place as your slave ${wife}. This has <span class="trust inc">helped reassure ${him},</span> and explains the strength of ${his} emotional reaction. The next time you make love to ${him}, ${he} <span class="devotion inc">presses ${himself} as close to you as ${he} can,</span> eager to drink in as much of your presence as ${he} can get.`);
+							slave.devotion += 5;
+							slave.trust += 5;
+						} else if (oldSurname === V.PC.slaveSurname) {
+							r.push(`${He}'s devastated that you'd rename ${him} something other than your name. ${He}'s <span class="trust dec">terrified</span> that you intend to discard ${him} as your slave ${V.wife}, and <span class="devotion dec">saddened</span> that you would take away something that was precious to ${him}.`);
+							slave.devotion -= 5;
+							slave.trust -= 5;
+						}
+					} else if (slave.devotion < -20 && slave.trust > 20) {
+						if (slave.slaveSurname === V.PC.slaveSurname) {
+							r.push(`When you tell ${him} that ${he}'s to be known as ${slave.slaveName} ${slave.slaveSurname} now, ${he} shows no reaction. You already took everything from ${him}, what's a name at this point?`);
+						} else if (oldSurname === V.PC.slaveSurname) {
+							r.push(`${He} doesn't care about losing your surname at first, but it quickly sets in that ${he} may have <span class="trust dec">pushed ${his} position too far.</span>`);
+							slave.trust -= 20;
+						}
+					} else if (slave.devotion < -20) {
+						if (slave.slaveSurname === V.PC.slaveSurname) {
+							r.push(`When you tell ${him} that ${he}'s to be known as ${slave.slaveName} ${slave.slaveSurname} now, ${he} pleads with you not to steal ${his} name. It matters little to you, and ${he} is forced to <span class="devotion inc">accept your will.</span>`);
+							slave.devotion += 5;
+						} else if (oldSurname === V.PC.slaveSurname) {
+							r.push(`${He}'s <span class="devotion dec">happy</span> to no longer have to share a name with ${his} tormentor, but the bliss doesn't last long as <span class="trust dec">dread</span> quickly sets in about what this may mean.`);
+							slave.devotion += 5;
+							slave.trust -= 10;
+						}
+					} else {
+						if (slave.slaveSurname === V.PC.slaveSurname) {
+							r.push(`When you tell ${him} that ${he}'s to be known as ${slave.slaveName} ${slave.slaveSurname} now, ${he} nods with approval feeling <span class="trust inc">that ${he} may hold at least some value in your eyes.</span>`);
+							slave.trust += 5;
+						} else if (oldSurname === V.PC.slaveSurname) {
+							r.push(`${He} accepts that you'd rename ${him} something other than your name. ${He}'s <span class="trust dec">a little scared</span> that you intend to discard ${him} as your slave ${V.wife}, or worse, but realizes this was not only a possibility, but likely.`);
+							slave.trust -= 5;
+						}
+					}
+				}
+			}
+		}
+	}
+	return jQuery("#rename").empty().append(r.join(" "));
+};
diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js
index aa4bd94453b88fda2c8d558fa610f5f0b9f14c5e..8d7ed15a39a17e516150009abfaace5c0aa81970 100644
--- a/src/interaction/slaveInteract.js
+++ b/src/interaction/slaveInteract.js
@@ -61,15 +61,6 @@ App.UI.SlaveInteract.modify = function(slave) {
 	makeRoomLink(el, "Auto salon", "Salon", ' Modify hair (color, length, style), nails, and even skin color.',
 		() => {
 			V.activeSlave = slave;
-			V.primaryHairColor = "";
-			V.secondaryHairColor = "";
-			V.primaryEarColor = "";
-			V.secondaryEarColor = "";
-			V.primaryTailColor = "";
-			V.secondaryTailColor = "";
-			V.artificialEyeColor = "";
-			V.artificialEyeShape = "";
-			V.artificialEyeFill = "";
 		}
 	);
 
@@ -793,7 +784,7 @@ App.UI.SlaveInteract.diet = function(slave) {
 	if ((slave.muscles > 5 || slave.fuckdoll === 0) && canWalk(slave)) {
 		muscle.push({text: `Slim down`, updateSlave: {diet: "slimming"}});
 	} else if (!canWalk(slave)) {
-		muscle.push({text: `Slim down`, disabled: `${He} can't move and thus can't trim down`});
+		muscle.push({text: `Slim down`, disabled: `${He} can't walk and thus can't trim down`});
 	} else if (slave.fuckdoll > 0) {
 		muscle.push({text: `Slim down`, disabled: `${He} has no muscles left to lose`});
 	}
@@ -1112,14 +1103,14 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 		} else if (slave.clit >= 4) {
 			sexOptions.push({text: `Have another slave ride ${his} clit-dick`, scene: `FSlaveSlaveDick`});
 		}
-		if (V.seeBestiality && V.cheatMode === 1) {
-			if (V.farmyardKennels > 0 && V.activeCanine !== 0) {
+		if (V.seeBestiality) {
+			if (V.farmyardKennels > 0 && V.activeCanine) {
 				sexOptions.push({text: `Have a ${V.activeCanine.species} mount ${him}`, scene: `BeastFucked`, update: {animalType: "canine"}});
 			}
-			if (V.farmyardStable > 0 && V.activeHooved !== 0) {
+			if (V.farmyardStables > 0 && V.activeHooved) {
 				sexOptions.push({text: `Let a ${V.activeHooved.species} mount ${him}`, scene: `BeastFucked`, update: {animalType: "hooved"}});
 			}
-			if (V.farmyardCages > 0 && V.activeFeline !== 0) {
+			if (V.farmyardCages > 0 && V.activeFeline) {
 				sexOptions.push({text: `Have a ${V.activeFeline.species} mount ${him}`, scene: `BeastFucked`, update: {animalType: "feline"}});
 			}
 		}
@@ -2206,6 +2197,21 @@ App.UI.SlaveInteract.rules = function(slave) {
 		}
 	}
 
+	// Mobility Aids
+	if (slave.fuckdoll > 0) {
+		// Sex toys don't move around on their own//
+	} else if (canMove(slave)) {
+		div = document.createElement("div");
+		div.append("Use of mobility aids: ");
+		App.UI.DOM.appendNewElement("span", div, slave.rules.mobility, "bold");
+		choices = [
+			{value: "restrictive"},
+			{value: "permissive"},
+		];
+		div.append(listChoices(choices, "mobility"));
+		p.append(div);
+	}
+
 	// Punishment
 	div = document.createElement("div");
 	div.append("Typical punishment: ");
@@ -2480,14 +2486,19 @@ App.UI.SlaveInteract.custom = (function() {
 	}
 
 	function intro(slave) {
-		V.oldName = slave.slaveName;
-		V.oldSurname = slave.slaveSurname;
-		let intro = document.createElement('p');
-		intro.className = "scene-intro";
-		intro.append(`You may enter custom descriptors for your slave's hair color, hair style, tattoos, or anything else here. After typing, press `);
-		intro.appendChild(App.UI.DOM.makeElement("kbd", "enter"));
-		intro.append(` to commit your change. These custom descriptors will appear in descriptions of your slave, but will have no gameplay effect. Changing them is free.`);
-		return intro;
+		const frag = new DocumentFragment();
+		let p;
+		p = document.createElement('p');
+		p.id = "rename";
+		frag.append(p);
+
+		p = document.createElement('p');
+		p.className = "scene-p";
+		p.append(`You may enter custom descriptors for your slave's hair color, hair style, tattoos, or anything else here. After typing, press `);
+		p.appendChild(App.UI.DOM.makeElement("kbd", "enter"));
+		p.append(` to commit your change. These custom descriptors will appear in descriptions of your slave, but will have no gameplay effect. Changing them is free.`);
+		frag.append(p);
+		return frag;
 	}
 
 	function playerTitle(slave) {
@@ -2606,6 +2617,8 @@ App.UI.SlaveInteract.custom = (function() {
 		return slaveFullNameNode;
 
 		function slaveName() {
+			const oldName = slave.slaveName;
+			const oldSurname = slave.slaveSurname;
 			// Slave Name
 			let slaveNameNode = document.createElement('p');
 			label = document.createElement('div');
@@ -2623,9 +2636,10 @@ App.UI.SlaveInteract.custom = (function() {
 				slave.slaveName,
 				v => {
 					slave.slaveName = v;
+					updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 				},
 				false,
-				"Rename");
+			);
 			label.appendChild(textbox);
 
 			slaveNameNode.appendChild(label);
@@ -2634,9 +2648,9 @@ App.UI.SlaveInteract.custom = (function() {
 				` Restore ${his} birth name`,
 				() => {
 					slave.slaveName = slave.birthName;
+					updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 				},
 				false,
-				"Rename"
 			));
 
 			if (V.arcologies[0].FSPastoralist !== "unset") {
@@ -2646,9 +2660,9 @@ App.UI.SlaveInteract.custom = (function() {
 						`Give ${him} a random cow given name`,
 						() => {
 							slave.slaveName = setup.cowSlaveNames.random();
+							updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 						},
 						false,
-						"Rename"
 					));
 				}
 			}
@@ -2659,9 +2673,9 @@ App.UI.SlaveInteract.custom = (function() {
 						`Give ${him} a random stipper given name`,
 						() => {
 							slave.slaveName = setup.bimboSlaveNames.random();
+							updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 						},
 						false,
-						"Rename"
 					));
 				}
 			}
@@ -2671,9 +2685,9 @@ App.UI.SlaveInteract.custom = (function() {
 					`Give ${him} a random devotional given name`,
 					() => {
 						slave.slaveName = setup.chattelReligionistSlaveNames.random();
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			}
 			slaveNameNode.appendChild(result);
@@ -2682,6 +2696,8 @@ App.UI.SlaveInteract.custom = (function() {
 
 		function slaveSurname() {
 			// Slave Surname
+			const oldName = slave.slaveName;
+			const oldSurname = slave.slaveSurname;
 			let slaveSurnameNode = document.createElement('p');
 			label = document.createElement('div');
 			result = document.createElement('div');
@@ -2698,9 +2714,9 @@ App.UI.SlaveInteract.custom = (function() {
 				slave.slaveSurname,
 				v => {
 					slave.slaveSurname = textbox.value;
+					updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 				},
 				false,
-				"Rename"
 			);
 			label.appendChild(textbox);
 
@@ -2710,9 +2726,9 @@ App.UI.SlaveInteract.custom = (function() {
 				` Restore ${his} birth surname`,
 				() => {
 					slave.slaveSurname = slave.birthSurname;
+					updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 				},
 				false,
-				"Rename"
 			));
 
 			if (slave.slaveSurname) {
@@ -2721,9 +2737,9 @@ App.UI.SlaveInteract.custom = (function() {
 					`Take ${his} surname away`,
 					() => {
 						slave.slaveSurname = 0;
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			}
 			if (slave.relationship >= 5) {
@@ -2737,9 +2753,9 @@ App.UI.SlaveInteract.custom = (function() {
 									`Give ${him} ${his} ${wifePronouns.wife}'s surname`,
 									() => {
 										slave.slaveSurname = V.slaves[_i].slaveSurname;
+										updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 									},
 									false,
-									"Rename"
 								));
 								break;
 							}
@@ -2755,9 +2771,9 @@ App.UI.SlaveInteract.custom = (function() {
 							`Give ${him} your surname`,
 							() => {
 								slave.slaveSurname = V.PC.slaveSurname;
+								updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 							},
 							false,
-							"Rename"
 						));
 					}
 				}
@@ -2769,9 +2785,9 @@ App.UI.SlaveInteract.custom = (function() {
 					() => {
 						slave.slaveName = setup.romanSlaveNames.random();
 						slave.slaveSurname = setup.romanSlaveSurnames.random();
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			} else if (V.arcologies[0].FSAztecRevivalist !== "unset") {
 				result.append(` | `);
@@ -2780,9 +2796,9 @@ App.UI.SlaveInteract.custom = (function() {
 					() => {
 						slave.slaveName = setup.aztecSlaveNames.random();
 						slave.slaveSurname = 0;
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			} else if (V.arcologies[0].FSEgyptianRevivalist !== "unset") {
 				result.append(` | `);
@@ -2791,9 +2807,9 @@ App.UI.SlaveInteract.custom = (function() {
 					() => {
 						slave.slaveName = setup.ancientEgyptianSlaveNames.random();
 						slave.slaveSurname = 0;
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			} else if (V.arcologies[0].FSEdoRevivalist !== "unset") {
 				result.append(` | `);
@@ -2802,9 +2818,9 @@ App.UI.SlaveInteract.custom = (function() {
 					() => {
 						slave.slaveName = setup.edoSlaveNames.random();
 						slave.slaveSurname = setup.edoSlaveSurnames.random();
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			}
 			if (V.arcologies[0].FSDegradationist > -1) {
@@ -2813,14 +2829,18 @@ App.UI.SlaveInteract.custom = (function() {
 					`Give ${him} a degrading full name`,
 					() => {
 						DegradingName(slave);
+						updateName(slave, {oldName:oldName, oldSurname:oldSurname});
 					},
 					false,
-					"Rename"
 				));
 			}
 			slaveSurnameNode.appendChild(result);
 			return slaveSurnameNode;
 		}
+		function updateName(slave, {oldName:oldName, oldSurname:oldSurname}) {
+			App.UI.SlaveInteract.custom(slave);
+			App.UI.SlaveInteract.rename(slave, {oldName:oldName, oldSurname:oldSurname});
+		}
 	}
 
 	function hair(slave) {
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 92f35f702d2f61f60101b8c11ff2fd131ffaa698..7a8469dc6fe4b89ee1e84105d53958106b3995ab 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -2507,6 +2507,8 @@ App.Entity.SlaveState = class SlaveState {
 		this.whoreClass = 0;
 		/** Maximum class for whore to target */
 		this.effectiveWhoreClass = 0;
+		/** Slave's inbreeding coefficient */
+		this.inbreedingCoeff = 0;
 	}
 
 	/** Creates an object suitable for setting nested attributes as it would be a SlaveState
diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 5be576962ca5afce0b39732b498a65cd20d8935b..7e78cef8ba5171088bbdc4ec2e9006f26e4a546f 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -462,17 +462,12 @@ globalThis.getWrittenTitle = function(slave) {
 	}
 };
 
-/** Get the written title for a given slave, or for the most recently enunciated slave, write it into global state, and return it.
+/** Get the written title for a given slave, or for the active slave if none is provided.
  * @param {App.Entity.SlaveState} [slave]
  * @returns {string}
  */
 globalThis.WrittenMaster = function(slave) {
-	if (slave !== undefined) {
-		V.writtenTitle = getWrittenTitle(slave);
-	} else if (V.writtenTitle === undefined) {
-		V.writtenTitle = getWrittenTitle(V.activeSlave);
-	}
-	return V.writtenTitle;
+	return getWrittenTitle(slave || V.activeSlave);
 };
 
 /** Get all the enunciations used by a particular slave as a destructurable object.
@@ -659,7 +654,6 @@ globalThis.getEnunciation = function(slave) {
  */
 globalThis.Enunciate = function(slave) {
 	V.enunciate = getEnunciation(slave);
-	V.writtenTitle = getWrittenTitle(slave);
 };
 
 /**
@@ -1842,7 +1836,7 @@ globalThis.Deadliness = function(slave) {
 	deadliness -= getLimbCount(slave, 4) * 0.25;
 	deadliness += getLimbCount(slave, 5) * 1.25;
 	deadliness += getLimbCount(slave, 6) * 2.5;
-	if (hasBothLegs(slave) && !canWalk(slave)) {
+	if (hasBothLegs(slave) && !canStand(slave)) {
 		deadliness -= 20;
 	}
 
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 2f5b97a3dd332f048f98eb72162ef773808cc4d6..f3627cce627dba083f81d4546cd29ed5ef60a6d0 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -608,10 +608,10 @@ globalThis.calculateCosts = (function() {
 		return (
 			(
 				(facility)
-				+(0.1*V.farmyardUpgrade.fertilizer*facility)
-				-(0.2*V.farmyardUpgrade.hydroponics*facility)
-				+(0.2*V.farmyardUpgrade.seeds*facility)
-				-(0.4*V.farmyardUpgrade.machinery*facility)
+				+(0.1*V.farmyardUpgrades.fertilizer*facility)
+				-(0.2*V.farmyardUpgrades.hydroponics*facility)
+				+(0.2*V.farmyardUpgrades.seeds*facility)
+				-(0.4*V.farmyardUpgrades.machinery*facility)
 			)*2
 		);
 	}
@@ -1199,8 +1199,10 @@ globalThis.getSlaveCostArray = function(s) {
 		retval.push({text: "Increased living expenses due to muffled hearing", value: 15});
 	}
 	if ((s.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2) && (s.assignment !== Job.ARCADE)) {
-		if (!canWalk) {
+		if (!canMove) {
 			retval.push({text: "Increased living expenses due to immobility", value: rulesCost});
+		} else if (!canWalk) {
+			retval.push({text: "Increased living expenses due to limited mobility", value: rulesCost * 0.50});
 		} else {
 			if (!hasAllLimbs(s)) {
 				retval.push({
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 514d1cdb4b20b5e2b7c9566406c03e00d4203249..e24e3bccc44de172f246f61f02250a2ecdf360e8 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -537,20 +537,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 					}
 				}
 
-				if (V.PC.dick > 0) {
-					if (V.PC.belly < 5000) {
-						if (eventSlave.assignment === Job.HOUSE) {
-							if (eventSlave.attrXY <= 35 || eventSlave.behavioralFlaw === "hates men" || eventSlave.sexualFlaw === "repressed") {
-								if (eventSlave.devotion >= -20) {
-									if (eventSlave.trust > 20) {
-										V.RESSevent.push("frightening dick");
-									}
-								}
-							}
-						}
-					}
-				}
-
 				if (V.spa > 0) {
 					if (eventSlave.boobs > 2000) {
 						if (eventSlave.devotion > 20) {
@@ -595,28 +581,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 					}
 				}
 
-				if (canTalk(eventSlave)) {
-					if (eventSlave.dietCum > 0) {
-						if (eventSlave.diet === "fattening") {
-							if (eventSlave.trust >= -50) {
-								if (eventSlave.fetish !== "cumslut") {
-									if (eventSlave.weight < -30) {
-										if (eventSlave.health.condition > -80) {
-											if (eventSlave.behavioralFlaw !== "anorexic") {
-												if (eventSlave.sexualFlaw !== "self hating") {
-													if (eventSlave.fetishStrength <= 60 || eventSlave.fetishKnown !== 1) {
-														V.RESSevent.push("too thin for cum diet");
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
 				if (eventSlave.drugs === "intensive breast injections" || eventSlave.drugs === "hyper breast injections") {
 					if (eventSlave.boobs <= 8000) {
 						if (eventSlave.boobs > 2000) {
@@ -655,26 +619,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 					}
 				}
 
-				if (eventSlave.health.condition > 90) {
-					if (eventSlave.muscles > 5) {
-						if (eventSlave.weight <= 30) {
-							if (eventSlave.weight >= -30) {
-								if (eventSlave.trust > 50) {
-									if (eventSlave.devotion > 50) {
-										V.RESSevent.push("passing declaration");
-									}
-								}
-							}
-						}
-					}
-				}
-
-				if (eventSlave.trust < -50) {
-					if (eventSlave.devotion <= 50) {
-						V.RESSevent.push("im scared");
-					}
-				}
-
 				if (eventSlave.fetish === "sadist") {
 					if (eventSlave.fetishStrength > 20) {
 						if (App.Entity.facilities.arcade.established) {
@@ -1886,18 +1830,6 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) {
 					}
 				}
 
-				if (V.PC.dick > 0) {
-					if (V.PC.belly < 5000) {
-						if (eventSlave.attrXY <= 35 || eventSlave.behavioralFlaw === "hates men" || eventSlave.sexualFlaw === "repressed") {
-							if (eventSlave.devotion >= -20) {
-								if (eventSlave.trust > 20) {
-									V.RESSevent.push("frightening dick");
-								}
-							}
-						}
-					}
-				}
-
 				if (V.spa > 0) {
 					if (eventSlave.boobs > 2000) {
 						if (eventSlave.devotion > 20) {
@@ -1942,42 +1874,6 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) {
 					}
 				}
 
-				if (canTalk(eventSlave)) {
-					if (eventSlave.dietCum > 0) {
-						if (eventSlave.diet === "fattening") {
-							if (eventSlave.trust >= -50) {
-								if (eventSlave.fetish !== "cumslut") {
-									if (eventSlave.weight < -30) {
-										if (eventSlave.health.condition > -80) {
-											if (eventSlave.behavioralFlaw !== "anorexic") {
-												if (eventSlave.sexualFlaw !== "self hating") {
-													if (eventSlave.fetishStrength <= 60 || eventSlave.fetishKnown !== 1) {
-														V.RESSevent.push("too thin for cum diet");
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-
-				if (eventSlave.health.condition > 90) {
-					if (eventSlave.muscles > 5) {
-						if (eventSlave.weight <= 30) {
-							if (eventSlave.weight >= -30) {
-								if (eventSlave.trust > 50) {
-									if (eventSlave.devotion > 50) {
-										V.RESSevent.push("passing declaration");
-									}
-								}
-							}
-						}
-					}
-				}
-
 				if (eventSlave.fetish === "sadist") {
 					if (eventSlave.fetishStrength > 20) {
 						if (App.Entity.facilities.arcade.established) {
diff --git a/src/js/findSlave.js b/src/js/findSlave.js
index 6587925d17b6a6508b246b1b342a3ca0b6c7e6d6..bd138ce9bdcad7685308e764fd152f2068582594 100644
--- a/src/js/findSlave.js
+++ b/src/js/findSlave.js
@@ -34,7 +34,7 @@ App.FindSlave._appendResultList = function(ids, frag) {
 	if (ids.length === 0) {
 		App.UI.DOM.appendNewElement("p", frag, "No matching slaves.");
 	} else {
-		frag.appendChild(App.UI.SlaveList.render.listDOM(ids, [], App.UI.SlaveList.SlaveInteract.stdInteract));
+		frag.appendChild(App.UI.SlaveList.render(ids, [], App.UI.SlaveList.SlaveInteract.stdInteract));
 	}
 };
 
diff --git a/src/js/food.js b/src/js/food.js
deleted file mode 100644
index 6ff8ce76947e838f606b7ad3394e1b040a6d8ec8..0000000000000000000000000000000000000000
--- a/src/js/food.js
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * @param {App.Entity.SlaveState} slave
- * @returns {number}
- */
-App.Facilities.Farmyard.foodAmount = function(slave) {
-	if (!slave) {
-		return `Current slave is not valid. Please report this`;
-	}
-	let food = 150;													// kg of food produced per week by slave, before upgrades
-	if (V.farmyardUpgrade.pump === 1) {
-		food += 15;													// pump upgrade for farmyard
-	}
-	if (V.farmyardUpgrade.fertilizer === 1) {
-		food += 35;													// fertilizer upgrade for farmyard
-	}
-	if (V.farmyardUpgrade.seeds === 1) {
-		food += 65;													// seeds upgrade for farmyard
-	}
-	if (V.farmyardUpgrade.machinery === 1) {
-		food += 65;													// machinery upgrade for farmyard
-	}
-	if (V.Farmer !== 0) {										// if a farmer is assigned
-		food *= 1.1;											// TODO: expand this to account for farmer XP and skill
-		if (V.Farmer.skill.farmer >= V.masteredXP) {			// if farmer is master
-			food *= 1.1;
-		}
-	}
-	if (slave.devotion > 50) {
-		food *= 1.1;
-	} else if (slave.devotion < -50) {
-		food *= 0.8;
-	}
-	if (slave.muscles > 30) {									// slave is muscular or more
-		food *= 1.1;
-	} else if (slave.muscles <= -6) {							// slave is weak or less
-		food *= 0.8;
-	}
-	if (slave.weight > 95) {									// slave is overweight or more
-		food *= 0.9;
-	} else if (slave.weight > 130) {							// slave is fat or more
-		food *= 0.8;
-	} else if (slave.weight > 160) {							// slave is obese or more
-		food *= 0.7;
-	} else if (slave.weight > 190) {							// slave is very obese or more
-		food *= 0.6;
-	}
-	if (!canSee(slave)) {										// slave is blind
-		food *= 0.6;
-	} else if (!canSeePerfectly(slave)) {						// slave is nearsighted
-		food *= 0.8;
-	}
-	if (slave.hears === -1) {									// slave is hard of hearing
-		food *= 0.8;
-	} else if (slave.hears < -1) {								// slave is deaf
-		food *= 0.6;
-	}
-	food *= restEffects(slave, 20);
-	food = Math.trunc(food);
-	food = Math.clamp(food, 1, 1000000000000000000);
-	return food;
-};
-
-/**
- * @param {App.Entity.SlaveState} slave
- * @returns {number}
- */
-App.Facilities.Farmyard.farmShowsIncome = function(slave) {
-	// TODO: incorporate farmyardRestraints
-	let arcology = V.arcologies[0];
-	let cash = 100;													// TODO: this is just a placeholder
-	if (!slave) {
-		return null;
-	} else {
-		if (V.Farmer !== 0) {										// farmer is assigned
-			cash *= 1.1;
-			if (V.Farmer.skill.farmer >= V.masteredXP) {			// farmer is master
-				cash *= 1.1;
-			}
-		}
-		/* OPEN FS EFFECTS */
-		if (arcology.FSSupremacist !== "unset") {
-			if (slave.race === arcology.FSSupremacistRace) {		// slave is of supreme race
-				cash *= 0.9;										// TODO: should supreme race slaves receive a penalty?
-				repX(-10, "food");									// TODO: should this cause a rep loss
-			}
-		}
-		if (arcology.FSSubjugationist !== "unset") {
-			if (slave.race === arcology.FSSubjugationistRace) { 	// slave is of subjugated race
-				cash *= 1.1;
-				repX(10, "food");									// TODO: should this cause a rep gain?
-			} else {
-				cash *= 0.9;										// TODO: should unsubjugated race slaves receive a penalty?
-			}
-		}
-		if (arcology.FSRepopulationFocus !== "unset") {
-			if (slave.pregWeek > 16) {								// slave is visibly pregnant
-				if (slave.eggType !== "human") {					// with a non-human
-					cash *= 1.1;
-				}
-				cash *= 1.2;
-			} else {												// slave is not visibly pregnant
-				cash *= 0.8;										// TODO: should non-pregnant slaves receive a penalty?
-			}
-		}
-		if (arcology.FSRestart !== "unset") {
-			if (slave.pregWeek > 16) {								// slave is visibly pregnant
-				if (slave.eggType !== "human") {					// with a non-human
-					cash *= 0.9;
-					repX(-15, "food");
-				}
-				cash *= 0.6;
-				repX(-10, "food");
-			}
-		}
-		if (arcology.FSGenderRadicalist !== "unset") {
-			if (slave.dick > 0) {									// TODO: does this make sense?
-				cash *= 1.1;
-			} else {
-				cash *= 0.8;
-			}
-		}
-		if (arcology.FSGenderFundamentalist !== "unset") {
-			if (slave.dick > 0) {
-				cash *= 1.1;										// TODO: does this make sense?
-			} else {
-				cash *= 0.8;
-			}
-		}
-		if (arcology.FSPaternalist !== "unset") {
-			if (V.seeBestiality) {
-				if (V.farmyardBreeding === 1) {						// slaves are being bred
-					cash *= 0.8;
-				} else {											// slaves are putting on shows
-					cash *= 0.9;
-				}
-			}
-		}
-		if (arcology.FSDegradationist !== "unset") {
-			if (V.seeBestiality) {
-				if (V.farmyardBreeding === 1) {						// slaves are being bred
-					cash *= 1.2;
-				} else {											// slaves are putting on shows
-					cash *= 1.1;
-				}
-			}
-		}
-		if (arcology.FSBodyPurist !== "unset") {
-			if (slave.boobsImplant > 0) {							// slave has breast implants
-				cash *= 0.9;
-			}
-			if (slave.buttImplant > 0) {							// slave has butt implants
-				cash *= 0.9;
-			}
-			if (slave.faceImplant > 0) {							// slave has had facial surgery
-				cash *= 0.9;
-			}
-			if (slave.lipsImplant > 0) {							// slave has lip implants
-				cash *= 0.9;
-			}
-		}
-		if (arcology.FSTransformationFetishist !== "unset") {
-			if (slave.boobsImplant > 0) {							// slave has breast implants
-				cash *= 1.1;
-			}
-			if (slave.buttImplant > 0) {							// slave has butt implants
-				cash *= 1.1;
-			}
-			if (slave.faceImplant > 0) {							// slave has had facial surgery
-				cash *= 1.1;
-			}
-			if (slave.lipsImplant > 0) {							// slave has lip implants
-				cash *= 1.1;
-			}
-		}
-		if (arcology.FSYouthPreferentialist !== "unset") {
-			if (slave.visualAge > 25) {								// slave looks older than 25
-				cash *= 0.8;										// TODO: not sure what age this should be
-			} else {
-				cash *= 1.2;
-			}
-		}
-		if (arcology.FSMaturityPreferentialist !== "unset") {
-			if (slave.visualAge > 25) {								// slave looks older than 25
-				cash *= 1.2;										// TODO: not sure what age this should be
-			} else {
-				cash *= 0.8;
-			}
-		}
-		if (arcology.FSSlimnessEnthusiast !== "unset") {
-			if (slave.weight > 10) {								// slave is curvy or more
-				cash *= 0.9;										// TODO: not sure what weight this should be
-			}														// TODO: should implants affect income?
-			if (slave.boobs > 799) {								// slave has larger than a D cup
-				cash *= 0.9;										// TODO: should this be smaller?
-			}
-			if (slave.butt > 3) {									// slave has bigger than a bubble butt
-				cash *= 0.9;
-			}
-		}
-		if (arcology.FSAssetExpansionist !== "unset") {
-			if (slave.weight > 10) {								// slave is curvy or more
-				cash *= 1.1;										// TODO: not sure what weight this should be
-			}														// TODO: should implants affect income?
-			if (slave.boobs > 799) {								// slave has larger than a D cup
-				cash *= 1.1;										// TODO: should this be smaller?
-			}
-			if (slave.butt > 3) {									// slave has bigger than a bubble butt
-				cash *= 1.1;
-			}
-		}
-		if (arcology.FSPastoralist !== "unset") {
-			if (slave.boobs > 799) {								// slave has larger than a D cup
-				cash *= 1.2;
-			}
-			if (slave.lactation > 0) {								// slave is lactating
-				cash *= 1.1;
-			}
-		}
-		if (arcology.FSPhysicalIdealist !== "unset") {
-			if (slave.height > 169) {								// slave is tall or taller
-				cash *= 1.1;
-			} else if (slave.height < 160) {						// slave is short or shorter
-				cash *= 0.9;
-			}
-		}
-		if (arcology.FSHedonisticDecadence !== "unset") {
-			if (slave.weight > 10) { 								// slave is curvy or fatter
-				cash *= 1.1;
-			} else if (slave.weight < -10) { 						// slave is thin or thinner
-				cash *= 0.9;
-			}
-		}
-		if (arcology.FSChattelReligionist !== "unset") { 			// TODO: I don't know what to put for this one
-			if (slave.devotion < 21) { 								// if slave is careful or less
-				cash *= 0.9;
-			}
-		}
-		// TODO: should I add the ancient cultures FS?
-		/* CLOSE FS EFFECTS */
-
-		if (setup.entertainmentCareers.includes(slave.career)) {
-			cash *= 1.1;
-		} else if (setup.farmerCareers.includes(slave.career)) {
-			cash *= 1.1;
-		}
-		if (slave.prestige === 1) { 								// slave is prestigious
-			cash *= 1.1;
-		} else if (slave.prestige === 2) { 							// slave is very prestigious
-			cash *= 1.2;
-		} else if (slave.prestige === 3) { 							// slave is extremely prestigious
-			cash *= 1.3;
-		}
-		if (slave.porn.prestige === 1) { 							// slave is prestigious from porn
-			cash *= 1.1;
-		} else if (slave.porn.prestige === 2) { 						// slave is very prestigious from porn
-			cash *= 1.2;
-		} else if (slave.porn.prestige === 3) { 						// slave is extremely prestigious from porn
-			cash *= 1.3;
-		} 															// TODO: add relationship checks
-		if (slave.face > 40) {										// slave is beautiful or more
-			cash *= 1.3;
-		} else if (slave.face > 10) {								// slave is very pretty or more
-			cash *= 1.1;
-		} else if (slave.face < -10) {								// slave is less than unattractive
-			cash *= 0.9;
-		} else if (slave.face < -40) {								// slave is less than ugly
-			cash *= 0.7;
-		}
-		if (slave.devotion > 50) { 									// slave is devoted or more
-			cash *= 1.1;
-		} else if (slave.devotion < -50) { 							// slave is reluctant or less
-			cash *= 0.8;
-		}
-		if (slave.trust > 50) { 									// slave is trusting or more
-			cash *= 1.1;
-		} else if (slave.trust < -50) { 							// slave is less than frightened
-			cash *= 0.8;											// TODO: should trust be a factor?
-		}
-		if (slave.weight > 30) { 									// slave is curvy or more
-			cash *= 0.8;											// TODO: tie in Hedonistic FS
-		} else if (slave.weight < -30) { 							// slave is very thin or less
-			cash *= 0.8;											// TODO: put this on a scale
-		}
-		if (slave.muscles > 30) { 									// slave is muscular or more
-			cash *= 0.9;											// TODO: tie in height eugenics policy
-		} else if (slave.muscles < -30) {							// slave is very weak or less
-			cash *= 0.9;											// TODO: should this be on a scale?
-		}
-		if (!canSeePerfectly(slave)) {								// slaves eyesight is nearsighted or worse
-			cash *= 0.9;											// TODO: should nearsighted and blind slaves receive a penalty?
-		}
-		if (slave.hears < 0) {										// slave is hard of hearing or less
-			cash *= 0.9;											// TODO: should hard of hearing slaves receive a penalty?
-		}
-		if (slave.boobs > 800) {									// slave has a DD cup or bigger
-			cash *= 0.9;											// TODO: would this make sense?
-		}
-		if (slave.butt > 4) {										// slave has an enormous butt or bigger
-			cash *= 0.9;											// TODO: would this make sense?
-		}
-		if (slave.preg > 10) {										// slave is pregnant and showing
-			cash *= 0.8;											// TODO: not sure how to incorporate pregnancy
-		}															// TODO: incorporate skills
-		cash *= healthPenalty(slave);
-		if (slave.intelligence > 50) {								// slave is very smart or better
-			cash *= 1.1;
-		} else if (slave.intelligence < -50) {						// slave is very slow or less
-			cash *= 0.8;
-		}
-		if (slave.energy <= 20) {									// slave has no sex drive
-			cash *= 0.7;
-		} else if (slave.energy <= 40) {							// slave has poor sex drive
-			cash *= 0.8;
-		} else if (slave.energy <= 60) {							// slave has average sex drive
-			cash *= 0.9;
-		} else if (slave.energy <= 80) {							// slave has good sex drive
-			cash *= 1.1;
-		} else if (slave.energy <= 95) {							// slave has powerful sex drive
-			cash *= 1.2;
-		} else {													// slave is a nymphomaniac
-			cash *= 1.3;
-		}
-		if (slave.fetish === "submissive") {
-			cash *= 1.1;
-		} else if (slave.fetish === "humiliation") {
-			cash *= 1.1;
-		} else if (slave.fetish === "masochist") {
-			cash *= 1.1;
-		}															// TODO: tie in quirks and flaws
-		return cash;
-	}
-};
diff --git a/src/js/health.js b/src/js/health.js
index 824a1a3376aab8d9b4c8d17c84319d9dafe83abc..5bdaef114218dee478c9b127dee7c7fb371cc58a 100644
--- a/src/js/health.js
+++ b/src/js/health.js
@@ -28,6 +28,9 @@ globalThis.healthPenalty = function(slave) {
  * @returns {void}
  */
 globalThis.healthDamage = function(slave, damage) {
+	if (!_.isFinite(damage)) {
+		throw "Health damage must be a finite number.";
+	}
 	const H = slave.health;
 	damage = Math.max(Math.trunc(damage), 0);
 	H.shortDamage += damage;
@@ -43,6 +46,9 @@ globalThis.healthDamage = function(slave, damage) {
  * @returns {void}
  */
 globalThis.healthCure = function(slave, cure) {
+	if (!_.isFinite(cure)) {
+		throw "Health cure must be a finite number.";
+	}
 	const H = slave.health;
 	cure = Math.max(Math.trunc(cure), 0);
 	if (cure > H.shortDamage) {
@@ -71,6 +77,9 @@ globalThis.surgeryDamage = function(slave, damage) {
  * @returns {void}
  */
 globalThis.improveCondition = function(slave, condition) {
+	if (!_.isFinite(condition)) {
+		throw "Health condition change must be a finite number.";
+	}
 	const H = slave.health;
 	H.condition += Math.max(Math.trunc(condition), 0);
 	updateHealth(slave);
diff --git a/src/js/ibcJS.js b/src/js/ibcJS.js
new file mode 100644
index 0000000000000000000000000000000000000000..d1e916f4d49a9fa50ca9343b1ad5b359142887a7
--- /dev/null
+++ b/src/js/ibcJS.js
@@ -0,0 +1,494 @@
+globalThis.ibc = (() => {
+    // These IDs are considered to be unknown parents
+    let or_null = (s) => specificCharacterID(s) ? s : null;
+
+    // Find some sort of state for a slave. Checks first the gene pool, then V.slaves, then the
+    // missing table
+    let find_gp = (id) => (slaveStateById(id) || V.genePool.find((s) => s.ID == id) || ((id in V.missingTable) ? V.missingTable[id] : null) || null);
+
+    // Create a node for the given ID
+    let create_node = (id) => ({
+        id: id, // Node ID
+        mother: null,
+        father: null,
+        nodecodes: [], // NodeCodes
+        nodecodes_str: [], // String version of the NodeCodes, for comparison
+        _coeff: null, // Cached CoI
+        child_count: 0 // Number of children of the node, for computing NodeCodes
+    });
+
+    // Determine the length of the shared prefix between the two NodeCode parameters
+    let prefix_len = (nca, ncb) => {
+        let i = 0;
+        for (i=0; i<Math.min(nca.length, ncb.length); i++) {
+            if (nca[i] !== ncb[i])
+                break;
+        }
+        return i;
+    };
+
+    // Determine the set of longest common prefixes for a node pair
+    let prefixes = (a, b) => {
+        let found = [];
+        let found_s = [];
+        a.nodecodes.forEach(nca => {
+            let match = false;
+            b.nodecodes.forEach(ncb => {
+                let l = prefix_len(nca, ncb);
+                if (l === 0 && match) 
+                    return;
+
+                if (l > 0) {
+                    match = true;
+                    let pfx = nca.slice(0,l);
+                    let pfx_s = pfx.join(';');
+
+                    if (!found_s.includes(pfx_s)) {
+                        found_s.push(pfx_s);
+                        found.push(pfx);
+                    }
+                }
+            });
+        });
+
+        return found;
+    };
+
+    // Search up the tree to find a given NodeCode, starting at `n`
+    let find_nc = (nc, n) => {
+        if (n.nodecodes_str.includes(nc.join(';'))) {
+            return n;
+        }
+
+        let ret = null;
+        if (n.mother !== null)
+            ret = find_nc(nc, n.mother);
+        if (n.father !== null && ret === null)
+            ret = find_nc(nc, n.father);
+
+        return ret;
+    };
+
+    // Determine the set of common ancestors between a node pair
+    let common = (a, b) => {
+        let pfx = prefixes(a, b);
+        let pfx_s = pfx.map(s => s.join(';'));
+        let anc = [];
+
+        while (pfx.length > 0) {
+            let p = pfx.pop(0);
+            pfx_s.pop(0);
+            let ret = find_nc(p, a);
+
+            ret.nodecodes.forEach(nc => {
+                let i = pfx_s.indexOf(nc.join(';'));
+                if (i === -1)
+                    return;
+
+                pfx.pop(i);
+                pfx_s.pop(i);
+            });
+
+            if (anc.findIndex(s => (s[0] == ret)) === -1)
+                anc.push([ret, p]);
+        }
+
+        return anc;
+    };
+
+    // Determine the set of NodeCodes on `n` with prefix `x`
+    let mps = (n, x) => {
+        let x_s = x.join(';');
+        return n.nodecodes.filter(nc => (nc.slice(0, x.length).join(';') === x_s));
+    };
+
+    // Compute the set of all paths to the parents of `n` with prefix `x`
+    let pp = (mother, father, x) => {
+        let m = mps(mother, x);
+        let f = mps(father, x);
+
+        let prod = [];
+        m.forEach(i => {
+            f.forEach(j => {
+                prod.push([i, j]);
+            });
+        });
+
+        return prod;
+    };
+
+    let kinship = (mother, father) => {
+        let _coeff = 0;
+        if (mother === null || father === null)
+            _coeff = 0;
+        else if (mother == father)
+            _coeff = 0.5 * (1 + coeff(mother));
+        else {
+            let cf = 0;
+            let cmn = common(mother, father);
+
+            cmn.forEach(el => {
+                let c = el[0];
+                let p = el[1];
+                let p_s = p.join(';');
+
+                let paths = pp(mother, father, p);
+                let paths_s = paths.map(p => [p[0].join(';'), p[1].join(';')].join(','));
+
+                cmn.forEach(el2 => {
+                    let co = el2[0];
+                    if (co == c)
+                        return;
+                    let found = [];
+                    let m_pp = [];
+                    let f_pp = [];
+
+                    co.nodecodes.forEach(nc => {
+                        if (nc.slice(0, p.length).join(';') != p_s)
+                            return;
+
+                        m_pp = m_pp.concat(mps(mother, nc));
+                        f_pp = f_pp.concat(mps(father, nc));
+                    });
+
+                    m_pp.forEach(mp => {
+                        f_pp.forEach(fp => {
+                            let mf_s = [mp.join(';'), fp.join(';')].join(',');
+                            let i = paths_s.indexOf(mf_s);
+                            if (i === -1)
+                                return;
+                            paths_s.pop(i);
+                            paths.pop(i);
+                        });
+                    });
+                });
+                paths.forEach(p => {
+                    let pfx = prefix_len(p[0], p[1]);
+
+                    cf += 0.5**(p[0].length + p[1].length+1 - 2*pfx) * (1 + coeff(c));
+                });
+            });
+
+            _coeff = cf;
+        }
+
+        return _coeff;
+    };
+
+    // Determine the coefficient of inbreeding of a node `n`
+    let coeff = n => {
+        if (n._coeff === null)
+            n._coeff = kinship(n.mother, n.father);
+        return n._coeff;
+    };
+
+    // Populate the NodeCodes. 
+    //
+    // Each node has a set of NodeCodes, which represent the set of paths from it to its ancestors.
+    // NodeCodes here are represented by arrays of integers.
+    //
+    // NodeCodes are constructed recursively in this fashion:
+    //
+    // - Assign each of the founders (nodes with both parents === null) an unique ID, starting from 
+    //   0 and incrementing each time (the order doesn't matter); a founder's set of NodeCodes has 
+    //   exactly one NodeCode, which is [ID] (an array containing only their ID)
+    //
+    // - For each other node, let M be its child number w.r.t. its mother and N its child number 
+    //   w.r.t. its father, i.e. the number of children that the respective parent has had before 
+    //   this one (the order is not important to the algorithm, it's arbitrary here for 
+    //   convenience). Its set of NodeCodes is the set of all its mother's NodeCodes with M appended
+    //   and all of its father's NodeCodes with N appended. For example, if its mother has the 
+    //   NodeCodes [[2]] and M = 3 and its father has the NodeCodes [[0,1], [3,1]] and N = 1 then 
+    //   the set of NodeCodes for this node would be
+    //       
+    //       [[2, 3], [0, 1, 1], [3, 1, 1]]
+    //
+    // We do this iteratively here, looping over the set of all nodes until each has been assigned
+    // a NodeCode. This requires looping through a number of times equal to the number of 
+    // generations, since as soon as both parents have NodeCodes their children's NodeCodes may be 
+    // computed.
+    let make_nc = nodes => {
+        // Generate founder NodeCodes
+        let total = Object.keys(nodes).length;
+        let seen = [];
+        let curid = 0;
+        Object.values(nodes).forEach(n => {
+            if (n.mother !== null || n.father !== null)
+                return;
+            n.nodecodes.push([curid]);
+            curid += 1;
+            seen.push(n.id);
+        });
+
+        // Generate the rest of the NodeCodes
+        while (seen.length != total) {
+            Object.keys(nodes).forEach(s=> {
+                let n = nodes[s];
+                if (seen.includes(+s)) // We've already done this
+                    return;
+                else if ((n.mother !== null && n.mother.nodecodes.length === 0) || (n.father !== null && n.father.nodecodes.length === 0)) // Too soon, we haven't done its parents
+                    return;
+
+                seen.push(n.id);
+                // Compute the NodeCodes from its parents
+                [n.mother, n.father].forEach((a, i) => {
+                    if (a === null || (n.mother === n.father && i == 1)) // Ignore missing parents/repeated
+                        return;
+
+                    a.nodecodes.forEach(nc => {
+                        // Copy the NodeCode, push the child number, then add it
+                        let nnc = nc.slice();
+                        nnc.push(a.child_count);
+                        n.nodecodes.push(nnc);
+                    });
+                    a.child_count += 1;
+                });
+
+                // NodeCodes must be sorted; this suffices
+                n.nodecodes.sort()
+            });
+        }
+
+        // Cache the string NodeCodes
+        Object.values(nodes).forEach(n => {
+            n.nodecodes_str = n.nodecodes.map(nc => nc.join(';'));
+        });
+    };
+
+    // Make nodes for an array of slaves
+    let nodes_slaves = (slaves, ignore_coeffs=false) => {
+        let nodes = {};
+
+        // Recursively create the nodes we need, moving upwards from the given slave
+        let create_node_rec = s => {
+            // Certain parents (e.g. 0, societal elite) are not considered to be related, despite 
+            // having the same ID; convert them to null
+            let m = or_null(s.mother);
+            let f = or_null(s.father);
+
+            // Ensure that parent nodes are created
+            [m, f].forEach(p => {
+                if (p !== null && !(p in nodes)) { // Not created, we have to do something
+                    if (p === -1) { 
+                        create_node_rec(SugarCube.State.variables.PC);
+                    } else {
+                        // Search for a slave state, genePool entry, or missingTable entry
+                        let gp = find_gp(p);
+                        if (gp !== null) {
+                            // If we find one, we might have ancestry information: recurse
+                            create_node_rec(gp);
+                        } else {
+                            // Otherwise, just create a plain node
+                            nodes[p] = create_node(p);
+                        }
+                    }
+                }
+            });
+
+            if (!(s.ID in nodes)) // Create this node if necessary
+                nodes[s.ID] = create_node(s.ID);
+            // We created its parents earlier, so set them to the actual nodes
+            nodes[s.ID].mother = (m === null) ? m : nodes[m];
+            nodes[s.ID].father = (f === null) ? f : nodes[f];
+
+            // Try to use a cached CoI for performance
+            let sg = find_gp(s.ID);
+            if (!ignore_coeffs && sg !== null && "inbreedingCoeff" in sg && sg.inbreedingCoeff !== -1) {
+                nodes[s.ID]._coeff = sg.inbreedingCoeff;
+            }
+        };
+
+        // Populate the nodes
+        slaves.forEach(s=> create_node_rec(s));
+
+        // Populate NodeCodes
+        make_nc(nodes);
+
+        return nodes;
+    }
+
+    // Determine the coefficients of inbreeding of an array of slaves. Returns a mapping of their 
+    // ID to their coefficient of inbreeding
+    let coeff_slaves = (slaves, ignore_coeffs=false) => {
+        let ret = {};
+        // First, pull as many existing CoI off the slaves
+        slaves.forEach(s => {
+            let sg = find_gp(s.ID);
+            if (!ignore_coeffs && sg !== null && "inbreedingCoeff" in sg && sg.inbreedingCoeff !== -1) {
+                ret[s.ID] = sg.inbreedingCoeff;
+            }
+        });
+
+        // Now do any we haven't done already
+        slaves = slaves.filter(s => (!(s.ID in ret)));
+        if (slaves.length > 0) {
+            let nodes = nodes_slaves(slaves, ignore_coeffs);
+
+            // Compute coefficients
+            slaves.forEach(s => {
+                ret[s.ID] = coeff(nodes[s.ID]);
+            });
+        }
+
+        return ret;
+    };
+
+    // Determine the kinship between two slaves `a` and `b`
+    let kinship_slaves = (a, b, ignore_coeffs=false) => {
+        if (a === 0 || b === 0)
+            return 0;
+
+        return kinship_one_many(a, [b], ignore_coeffs)[b.ID];
+    };
+
+    // Determine the coefficient of inbreeding of a single slave
+    let coeff_slave = (slave, ignore_coeffs=false) => {
+        if (!ignore_coeffs && "inbreedingCoeff" in slave && slave.inbreedingCoeff !== -1)
+            return slave.inbreedingCoeff;
+
+        let gp = find_gp(slave.ID);
+        if (!ignore_coeffs && gp !== null && "inbreedingCoeff" in gp && gp.inbreedingCoeff !== -1)
+            return gp.inbreedingCoeff;
+
+        return coeff_slaves([slave], ignore_coeffs)[slave.ID];
+    };
+
+    // Determine the kinship between one and many slaves. Returns an mapping from the ID of each of
+    // the slaves in `others` to its kinship with slave `a`
+    let kinship_one_many = (a, others, ignore_coeffs=false) => {
+        if (a === 0) {
+            let ks = {};
+            others.forEach(s => {
+                if (s === 0)
+                    ks[s] = 0;
+                else 
+                    ks[s.ID] = 0;
+            });
+            return ks;
+        }
+
+        let nodes = nodes_slaves(others.concat([a]), ignore_coeffs);
+
+        let ks = {};
+        others.forEach(s => {
+            if (s === -3) {
+                // Fake a slave object for the player's old master
+                s = {ID: -3, mother: 0, father: 0, inbreedingCoeff: 0};
+            }
+
+            if (s === 0)
+                ks[s] = 0;
+            else
+                ks[s.ID] = kinship(nodes[a.ID], nodes[s.ID]);
+        });
+
+        return ks;
+    };
+
+    // Recalculate the inbreeding coefficient for all slaves dependent on the passed IDs (e.g. the
+    // slaves themselves and all of their children). This will replace the inbreeding coefficients
+    // wherever they exist with the computed values, ignoring all cached values.
+    //
+    // This should be called if parents are changed.
+    let recalculate_coeff_ids = (ids) => {
+        // These are all the slave-like objects, i.e. they have ID, mother, and father. There will
+        // be multiple elements with the same ID: we want this, since we have to replace all 
+        // occurrences of the COI for the affected slaves
+        let all_slave_like = V.slaves.concat(V.genePool).concat(V.cribs).concat(V.tanks).concat(Object.values(V.missingTable));
+        if (V.boomerangSlave !== 0)
+            all_slave_like.push(V.boomerangSlave);
+        if (V.traitor !== 0)
+            all_slave_like.push(V.traitor);
+        if (V.activeSlave !== 0)
+            all_slave_like.push(V.activeSlave);
+        all_slave_like.push(V.PC);
+        // Add a fake entry for the PC's old master
+        all_slave_like.push({ID: -3, mother: 0, father: 0, inbreedingCoeff: 0});
+       
+        // Gather the genetics of all current fetuses
+        let all_fetuses = V.slaves.filter(s => s.preg > 0).map(s => s.womb.map(i => i.genetics)).reduce((res, cur) => res.concat(cur), []);
+
+        // Recursively find all of the given ID's children, born and unborn
+        let find_children_rec = (id, cur_slaves, cur_fetuses, cur_fetus_parents) => {
+            // Add fetuses
+            all_fetuses.filter(f => (f.father === id || f.mother === id)).forEach(f => {
+                // We may have to manually add the parents later
+                let actual_f = or_null(f.father);
+                let actual_m = or_null(f.mother);
+                if (actual_f !== null)
+                    cur_fetus_parents.add(actual_f);
+                if (actual_m !== null)
+                    cur_fetus_parents.add(actual_m);
+
+                cur_fetuses.add(f);
+            });
+
+            // Recursively add slaves
+            all_slave_like.filter(s => (s.father === id || s.mother === id)).forEach(s => {
+                if (!cur_slaves.has(s.ID)) {
+                    cur_slaves.add(s.ID);
+                    find_children_rec(s.ID, cur_slaves, cur_fetuses, cur_fetus_parents);
+                }
+            });
+        };
+
+        // We only need slave IDs, since we have to update all of their entries (including GP)
+        let needed_slave_ids = new Set();
+        // Since each fetus has a unique record, a set still suffices
+        let needed_fetuses = new Set();
+        let needed_parent_ids = new Set();
+
+        // Find all the children of the IDs we need to do
+        ids.forEach(id => {
+            needed_slave_ids.add(id);
+            find_children_rec(id, needed_slave_ids, needed_fetuses, needed_parent_ids);
+        });
+
+        // Now we assemble the tree from the slaves
+        let needed_slaves = [];
+        needed_slave_ids.forEach(id => {
+            if (typeof id !== "undefined")
+                needed_slaves.push(all_slave_like.find(s => s.ID === id));
+        });
+        needed_parent_ids.forEach(id => {
+            if (typeof id !== "undefined" && !needed_slave_ids.has(id))
+                needed_slaves.push(all_slave_like.find(s => s.ID == id));
+        });
+        let nodes = nodes_slaves(needed_slaves, true);
+
+        // Now calculate the inbreeding coefficients (they're cached in the tree once calculated)
+        all_slave_like.filter(s => needed_slave_ids.has(s.ID)).forEach(s => {
+            s.inbreedingCoeff = coeff(nodes[s.ID]);
+        });
+
+        // Finally, handle all of the kinship for the fetuses
+        let kinship_cache = new Map(); // Manually cache it
+        needed_fetuses.forEach(f => {
+            if (or_null(f.mother) === null || or_null(f.father) === null) {
+                f.inbreedingCoeff = 0;
+                return;
+            }
+
+            // Use a string of the form "parent;parent" to store the cache value; since kinship is
+            // commutative, the minumum parent ID will be first
+            let kinship_str = Math.min(f.mother, f.father) + ';' + Math.max(f.mother, f.father);
+            if (!kinship_cache.has(kinship_str))
+                kinship_cache.set(kinship_str, kinship(nodes[f.mother], nodes[f.father]));
+
+            f.inbreedingCoeff = kinship_cache.get(kinship_str);
+        });
+    };
+
+    let recalculate_coeff_id = (id) => {
+        return recalculate_coeff_ids([id]);
+    };
+
+    return {
+        coeff: coeff_slave,
+        coeff_slaves,
+        kinship: kinship_slaves,
+        kinship_one_many,
+        recalculate_coeff_ids,
+        recalculate_coeff_id
+    };
+})();
diff --git a/src/js/modification.js b/src/js/modification.js
index aaedaf67f8498577e15f90fa6c04ed815924f6e8..2a9358b08cdf07248ec5b33b88270aa6a3782fee 100644
--- a/src/js/modification.js
+++ b/src/js/modification.js
@@ -556,224 +556,3 @@ App.Medicine.Modification.setTattoo = function(slave, location, design) {
 	slave[`${location}Tat`] = design;
 	return r;
 };
-
-/**
- * @param {App.Entity.PlayerState|App.Entity.SlaveState} entity
- * @param {boolean} player
- * @returns {HTMLDivElement}
- */
-App.Medicine.Modification.eyeSelector = function(entity, player = false) {
-	const {He, him, his} = getPronouns(entity);
-
-	let selectedSide = "none";
-	let selectedIris = "none";
-	let selectedPupil = "none";
-	let selectedSclera = "none";
-
-	let removeDiv = document.createElement("div");
-	removeDiv.classList.add("choices");
-	let applyDiv = document.createElement("div");
-
-	const container = document.createElement("div");
-	container.append(
-		`${player ? "You have" : `${He} has`} ${App.Desc.eyesColorLong(entity)}, ${hasBothEyes(
-			entity) ? "they are" : "it is"} ${App.Desc.eyesType(entity)}.`,
-		removeDiv, "You have a number of contact lenses in various colors available. ",
-		App.UI.DOM.makeElement("span", `You can change what ${player ? "your" : his} eyes look like.`, "note"),
-		assembleLinks(), applyDiv
-	);
-	updateRemoveDiv();
-	updateApplyDiv();
-	return container;
-
-	function assembleLinks() {
-		const sides = ["left", "right", "both"];
-		const irisColors = ["amber", "black", "blue", "brown", "green", "hazel", "orange", "pale-grey", "pink", "red",
-			"sky-blue", "turquoise", "white", "yellow"];
-		const pupilShapes = ["none", "circular", "almond-shaped", "bright", "catlike", "demonic", "devilish",
-			"goat-like", "heart-shaped", "hypnotic", "serpent-like", "star-shaped", "teary", "vacant", "wide-eyed"];
-		const scleraColors = ["none", "white", "amber", "black", "blue", "brown", "green", "hazel", "orange",
-			"pale-grey", "pink", "red", "sky-blue", "turquoise", "yellow"];
-		const div = document.createDocumentFragment();
-		div.append(
-			assembleList("Side: ", sides, value => selectedSide = value, selectedIris),
-			assembleList("Iris: ", irisColors, value => selectedIris = value, selectedSide),
-			assembleList("Pupil: ", pupilShapes, value => selectedPupil = value, selectedPupil),
-			assembleList("Sclera: ", scleraColors, value => selectedSclera = value, selectedSclera)
-		);
-		return div;
-	}
-
-	/**
-	 * @param {string} name
-	 * @param {Array<string>} list
-	 * @param {Function}callback
-	 * @param {string} selected
-	 * @returns {HTMLDivElement}
-	 */
-	function assembleList(name, list, callback, selected) {
-		const links = [];
-
-		for (let i = 0; i < list.length; i++) {
-			addToggle(list[i], callback, links, list[i] === selected);
-		}
-
-		const div = document.createElement("div");
-		div.classList.add("choices");
-		div.append(name, App.UI.DOM.arrayToList(links, " | ", " | "));
-		return div;
-	}
-
-	/**
-	 * @param {string} value
-	 * @param {Function} callback
-	 * @param {Array<HTMLAnchorElement>} links
-	 * @param {boolean} [disabled]
-	 */
-	function addToggle(value, callback, links, disabled = false) {
-		const a = document.createElement("a");
-		a.append(capFirstChar(value));
-		if (disabled) {
-			a.classList.add("disabled");
-		}
-		a.onclick = () => {
-			for (let link of links) {
-				link.classList.remove("disabled");
-			}
-			a.classList.add("disabled");
-			callback(value);
-			updateRemoveDiv();
-			updateApplyDiv();
-		};
-		links.push(a);
-	}
-
-	function updateApplyDiv() {
-		$(applyDiv).empty();
-		if (selectedSide !== "none" && selectedIris !== "none") {
-			// make the following easier to read
-			let both = selectedSide === "both";
-			let leftGlass = !hasLeftEye(entity) || getLeftEyeType(entity) === 2;
-			let rightGlass = !hasRightEye(entity) || getRightEyeType(entity) === 2;
-
-			// base eye
-			let r = player ? "" : ` ${him}`;
-			if (both) {
-				if (leftGlass && rightGlass) {
-					r += ` ${selectedIris} glass eyes`;
-				} else if (leftGlass || rightGlass) {
-					r += ` a glass eye and a ${selectedIris} lens`;
-				} else {
-					r += ` ${selectedIris} lenses`;
-				}
-			} else {
-				r += " a";
-				if ((selectedSide === "left" && leftGlass) || (selectedSide === "right" && rightGlass)) {
-					r += ` ${selectedIris} glass eye`;
-				} else {
-					r += ` ${selectedIris} lens`;
-				}
-			}
-			// pupil & sclera
-			if (selectedPupil !== "none" || selectedSclera !== "none") {
-				r += " with";
-				if (selectedPupil !== "none") {
-					r += ` ${both ? selectedPupil : addA(selectedPupil)}`;
-					if (both) {
-						r += " pupils";
-					} else {
-						r += " pupil";
-					}
-					if (selectedSclera !== "none") {
-						r += " and";
-					}
-				}
-				if (selectedSclera !== "none") {
-					r += ` ${selectedSclera}`;
-					if (both) {
-						r += " sclerae";
-					} else {
-						r += " sclera";
-					}
-				}
-			}
-			if (!both) {
-				r += ` for ${player ? "your" : his} ${selectedSide} eye`;
-			}
-			r += "?";
-
-			const a = document.createElement("a");
-			a.append(player ? "Take" : "Give");
-			a.onclick = applyLink;
-			applyDiv.append(a, r);
-			if (!player) {
-				applyDiv.append(" ",
-					App.UI.DOM.makeElement("span", "This is independent from eyewear choices.", "note"));
-			}
-		}
-	}
-
-	function applyLink() {
-		// make sure the eye exists; give glass eye if there is none
-		if ((selectedSide === "left" || selectedSide === "both") && getLeftEyeType(entity) === 0) {
-			eyeSurgery(entity, "left", "glass");
-		}
-		if ((selectedSide === "right" || selectedSide === "both") && getRightEyeType(entity) === 0) {
-			eyeSurgery(entity, "right", "glass");
-		}
-
-		// apply modifications
-		setEyeColorFull(entity, selectedIris,
-			selectedPupil === "none" ? "" : selectedPupil,
-			selectedSclera === "none" ? "" : selectedSclera,
-			selectedSide);
-		cashX(forceNeg(V.modCost), "slaveMod", entity);
-
-		App.UI.reload();
-	}
-
-
-	function updateRemoveDiv() {
-		$(removeDiv).empty();
-		const links = [];
-		let _n = 0;
-		// remove lenses
-		if (hasLeftEye(entity) && getLeftEyeColor(entity) !== getGeneticEyeColor(entity, "left")) {
-			_n++;
-			links.push(removeLink("Remove left lens", () => resetEyeColor(entity, "left")));
-		}
-		if (hasRightEye(entity) && getRightEyeColor(entity) !== getGeneticEyeColor(entity, "right")) {
-			_n++;
-			links.push(removeLink("Remove right lens", () => resetEyeColor(entity, "right")));
-		}
-		if (_n === 2) {
-			links.push(removeLink("Remove both lenses", () => resetEyeColor(entity, "both")));
-		}
-		// remove glass eyes
-		_n = 0;
-		if (getLeftEyeType(entity) === 2) {
-			_n++;
-			links.push(removeLink("Remove left glass eye", () => eyeSurgery(entity, "left", "remove")));
-		}
-		if (getRightEyeType(entity) === 2) {
-			_n++;
-			links.push(removeLink("Remove right glass eye", () => eyeSurgery(entity, "right", "remove")));
-		}
-		if (_n === 2) {
-			links.push(removeLink("Remove both glass eyes", () => eyeSurgery(entity, "both", "remove")));
-		}
-		if (links.length > 0) {
-			removeDiv.append(App.UI.DOM.arrayToList(links, " | ", " | "));
-		}
-	}
-
-	function removeLink(text, callback) {
-		const a = document.createElement("a");
-		a.append(text);
-		a.onclick = () => {
-			callback();
-			App.UI.reload();
-		};
-		return a;
-	}
-};
diff --git a/src/js/removeActiveSlave.js b/src/js/removeActiveSlave.js
index 95ea18e2bda23cc26107f1a28c8f14fe641dbe28..eb32e2872f8dede7976205ae5c0deca11ca5f9c8 100644
--- a/src/js/removeActiveSlave.js
+++ b/src/js/removeActiveSlave.js
@@ -197,6 +197,10 @@ globalThis.removeActiveSlave = function() {
 				V.genePool.deleteAt(_geneIndex);
 			}
 		}
+		Object.values(V.missingTable).forEach(s => {
+			if (s.mother === V.activeSlave.ID || s.father === V.activeSlave.ID)
+				missing = true;
+		});
 		if (missing) {
 			V.missingTable[V.missingParentID] = {
 				slaveName: V.activeSlave.slaveName,
@@ -204,7 +208,10 @@ globalThis.removeActiveSlave = function() {
 				fullName: SlaveFullName(V.activeSlave),
 				dick: V.activeSlave.dick,
 				vagina: V.activeSlave.vagina,
-				ID: V.missingParentID
+				ID: V.missingParentID,
+				mother: V.activeSlave.mother,
+				father: V.activeSlave.father,
+				inbreedingCoeff: V.activeSlave.inbreedingCoeff
 			};
 			if (V.traitor.ID === V.activeSlave.ID) {
 				/* To link developing fetuses to their parent */
@@ -212,6 +219,12 @@ globalThis.removeActiveSlave = function() {
 			} else if (V.boomerangSlave.ID === V.activeSlave.ID) {
 				V.boomerangSlave.missingParentTag = V.missingParentID;
 			}
+			Object.values(V.missingTable).forEach(s => {
+				if (s.mother === V.activeSlave.ID)
+					s.mother = V.missingParentID;
+				if (s.father === V.activeSlave.ID)
+					s.father = V.missingParentID;
+			});
 			V.missingParentID--;
 		}
 
@@ -310,6 +323,10 @@ globalThis.removeNonNGPSlave = function(removedSlave) {
 				V.genePool.deleteAt(_geneIndex);
 			}
 		}
+		Object.values(V.missingTable).forEach(s => {
+			if (s.mother == removedSlave.ID || s.father == removedSlave.ID)
+				missing = true;
+		});
 		if (missing) {
 			V.missingTable[V.missingParentID] = {
 				slaveName: removedSlave.slaveName,
@@ -317,8 +334,17 @@ globalThis.removeNonNGPSlave = function(removedSlave) {
 				fullName: SlaveFullName(removedSlave),
 				dick: removedSlave.dick,
 				vagina: removedSlave.vagina,
-				ID: V.missingParentID
+				ID: V.missingParentID,
+				mother: removedSlave.mother,
+				father: removedSlave.father,
+				inbreedingCoeff: removedSlave.inbreedingCoeff
 			};
+			Object.values(V.missingTable).forEach(s => {
+				if (s.mother === removedSlave.ID)
+					s.mother = V.missingParentID;
+				if (s.father === removedSlave.ID)
+					s.father = V.missingParentID;
+			});
 			V.missingParentID--;
 		}
 
diff --git a/src/js/salon.js b/src/js/salon.js
new file mode 100644
index 0000000000000000000000000000000000000000..4069c507d753be823befbfcb7ebdd2f69d627b6f
--- /dev/null
+++ b/src/js/salon.js
@@ -0,0 +1,794 @@
+/**
+ * @param {App.Entity.PlayerState|App.Entity.SlaveState} entity
+ * @param {boolean} player
+ * @returns {HTMLDivElement}
+ */
+App.Medicine.Modification.eyeSelector = function(entity, player = false) {
+	const {He, him, his} = getPronouns(entity);
+
+	let selectedSide = "none";
+	let selectedIris = "none";
+	let selectedPupil = "none";
+	let selectedSclera = "none";
+
+	let removeDiv = document.createElement("div");
+	removeDiv.classList.add("choices");
+	let applyDiv = document.createElement("div");
+
+	const container = document.createElement("div");
+	container.append(
+		`${player ? "You have" : `${He} has`} ${App.Desc.eyesColorLong(entity)}, ${hasBothEyes(
+			entity) ? "they are" : "it is"} ${App.Desc.eyesType(entity)}.`,
+		removeDiv, "You have a number of contact lenses in various colors available. ",
+		App.UI.DOM.makeElement("span", `You can change what ${player ? "your" : his} eyes look like.`, "note"),
+		assembleLinks(), applyDiv
+	);
+	updateRemoveDiv();
+	updateApplyDiv();
+	return container;
+
+	function assembleLinks() {
+		const sides = ["left", "right", "both"];
+		const irisColors = ["amber", "black", "blue", "brown", "green", "hazel", "orange", "pale-grey", "pink", "red",
+			"sky-blue", "turquoise", "white", "yellow"];
+		const pupilShapes = ["none", "circular", "almond-shaped", "bright", "catlike", "demonic", "devilish",
+			"goat-like", "heart-shaped", "hypnotic", "serpent-like", "star-shaped", "teary", "vacant", "wide-eyed"];
+		const scleraColors = ["none", "white", "amber", "black", "blue", "brown", "green", "hazel", "orange",
+			"pale-grey", "pink", "red", "sky-blue", "turquoise", "yellow"];
+		const div = document.createDocumentFragment();
+		div.append(
+			assembleList("Side: ", sides, value => selectedSide = value, selectedIris),
+			assembleList("Iris: ", irisColors, value => selectedIris = value, selectedSide),
+			assembleList("Pupil: ", pupilShapes, value => selectedPupil = value, selectedPupil),
+			assembleList("Sclera: ", scleraColors, value => selectedSclera = value, selectedSclera)
+		);
+		return div;
+	}
+
+	/**
+	 * @param {string} name
+	 * @param {Array<string>} list
+	 * @param {Function}callback
+	 * @param {string} selected
+	 * @returns {HTMLDivElement}
+	 */
+	function assembleList(name, list, callback, selected) {
+		const links = [];
+
+		for (let i = 0; i < list.length; i++) {
+			addToggle(list[i], callback, links, list[i] === selected);
+		}
+
+		const div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(name, App.UI.DOM.arrayToList(links, " | ", " | "));
+		return div;
+	}
+
+	/**
+	 * @param {string} value
+	 * @param {Function} callback
+	 * @param {Array<HTMLAnchorElement>} links
+	 * @param {boolean} [disabled]
+	 */
+	function addToggle(value, callback, links, disabled = false) {
+		const a = document.createElement("a");
+		a.append(capFirstChar(value));
+		if (disabled) {
+			a.classList.add("disabled");
+		}
+		a.onclick = () => {
+			for (let link of links) {
+				link.classList.remove("disabled");
+			}
+			a.classList.add("disabled");
+			callback(value);
+			updateRemoveDiv();
+			updateApplyDiv();
+		};
+		links.push(a);
+	}
+
+	function updateApplyDiv() {
+		$(applyDiv).empty();
+		if (selectedSide !== "none" && selectedIris !== "none") {
+			// make the following easier to read
+			let both = selectedSide === "both";
+			let leftGlass = !hasLeftEye(entity) || getLeftEyeType(entity) === 2;
+			let rightGlass = !hasRightEye(entity) || getRightEyeType(entity) === 2;
+
+			// base eye
+			let r = player ? "" : ` ${him}`;
+			if (both) {
+				if (leftGlass && rightGlass) {
+					r += ` ${selectedIris} glass eyes`;
+				} else if (leftGlass || rightGlass) {
+					r += ` a glass eye and a ${selectedIris} lens`;
+				} else {
+					r += ` ${selectedIris} lenses`;
+				}
+			} else {
+				r += " a";
+				if ((selectedSide === "left" && leftGlass) || (selectedSide === "right" && rightGlass)) {
+					r += ` ${selectedIris} glass eye`;
+				} else {
+					r += ` ${selectedIris} lens`;
+				}
+			}
+			// pupil & sclera
+			if (selectedPupil !== "none" || selectedSclera !== "none") {
+				r += " with";
+				if (selectedPupil !== "none") {
+					r += ` ${both ? selectedPupil : addA(selectedPupil)}`;
+					if (both) {
+						r += " pupils";
+					} else {
+						r += " pupil";
+					}
+					if (selectedSclera !== "none") {
+						r += " and";
+					}
+				}
+				if (selectedSclera !== "none") {
+					r += ` ${selectedSclera}`;
+					if (both) {
+						r += " sclerae";
+					} else {
+						r += " sclera";
+					}
+				}
+			}
+			if (!both) {
+				r += ` for ${player ? "your" : his} ${selectedSide} eye`;
+			}
+			r += "?";
+
+			const a = document.createElement("a");
+			a.append(player ? "Take" : "Give");
+			a.onclick = applyLink;
+			applyDiv.append(a, r);
+			if (!player) {
+				applyDiv.append(" ",
+					App.UI.DOM.makeElement("span", "This is independent from eyewear choices.", "note"));
+			}
+		}
+	}
+
+	function applyLink() {
+		// make sure the eye exists; give glass eye if there is none
+		if ((selectedSide === "left" || selectedSide === "both") && getLeftEyeType(entity) === 0) {
+			eyeSurgery(entity, "left", "glass");
+		}
+		if ((selectedSide === "right" || selectedSide === "both") && getRightEyeType(entity) === 0) {
+			eyeSurgery(entity, "right", "glass");
+		}
+
+		// apply modifications
+		setEyeColorFull(entity, selectedIris,
+			selectedPupil === "none" ? "" : selectedPupil,
+			selectedSclera === "none" ? "" : selectedSclera,
+			selectedSide);
+		cashX(forceNeg(V.modCost), "slaveMod", entity);
+
+		App.UI.reload();
+	}
+
+	function updateRemoveDiv() {
+		$(removeDiv).empty();
+		const links = [];
+		let _n = 0;
+		// remove lenses
+		if (hasLeftEye(entity) && getLeftEyeColor(entity) !== getGeneticEyeColor(entity, "left")) {
+			_n++;
+			links.push(removeLink("Remove left lens", () => resetEyeColor(entity, "left")));
+		}
+		if (hasRightEye(entity) && getRightEyeColor(entity) !== getGeneticEyeColor(entity, "right")) {
+			_n++;
+			links.push(removeLink("Remove right lens", () => resetEyeColor(entity, "right")));
+		}
+		if (_n === 2) {
+			links.push(removeLink("Remove both lenses", () => resetEyeColor(entity, "both")));
+		}
+		// remove glass eyes
+		_n = 0;
+		if (getLeftEyeType(entity) === 2) {
+			_n++;
+			links.push(removeLink("Remove left glass eye", () => eyeSurgery(entity, "left", "remove")));
+		}
+		if (getRightEyeType(entity) === 2) {
+			_n++;
+			links.push(removeLink("Remove right glass eye", () => eyeSurgery(entity, "right", "remove")));
+		}
+		if (_n === 2) {
+			links.push(removeLink("Remove both glass eyes", () => eyeSurgery(entity, "both", "remove")));
+		}
+		if (links.length > 0) {
+			removeDiv.append(App.UI.DOM.arrayToList(links, " | ", " | "));
+		}
+	}
+
+	function removeLink(text, callback) {
+		const a = document.createElement("a");
+		a.append(text);
+		a.onclick = () => {
+			callback();
+			App.UI.reload();
+		};
+		return a;
+	}
+};
+
+/**
+ * Update ears in salon
+ * @param {App.Entity.SlaveState} slave
+ * @param {object} params
+ * @param {number|string} [params.primaryEarColor]
+ * @param {string} [params.secondaryEarColor]
+ * @returns {node}
+ */
+App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColor = ""} = {}) {
+	const frag = new DocumentFragment();
+	let updatePrimary = (newVal) => { primaryEarColor = newVal; apply(); };
+	let updateSecondary = (newVal) => { secondaryEarColor = newVal; apply(); };
+
+	if (slave.earT !== "none" && slave.earTColor !== "hairless") {
+		const {His, his} = getPronouns(slave);
+		let div;
+		let p;
+		frag.append(`${His} fluffy ears are ${slave.earTColor}.`);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		if (slave.earTColor !== slave.hColor) {
+			div.append(
+				App.UI.DOM.link(
+					"Match current hair",
+					() => {
+						slave.earTColor = slave.hColor;
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						apply();
+					}
+				)
+			);
+			div.append(" or ");
+			App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note");
+		} else {
+			App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} ears:`, "note");
+		}
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Colors:`);
+		div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary));
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Highlights:`);
+		div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary));
+		frag.append(div);
+
+		if (primaryEarColor !== 0) {
+			p = document.createElement("p");
+			p.classList.add("choices");
+			p.append(
+				App.UI.DOM.link(
+					`Color ${his} ears`,
+					() => {
+						slave.earTColor = (primaryEarColor + secondaryEarColor);
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						App.Medicine.Salon.ears(slave); // discard selections after locking them in.
+					}
+				)
+			);
+			p.append(` ${primaryEarColor}${secondaryEarColor} now?`);
+			frag.append(p);
+		}
+	}
+	return jQuery("#salonEars").empty().append(frag);
+
+	function createList(array, method) {
+		const links = [];
+		for (const item of array) {
+			const title = item.title || capFirstChar(item.value);
+			links.push(
+				App.UI.DOM.link(
+					title,
+					() => method(item.value)
+				)
+			);
+		}
+		return App.UI.DOM.generateLinksStrip(links);
+	}
+	function apply() {
+		App.Art.refreshSlaveArt(slave, 3, "artFrame");
+		App.Medicine.Salon.ears(
+			slave,
+			{
+				primaryEarColor: primaryEarColor,
+				secondaryEarColor: secondaryEarColor,
+			}
+		);
+	}
+};
+
+/**
+ * Update hair in salon
+ * @param {App.Entity.SlaveState} slave
+ * @param {object} params
+ * @param {number|string} [params.primaryHairColor]
+ * @param {string} [params.secondaryHairColor]
+ * @returns {node}
+ */
+App.Medicine.Salon.hair = function(slave, {primaryHairColor = 0, secondaryHairColor = ""} = {}) {
+	const frag = new DocumentFragment();
+	let updatePrimary = (newVal) => { primaryHairColor = newVal.value; apply(); };
+	let updateSecondary = (newVal) => { secondaryHairColor = newVal.value; apply(); };
+	const {His, his, He, him} = getPronouns(slave);
+
+	if (slave.bald !== 1) {
+		frag.append(hairDye());
+		frag.append(hairStyle());
+		frag.append(hairLength());
+		frag.append(hairMaint());
+	} else {
+		// Bald
+		if (slave.hStyle === "bald") {
+			frag.append(`${He} is completely bald.`);
+		} else {
+			frag.append(wigDye());
+		}
+		frag.append(wigStyle());
+		frag.append(wigLength());
+	}
+	return jQuery("#salonHair").empty().append(frag);
+
+	function hairDye() {
+		const frag = new DocumentFragment();
+		let div;
+		let p;
+		frag.append(`${His} hair is ${slave.hColor}.`);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		if (slave.origHColor !== slave.hColor) {
+			div.append(
+				App.UI.DOM.link(
+					"Restore natural color",
+					() => {
+						slave.hColor = slave.origHColor;
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						apply();
+					}
+				)
+			);
+			div.append(" or ");
+			App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note");
+		} else {
+			App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} hair:`, "note");
+		}
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Colors:`);
+		div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary));
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Highlights:`);
+		div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary));
+		frag.append(div);
+
+		if (primaryHairColor !== 0) {
+			p = document.createElement("p");
+			p.classList.add("choices");
+			p.append(
+				App.UI.DOM.link(
+					`Color ${his} hair`,
+					() => {
+						slave.hColor = (primaryHairColor + secondaryHairColor);
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						App.Medicine.Salon.hair(slave); // discard selections after locking them in.
+					}
+				)
+			);
+			p.append(` ${primaryHairColor}${secondaryHairColor} now?`);
+			frag.append(p);
+		}
+		return frag;
+	}
+
+	function hairStyle() {
+		const frag = new DocumentFragment();
+		let div;
+		let method;
+		div = document.createElement("div");
+		if (slave.hStyle !== "shaved") {
+			div.append(`${His} ${slave.hStyle} hair is ${lengthToEitherUnit(slave.hLength)} long. `);
+		} else {
+			div.append(`${His} hair is shaved smooth. `);
+		}
+		App.UI.DOM.appendNewElement("span", div, `General hairstyles will conform to hair length and clothing choices.`, "note");
+		frag.append(div);
+
+		// Normal styles
+		div = document.createElement("div");
+		div.classList.add("choices");
+		method = (newVal) => {
+			slave.hStyle = newVal.value;
+			cashX(forceNeg(V.modCost), "slaveMod", slave);
+			apply();
+		};
+		if (slave.hLength > 1) {
+			div.append(`Style ${his} hair:`);
+			div.append(createList(App.Medicine.Modification.hairStyles.Normal, method));
+		} else {
+			App.UI.DOM.appendNewElement("span", div, `${His} hair is too short to style meaningfully`, "note");
+		}
+		frag.append(div);
+
+		// Short styles, includes cutting
+		div = document.createElement("div");
+		div.classList.add("choices");
+		method = (newVal) => {
+			slave.hStyle = newVal.value;
+			slave.hLength = newVal.hLength;
+			cashX(forceNeg(V.modCost), "slaveMod", slave);
+			apply();
+		};
+		if (slave.hLength > 1) {
+			div.append(`Cut and style ${his} hair:`);
+			div.append(createList(App.Medicine.Modification.hairStyles.Cut, method));
+		}
+		frag.append(div);
+
+		return frag;
+	}
+
+	function hairLength() {
+		const frag = new DocumentFragment();
+		let div = document.createElement("div");
+		div.classList.add("choices");
+		let method = (newVal) => {
+			if (newVal.hasOwnProperty("onApplication")) {
+				newVal.onApplication(slave);
+			}
+			if (newVal.hasOwnProperty("hLength")) {
+				slave.hLength = newVal.hLength;
+			}
+			apply();
+		};
+		const oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength;
+
+		App.UI.DOM.appendNewElement("span", div, `Cut or lengthen ${his} hair:`);
+		div.append(createList(App.Medicine.Modification.hairStyles.Length, method));
+		div.append(" | Custom length: ");
+		div.append(
+			App.UI.DOM.makeTextBox(
+				oldHLength,
+				v => {
+					v = Math.max(v, 0); // Positive hair length only
+					// If they entered "inches," convert
+					if (V.showInches === 2) {
+						v = Math.round(v * 2.54);
+					}
+					slave.hLength = v;
+					cashX(forceNeg(V.modCost), "slaveMod", slave);
+					apply();
+				},
+				true
+			)
+		);
+		if (V.showInches === 1) {
+			div.append(`cm (${cmToInchString(slave.hLength)})`);
+		} else if (V.showInches === 2) {
+			div.append(`inches`);
+		}
+
+		frag.append(div);
+
+		return frag;
+	}
+
+	function hairMaint() {
+		let div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Have ${his} hair carefully maintained at its current length: `);
+		let haircuts;
+		let text;
+		if (slave.haircuts === 1) {
+			text = "Cease maintenance";
+			haircuts = 0;
+		} else {
+			text = "Begin maintenance";
+			haircuts = 1;
+		}
+		div.append(
+			App.UI.DOM.link(
+				text,
+				() => slave.haircuts = haircuts
+			)
+		);
+		return div;
+	}
+
+	function wigDye() {
+		const frag = new DocumentFragment();
+		let div;
+		let p;
+		frag.append(`${His} current wig is ${slave.hColor}. `);
+
+		if (slave.hStyle !== "bald") {
+			frag.append(
+				App.UI.DOM.link(
+					"Remove wig",
+					() => {
+						slave.hStyle = "bald";
+						slave.hLength = 0;
+						// I'm not going to charge you for taking off a fucking wig.
+						apply();
+					}
+				)
+			);
+			frag.append(" or ");
+			App.UI.DOM.appendNewElement("span", frag, "choose a new one: ", "note");
+		} else {
+			App.UI.DOM.appendNewElement("span", frag, `Choose a wig color:`, "note");
+		}
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Colors:`);
+		div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary));
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Highlights:`);
+		div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary));
+		frag.append(div);
+
+		if (primaryHairColor !== 0) {
+			p = document.createElement("p");
+			p.classList.add("choices");
+			p.append(
+				App.UI.DOM.link(
+					`Change`,
+					() => {
+						slave.earTColor = (primaryHairColor + secondaryHairColor);
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						App.Medicine.Salon.hair(slave); // discard selections after locking them in.
+					}
+				)
+			);
+			p.append(` ${his} wig color to ${primaryHairColor}${secondaryHairColor} now?`);
+			frag.append(p);
+		}
+		return frag;
+	}
+
+	function wigLength() {
+		const frag = new DocumentFragment();
+		if (slave.hStyle === "bald") {
+			return frag;
+		}
+		let div = document.createElement("div");
+		div.classList.add("choices");
+		const array = [];
+		for (const number of [10, 30, 60, 90, 120, 150]) {
+			const obj = {};
+			obj.title = lengthToEitherUnit(number);
+			obj.hLength = number;
+			array.push(obj);
+		}
+		let method = (newVal) => {
+			slave.hLength = newVal.hLength;
+			apply();
+		};
+		const oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength;
+		App.UI.DOM.appendNewElement("span", div, `Set wig length to:`, "choices");
+		div.append(createList(array, method));
+		div.append(" | Custom length: ");
+		div.append(
+			App.UI.DOM.makeTextBox(
+				oldHLength,
+				v => {
+					v = Math.max(v, 10); // Wigs must be at least 10 cm
+					// If they entered "inches," convert
+					if (V.showInches === 2) {
+						v = Math.round(v * 2.54);
+					}
+					slave.hLength = v;
+					cashX(forceNeg(V.modCost), "slaveMod", slave);
+					apply();
+				},
+				true
+			)
+		);
+		if (V.showInches === 1) {
+			div.append(`cm (${cmToInchString(slave.hLength)})`);
+		} else if (V.showInches === 2) {
+			div.append(`inches`);
+		}
+
+		frag.append(div);
+
+		return frag;
+	}
+
+	function wigStyle() {
+		const frag = new DocumentFragment();
+		let div = document.createElement("div");
+		div.classList.add("choices");
+		const method = (newVal) => {
+			slave.hStyle = newVal.value;
+			cashX(forceNeg(V.modCost), "slaveMod", slave);
+			apply();
+		};
+
+		if (slave.hStyle !== "bald") {
+			frag.append(`${His} ${slave.hStyle} wig is ${lengthToEitherUnit(slave.hLength)} long. `);
+		} else {
+			frag.append(`${He} is not wearing a wig. `);
+		}
+		App.UI.DOM.appendNewElement("span", frag, `General hairstyles will conform to hair length and clothing choices.`, "note");
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		if (slave.hStyle === "bald") {
+			div.append(`Give ${him} a wig:`);
+		} else {
+			div.append(`Set wig style:`);
+		}
+		div.append(createList(App.Medicine.Modification.hairStyles.Normal, method));
+		frag.append(div);
+		return frag;
+	}
+
+	function createList(array, method) {
+		const links = [];
+		for (const item of array) {
+			if (item.hasOwnProperty("requirements")) {
+				if (item.requirements(slave) === false) {
+					continue;
+				}
+			}
+			const title = item.title || capFirstChar(item.value);
+			links.push(
+				App.UI.DOM.link(
+					title,
+					() => method(item)
+				)
+			);
+		}
+		return App.UI.DOM.generateLinksStrip(links);
+	}
+
+	function apply() {
+		App.Art.refreshSlaveArt(slave, 3, "artFrame");
+		App.Medicine.Salon.hair(
+			slave,
+			{
+				primaryHairColor: primaryHairColor,
+				secondaryHairColor: secondaryHairColor,
+			}
+		);
+	}
+};
+
+/**
+ * Update hair in salon
+ * @param {App.Entity.SlaveState} slave
+ * @param {object} params
+ * @param {number|string} [params.primaryTailColor]
+ * @param {string} [params.secondaryTailColor]
+ * @returns {node}
+ */
+App.Medicine.Salon.tail = function(slave, {primaryTailColor = 0, secondaryTailColor = ""} = {}) {
+	const frag = new DocumentFragment();
+	let updatePrimary = (newVal) => { primaryTailColor = newVal.value; apply(); };
+	let updateSecondary = (newVal) => { secondaryTailColor = newVal.value; apply(); };
+	const {His, his} = getPronouns(slave);
+
+	if (slave.tail !== "none") {
+		frag.append(tailDye());
+	}
+
+	return jQuery("#salonTail").empty().append(frag);
+
+	function tailDye() {
+		const frag = new DocumentFragment();
+		let div;
+		let p;
+		frag.append(`${His} tail is ${slave.tailColor}.`);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		if (slave.origHColor !== slave.hColor) {
+			div.append(
+				App.UI.DOM.link(
+					"Match current hair",
+					() => {
+						slave.tailColor = slave.hColor;
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						apply();
+					}
+				)
+			);
+			div.append(" or ");
+			App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note");
+		} else {
+			App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} tail:`, "note");
+		}
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Colors:`);
+		div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary));
+		frag.append(div);
+
+		div = document.createElement("div");
+		div.classList.add("choices");
+		div.append(`Highlights:`);
+		div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary));
+		frag.append(div);
+
+		if (primaryTailColor !== 0) {
+			p = document.createElement("p");
+			p.classList.add("choices");
+			p.append(
+				App.UI.DOM.link(
+					`Color ${his} tail`,
+					() => {
+						slave.tailColor = (primaryTailColor + secondaryTailColor);
+						App.Art.refreshSlaveArt(slave, 3, "artFrame");
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+						App.Medicine.Salon.tail(slave); // discard selections after locking them in.
+					}
+				)
+			);
+			p.append(` ${primaryTailColor}${secondaryTailColor} now?`);
+			frag.append(p);
+		}
+		return frag;
+	}
+
+	function createList(array, method) {
+		const links = [];
+		for (const item of array) {
+			if (item.hasOwnProperty("requirements")) {
+				if (item.requirements(slave) === false) {
+					continue;
+				}
+			}
+			const title = item.title || capFirstChar(item.value);
+			links.push(
+				App.UI.DOM.link(
+					title,
+					() => method(item)
+				)
+			);
+		}
+		return App.UI.DOM.generateLinksStrip(links);
+	}
+
+	function apply() {
+		App.Art.refreshSlaveArt(slave, 3, "artFrame");
+		App.Medicine.Salon.tail(
+			slave,
+			{
+				primaryTailColor: primaryTailColor,
+				secondaryTailColor: secondaryTailColor,
+			}
+		);
+	}
+};
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index dec491595859e5549737ae4d1043c15a801caa7a..f700147b1aa4c0beaa218f5a5ba5b1411a9c3b9f 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -29,18 +29,10 @@ App.UI.SlaveList.render = function() {
 	// potentially can be a problem if played long enough to reach Number.MAX_SAFE_INTEGER
 	let listID = Number.MIN_SAFE_INTEGER;
 
-	/** @type {Object.<number, Node>}*/
-	const readyResults = {
-
-	};
-
 	/** @type {App.Art.SlaveArtBatch?} */
 	let batchRenderer = null;
 
-	return {
-		listMarkup: listMarkup,
-		listDOM: listDOM
-	};
+	return listDOM;
 
 	/**
 	 * @param {number[]} IDs
@@ -122,37 +114,6 @@ App.UI.SlaveList.render = function() {
 		return res;
 	}
 
-	/**
-	 * @param {number[]} IDs
-	 * @param {Array.<{id: number, rejects: string[]}>} rejectedSlaves
-	 * @param {slaveToElement} interactionLink
-	 * @param {slaveToElement} [postNote]
-	 * @returns {string}
-	 */
-	function listMarkup(IDs, rejectedSlaves, interactionLink, postNote) {
-		const listIDStr = `slave-list-${listID}`;
-		readyResults[listID] = listDOM(IDs, rejectedSlaves, interactionLink, postNote);
-
-		$(document).one(':passagedisplay', function() {
-			for (const e of document.querySelectorAll('[id^=slave-list]')) {
-				const id = e.getAttribute("data-listId");
-				if (readyResults.hasOwnProperty(id)) {
-					if (e.childNodes.length > 0) {
-						e.innerHTML = '';
-					}
-					e.appendChild(readyResults[id]);
-					delete readyResults[id];
-				}
-			}
-		});
-
-		let resMarkup = `<div id="${listIDStr}" data-listId="${listID}"></div>`;
-		++listID;
-
-		return resMarkup;
-	}
-
-
 	/**
 	 * @param {number} id
 	 * @param {slaveToElement} interactionLink
@@ -615,31 +576,11 @@ App.UI.selectSlaveForPersonalAttention = function(id) {
 	SugarCube.Engine.play("Personal Attention Select");
 };
 
-/**
- * Generates fragment with sorting options, that link to the given passage
- * @param {string} passage The passage to link to
- * @returns {string}
- */
-App.UI.SlaveList.sortingLinks = function(passage) {
-	let r = '&nbsp;&nbsp;&nbsp;&nbsp;Sort by: ';
-	let textify = (cc) => capFirstChar(cc.replace(/([A-Z])/g, " $1"));
-	r += ["devotion", "name", "assignment", "seniority", "actualAge", "visualAge", "physicalAge", "weeklyIncome"]
-		.map(so => V.sortSlavesBy !== so ?
-			App.UI.passageLink(textify(so), passage, `$sortSlavesBy = "${so}"`) : textify(so))
-		.join("&thinsp;|&thinsp;");
-
-	r += '&nbsp;&nbsp;&nbsp;&nbsp;Sort: ';
-	r += ["descending", "ascending"].map(so => V.sortSlavesOrder !== so ?
-		App.UI.passageLink(capFirstChar(so), passage, `$sortSlavesOrder = "${so}"`) : capFirstChar(so))
-		.join("&thinsp;|&thinsp;");
-	return r;
-};
-
 /**
  * @param {string} passage
- * @returns {*}
+ * @returns {HTMLElement}
  */
-App.UI.SlaveList.sortingLinksDOM = function(passage) {
+App.UI.SlaveList.sortingLinks = function(passage) {
 	const outerDiv = document.createElement("div");
 	outerDiv.classList.add("flex-container");
 	const textify = string => capFirstChar(string.replace(/([A-Z])/g, " $1"));
@@ -666,7 +607,7 @@ App.UI.SlaveList.sortingLinksDOM = function(passage) {
  * @param {string} [facilityPassage]
  * @param {boolean} [showTransfersTab=false]
  * @param {{assign: string, remove: string, transfer: (string| undefined)}} [tabCaptions]
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, showTransfersTab = false, tabCaptions = undefined) {
 	const job = facility.job();
@@ -677,30 +618,31 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 		remove: 'Remove a slave',
 		transfer: 'Transfer from Facility'
 	};
-	let r = '';
+	const frag = document.createDocumentFragment();
 	if (V.sortSlavesMain) {
-		r += this.sortingLinks(facilityPassage) + '<br>';
+		frag.append(this.sortingLinks(facilityPassage));
 	}
-	r += '<div class="tabbar">' +
-		App.UI.tabbar.tabButton('assign', tabCaptions.assign) +
-		App.UI.tabbar.tabButton('remove', tabCaptions.remove) +
-		(showTransfersTab ? App.UI.tabbar.tabButton('transfer', tabCaptions.transfer) : '') +
-		'</div>';
+	const tabbar = App.UI.DOM.appendNewElement("div", frag, '', "tabbar");
+	tabbar.append(
+		App.UI.tabbar.tabButtonDOM('assign', tabCaptions.assign),
+		App.UI.tabbar.tabButtonDOM('remove', tabCaptions.remove),
+		(showTransfersTab ? App.UI.tabbar.tabButtonDOM('transfer', tabCaptions.transfer) : '')
+	);
 
 	const facilitySlaves = [...job.employeesIDs()];
 	if (facilitySlaves.length > 0) {
 		SlaveSort.IDs(facilitySlaves);
-		r += App.UI.tabbar.makeTab("remove", App.UI.SlaveList.render.listMarkup(facilitySlaves, [],
+		frag.append(App.UI.tabbar.makeTabDOM("remove", App.UI.SlaveList.render(facilitySlaves, [],
 			App.UI.SlaveList.SlaveInteract.stdInteract,
 			(slave) => App.UI.DOM.link(`Retrieve ${getPronouns(slave).object} from ${facility.name}`, () => removeJob(slave, job.desc.assignment), [], facilityPassage)
-		));
+		)));
 	} else {
-		r += App.UI.tabbar.makeTab("remove", `<em>${capFirstChar(facility.name)} is empty for the moment</em>`);
+		frag.append(App.UI.tabbar.makeTabDOM("remove", App.UI.DOM.makeElement("em", `${capFirstChar(facility.name)} is empty for the moment`)));
 	}
 
 	/**
 	 * @param {number[]} slaveIDs
-	 * @returns {string}
+	 * @returns {DocumentFragment}
 	 */
 	function assignableTabContent(slaveIDs) {
 		SlaveSort.IDs(slaveIDs);
@@ -714,7 +656,7 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 				passedSlaves.push(id);
 			}
 		}, []);
-		return App.UI.SlaveList.render.listMarkup(passedSlaves, rejectedSlaves,
+		return App.UI.SlaveList.render(passedSlaves, rejectedSlaves,
 			App.UI.SlaveList.SlaveInteract.stdInteract,
 			(slave) => App.UI.DOM.link(`Send ${getPronouns(slave).object} to ${facility.name}`, () => { assignmentTransition(slave, job.desc.assignment, facilityPassage); }));
 	}
@@ -722,9 +664,9 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 		const assignableSlaveIDs = job.desc.partTime ?
 			V.slaves.map(slave => slave.ID) : // all slaves can work here
 			[...App.Entity.facilities.penthouse.employeesIDs()]; // only slaves from the penthouse can be transferred here
-		r += App.UI.tabbar.makeTab("assign", assignableTabContent(assignableSlaveIDs));
+		frag.append(App.UI.tabbar.makeTabDOM("assign", assignableTabContent(assignableSlaveIDs)));
 	} else {
-		r += App.UI.tabbar.makeTab("assign", `<strong>${capFirstChar(facility.name)} is full and cannot hold any more slaves</strong>`);
+		frag.append(App.UI.tabbar.makeTabDOM("assign", App.UI.DOM.makeElement("strong", `${capFirstChar(facility.name)} is full and cannot hold any more slaves`)));
 	}
 
 	if (showTransfersTab) {
@@ -736,14 +678,14 @@ App.UI.SlaveList.listSJFacilitySlaves = function(facility, facilityPassage, show
 				}
 				return acc;
 			}, []);
-			r += App.UI.tabbar.makeTab("transfer", assignableTabContent(transferableIDs));
+			frag.append(App.UI.tabbar.makeTabDOM("transfer", assignableTabContent(transferableIDs)));
 		} else {
-			r += App.UI.tabbar.makeTab("transfer", `<strong>${capFirstChar(facility.name)} is full and cannot hold any more slaves</strong>`);
+			frag.append(App.UI.tabbar.makeTabDOM("transfer", App.UI.DOM.makeElement("strong", `${capFirstChar(facility.name)} is full and cannot hold any more slaves`)));
 		}
 	}
 	App.UI.tabbar.handlePreSelectedTab();
 
-	return r;
+	return frag;
 };
 
 /**
@@ -761,77 +703,75 @@ App.UI.SlaveList.makeNameDecorator = function(classNames) {
 };
 
 /**
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 App.UI.SlaveList.listNGPSlaves = function() {
 	const thisPassage = 'New Game Plus';
-	let r = this.sortingLinks(thisPassage) + '<br>';
-
-	r += '<div class="tabbar">' +
-		App.UI.tabbar.tabButton('assign', 'Import a slave') +
-		App.UI.tabbar.tabButton('remove', 'Remove from import') +
-		'</div>';
 
-	const NGPassignment = Job.IMPORTED;
-	/** @type {App.Entity.SlaveState[]} */
-	const slaves = V.slaves;
-
-	/* handle the legacy assignment string */
-	for (const slave of slaves) {
+	const frag = document.createDocumentFragment();
+	frag.append(this.sortingLinks(thisPassage));
+	const tabbar = App.UI.DOM.appendNewElement("div", frag, '', "tabbar");
+	tabbar.append(
+		App.UI.tabbar.tabButtonDOM('assign', "Import a slave"),
+		App.UI.tabbar.tabButtonDOM('remove', "Remove from import")
+	);
+
+	let imported = [];
+	let nonImported = [];
+	for (const slave of V.slaves) {
+		/* handle the legacy assignment string */
 		if (slave.assignment === "be imported") {
 			slave.assignment = Job.IMPORTED;
 		}
+		if (slave.assignment === Job.IMPORTED) {
+			imported.push(slave.ID);
+		} else {
+			nonImported.push(slave.ID);
+		}
 	}
 
-	if (V.slavesToImport > 0) {
-		const importedSlavesIDs = slaves.reduce((acc, s) => {
-			if (s.assignment === NGPassignment) {
-				acc.push(s.ID);
-			}
-			return acc;
-		}, []);
-		SlaveSort.IDs(importedSlavesIDs);
-		r += App.UI.tabbar.makeTab("remove", App.UI.SlaveList.render.listMarkup(importedSlavesIDs, [],
+	if (imported.length > 0) {
+		SlaveSort.IDs(imported);
+		frag.append(App.UI.tabbar.makeTabDOM("remove", App.UI.SlaveList.render(imported, [],
 			App.UI.SlaveList.makeNameDecorator(["emphasizedSlave", "pink"]),
-			(s) => App.UI.DOM.passageLink('Remove from import list', thisPassage,
-				() => { V.slavesToImport -= 1; removeJob(s, NGPassignment); }
-			)));
+			(s) => App.UI.DOM.passageLink('Remove from import list', thisPassage, () => removeJob(s, Job.IMPORTED))
+		)));
 	} else {
-		r += App.UI.tabbar.makeTab("remove", `<em>No slaves will go with you to the new game</em>`);
+		frag.append(App.UI.tabbar.makeTabDOM("remove", App.UI.DOM.makeElement('em', "No slaves will go with you to the new game")));
 	}
 
-	if (V.slavesToImport < V.slavesToImportMax) {
-		const slavesToImportIDs = slaves.reduce((acc, s) => { if (s.assignment !== NGPassignment) { acc.push(s.ID); } return acc; }, []);
-		SlaveSort.IDs(slavesToImportIDs);
-		r += App.UI.tabbar.makeTab("assign", App.UI.SlaveList.render.listMarkup(slavesToImportIDs, [],
+	if (imported.length < V.slavesToImportMax) {
+		SlaveSort.IDs(nonImported);
+		frag.append(App.UI.tabbar.makeTabDOM("assign", App.UI.SlaveList.render(nonImported, [],
 			App.UI.SlaveList.makeNameDecorator(["emphasizedSlave", "pink"]),
-			(s) => App.UI.DOM.passageLink('Add to import list', thisPassage,
-				() => { V.slavesToImport += 1; assignJob(s, NGPassignment); }
-			)));
+			(s) => App.UI.DOM.passageLink('Add to import list', thisPassage, () => assignJob(s, Job.IMPORTED))
+		)));
 	} else {
-		r += App.UI.tabbar.makeTab("assign", `<strong>Slave import limit reached</strong>`);
+		frag.append(App.UI.tabbar.makeTabDOM("assign", App.UI.DOM.makeElement('strong', `Slave import limit reached`)));
 	}
 
 	App.UI.tabbar.handlePreSelectedTab();
-	return r;
+	return frag;
 };
 
 /**
  * Renders facility manager summary or a note with a link to select one
  * @param {App.Entity.Facilities.Facility} facility
  * @param {string} [selectionPassage] passage name for manager selection. "${Manager} Select" if omitted
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 App.UI.SlaveList.displayManager = function(facility, selectionPassage) {
 	const managerCapName = capFirstChar(facility.desc.manager.position);
 	selectionPassage = selectionPassage || `${managerCapName} Select`;
 	const manager = facility.manager.currentEmployee;
 	if (manager) {
-		return this.render.listMarkup([manager.ID], [],
+		return this.render([manager.ID], [],
 			App.UI.SlaveList.SlaveInteract.stdInteract,
 			() => App.UI.DOM.passageLink(`Change or remove ${managerCapName}`, selectionPassage));
 	} else {
-		return `You do not have a slave serving as a ${managerCapName}. ${App.UI.passageLink(`Appoint one`, selectionPassage, "")}`;
+		const frag = document.createDocumentFragment();
+		frag.append(`You do not have a slave serving as a ${managerCapName}. `, App.UI.DOM.passageLink(`Appoint one`, selectionPassage));
+		return frag;
 	}
 };
 
@@ -839,10 +779,13 @@ App.UI.SlaveList.displayManager = function(facility, selectionPassage) {
  * Displays standard facility page with manager and list of workers
  * @param {App.Entity.Facilities.Facility} facility
  * @param {boolean} [showTransfersPage]
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 App.UI.SlaveList.stdFacilityPage = function(facility, showTransfersPage) {
-	return this.displayManager(facility) + '<br><br>' + this.listSJFacilitySlaves(facility, passage(), showTransfersPage);
+	const frag = this.displayManager(facility);
+	frag.append(document.createElement('br')); // TODO: replace with margin on one of the divs?
+	frag.append(this.listSJFacilitySlaves(facility, passage(), showTransfersPage));
+	return frag;
 };
 
 App.UI.SlaveList.penthousePage = function() {
@@ -865,7 +808,7 @@ App.UI.SlaveList.penthousePage = function() {
 			const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Manage Head Girl", "HG Select"), "major-link");
 			link.id = "manageHG";
 			slaveWrapper.append(link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("HG Select"), "hotkey"));
-			slaveWrapper.append(App.UI.SlaveList.render.listDOM([HG.ID], [],
+			slaveWrapper.append(App.UI.SlaveList.render([HG.ID], [],
 				App.UI.SlaveList.SlaveInteract.penthouseInteract));
 		} else {
 			if (V.slaves.length > 1) {
@@ -908,7 +851,7 @@ App.UI.SlaveList.penthousePage = function() {
 			const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Manage Recruiter", "Recruiter Select"), "major-link");
 			link.id = "manageRecruiter";
 			slaveWrapper.append(link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("Recruiter Select"), "hotkey"));
-			slaveWrapper.append(App.UI.SlaveList.render.listDOM([RC.ID], [],
+			slaveWrapper.append(App.UI.SlaveList.render([RC.ID], [],
 				App.UI.SlaveList.SlaveInteract.penthouseInteract));
 		} else {
 			slaveWrapper.append("You have ", App.UI.DOM.makeElement("span", "not", "warning"), " selected a Recruiter. ",
@@ -931,7 +874,7 @@ App.UI.SlaveList.penthousePage = function() {
 				const link = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Manage Bodyguard", "BG Select"), "major-link");
 				link.id = "manageBG";
 				slaveWrapper.append(link, " ", App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("BG Select"), "hotkey"));
-				slaveWrapper.append(App.UI.SlaveList.render.listDOM([BG.ID], [],
+				slaveWrapper.append(App.UI.SlaveList.render([BG.ID], [],
 					App.UI.SlaveList.SlaveInteract.penthouseInteract));
 				slaveWrapper.append(App.MainView.useGuard());
 			} else {
@@ -962,7 +905,7 @@ App.UI.SlaveList.penthousePage = function() {
 		SlaveSort.IDs(employeesIDs);
 		return {
 			n: employeesIDs.length,
-			dom: App.UI.SlaveList.render.listDOM(employeesIDs, [], App.UI.SlaveList.SlaveInteract.penthouseInteract,
+			dom: App.UI.SlaveList.render(employeesIDs, [], App.UI.SlaveList.SlaveInteract.penthouseInteract,
 				V.fucktoyInteractionsPosition === 1 && job === "fucktoy" ? App.MainView.useFucktoy : null)
 		};
 	}
@@ -1051,7 +994,7 @@ App.UI.SlaveList.penthousePage = function() {
 		}
 		SlaveSort.IDs(penthouseSlavesIDs);
 		return makeTabDesc('all', `All${V.useSlaveSummaryTabs > 0 ? ` (${penthouseSlavesIDs.length})` : ""}`,
-			App.UI.SlaveList.render.listDOM(penthouseSlavesIDs, [], App.UI.SlaveList.SlaveInteract.penthouseInteract));
+			App.UI.SlaveList.render(penthouseSlavesIDs, [], App.UI.SlaveList.SlaveInteract.penthouseInteract));
 	}
 
 	let fragment = document.createDocumentFragment();
@@ -1061,7 +1004,7 @@ App.UI.SlaveList.penthousePage = function() {
 	}
 
 	if (V.sortSlavesMain) {
-		fragment.append(App.UI.SlaveList.sortingLinksDOM("Main"));
+		fragment.append(App.UI.SlaveList.sortingLinks("Main"));
 	}
 
 	/** @type {tabDesc[]} */
@@ -1127,12 +1070,6 @@ App.UI.SlaveList.penthousePage = function() {
 	return fragment;
 };
 
-/**
- * @callback assignmentFilterGenerateCallback
- * @param {string} value
- * @returns {string}
- */
-
 /**
  * @callback slaveFilterCallbackReasoned
  * @param {App.Entity.SlaveState} slave
@@ -1148,49 +1085,53 @@ App.UI.SlaveList.penthousePage = function() {
 App.UI.SlaveList.slaveSelectionList = function() {
 	const selectionElementId = "slaveSelectionList";
 
-	return selection;
-
 	/**
-	 * @typedef ListOptions
 	 * @property {slaveFilterCallbackReasoned|slaveFilterCallbackSimple} filter
-	 * @property {slaveTestCallback} [expCheck]
 	 * @property {slaveToElement} interactionLink
+	 * @property {slaveTestCallback} [expCheck]
 	 * @property {slaveToElement} [postNote]
 	 */
+	let options = null;
+
+	return selection;
 
 	/**
 	 * @param {slaveFilterCallbackReasoned|slaveFilterCallbackSimple} filter
 	 * @param {slaveToElement} interactionLink
-	 * @param {slaveTestCallback} [experianceChecker]
+	 * @param {slaveTestCallback} [experienceChecker]
 	 * @param {slaveToElement} [postNote]
-	 * @returns {string}
+	 * @returns {HTMLElement}
 	 */
-	function selection(filter, interactionLink, experianceChecker, postNote) {
-		if (experianceChecker === null) { experianceChecker = undefined; }
-		State.temporary.slaveSelection = {
+	function selection(filter, interactionLink, experienceChecker, postNote) {
+		if (experienceChecker === null) { experienceChecker = undefined; }
+		options = {
 			filter: filter,
-			expCheck: experianceChecker,
 			interactionLink: interactionLink,
-			postNote: postNote,
-			update: _updateList
+			expCheck: experienceChecker,
+			postNote: postNote
 		};
 
 		$(document).one(':passagedisplay', () => { _updateList('all'); });
-		return `<div>${_assignmentFilter(s => `<<run _slaveSelection.update('${s}')>>`, experianceChecker !== undefined)} <div id=${selectionElementId}></div></div>`;
+
+		const div = document.createElement("div");
+		div.append(_assignmentFilter(experienceChecker !== undefined));
+		const selectionElement = App.UI.DOM.appendNewElement("div", div);
+		selectionElement.id = selectionElementId;
+		return div;
 	}
 
 	function _updateList(assignment) {
 		const e = document.getElementById(selectionElementId);
 		e.innerHTML = '';
-		e.appendChild(_listSlaves(assignment, State.temporary.slaveSelection));
+		e.appendChild(_listSlaves(assignment));
 	}
+
 	/**
-	 * Displays assignment filter links, whose action are generated by the callback
-	 * @param {assignmentFilterGenerateCallback} callback
+	 * Displays assignment filter links
 	 * @param {boolean} includeExperienced
-	 * @returns {string}
+	 * @returns {HTMLElement}
 	 */
-	function _assignmentFilter(callback, includeExperienced) {
+	function _assignmentFilter(includeExperienced) {
 		let filters = {
 			all: "All"
 		};
@@ -1204,30 +1145,21 @@ App.UI.SlaveList.slaveSelectionList = function() {
 			}
 		}
 		let links = [];
-		/* seems like SC2 does not process data-setter when data-passage is not set
 		for (const f in filters) {
-			links.push(App.UI.passageLink(filters[f], passage, callback(f)));
+			links.push(App.UI.DOM.link(filters[f], () => _updateList(f)));
 		}
 		if (includeExperienced) {
-			links.push(`<span class="lime">${App.UI.passageLink('Experienced', passage, callback('experienced'))}</span>`);
-		}*/
-		for (const f in filters) {
-			links.push(`<<link "${filters[f]}">>${callback(f)}<</link>>`);
-		}
-		if (includeExperienced) {
-			links.push(`<span class="lime"><<link "Experienced">>${callback('experienced')}<</link>></span>`);
+			links.push(App.UI.DOM.makeElement("span", App.UI.DOM.link('Experienced', () => _updateList('experienced')), "lime"));
 		}
 
-		return links.join('&thinsp;|&thinsp;');
+		return App.UI.DOM.generateLinksStrip(links);
 	}
 
 	/**
-	 *
 	 * @param {string} assignmentStr
-	 * @param {ListOptions} options
 	 * @returns {DocumentFragment}
 	 */
-	function _listSlaves(assignmentStr, options) {
+	function _listSlaves(assignmentStr) {
 		const slaves = V.slaves;
 		let unfilteredIDs = [];
 		switch (assignmentStr) {
@@ -1235,7 +1167,7 @@ App.UI.SlaveList.slaveSelectionList = function() {
 				unfilteredIDs = slaves.map(s => s.ID);
 				break;
 			case 'experienced':
-				unfilteredIDs = slaves.reduce((acc, s, idx) => {
+				unfilteredIDs = slaves.reduce((acc, s) => {
 					if (options.expCheck(s)) {
 						acc.push(s.ID);
 					}
@@ -1273,14 +1205,14 @@ App.UI.SlaveList.slaveSelectionList = function() {
 				s => options.postNote(s) :
 				() => null;
 
-		return App.UI.SlaveList.render.listDOM(passingIDs, rejects, options.interactionLink, listPostNote);
+		return App.UI.SlaveList.render(passingIDs, rejects, options.interactionLink, listPostNote);
 	}
 }();
 
 /**
  * @param {App.Entity.Facilities.Facility} facility
  * @param {string} passage go here after the new facility manager is selected
- * @returns {string}
+ * @returns {HTMLElement}
  */
 App.UI.SlaveList.facilityManagerSelection = function(facility, passage) {
 	return this.slaveSelectionList(slave => facility.manager.canEmploy(slave),
diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js
index e0adc5cbe33f5bddf80a9a136338c11fdcafe010..8469e52d0b93db064628fbde85acca2f28094766 100644
--- a/src/js/slaveSummaryWidgets.js
+++ b/src/js/slaveSummaryWidgets.js
@@ -138,7 +138,7 @@ App.UI.SlaveSummaryRenderers = function() {
 			}
 			if (slave.vagina === 0) {
 				makeSpan(c, "VV", "lime");
-			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+			} else if ((slave.pregKnown === 1) && canStand(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
 				makeSpan(c, "NBP", "pink");
 			}
 			if (slave.anus === 0) {
@@ -460,7 +460,7 @@ App.UI.SlaveSummaryRenderers = function() {
 			}
 			if (slave.vagina === 0) {
 				helpers.makeSpan(c, "Virgin.", "lime");
-			} else if ((slave.pregKnown === 1) && canWalk(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
+			} else if ((slave.pregKnown === 1) && canStand(slave) && (slave.clothes === "no clothing" || slave.clothes === "body oil") && (slave.shoes === "none")) {
 				helpers.makeSpan(c, "Naked, barefoot, and pregnant.", "pink");
 			}
 			if (slave.anus === 0) {
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index 2c8cb5c43b01df5cad743276c4ecb99926dc6aea..afb63c489bc68e8724150118ee675ace188fd813 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -834,28 +834,16 @@ globalThis.canStand = function(slave) {
 		return false;
 	} else if (!hasAnyLegs(slave)) {
 		return false;
+	} else if (slave.heels === 1 && (slave.shoes !== "pumps")) {
+		return false;
 	} else if (slave.heels === 1 && !setup.highHeels.includes(slave.shoes)) {
 		return false;
 	} else if (tooFatSlave(slave)) {
 		return false;
 	} else if (tooBigBreasts(slave)) {
 		return false;
-	} else if (slave.physicalAge <= 3) {
-		if (slave.belly >= 150000 + (slave.muscles * 500)) {
-			return false;
-		}
-	} else if (slave.physicalAge <= 12) {
-		if (slave.belly >= 450000 + (slave.muscles * 800)) {
-			return false;
-		}
-	} else if (slave.physicalAge < 18) {
-		if (slave.belly >= 450000 + (slave.muscles * 1000)) {
-			return false;
-		}
-	} else if (slave.physicalAge >= 18) {
-		if (slave.belly >= 1500000 + (slave.muscles * 2000)) {
-			return false;
-		}
+	} else if (tooBigBelly(slave)) {
+		return false;
 	}
 	return true;
 };
@@ -877,20 +865,20 @@ globalThis.canMove = function(slave) {
 		if (slave.boobs > 25000 + (slave.muscles * 20)) {
 			return false;
 		}
-		if (slave.belly >= 100000) {
+		if (slave.belly >= 150000) {
 			return false;
 		}
-		if (slave.balls >= 30 + (slave.muscles * 0.3) && slave.physicalAge <= 3) {
+		if (slave.balls >= 30 + (slave.muscles * 0.3)) {
 			return false;
 		}
 	} else if (slave.physicalAge <= 12) {
 		if (slave.boobs > 100000 + (slave.muscles * 50)) {
 			return false;
 		}
-		if (slave.belly >= 400000) {
+		if (slave.belly >= 300000) {
 			return false;
 		}
-		if (slave.balls >= 60 + (slave.muscles * 0.5) && slave.physicalAge <= 12) {
+		if (slave.balls >= 60 + (slave.muscles * 0.5)) {
 			return false;
 		}
 	} else if (slave.physicalAge < 18) {
@@ -1018,13 +1006,13 @@ globalThis.tooBigBreasts = function(slave) {
 globalThis.tooBigBelly = function(slave) {
 	if (!slave) {
 		return null;
-	} else if (slave.belly >= 450000 + (slave.muscles * 2000) && slave.physicalAge >= 18) {
+	} else if (slave.belly >= 450000 + (slave.muscles * 2000) && slave.physicalAge >= 18) { // 250k - 650k
 		return true;
-	} else if (slave.belly >= 350000 + (slave.muscles * 1000) && slave.physicalAge >= 13) {
+	} else if (slave.belly >= 350000 + (slave.muscles * 1000) && slave.physicalAge >= 13) { // 250k - 450k
 		return true;
-	} else if (slave.belly >= 30000 + (slave.muscles * 500) && slave.physicalAge <= 3) {
+	} else if (slave.belly >= 120000 + (slave.muscles * 500) && slave.physicalAge <= 3) { // 70k - 170k
 		return true;
-	} else if (slave.belly >= 150000 + (slave.muscles * 800) && slave.physicalAge <= 12) {
+	} else if (slave.belly >= 150000 + (slave.muscles * 800) && slave.physicalAge <= 12) { // 70k - 230k
 		return true;
 	}
 	return false;
diff --git a/src/js/underperformingSlaves.js b/src/js/underperformingSlaves.js
new file mode 100644
index 0000000000000000000000000000000000000000..04f1444bb0278fddb639b02ac3d012eb352ce9dc
--- /dev/null
+++ b/src/js/underperformingSlaves.js
@@ -0,0 +1,58 @@
+App.Underperformers = {};
+
+/** Select only slaves which are not reasonably expected to produce any income (brand new slaves, servants, fucktoys, etc)
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+App.Underperformers.expectIncome = function(slave) {
+	const productionJobs = [Job.ARCADE, Job.MILKED, Job.WHORE, Job.GLORYHOLE, Job.BROTHEL, Job.DAIRY];
+	return productionJobs.includes(slave.assignment) && ((slave.weekAcquired + 1) < V.week) && _.isFinite(slave.lastWeeksCashIncome);
+};
+
+App.Underperformers.highSale = function() {
+	const description = App.UI.DOM.makeElement("div", "Take the rough value of a slave and divide it by how much they made overall last week. This will tell you how many weeks it might take them to earn the same amount you'd get for selling them right now.", "note");
+
+	const frag = App.UI.SlaveList.render(
+		getBestSlavesIDs(
+			{
+				part:(slave) => {
+					const ratio = slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave));
+					return ratio > 0 ? ratio : 100000000 + ratio;
+				},
+				count: 7,
+				filter: App.Underperformers.expectIncome
+			}
+		),
+		[],
+		App.UI.SlaveList.SlaveInteract.stdInteract,
+		(slave) => $(document.createDocumentFragment()).append(
+			`Worth ${cashFormatColor(slaveCost(slave))} / Nets ${cashFormatColor(slave.lastWeeksCashIncome - getSlaveCost(slave))} a week = ${(Math.trunc(slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave)))) > 0 ? (Math.trunc(slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave)))) : "infinite"} weeks`
+		).get(0)
+	);
+
+	frag.prepend(description);
+	return frag;
+};
+
+App.Underperformers.expensive = function() {
+	const description = App.UI.DOM.makeElement("div", "This list looks for moochers by weighing their weekly income against the weekly cost of providing for them.", "note");
+
+	const frag = App.UI.SlaveList.render(
+		getBestSlavesIDs(
+			{
+				part:(slave) => (slave.lastWeeksCashIncome - getSlaveCost(slave)),
+				largest: false,
+				count: 7,
+				filter: App.Underperformers.expectIncome
+			}
+		),
+		[],
+		App.UI.SlaveList.SlaveInteract.stdInteract,
+		(slave) => $(document.createDocumentFragment()).append(
+			`${cashFormatColor(Math.trunc(slave.lastWeeksCashIncome - getSlaveCost(slave)))} net last week`
+		).get(0)
+	);
+
+	frag.prepend(description);
+	return frag;
+};
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index efd222f544541de35cd3d3df43b596a2aab60db1..0996959a4dc991766efc4d092843605b2c02f079 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -348,16 +348,7 @@ App.UI.DOM.accordion = function(head, content, hidden = true) {
 	const button = App.UI.DOM.appendNewElement("button", fragment, head, "accordion");
 
 	if (content) {
-		content.classList.add("accordion-content");
-		if (hidden) {
-			content.classList.add("hidden");
-		} else {
-			button.classList.add("open");
-		}
-		button.onclick = () => {
-			button.classList.toggle("open");
-			content.classList.toggle("hidden");
-		};
+		App.UI.DOM.elementToggle(button, [content], hidden);
 		fragment.append(content);
 	} else {
 		button.classList.add("empty");
@@ -366,6 +357,28 @@ App.UI.DOM.accordion = function(head, content, hidden = true) {
 	return fragment;
 };
 
+/**
+ * @param {HTMLElement} toggleElement
+ * @param {Array<HTMLElement>} content
+ * @param {boolean} [startHidden=true]
+ */
+App.UI.DOM.elementToggle = function(toggleElement, content, startHidden = true) {
+	toggleElement.classList.add("accordion");
+	for (let htmlElement of content) {
+		htmlElement.classList.add("accordion-content");
+	}
+	const toggle = () => {
+		toggleElement.classList.toggle("closed");
+		for (let htmlElement of content) {
+			htmlElement.classList.toggle("hidden");
+		}
+	};
+	toggleElement.onclick = toggle;
+	if (startHidden) {
+		toggle();
+	}
+};
+
 /*
 	<<includeDOM element>>
 	Simply inserts a given DOM element.
diff --git a/src/js/utilsSC.js b/src/js/utilsSC.js
index 2aec598922d7c4e30a71f338817d95e7eb974c96..c424d660b07a8ad10dd97262ec90e1717fb751bd 100644
--- a/src/js/utilsSC.js
+++ b/src/js/utilsSC.js
@@ -274,7 +274,7 @@ App.UI.disabledLink = function(link, reasons) {
 /** handler function for slaveDescriptionDialog. do not call directly. */
 App.UI._showDescriptionDialog = function(slave) {
 	Dialog.setup(SlaveFullName(slave));
-	const image = App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]);
+	const image = V.seeImages ? App.UI.DOM.makeElement("div", App.Art.SlaveArtElement(slave, 2, 0), ["imageRef", "medImg"]) : '';
 	Dialog.append(image).append(App.Desc.longSlave(slave, {eventDescription: 1}));
 	Dialog.open();
 };
diff --git a/src/js/vignettes.js b/src/js/vignettes.js
index 7719f6ccd13a0bfa02462adb29aa57a0567376f2..5940f773f52d3e2321638a280114bbefba8ee42d 100644
--- a/src/js/vignettes.js
+++ b/src/js/vignettes.js
@@ -2,11 +2,11 @@
  * @param {App.Entity.SlaveState} slave
  * @returns {{text: string, type: string, effect: number}}
  */
-globalThis.GetVignette = function(slave) {
+globalThis.GetVignette = function (slave) {
 	/** @type {{text: string, type: string, effect: number}[]} */
 	let vignettes = [];
 
-	const {he, him, his, hers, himself, boy, He/* , His */} = getPronouns(slave);
+	const { he, him, his, hers, himself, boy, He } = getPronouns(slave);
 
 	if (slave.assignment === window.Job.WHORE || slave.assignment === window.Job.BROTHEL || slave.assignment === window.Job.MADAM) {
 		let seed = jsRandom(1, 10);
@@ -1144,7 +1144,7 @@ globalThis.GetVignette = function(slave) {
 				effect: 1,
 			});
 		}
-		if (!canWalk(slave)) {
+		if (!canMove || (!canWalk(slave) && canMove(slave) && slave.rules.mobility === "restrictive")) {
 			vignettes.push({
 				text: `${his} lack of mobility severely hindered ${his} attempts to find customers,`,
 				type: "cash",
@@ -3113,7 +3113,7 @@ globalThis.GetVignette = function(slave) {
 				effect: 1,
 			});
 		}
-		if (!canWalk(slave)) {
+		if (!canMove || (!canWalk(slave) && canMove(slave) && slave.rules.mobility === "restrictive")) {
 			vignettes.push({
 				text: `${his} lack of mobility severely hindered ${his} attempts to please citizens,`,
 				type: "rep",
@@ -4204,7 +4204,7 @@ globalThis.GetVignette = function(slave) {
 				effect: 1,
 			});
 		}
-		if (canWalk(slave)) {
+		if (canStand(slave)) {
 			vignettes.push({
 				text: `${he} slipped and fell in an errant puddle of various bodily fluids,`,
 				type: "health",
@@ -4234,73 +4234,7 @@ globalThis.GetVignette = function(slave) {
 			effect: 0,
 		});
 	} else if (slave.assignment === window.Job.FARMYARD || slave.assignment === window.Job.FARMER) {
-		if (canWalk(slave)) {
-			vignettes.push({
-				text: `${he} rather comically injured ${himself} by stepping on a rake,`,
-				type: "health",
-				effect: -1,
-			});
-		}
-		// TODO: add more vignettes
-		if ((V.farmyardBreeding) && (V.seeBestiality)) {
-			vignettes.push({
-				text: `a citizen didn't realize how disgusting he found bestiality until he attended one of ${V.farmyardName}'s shows,`,
-				type: "rep",
-				effect: -1,
-			});
-			vignettes.push({
-				text: `a citizen attended one of ${V.farmyardName}'s shows and discovered he had a bestiality fetish,`,
-				type: "rep",
-				effect: 1,
-			});
-			vignettes.push({
-				text: `${he} dreamt that you decided to have ${him} do nothing but fuck animals for the rest of ${his} life,`,
-				type: "devotion",
-				effect: -1
-			});
-			vignettes.push({
-				text: `${he} dreamt that you wouldn't come to ${his} aid when one of ${his} bestial partners became overeager,`,
-				type: "trust",
-				effect: -1
-			});
-			if ((V.canines.length > 0) && hasAnyNaturalLegs(slave)) {
-				vignettes.push({
-					text: `an over-excited dog left scratch marks on ${his} leg,`,
-					type: "health",
-					effect: -1
-				});
-			}
-			if (V.hooved.length > 0) {
-				vignettes.push({
-					text: `${he} was injured by a particularly well-endowed horse,`,
-					type: "health",
-					effect: -1
-				});
-			}
-			if (V.felines.length > 0) {
-				vignettes.push({
-					text: `${he} managed to take two tigers at once, aweing the crowd,`,
-					type: "cash",
-					effect: 1
-				});
-			}
-		} else {
-			vignettes.push({
-				text: `${he} worked extra hard, and managed to sell extra produce,`,
-				type: "cash",
-				effect: 1,
-			});
-		}
-		vignettes.push({
-			text: `${he} felt energized by the simulated outdoor environment`,
-			type: "health",
-			effect: 1,
-		});
-		vignettes.push({
-			text: `the pesticides ${he} accidentally inhaled made ${him} feel nauseous,`,
-			type: "health",
-			effect: -1,
-		});
+		vignettes.push(farmyardVignettes(slave));
 	} else if (slave.assignment === window.Job.REST || slave.assignment === window.Job.SPA) {
 		switch (slave.behavioralFlaw) {
 			case "anorexic":
@@ -4454,6 +4388,12 @@ globalThis.GetVignette = function(slave) {
 					type: "health",
 					effect: -1,
 				});
+			} else if (canMove(slave)) {
+				vignettes.push({
+					text: `${he} was so horny that ${he} sleepcrawled into your room, only to fall and bump ${his} head while climbing into bed with you,`,
+					type: "health",
+					effect: -1,
+				});
 			} else {
 				if (hasAnyArms(slave)) {
 					if (slave.rules.release.masturbation === 1) {
@@ -4593,6 +4533,12 @@ globalThis.GetVignette = function(slave) {
 				type: "health",
 				effect: 1,
 			});
+		} else if (canMove(slave) && slave.rules.mobility === "permissive") {
+			vignettes.push({
+				text: `${he} spent much of ${his} free time making use of ${his} restored mobility by exploring the arcology,`,
+				type: "health",
+				effect: 1,
+			});
 		}
 		vignettes.push({
 			text: `${he} spent much of ${his} free time napping,`,
@@ -4600,5 +4546,93 @@ globalThis.GetVignette = function(slave) {
 			effect: 1,
 		});
 	}
+
 	return jsEither(vignettes);
+
+
+
+	// MARK: Farmyard
+
+	function farmyardVignettes(slave) {
+		let r = [];
+
+		if (canWalk(slave)) {
+			r.push({
+				text: `${he} rather comically injured ${himself} by stepping on a rake,`,
+				type: "health",
+				effect: -1,
+			});
+		}
+
+		if ((V.farmyardBreeding) && (V.seeBestiality)) {
+			r.push({
+				text: `a citizen didn't realize how disgusting he found bestiality until he attended one of ${V.farmyardName}'s shows,`,
+				type: "rep",
+				effect: -1,
+			});
+
+			r.push({
+				text: `a citizen attended one of ${V.farmyardName}'s shows and discovered he had a bestiality fetish,`,
+				type: "rep",
+				effect: 1,
+			});
+
+			r.push({
+				text: `${he} dreamt that you decided to have ${him} do nothing but fuck animals for the rest of ${his} life,`,
+				type: "devotion",
+				effect: -1
+			});
+
+			r.push({
+				text: `${he} dreamt that you wouldn't come to ${his} aid when one of ${his} bestial partners became overeager,`,
+				type: "trust",
+				effect: -1
+			});
+
+			if ((V.canines.length > 0) && hasAnyNaturalLegs(slave)) {
+				r.push({
+					text: `an over-excited dog left scratch marks on ${his} leg,`,
+					type: "health",
+					effect: -1
+				});
+			}
+
+			if (V.hooved.length > 0) {
+				r.push({
+					text: `${he} was injured by a particularly well-endowed horse,`,
+					type: "health",
+					effect: -1
+				});
+			}
+
+			if (V.felines.length > 0) {
+				r.push({
+					text: `${he} managed to take two tigers at once, aweing the crowd,`,
+					type: "cash",
+					effect: 1
+				});
+
+			}
+		} else {
+			r.push({
+				text: `${he} worked extra hard, and managed to sell extra produce,`,
+				type: "cash",
+				effect: 1,
+			});
+		}
+
+		r.push({
+			text: `${he} felt energized by the simulated outdoor environment`,
+			type: "health",
+			effect: 1,
+		});
+
+		r.push({
+			text: `the pesticides ${he} accidentally inhaled made ${him} feel nauseous,`,
+			type: "health",
+			effect: -1,
+		});
+
+		return jsEither(r);
+	}
 };
diff --git a/src/js/wombJS.js b/src/js/wombJS.js
index e560f361fc5fd2203a9f1c90ca2f05c82b345c3d..2cdf98b6a0ff14da877cc76498f9ba6f798a83f0 100644
--- a/src/js/wombJS.js
+++ b/src/js/wombJS.js
@@ -94,6 +94,14 @@ globalThis.WombInit = function(actor) {
 			WombImpregnate(actor, bLeft, actor.pregSource, i + 1); // setting up leftover of fetuses.
 		}
 	}
+
+	actor.womb.forEach(f => {
+		if (!jsDef(f.genetics.inbreedingCoeff)) {
+			f.genetics.inbreedingCoeff = ibc.coeff(
+				{ID: null, mother: f.genetics.mother, father: f.genetics.father}
+			);
+		}
+	});
 };
 
 globalThis.WombImpregnate = function(actor, fCount, fatherID, age, surrogate) {
diff --git a/src/neighbor/neighborInteract.js b/src/neighbor/neighborInteract.js
index 92701210edd08bb9c1c7aade7e828316aa197d71..3abdab94c9fa7e198a71f6b4f4cabd693b5572b8 100644
--- a/src/neighbor/neighborInteract.js
+++ b/src/neighbor/neighborInteract.js
@@ -181,7 +181,7 @@ App.Neighbor.Interact = (function() {
 				linkText = `Recall them and reenslave your agent`;
 				residentList.push(agentPartner.ID);
 			}
-			container.append(App.UI.SlaveList.render.listDOM(residentList, [], App.UI.SlaveList.SlaveInteract.stdInteract));
+			container.append(App.UI.SlaveList.render(residentList, [], App.UI.SlaveList.SlaveInteract.stdInteract));
 			container.append(App.UI.DOM.link(linkText, (f) => { removeJob(agent, "be your agent"); arcChanged(arcID); }));
 		}
 		container.append(" | ");
diff --git a/src/npc/acquisition.tw b/src/npc/acquisition.tw
index ebb7ec3198702510af01eb6f78bb89c73570b508..59d74203b7f14caa28fdeefecbd4318be3e3abd2 100644
--- a/src/npc/acquisition.tw
+++ b/src/npc/acquisition.tw
@@ -178,6 +178,23 @@
 		<<set $missingParentID-->>
 	<</if>>
 <</for>>
+<<set _coeffSlaves = []>>
+<<set _genePoolMap = {}>>
+<<for _i = 0; _i < $genePool.length; _i++>>
+	<<set _genePoolMap[$genePool[_i].ID] = $genePool[_i]>>
+<</for>>
+<<for _i = 0; _i < $slaves.length; _i++>>
+	<<if $slaves[_i].newGamePlus == 0>>
+		<<set $slaves[_i].inbreedingCoeff = -1>>
+		<<set _genePoolMap[$slaves[_i].ID].inbreedingCoeff = -1>>
+		<<run _coeffSlaves.push($slaves[_i])>>
+	<</if>>
+<</for>>
+<<set _ibcoeffs = ibc.coeff_slaves(_coeffSlaves)>>
+<<for _i = 0; _i < _coeffSlaves.length; _i++>>
+	<<set _coeffSlaves[_i].inbreedingCoeff = _ibcoeffs[_coeffSlaves[_i].ID]>>
+	<<set _genePoolMap[_coeffSlaves[_i].ID].inbreedingCoeff = _ibcoeffs[_coeffSlaves[_i].ID]>>
+<</for>>
 <<if $plot == 1 && $neighboringArcologies > 0>>
 	<<set _bestProsperity = 0, _bestProsperityIndex = 1>>
 	<<for _acq = 1; _acq < $arcologies.length; _acq++>>
diff --git a/src/npc/agent/agentSelect.tw b/src/npc/agent/agentSelect.tw
index 147416474dbbb8ae100fc6168f18b47cb21a9610..e337c0d0ba671437a066fa34cdf110e684d62163 100644
--- a/src/npc/agent/agentSelect.tw
+++ b/src/npc/agent/agentSelect.tw
@@ -3,7 +3,7 @@
 <<set $nextButton = "Back", $nextLink = "Neighbor Interact", $encyclopedia = "Agents">>
 ''Appoint an Agent from your devoted slaves:''
 
-<<= App.UI.SlaveList.slaveSelectionList(
+<<includeDOM App.UI.SlaveList.slaveSelectionList(
 		s => (s.fuckdoll === 0 && s.devotion > 20 && s.intelligence + s.intelligenceImplant > 15 && s.intelligenceImplant >= 15 && canWalk(s) && canSee(s) && canHear(s) && canTalk(s) && s.broodmother < 2 && (s.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")),
 		(slave) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Agent Workaround',
 			() => { V.i = V.slaves.findIndex((s) => s.ID === slave.ID); }),
diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index 7e39a4bee79aeeb4ad3f9f440984b1061a3671c6..aba3677ebd840189936f3a74d74ee94eb569dc54 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -188,14 +188,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is nothing more than a womb with a ${loli} attached. ${He} struggles to not be lost under the squirming mass of infants that dwarf ${his} body.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							r.push(`stand up`);
-						} else {
-							r.push(`get to ${his} feet`);
-						}
-						r.push(`and aid ${him} through ${his} daily affairs.`);
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${him} and aid ${him} through ${his} daily affairs.`);
 					}
 				} else {
 					r.push(`and ${he} is nothing more than a womb with a ${girl} attached. ${He} is physically unable to keep ${his} boundless middle off the ground for long, if at all.`);
@@ -245,14 +239,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is nothing more than an obscene over-filled implant with a ${loli} attached. ${He} struggles to not be lost under the straining mass that dwarfs ${his} body.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							r.push(`stand up`);
-						} else {
-							r.push(`get to ${his} feet`);
-						}
-						r.push(`and aid ${him} through ${his} daily affairs.`);
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${him} and aid ${him} through ${his} daily affairs.`);
 					}
 				} else {
 					r.push(`and ${he} is nothing more than an over-filled implant with a ${girl} attached. ${He} is physically unable to keep ${his} boundless middle off the ground for long, if at all.`);
@@ -319,24 +307,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`an overstuffed womb with a ${loli} attached. ${He} struggles to not be lost under the squirming mass of infants that fill ${his} body.`);
 					}
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere`);
-						}
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame can keep ${his}`);
@@ -345,25 +317,6 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`life brimming belly off the ground; but only for a moment. ${He} opts to not try this often as ${his} occupants are liable to voice their complaints with a hail of kicks.`);
 					}
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
-						}
-					}
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is nothing more than`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -371,25 +324,6 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`an overstuffed womb with a ${girl} attached. ${He} struggles to remain seen under the squirming mass of infants that fill ${his} body.`);
 					}
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
-						}
-					}
 				} else if (slave.muscles > 90) {
 					r.push(`and ${his} muscular body`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -397,26 +331,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`perfectly handles`);
 					}
-					r.push(`${his} monolithic belly, though ${he} still can't move with it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere`);
-						}
-					}
+					r.push(`${his} monolithic belly, though ${he} still can't really function with it.`);
 				} else {
 					r.push(`and ${he} is nothing more than`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -425,24 +340,24 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						r.push(`an overstuffed womb with a ${girl} attached.`);
 					}
 					r.push(`${He} is physically unable to keep ${his} straining belly off the ground.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+				}
+				if (slave.physicalAge > 12) {
+					if (canWalk(slave)) {
+						r.push(`Amazingly, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Amazingly, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`As unpleasant as it may be, ${he} is still capable of slowly dragging ${himself} along the ground.`);
 						}
+					} else if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 					}
 				}
 				if (slave.weight > 190) {
@@ -497,24 +412,8 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`fills ${his} body.`);
 					}
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame can keep ${his}`);
@@ -522,25 +421,6 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						r.push(`straining`);
 					}
 					r.push(`belly off the ground; but only for a moment. ${He} opts to not try this often as ${his} implant is already at its limit and could do without being slammed against the floor.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
-					}
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is nothing more than a ready-to-rupture implant with a ${girl} attached. ${He} struggles to remain seen under the straining mass that`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -548,25 +428,6 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`fills ${his} body.`);
 					}
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
-					}
 				} else if (slave.muscles > 90) {
 					r.push(`and ${his} muscular body`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
@@ -574,50 +435,31 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else {
 						r.push(`perfectly handles`);
 					}
-					r.push(`${his} monolithic belly, though ${he} still can't move with it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
-					}
+					r.push(`${his} monolithic belly, though ${he} still can't really function with it.`);
 				} else {
 					r.push(`and ${he} is nothing more than a ready-to-rupture implant with a ${girl} attached. ${He} is physically unable to keep ${his}`);
 					if (slave.belly > (slave.pregAdaptation * 1000)) {
 						r.push(`straining`);
 					}
 					r.push(`belly off the ground.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+				}
+				if (slave.physicalAge > 12) {
+					if (canWalk(slave)) {
+						r.push(`Amazingly, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Amazingly, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`As unpleasant as it may be, ${he} is still capable of slowly dragging ${himself} along the ground.`);
 						}
+					} else if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 					}
 				}
 				if (slave.weight > 190) {
@@ -647,89 +489,86 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is nothing more than a womb with a ${loli} attached. ${He} has to be careful not to get crushed under ${his} own quivering mass.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
+					}
+				} else if (slave.muscles >= 75) {
+					r.push(`and ${his} muscular body barely allows ${him} to manage ${his} titanic belly.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks a slow, ponderous waddle fitting for a ${girl} of ${his} size and weight.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} gets a serious workout just from standing with such a heavy stomach.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`Despite ${his} size and weight, ${he} requires little assistance to get to ${his} feet, but still must use a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere, but, despite ${his} size and weight, is still able to get in and out of it on ${his} own.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Impressively, ${he} is strong enough to keep ${his} belly from dragging along the ground as ${he} crawls.`);
 						}
+					} else {
+						r.push(`It does not stop it from completely immodilizing ${him}, however.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame barely keeps ${his} titanic belly off the ground; with considerable effort, of course.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
+					} else {
+						r.push(`A talent that is ultimately meaningless when it is so unwieldy it immobilizes you.`);
 					}
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is nothing more than a womb with a ${girl} attached. ${He} has to be careful not to get crushed under ${his} own quivering mass.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
+							r.push(`Dragging the mass along is nigh impossible due to its sheer weight.`);
 						}
+					} else {
 						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 						}
 					}
-				} else if (slave.muscles > 90) {
-					r.push(`and ${his} muscular body barely allows ${him} to manage ${his} titanic belly.`);
 				} else {
 					r.push(`and ${he} is nothing more than a womb with a ${girl} attached. While ${he} can barely heft ${his} titanic belly off the floor, it takes a considerable amount of effort to do so and quickly comes to rest back where it started.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
+					} else {
+						r.push(`A talent that is ultimately meaningless when it is so unwieldy it immobilizes you.`);
 					}
 				}
 				if (slave.weight > 190) {
@@ -766,89 +605,86 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is nothing more than a greatly overfilled implant with a ${loli} attached. ${He} has to be careful not to get crushed under ${his} own taut mass.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (!market) {
+						r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
+					}
+				} else if (slave.muscles >= 75) {
+					r.push(`and ${his} muscular body barely allows ${him} to manage ${his} titanic belly.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks a slow, ponderous waddle fitting for a ${girl} of ${his} size and weight.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} gets a serious workout just from standing with such a heavy stomach.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`Despite ${his} size and weight, ${he} requires little assistance to get to ${his} feet, but still must use a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere, but, despite ${his} size and weight, is still able to get in and out of it on ${his} own.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Impressively, ${he} is strong enough to keep ${his} belly from dragging along the ground as ${he} crawls.`);
 						}
+					} else {
+						r.push(`It does not stop it from completely immodilizing ${him}, however.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame barely keeps ${his} titanic belly off the ground; with considerable effort, of course.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
+					} else {
+						r.push(`A talent that is ultimately meaningless when it is so unwieldy it immobilizes you.`);
 					}
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is nothing more than a greatly overfilled implant with a ${girl} attached. ${He} has to be careful not to get crushed under ${his} own taut mass.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
+							r.push(`Dragging the mass along is nigh impossible due to its sheer weight.`);
 						}
+					} else {
 						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`${He} requires multiple slaves to move ${his} bulk when ${he} must go somewhere.`);
 						}
 					}
-				} else if (slave.muscles > 90) {
-					r.push(`and ${his} muscular body barely allows ${him} to manage ${his} titanic belly.`);
 				} else {
 					r.push(`and ${he} is nothing more than a greatly overfilled implant with a ${girl} attached. While ${he} can barely heft ${his} titanic belly off the floor, it takes a considerable amount of effort to do so and quickly comes to rest back where it started.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is powerful enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
+					} else {
+						r.push(`A talent that is ultimately meaningless when it is so unwieldy it immobilizes you.`);
 					}
 				}
 				if (slave.weight > 190) {
@@ -880,88 +716,75 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} youthful figure is grotesquely bloated by ${his} pregnancy. ${He} can't keep ${his} gigantic belly off the floor and fights a losing battle to not be pinned by it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
-						}
+					if (!market) {
+						r.push(`${He} requires assistance to move when ${he} must go somewhere.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame barely keeps ${his} gigantic belly off the ground; with considerable effort, of course.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				} else if (slave.height < 150) {
 					r.push(`and ${his} small figure is utterly dwarfed by ${his} pregnancy. ${He} can't keep ${his} gigantic belly off the floor and fights a losing battle to not be pinned by it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body barely allows ${him} to manage ${his} gigantic belly.`);
-				} else {
-					r.push(`and ${he} is dwarfed by ${his} pregnancy. While ${he} can keep barely ${his} gigantic belly off the floor, it takes a considerable amount of effort to do so.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks a slow, ponderous waddle fitting for a ${girl} of ${his} size and weight.`);
+					} else if (canStand(slave)) {
+						r.push(`${His} legs get a serious workout just from standing with such a heavy stomach.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`Despite ${his} size and weight, ${he} requires no assistance to get to ${his} feet, but still must use a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere, but, despite ${his} size and weight, is still able to get in and out of it on ${his} own.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
+							r.push(`Impressively, ${he} is strong enough to keep ${his} belly from dragging along the ground as ${he} crawls.`);
+						}
+					}
+				} else {
+					r.push(`and ${he} is dwarfed by ${his} pregnancy. While ${he} can keep barely ${his} gigantic belly off the floor, it takes a considerable amount of effort to do so.`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`get to ${his} feet.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+						} else {
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				}
@@ -989,88 +812,75 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} youthful figure is grotesquely bloated by ${his} overfilled implant. ${He} can't keep ${his} gigantic belly off the floor and fights a losing battle to not be pinned by it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
+					if (!market) {
+						r.push(`${He} requires assistance to move when ${he} must go somewhere.`);
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame barely keeps ${his} gigantic belly off the ground; with considerable effort, of course.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires multiple slaves to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				} else if (slave.height < 150) {
 					r.push(`and ${his} small figure is utterly dwarfed by ${his} overfilled implant. ${He} can't keep ${his} gigantic belly off the floor and fights a losing battle to not be pinned by it.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body barely allows ${him} to manage ${his} gigantic belly.`);
-				} else {
-					r.push(`and ${he} is dwarfed by ${his} overfilled implant. While ${he} can keep barely ${his} gigantic belly off the floor, it takes a considerable amount of effort to do so.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks a slow, ponderous waddle fitting for a ${girl} of ${his} size and weight.`);
+					} else if (canStand(slave)) {
+						r.push(`${His} legs get a serious workout just from standing with such a heavy stomach.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`Despite ${his} size and weight, ${he} requires no assistance to get to ${his} feet, but still must use a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere, but, despite ${his} size and weight, is still able to get in and out of it on ${his} own.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
+							r.push(`Impressively, ${he} is strong enough to keep ${his} belly from dragging along the ground as ${he} crawls.`);
+						}
+					}
+				} else {
+					r.push(`and ${he} is dwarfed by ${his} overfilled implant. While ${he} can keep barely ${his} gigantic belly off the floor, it takes a considerable amount of effort to do so.`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, once helped to ${his} feet, ${he} is still able to waddle along despite ${his} size.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires considerable assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`get to ${his} feet.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires considerable assistance to get in and out of it.`);
 							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+						} else {
+							r.push(`Dragging the mass along is becoming a challenge between its awkward size and sheer weight.`);
 						}
 					}
 				}
@@ -1098,69 +908,60 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is more belly than ${girl}. ${He} can barely keep ${his} massive belly from touching the floor.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (!market) {
+						r.push(`${He} requires assistance to move when ${he} must go somewhere.`);
+					}
+				} else if (slave.height >= 185) {
+					r.push(`but ${his} tall frame keeps ${his} massive belly off the ground.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
-				} else if (slave.height >= 185) {
-					r.push(`but ${his} tall frame keeps ${his} massive belly off the ground.`);
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is more belly than ${girl}. ${He} can barely keep ${his} massive belly from touching the floor.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
 					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
 				}
@@ -1186,69 +987,60 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} is more belly than ${girl}. ${He} can barely keep ${his} massive belly from touching the floor.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
+					if (!market) {
+						r.push(`${He} requires assistance to move when ${he} must go somewhere.`);
+					}
+				} else if (slave.height >= 185) {
+					r.push(`but ${his} tall frame keeps ${his} massive belly off the ground.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`get to ${his} feet.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+						} else {
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
-				} else if (slave.height >= 185) {
-					r.push(`but ${his} tall frame keeps ${his} massive belly off the ground.`);
 				} else if (slave.height < 150) {
 					r.push(`and ${he} is more belly than ${girl}. ${He} can barely keep ${his} massive belly from touching the floor.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
 					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
 						}
 					}
 				}
@@ -1268,55 +1060,91 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is massively pregnant, beyond any typical pregnancy,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} belly pins ${him} to the ground. ${His} toddlerish form is dwarfed by ${his} pregnancy, and try as ${he} might ${he} cannot even drag the oversized thing.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
+					r.push(`and ${his} belly pins ${him} to the ground.`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of still walking, despite ${his} toddlerish form being dwarfed by ${his} oversized pregnancy.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright, despite ${his} toddlerish form being dwarfed by ${his} oversized pregnancy.`);
+					} else {
+						r.push(`${His} toddlerish form is dwarfed by ${his} pregnancy, and try as ${he} might ${he} cannot even drag the oversized thing.`);
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`get to ${his} feet.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
-						}
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} can barely function with ${his} oversized belly.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of still walking, if barely.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright, if barely.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`${He} can barely even crawl with such a huge stomach bulging out from ${him}. It takes everything ${he} has to avoid being forced to drag ${himself} along.`);
 						}
 					}
 				} else if (slave.height >= 185) {
 					r.push(`but ${his} tall frame barely bears ${his} oversized, drum-taut belly.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} long limbs give ${him} an edge in crawling with such a large stomach, if it's any consolation.`);
+						}
+					}
 				} else if (slave.height < 150) {
 					r.push(`and ${he} can barely function with ${his} oversized belly.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`Crawling with such a mass extending from ${his} body is near impossible, so ${he} is forced to drag ${himself} on ${his} side should ${he} need to go somewhere.`);
+						}
+					}
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly without too much trouble.`);
 				} else {
 					r.push(`and ${he} can barely function with ${his} oversized belly.`);
+					if (canWalk(slave)) {
+						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's substantial weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${He} can barely even crawl with such a huge stomach bulging out from ${him}. It takes everything ${he} has to avoid being forced to drag ${himself} along.`);
+						}
+					}
 				}
 				if (slave.weight > 190) {
 					r.push(`${His} massively fat belly is stretched considerably; ${his} folds are nearly pulled flat from the strain. ${His} pregnancy is covered in a thick layer of fat, save for the bulging upper portion where ${his} fat is thinnest.`);
@@ -1352,45 +1180,36 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks massively pregnant, beyond any typical pregnancy,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} belly pins ${him} to the ground. ${His} toddlerish form is dwarfed by ${his} implant, and try as ${he} might ${he} cannot even drag the oversized thing.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
-							} else {
-								r.push(`stand up.`);
-							}
-						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
+					r.push(`and ${his} belly pins ${him} to the ground.`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of still walking, despite ${his} toddlerish form being dwarfed by ${his} oversized implant.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright, despite ${his} toddlerish form being dwarfed by ${his} oversized implant.`);
+					} else {
+						r.push(`${His} toddlerish form is dwarfed by ${his} implant, and try as ${he} might ${he} cannot even drag the oversized thing.`);
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`get to ${his} feet.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
-						}
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${he} can barely function with ${his} oversized belly.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of still walking, if barely.`);
+					} else if (canStand(slave)) {
+						r.push(`Impressively, ${he} is strong enough that, if helped to ${his} feet first, ${he} is capable of remaining upright, if barely.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							r.push(`${He} can barely even crawl with such a huge stomach bulging out from ${him}. It takes everything ${he} has to avoid being forced to drag ${himself} along.`);
 						}
 					}
 				} else if (slave.height >= 185) {
@@ -1419,44 +1238,36 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				r.push(`${He} is massively pregnant,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} giant belly is as big as ${he} is.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} can barely waddle with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`${He} can barely even crawl with such a huge stomach bulging out from ${him}. It takes everything ${he} has just to avoid being immobilized by it.`);
 						}
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} giant belly is nearly as big as ${he} is.`);
-					if (hasAnyNaturalLegs(slave)) {
-						r.push(`${He} requires assistance to`);
-						if (!hasBothLegs(slave)) {
-							if (!market) {
-								r.push(`stand up,`);
+					if (canWalk(slave)) {
+						r.push(`${He} can barely waddle with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
 							} else {
-								r.push(`stand up.`);
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
 							}
 						} else {
-							if (!market) {
-								r.push(`get to ${his} feet,`);
-							} else {
-								r.push(`get to ${his} feet.`);
-							}
-						}
-						if (!market) {
-							r.push(`and uses a wheeled stand to support ${his} pregnancy when ${he} must walk anywhere.`);
+							r.push(`${He} can barely crawl with such a huge stomach bulging out from ${him}, pushing into the ground.`);
 						}
 					}
 				} else if (slave.weight > 190) {
@@ -1500,22 +1311,36 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				r.push(`${He} looks full term with octuplets,`);
 				if (slave.physicalAge <= 3) {
 					r.push(`and ${his} giant belly is as big as ${he} is.`);
-					if (hasAnyLegs(slave)) {
-						r.push(`${He} requires assistance to get to ${his}`);
-						if (!market) {
-							r.push(`feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere`);
+					if (canWalk(slave)) {
+						r.push(`${He} can barely waddle with such an awkward bulge hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back heavily arched in an attempt to support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
 						} else {
-							r.push(`feet.`);
+							r.push(`${He} can barely crawl with such a huge stomach bulging out from ${him}, pushing into the ground.`);
 						}
 					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} giant belly is nearly as big as ${he} is.`);
-					if (hasAnyLegs(slave)) {
-						r.push(`${He} requires assistance to get to ${his}`);
-						if (!market) {
-							r.push(`feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
 						} else {
-							r.push(`feet.`);
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
 						}
 					}
 				} else if (slave.weight > 190) {
@@ -1542,9 +1367,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not too obvious. Only the firmness at its top gives away ${his} pregnancy.`);
 				} else if (slave.height >= 185) {
@@ -1583,9 +1438,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with septuplets,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not obvious. Only the firmness at ${his} belly's top and the weight in its sway give any hint that something's bulging it outwards.`);
 				} else if (slave.height >= 185) {
@@ -1610,9 +1495,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not too obvious. Only the firmness at its top gives away ${his} pregnancy.`);
 				} else if (slave.height >= 185) {
@@ -1649,9 +1564,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with sextuplets,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not obvious. Only the firmness at ${his} belly's top and the weight in its sway give any hint that something's bulging it outwards.`);
 				} else if (slave.height >= 185) {
@@ -1676,9 +1621,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not too obvious. Only the firmness at its top gives away ${his} pregnancy.`);
 				} else if (slave.height >= 185) {
@@ -1713,9 +1688,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with quintuplets,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not obvious. Only the firmness at ${his} belly's top and the weight in its sway give any hint that something's bulging it outwards.`);
 				} else if (slave.height >= 185) {
@@ -1740,9 +1745,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not too obvious. Only the firmness at its top gives away ${his} pregnancy.`);
 				} else if (slave.height >= 185) {
@@ -1775,9 +1810,39 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with quadruplets,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.weight > 190) {
 					r.push(`but ${he}'s so massively fat that it's not obvious. Only the firmness at ${his} belly's top and the weight in its sway give any hint that something's bulging it outwards.`);
 				} else if (slave.height >= 185) {
@@ -1802,7 +1867,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1835,7 +1915,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with triplets,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1862,7 +1957,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1893,7 +2003,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks full term with twins,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach pushes into the floor as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1920,7 +2045,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else if (slave.bellyPreg > 0) {
 				r.push(`${He} is enormously pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} womb making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach hangs heavily, navel tickling the floor, as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly lewdly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1949,7 +2089,22 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			} else {
 				r.push(`${He} looks hugely pregnant,`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} implant making ${him} resemble an over inflated blow-up doll.`);
+					if (canWalk(slave)) {
+						r.push(`${His} walk is more of an awkward waddle as ${he} struggles to handle the weight hanging from ${his} middle.`);
+					} else if (canStand(slave)) {
+						r.push(`${He} stands with ${his} back arched to better support ${his} stomach's weight.`);
+					} else if (canMove(slave)) {
+						if (slave.rules.mobility === "permissive") {
+							if (hasBothLegs(slave)) {
+								r.push(`${He} requires assistance to get to ${his} feet, and uses a wheeled stand to support ${his} middle when ${he} must walk anywhere.`);
+							} else {
+								r.push(`${He} uses a wheelchair when ${he} must go somewhere and requires assistance to get in and out of it.`);
+							}
+						} else {
+							r.push(`${His} stomach hangs heavily, navel tickling the floor, as ${he} crawls.`);
+						}
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} huge, drum-taut belly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 190) {
@@ -1975,7 +2130,12 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 			if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
 				r.push(`${His} middle is enormously distended with ${slave.inflationType},`);
 				if (slave.physicalAge <= 3) {
-					r.push(`and ${his} toddlerish body is absolutely filled by ${his} bloated innards. ${He} can barely move ${himself} and resembles an over inflated blow-up doll.`);
+					r.push(`and ${his} toddlerish body is absolutely filled by ${his} bloated innards.`);
+					if (canWalk(slave)) {
+						r.push(`${He} can barely waddle and resembles an over inflated blow-up doll.`);
+					} else {
+						r.push(`${He} greatly resembles an over inflated blow-up doll.`);
+					}
 				} else if (slave.physicalAge <= 12) {
 					r.push(`and ${his} massive, drum-taut belly dominates ${his} poor little frame.`);
 				} else if (slave.weight > 130) {
@@ -6392,7 +6552,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.belly >= 120000) {
 					if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
 						if (slave.boobs > 12000) {
-							r.push(`${slave.slaveName}'s giant ${slave.inflationType}-filled belly peaks out from between ${his} massive tits. ${He} finds it impossible to fasten ${his} trousers with ${his} stomach in the way.`);
+							r.push(`${slave.slaveName}'s giant ${slave.inflationType}-filled belly peeks out from between ${his} massive tits. ${He} finds it impossible to fasten ${his} trousers with ${his} stomach in the way.`);
 						} else if (slave.boobs > 4000) {
 							r.push(`${slave.slaveName}'s nurse outfit could be called conservative, if it could cover more than half of ${his} breasts; ${his} giant ${slave.inflationType}-filled belly hangs out from under them, bulging hugely from ${his} unfastened trousers.`);
 						} else {
@@ -6400,7 +6560,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else if (slave.bellyImplant > 0) {
 						if (slave.boobs > 12000) {
-							r.push(`${slave.slaveName}'s giant implant-filled belly peaks out from between ${his} massive tits. ${He} finds it impossible to fasten ${his} trousers with ${his} stomach in the way.`);
+							r.push(`${slave.slaveName}'s giant implant-filled belly peeks out from between ${his} massive tits. ${He} finds it impossible to fasten ${his} trousers with ${his} stomach in the way.`);
 						} else if (slave.boobs > 4000) {
 							r.push(`${slave.slaveName}'s nurse outfit could be called conservative, if it could cover more than half of ${his} breasts; ${his} giant implant-filled belly hangs out from under them, bulging hugely from ${his} unfastened trousers.`);
 						} else {
@@ -6408,7 +6568,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 						}
 					} else {
 						if (slave.boobs > 12000) {
-							r.push(`${slave.slaveName}'s giant pregnant belly peaks out from between ${his} massive tits. In addition, ${he}'s left ${his} trousers unfastened to give ${his} overfilled womb more room.`);
+							r.push(`${slave.slaveName}'s giant pregnant belly peeks out from between ${his} massive tits. In addition, ${he}'s left ${his} trousers unfastened to give ${his} overfilled womb more room.`);
 						} else if (slave.boobs > 4000) {
 							r.push(`${slave.slaveName}'s nurse outfit could be called conservative, if it could cover more than half of ${his} breasts; ${his} giant pregnant belly hangs out from under them, bulging from ${his} unfastened trousers.`);
 						} else {
@@ -6678,7 +6838,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					} else if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
 						r.push(`${slave.slaveName}'s mini dress barely clings to ${his} hugely swollen belly, leaving it looking much shorter than it really is.`);
 					} else if (slave.bellyImplant > 0) {
-						r.push(`${slave.slaveName}'s mini dress barely clings to ${his} huge implant-filled belly, leaving it looking much shorter than it really is.`);
+						r.push(`${slave.slaveName}'s mini dress barely clings to ${his} big implant-filled belly, leaving it looking much shorter than it really is.`);
 					} else {
 						r.push(`${slave.slaveName}'s mini dress tightly clings to ${his} big pregnant belly, leaving it looking much shorter than it really is.`);
 					}
@@ -11444,7 +11604,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					r.push(`${slave.slaveName}'s harem girl outfit sensually accentuates ${his} toned belly.`);
 				}
 				break;
-			case "a comfortable bodysuit":
+			case "a comfortable bodysuit": // WIP belly overhaul point
 				if (slave.belly >= 1000000) {
 					// WIP//
 				} else if (slave.belly >= 750000) {
@@ -11462,27 +11622,41 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.weight > 190) {
 					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} massively fat belly, displaying every fold, roll and motion in it.`);
 				} else if (slave.bellyPreg >= 10000 || (slave.bellyAccessory === "a huge empathy belly") || (slave.bellyAccessory === "a large empathy belly")) {
-					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} big pregnant belly, displaying ${his} popped`);
-					if (!["a huge empathy belly", "a large empathy belly"].includes(slave.bellyAccessory)) {
-						r.push(`navel and any movement ${his} babies make.`);
+					if (slave.bellyAccessory === "a large empathy belly" || slave.bellyAccessory === "a huge empathy belly") {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} big pregnant belly, displaying ${his} popped navel.`);
+					} else if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} hugely swollen belly, displaying ${his} bloated figure and every jiggle of ${his} full stomach.`);
+					} else if (slave.bellyImplant > 0) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} big implant-filled belly, prominently displaying ${his} popped navel.`);
 					} else {
-						r.push(`navel.`);
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} big pregnant belly, displaying ${his} popped navel and any movement ${his} babies make.`);
 					}
 				} else if (slave.weight > 160) {
 					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} hugely fat belly, displaying every fold, roll and motion in it.`);
 				} else if (slave.weight > 130) {
 					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} big fat belly, displaying every fold and roll in it.`);
-				} else if (slave.bellyPreg >= 5000 || (slave.bellyAccessory === "a medium empathy belly")) {
-					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} pregnant belly, displaying ${his} popped`);
-					if (!["a medium empathy belly"].includes(slave.bellyAccessory)) {
-						r.push(`navel and any movement ${his} babies make.`);
+				} else if (slave.belly >= 5000 || (slave.bellyAccessory === "a medium empathy belly")) {
+					if (slave.bellyAccessory === "a medium empathy belly") {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} pregnant belly, displaying ${his} popped navel.`);
+					} else if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} jiggling ${slave.inflationType}-filled belly, displaying ${his} bloating and every motion ${his} contents make.`);
+					} else if (slave.bellyImplant > 0) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} implant-filled belly, prominently displaying ${his} flattening navel.`);
 					} else {
-						r.push(`navel.`);
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} pregnant belly, displaying ${his} flattening navel and any movement ${his} babies make.`);
 					}
 				} else if (slave.weight > 95) {
 					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} fat belly, displaying every fold and roll in it.`);
-				} else if (((slave.bellyPreg >= 1500) || (slave.bellyAccessory === "a small empathy belly"))) {
-					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} growing belly, displaying ${his} ripening body.`);
+				} else if (slave.belly >= 1500 || slave.bellyAccessory === "a small empathy belly") {
+					if (slave.bellyAccessory === "a small empathy belly") {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} small pregnant belly, displaying ${his} ripening body.`);
+					} else if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} ${slave.inflationType}-swollen belly, displaying ${his} bloated body.`);
+					} else if (slave.bellyImplant > 0) {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} implant-rounded belly, displaying ${his} swollen body.`);
+					} else {
+						r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} growing belly, displaying ${his} ripening body.`);
+					}
 				} else if (slave.weight > 30) {
 					r.push(`${slave.slaveName}'s bodysuit tightly clings to ${his} chubby belly, displaying every fold and roll in it.`);
 				}
@@ -11520,8 +11694,16 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					r.push(`${slave.slaveName}'s jacket barely closes over ${his} pregnant belly leaving its buttons threatening to pop.`);
 				} else if (slave.weight > 95) {
 					r.push(`${slave.slaveName}'s jacket barely closes over ${his} fat belly forcing plenty of flab out from under its bottom and between the straining buttons.`);
-				} else if (((slave.bellyPreg >= 1500) || (slave.bellyAccessory === "a small empathy belly"))) {
-					r.push(`${slave.slaveName}'s jacket bulges with ${his} growing belly, which can be seen peeking out from underneath.`);
+				} else if (slave.belly >= 1500 || slave.bellyAccessory === "a small empathy belly") {
+					if (slave.bellyAccessory === "a small empathy belly") {
+						r.push(`${slave.slaveName}'s jacket bulges with ${his} small pregnant belly, which can be seen peeking out from underneath.`);
+					} else if (slave.bellyFluid >= slave.bellyPreg && slave.bellyFluid >= slave.bellyImplant) {
+						r.push(`${slave.slaveName}'s mini dress tightly clings to ${his} ${slave.inflationType}-swollen belly.`);
+					} else if (slave.bellyImplant > 0) {
+						r.push(`${slave.slaveName}'s mini dress tightly clings to ${his} implant-rounded belly.`);
+					} else {
+						r.push(`${slave.slaveName}'s jacket bulges with ${his} growing belly, which can be seen peeking out from underneath.`);
+					}
 				} else if (slave.weight > 30) {
 					r.push(`${slave.slaveName}'s jacket bulges with ${his} chubby belly, which can be seen peeking out from underneath as it hangs over ${his} waist of ${his} pants.`);
 				}
@@ -12643,22 +12825,40 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 					}
 				}
 				if (heavyBelly === 1) {
-					if (canWalk(slave)) {
+					if (canMove(slave)) {
 						r.push(`${His}`);
 						if (slave.bellyPreg >= 3000) {
 							r.push(`pregnancy`);
 						} else {
 							r.push(`stomach`);
 						}
-						r.push(`is so massive that it is difficult for ${him} to move.`);
+						r.push(`is so massive that it is difficult for ${him} to function.`);
 						if (slave.muscles > 95) {
-							r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, using ${his} arms to support it.`);
+							r.push(`However, ${he} is so powerfully built that ${he} can manage it with effort, using ${his}`);
+							if (hasBothArms(slave)) {
+								r.push(`arms`);
+							} else if (hasAnyArms(slave)) {
+								r.push(`arm`);
+							} else {
+								r.push(`rippling back muscles`);
+							}
+							r.push(`to support it during day to day affairs.`);
 						} else if (slave.muscles > 30) {
-							r.push(`${He} can barely manage to get to ${his} feet unaided, and usually walks with ${his} arms under ${his} belly to help take its weight.`);
+							r.push(`${He} can barely manage to perform daily tasks, and usually moves`);
+							if (hasAnyArms(slave)) {
+								if (hasBothArms(slave)) {
+									r.push(`with ${his} arms under ${his} belly`);
+								} else {
+									r.push(`with ${his} arm under ${his} belly`);
+								}
+								r.push(`to help with its weight.`);
+							} else {
+								r.push(`hunched over due to the weight of ${his} belly.`);
+							}
 						} 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.`);
+							r.push(`${He} requires assistance to do things, and tends to lean on things to help relieve the weight.`);
 						} else {
-							r.push(`${He} cannot get to ${his} feet unaided, and tries to stay seated as much as ${he} can.`);
+							r.push(`${He} requires frequent assistance, and tries to stay seated as much as ${he} can.`);
 						}
 					} else if (slave.belly >= 750000) {
 						r.push(`It dwarfs ${his} torso, making ${him} a vestigial accessory to ${his} belly.`);
diff --git a/src/npc/descriptions/boobs/boobs.js b/src/npc/descriptions/boobs/boobs.js
index 9de9fdcfc75013a7953d16416ca18b01268f3d2d..63bab1973489cec437094ac516ed076d1dc32444 100644
--- a/src/npc/descriptions/boobs/boobs.js
+++ b/src/npc/descriptions/boobs/boobs.js
@@ -260,9 +260,7 @@ App.Desc.boobs = function() {
 		const noun = App.Desc.boobBits.noun(slave.boobs, false, false);
 		const adjNoun = App.Desc.boobBits.noun(slave.boobs, false, true);
 		let r = '';
-		const {he, his, him,
-			He, His,
-			girl} = getPronouns(slave);
+		const {he, his, him, His, girl} = getPronouns(slave);
 
 		switch (slave.clothes) {
 			case "a Fuckdoll suit":
@@ -1315,7 +1313,7 @@ App.Desc.boobs = function() {
 	 * @returns {string}
 	 */
 	function detailedInspection(slave) {
-		const {he, his, him, He, His, girl} = getPronouns(slave);
+		const {he, his, him, He, His, himself} = getPronouns(slave);
 		function musclesTone(slave) {
 			return slave.muscles > 95 ? 'shredded' : slave.muscles > 30 ? 'rippling' : 'toned';
 		}
@@ -1424,7 +1422,7 @@ App.Desc.boobs = function() {
  */
 App.Desc.boobsExtra = function(slave, {market, eventDescription} = {}) {
 	const thisArcology = V.arcologies[0];
-	const {he, his, him, He, His, girl} = getPronouns(slave);
+	const {he, his, him, He, His, girl, himself} = getPronouns(slave);
 
 	function penthouseAccessibility() {
 		let rt = '';
@@ -1474,11 +1472,21 @@ App.Desc.boobsExtra = function(slave, {market, eventDescription} = {}) {
 				r += `hunched over due to the weight of ${his} tits.`;
 			}
 		} else if (slave.muscles > 5) {
-			r += `${He} requires assistance to get to ${his} feet, and uses a stand to support them when ${he} must remain upright for more than a short time.`;
+			r += `${He} requires assistance to get to ${his} feet, and`;
+			if (slave.rules.mobility === "permissive") {
+				r += ` uses a stand to support them when ${he} must remain upright for more than a short time.`;
+			} else {
+				r += ` has to make use of walls and objects to support ${himself} or risk falling under their weight.`;
+			}
 		} else if ((slave.assignment === App.Data.Facilities.dairy.jobs.cow.assignment) && (V.dairyRestraintsSetting > 1) && (dairyTest(slave))) {
 			r += `The straps that secure ${him} to the milking machine have become less necessary since ${his} breasts grew to the point where they pin ${him} to it.`;
 		} else {
-			r += `${He} cannot get to ${his} feet unaided, and uses a wheeled stand to support ${his} boobs when ${he} must walk or remain upright.`;
+			r += `${He} cannot get to ${his} feet unaided, and`;
+			if (slave.rules.mobility === "permissive") {
+				r += ` uses a wheeled stand to support ${his} boobs when ${he} must walk or remain upright.`;
+			} else {
+				r += ` has to make use of walls and objects to support ${himself} and remain upright.`;
+			}
 		}
 		return r;
 	}
diff --git a/src/npc/descriptions/describePiercings.js b/src/npc/descriptions/describePiercings.js
index d1a66a8ea26f15ca4d9b21a0ae750eb6a975a17c..0c8f026cd6f98a48a0bbeee6a192bbaf9e29f651 100644
--- a/src/npc/descriptions/describePiercings.js
+++ b/src/npc/descriptions/describePiercings.js
@@ -803,8 +803,10 @@ App.Desc.piercing = function(slave, surface) {
 									if (slave.devotion > 20) {
 										if (slave.energy > 90) {
 											r.push(`${His} very special body allows ${him} to wear an incredibly lewd piece of jewelry: a thin golden chain that runs from nipple to nipple, through ${his} pierced cockhead. The chain is short, and any motion at all tugs at ${his} nipples and penis.`);
-											 if (canWalk(slave)) {
+											 if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive" && hasBothLegs(slave))) {
 												r.push(`The stimulation is almost unbearable, and the mere act of walking sometimes causes ${him} to cum.`);
+											} else if (canMove(slave)) {
+												r.push(`The stimulation is almost unbearable, as any effort to move ${himself} starts building up an orgasm.`);
 											}
 										}
 									}
diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js
index 0b0a67fd0dd013f9cded7abdc6b894b0b0e0abc1..291c36663b334ffc807481027440efa09d948fdf 100644
--- a/src/npc/descriptions/descriptionWidgets.js
+++ b/src/npc/descriptions/descriptionWidgets.js
@@ -575,143 +575,144 @@ App.Desc.ageAndHealth = function(slave) {
 					r += `ancient by any measure, over a century old. `;
 				}
 			}
-			if (slave.actualAge !== slave.physicalAge) {
-				r += ` However, ${he} has the body of a ${num(slave.physicalAge)}-year-old; `;
-				if (slave.physicalAge < 18 && slave.actualAge >= 18) {
-					r += `a stark contrast given ${his} maturity. `;
-				} else if (slave.physicalAge < 18 && slave.actualAge < 18) {
-					r += `a noticeable difference thanks to ${his} immaturity. `;
-				} else if (slave.physicalAge <= slave.actualAge - 20 || slave.physicalAge >= slave.actualAge + 20) {
-					r += `a shocking difference from ${his} actual age. `;
-				} else if (slave.physicalAge <= slave.actualAge - 10 || slave.physicalAge >= slave.actualAge + 10) {
-					r += `a noticeable difference from ${his} actual age. `;
-				} else if (slave.physicalAge <= slave.actualAge - 5 || slave.physicalAge >= slave.actualAge + 5) {
-					r += `a barely noticeable difference from ${his} actual age. `;
+		}
+		
+		if (slave.actualAge !== slave.physicalAge) {
+			r += ` However, ${he} has the body of a ${num(slave.physicalAge)}-year-old; `;
+			if (slave.physicalAge < 18 && slave.actualAge >= 18) {
+				r += `a stark contrast given ${his} maturity. `;
+			} else if (slave.physicalAge >= 18 && slave.actualAge < 18) {
+				r += `a noticeable difference thanks to ${his} immaturity. `;
+			} else if (slave.physicalAge <= slave.actualAge - 20 || slave.physicalAge >= slave.actualAge + 20) {
+				r += `a shocking difference from ${his} actual age. `;
+			} else if (slave.physicalAge <= slave.actualAge - 10 || slave.physicalAge >= slave.actualAge + 10) {
+				r += `a noticeable difference from ${his} actual age. `;
+			} else if (slave.physicalAge <= slave.actualAge - 5 || slave.physicalAge >= slave.actualAge + 5) {
+				r += `a barely noticeable difference from ${his} actual age. `;
+			} else {
+				r += `though it is hard to tell the difference from ${his} actual age. `;
+			}
+		}
+		/*
+		 ** This section replaces the age/therapy texts, giving more details for the NCS condition.
+		 */
+		if (slave.geneMods.NCS) {
+			let bodyNCS;
+			if (slave.vagina < 0 && slave.dick <= 0) {
+				bodyNCS = "childlike";
+			} else if (slave.vagina < 0 && slave.dick > 0) {
+				bodyNCS = "shota";
+			} else if (slave.vagina > 0 && slave.dick <= 0) {
+				bodyNCS = "loli";
+			} else {
+				bodyNCS = "loli/shota";
+			}
+			r += ` ${He} appears to be ${slave.visualAge} years old and ${he} `;
+			if (slave.visualAge <= 8) {
+				r += `has induced <span class="orange">NCS</span> and will always have a ${bodyNCS} body, no matter how long ${he} lives. `;
+			} else if (slave.visualAge < 13) {
+				r += `has induced <span class="orange">NCS</span> and will have a ${bodyNCS} body for the rest of ${his} life. `;
+			} else if (slave.visualAge < 20) {
+				r += `still has a teen body for now, but with ${his} <span class="orange">NCS,</span> ${he} will eventually regress in age to look like a little ${boy} again. `;
+			} else {
+				r += `still has the body of an adult, but ${his} <span class="orange">NCS</span> has `;
+				if (slave.physicalAge - slave.visualAge <= 5) {
+					r += `not really begun to youthen ${his} appearance yet. `;
+				} else if (slave.physicalAge - slave.visualAge <= 10) {
+					r += `clearly been at work on ${him}, making ${him} appear younger. `;
+				} else if (slave.physicalAge - slave.visualAge <= 20) {
+					r += `obviously helped take more than a decade off of ${his} age. `;
 				} else {
-					r += `though it is hard to tell the difference from ${his} actual age. `;
+					r += `intensely youthened ${him}. `;
 				}
 			}
-			/*
-			 ** This section replaces the age/therapy texts, giving more details for the NCS condition.
-			 */
-			if (slave.geneMods.NCS) {
-				let bodyNCS;
-				if (slave.vagina < 0 && slave.dick <= 0) {
-					bodyNCS = "childlike";
-				} else if (slave.vagina < 0 && slave.dick > 0) {
-					bodyNCS = "shota";
-				} else if (slave.vagina > 0 && slave.dick <= 0) {
-					bodyNCS = "loli";
-				} else {
-					bodyNCS = "loli/shota";
-				}
-				r += ` ${He} appears to be ${slave.visualAge} years old and ${he} `;
-				if (slave.visualAge <= 8) {
-					r += `has induced <span class="orange">NCS</span> and will always have a ${bodyNCS} body, no matter how long ${he} lives. `;
-				} else if (slave.visualAge < 13) {
-					r += `has induced <span class="orange">NCS</span> and will have a ${bodyNCS} body for the rest of ${his} life. `;
+		} else if (slave.physicalAge !== slave.visualAge) {
+			if (slave.visualAge <= slave.physicalAge - 20 || slave.visualAge >= slave.physicalAge + 20) {
+				r += ` ${He} has undergone radical age therapy that makes ${him} look `;
+			} else if (slave.visualAge <= slave.physicalAge - 10 || slave.visualAge >= slave.physicalAge + 10) {
+				r += ` ${He} has undergone drastic age therapy that makes ${him} look `;
+			} else if (slave.visualAge <= slave.physicalAge - 5 || slave.visualAge >= slave.physicalAge + 5) {
+				r += ` ${He} has undergone noticeable age therapy that makes ${him} look `;
+			} else {
+				r += ` For various reasons, ${he} looks `;
+			}
+			if (slave.physicalAge > slave.visualAge) {
+				if (slave.physicalAge < slave.visualAge + 5) {
+					r += `a slightly younger ${slave.visualAge}. `;
 				} else if (slave.visualAge < 20) {
-					r += `still has a teen body for now, but with ${his} <span class="orange">NCS,</span> ${he} will eventually regress in age to look like a little ${boy} again. `;
-				} else {
-					r += `still has the body of an adult, but ${his} <span class="orange">NCS</span> has `;
-					if (slave.physicalAge - slave.visualAge <= 5) {
-						r += `not really begun to youthen ${his} appearance yet. `;
-					} else if (slave.physicalAge - slave.visualAge <= 10) {
-						r += `clearly been at work on ${him}, making ${him} appear younger. `;
-					} else if (slave.physicalAge - slave.visualAge <= 20) {
-						r += `obviously helped take more than a decade off of ${his} age. `;
-					} else {
-						r += `intensely youthened ${him}. `;
-					}
-				}
-			} else if (slave.physicalAge !== slave.visualAge) {
-				if (slave.visualAge <= slave.physicalAge - 20 || slave.visualAge >= slave.physicalAge + 20) {
-					r += ` ${He} has undergone radical age therapy that makes ${him} look `;
-				} else if (slave.visualAge <= slave.physicalAge - 10 || slave.visualAge >= slave.physicalAge + 10) {
-					r += ` ${He} has undergone drastic age therapy that makes ${him} look `;
-				} else if (slave.visualAge <= slave.physicalAge - 5 || slave.visualAge >= slave.physicalAge + 5) {
-					r += ` ${He} has undergone noticeable age therapy that makes ${him} look `;
+					r += `like ${he}'s barely an adult. `;
+				} else if (slave.visualAge < 25) {
+					r += `barely into ${his} early twenties. `;
+				} else if (slave.visualAge < 30) {
+					r += `like ${he}'s still in ${his} twenties. `;
+				} else if (slave.visualAge < 35) {
+					r += `barely thirty. `;
+				} else if (slave.visualAge < 40) {
+					r += `still in ${his} thirties. `;
+				} else if (slave.visualAge < 45) {
+					r += `barely forty. `;
+				} else if (slave.visualAge < 50) {
+					r += `still in ${his} forties. `;
+				} else if (slave.visualAge < 55) {
+					r += `barely fifty. `;
+				} else if (slave.visualAge < 60) {
+					r += `still in ${his} fifties. `;
+				} else if (slave.visualAge < 65) {
+					r += `barely sixty. `;
+				} else if (slave.visualAge < 70) {
+					r += `still in ${his} sixties. `;
+				} else if (slave.visualAge < 75) {
+					r += `barely seventy. `;
+				} else if (slave.visualAge < 80) {
+					r += `still in ${his} seventies. `;
+				} else if (slave.visualAge < 85) {
+					r += `barely eighty. `;
+				} else if (slave.visualAge < 90) {
+					r += `still in ${his} eighties. `;
+				} else if (slave.visualAge < 95) {
+					r += `barely ninety. `;
+				} else if (slave.visualAge < 100) {
+					r += `still in ${his} nineties. `;
 				} else {
-					r += ` For various reasons, ${he} looks `;
+					r += `a younger ${slave.visualAge}. `;
 				}
-				if (slave.physicalAge > slave.visualAge) {
-					if (slave.physicalAge < slave.visualAge + 5) {
-						r += `a slightly younger ${slave.visualAge}. `;
-					} else if (slave.visualAge < 20) {
-						r += `like ${he}'s barely an adult. `;
-					} else if (slave.visualAge < 25) {
-						r += `barely into ${his} early twenties. `;
-					} else if (slave.visualAge < 30) {
-						r += `like ${he}'s still in ${his} twenties. `;
-					} else if (slave.visualAge < 35) {
-						r += `barely thirty. `;
-					} else if (slave.visualAge < 40) {
-						r += `still in ${his} thirties. `;
-					} else if (slave.visualAge < 45) {
-						r += `barely forty. `;
-					} else if (slave.visualAge < 50) {
-						r += `still in ${his} forties. `;
-					} else if (slave.visualAge < 55) {
-						r += `barely fifty. `;
-					} else if (slave.visualAge < 60) {
-						r += `still in ${his} fifties. `;
-					} else if (slave.visualAge < 65) {
-						r += `barely sixty. `;
-					} else if (slave.visualAge < 70) {
-						r += `still in ${his} sixties. `;
-					} else if (slave.visualAge < 75) {
-						r += `barely seventy. `;
-					} else if (slave.visualAge < 80) {
-						r += `still in ${his} seventies. `;
-					} else if (slave.visualAge < 85) {
-						r += `barely eighty. `;
-					} else if (slave.visualAge < 90) {
-						r += `still in ${his} eighties. `;
-					} else if (slave.visualAge < 95) {
-						r += `barely ninety. `;
-					} else if (slave.visualAge < 100) {
-						r += `still in ${his} nineties. `;
-					} else {
-						r += `a younger ${slave.visualAge}. `;
-					}
+			} else {
+				if (slave.physicalAge > slave.visualAge - 5) {
+					r += `a slightly older ${slave.visualAge}. `;
+				} else if (slave.visualAge < 20) {
+					r += `like a fresh adult. `;
+				} else if (slave.visualAge < 25) {
+					r += `just over twenty. `;
+				} else if (slave.visualAge < 30) {
+					r += `nearly thirty. `;
+				} else if (slave.visualAge < 35) {
+					r += `just over thirty. `;
+				} else if (slave.visualAge < 40) {
+					r += `nearly forty. `;
+				} else if (slave.visualAge < 45) {
+					r += `just over forty. `;
+				} else if (slave.visualAge < 50) {
+					r += `nearly fifty. `;
+				} else if (slave.visualAge < 55) {
+					r += `just over fifty. `;
+				} else if (slave.visualAge < 60) {
+					r += `nearly sixty. `;
+				} else if (slave.visualAge < 65) {
+					r += `just over sixty. `;
+				} else if (slave.visualAge < 70) {
+					r += `nearly seventy. `;
+				} else if (slave.visualAge < 75) {
+					r += `just over seventy. `;
+				} else if (slave.visualAge < 80) {
+					r += `nearly eighty. `;
+				} else if (slave.visualAge < 85) {
+					r += `just over eighty. `;
+				} else if (slave.visualAge < 90) {
+					r += `nearly ninety. `;
+				} else if (slave.visualAge < 95) {
+					r += `just over ninety. `;
 				} else {
-					if (slave.physicalAge > slave.visualAge - 5) {
-						r += `a slightly older ${slave.visualAge}. `;
-					} else if (slave.visualAge < 20) {
-						r += `like a fresh adult. `;
-					} else if (slave.visualAge < 25) {
-						r += `just over twenty. `;
-					} else if (slave.visualAge < 30) {
-						r += `nearly thirty. `;
-					} else if (slave.visualAge < 35) {
-						r += `just over thirty. `;
-					} else if (slave.visualAge < 40) {
-						r += `nearly forty. `;
-					} else if (slave.visualAge < 45) {
-						r += `just over forty. `;
-					} else if (slave.visualAge < 50) {
-						r += `nearly fifty. `;
-					} else if (slave.visualAge < 55) {
-						r += `just over fifty. `;
-					} else if (slave.visualAge < 60) {
-						r += `nearly sixty. `;
-					} else if (slave.visualAge < 65) {
-						r += `just over sixty. `;
-					} else if (slave.visualAge < 70) {
-						r += `nearly seventy. `;
-					} else if (slave.visualAge < 75) {
-						r += `just over seventy. `;
-					} else if (slave.visualAge < 80) {
-						r += `nearly eighty. `;
-					} else if (slave.visualAge < 85) {
-						r += `just over eighty. `;
-					} else if (slave.visualAge < 90) {
-						r += `nearly ninety. `;
-					} else if (slave.visualAge < 95) {
-						r += `just over ninety. `;
-					} else {
-						r += `an ancient ${slave.visualAge}. `;
-					}
+					r += `an ancient ${slave.visualAge}. `;
 				}
 			}
 		}
@@ -1083,8 +1084,10 @@ App.Desc.shortLimbs = function(slave) {
 	}
 
 	r += " ";
-	if (!canWalk(slave)) {
+	if (!canMove(slave)) {
 		r += " Immob ";
+	} else if (!canWalk(slave)) {
+		r += " Hindered ";
 	}
 	if (slave.heels === 1) {
 		r += " Heel ";
@@ -1196,8 +1199,10 @@ App.Desc.longLimbs = function(slave) {
 		}
 	}
 
-	if (!canWalk(slave)) {
+	if (!canMove(slave)) {
 		r += "Immobile. ";
+	} else if (!canWalk(slave)) {
+		r += "Hindered. ";
 	}
 	if (slave.heels === 1) {
 		r += "Heeled. ";
diff --git a/src/npc/descriptions/style/clothingCorset.js b/src/npc/descriptions/style/clothingCorset.js
index 421c149eac37568b484cb6eef6b3ae17058522d4..30165f13965de46c8959c67bd2be8dd4109316fe 100644
--- a/src/npc/descriptions/style/clothingCorset.js
+++ b/src/npc/descriptions/style/clothingCorset.js
@@ -312,20 +312,20 @@ App.Desc.clothingCorset = function(slave) {
 			break;
 		case "a monokini":
 			if (slave.bellyAccessory === "a corset") {
-				r.push(`A corset peaks out from the top of the swimsuit.`);
+				r.push(`A corset peeks out from the top of the swimsuit.`);
 			} else if (slave.bellyAccessory === "an extreme corset") {
-				r.push(`An extreme corset peaks out from the top of the swimsuit.`);
+				r.push(`An extreme corset peeks out from the top of the swimsuit.`);
 			} else if (slave.bellyAccessory === "a support band") {
-				r.push(`${His} support band peaks out from the top of the swimsuit.`);
+				r.push(`${His} support band peeks out from the top of the swimsuit.`);
 			}
 			break;
 		case "overalls":
 			if (slave.bellyAccessory === "a corset") {
-				r.push(`A corset peaks out from the top of the overalls.`);
+				r.push(`A corset peeks out from the top of the overalls.`);
 			} else if (slave.bellyAccessory === "an extreme corset") {
-				r.push(`An extreme corset peaks out from the top of the overalls.`);
+				r.push(`An extreme corset peeks out from the top of the overalls.`);
 			} else if (slave.bellyAccessory === "a support band") {
-				r.push(`${His} support band peaks out from the top of the overalls.`);
+				r.push(`${His} support band peeks out from the top of the overalls.`);
 			}
 			break;
 		case "an apron":
diff --git a/src/npc/generate/generateGenetics.js b/src/npc/generate/generateGenetics.js
index 431f2c1aac1cc0e9f49dc93f1a293f5f57910a68..8e119e198680560dd547a20b25a3da46e4c205ec 100644
--- a/src/npc/generate/generateGenetics.js
+++ b/src/npc/generate/generateGenetics.js
@@ -97,12 +97,13 @@ globalThis.generateGenetics = (function() {
 		genes.motherName = setMotherName(activeMother);
 		genes.father = setFatherID(actor2);
 		genes.fatherName = setFatherName(father, activeFather, actor2);
+		genes.inbreedingCoeff = ibc.kinship(mother, father);
 		genes.nationality = setNationality(father, mother);
 		genes.geneticQuirks = setGeneticQuirks(activeFather, activeMother, genes.gender);
 		genes.skin = setSkin(father, mother, actor2);
 		genes.race = setRace(father, mother, actor2);
-		genes.intelligence = setIntelligence(father, mother, activeMother, actor2);
-		genes.face = setFace(father, mother, activeMother, actor2, genes.geneticQuirks);
+		genes.intelligence = setIntelligence(father, mother, activeMother, actor2, genes.inbreedingCoeff);
+		genes.face = setFace(father, mother, activeMother, actor2, genes.geneticQuirks, genes.inbreedingCoeff);
 		genes.faceShape = setFaceShape(father, mother, genes.geneticQuirks);
 		genes.eyeColor = setEyeColor(father, mother, actor2);
 		if (genes.geneticQuirks.heterochromia === 2) {
@@ -592,7 +593,7 @@ globalThis.generateGenetics = (function() {
 	}
 
 	// intelligence
-	function setIntelligence(father, mother, activeMother, actor2) {
+	function setIntelligence(father, mother, activeMother, actor2, inbreedingCoeff) {
 		let smarts;
 		if (mother.ID === -1) {
 			if (actor2 === -6) {
@@ -616,29 +617,15 @@ globalThis.generateGenetics = (function() {
 			smarts = mother.intelligence;
 		}
 		if (V.inbreeding === 1) {
-			if (mother.ID !== -1) {
-				if (father !== 0 && father.ID === -1 && activeMother.breedingMark !== 1) {
-					if (smarts >= -95 && jsRandom(1, 100) < 40) {
-						smarts -= jsRandom(1, 10);
-						if (smarts >= -95 && jsRandom(1, 100) < 20) {
-							smarts -= jsRandom(1, 5);
-						}
-					}
-				} else {
-					if (smarts >= -95 && jsRandom(1, 100) < 50) {
-						smarts -= jsRandom(1, 15);
-						if (smarts >= -95 && jsRandom(1, 100) < 30) {
-							smarts -= jsRandom(1, 15);
-						}
-					}
-				}
+			if (jsRandom(1, 100) < inbreedingCoeff*200) {
+				smarts -= Math.abs(normalRandInt(5*inbreedingCoeff, 30*inbreedingCoeff, -100*inbreedingCoeff, 100*inbreedingCoeff));
 			}
 		}
 		return Math.clamp(smarts, -100, 100);
 	}
 
 	// face
-	function setFace(father, mother, activeMother, actor2, genes) {
+	function setFace(father, mother, activeMother, actor2, genes, inbreedingCoeff) {
 		let face;
 		if (genes.pFace > 0 && genes.uFace > 0) {
 			face = 0;
@@ -668,19 +655,8 @@ globalThis.generateGenetics = (function() {
 			face = mother.face;
 		}
 		if (V.inbreeding === 1 && genes.pFace === 0 && genes.uFace === 0) {
-			if (mother.ID !== -1) {
-				if (father !== 0 && father.ID === -1 && activeMother.breedingMark !== 1) {
-					if (face > -100 && jsRandom(1, 100) > 60) {
-						face -= jsRandom(2, 20);
-					}
-				} else {
-					if (face > -100 && jsRandom(1, 100) < 50) {
-						face -= jsRandom(1, 15);
-						if (face >= -95 && jsRandom(1, 100) < 30) {
-							face -= jsRandom(5, 20);
-						}
-					}
-				}
+			if (jsRandom(1, 100) < inbreedingCoeff*200) {
+				face -= Math.abs(normalRandInt(5*inbreedingCoeff, 35*inbreedingCoeff, -100*inbreedingCoeff, 100*inbreedingCoeff));
 			}
 		}
 		return Math.clamp(face, -100, 100);
@@ -1367,6 +1343,8 @@ globalThis.generateChild = function (mother, ovum, incubator=false) {
 		child.navelPiercing = 0;
 	}
 
+	child.inbreedingCoeff = genes.inbreedingCoeff;
+
 	generatePronouns(child);
 
 	return child;
diff --git a/src/npc/interaction/FSuckle.tw b/src/npc/interaction/FSuckle.tw
index 4a2a5eb7eb129d2db6d19cb3ea8ee583230cb2b9..a145d6c893f5e8a7b6e81d2fd4b2b16de2c7cd7c 100644
--- a/src/npc/interaction/FSuckle.tw
+++ b/src/npc/interaction/FSuckle.tw
@@ -35,7 +35,7 @@ You <<if _mood == 2>>demand<<else>>beckon<</if>> <<= getSlave($AS).slaveName>> t
 	to take a seat on the floor close to you.
 <</if>>
 
-<<if canWalk(getSlave($AS))>>
+<<if canMove(getSlave($AS))>>
 	<<if getSlave($AS).fetish == "mindbroken">>
 		$He complies without a thought.
 	<<elseif getSlave($AS).devotion > 20 && getSlave($AS).trust > 20>>
diff --git a/src/npc/interaction/fAnus.tw b/src/npc/interaction/fAnus.tw
index 2218ff43a6ea48b24d9451d0f88897eb20ec9c4a..a22547fa64668fd0f90be640855620a0e6a11314 100644
--- a/src/npc/interaction/fAnus.tw
+++ b/src/npc/interaction/fAnus.tw
@@ -196,7 +196,7 @@ You call $him over so you can
 	<</if>>
 
 	<<if $postSexCleanUp > 0>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canMove(getSlave($AS))>>
 			<<if getSlave($AS).anus < 2>>
 				<<set _Anus = "tight butt">>
 			<<elseif getSlave($AS).anus < 3>>
diff --git a/src/npc/interaction/fBellyFuck.tw b/src/npc/interaction/fBellyFuck.tw
index bb2c5857ae12c972aa1dfdc0435fb2d6295a8f7e..ee82cebde746b0d9c6ae5bd3f89368e2a2f26f67 100644
--- a/src/npc/interaction/fBellyFuck.tw
+++ b/src/npc/interaction/fBellyFuck.tw
@@ -28,7 +28,7 @@ You have $him brought to you so that you can fuck $his hyperpregnant body.
 		massive belly.
 	<</if>>
 	$He won't be a particularly able lover, but enjoying $his immobility is half the point.
-<<elseif !canWalk(getSlave($AS))>>
+<<elseif !canStand(getSlave($AS))>>
 	$He can't support $himself, so $he is left leaning against $his
 	<<if getSlave($AS).bellyPreg >= 1000000>>
 		impossibly exploded baby bump.
diff --git a/src/npc/interaction/fButt.tw b/src/npc/interaction/fButt.tw
index 99d02192b0a64675463bcfc2b8e4c63fa1e37850..72ca222ef02c34e6c63a3402733d4f910597d74f 100644
--- a/src/npc/interaction/fButt.tw
+++ b/src/npc/interaction/fButt.tw
@@ -206,7 +206,7 @@ You call $him over so you can
 	$His still-tight ass keeps your load inside $him.
 <</if>>
 
-<<if canWalk(getSlave($AS)) && $postSexCleanUp > 0>>
+<<if canMove(getSlave($AS)) && $postSexCleanUp > 0>>
 <<switch getSlave($AS).assignment>>
 <<case "whore">>
 	$He heads to the bathroom to clean $his <<if canDoVaginal(getSlave($AS)) && canDoAnal(getSlave($AS))>>holes before returning to selling them publicly.<<elseif canDoVaginal(getSlave($AS)) || canDoAnal(getSlave($AS))>>fuckhole before returning to selling it publicly.<<else>>face before returning to selling $his mouth publicly.<</if>>
diff --git a/src/npc/interaction/fDick.tw b/src/npc/interaction/fDick.tw
index 4463b3e59ad556f1d0ebb1555167dc48feca9985..9842daff7b691e7d6523f7fa8e84ce4c7a4bc716 100644
--- a/src/npc/interaction/fDick.tw
+++ b/src/npc/interaction/fDick.tw
@@ -217,7 +217,7 @@
 	<</if>>
 <</if>>
 
-<<if canWalk(getSlave($AS)) && getSlave($AS).fetish != "mindbroken" && $postSexCleanUp > 0>>
+<<if canMove(getSlave($AS)) && getSlave($AS).fetish != "mindbroken" && $postSexCleanUp > 0>>
 	<<switch getSlave($AS).assignment>>
 	<<case "whore">>
 		$He heads to the bathroom to clean $his dick before returning to selling $his body publicly.
@@ -248,7 +248,7 @@
 	<<case "work as a servant">>
 		$He rushes to wash $his dick, impatient to get back to $his undiminished chores.
 	<<case "work as a nanny">>
-		$He runs off to wash off $his dick before heading back to the $nurseryName.
+		$He hurries off to wash off $his dick before heading back to the $nurseryName.
 	<</switch>>
 <</if>>
 
diff --git a/src/npc/interaction/fKiss.tw b/src/npc/interaction/fKiss.tw
index c708b599c0b01f490dd1c1a72b12203340a52d19..0cd7acad44532fea6b209e12eaafb8192af83302 100644
--- a/src/npc/interaction/fKiss.tw
+++ b/src/npc/interaction/fKiss.tw
@@ -7,27 +7,27 @@
 You tell <<= getSlave($AS).slaveName>> to
 <<switch getSlave($AS).mouthAccessory>>
 <<case "none">>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		approach you.
 	<<else>>
 		have another slave help $him to your desk.
 	<</if>>
 <<case "dildo gag">>
-	<<if hasAnyArms(getSlave($AS))>>
+	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
 		remove $his dildo gag and approach you.
 	<<else>>
 		have another slave remove $his dildo gag and set $him down on your desk.
 	<</if>>
 	<<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">>
 <<case "massive dildo gag">>
-	<<if hasAnyArms(getSlave($AS))>>
+	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
 		pull $his enormous dildo gag out of the depths of $his throat and approach you.
 	<<else>>
 		have another slave pull the enormous dildo gag out of the depths of $his throat and set $him down on your desk.
 	<</if>>
 	<<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">>
 <<default>>
-	<<if hasAnyArms(getSlave($AS))>>
+	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
 		undo $his gag and approach you.
 	<<else>>
 		have another slave undo $his gag and set $him down on your desk.
@@ -92,7 +92,7 @@ You tell <<= getSlave($AS).slaveName>> to
 	<<if canSee(getSlave($AS))>>
 		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= WrittenMaster()>> disconcerting, and $he looks down after a moment, blushing.
 	<<else>>
-		upon $his face. $He finds the intense attention from $his <<= WrittenMaster()>>disconcerting, and $he looks down after a moment, blushing.
+		upon $his face. $He finds the intense attention from $his <<= WrittenMaster()>> disconcerting, and $he looks down after a moment, blushing.
 	<</if>>
 <<elseif (getSlave($AS).devotion > 20)>>
 	$He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply
diff --git a/src/npc/interaction/fLickPussy.tw b/src/npc/interaction/fLickPussy.tw
index d060cddc6a5c768cbed77a2007ff331791c4e18d..c164ca8caf00f677ddf39f588abd71311e9db44b 100644
--- a/src/npc/interaction/fLickPussy.tw
+++ b/src/npc/interaction/fLickPussy.tw
@@ -6,7 +6,7 @@
 
 <<set _devotion = getSlave($AS).devotion>> /*for brevity*/
 
-<<if canWalk(getSlave($AS))>>
+<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 	You summon <<= getSlave($AS).slaveName>> to your office and order $him to lie down on the couch. $He does so
 	<<if _devotion > 95>>
 		with a smile, skipping over to give you a quick kiss before $he complies with your request.
@@ -21,10 +21,10 @@
 	You have <<= getSlave($AS).slaveName>> brought into your office and placed on your couch.
 <</if>>
 
-After $he is situated, you go over to $him<<if getSlave($AS).clothes != "no clothing">> and take off $his clothing, causing $him to <<if _devotion > 50>>give you a soft smile<<else>>give you an angry glare<</if>><</if>>. You suddenly grab $his hips and pull $his crotch to your face, causing $him to give a shriek of surprise. Looking at $him directly in the eyes, you begin to run your tongue along $his labia, drawing a soft moan from $him. The combination of the pleasure and the intense look from the _womanP $he<<if _devotion > 95>> loves <<elseif _devotion > 50>>'s accepted as $his <<= WrittenMaster(getSlave($AS))>><<else>> hates/*not sure what to use for "reluctant"*/<</if>> makes $him blush, but you don't let up.
+After $he is situated, you go over to $him<<if getSlave($AS).clothes != "no clothing">> and take off $his clothing, causing $him to <<if _devotion > 50>>give you a soft smile<<else>>give you an angry glare<</if>><</if>>. You suddenly grab $his hips and pull $his crotch to your face, causing $him to <<if canTalk(getSlave($AS))>>give a shriek of surprise<<else>>shudder in surprise<</if>>. Looking at $him directly in the eyes, you begin to run your tongue along $his labia, drawing a <<if canTalk(getSlave($AS))>>soft<<else>>silent<</if>> moan from $him. The combination of the pleasure and the intense look from the _womanP $he<<if _devotion > 95>> loves <<elseif _devotion > 50>>'s accepted as $his <<= WrittenMaster(getSlave($AS))>><<else>> hates/*not sure what to use for "reluctant"*/<</if>> makes $him blush, but you don't let up.
 <<if getSlave($AS).dick == 0>>
-	You give $his clit a few experimental tweaks, causing $his moans to intensify<<if hasBothLegs(getSlave($AS))>> and $his legs to tighten around your head<</if>>.
+	You give $his clit a few experimental tweaks, causing $his <<if canTalk(getSlave($AS))>>moans<<else>>squirming<</if>> to intensify<<if hasBothLegs(getSlave($AS))>> and $his legs to tighten around your head<</if>>.
 <</if>>
-Before $he cums, though, you pull back, causing $him to whine in frustration. You begin again, then pull back again just before $he orgasms. You repeat this several more times, each time causing $him to become more and more frustrated. Finally, one last stroke of your tongue causes $him to go over the edge, making $him scream out <<if _devotion > 50>>your name<</if>> in ecstasy<<if getSlave($AS).dick > 0>><<if canAchieveErection(getSlave($AS))>> and spray cum across $his chest<<else>> and dribble cum from $his limp dick<</if>><</if>>. You send $him back to $his assignment before calling in another slave to clean up the mess.
+Before $he cums, though, you pull back, causing $him to whine in frustration. You begin again, then pull back again just before $he orgasms. You repeat this several more times, each time causing $him to become more and more frustrated. Finally, one last stroke of your tongue causes $him to go over the edge, making $him <<if canTalk(getSlave($AS))>>scream out <<if _devotion > 50>>your name<</if>><<else>>spasm<</if>> in ecstasy<<if getSlave($AS).dick > 0>><<if canAchieveErection(getSlave($AS))>> and spray cum across $his chest<<else>> and dribble cum from $his limp dick<</if>><</if>>. You send $him back to $his assignment before calling in another slave to clean up the mess.
 
 <<set getSlave($AS).counter.vaginal++, $vaginalTotal++>>
diff --git a/src/npc/interaction/fRelation.tw b/src/npc/interaction/fRelation.tw
index d3863431b65406ebe9269ca18460e1a7617db8c3..f61c686d1d5e27c892f1480e7de73fbbc317d972 100644
--- a/src/npc/interaction/fRelation.tw
+++ b/src/npc/interaction/fRelation.tw
@@ -39,7 +39,7 @@
 
 You call both <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName to your office.
 
-<<if canWalk(getSlave($AS)) && canWalk($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && canPenetrate(getSlave($AS)) && canPenetrate($slaves[$partner]) && ($slaves[$partner].anus > 0) && (getSlave($AS).anus > 0) && ($PC.dick != 0)>>
+<<if canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && canPenetrate(getSlave($AS)) && canPenetrate($slaves[$partner]) && ($slaves[$partner].anus > 0) && (getSlave($AS).anus > 0) && ($PC.dick != 0)>>
 	There are three stiff pricks available. Since <<= getSlave($AS).slaveName>> was already in your office, $he goes on the bottom. $He lies on the floor, spreads $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>buttocks, relaxes $his anus, and then begs $his _partnerRel to buttfuck $him. $slaves[$partner].slaveName does, slipping _his2 cock into _his2 _activeSlaveRel's ass. _He2 then stops and waits for you to buttfuck _him2 in turn. It isn't a particularly convenient way to fuck, but it's got the virtue of being uncommon. $slaves[$partner].slaveName, both fucking and getting fucked, comes in _his2 _activeSlaveRel's rectum first. They switch places so <<= getSlave($AS).slaveName>> can have a turn in the middle, leaving you to finish into <<= getSlave($AS).slaveName>>'s already cum-soaked hole.
 	<<set getSlave($AS).counter.anal += 2, getSlave($AS).counter.penetrative++, $slaves[$partner].counter.anal += 2, $slaves[$partner].counter.penetrative++, $analTotal += 4, $penetrativeTotal += 2>>
 <<elseif ($slaves[$partner].devotion - getSlave($AS).devotion > 20) && ($slaves[$partner].devotion <= 50)>>
@@ -50,12 +50,12 @@ You call both <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName to y
 	<<= getSlave($AS).slaveName>> is a lot more ready and willing for this than $slaves[$partner].slaveName, so<<if ($PC.dick == 0)>>while getting into a strap-on,<</if>> you sit $him on the couch and make $slaves[$partner].slaveName sit on $his lap, facing $him. In this position, <<= getSlave($AS).slaveName>> can reach around and spread $his _partnerRel's <<if $seeRace == 1>>$slaves[$partner].race <</if>>buttocks for _him2, controlling _him2 all the while in case _he2 has hesitations about this. $slaves[$partner].slaveName knows that _he2's trapped, and lets _his2 _activeSlaveRel hold _his2 ass wide so you can use _him2. They're face to face, and it's not hard to tell that $slaves[$partner].slaveName is glaring daggers at <<= getSlave($AS).slaveName>>. You reward <<= getSlave($AS).slaveName>> for $his obedience and punish $slaves[$partner].slaveName for _his2 resistance by forcing _him2 to suck <<= getSlave($AS).slaveName>> off while you finish using $slaves[$partner].slaveName.
 	<<set getSlave($AS).counter.oral++, $slaves[$partner].counter.oral++, $oralTotal++>>
 	<<= VCheck.Partner()>>
-<<elseif canWalk(getSlave($AS)) && canWalk($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (hasAnyArms(getSlave($AS))) && (["mother", "father", "sole parent"].includes(_activeSlaveRel))>>
+<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (hasAnyArms(getSlave($AS))) && (["mother", "father", "sole parent"].includes(_activeSlaveRel))>>
 	<<= getSlave($AS).slaveName>> gives you a little smile when $he <<if canHear(getSlave($AS))>>hears<<else>>learns<</if>> you wish to fuck $him and $his _daughter2 $slaves[$partner].slaveName<<if ($PC.dick == 0)>> and <<if canSee(getSlave($AS))>>sees<<else>>acknowledges<</if>> your strap-on<</if>>. On your direction, <<= getSlave($AS).slaveName>> sits on the couch. When $slaves[$partner].slaveName enters, _his2 _activeSlaveRel spreads $his arms and tells _him2 to sit on $his lap. $slaves[$partner].slaveName gets the idea and straddles $him so they're face to face. You take $slaves[$partner].slaveName from behind; _he2 gasps as _he2 feels _his2 _activeSlaveRel's hand<<if (hasBothArms($slaves[$partner]))>>s<</if>> stimulate _him2 from the front. They make out shamelessly while you take your pleasure. When you finish, <<= getSlave($AS).slaveName>> lies down on the couch so $slaves[$partner].slaveName can ride $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>face. As $he sucks the cum out of $his _daughter2's sopping fuckhole, $slaves[$partner].slaveName sucks you hard again. In the mood for something harder this time, you jam yourself into the older <<= getSlave($AS).slaveName>>. $slaves[$partner].slaveName gets off <<= getSlave($AS).slaveName>>'s face so _he2 can offer _himself2 for fondling and groping while you pound <<= getSlave($AS).slaveName>>. After you're done, $slaves[$partner].slaveName returns _his2 _activeSlaveRel's affection and gives $him some gentle oral as the older slave lies there exhausted.
 	<<set getSlave($AS).counter.oral += 2, $slaves[$partner].counter.oral += 2, $oralTotal += 2>>
 	<<= VCheck.Both()>>
 	<<= VCheck.Partner()>>
-<<elseif canWalk(getSlave($AS)) && canWalk($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["daughter", "son"].includes(_activeSlaveRel))>>
+<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["daughter", "son"].includes(_activeSlaveRel))>>
 	<<= getSlave($AS).slaveName>> is enthusiastic when $he <<if canHear(getSlave($AS))>>hears<<else>>notices<</if>> you order $slaves[$partner].slaveName to come over. $His total immersion in sexual slavery has clearly uncovered a willingness to get very close to $his _partnerRel. You<<if ($PC.dick == 0)>> don a strap-on,<</if>> lie on the floor and instruct $slaves[$partner].slaveName to ride you. _He2 complies, and finds _his2 $daughter <<= getSlave($AS).slaveName>>
 	<<if ($slaves[$partner].dick > 0)>>
 		stroking _his2 cock while _he2 humps _his2 <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>butt up and down on your cock.
@@ -65,12 +65,12 @@ You call both <<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName to y
 	Your use of $slaves[$partner].slaveName's <<if $slaves[$partner].physicalAge >= 24>>mature<<else>>surprisingly young<</if>> body is the focus. _He2 finds _himself2 caught up in a miasma of sexual pleasure and perversion, moaning and blushing as your <<if ($PC.dick == 0)>>strap-on and fingers<<else>>cock<</if>> and <<= getSlave($AS).slaveName>>'s mouth tour _his2 body. When you finish in _his2 <<if ($slaves[$partner].dick > 0)>>asshole, _his2 $daughter hastens to lavish attention on $his _partnerRel's well fucked, cum filled butt.<<else>>pussy, _his2 $daughter hastens to lavish attention on $his _partnerRel's well fucked, cum filled cunt.<</if>>
 	<<set getSlave($AS).counter.oral += 2, $slaves[$partner].counter.oral += 2, $oralTotal += 2>>
 	<<= VCheck.Partner()>>
-<<elseif canDoVaginal(getSlave($AS)) && canDoVaginal($slaves[$partner]) && canWalk(getSlave($AS)) && canWalk($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && (["twin brother", "twin sister"].includes(_activeSlaveRel))>>
+<<elseif canDoVaginal(getSlave($AS)) && canDoVaginal($slaves[$partner]) && canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 50) && (["twin brother", "twin sister"].includes(_activeSlaveRel))>>
 	<<= getSlave($AS).slaveName>> and $slaves[$partner].slaveName are such devoted sex slaves that they've long since lost any hesitations about their partnership, and generally approach sex as though their bodies were interchangeable. (This means that they almost never masturbate, for one thing, preferring to have sex with each other, instead.) Giggling and kissing each other, they eagerly kneel before your chair and give you simultaneous oral sex, making an effort to play with their symmetry. They kiss around your <<if ($PC.dick == 0)>>pussy<<else>>cock, making a complete seal around you with their lips<</if>>, one on each side. Then they jump up on your desk and press their <<if (getSlave($AS).dick > 0) && ($slaves[$partner].dick > 0)>>cocks<<elseif (getSlave($AS).dick > 0) || ($slaves[$partner].dick > 0)>>cock and pussy<<else>>pussies<</if>> against one another<<if ($PC.dick == 0)>> while you don a strap-on<</if>>, spreading their legs to offer you everything. You switch back and forth, with the twin you're not in rubbing and grinding against the one you are, until both of $slaves[$partner].slaveName and <<= getSlave($AS).slaveName>> are lying on the desk<<if ($PC.dick != 0)>> with cum dripping out of them<</if>>, making out tiredly.
 	<<set $slaves[$partner].counter.oral++, getSlave($AS).counter.oral++, $oralTotal++>>
 	<<= VCheck.Both()>>
 	<<= VCheck.Partner()>>
-<<elseif canWalk(getSlave($AS)) && canWalk($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["sister", "brother", "half-sister", "half-brother", "twin sister", "twin brother"].includes(_activeSlaveRel))>>
+<<elseif canMove(getSlave($AS)) && canMove($slaves[$partner]) && (getSlave($AS).devotion > 50) && ($slaves[$partner].devotion > 20) && (["sister", "brother", "half-sister", "half-brother", "twin sister", "twin brother"].includes(_activeSlaveRel))>>
 	You call <<= getSlave($AS).slaveName>>'s _partnerRel $slaves[$partner].slaveName in for some incestuous fun, but see no reason to wait for _him2. When _he2 arrives, it's to the <<if canSee($slaves[$partner])>>sight<<else>>scene<</if>> of <<= getSlave($AS).slaveName>> sitting on the couch with $his legs spread with you <<if (getSlave($AS).vagina > -1)>>gently fucking $his pussy<<else>>using $his asshole<</if>><<if ($PC.dick == 0)>> with a strap-on<</if>>. You pull out and order $slaves[$partner].slaveName to orally service _his2 _activeSlaveRel. _He2 gets down before the spread-eagled slave $girl to get to work. After watching <<= getSlave($AS).slaveName>> enjoy the attention for a while, you move behind the busy $slaves[$partner].slaveName and pull _him2 into a good position so you can fuck _him2 while _he2 sucks. After a few thrusts, <<= getSlave($AS).slaveName>>'s eyes roll back. <<if (getSlave($AS).voice == 0) || (getSlave($AS).accent >= 3)>>$He gestures that it feels really good when you make $his _partnerRel moan into $him.<<else>>"Oh <<Master>>," $he squeals, "it feel<<s>> <<s>>o good when you make _him2 moan into me!"<</if>>
 	<<set $slaves[$partner].counter.oral++, getSlave($AS).counter.oral++, $oralTotal++>>
 	<<= VCheck.Both()>>
diff --git a/src/npc/interaction/fSlaveFeed.tw b/src/npc/interaction/fSlaveFeed.tw
index e7d6fe2cc5a86b40a31abd995d9e7e68220a77b5..ca07b79a564874b0253e78ec60d3660a44132bfd 100644
--- a/src/npc/interaction/fSlaveFeed.tw
+++ b/src/npc/interaction/fSlaveFeed.tw
@@ -824,12 +824,12 @@ Next, you see to <<= getSlave($AS).slaveName>>.
 	You help the bloated <<= getSlave($AS).slaveName>> to the couch to recover and, more importantly, keep $his meal down. Only once $he has had several minutes to unwind<<if getSlave($AS).devotion > 10>> and plenty of time to tease you with $his swollen body, do you tell <<else>> do you order<</if>> $him to keep drinking from $milkTap.slaveName so that $he is always filled with <<if getSlave($AS).inflation == 3>>two gallons<<elseif getSlave($AS).inflation == 2>>four liters<<else>>two liters<</if>> of <<= getSlave($AS).inflationType>>. You give $his <<if getSlave($AS).inflation == 3>>taut, firm globe of a belly a pat<<elseif getSlave($AS).inflation == 2>>wobbly, sloshing belly a pat<<else>>distended, sloshing belly a pat<</if>> and send $him on $his way.
 
 	<<if getSlave($AS).inflation == 3>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes<<else>>$His belly is so taut it barely wobbles at all as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility === "permissive">>$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes<<else>>$His belly is so taut it barely wobbles at all as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
 		<<run healthDamage(getSlave($AS), 1)>>
 	<<elseif getSlave($AS).inflation == 2>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility === "permissive">>$He gingerly leaves your office, massaging $his stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
 	<<elseif getSlave($AS).inflation == 1>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility === "permissive">>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
 	<</if>>
 	<br><br>
 	<<if $milkTap.fuckdoll == 0>>
diff --git a/src/npc/interaction/fVagina.tw b/src/npc/interaction/fVagina.tw
index 028877f94692bddd85efb3916cc31919964532c3..7386318b2a323f9095eb7e68e84905a71d2f051d 100644
--- a/src/npc/interaction/fVagina.tw
+++ b/src/npc/interaction/fVagina.tw
@@ -94,7 +94,7 @@ You call $him over so you can
 	<<set _fSpeed = random(1,100)>>
 <</if>>
 
-<<if canWalk(getSlave($AS)) && getSlave($AS).fetish != "mindbroken">>
+<<if canMove(getSlave($AS)) && getSlave($AS).fetish != "mindbroken">>
 	You decide to fuck $him
 	<<if (_fPosition <= 20)>>
 		in the missionary position.
@@ -513,7 +513,7 @@ You call $him over so you can
 		Your cum slides right out of $his gaping hole.
 	<</if>>
 
-	<<if canWalk(getSlave($AS)) && $postSexCleanUp > 0>>
+	<<if canMove(getSlave($AS)) && $postSexCleanUp > 0>>
 		$He uses <<if getSlave($AS).vagina > 0>>a quick douche to clean $his <<if getSlave($AS).vagina < 2>>tight<<elseif getSlave($AS).vagina > 3>>loose<</if>> pussy<<else>>an enema to clean $his <<if getSlave($AS).anus < 2>>tight<<elseif getSlave($AS).anus < 3>>used<<else>>gaping<</if>> butthole<</if>>,
 		<<switch getSlave($AS).assignment>>
 		<<case "work in the brothel">>
diff --git a/src/npc/interaction/fillUpButt.tw b/src/npc/interaction/fillUpButt.tw
index fb6591c6a9dbaf3b75947e3c07b870080a9b6435..ea27556981a0d9e9288973914e7f901091372dbb 100644
--- a/src/npc/interaction/fillUpButt.tw
+++ b/src/npc/interaction/fillUpButt.tw
@@ -74,7 +74,7 @@ before shoving the equipment into $his
 	<<run deflate(getSlave($AS))>>
 	<<set getSlave($AS).pregKnown = 1>>
 <<elseif getSlave($AS).fetish == "mindbroken">>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to present $his buttocks and anus but $he remains still and unresponsive. Talking to a broken mind is pointless.
 	<</if>>
 	You reach around and grab $his
@@ -129,9 +129,9 @@ before shoving the equipment into $his
 	<<else>>
 		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you push $him onto your desk and admire $his distended, <<= getSlave($AS).skin>> stomach. You give the gut orb a slap, eliciting a slight grunt from the broken slave and touch of wiggling and sloshing from $his middle. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.<</if>>
 <<elseif getSlave($AS).devotion < -20>>
-	<<if canWalk(getSlave($AS))>>
-		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to step back, but you catch $him and pull $him closer to you as you reach around and grab $his
-	<<elseif (hasAnyLegs(getSlave($AS)))>>
+	<<if canMove(getSlave($AS))>>
+		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him closer to you as you reach around and grab $his
+	<<elseif !isAmputee(getSlave($AS))>>
 		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He's opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, but since $he is immobile, can't escape. You reach around and grab $his
 	<<else>>
 		$He's opposed to the thought of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You reach around and grab $his
@@ -191,14 +191,14 @@ before shoving the equipment into $his
 	<</if>>
 	butthole, and setting it on low.
 	<<if getSlave($AS).inflation == 2>>
-		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<elseif getSlave($AS).inflation == 1>>
-		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<else>>
-		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.<</if>>
+		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.<</if>>
 <<elseif (getSlave($AS).devotion <= 20)>>
-	<<if canWalk(getSlave($AS))>>
-		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He complies without comment, standing in front of you.
+	<<if canMove(getSlave($AS))>>
+		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He complies without comment, <<if canStand(getSlave($AS))>>standing in front of you.<<else>>turning $his rear to you.<</if>>
 	<<elseif !isAmputee(getSlave($AS))>>
 		You instruct $him to present $his anus for a <<= getSlave($AS).inflationType>> enema. $He complies without comment, readying $his ass for you.
 	<<else>>
@@ -256,15 +256,15 @@ before shoving the equipment into $his
 	<</if>>
 	butthole, and setting it on low.
 	<<if getSlave($AS).inflation == 2>>
-		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<elseif getSlave($AS).inflation == 1>>
-		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<else>>
-		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<</if>>
 <<elseif getSlave($AS).devotion <= 50>>
-	<<if canWalk(getSlave($AS))>>
-		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He hesitates but eventually stands in front of you showing $his buttocks before presenting $his anus.
+	<<if canMove(getSlave($AS))>>
+		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He hesitates but eventually <<if canStand(getSlave($AS))>>stands<<else>>crawls<</if>> in front of you showing $his buttocks before presenting $his anus.
 	<<elseif !isAmputee(getSlave($AS))>>
 		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He hesitates but eventually shifts $his buttocks to face you before presenting $his anus.
 	<<else>>
@@ -310,15 +310,20 @@ before shoving the equipment into $his
 	<</if>>
 	butthole, and setting it on low.
 	<<if getSlave($AS).inflation == 2>>
-		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<elseif getSlave($AS).inflation == 1>>
-		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<else>>
-		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, hoping you'll give $him more attention. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<</if>>
 <<else>>
-	<<if canWalk(getSlave($AS))>>
-		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He eagerly stands in front of you showing $his buttocks before happily presenting $his anus to you, spreading $his butt cheeks and turning to face you.
+	<<if canMove(getSlave($AS))>>
+		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He eagerly
+		<<if canStand(getSlave($AS))>>
+			stands in front of you showing $his buttocks before happily presenting $his anus to you, spreading $his butt cheeks and turning to face you.
+		<<else>>
+			crawls to you, showing $his buttocks in motion before happily presenting $his anus to you.
+		<</if>>
 	<<elseif !isAmputee(getSlave($AS))>>
 		You instruct $him to present $his <<if $seeRace == 1>><<= getSlave($AS).race>> <</if>>anus for a <<= getSlave($AS).inflationType>> enema. $He eagerly shifts around to show $his buttocks before happily presenting $his anus to you, spreading $his butt cheeks and turning to face you.
 	<<else>>
@@ -364,22 +369,22 @@ before shoving the equipment into $his
 	<</if>>
 	butthole, and setting it on low.
 	<<if getSlave($AS).inflation == 2>>
-		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His sloshing belly slowly grows even larger with <<= getSlave($AS).inflationType>>. You rest a hand on $his back as $his swelling belly forces $him to rise off your lap. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his taut, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<elseif getSlave($AS).inflation == 1>>
-		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His bloated belly slowly swells even larger with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his jiggly, soft, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<<else>>
-		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canWalk(getSlave($AS))>>push $him to $his feet<<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
+		$His belly slowly swells with <<= getSlave($AS).inflationType>>. You slip a hand under $his stomach to feel it grow in your palm. Once the enema is complete and $he is plugged, you <<if canStand(getSlave($AS))>>push $him to $his <<if hasBothLegs(getSlave($AS))>>feet<<else>>foot<</if>><<else>>help $him onto your desk<</if>> and admire $his distended, <<= getSlave($AS).skin>> stomach. $He sighs contently, before eagerly begging for more. You pat $his belly and tell $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise.
 	<</if>>
 <</if>>
 <<if _pregDiscovery == 0>>
 	<<set getSlave($AS).inflation += 1>>
 	<<if getSlave($AS).inflation == 3>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his bloated guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his bloated guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
 		<<run healthDamage(getSlave($AS), 10)>>
 	<<elseif getSlave($AS).inflation == 2>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his full guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his full guts as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
 	<<elseif getSlave($AS).inflation == 1>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
 	<</if>>
 	<<run SetBellySize(getSlave($AS))>>
 <</if>>
diff --git a/src/npc/interaction/fillUpFace.tw b/src/npc/interaction/fillUpFace.tw
index f2986ca9e036c430a48d1c2940d8ee1b38d3ae81..0dceca83318667996d724f31e658a9983a52c9a8 100644
--- a/src/npc/interaction/fillUpFace.tw
+++ b/src/npc/interaction/fillUpFace.tw
@@ -28,7 +28,7 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 	<<run deflate(getSlave($AS))>>
 	<<set getSlave($AS).pregKnown = 1>>
 <<elseif getSlave($AS).fetish == "mindbroken">>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to take a seat on your lap and open $his mouth wide for the hose, but $he remains still and unresponsive. Talking to a broken mind is pointless.
 	<</if>>
 	You reach out and wrap your arms around $his
@@ -63,9 +63,9 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 	<</if>>
 	belly, pulling $him into your lap. You force the hose down $his throat, strapping it to $his head to prevent it from slipping out, and turn the flow to low. With everything in place, you return your hands to $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting a large belch from the broken slave and no motion at all from $his gut. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a burp from the broken slave and tons of motion from $his gut. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover, After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a small burp from the broken slave and a little jiggle from $his gut. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the hiccupping <<= getSlave($AS).slaveName>> ready to be moved<</if>>.
 <<elseif getSlave($AS).devotion < -20>>
-	<<if canWalk(getSlave($AS))>>
-		You instruct $him to take a seat on your lap and open $his mouth wide for the hose. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to step back, but you catch $him and pull $him into your lap, wrapping your arms around $his
-	<<elseif (hasAnyLegs(getSlave($AS)))>>
+	<<if canMove(getSlave($AS))>>
+		You instruct $him to take a seat on your lap and open $his mouth wide for the hose. Opposed to the thought of being filled <<if getSlave($AS).inflation > 0>>more <</if>>with <<= getSlave($AS).inflationType>>, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him into your lap, wrapping your arms around $his
+	<<elseif (hasAnyLimbs(getSlave($AS)))>>
 		You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He's opposed to the thought of being filled with<<if getSlave($AS).inflation > 0>> more<</if>> <<= getSlave($AS).inflationType>>, but since $he is immobile, $he can't escape. You heft $him onto your lap, wrapping your arms around $his
 	<<else>>
 		$He's opposed to the thought of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $him
@@ -101,9 +101,9 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 	<</if>>
 	belly. You force the hose down $his throat, strapping it to $his head to prevent $him from removing it, and turn the flow to low. With everything in place, you return your hands to $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting gagging from the overfilled slave and no motion at all from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a burp from the full slave and tons of motion from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hands. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a shudder from the bloated slave and a little jiggle from $his gut. $He <<if canSee(getSlave($AS))>>looks in your eyes<<else>>faces you<</if>>, as though almost demanding answers. $He looks apprehensive about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. After a few minutes of rest, and several glares from you when it appears $his meal might be coming back up, is the hiccupping <<= getSlave($AS).slaveName>> ready to be moved<</if>>.
 <<elseif getSlave($AS).devotion <= 20>>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He complies without comment and settles $himself onto your lap, shuddering slightly as you wrap your arms around $his
-	<<elseif (hasAnyLegs(getSlave($AS)))>>
+	<<elseif (hasAnyLimbs(getSlave($AS)))>>
 		You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He complies without comment. You heft $him onto your lap, wrapping your arms around $his
 	<<else>>
 		$He's hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $his
@@ -139,9 +139,9 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 	<</if>>
 	belly. You insert the hose down $his throat, choosing to hold it place instead of strapping it to $him, and turn the flow to low. With everything in place, you place your free hand on $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the firm orb of $his belly a slap, eliciting a restrained gag from the overfilled slave and no motion at all from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the jiggling orb of $his belly a slap, eliciting a strained burp from the full slave and tons of motion from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his hiccupping bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give $his bloated belly a slap, eliciting a small shudder from the bloated slave and a little jiggle from $his gut. $He looks up at you quizzically, unsure about what you will do next. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing bulk onto the couch to recover. $His meal attempts to come back up on $his several times, but $he holds it down for fear of punishment should $he vomit. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<</if>>.
 <<elseif getSlave($AS).devotion <= 50>>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He hesitates but eventually settles $himself onto your lap as you wrap your arms around $his
-	<<elseif (hasAnyLegs(getSlave($AS)))>>
+	<<elseif (hasAnyLimbs(getSlave($AS)))>>
 		You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He hesitates for a moment, before demonstrating acceptance. You heft $him onto your lap, wrapping your arms around $his
 	<<else>>
 		$He's mildly hesitant of being filled with <<if getSlave($AS).inflation > 0>>more <</if>><<= getSlave($AS).inflationType>>, but as an amputee can do nothing about it. You heft $him onto your lap, wrapping your arms around $his
@@ -177,9 +177,9 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 	<</if>>
 	belly. You <<if hasAnyArms(getSlave($AS))>>hand $him the hose<<else>>place the hose in $his mouth<</if>>, allowing $him to drink from it at $his own pace, as you keep a hand on the tap to control the flow. With everything in place, you place your free hand on $his gurgling stomach.<<if getSlave($AS).inflation == 2>>You can feel $his <<= getSlave($AS).skin>> belly growing taut with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the firm orb of $his belly a couple gentle pats, eliciting a small hiccup, that $he immediately apologizes for, from the overfilled slave and no motion at all from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with two gallons of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. $His meal attempts to come back up on $his several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<elseif getSlave($AS).inflation == 1>>You can feel $his <<= getSlave($AS).skin>> belly growing larger with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give the jiggling orb of $his belly a couple pats, eliciting a small hiccup, that $he immediately apologizes for, from the full slave and tons of motion from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with four liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his heavy body onto the couch to recover. $His meal attempts to come back up on $him several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<<else>>You can feel $his <<= getSlave($AS).skin>> belly swelling with <<= getSlave($AS).inflationType>> as it pushes out against your hand. Once you have given $him $his fill, you give $his bloated belly a couple pats, eliciting a small hiccup, that $he immediately apologizes for, from the bloated slave and a little jiggle from $his gut. $He sighs contently, hoping you'll give $him more attention. You order $him to keep $himself filled with two liters of <<= getSlave($AS).inflationType>> until you say otherwise, before helping $his sloshing body onto the couch to recover. $His meal attempts to come back up on $his several times, but $he dutifully holds it down. Only after a few minutes of rest is the groaning <<= getSlave($AS).slaveName>> ready to be moved<</if>>.
 <<else>>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to take a seat on your lap and open $his mouth wide for the hose. $He eagerly settles $himself onto your lap as you wrap your arms around $his
-	<<elseif (hasAnyLegs(getSlave($AS)))>>
+	<<elseif (hasAnyLimbs(getSlave($AS)))>>
 		You inform $him $he'll be taking a seat on your lap, opening $his mouth wide for the hose, and drinking until you tell $him $he is full enough. $He squirms with excitement as you heft $him onto your lap, wrapping your arms around $his
 	<<else>>
 		$He's devotedly <<if canSee(getSlave($AS))>>looks<<else>>smiles<</if>> at you as you heft $him onto your lap, wrapping your arms around $his
@@ -219,12 +219,12 @@ You attach a hose to $dairyName tap with the pipes set to pump <<= getSlave($AS)
 <<if _pregDiscovery == 0>>
 	<<set getSlave($AS).inflation += 1>>
 	<<if getSlave($AS).inflation == 3>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>. Being filled so full @@.red;surely had negative effects@@ on $his health.
 		<<run healthDamage(getSlave($AS), 10)>>
 	<<elseif getSlave($AS).inflation == 2>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his stuffed belly as $he goes<<else>>$His belly wobbles heavily as $he is helped from your office<</if>>.
 	<<elseif getSlave($AS).inflation == 1>>
-		<<if canWalk(getSlave($AS))>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>$He gingerly leaves your office, massaging $his distended belly as $he goes<<else>>$His belly wobbles as $he is helped from your office<</if>>.
 	<</if>>
 	<<run SetBellySize(getSlave($AS))>>
 <</if>>
diff --git a/src/npc/interaction/fondleButt.tw b/src/npc/interaction/fondleButt.tw
index 2da14590e42757bb51814871e3ceccdb30494bbe..7a0700f3904320c370783601b05fd49f20e40d3f 100644
--- a/src/npc/interaction/fondleButt.tw
+++ b/src/npc/interaction/fondleButt.tw
@@ -67,7 +67,7 @@ as well as $his
 		couch-like
 	<</if>>
 	buttocks. $He looks longingly into your eyes as you continue to move around $his posterior, pinching with your fingers and slapping with your palms before reaching to touch your fingertips against $his sphincter. $He moans and quivers slightly when you rub your fingers around $his virgin anus. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks firmly — first one, then the other and then finally both. $He can't resist gyrating $his hips in arousal while in your grasp.
-	<<if canWalk(getSlave($AS))>>
+	<<if canStand(getSlave($AS))>>
 		You strongly pull $his body closer towards you by $his buttocks, turn $him around, and push $him down to bend $him over your desk.
 	<<else>>
 		You move closer towards $him, turn $him around and firmly hold $him down on desk, face-down so that $his butt is facing you up into the air.
@@ -94,7 +94,7 @@ as well as $his
 	<</if>>
 	buttocks a few hard smacks for good measure. $His face is in ecstasy as $he stands and turns to face you, gently rubbing the red spots on $his buttocks and looking at you hungrily as if $he wants more.
 <<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).anus == 0)>>
-	<<if canWalk(getSlave($AS))>>
+	<<if canStand(getSlave($AS))>>
 		$He accepts your orders happily and waves $his virgin anus to you, spreading $his butt cheeks in front of you with $his hands before turning to face you.
 	<</if>>
 	You reach around and grab $his
@@ -118,7 +118,7 @@ as well as $his
 		couch-like
 	<</if>>
 	buttocks with both hands before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He looks passionately into your eyes as you continue to move around $his posterior gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He sighs as you rub your fingertips around $his virgin anus. $He starts to wiggle $his ass while you circle around $his anus, not breaking contact with $him with your fingers. You keep squeezing $his buttocks tenderly — first one, then the other and then both and $he can't resist gyrating $his hips enticingly while in your grasp.
-	<<if canWalk(getSlave($AS))>>
+	<<if canStand(getSlave($AS))>>
 		You pull $his body closer towards you by $his buttocks, turn $him around, and bend $him over your desk.
 	<<else>>
 		You move closer towards $him, turn $him around and push $him down on desk, face-down so that $his butt is facing you up into the air.
@@ -154,7 +154,7 @@ as well as $his
 		<<Master>>," $he says happily.
 	<</if>>
 <<elseif (getSlave($AS).devotion > 20) && (getSlave($AS).anus == 0)>>
-	<<if canWalk(getSlave($AS))>>
+	<<if canStand(getSlave($AS))>>
 		$He accepts your orders without comment and presents $his virgin anus to you before turning to face you.
 	<</if>>
 	You reach around and grab $his
@@ -282,7 +282,7 @@ as well as $his
 	<</if>>
 	buttocks before rubbing along them, feeling the shape of $his<<if $seeRace == 1>> <<= getSlave($AS).race>><</if>> ass with your fingers and squeezing gently. $He tries to break out of your grasp as you rub fingers around $his virgin anus. $He writhes as you continue to move around $his posterior, gently reaching to touch your fingertips against $his sphincter while rubbing $his ass at the same time. $He struggles to stay still while you circle around $his unbroken anus, not breaking contact with $him with your fingers. You look at $his face and $he has <<if !canSee(getSlave($AS))>>reflexively <</if>>shut $his eyes, trying not to think about what's happening to $his butt. This only encourages you to continue. You keep squeezing $his buttocks tenderly — first one, then the other and then finally both and $he can't help but quiver while in your grasp. You pull $his body closer towards you by $his buttocks, turn $him around, and push $him down, bending $him over your desk while $he tries to push away. You look at $his rear while you squeeze $his cheeks and rub them with your firm hands. You wander along the outline of $his posterior with both your eyes and hands, then look at $his virgin butthole as you trace it with your fingers and thumb. Eventually, you decide to stop. $He slowly stands and looks in your eyes, as though almost demanding answers. $He looks apprehensive about what you will do next.
 <<elseif getSlave($AS).fetish == "mindbroken">>
-	<<if canWalk(getSlave($AS))>>
+	<<if canMove(getSlave($AS))>>
 		You instruct $him to present $his buttocks and anus but $he remains still and unresponsive. Talking to a broken mind is pointless.
 	<</if>>
 	You reach around and grab $his
diff --git a/src/npc/interaction/forceFeeding.tw b/src/npc/interaction/forceFeeding.tw
index 4c7a27e63d93a67806cc30ecc7da60c985774059..89a56c3a1a869d80a8219ff79528b1d988863cbe 100644
--- a/src/npc/interaction/forceFeeding.tw
+++ b/src/npc/interaction/forceFeeding.tw
@@ -33,7 +33,7 @@ buckets overflowing with slave food. $He is going to eat it all and you're going
 	$He grimaces at the <<if canSee(getSlave($AS))>>sight<<elseif canSmell(getSlave($AS))>>smell<<else>>thought<</if>> of the food that will soon be going into $him. $He knows you won't let it come back up later.
 <</if>>
 
-<<if canWalk(getSlave($AS))>>
+<<if canMove(getSlave($AS))>>
 	You instruct $him to take a seat on your lap and open
 	<<if getSlave($AS).fetish == "mindbroken">>
 		wide, but $he remains still and unresponsive. Talking to a broken mind is pointless.
@@ -41,7 +41,7 @@ buckets overflowing with slave food. $He is going to eat it all and you're going
 		wide.
 	<</if>>
 	<<if getSlave($AS).devotion < -20>>
-		Opposed to the thought of being forced to eat all that food, $he tries to step back, but you catch $him and pull $him into your lap, wrapping an arm
+		Opposed to the thought of being forced to eat all that food, $he tries to <<if canWalk(getSlave($AS))>>step back<<else>>crawl away<</if>>, but you catch $him and pull $him into your lap, wrapping an arm
 	<<elseif getSlave($AS).fetish == "submissive">>
 		$He meekly settles into your lap and shudders as $he feels your dominant hand wrap
 	<<elseif getSlave($AS).behavioralFlaw == "gluttonous">>
@@ -527,7 +527,7 @@ and a little jiggle from $his gut.
 	<<set getSlave($AS).pregKnown = 1>>
 <<else>>
 	<<if getSlave($AS).inflation == 3>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He gingerly leaves your office, massaging $his over-stuffed belly as $he goes.
 		<<else>>
 			$His belly wobbles heavily as $he is helped from your office.
@@ -535,13 +535,13 @@ and a little jiggle from $his gut.
 		Being filled so full @@.red;surely had negative effects@@ on $his health.
 		<<run healthDamage(getSlave($AS), 10)>>
 	<<elseif getSlave($AS).inflation == 2>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He gingerly leaves your office, massaging $his stuffed belly as $he goes.
 		<<else>>
 			$His belly wobbles heavily as $he is helped from your office.
 		<</if>>
 	<<elseif getSlave($AS).inflation == 1>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He gingerly leaves your office, massaging $his distended belly as $he goes.
 		<<else>>
 			$His belly wobbles as $he is helped from your office.
diff --git a/src/npc/interaction/passage/fMarry.tw b/src/npc/interaction/passage/fMarry.tw
index 82a603b0b961e64a088c67eb6b4405f66ae2c2ab..37008dddbcad5ae79c04910793442242c1d284ef 100644
--- a/src/npc/interaction/passage/fMarry.tw
+++ b/src/npc/interaction/passage/fMarry.tw
@@ -461,7 +461,7 @@ You tell <<= getSlave($AS).slaveName>> that you're going to marry $him. (A propo
 	<<replace "#result">>
 	You order <<= getSlave($AS).slaveName>> to go change into bridal lingerie.
 	<<if _reactionType == 0>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He hurries off, still crying. When $he returns, $he's wearing
 		<<else>>
 			$He is helped out, still crying. When $he is returned, $he's wearing
@@ -469,13 +469,13 @@ You tell <<= getSlave($AS).slaveName>> that you're going to marry $him. (A propo
 	<<elseif _reactionType == 1>>
 		$He is helped out, completely unaware of $his pending marriage. When $he is returned, $he's wearing
 	<<elseif _reactionType == 2>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He shuffles off, still sobbing. When $he returns, $he's wearing
 		<<else>>
 			$He is helped out, still sobbing. When $he is returned, $he's wearing
 		<</if>>
 	<<else>>
-		<<if canWalk(getSlave($AS))>>
+		<<if canWalk(getSlave($AS)) || (canMove(getSlave($AS)) && getSlave($AS).rules.mobility == "permissive")>>
 			$He hurries off to fulfill your orders. When $he returns, $he's wearing
 		<<else>>
 			$He is helped out to get dressed. When $he is returned, $he's wearing
diff --git a/src/npc/interaction/passage/fSlaveImpreg.tw b/src/npc/interaction/passage/fSlaveImpreg.tw
index ea74e085502754f4fbd5ca0f322f0070f8d88957..e81aeecbf96434e8e1bc6c62cf0954fde2b27012 100644
--- a/src/npc/interaction/passage/fSlaveImpreg.tw
+++ b/src/npc/interaction/passage/fSlaveImpreg.tw
@@ -9,7 +9,8 @@
 
 <h3>Select an eligible slave to serve as the semen donatrix</h3>
 
-<<set _eligibles = $slaves.filter((s) => (s.ID != getSlave($AS).ID) && canImpreg(getSlave($AS), s) && canPenetrate(getSlave($AS), s))>>
+<<set _eligibles = $slaves.filter((s) => (s.ID != getSlave($AS).ID) && canImpreg(getSlave($AS), s) && canPenetrate(s))>>
+<<set _kinship = ibc.kinship_one_many(getSlave($AS), _eligibles)>>
 <<for _i = 0; _i < _eligibles.length; _i++>>
 	<<set _name = SlaveFullName(_eligibles[_i])>>
 	<div>
@@ -23,6 +24,21 @@
 				@@.lightgreen;<<= capFirstChar(_relTerm)>>@@
 			<</if>>
 		<</if>> /* closes extended family mode */
+	<<if $inbreeding && _kinship[_eligibles[_i].ID] > 0>>
+		<<set _thisKinship = _kinship[_eligibles[_i].ID]>>
+		<<if _thisKinship >= 0.5>>
+			(Extreme 
+		<<elseif _thisKinship >= 0.25>>
+			(Major 
+		<<elseif _thisKinship >= 0.125>>
+			(Some 
+		<<elseif _thisKinship >= 0.0625>>
+			(Minor 
+		<<else>>
+			(Slight 
+		<</if>>
+		inbreeding, CoI of <<print _thisKinship>>)
+	<</if>>
 	</div>
 <</for>>
 <<if (_eligibles.length === 0)>>
diff --git a/src/npc/interaction/passage/fSlaveSlaveDick.tw b/src/npc/interaction/passage/fSlaveSlaveDick.tw
index 31db8f4c7b6fd025d05c7f441aa72e88e82105ce..d97314d7e1c6847c7cd5b0b1082ddc2711c6f180 100644
--- a/src/npc/interaction/passage/fSlaveSlaveDick.tw
+++ b/src/npc/interaction/passage/fSlaveSlaveDick.tw
@@ -8,7 +8,7 @@
 
 <h2>Select an eligible slave</h2>
 
-<<set _eligibles = $slaves.filter((s) => (s.ID != $activeSlave.ID) && isSlaveAvailable(s) && canDoVaginal(s) && canWalk(s) /* amp-amp scene is not written */)>>
+<<set _eligibles = $slaves.filter((s) => (s.ID != $activeSlave.ID) && isSlaveAvailable(s) && canDoVaginal(s) && canStand(s) /* amp-amp scene is not written */)>>
 <<for _i = 0; _i < _eligibles.length; _i++>>
 	<div>
 		<<set _name = SlaveFullName(_eligibles[_i])>>
diff --git a/src/npc/interaction/passage/matchmaking.tw b/src/npc/interaction/passage/matchmaking.tw
index aa3ddabef18811f7f779d6810194757e6430ac9b..1bec089c484638da118a33a951883967a2f4808f 100644
--- a/src/npc/interaction/passage/matchmaking.tw
+++ b/src/npc/interaction/passage/matchmaking.tw
@@ -37,7 +37,7 @@ Their relationship would probably be somewhat artificial at first, and they'd ha
 <<if $seeImages == 1>><br style="clear:both"><</if>>
 
 <br><br>__Put $him with another worshipful <<if getSlave($activeSlave.ID).relationship == -2>>emotionally bonded slave<<else>>emotional slut<</if>>:__
-<<print App.UI.SlaveList.slaveSelectionList(
+<<includeDOM App.UI.SlaveList.slaveSelectionList(
 	s => s.devotion >= 100 && s.relationship === $activeSlave.relationship && s.ID !== $activeSlave.ID,
 	App.UI.SlaveList.SlaveInteract.stdInteract,
 	null,
diff --git a/src/npc/interaction/rename.tw b/src/npc/interaction/rename.tw
deleted file mode 100644
index f6a7679c4d8216239c2f5cb1d2c272a11c20923c..0000000000000000000000000000000000000000
--- a/src/npc/interaction/rename.tw
+++ /dev/null
@@ -1,140 +0,0 @@
-:: Rename [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Slave Interact">>
-<<set $AS = $activeSlave.ID>>
-
-<<if getSlave($AS).slaveName === $oldName && getSlave($AS).slaveSurname === $oldSurname>>
-	<<goto "Slave Interact">>
-<<else>>
-/* First time renaming reaction */
-<<if getSlave($AS).slaveName === "" || ndef getSlave($AS).slaveName>>
-	$oldName needs to be called something on the records, so $oldName $he stays.
-	<<set getSlave($AS).slaveName = $oldName>>
-<<elseif getSlave($AS).fetish == "mindbroken">>
-	<<= getSlave($AS).slaveName>> doesn't even recognize that $he's been renamed. It simply does not register.
-<<elseif ($oldName != getSlave($AS).birthName && getSlave($AS).slaveName == getSlave($AS).birthName) || ($oldSurname != getSlave($AS).birthSurname && getSlave($AS).slaveSurname == getSlave($AS).birthSurname)>>
-	<<= getSlave($AS).slaveName>>
-	<<if getSlave($AS).devotion > 50>>
-		cheerfully accepts $his old name back.
-	<<elseif getSlave($AS).devotion >= -20>>
-		obediently accepts $his old name back.
-	<<elseif getSlave($AS).devotion >= -50>>
-		happily accepts $his original name.
-	<<elseif getSlave($AS).trust > 20>>
-		scoffs at the notion that $he was ever anything other than <<= SlaveFullBirthName(getSlave($AS))>>, @@.orangered;weakening your control over $him.@@
-		<<set getSlave($AS).trust += 5>>
-	<<else>>
-		cautiously accepts the return of $his name.
-	<</if>>
-<<elseif ($oldName == getSlave($AS).birthName && getSlave($AS).slaveName != getSlave($AS).birthName) || ($oldSurname == getSlave($AS).birthSurname && getSlave($AS).slaveSurname != getSlave($AS).birthSurname)>>
-	<<= getSlave($AS).slaveName>>
-	<<if getSlave($AS).devotion > 50>>
-		accepts $his new name cheerfully. This attachment to you @@.hotpink; increases $his devotion.@@
-		<<set getSlave($AS).devotion += 4>>
-	<<elseif getSlave($AS).devotion >= -20>>
-		obediently accepts $his new name. This surrender to you @@.hotpink; increases $his obedience.@@
-		<<set getSlave($AS).devotion += 4>>
-	<<elseif getSlave($AS).devotion >= -50>>
-		reluctantly accepts $his new name.
-	<<else>>
-		angrily tries to resist $his new name, insisting that $his name is <<= SlaveFullBirthName(getSlave($AS))>>. This resistance @@.mediumorchid; increases $his rebelliousness.@@
-		<<set getSlave($AS).devotion -= 5>>
-	<</if>>
-<<else>>
-	Since <<= getSlave($AS).slaveName>> has already had a new name <<if getSlave($AS).devotion > 20>>given to<<else>>forced on<</if>> $him before, the mere fact of having it changed again doesn't really affect $him.
-<</if>>
-
-<<set _insultingName = 0>>
-<<if $oldName != getSlave($AS).slaveName && typeof getSlave($AS).slaveName == "string">>
-	<<set _toSearch = getSlave($AS).slaveName.toLowerCase()>>
-	<<for $i = 0; $i < setup.badWords.length; $i++>>
-		<<if _toSearch.indexOf(setup.badWords[$i]) != -1>>
-			<<set _insultingName = 1>>
-			<<break>>
-		<</if>>
-	<</for>>
-<</if>>
-<<if !_insultingName>>
-	<<if $oldSurname != getSlave($AS).slaveSurname && typeof getSlave($AS).slaveSurname == "string">>
-		<<set _toSearch = getSlave($AS).slaveSurname.toLowerCase()>>
-		<<for $i = 0; $i < setup.badWords.length; $i++>>
-			<<if _toSearch.indexOf(setup.badWords[$i]) != -1>>
-				<<set _insultingName = 1>>
-				<<break>>
-			<</if>>
-		<</for>>
-	<</if>>
-<</if>>
-<<if _insultingName == 1>>
-	<<if getSlave($AS).fetish == "mindbroken">>
-		$His new name would be insulting to a normal $girl, but $he dully accepts that it is an accurate description and goes about $his duties.
-	<<elseif getSlave($AS).devotion < -50>>
-		Being given such a degrading name @@.mediumorchid;further increases $his hatred@@ of you.
-		<<set getSlave($AS).devotion -= 5>>
-	<<elseif getSlave($AS).devotion <= 50>>
-		Being given such a degrading name @@.gold;terrifies $him,@@ since $he thinks it's fair warning for what $he'll suffer in the future.
-		<<set getSlave($AS).trust -= 5>>
-	<</if>>
-<</if>>
-
-/* Wife's surname reaction */
-<<if $oldSurname != getSlave($AS).slaveSurname>>
-	<<if getSlave($AS).relationship >= 5>>
-		<<set _i = $slaveIndices[getSlave($AS).relationshipTarget]>>
-		<<if ndef _i>>@@.red;Error, relationshipTarget not found.@@<</if>>
-		<<if $slaves[_i].slaveSurname>>
-			<<setLocalPronouns $slaves[_i] 2>>
-			<<if getSlave($AS).slaveSurname == $slaves[_i].slaveSurname>>
-				$He's touched that $he now shares a surname with $his _wife2 $slaves[_i].slaveName $slaves[_i].slaveSurname, and is @@.mediumaquamarine;more confident than ever@@ that you intend to keep them together in marital bliss.
-				<<set getSlave($AS).trust += 5>>
-			<<elseif $oldSurname == $slaves[_i].slaveSurname>>
-				$He's concerned that $he no longer shares a surname with $his _wife2 $slaves[_i].slaveName $slaves[_i].slaveSurname, and is @@.gold;very worried@@ that you might be considering splitting them up.
-				<<set getSlave($AS).trust -= 5>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-/* PC's surname reaction */
-<<if $oldSurname != getSlave($AS).slaveSurname>>
-	<<if getSlave($AS).relationship == -3>>
-		<<if $PC.slaveSurname>>
-			<<if getSlave($AS).fetish == "mindbroken">>
-				Names are meaningless to $him and it is unlikely $he'll remember it.
-			<<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>>
-				<<if getSlave($AS).slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he starts to cry. $He tries to get $himself under control and thank you as best $he can, <<if hasAnyArms(getSlave($AS))>>wiping at the tears running down $his <<= getSlave($AS).skin>> cheeks, <</if>>but $he can't seem to stop weeping as $he thanks you over and over. $He's a sex slave, your property, and it's understandable that some doubts about the permanence of $his place as your slave $wife. This has @@.mediumaquamarine;helped reassure $him,@@ and explains the strength of $his emotional reaction. The next time you make love to $him, $he @@.hotpink;presses $himself as close to you as $he can,@@ eager to drink in as much of your presence as $he can get.
-					<<set getSlave($AS).devotion += 5, getSlave($AS).trust += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He's devastated that you'd rename $him something other than your name. $He's @@.gold;terrified@@ that you intend to discard $him as your slave $wife, and @@.mediumorchid;saddened@@ that you would take away something that was precious to $him.
-					<<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>>
-				<</if>>
-			<<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>>
-				<<if getSlave($AS).slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he shows no reaction. You already took everything from $him, what's a name at this point?
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He doesn't care about losing your surname at first, but it quickly sets in that $he may have @@.gold;pushed $his position too far.@@
-					<<set getSlave($AS).trust -= 20>>
-				<</if>>
-			<<elseif getSlave($AS).devotion < -20>>
-				<<if getSlave($AS).slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he pleads with you not to steal $his name. It matters little to you, and $he is forced to @@.hotpink;accept your will.@@
-					<<set getSlave($AS).devotion += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He's @@.mediumorchid;happy@@ to no longer have to share a name with $his tormentor, but the bliss doesn't last long as @@.gold;dread@@ quickly sets in about what this may mean.
-					<<set getSlave($AS).devotion += 5, getSlave($AS).trust -= 10>>
-				<</if>>
-			<<else>>
-				<<if getSlave($AS).slaveSurname == $PC.slaveSurname>>
-					When you tell $him that $he's to be known as <<= getSlave($AS).slaveName>> <<= getSlave($AS).slaveSurname>> now, $he nods with approval feeling @@.mediumaquamarine;that $he may hold at least some value in your eyes.@@
-					<<set getSlave($AS).trust += 5>>
-				<<elseif $oldSurname == $PC.slaveSurname>>
-					$He accepts that you'd rename $him something other than your name. $He's @@.gold;a little scared@@ that you intend to discard $him as your slave $wife, or worse, but realizes this was not only a possibility, but likely.
-					<<set getSlave($AS).trust -= 5>>
-				<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<</if>> /* close new name check */
diff --git a/src/npc/surgery/organFarm.js b/src/npc/surgery/organFarm.js
index 20454e84b151f3e948285185548649209d3ebbe9..fec0a78bd3ace3a06bba19ae1190bb5613820fb3 100644
--- a/src/npc/surgery/organFarm.js
+++ b/src/npc/surgery/organFarm.js
@@ -37,9 +37,10 @@ App.Medicine.OrganFarm.growActions = function(slave) {
 	let wait = [];
 	for (const organ of organOrder) {
 		if (slaveOrgans[organ] === 0) {
-			if (O[organ].canGrow()) {
+			if (O[organ].canGrow(slave)) {
 				grow += `<div>${App.UI.link(O[organ].name, App.Medicine.OrganFarm.growOrgan, [slave, organ], "Remote Surgery")}</div>`;
-				grow += `<div class="detail">Costs ${cashFormat(O[organ].cost)}${O[organ].tooltip !== "" ? ` and ${O[organ].tooltip}` : ""}.</div>`;
+				const tooltip = typeof O[organ].tooltip === "string" ? O[organ].tooltip : O[organ].tooltip(slave);
+				grow += `<div class="detail">Costs ${cashFormat(O[organ].cost)}${tooltip !== "" ? ` and ${tooltip}` : ""}.</div>`;
 			}
 		} else if (slaveOrgans[organ] > 0) {
 			// in growth organs at the end of the list
diff --git a/src/npc/surgery/organs.js b/src/npc/surgery/organs.js
index 467a9747bcd17b0942927548912a6310199621e7..e73f83bec6b9782b98e6c94184eff0546d0d160c 100644
--- a/src/npc/surgery/organs.js
+++ b/src/npc/surgery/organs.js
@@ -216,6 +216,7 @@ App.Medicine.OrganFarm.init = function() {
 
 	new App.Medicine.OrganFarm.Organ({
 		type: "leftEye", name: "Left Eye", cost: 5000, time: 10,
+		tooltip: s => getLeftEyeVision(s) === 2 ? "would not improve this slave" : "",
 		actions: [
 			new App.Medicine.OrganFarm.OrganImplantAction({
 				name: "Implant", healthImpact: 10, surgeryType: "newEyes",
@@ -246,6 +247,7 @@ App.Medicine.OrganFarm.init = function() {
 	});
 	new App.Medicine.OrganFarm.Organ({
 		type: "rightEye", name: "Right Eye", cost: 5000, time: 10,
+		tooltip: s => getRightEyeVision(s) === 2 ? "would not improve this slave" : "",
 		actions: [
 			new App.Medicine.OrganFarm.OrganImplantAction({
 				name: "Implant", healthImpact: 10, surgeryType: "newEyes",
diff --git a/src/personalAssistant/assistant.js b/src/personalAssistant/assistant.js
index 19712cbac6e288288d68d496f898fbbc34304187..848c946ec417d7bf96e5e383c36b1b1dbc983d9c 100644
--- a/src/personalAssistant/assistant.js
+++ b/src/personalAssistant/assistant.js
@@ -6,45 +6,7 @@ globalThis.assistant = (function() {
 	};
 
 	function BC() {
-		function convert(oldVar, variable, value = null) {
-			if (jsDef(V[oldVar])) {
-				if (typeof V[oldVar] !== "number" || (typeof V[oldVar] === "number" && V[oldVar] > 0)) {
-					V.assistant[variable] = value === null ? V[oldVar] : value;
-				}
-			}
-			delete V[oldVar];
-		}
-
-		const object = Object.assign({},
-		{
-		personality: V.assistant,
-		name: V.assistantName,
-		power: V.assistantPower,
-		appearance: V.assistantAppearance,
-		});
-		V.assistant = object;
-		delete V.assistantName; delete V.assistantPower;
-		delete V.assistantAppearance; delete V.assistantPronouns;
-
-		convert('marketAssistantAnnounced', 'market', {});
-		convert('assistantExtra1', 'Extra1');
-		convert('assistantExtra2', 'Extra2');
-		convert('assistantNameAnnounced', 'announcedName');
-		convert('assistantBodyDesire', 'bodyDesire');
-		convert('assistantOptions', 'options');
-		convert('assistantFSOptions', 'fsOptions');
-		convert('assistantFSAppearance', 'fsAppearance');
-
-		if (V.assistant.market) {
-			Object.assign(V.assistant.market,
-			{
-			relationship: V.marketAssistantRelationship,
-			limit: V.marketAssistantLimit,
-			aggressiveness: V.marketAssistantAggressiveness,
-			});
-		}
-		delete V.marketAssistantRelationship; delete V.marketAssistantLimit;
-		delete V.marketAssistantAggressiveness; delete V.marketAssistantPronouns;
+		App.Update.assistantBC();
 	}
 
 	function pronouns() {
@@ -67,20 +29,18 @@ globalThis.assistant = (function() {
 
 	function manage() {
 		V.assistant = V.assistant || {};
-		Object.assign(V.assistant,
-		{
-		personality: V.assistant.personality || 0,
-		name: V.assistant.name || "your personal assistant",
-		power: V.assistant.power || 0,
-		appearance: V.assistant.appearance || "normal",
+		Object.assign(V.assistant, {
+			personality: V.assistant.personality || 0,
+			name: V.assistant.name || "your personal assistant",
+			power: V.assistant.power || 0,
+			appearance: V.assistant.appearance || "normal",
 		});
 
 		if (V.assistant.market) {
-			Object.assign(V.assistant.market,
-			{
-			relationship: V.assistant.market.relationship || "cute",
-			limit: V.assistant.market.limit || 0,
-			aggressiveness: V.assistant.market.aggressiveness || 0,
+			Object.assign(V.assistant.market, {
+				relationship: V.assistant.market.relationship || "cute",
+				limit: V.assistant.market.limit || 0,
+				aggressiveness: V.assistant.market.aggressiveness || 0,
 			});
 		}
 		if (V.week < 18) {
diff --git a/src/personalAssistant/assistantBC.js b/src/personalAssistant/assistantBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7ef8a4f3d827f4f7e055f08f43f047ee0f126f1
--- /dev/null
+++ b/src/personalAssistant/assistantBC.js
@@ -0,0 +1,39 @@
+// @ts-nocheck
+App.Update.assistantBC = function() {
+	function convert(oldVar, variable, value = null) {
+		if (jsDef(V[oldVar])) {
+			if (typeof V[oldVar] !== "number" || (typeof V[oldVar] === "number" && V[oldVar] > 0)) {
+				V.assistant[variable] = value === null ? V[oldVar] : value;
+			}
+		}
+		delete V[oldVar];
+	}
+
+	V.assistant = Object.assign({}, {
+		personality: V.assistant,
+		name: V.assistantName,
+		power: V.assistantPower,
+		appearance: V.assistantAppearance,
+	});
+	delete V.assistantName; delete V.assistantPower;
+	delete V.assistantAppearance; delete V.assistantPronouns;
+
+	convert('marketAssistantAnnounced', 'market', {});
+	convert('assistantExtra1', 'Extra1');
+	convert('assistantExtra2', 'Extra2');
+	convert('assistantNameAnnounced', 'announcedName');
+	convert('assistantBodyDesire', 'bodyDesire');
+	convert('assistantOptions', 'options');
+	convert('assistantFSOptions', 'fsOptions');
+	convert('assistantFSAppearance', 'fsAppearance');
+
+	if (V.assistant.market) {
+		Object.assign(V.assistant.market, {
+			relationship: V.marketAssistantRelationship,
+			limit: V.marketAssistantLimit,
+			aggressiveness: V.marketAssistantAggressiveness,
+		});
+	}
+	delete V.marketAssistantRelationship; delete V.marketAssistantLimit;
+	delete V.marketAssistantAggressiveness; delete V.marketAssistantPronouns;
+};
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index 4efbdaf320adf2e8d164496d3c6f4216be6eab5f..fe3b61163ee21ecd9c20c22885b90b8f8fec363c 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -1991,6 +1991,8 @@ App.Entity.PlayerState = class PlayerState {
 		 *
 		 * 0: no; 1: yes */
 		this.staminaPills = 0;
+		/** Player's coefficient of inbreeding */
+		this.inbreedingCoeff = 0;
 	}
 
 	/** Creates an object suitable for setting nested attributes as it would be a SlaveState
diff --git a/src/pregmod/FCTV/FCTV.js b/src/pregmod/FCTV/FCTV.js
index 9522066b5ae09a4dcb500d177fa9f6498f12cad7..fe503e7d1e70f0a2214b99dacf47f3a484868686 100644
--- a/src/pregmod/FCTV/FCTV.js
+++ b/src/pregmod/FCTV/FCTV.js
@@ -17,7 +17,7 @@ weekEnabled - The week FCTV was installed.
 globalThis.FCTV = (function() {
 	return {
 		channels: channels,
-		manage: manage,
+		initChannels: initChannels,
 		showChannel: showChannel,
 		incrementChannel: incrementChannel,
 		incrementShow: incrementShow,
@@ -30,35 +30,10 @@ globalThis.FCTV = (function() {
 		return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
 	}
 
-	function manage() {
-		function convert(a, b) {
-			return V.FCTVreceiver ? a : b;
-		}
-		delete V.FCTVenable;
-
-		V.FCTV.receiver = V.FCTV.receiver > -1 ? V.FCTV.receiver : -1;
-		if (convert && V.receiverAvailable) {
-			V.FCTV.receiver = V.FCTVreceiver > 0 ? V.FCTVreceiver : 0;
-		}
-
-		if (V.FCTV.receiver > -1) {
-			V.FCTV.channel = V.FCTV.channel || {};
-			V.FCTV.pcViewership = V.FCTV.pcViewership || {};
-
-			for (let i = 0; i < channels().length; i++) {
-				let channel = num(channels()[i], true);
-				let currentChannel = 'show' + capFirstChar(channel);
-				V.FCTV.channel[channel] = convert(V[currentChannel], V.FCTV.channel[channel]) || 0;
-			}
-			V.FCTV.channel.last = convert(V.lastShow, V.FCTV.channel.last) || -1;
-
-			V.FCTV.pcViewership.count = convert(V.FCTVcount, V.FCTV.pcViewership.count) || 0;
-			V.FCTV.pcViewership.frequency = convert(V.FCTVrate, V.FCTV.pcViewership.frequency) || 4;
-			V.FCTV.remote = convert(V.FCTVremote, V.FCTV.remote) || 0;
-
-			if (V.FCTVreceiver && !V.FCTV.weekEnabled) {
-				V.FCTV.weekEnabled = V.receiverAvailable > 1 ? V.receiverAvailable : 0;
-			}
+	function initChannels() {
+		const channelList = FCTV.channels();
+		for (let i = 0; i < channelList.length; i++) {
+			V.FCTV.channel[num(channelList[i], true)] = 0;
 		}
 	}
 
diff --git a/src/pregmod/FCTV/FCTVBC.js b/src/pregmod/FCTV/FCTVBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..820799a07febba8717bc81f9a6f65bd95edfe932
--- /dev/null
+++ b/src/pregmod/FCTV/FCTVBC.js
@@ -0,0 +1,34 @@
+
+// @ts-nocheck
+App.Update.FCTV = function() {
+	function convert(a, b) {
+		return V.FCTVreceiver ? a : b;
+	}
+
+	function initChannels() {
+		const channelList = FCTV.channels();
+		for (let i = 0; i < channelList.length; i++) {
+			const channel = num(channelList[i], true);
+			const currentChannel = 'show' + capFirstChar(channel);
+			V.FCTV.channel[channel] = convert(V[currentChannel], V.FCTV.channel[channel]) || 0;
+		}
+	}
+
+	V.FCTV = V.FCTV || {};
+	V.FCTV.receiver = V.FCTV.receiver > -1 ? V.FCTV.receiver : -1;
+	if (convert && V.receiverAvailable) {
+		V.FCTV.receiver = V.FCTVreceiver > 0 ? V.FCTVreceiver : 0;
+	}
+	V.FCTV.pcViewership = V.FCTV.pcViewership || {};
+	V.FCTV.channel = V.FCTV.channel || {};
+	initChannels();
+	V.FCTV.channel.last = convert(V.lastShow, V.FCTV.channel.last) || -1;
+
+	V.FCTV.pcViewership.count = convert(V.FCTVcount, V.FCTV.pcViewership.count) || 0;
+	V.FCTV.pcViewership.frequency = convert(V.FCTVrate, V.FCTV.pcViewership.frequency) || 4;
+	V.FCTV.remote = convert(V.FCTVremote, V.FCTV.remote) || 0;
+
+	if (V.FCTVreceiver && !V.FCTV.weekEnabled) {
+		V.FCTV.weekEnabled = V.receiverAvailable > 1 ? V.receiverAvailable : 0;
+	}
+};
diff --git a/src/pregmod/widgets/bodyswapWidgets.tw b/src/pregmod/widgets/bodyswapWidgets.tw
index ee9c226b664eca66be129389643e7659a3df1411..4a1ed4eeac6e86a66b17cdfda37e3e0ba63d4cd4 100644
--- a/src/pregmod/widgets/bodyswapWidgets.tw
+++ b/src/pregmod/widgets/bodyswapWidgets.tw
@@ -164,6 +164,7 @@
 <<set $args[0].albinismOverride = $args[1].albinismOverride>>
 <<set $args[0].clone = $args[1].clone>>
 <<set $args[0].cloneID = $args[1].cloneID>>
+<<set $args[0].inbreedingCoeff = $args[1].inbreedingCoeff>>
 
 <<set $args[0].canRecruit = 0>>
 
diff --git a/src/pregmod/widgets/pregmodBirthWidgets.tw b/src/pregmod/widgets/pregmodBirthWidgets.tw
index 4ccce545607c43f0d34433a396aa71061ee9c387..399c764a95e788f0c718bea3e4b3b5fd59547660 100644
--- a/src/pregmod/widgets/pregmodBirthWidgets.tw
+++ b/src/pregmod/widgets/pregmodBirthWidgets.tw
@@ -1782,7 +1782,7 @@
 	<<if _S.Nurse>>
 		<<setLocalPronouns _S.Nurse 2>>
 	<</if>>
-	$slaves[$i].slaveName is in the perfect place to give birth when $his body begins to push out another of $his brood. <<if _S.Nurse != 0>>_S.Nurse.slaveName<<else>>A freelance nurse<</if>> delivers $his child before taking them away. Before long _he2 returns to attend to _his2 patient's perpetual pregnancy.
+	$slaves[$i].slaveName is in the perfect place to give birth when $his body begins to push out another of $his brood. <<if _S.Nurse>>_S.Nurse.slaveName<<else>>A freelance nurse<</if>> delivers $his child before taking them away. Before long _he2 returns to attend to _his2 patient's perpetual pregnancy.
 
 <<case "be confined in the cellblock">>
 	<<if $slaves[$i].fetish == "mindbroken">>
diff --git a/src/pregmod/widgets/seBirthWidgets.tw b/src/pregmod/widgets/seBirthWidgets.tw
index c1872443110e79ad8c2af4a48f0e5c0a2143047c..5285e60e86fdfa52cad050540f3c481d849f30b8 100644
--- a/src/pregmod/widgets/seBirthWidgets.tw
+++ b/src/pregmod/widgets/seBirthWidgets.tw
@@ -123,8 +123,14 @@
 <<if $slaves[$i].induce == 1>>
 	<<set $suddenBirth += 20>>
 <</if>>
-<<if !canWalk($slaves[$i])>>
+<<if !canMove($slaves[$i])>>
 	<<set $suddenBirth += 10>>
+<<elseif !canWalk($slaves[$i])>>
+	<<if $slaves[$i].rules.mobility == "permissive">>
+		<<set $suddenBirth += 3>>
+	<<else>>
+		<<set $suddenBirth += 5>>
+	<</if>>
 <</if>>
 <<if $slaves[$i].fetish == "mindbroken">>
 	<<set $suddenBirth += 18>>
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index c329fb85147aa907f74ad3eb2617c066d3a8b5c1..10e19f5afddcd26d16e242004e15cf1f133c94c5 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -44,7 +44,7 @@
 <<set _clothesTemp = $activeSlave.clothes>>
 <<switch $RESSevent>>
 /*Some events start with the slave naked (any event that starts with the daily inspection, for example). Here we switch their clothing just for the image to load, then switch it back quickly so the player's choice is not messed up.*/
-<<case "age implant" "ara ara" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "confident tanning" "devoted educated slave" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "im scared" "implant inspection" "kitchen molestation" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">>
+<<case "age implant" "ara ara" "back stretch" "bad dream" "bed snuggle" "bondage gear" "bonded love" "breast expansion blues" "confident tanning" "devoted educated slave" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "devoted shortstack" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "kitchen molestation" "language lesson" "mindbroken morning" "modest clothes" "mods please" "old PC age difference" "orchiectomy please" "PA flirting" "penitent" "permitted masturbation" "plimb help" "rebellious arrogant" "resistant gelding" "resistant shower" "resting amp" "restricted profession" "restricted smart" "sexy succubus" "shaped areolae" "shift masturbation" "shift sleep" "shower slip" "slave clit on slave" "slave dick huge" "slave dick on slave" "sleeping ambivalent" "sore shoulders" "spa boobs" "subjugation blues" "tendon fall" "terrified inspection" "tittymonster inspection" "torpedo squeeze" "transition anxiety" "trusting HG" "unhappy virgin" "used whore" "vocal disobedience" "young PC age difference">>
 	<<set $activeSlave.clothes = "no clothing">>
 <<case "whore rebellious">>
 	/* this scene states they are wearing "thick, durable latex with temperature regulation and anchor points for restraint" no matter what they are assigned to wear. */
@@ -3262,95 +3262,6 @@ against the edge of the counter as $he leans forward a little to <<if $activeSla
 
 It's been <<print $week-$activeSlave.weekAcquired>> week<<if $week-$activeSlave.weekAcquired > 1>>s<</if>> since you acquired <<= App.UI.slaveDescriptionDialog($activeSlave)>> as your slave. Since then $he has been nothing but trouble. $He has been ungrateful, rebellious and particularly hateful toward you since you acquired $him. $He often needs to be confined or forced to perform $his assignments, and has little regard for your power or authority. You bring $him in for inspection and $he whines and squirms in resistance as you feel up $his $activeSlave.nipples nipples<<if $activeSlave.belly >= 5000>>, rub $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly<<elseif $activeSlave.bellyPreg >= 150>>, feel the curve of $his new pregnancy<</if>>, and grope $his <<if $activeSlave.butt < 2>>narrow <<elseif $activeSlave.butt < 5>>average <<elseif $activeSlave.butt < 8>>plump <<else>>impressive <</if>>butt, coldly appraising $his potential worth as a sexual service provider. <<if $activeSlave.actualAge < 21>>$He is very young, only $activeSlave.actualAge years old, and is still very naïve. $His smooth, $activeSlave.skin skin has yet to experience the hard years of relentless sexual abuse that lie ahead of $him.<<else>>At $activeSlave.actualAge years old, $he should know by now how the world works, but some slaves are just too stubborn for their own good.<</if>> Eventually, of course, even the most headstrong <<print $girl>>s will bend to your will, but the unique social mores of your arcology and the wonders of modern surgical technology offer a prime opportunity to make a potent example of this <<if $activeSlave.actualAge < 21>>young <<else>>obstinate <</if>>slut. $He is $activeSlave.race, and therefore not considered racially inferior or subject to extreme inequities or neglect, but like most slave characteristics, that can change.
 
-<<case "too thin for cum diet">>
-
-You are in your office, tending to the tedious business of requisition orders for your penthouse when you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> appear outside your door. $He hovers outside in the hall, peeking $his head around the entry-way, looking very unsure about disturbing you. You stop what you're doing and call $him in. $He's reticent at first, but then $he obediently steps into your office. $He is
-<<if $activeSlave.clothes == "no clothing">>
-	forced to remain naked at all times, and the most striking thing about $his body is how
-	<<if $activeSlave.belly >= 100000>>
-		$his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>distended belly<</if>> utterly dwarfs $his skinny body.
-	<<elseif $activeSlave.belly >= 15000>>
-		$his <<if $activeSlave.bellyPreg >= 3000>>full pregnancy<<else>>hugely distended belly<</if>> completely dominates $his skinny body.
-	<<elseif $activeSlave.belly >= 10000>>
-		$his <<if $activeSlave.bellyPreg >= 3000>>advanced pregnancy<<else>>hugely distended belly<</if>> dominates $his skinny body.
-	<<elseif $activeSlave.belly >= 5000>>
-		massive $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>distended<</if>> belly is compared to $his skinny body.
-	<<elseif $activeSlave.belly >= 1500>>
-		noticeable <<if $activeSlave.bellyPreg > 0>>$his growing pregnancy<<else>>the curve of $his belly<</if>> is against $his skinny body.
-	<<elseif $activeSlave.belly >= 150>>
-		noticeable <<if $activeSlave.bellyPreg > 0>>$his early pregnancy<<else>>the curve of $his implant<</if>> is against $his skinny body.
-	<<else>>
-		skinny $he is.
-	<</if>>
-<<else>>
-	forced to wear $activeSlave.clothes all day, but even through $his outfit, it's easy to see how
-	<<if $activeSlave.belly >= 100000>>
-		$his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnancy<<else>>distended belly<</if>> utterly dwarfs $his skinny body.
-	<<elseif $activeSlave.belly >= 15000>>
-		$his <<if $activeSlave.bellyPreg >= 3000>>heavy pregnancy<<else>>hugely distended belly<</if>> completely dominates $his skinny body.
-	<<elseif $activeSlave.belly >= 10000>>
-		$his <<if $activeSlave.bellyPreg >= 3000>>advanced pregnancy<<else>>hugely distended belly<</if>> dominates $his skinny body.
-	<<elseif $activeSlave.belly >= 5000>>
-		massive $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>distended<</if>> belly is compared to $his skinny body.
-	<<elseif $activeSlave.belly >= 1500>>
-		noticeable <<if $activeSlave.bellyPreg > 0>>$his growing pregnancy<<else>>the curve of $his belly<</if>> is against $his skinny body.
-	<<elseif $activeSlave.belly >= 150>>
-		noticeable <<if $activeSlave.bellyPreg > 0>>$his early pregnancy<<else>>the curve of $his implant<</if>> is against $his skinny body.
-	<<else>>
-		impossibly skinny $he is.
-	<</if>>
-<</if>>
-<<if $activeSlave.weight > -80>>
-	$He's not exclusively skin and bones, but $he's close.
-<<else>>
-	$He's so thin that $he doesn't look entirely healthy.
-<</if>>
-$His
-<<if $activeSlave.boobs < 600>>
-	<<if $activeSlave.boobs < 300>>
-		tiny
-	<<elseif $activeSlave.boobs < 600>>
-		small
-	<</if>>
-	boobs are barely noticeable
-	<<if $activeSlave.belly >= 5000>>
-		above $his bloated
-	<<else>>
-		against $his concave
-	<</if>>
-	tummy, and
-	<<if $arcologies[0].FSSlimnessEnthusiast != "unset">>
-		that can be a very appealing look given the predilection your arcology has for slim <<= $girl>>s.
-	<<else>>
-		to most clients, this makes $him a less appealing whore.
-	<</if>>
-<<else>>
-	<<if $activeSlave.boobs < 900>>
-		large
-	<<else>>
-		massive
-	<</if>>
-	tits are a sharp contrast to $his
-	<<if $activeSlave.belly >= 150>>
-		thin, bloated frame,
-	<<else>>
-		concave belly,
-	<</if>>
-	and although impressive, they seem to especially stick out on a $girl who, in all other ways, seems
-	<<if $activeSlave.weight > -80>>
-		slightly
-	<<else>>
-		alarmingly
-	<</if>>
-	malnourished.
-<</if>>
-$His $activeSlave.faceShape face is clearly conflicted, and <<if canSee($activeSlave)>>$his <<= App.Desc.eyesColor($activeSlave)>> shift<<else>>$he glances about<</if>> with nervous energy. $He is clearly unsure whether $he should say what $he came here to say.
-<br><br>
-When you finally ask $him what $he wants, $he hesitates for a moment and then suddenly seems to gain $his courage<<if $activeSlave.accent > 1>>, speaking in an atrociously thick accent<<elseif $activeSlave.accent > 0>>, speaking in a cute little accent<</if>>.
-"Plea<<s>>e, <<Master>> I'm <<s>>o hungry! It <<s>>eem<<s>> like all I get to eat i<<s>> cum. It'<<s>> di<<s>>gu<<s>>ting! Plea<<s>>e! I have to eat <<s>>o much of it. Can I be allowed to eat regular food again? Plea<<s>>e, <<Master>>, I'm <<s>>o hungry. I need real food!"
-<br><br>
-It's true, cum <<if $activeSlave.dietCum == 1>>supplemented <<elseif $activeSlave.dietCum == 2>>based <</if>>food can be hard on <<print $girl>>s who are not fully habituated to being toys for sexual amusement — particularly when you've ordered them to gain weight on it. You look at the<<if $activeSlave.belly >= 1500>> gravid,<</if>> skinny whore and consider your options.
-
 <<case "transition anxiety">>
 
 <<= App.UI.slaveDescriptionDialog($activeSlave)>> stumbles into your office naked for $his weekly inspection, so apprehensive that $he can hardly walk. $He's been like this ever since $he became one of your sex slaves, <<if $week-$activeSlave.weekAcquired == 0>>just this week<<elseif $week-$activeSlave.weekAcquired == 1>>just last week<<else>><<print $week-$activeSlave.weekAcquired>> weeks ago<</if>>. It's not surprising; slaves like $him usually require some time and training to accept that they're slavegirls. $He lacks the natural attraction to men that might have made the idea more comfortable for $him, and the resulting sexual anxiety combined with understandable fear of sexual use makes $him extremely unhappy to be naked in front of someone $he knows can fuck $him at will.
@@ -3412,31 +3323,6 @@ $He continues in $his <<if $activeSlave.voice == 1>>deep<<elseif $activeSlave.vo
 <</switch>>
 May I?" $He spins, <<if $activeSlave.belly >= 5000>>spreading $his legs for $his _belly <<if $activeSlave.bellyPreg >= 3000>>pregnant <</if>>belly while <</if>>bending at the waist<<if $activeSlave.butt > 6>> and prising $his monstrous buttocks apart<<elseif $activeSlave.butt > 3>> spreading $his healthy buttocks<</if>> to reveal $his gaping anus. It could indeed benefit from surgical repair.
 
-<<case "passing declaration">>
-
-As you manage your empire from your office, a constant traffic of slaves passes by its door. The glass walls allow a good view of them, and since you naturally own what you find appealing, the passing chattel often draws your eye. For example, this morning you notice <<= App.UI.slaveDescriptionDialog($activeSlave)>> almost bounce into view. $He's physically fit, at a healthy weight,
-<<if $activeSlave.belly >= 10000>>
-	<<if $activeSlave.bellyPreg >= 3000>>
-		heavily pregnant,
-	<<elseif $activeSlave.bellyImplant >= 3000>>
-		despite $his _belly fake belly,
-	<<else>>
-		completely full of $activeSlave.inflationType,
-	<</if>>
-<</if>>
-<<if $activeSlave.physicalAge > 35>>
-	and is getting such excellent modern medical care that despite $his age, $he has the energy of a teenager.
-<<elseif $activeSlave.physicalAge > 19>>
-	is full of youth and vigor, and is in truly perfect health due to the miracles of modern medicine.
-<<elseif $activeSlave.physicalAge > 12>>
-	and is a teenager, not to mention the perfect health $he owes to the miracles of modern medicine.
-<<else>>
-	and is a little $girl, not to mention the perfect health $he owes to the miracles of modern medicine.
-<</if>>
-<<if $activeSlave.energy > 95>>Apart from $his absurd sex drive<<elseif $activeSlave.energy > 40>>In addition to $his very healthy libido<<else>>Despite $his mediocre libido<</if>>, $he's overflowing with energy. $He half-runs, half-skips down the hallway, slowing in the doorway as $he feels your gaze. Without stopping, $he turns to meet your eyes, winks trustingly, and bursts out, "Hi <<Master>>! Love you!" Then $he continues on $his merry way.
-<br><br>
-Someone's a happy $desc today.
-
 <<case "ara ara">>
 
 Passing by the kitchen in the morning, you take a moment to listen to the low hum of your slaves chatting as they <<if $feeder != 0>>wait their turn at the phallic feeders<<else>>drink their breakfasts<</if>>. <<= App.UI.slaveDescriptionDialog($activeSlave)>> is nearest the door, and you overhear $his <<if $activeSlave.voice == 1>>low<<elseif $activeSlave.voice == 2>>pretty<<else>>high<</if>> voice clearly as $he expresses confusion to another slave. "I don't under<<s>>tand it," $he <<say>>s. "Why are <<s>>o many men intere<<s>>ted in an old <<s>>lave like me? I never got thi<<s>> much attention when I wa<<s>> free! Now <<if $activeSlave.assignment == "whore" || $activeSlave.assignment == "work in the brothel">>guy<<s>> line up to pay<<else>>every guy I approach want<<s>><</if>> to fuck me!"
@@ -3504,27 +3390,6 @@ I didn't mean to <<s>>ound con<<c>>eited, either. I gue<<ss>> I'm <<s>>till gett
 	<<set $activeSlave.fetishKnown = 1>>
 <</if>>
 
-<<case "im scared">>
-
-During $his weekly inspection, <<= App.UI.slaveDescriptionDialog($activeSlave)>> has trouble following the routine orders that position $him so you can examine $his body. The cause is not difficult to determine: $he's so cripplingly terrified that $he's having difficulty functioning. $He seems to be trying to obey you, but $he's so scared that $his mind is having trouble translating your simple verbal commands into physical obedience. You ask $him what $he's so frightened of. The question stuns $him, and $he <<if canSee($activeSlave)>>stares at<<else>>faces<</if>> you in mute horror, looking even more terrified than $he has up to this point and completely devoid of any idea how to respond. You order $him to respond, and this starts $him out of $his fugue. $He begins to cry, makes two false starts, sobs, and then begins forcing out words.
-<br><br>
-"E-e-everything," $he cries. "I'm <<s>>-<<s>>o <<s>>-<<s>>orry b-but I c-can't help," $he chokes on a sob and hiccups, "help it. Thi<<s>>, thi<<s>> pla<<c>>e, being a <<s>>e<<x>> <<s>>lave,
-<<switch $activeSlave.rules.punishment>>
-<<case "confinement">>b-being <<sh>>-<<sh>>ut up in the d-dark
-<<case "whipping">>b-being wh-wh-whip-ped
-<<case "chastity">>h-having my p-part<<s>> locked up in ch-cha<<s>>tity
-<<default>>n-never knowing what th-the p-puni<<sh>>ment will be
-<</switch>>
-wh-when I'm bad, e-everything, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>. Oh, oh, I'm <<s>>orry, p-plea<<s>>e, I'm <<s>>orry I, I'm like thi<<s>>, I'm crying, p-plea<<s>>e <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>, plea<<s>>e don't..." $He trails off, giving you a look of supplication.
-
-<<case "frightening dick">>
-
-In a fortuitous confluence of circumstances, <<= App.UI.slaveDescriptionDialog($activeSlave)>> happens to be polishing your office one evening. Keeping every surface in the penthouse at a state of perfect shine is one of your servants' endless tasks, and your office is $his area of responsibility today. At the key moment, $he's working on an area at waist height, directly next to the door that leads to your suite; and $he's crouching to polish this area most comfortably. $He is working diligently, and is paying close attention to what $he's doing. Meanwhile, and for completely unrelated reasons, you have just finished having fun inside said suite. You are naked, and your penis remains fully erect despite your having climaxed only moments before; you are in excellent physical and sexual condition and this happens frequently. You have decided to address a likewise unrelated matter in your office, and walk into it from your suite, naked and erect.
-<br><br>
-This is how $activeSlave.slaveName comes face to face with your cock, unexpectedly, at a distance of only a few <<if $showInches == 2>>inches<<else>>centimeters<</if>>.
-<br><br>
-$He shrieks, backpedaling, and then falls backward, $his <<if $activeSlave.butt > 6>>monstrous bottom<<elseif $activeSlave.butt > 3>>healthy rear end<<else>>cute butt<</if>> hitting the floor with an audible whack. The light cloth $he was using to polish with went flying, and flutters to the ground accusingly. After scrabbling back a short distance, looking up at you hesitantly, and visibly recollecting $himself, $he swallows twice and then says, "I'm <<s>>orry, <<Master>>," in a tone of voice with a great deal of effort applied to keep it even. A frantic, embarrassed search for $his cloth ensues. Finding it at last, $he returns to $his original, low position, and crouch-walks back to the place $he was polishing, doing $his absolute best to look diligent and industrious and not at all aware that your cock is pointing at $him like a gun barrel.
-
 <<case "arcade sadist">>
 
 You happen to come across <<= App.UI.slaveDescriptionDialog($activeSlave)>> during one of $his rest periods. $He's lying on a couch in the slave areas, <<if canSee($activeSlave)>>staring at the ceiling above $him<<else>>leaning back<</if>> with a dreamy expression on $his face. $He's <<if $activeSlave.rules.release.masturbation == 1>>touching $himself idly.<<else>>not allowed to touch $himself, but $he's extremely aroused.<</if>> Whatever's on $his mind, it's so absorbing that $he doesn't realize you're there until you're standing over $him.
@@ -16230,80 +16095,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<</replace>>
 <</link>>
 
-<<case "too thin for cum diet">>
-
-<<link "Give the poor $girl a break and take $him off $his cum diet so $he can safely get to a healthier weight">>
-	<<replace "#result">>
-		You silently appraise <<print $activeSlave.slaveName>>'s desperate face and lean forward in your chair to check your terminal. You confirm that
-		<<if $activeSlave.dietCum == 1>>
-			$his food is supplemented with cum for flavor.
-		<<else>>
-			$he is being fed significant amounts of ejaculate.
-		<</if>>
-		While $his <<if $activeSlave.dietCum == 2>>extreme <</if>>diet is still engineered to <<if $activeSlave.dietCum == 2>>barely <</if>> provide the nutrition $he needs, if $he can't hold the stuff down, $he can't gain weight<<if $activeSlave.pregKnown == 1 && $activeSlave.preg > $activeSlave.pregData.normalBirth/4>>, even more so with $his growing child<<if $activeSlave.pregType > 1>>ren<</if>> taking whatever nutrients <<if $activeSlave.pregType > 1>>they<<else>>it<</if>> can<</if>>. With a few taps on the keyboard you change $his orders so that $he will be fed a much more nutritionally rich diet that is free of ejaculate. However, you make sure to warn $him that $assistant.name will be monitoring $him, and you may change your mind once $he reaches a more attractive weight. $He thanks you profusely, <<if $activeSlave.vagina != 0>>even attempting to offer $his body for use in gratitude,<</if>> but you simply send $him away. You find yourself concerned that you are becoming soft by allowing slaves to dictate what they will and won't eat, but your benevolent decision has already had a @@.hotpink;positive effect on $his attitude.@@ $He @@.mediumaquamarine;trusts you a little more@@ too.
-		<<set $activeSlave.trust += 2, $activeSlave.devotion += 2, $activeSlave.dietCum = 0>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave)>>
-	<br><<link "Give the emaciated slut your answer in the form of a rough butt-fuck">>
-		<<replace "#result">>
-			You stand up behind your desk. $He flinches, but holds $his ground, $his lip quivering slightly. You slowly walk toward $him, appraising $his <<if $activeSlave.belly >= 100>>bloated<<else>>smooth<</if>>, skinny body, touching $his shoulder as you disappear behind $him. $He starts to cry as you
-			<<if $PC.dick == 0>>
-				pull a massive rubber dong attachment off the wall and hook it to your strap-on.
-			<<else>>
-				unbuckle your pants and let $him feel your warm dick harden against $his tight, bony thigh.
-			<</if>>
-			Without word or ceremony, you shove $him forward so that $he is bent over and crushed against your desk. The tears start to flow out of $him as $he feels your <<if $PC.dick == 0>>massive rubber dong <<else>>hard, thick cock <</if>>pressing against $his unprotected anus.
-			<br><br>
-			When you offer $him the opportunity to revise $his request, $he does. "Plea<<s>>e, <<Master>>! I'm <<s>>orry! Plea<<s>>e don't fuck my a<<ss>>! I'll eat all the cum you want! Plea<<s>>e!" $He screams <<if $activeSlave.accent > 1>>in $his thick accent <</if>> as you force your<<if $PC.dick == 0>> strap-on <<else>>self <</if>> inside $his butt-hole and subdue $his weak, struggling body against your unforgiving desk. @@.gold;Horrified tears@@ stream down $his face with each brutal thrust as you speak into $his ear and remind $him that slaves are not allowed to dictate their needs to their owners. You know what's best for $him, and right now, $his proper role is as an eager little depository for the products of the free-cities ejaculate market. It's $his job to suck down cum at the whim of $his owner, plain and simple, until $he's told otherwise. You butt-fuck the cum-fed slag until $he simply lays there and accepts $his corrective assrape.
-			<<if $activeSlave.anus == 0>>
-				@@.lime;$His@@
-				<<if $activeSlave.butt < 5>>
-					@@.lime;skinny little@@
-				<<else>>
-					@@.lime;plump little@@
-				<</if>>
-				@@.lime;ass is now broken in.@@
-			<</if>>
-			$He sobs quietly with each thrust of your hips, and when you finally <<if $PC.dick != 0>>make yet another cum deposit into $his <<if $activeSlave.weight < -80>>emaciated <<else>>bony <</if>>body and<</if>> pull out, you instruct
-			<<if $activeSlave.dietCum == 1>>
-				$assistant.name to dramatically increase the amount of cum in $his diet from now on. You won't have a slave telling you what $he eats. $activeSlave.slaveName <<if canHear($activeSlave)>>hears your instructions <<else>>correctly guesses the meaning behind your body language <</if>>and whimpers before rubbing $his sore bottom and
-			<<else>>
-				another slave to drag the broken slut to the kitchen, where $he's to receive an additional feeding of thick, creamy ejaculate-based nutrients before
-			<</if>>
-			proceeding to $his next assignment.
-			<br><br>
-			$He's learned a valuable lesson about what it truly means to be a slave today, and it's one $he @@.orchid;won't soon forget.@@
-			<<set $activeSlave.devotion -= 5, $activeSlave.trust -= 5>>
-			<<if ($activeSlave.anus == 0)>>
-				<<set $activeSlave.anus += 1>>
-			<</if>>
-			<<= VCheck.Anal()>>
-			<<if $activeSlave.dietCum == 1>>
-				<<set $activeSlave.dietCum = 2, $activeSlave.dietMilk = 0>>
-			<</if>>
-		<</replace>>
-	<</link>><<if ($activeSlave.anus == 0) || ($activeSlave.dietMilk == 1)>> //This option will//<<if $activeSlave.anus == 0>> //take anal virginity//<<if $activeSlave.dietMilk == 1>>// and//<</if>><</if>><<if $activeSlave.dietMilk == 1>>// remove milk from $his diet//<</if>><</if>>
-<</if>>
-<br><<link "Use aphrodisiacs and positive reinforcement to make $his cum diet more palatable">>
-	<<replace "#result">>
-		You do a quick check at your terminal. $He is indeed being fed <<if $activeSlave.dietCum == 1>> food that is supplemented with cum for flavor.<<else>>large amounts of human ejaculate.<</if>> You tell $him that it can't be helped. When you assign a slave $his diet, it's for a reason, and in <<print $activeSlave.slaveName>>'s case, you are using $his diet to make $him into a better whore. By the look on $his distressed face, you can tell $he doesn't understand or appreciate your perspective, but you tell $him you have just the thing to help change $his outlook.
-		<br><br>
-		You pull out a heavy dose of aphrodisiacs from the drawer in your desk. They are expensive, but powerful drugs that can be used in a brute force way to manipulate the sexual urges and tastes of even the most frigid sluts. The mild dose included in every slave's food is usually enough to affect a slow, inevitable change in attitude for resistant slaves, but sometimes a more acute dose can be an amusing way to turn disgust into dependence. $activeSlave.slaveName shivers as you reassure $him and inject $his <<if $activeSlave.weight < -80>>bony <<else>>tiny <</if>>body with the powerful drugs. You know they are working when $he begins to perspire a little, and
-		<<if $activeSlave.vagina > -1>>
-			$he starts to leak fresh girl-juice down $his shivering thighs.
-		<<elseif $activeSlave.dick == 0>>
-			starts to turn instinctively to offer you $his only hole.
-		<<else>>
-			$his dick starts to come to attention.
-		<</if>>
-		You then book $him to be the main attraction at a corporate office party that afternoon, where $he will be the target of a blow-bang and bukkake. You see that $he's dosed heavily with the drugs every day this week, and then book the rest of $his afternoons for similar duties, making sure $he still tends to $his regular assignments as well. In the meantime, you also instruct the kitchen that $he is to eat as much cum-based food from the dispensers as $he can suck down in order to fuel up for these exhausting escapades. By the end of the week, the aphrodisiacs and $his slide into an inescapable routine of cum immersion have done their job, and $he has begun to @@.lightcoral;view cum as an inevitable component of $his daily life.@@ $He also manages to @@.green;gain a little weight.@@ Thanks to your manipulation of $his Pavlovian responses through extreme drug therapy, $his @@.red;health has suffered a bit,@@ but $he is also @@.hotpink;more dependent on you@@ thanks to $his <<if $activeSlave.addict == 0>>@@.cyan;new@@<<else>>@@.cyan;developing@@<</if>> @@.cyan;addiction to aphrodisiacs.@@
-		<<set $activeSlave.devotion += 5, $activeSlave.weight += 10, $activeSlave.fetish = "cumslut", $activeSlave.fetishKnown = 1,	$activeSlave.fetishStrength = 10, $activeSlave.addict += 1>>
-		<<run seX($activeSlave, "oral", "public", "penetrative", 50)>>
-		<<run healthDamage($activeSlave, 10)>>
-	<</replace>>
-<</link>>
-
 <<case "transition anxiety">>
 
 <<if canDoAnal($activeSlave)>>
@@ -16729,121 +16520,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<</link>>
 <</if>>
 
-<<case "passing declaration">>
-
-<<link "Follow $him">>
-	<<replace "#result">>
-		$His sheer 'joie de vivre' is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where $he's going, so you catch up quickly. $He gives you the careful measuring glance of a devoted sex slave who's checking whether $his owner wants to fuck $him right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction $he was going, and $he follows. "<<Master>>," $he <<say>>s hesitantly, "I hope that wa<<s>> an okay thing for me to do." You assure $him it was. "Thank<<s>>, <<Master>>," $he beams, grinning like an idiot. Smiling at $his infectious enthusiasm for life, you ask $him why $he's so happy this morning. $He looks momentarily perplexed<<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>, not a common look for a slave as smart as $him<</if>>. "I don't know! I just woke up thi<<s>> morning feeling really, really good. <<if $activeSlave.intelligence+$activeSlave.intelligenceImplant > 50>>I'm sure the fact that I'm benefiting from incredibly advanced medi<<c>>ine ha<<s>> <<s>>omething to do with it; thank you very much for that, <<Master>>. Other than that,<</if>>
-		I ju<<s>>t feel happy." This has to be some sort of milestone for $him, and for you, and maybe for slavery in general: if $he can be this pleased with life, something must be going right. You walk $him to where $he's going
-		<<switch $activeSlave.assignment>>
-		<<case "whore">>(one of the arcology's nicer streets, where $he'll spend the day selling $his body),
-		<<case "serve the public">>(one of the arcology's nicer streets, where $he'll spend the day flirting with citizens and having sex with anyone that's willing),
-		<<case "work a glory hole">>(a wall mounting that will render $him a helpless target for dicks all day),
-		<<case "get milked">>($his favorite milker in the penthouse),
-		<<case "take classes">>(a quiet area with a touchscreen where $he can review material from the slave etiquette class $he's working on),
-		<<case "please you">>(the wardrobe, where $he'll get dressed before attending to you for the rest of the day),
-		<<case "be a subordinate slave">>(the living area of the slave $he's been assigned to serve),
-		<<case "be a servant">>(the closet that contains the cleaning items $he'll use to dust and polish the penthouse today),
-		<<case "work as a nanny">>($nurseryName, where $he is tending to the children),
-		<<case "stay confined">>($his cell),
-		<<case "guard you">>(the armory where $his weapons are kept),
-		<<case "be your Head Girl">>(the assignment location of a slave who needs some hands-on guidance from your Head Girl),
-		<<case "recruit girls">>(the camera station $he uses to convince people from the old world that becoming your slave is a good idea),
-		<<case "serve in the master suite">>(your bedroom, where $he'll ready $himself for later),
-		<<case "be the DJ">>(the back of $clubName where $he decides the playlist for the day),
-		<<case "be the Attendant">>(the back of $spaName, where $he'll decide the perfect mixture for today's baths),
-		<<case "be the Madam">>($his office in $brothelName, where $he'll decide the slaves on display),
-		<<case "be the Schoolteacher">>($his office in $schoolroomName, where $he'll decide today's lesson),
-		<<case "be the Stewardess">>($his office in $servantsQuartersName, where $he'll divvy out today's tasks),
-		<<case "be the Milkmaid">>($dairyName, to check on the cattle),
-		<<case "be the Farmer">>($farmyardName, to tend to the crops),
-		<<case "be the Wardeness">>($cellblockName, to oversee the inmates),
-		<<case "be your Concubine">>(your bed),
-		<<case "be the Nurse">>($clinicName, to check on the patients),
-		<<case "be the Matron">>($nurseryName, where $he is managing children and nannies),
-		<<case "live with your Head Girl">>
-		<<default>>(a waiting area for further assignment),
-		<</switch>>
-		and when you get there, $he gives you a peck on the cheek.
-		<<if $activeSlave.height < 170>>
-			The short $desc has to go up on tiptoe to reach.
-		<</if>>
-		"@@.hotpink;I really do love you,@@ <<Master>>," $he <<say>>s, <<if canSee($activeSlave)>><<= App.Desc.eyesColor($activeSlave)>> shining<<else>>face filled with joy<</if>>.
-		<<set $activeSlave.devotion += 5>>
-	<</replace>>
-<</link>>
-<br><<link "Play with $him">>
-	<<replace "#result">>
-		You're not a slave, so you can't understand $his inner workings through direct empathy. But in your experience, a quick orgasm never fails to make a good day better. You're not slow, and of course you know where $he's going, so you catch up to $him on quiet feet and
-		<<if $activeSlave.butt > 12>>
-			sink both hands into $his immense rear.
-		<<elseif $activeSlave.butt > 6>>
-			set $his enormous ass jiggling with a smack.
-		<<elseif $activeSlave.butt > 3>>
-			give $his womanly bottom a squeeze.
-		<<else>>
-			pinch $his cute rear.
-		<</if>>
-		$He squeals and whirls around, <<if $activeSlave.energy > 60>>eagerly flinging $himself into your arms, ready for some action<<else>>trustingly throwing $himself into your arms<</if>>. Feeling spontaneous, you decide to get everyone off quickly and cleanly, right here.
-		<<switch $eventSlave.fetish>>
-		<<case "submissive">>
-			You place a dominant hand around $his throat, firmly but not harshly, almost sending the submissive to $his knees. Your other hand
-		<<case "cumslut">>
-			You kiss $him, sliding your tongue all the way into $his mouth. $He melts into you, rhapsodically entranced by the intense oral stimulation, and $his tongue presses against yours with frankly sexual significance. Your hand
-		<<case "humiliation">>
-			Slaves are constantly passing the two of you, and you constantly turn $him to show $his body to each of them, spreading $him to display $his most intimate parts. $His cheeks flush with arousal and delicious shame. Your hand
-		<<case "buttslut">>
-			You slide a hand all the way under $him, pulling the flesh of $his buttock to one side and then nestling possessive fingers over $his anus, teasing and stimulating, but not penetrating. Your other hand
-		<<case "boobs">>
-			$He gasps as your hot mouth finds one of $his $activeSlave.nipples nipples, and then moans openly as one of your hands mauls $his other breast. Your other hand
-		<<case "pregnancy">>
-			One of your hands begins to caress $his _belly <<if $activeSlave.pregKnown == 1>> pregnant<</if>> belly, worshipping its curve. Your other hand
-		<<case "dom" "sadist">>
-			You press yourself aggressively against $him, and $he presses back; you grind harder still, letting $him know that $he can let $himself be a little aggressive, too. Groaning with pleasure and satisfaction, $he kisses you furiously. One of your hands
-		<<case "masochist">>
-			You caress one of $his nipples, <<if $activeSlave.nipples != "fuckable">>bringing it completely erect before gripping it firmly. You twist it, pull it, pinch it<<else>>letting it swell completely shut before driving your entire fist into it<</if>>; $he moans with masochistic pleasure. Your other hand
-		<<default>>
-			Your hand
-		<</switch>>
-		<<if canDoVaginal($activeSlave)>>
-			finds $his pussy
-		<<elseif canDoAnal($activeSlave)>>
-			reaches around behind $him to tease $his ass and play with $his sensitive perineum
-		<<else>>
-			traces $his chastity
-		<</if>>
-		and you press your groin towards $him. Getting the idea, $he begins to <<if $PC.dick != 0>>jack you off<<else>>finger your clit<</if>> energetically, taking the pace from your lusty demeanor and $his own feeling of energy and well-being. The two of you orgasm almost together. <<if $PC.dick != 0>>You angle your hips to shoot your seed onto the floor<<else>>You climax so violently that some of your femcum makes it onto the floor<</if>>.
-		<<if ($activeSlave.chastityPenis == 1)>>
-			$His ejaculate steadily drips from $his chastity cage,
-		<<elseif canAchieveErection($activeSlave)>>
-			$He blows $his own load right after,
-		<<elseif $activeSlave.balls > 0>>
-			$His limp dick pours cum,
-		<<elseif $activeSlave.dick > 0>>
-			$His bitchclit produces a little watery fluid,
-		<<elseif $activeSlave.vaginaLube > 1>>
-			$He squirts copiously,
-		<<else>>
-			Unusually for $him, $he manages to squirt a little,
-		<</if>>
-		adding to the mess. You tell $him another slave will clean up, and order $him to go about $his business. $He turns to go, @@.mediumaquamarine;smiling with sexual satisfaction.@@
-		<<set $activeSlave.trust += 5>>
-	<</replace>>
-<</link>>
-<br><<link "Punish $him">>
-	<<replace "#result">>
-		That was not quite the prescribed way of greeting you, there was no need to greet you as $he passed, and most importantly, $he's simply too cheery. Resolving to crush $his happiness, you call $him back to the office in a thunderous voice you know will reach $him. $He knows $he's made a mistake, but comes promptly, lower lip quivering. $His feelings are plain to see on $his face: surprise, @@.mediumorchid;betrayal,@@ @@.gold;fear.@@ $He thought $he could be friendly, and now $he knows $he was wrong. What's more, $he thought $he could be happy, and now $he's realizing that that was also wrong. As you
-		<<switch $activeSlave.rules.punishment>>
-		<<case "confinement">>close $him into a confinement cell,
-		<<case "whipping">>tie $him up for a brief whipping,
-		<<case "chastity">>lock $him into harsh chastity,
-		<<default>>gag $him for speaking out of turn,
-		<</switch>>
-		a wail of despair tears its way out of $his throat, far out of proportion to the standard punishment you're applying. It's perhaps the saddest sound you've ever heard a slave make. Slaves cry all the time, but usually they already understand that happiness is out of their reach. This one just woke up thinking that $he could be happy and was happy, and now $he's realizing it isn't allowed.
-		<<set $activeSlave.devotion -= 10, $activeSlave.trust -= 10>>
-	<</replace>>
-<</link>>
-
 <<case "ara ara">>
 
 <<link "Praise $his outlook">>
@@ -16942,153 +16618,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<</replace>>
 <</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0) && $PC.dick != 0>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0) && $PC.dick != 0>> //This option will take $his anal virginity//<</if>>
 
-<<case "im scared">>
-
-<<link "Punish $him">>
-	<<replace "#result">>
-		$He obviously knows that breaking down like this would displease you, but you patiently explain that it's against the rules anyway. $He cries harder, nodding through $his tears. $He knows that interrupting you to beg would be profoundly stupid, so $he clasps $his hand<<if hasBothArms($activeSlave)>>s<</if>> in wordless submission. You tell $him that $he's to keep $himself under control; if $he fails, $he will be punished. Since $he failed, $he will now suffer $his standard punishment, and be
-		<<switch $activeSlave.rules.punishment>>
-		<<case "confinement">>
-			shut up in a box. @@.gold;$He breaks down,@@ falling to $his knees, begging abjectly for mercy.
-			<<if $activeSlave.belly >= 100000 || $activeSlave.boobs > 25000 || $activeSlave.weight > 190>>
-				"It'<<s>> too cramped in there,"
-			<<else>>
-				"It'<<s>> dark in there,"
-			<</if>>
-			$he screams as you open the box for $him. $He knows that if $he doesn't climb in, it'll be longer before $he's let out, so $he does, scrabbling inside and sobbing desperately as you close the lid.
-		<<case "whipping">>
-			whipped. @@.gold;$He breaks down,@@ falling to $his knees, begging abjectly for mercy. "It'll h-hu-hurt," $he blubbers weakly as you attach $his hand<<if hasBothArms($activeSlave)>>s<</if>> to shackles high on the office wall. The first stroke across $his buttocks draws a long shriek out of $him.
-		<<case "chastity">>
-			locked up in chastity. @@.gold;$He breaks down,@@ falling to $his knees, begging abjectly for mercy. "I c-can't," $he moans. "I can't take it. I can't <<s>>tand it." As you lock the chastity onto $him, $he sobs inconsolably, knowing that any arousal will be torturous until $he's released.
-		<<default>>
-			gagged, since that's the appropriate castigation for failure to control $his mouth and deportment. $He tries to behave, but @@.gold;breaks down@@ as you slide a dildo gag into $his throat, choking and struggling to breathe as $he tries to cry past it.
-		<</switch>>
-		The thing $he's most frightened of is that $he won't be able to control $his fear in the future, and will continue to suffer.
-		<<set $activeSlave.trust -= 5>>
-	<</replace>>
-<</link>>
-<<if $dairyRestraintsSetting == 2>>
-	<br><<link "Threaten $him with the industrial Dairy">>
-		<<replace "#result">>
-			You grab $him by the scruff of $his neck and drag $him down to $dairyName. $He tries to control $himself, but breaks down in tears when you haul $him to a stop, forcing $him to get a good <<if canSee($activeSlave)>>look at the rows of bodies being<<elseif canHear($activeSlave)>>listen of the sound of rows of bodies being<<else>>feel for the omnipresent aura of rows of bodies being<</if>> mercilessly milked. You explain that if $he continues to fail to control $himself, your patience with $his will eventually expire, and you'll be forced to immure $him here. <<if canSee($activeSlave)>>Indicating<<else>>Facing $him towards<</if>> a slave who's being
-			<<if ($activeSlave.balls > 0) && ($dairyStimulatorsSetting == 2)>>
-				cockmilked by the machines, you tell $activeSlave.slaveName to pay close attention. $He <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>freezes<</if>> in horror as a dildo the size of $his forearm slides in and out of the slave's rectum, pounding it harder and harder until the slave stiffens and the transparent tubing coming off its cockhead whitens with cum. As the slave relaxes slightly in the restrains, the powerful milkers continue their relentless tugging at $his gigantic udders.<<if !canSee($activeSlave)>> As the dildo begins its efforts to loose a second cumming, you grab the horrified slave's hands and push them to the cow's throbbing dick just in time for $him to feel the ejaculate forced out by its unwilling orgasm.<</if>> You run a hand down to $activeSlave.slaveName's own balls and, squeezing them slightly, tell $him that unless $he wants $his ass ruined by constant machine rape, $his tits turned into immobilizing milk factories and $his balls drained of every last drop of seed,
-			<<elseif ($activeSlave.ovaries == 1 || $activeSlave.mpreg == 1) && ($dairyPregSetting == 2)>>
-				used for reproduction by the machines, you tell $activeSlave.slaveName to pay close attention. $He <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>freezes<</if>> in horror as a dildo the size of $his forearm fucks the slave's enormous cunt, keeping it as gaped as possible to ease birth and constantly ejaculating preparatory drugs against $his cervix. The slave is gigantically pregnant. You tell $activeSlave.slaveName that this is the vaginal treatment $he can expect when pregnant; when impregnation is required, the dildos ejaculate more than a liter of cum a minute.<<if !canSee($activeSlave)>> As the dildo retracts from the cow's gaping cunt, you grab the horrified slave's hands and push them to its gravid middle just in time for $him to feel a massive contraction.<</if>> You run a hand down to $activeSlave.slaveName's own middle and, patting it gently, tell $him that unless $he wants $his womb converted into an industrial component,
-			<<elseif ($activeSlave.ovaries == 1 || $activeSlave.mpreg == 1) && ($dairyPregSetting == 3)>>
-				used for mass reproduction by the machines, you tell $activeSlave.slaveName to pay close attention. $He <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>freezes<</if>> in horror as a dildo the size of $his forearm fucks the slave's cavernous cunt, keeping it as gaped as possible to ease birth and constantly ejaculating preparatory drugs against $his tortured cervix. The slave is absolutely enormous, more a taut sphere of a belly than a person; so pregnant that the children within $his are visibly forced to bulge the skin covering $his straining womb by their sisters. You tell $activeSlave.slaveName that this is the treatment $he can expect when pregnant here; when impregnation is required, the dildos ejaculate more than a liter of cum a minute.<<if !canSee($activeSlave)>> As the cow takes the huge dildo absentmindedly, you grab the horrified slave's hand<<if hasBothArms($activeSlave)>>s<</if>> and push <<if hasBothArms($activeSlave)>>them<<else>>it<</if>> to its gravid middle, forcing $him to feel the children squirming within its packed womb. $He squeals in terror at the feeling of so many babies moving under $his fingers.<</if>> You run a hand down to $activeSlave.slaveName's own middle and, patting it gently, tell $him that unless $he wants to become an industrial breeder,
-			<<else>>
-				drained of $his milk, you tell $activeSlave.slaveName to pay close attention. $He <<if canSee($activeSlave)>>watches<<elseif canHear($activeSlave)>>listens<<else>>freezes<</if>> in horror as the slave's gigantic breasts are massaged and squeezed, while the milkers attached to $his absurd nipples tug and pull with industrial power. $He can't <<if canSee($activeSlave)>>look away; the orbs of jiggling flesh being manipulated are each as big as the slave's torso<<else>>shut out the sound of those enormous jiggling orbs of flesh being so roughly manipulated<</if>>. It's good for milk production to drain slaves completely on occasion, and the machine doesn't stop until every drop is wrung from both udders.<<if !canSee($activeSlave)>> You force the horrified slave's hand<<if hasBothArms($activeSlave)>>s<</if>> onto its breasts so that $he may get a good sense of just how big and swollen they are and how hard the milker is pulling at them.<</if>> You run a hand over to $activeSlave.slaveName's own breast and, teasing $his nipple, tell $him that unless $he wants to experience that twice a day,
-			<</if>>
-			$he had better behave $himself. $He nods furiously, @@.gold;terrified beyond the ability to speak.@@
-			<<set $activeSlave.trust -= 8>>
-		<</replace>>
-	<</link>>
-<</if>>
-<<if $seeExtreme != 0>>
-	<br><<link "Threaten to convert $him into a Fuckdoll">>
-		<<replace "#result">>
-			You order a Fuckdoll brought to your office. $activeSlave.slaveName <<if canSee($activeSlave)>>watches it totter in<<elseif canHear($activeSlave)>>listens to the clicks of its approaching heels and the ominous squeaking of its latex shell<<else>>feels the uncomfortable latex skin of its suit when it brushes up against $him<</if>>, automatically following the tugs on its leash and the tonal commands passed by its suit. $He already understands the implicit threat, and $he shivers uncontrollably, @@.gold;almost falling to $his knees in fear.@@ Not content with that, you tell $him that $he's trying your patience with $his behavior. If $he doesn't control $himself better in the future, you'll give up on $him and convert $him into a Fuckdoll. At the spoken threat $activeSlave.slaveName does collapse, but you order $him to get back to $his feet and <<if canSee($activeSlave)>>watch<<else>>pay attention<</if>>. $He does, shakily, tears streaming down $his face as you put the Fuckdoll on all fours, as though it were about to take dick. Its <<if $activeSlave.vagina > -1>>holes are pointed straight at $activeSlave.slaveName's face, <<if canSee($activeSlave)>>and $he can't avoid seeing how loose and used they look<<else>>so you grab both $his hands and force one into each of its blown out holes. $activeSlave.slaveName shrieks in horror at the recognizable sensation<</if>><<else>>rear hole is pointed straight at $activeSlave.slaveName's face,<<if canSee($activeSlave)>> and $he can't avoid seeing how loose and used it looks<<else>>so you grab both $his hands and force them into its blown out ass. $activeSlave.slaveName shrieks in horror at the recognizable sensation<</if>><</if>>. Suddenly, you activate the Fuckdoll's suit's punishment systems. It does not and cannot scream, but <<if canSee($activeSlave)>>a slight stiffening of its posture communicates extreme anguish, and its sphincter spasms tightly closed with obviously involuntary force<<else>>the sudden, pitiful attempt to clamp down on $his arms makes it perfectly clear that you just forced it to undergo extreme anguish<</if>>. $activeSlave.slaveName is almost incapacitated by terror.
-			<<set $activeSlave.trust -= 8>>
-		<</replace>>
-	<</link>>
-<</if>>
-<br><<link "Comfort $him">>
-	<<replace "#result">>
-		You rise from behind your desk, and $activeSlave.slaveName collapses to the floor, sure that $he's about to be severely punished. $He's shocked to feel your arms encircle $him as you kneel down beside $him and embrace $his huddled form. You pull $his head
-		<<if $PC.boobs >= 1400>>
-			against your enormous, <<if $PC.boobsImplant != 0>>hard<<else>>soft<</if>> breasts,
-		<<elseif $PC.boobs >= 1200>>
-			against your huge <<if $PC.boobsImplant != 0>>firm<<else>>soft<</if>> breasts,
-		<<elseif $PC.boobs >= 1000>>
-			against your big <<if $PC.boobsImplant != 0>>firm<<else>>soft<</if>> breasts,
-		<<elseif $PC.boobs >= 300>>
-			against your soft breasts,
-		<<elseif $PC.title == 0>>
-			against your flat chest,
-		<<else>>
-			into your shoulder,
-		<</if>>
-		stroking it reassuringly and murmuring kindness. $He clings to you, mostly for lack of any other comfort in the whole world, and sobs convulsively, @@.mediumaquamarine;$his terror flowing out of $him@@ in a torrent as you gently rub $his back. When $he's mostly cried $himself out, you tell $him that $he'll be all right. You're sure $he'll be a good slave one day. You understand that $his life is hard. $He'll make mistakes, and you'll punish $him for them, but that's part of slave training, and that's all right. If $he does $his best, $he'll be all right. $He sniffles, cuffing tears away. "Th-thank you, <<if $activeSlave.rudeTitle == 1>><<= PoliteRudeTitle($activeSlave)>><<else>><<Master>><</if>>, I'll d-do my b-be<<s>>t," $he manages to <<say>>.
-		<<set $activeSlave.trust += 5>>
-	<</replace>>
-<</link>>
-
-<<case "frightening dick">>
-
-<<link "Polish this">>
-	<<replace "#result">>
-		You tell $him to polish this instead, advancing even closer. $He turns, finding your cockhead so close to $his face that $his eyes cross ludicrously as they attempt to focus on it. $He does not like dicks, and obviously does not find the prospect of sucking this one appealing right now, but $he knows it's in $his best interests to <<if $activeSlave.skill.oral > 10>>put $his oral knowledge to work<<else>>do $his best<</if>> right now. $He closes $his eyes and takes you into $his mouth, forming a seal around your cock with $his
-		<<if $activeSlave.lips > 40>>
-			ridiculous
-		<<elseif $activeSlave.lips > 20>>
-			pillowy
-		<<elseif $activeSlave.lips > 10>>
-			pretty
-		<<else>>
-			disappointingly thin
-		<</if>>
-		lips before starting to suck dick. Dissatisfied with $his reluctance, you order $him to open $his eyes and look up at you; $he obeys, the <<= App.Desc.eyesColor($activeSlave, "", "orb", "orbs")>> glittering with a little moisture as $he concentrates on breathing past your penis. You ask if your cock <<if canTaste($activeSlave)>>tastes<<else>>feels<</if>> any different than usual. "Mmm hmm, M'," $he mumbles, producing a nice humming sensation against your cock. You tell $him that $he's <<if canTaste($activeSlave)>>tasting<<else>>feeling<</if>> another slave's <<if $activeSlave.vagina > -1>>pussy<<else>>ass<</if>>. $He gags, but only slightly, and controls $himself immediately. Your dick is desensitized from vigorous use, and $he has to suck it a long time before you cup the back of $his head, ram yourself all the way in, and blow your load straight down $his gullet. You tell $him $he's a good $desc. "Thank you, <<Master>>," $he <<say>>s @@.hotpink;submissively,@@ going back to $his polishing.
-		<<run seX($activeSlave, "oral", $PC, "penetrative")>>
-		<<set $activeSlave.devotion += 5>>
-	<</replace>>
-<</link>>
-<br><<link "Talk to $him about $his issues with dick">>
-	<<replace "#result">>
-		<<if SlaveStatsChecker.checkForLisp($activeSlave)>>
-			<<set _desc = lispReplace($desc)>>
-		<<else>>
-			<<set _desc = $desc>>
-		<</if>>
-		You sit yourself down in the doorway, right next to $him, and pat your thighs. $He sits on your lap, obeying despite some evident reluctance to sit atop your moist cock. It nestles easily between $his lower buttocks and upper thighs, and $he gets $himself situated, doing $his best to ignore the feeling of your hot hard meat, hard against $his fundament. You encircle $him with your arms, possessively and dominantly but not sexually, and tell $him that you're concerned about $his relationship with cock. $He shifts uncomfortably. "<<S>>orry, <<Master>>, <<s>>orry I'm not better at hiding that. I should be a good _desc and not react like that. I mean, in a bad way. You <<s>>tartled me, but I don't alway<<s>> react well to dick even when I'm not <<s>>tartled. I'll try harder." This is more contrition and submission than you were expecting, and you probe further, asking $him pointedly whether $he's attracted to dicks now. "N-no," $he admits, after only a moment's hesitation to remember that honesty is the most important rule for $him to follow. "No, I don't like them. But I'll do my be<<s>>t to be a good <<s>>e<<x>> <<s>>lave anyway, <<Master>>." Pleased, you tell $him that things will get easier for $him.
-		<<if $activeSlave.hormoneBalance >= 50>>
-			The hormone treatments $he's currently taking will slowly reorient $his sexuality, and eventually $he'll lust after every cock $he sees.
-		<<elseif $activeSlave.aphrodisiacs > 0 || $activeSlave.inflationType == "aphrodisiac">>
-			The aphrodisiacs $he's on will make $him so omnisexually horny that soon $he won't care how anyone's equipped, as long as they'll fuck $him.
-		<<elseif $activeSlave.energy > 60>>
-			$His excellent and improving libido will eventually soften $him to all kinds of sex, with all kinds of people.
-		<<else>>
-			Habit and training will get $him used to dick, and eventually $he'll barely remember that $he ever had a problem with sucking a quick cock.
-		<</if>>
-		$He's a little unsure whether or not to be reassured by this, but $he's @@.mediumaquamarine;relieved $he's not in trouble.@@
-		<<set $activeSlave.trust += 5>>
-	<</replace>>
-<</link>>
-<<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>
-	<br><<link "Rape $him">>
-		<<replace "#result">>
-			Sometimes there's really no need to overthink things. You reach down, grab $him under the armpits, and haul $him up, throwing $him across your desk. $He lands on $his back, and the impact drives the wind out of $him, so $he lies there, @@.gold;all possibility of resistance driven out of $him.@@
-			<<if $activeSlave.clothes == "no clothing">>
-				$He's already naked, so there's no need to
-			<<else>>
-				You
-			<</if>>
-			tear the clothes off $him. You force yourself in between $his legs as $he struggles to get $his breath back, and $he gets another good look at the formidable dick that's about to be slammed inside $him<<if $activeSlave.belly >= 5000>> before it disappears beneath $his <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>_belly<</if>> belly<</if>>. $His eyes go wide with fear, and you enhance the effect by smacking yourself against
-			<<if canDoVaginal($activeSlave)>>
-				$his
-				<<if $activeSlave.vagina == 0>>
-					virgin
-				<</if>>
-				vulva.
-			<<elseif $activeSlave.dick > 0>>
-				limp bitchclit.
-			<<else>>
-				$his buttocks.
-			<</if>>
-			You tell $him not to worry, because you're still pretty wet from the last slave you fucked, so this shouldn't hurt too much. Then you ram your cock
-			<<if $activeSlave.vagina > 0>>
-				inside $him.
-				<<= VCheck.Vaginal()>>
-			<<else>>
-				up $his spasming ass.
-				<<= VCheck.Anal()>>
-			<</if>>
-			$He whines and bucks, but $he's entirely at your mercy. $He doesn't like dicks, and to go by $his facial expression as you piston in and out of $him, this experience isn't going to make $him reconsider. When you fill $him with cum, pull out, and let $him retreat to clean $himself up, $he's relieved to go.
-			<<set $activeSlave.trust -= 5>>
-		<</replace>>
-	<</link>><<if canDoVaginal($activeSlave) && ($activeSlave.vagina == 0)>>//This option will take $his virginity//<<elseif !canDoVaginal($activeSlave) && ($activeSlave.anus == 0)>> //This option will take $his anal virginity//<</if>>
-<</if>>
-
 <<case "arcade sadist">>
 
 <<link "Ask $him about $his fantasy">>
diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw
index 1bd7640f3700e1547563d00072f68739135e01c1..7d6d6beb78806115219db5436d434774e08ebaee 100644
--- a/src/uncategorized/arcade.tw
+++ b/src/uncategorized/arcade.tw
@@ -179,7 +179,7 @@
 <<includeDOM App.Facilities.Arcade.Stats(true)>>
 
 <p>
-	<<print App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.arcade)>>
+	<<includeDOM App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.arcade)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/arcmgmt.tw b/src/uncategorized/arcmgmt.tw
index e965a3ea34493b0b04c59941461dbaba8150e567..3c68b30764459450dedecdf1d1ecede97b4bfae5 100644
--- a/src/uncategorized/arcmgmt.tw
+++ b/src/uncategorized/arcmgmt.tw
@@ -1413,11 +1413,11 @@ You own
 	<</if>>
 	<<if $arcologies[0].FSNull != "unset">>
 		Your cultural openness is a powerful driver of economic activity.
-		<<set _AWeekGrowth += Math.trunc($arcologies[0].FSNull/25)>>
+		<<set _AWeekGrowth += Math.max(1,Math.trunc($arcologies[0].FSNull/25))>>
 	<</if>>
 	<<if $arcologies[0].FSRestart != "unset">>
 		Your powerful connections open many avenues of economic expansion.
-		<<set _AWeekGrowth += Math.trunc($arcologies[0].FSRestart/10)>>
+		<<set _AWeekGrowth += Math.max(1,Math.trunc($arcologies[0].FSRestart/10))>>
 	<</if>>
 	<<if $arcologies[0].FSPaternalist >= random(1,100)>>
 		This week, the careful attention to slave welfare your new society emphasizes has been a driver of prosperity.
diff --git a/src/uncategorized/attendantSelect.tw b/src/uncategorized/attendantSelect.tw
index 9145c5cb49f08cf0b87873ef76cf8558d8dc6ae2..f563ca18ad97374086798e02bcee9b96fc7b9285 100644
--- a/src/uncategorized/attendantSelect.tw
+++ b/src/uncategorized/attendantSelect.tw
@@ -11,4 +11,4 @@
 <br><br>''Appoint an Attendant from your devoted slaves:''
 <br><br>[[None|Spa][removeJob(_S.Attendant, Job.ATTENDANT)]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.spa, "Spa")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.spa, "Spa")>>
diff --git a/src/uncategorized/bgSelect.tw b/src/uncategorized/bgSelect.tw
index b888caa6e8fcf56c4fb3b593e5205cfcc857366b..9bf57513c0e30d888007db0f4db4c5e56c85e5e2 100644
--- a/src/uncategorized/bgSelect.tw
+++ b/src/uncategorized/bgSelect.tw
@@ -37,5 +37,5 @@
 	[[None|Main][removeJob($Bodyguard, "guard you")]]
 </div>
 <p>
-	<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.armory, "Main")>>
+	<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.armory, "Main")>>
 </p>
diff --git a/src/uncategorized/brothel.tw b/src/uncategorized/brothel.tw
index e638724aa409fa41cf65e14d39fa363c3b286b61..f9fa7e5d7990209a7686a32cc830721acc297f20 100644
--- a/src/uncategorized/brothel.tw
+++ b/src/uncategorized/brothel.tw
@@ -253,7 +253,7 @@
 <<includeDOM App.Facilities.Brothel.Stats(true)>>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.brothel)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.brothel)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw
index 33ebb3147d77b2ba736307528d4eee5c9484afe4..90b64622ccfb757dd33e685d463525ea0b5883b7 100644
--- a/src/uncategorized/cellblock.tw
+++ b/src/uncategorized/cellblock.tw
@@ -138,7 +138,7 @@
 </p>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.cellblock)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.cellblock)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/clinic.tw b/src/uncategorized/clinic.tw
index b1cdc8af600a831da191ca60aceefe84da671b66..7e88681d257203e0e68d675d22ba91e9a5a1fc77 100644
--- a/src/uncategorized/clinic.tw
+++ b/src/uncategorized/clinic.tw
@@ -72,7 +72,7 @@
 		$clinicNameCaps is busy. Patients occupy many of the beds; most are alert, but a few are dozing under medication designed to promote healing through deep rest.
 	<<elseif _CL > 0>>
 		$clinicNameCaps is sparsely populated. Patients occupy a few of the beds; most are alert, but a few are dozing under medication designed to promote healing through deep rest.
-	<<elseif _S.Nurse != 0>>
+	<<elseif _S.Nurse>>
 		_S.Nurse.slaveName is alone in the clinic, and has nothing to do but keep the place spotlessly clean and ready for its next patients.
 	<<else>>
 		$clinicNameCaps is empty and quiet.
@@ -207,7 +207,7 @@
 </div>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.clinic, true)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.clinic, true)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/club.tw b/src/uncategorized/club.tw
index 2595248737fa5521982e80daea7032a1845820b2..e9c220d61ec39581ef443641e1e3b20682073da3 100644
--- a/src/uncategorized/club.tw
+++ b/src/uncategorized/club.tw
@@ -285,7 +285,7 @@
 <<includeDOM App.Facilities.Club.Stats(true)>>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.club)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.club)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/concubineSelect.tw b/src/uncategorized/concubineSelect.tw
index 9f153e7544385ea6b05ec7b253285604f9b0fd08..f41a0edbcfa9ca3c76b8dea9685dc4a4758e1f68 100644
--- a/src/uncategorized/concubineSelect.tw
+++ b/src/uncategorized/concubineSelect.tw
@@ -12,4 +12,4 @@
 <br><br>''Appoint a Concubine from your devoted slaves:''
 <br><br>[[None|Master Suite][removeJob($Concubine, "be your Concubine")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.masterSuite, "Master Suite")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.masterSuite, "Master Suite")>>
diff --git a/src/uncategorized/costsBudget.js b/src/uncategorized/costsBudget.js
index 99e0a69c50b07255a3680793125387601e4a5a67..6e9a02cb84d12c8372eead5acff5ed1e1429f7ad 100644
--- a/src/uncategorized/costsBudget.js
+++ b/src/uncategorized/costsBudget.js
@@ -1,11 +1,4 @@
 App.UI.Budget.Cost = function() {
-	let el = document.createElement('p');
-	let table = document.createElement("table");
-	table.classList.add("budget");
-	let node;
-	let subNode;
-	let cell;
-	let array;
 	let coloredRow = true;
 
 	// Set up object to track calculated displays
@@ -14,52 +7,38 @@ App.UI.Budget.Cost = function() {
 	const profits = "lastWeeksCashProfits";
 	const F = V.lastWeeksGatheredTotals;
 
+	const table = document.createElement("table");
+	table.classList.add("budget");
+
 	// HEADER
-	let header = table.createTHead();
-	let row = header.insertRow(0);
-	let th = document.createElement("th");
-	let pent = document.createElement("h1");
-	pent.textContent = "Budget Overview";
-	th.appendChild(pent);
-	row.appendChild(th);
-
-	array = [
-		"Income",
-		"Expense",
-		"Totals"
-	];
-	for (let th of array) {
-		let cell = document.createElement("th");
-		cell.textContent = th;
-		row.appendChild(cell);
-	}
+	generateHeader();
 
-	let body = document.createElement('tbody');
-	table.appendChild(body);
-	row = body.insertRow();
+	// BODY
+	table.createTBody();
 
 	// HEADER: FACILITIES
 	createSectionHeader("Facilities");
 
 	// PENTHOUSE
-	generateRowGroup("Penthouse", "PENTHOUSE");
-	generateRowCategory("Rest", "slaveAssignmentRest");
-	generateRowCategory("RestVign", "slaveAssignmentRestVign");
-	generateRowCategory("Fucktoy", "slaveAssignmentFucktoy");
-	generateRowCategory("Classes", "slaveAssignmentClasses");
-	generateRowCategory("House", "slaveAssignmentHouse");
-	generateRowCategory("HouseVign", "slaveAssignmentHouseVign");
-	generateRowCategory("Whore", "slaveAssignmentWhore");
-	generateRowCategory("WhoreVign", "slaveAssignmentWhoreVign");
-	generateRowCategory("Public", "slaveAssignmentPublic");
-	generateRowCategory("PublicVign", "slaveAssignmentPublicVign");
-	generateRowCategory("Subordinate", "slaveAssignmentSubordinate");
-	generateRowCategory("Milked", "slaveAssignmentMilked");
-	generateRowCategory("MilkedVign", "slaveAssignmentMilkedVign");
-	generateRowCategory("ExtraMilk", "slaveAssignmentExtraMilk");
-	generateRowCategory("ExtraMilkVign", "slaveAssignmentExtraMilkVign");
-	generateRowCategory("Gloryhole", "slaveAssignmentGloryhole");
-	generateRowCategory("Confinement", "slaveAssignmentConfinement");
+	addToggle(generateRowGroup("Penthouse", "PENTHOUSE"), [
+		generateRowCategory("Rest", "slaveAssignmentRest"),
+		generateRowCategory("RestVign", "slaveAssignmentRestVign"),
+		generateRowCategory("Fucktoy", "slaveAssignmentFucktoy"),
+		generateRowCategory("Classes", "slaveAssignmentClasses"),
+		generateRowCategory("House", "slaveAssignmentHouse"),
+		generateRowCategory("HouseVign", "slaveAssignmentHouseVign"),
+		generateRowCategory("Whore", "slaveAssignmentWhore"),
+		generateRowCategory("WhoreVign", "slaveAssignmentWhoreVign"),
+		generateRowCategory("Public", "slaveAssignmentPublic"),
+		generateRowCategory("PublicVign", "slaveAssignmentPublicVign"),
+		generateRowCategory("Subordinate", "slaveAssignmentSubordinate"),
+		generateRowCategory("Milked", "slaveAssignmentMilked"),
+		generateRowCategory("MilkedVign", "slaveAssignmentMilkedVign"),
+		generateRowCategory("ExtraMilk", "slaveAssignmentExtraMilk"),
+		generateRowCategory("ExtraMilkVign", "slaveAssignmentExtraMilkVign"),
+		generateRowCategory("Gloryhole", "slaveAssignmentGloryhole"),
+		generateRowCategory("Confinement", "slaveAssignmentConfinement")
+	]);
 	// Other
 	generateRowCategory("Chosing Own Assignment", "slaveAssignmentChoice");
 
@@ -67,281 +46,327 @@ App.UI.Budget.Cost = function() {
 
 	// HEAD GIRL
 	// find passage name for HGSuite
-	generateRowGroup(V.HGSuiteNameCaps, "HEADGIRLSUITE");
-	generateRowCategory("Head Girl", "slaveAssignmentHeadgirl");
-	generateRowCategory("Head Girl Fucktoys", "slaveAssignmentHeadgirlsuite");
+	addToggle(generateRowGroup(V.HGSuiteNameCaps, "HEADGIRLSUITE"), [
+		generateRowCategory("Head Girl", "slaveAssignmentHeadgirl"),
+		generateRowCategory("Head Girl Fucktoys", "slaveAssignmentHeadgirlsuite")
+	]);
 
 	// RECRUITER
-	generateRowGroup("Recruiter", "RECRUITER");
-	generateRowCategory("Recruiter", "slaveAssignmentRecruiter");
+	addToggle(generateRowGroup("Recruiter", "RECRUITER"), [
+		generateRowCategory("Recruiter", "slaveAssignmentRecruiter")
+	]);
 
 	// BODYGUARD
 	// find passage name for Armory
-	generateRowGroup("Armory", "DOJO");
-	generateRowCategory("Bodyguard", "slaveAssignmentBodyguard");
+	addToggle(generateRowGroup("Armory", "DOJO"), [
+		generateRowCategory("Bodyguard", "slaveAssignmentBodyguard")
+	]);
 
 	// CONCUBINE
-	generateRowGroup("Master Suite", "MASTERSUITE");
-	generateRowCategory("Master Suite Operation", "masterSuite");
-	generateRowCategory("Master Suite Concubine", "slaveAssignmentConcubine");
-	generateRowCategory("Master Suite Fucktoys", "slaveAssignmentMastersuite");
+	addToggle(generateRowGroup("Master Suite", "MASTERSUITE"), [
+		generateRowCategory("Master Suite Operation", "masterSuite"),
+		generateRowCategory("Master Suite Concubine", "slaveAssignmentConcubine"),
+		generateRowCategory("Master Suite Fucktoys", "slaveAssignmentMastersuite")
+	]);
 
 	// AGENT
-	generateRowGroup("Agent", "AGENT");
-	generateRowCategory("Agent", "slaveAssignmentAgent");
-	generateRowCategory("Agent's Partner", "slaveAssignmentAgentPartner");
+	addToggle(generateRowGroup("Agent", "AGENT"), [
+		generateRowCategory("Agent", "slaveAssignmentAgent"),
+		generateRowCategory("Agent's Partner", "slaveAssignmentAgentPartner")
+	]);
 
 	// ARCADE
-	generateRowGroup(V.arcadeNameCaps, "ARCADE");
-	generateRowCategory("Arcade Operation", "arcade");
-	generateRowCategory("Arcade Fuckdolls", "slaveAssignmentArcade");
+	addToggle(generateRowGroup(V.arcadeNameCaps, "ARCADE"), [
+		generateRowCategory("Arcade Operation", "arcade"),
+		generateRowCategory("Arcade Fuckdolls", "slaveAssignmentArcade")
+	]);
 
 	// BROTHEL
-	generateRowGroup(V.brothelNameCaps, "BROTHEL");
-	generateRowCategory("Brothel Operation", "brothel");
-	generateRowCategory("Brothel Madam", "slaveAssignmentMadam");
-	generateRowCategory("Brothel MadamVign", "slaveAssignmentMadamVign");
-	generateRowCategory("Brothel Whore", "slaveAssignmentBrothel");
-	generateRowCategory("Brothel WhoreVign", "slaveAssignmentBrothelVign");
-	generateRowCategory("Brothel Ads", "brothelAds");
+	addToggle(generateRowGroup(V.brothelNameCaps, "BROTHEL"), [
+		generateRowCategory("Brothel Operation", "brothel"),
+		generateRowCategory("Brothel Madam", "slaveAssignmentMadam"),
+		generateRowCategory("Brothel MadamVign", "slaveAssignmentMadamVign"),
+		generateRowCategory("Brothel Whore", "slaveAssignmentBrothel"),
+		generateRowCategory("Brothel WhoreVign", "slaveAssignmentBrothelVign"),
+		generateRowCategory("Brothel Ads", "brothelAds")
+	]);
 
 	// CELLBLOCK
-	generateRowGroup(V.cellblockNameCaps, "CELLBLOCK");
-	generateRowCategory("Cellblock Operation", "cellblock");
-	generateRowCategory("Cellblock Warden", "slaveAssignmentWarden");
-	generateRowCategory("Cellblock Slaves", "slaveAssignmentCellblock");
+	addToggle(generateRowGroup(V.cellblockNameCaps, "CELLBLOCK"), [
+		generateRowCategory("Cellblock Operation", "cellblock"),
+		generateRowCategory("Cellblock Warden", "slaveAssignmentWarden"),
+		generateRowCategory("Cellblock Slaves", "slaveAssignmentCellblock")
+	]);
 
 	// CLUB
-	generateRowGroup(V.clubNameCaps, "CLUB");
-	generateRowCategory("Club Operation", "club");
-	generateRowCategory("Club DJ", "slaveAssignmentDj");
-	generateRowCategory("Club DJVign", "slaveAssignmentDjVign");
-	generateRowCategory("Club Public", "slaveAssignmentClub");
-	generateRowCategory("Club PublicVign", "slaveAssignmentClubVign");
-	generateRowCategory("Club Ads", "clubAds");
+	addToggle(generateRowGroup(V.clubNameCaps, "CLUB"), [
+		generateRowCategory("Club Operation", "club"),
+		generateRowCategory("Club DJ", "slaveAssignmentDj"),
+		generateRowCategory("Club DJVign", "slaveAssignmentDjVign"),
+		generateRowCategory("Club Public", "slaveAssignmentClub"),
+		generateRowCategory("Club PublicVign", "slaveAssignmentClubVign"),
+		generateRowCategory("Club Ads", "clubAds")
+	]);
 
 	// CLINIC
-	generateRowGroup(V.clinicNameCaps, "CLINIC");
-	generateRowCategory("Clinic Operation", "clinic");
-	generateRowCategory("Clinic Nurse", "slaveAssignmentNurse");
-	generateRowCategory("Clinic Slaves", "slaveAssignmentClinic");
+	addToggle(generateRowGroup(V.clinicNameCaps, "CLINIC"), [
+		generateRowCategory("Clinic Operation", "clinic"),
+		generateRowCategory("Clinic Nurse", "slaveAssignmentNurse"),
+		generateRowCategory("Clinic Slaves", "slaveAssignmentClinic")
+	]);
 
 	// DAIRY
-	generateRowGroup(V.dairyNameCaps, "DAIRY");
-	generateRowCategory("Dairy Operation", "dairy");
-	generateRowCategory("Dairy Milkmaid", "slaveAssignmentMilkmaid");
-	generateRowCategory("Dairy Cows", "slaveAssignmentDairy");
-	generateRowCategory("Dairy Cows", "slaveAssignmentDairyVign");
+	addToggle(generateRowGroup(V.dairyNameCaps, "DAIRY"), [
+		generateRowCategory("Dairy Operation", "dairy"),
+		generateRowCategory("Dairy Milkmaid", "slaveAssignmentMilkmaid"),
+		generateRowCategory("Dairy Cows", "slaveAssignmentDairy"),
+		generateRowCategory("Dairy Cows", "slaveAssignmentDairyVign")
+	]);
 
 	// FARMYARD
-	generateRowGroup(V.farmyardNameCaps, "FARMYARD");
-	generateRowCategory("Farmyard Operation", "farmyard");
-	generateRowCategory("Farmyard Farmer", "slaveAssignmentFarmer");
-	generateRowCategory("Farmyard Farmhands", "slaveAssignmentFarmyard");
-	generateRowCategory("Farmyard FarmhandsVign", "slaveAssignmentFarmyardVign");
+	addToggle(generateRowGroup(V.farmyardNameCaps, "FARMYARD"), [
+		generateRowCategory("Farmyard Operation", "farmyard"),
+		generateRowCategory("Farmyard Farmer", "slaveAssignmentFarmer"),
+		generateRowCategory("Farmyard Farmhands", "slaveAssignmentFarmyard"),
+		generateRowCategory("Farmyard FarmhandsVign", "slaveAssignmentFarmyardVign")
+	]);
 
 	// INCUBATOR
-	generateRowGroup(V.incubatorNameCaps, "INCUBATOR");
-	generateRowCategory("Incubator Operation", "incubator");
-	generateRowCategory("Incubator Babies", "incubatorSlaves");
+	addToggle(generateRowGroup(V.incubatorNameCaps, "INCUBATOR"), [
+		generateRowCategory("Incubator Operation", "incubator"),
+		generateRowCategory("Incubator Babies", "incubatorSlaves")
+	]);
 
 	// NURSERY
-	generateRowGroup(V.nurseryNameCaps, "NURSERY");
-	generateRowCategory("Nursery Operation", "nursery");
-	generateRowCategory("Nursery Matron", "slaveAssignmentMatron");
-	generateRowCategory("Nursery Nannies", "slaveAssignmentNursery");
-	generateRowCategory("Nursery NanniesVign", "slaveAssignmentNurseryVign");
+	addToggle(generateRowGroup(V.nurseryNameCaps, "NURSERY"), [
+		generateRowCategory("Nursery Operation", "nursery"),
+		generateRowCategory("Nursery Matron", "slaveAssignmentMatron"),
+		generateRowCategory("Nursery Nannies", "slaveAssignmentNursery"),
+		generateRowCategory("Nursery NanniesVign", "slaveAssignmentNurseryVign")
+	]);
 
 	// PIT
-	generateRowGroup(V.pitNameCaps, "PIT");
-	generateRowCategory("Pit Operation", "pit");
+	addToggle(generateRowGroup(V.pitNameCaps, "PIT"), [
+		generateRowCategory("Pit Operation", "pit")
+	]);
 
 	// PROSTHETIC LAB
-	generateRowGroup("Prosthetic Lab", "PROSTHETICLAB");
-	generateRowCategory("Prosthetic Lab Operation", "lab");
-	generateRowCategory("Prostethic Lab Research", "labResearch");
-	generateRowCategory("Prostethic Lab Scientists", "labScientists");
-	generateRowCategory("Prostethic Lab Menials", "labMenials");
+	addToggle(generateRowGroup("Prosthetic Lab", "PROSTHETICLAB"), [
+		generateRowCategory("Prosthetic Lab Operation", "lab"),
+		generateRowCategory("Prostethic Lab Research", "labResearch"),
+		generateRowCategory("Prostethic Lab Scientists", "labScientists"),
+		generateRowCategory("Prostethic Lab Menials", "labMenials")
+	]);
 
 	// SCHOOLROOM
-	generateRowGroup(V.schoolroomNameCaps, "SCHOOLROOM");
-	generateRowCategory("Schoolroom Operation", "school");
-	generateRowCategory("Schoolroom Teacher", "slaveAssignmentTeacher");
-	generateRowCategory("Schoolroom Students", "slaveAssignmentSchool");
+	addToggle(generateRowGroup(V.schoolroomNameCaps, "SCHOOLROOM"), [
+		generateRowCategory("Schoolroom Operation", "school"),
+		generateRowCategory("Schoolroom Teacher", "slaveAssignmentTeacher"),
+		generateRowCategory("Schoolroom Students", "slaveAssignmentSchool")
+	]);
 
 	// SERVANTS' QUARTERS
-	generateRowGroup(V.servantsQuartersNameCaps, "SERVANTSQUARTERS");
-	generateRowCategory("Servants' Quarters Operation", "servantsQuarters");
-	generateRowCategory("Servants' Quarters Steward", "slaveAssignmentSteward");
-	generateRowCategory("Servants' Quarters Servants", "slaveAssignmentQuarter");
-	generateRowCategory("Servants' Quarters ServantsVign", "slaveAssignmentQuarterVign");
+	addToggle(generateRowGroup(V.servantsQuartersNameCaps, "SERVANTSQUARTERS"), [
+		generateRowCategory("Servants' Quarters Operation", "servantsQuarters"),
+		generateRowCategory("Servants' Quarters Steward", "slaveAssignmentSteward"),
+		generateRowCategory("Servants' Quarters Servants", "slaveAssignmentQuarter"),
+		generateRowCategory("Servants' Quarters ServantsVign", "slaveAssignmentQuarterVign")
+	]);
 
 	// SPA
-	generateRowGroup(V.spaNameCaps, "SPA");
-	generateRowCategory("Spa Operation", "spa");
-	generateRowCategory("Spa Attendant", "slaveAssignmentAttendant");
-	generateRowCategory("Spa Slaves", "slaveAssignmentSpa");
+	addToggle(generateRowGroup(V.spaNameCaps, "SPA"), [
+		generateRowCategory("Spa Operation", "spa"),
+		generateRowCategory("Spa Attendant", "slaveAssignmentAttendant"),
+		generateRowCategory("Spa Slaves", "slaveAssignmentSpa")
+	]);
 
 	// HEADER: ARCOLOGY
 	createSectionHeader("Arcology");
 
 	// SLAVES
-	generateRowGroup("Miscellaneous Slave Income and Expenses", "SLAVES");
-	generateRowCategory("Slave Porn", "porn");
-	generateRowCategory("Slave Modifcations", "slaveMod");
-	generateRowCategory("Slave Surgery", "slaveSurgery");
-	generateRowCategory("Slave Birhting", "birth");
+	addToggle(generateRowGroup("Miscellaneous Slave Income and Expenses", "SLAVES"), [
+		generateRowCategory("Slave Porn", "porn"),
+		generateRowCategory("Slave Modifcations", "slaveMod"),
+		generateRowCategory("Slave Surgery", "slaveSurgery"),
+		generateRowCategory("Slave Birhting", "birth")
+	]);
 
 	// MENIAL LABOR
-	generateRowGroup("Menial Labor", "LABOR");
-	generateRowCategory("Menials: Slaves", "menialTrades");
-	generateRowCategory("Menials: Fuckdolls", "fuckdolls");
-	generateRowCategory("Menials: Bioreactors", "menialBioreactors");
+	addToggle(generateRowGroup("Menial Labor", "LABOR"), [
+		generateRowCategory("Menials: Slaves", "menialTrades"),
+		generateRowCategory("Menials: Fuckdolls", "fuckdolls"),
+		generateRowCategory("Menials: Bioreactors", "menialBioreactors")
+	]);
 
 	// FLIPPING
-	generateRowGroup("Flipping", "FLIPPING");
-	generateRowCategory("Slave Transfer", "slaveTransfer");
-	generateRowCategory("Menials", "menialTransfer");
-	generateRowCategory("Fuckdolls", "fuckdollsTransfer");
-	generateRowCategory("Bioreactors", "menialBioreactorsTransfer");
-	generateRowCategory("Assistant: Menials", "menialTransferA");
-	generateRowCategory("Assistant: Fuckdolls", "fuckdollsTransferA");
-	generateRowCategory("Assistant: Bioreactors", "menialBioreactorsTransferA");
-	generateRowCategory("Menial Retirement", "menialRetirement");
-	generateRowCategory("Scientist Transfer", "labScientistsTransfer");
-	generateRowCategory("Slave Babies", "babyTransfer");
+	addToggle(generateRowGroup("Flipping", "FLIPPING"), [
+		generateRowCategory("Slave Transfer", "slaveTransfer"),
+		generateRowCategory("Menials", "menialTransfer"),
+		generateRowCategory("Fuckdolls", "fuckdollsTransfer"),
+		generateRowCategory("Bioreactors", "menialBioreactorsTransfer"),
+		generateRowCategory("Assistant: Menials", "menialTransferA"),
+		generateRowCategory("Assistant: Fuckdolls", "fuckdollsTransferA"),
+		generateRowCategory("Assistant: Bioreactors", "menialBioreactorsTransferA"),
+		generateRowCategory("Menial Retirement", "menialRetirement"),
+		generateRowCategory("Scientist Transfer", "labScientistsTransfer"),
+		generateRowCategory("Slave Babies", "babyTransfer")
+	]);
 
 	// FINANCIALS
-	generateRowGroup("Financials", "FINANCIALS");
-	generateRowCategory("Weather", "weather");
-	generateRowCategory("Rents", "rents");
-	generateRowCategory("Fines", "fines");
-	generateRowCategory("Events", "event");
-	generateRowCategory("Capital Expenses", "capEx");
-	generateRowCategory("Future Society Shaping", "futureSocieties");
-	generateRowCategory("School Subsidy", "schoolBacking");
-	generateRowCategory("Arcology conflict", "war");
-	generateRowCategory("Cheating", "cheating");
+	addToggle(generateRowGroup("Financials", "FINANCIALS"), [
+		generateRowCategory("Weather", "weather"),
+		generateRowCategory("Rents", "rents"),
+		generateRowCategory("Fines", "fines"),
+		generateRowCategory("Events", "event"),
+		generateRowCategory("Capital Expenses", "capEx"),
+		generateRowCategory("Future Society Shaping", "futureSocieties"),
+		generateRowCategory("School Subsidy", "schoolBacking"),
+		generateRowCategory("Arcology conflict", "war"),
+		generateRowCategory("Cheating", "cheating")
+	]);
 
 	// POLICIES
-	generateRowGroup("Policies", "POLICIES");
-	generateRowCategory("Policies", "policies");
-	generateRowCategory("Subsidies and Barriers", "subsidiesAndBarriers");
+	addToggle(generateRowGroup("Policies", "POLICIES"), [
+		generateRowCategory("Policies", "policies"),
+		generateRowCategory("Subsidies and Barriers", "subsidiesAndBarriers")
+	]);
 
 	// EDICTS
-	generateRowGroup("Edicts", "EDICTS");
-	generateRowCategory("Edicts", "edicts");
+	addToggle(generateRowGroup("Edicts", "EDICTS"), [
+		generateRowCategory("Edicts", "edicts")
+	]);
 
 	// PERSONAL FINANCE
-	generateRowGroup("Personal Finance", "PERSONALFINANCE");
-	generateRowCategory("Personal Business", "personalBusiness");
-	generateRowCategory("Personal Living Expenses", "personalLivingExpenses");
-	generateRowCategory("Your skills", "PCSkills");
-	generateRowCategory("Your training expenses", "PCtraining");
-	generateRowCategory("Your medical expenses", "PCmedical");
-	generateRowCategory("Citizen Orphanage", "citizenOrphanage");
-	generateRowCategory("Private Orphanage", "privateOrphanage");
-	generateRowCategory("Stock dividents", "stocks");
-	generateRowCategory("Stock trading", "stocksTraded");
+	addToggle(generateRowGroup("Personal Finance", "PERSONALFINANCE"), [
+		generateRowCategory("Personal Business", "personalBusiness"),
+		generateRowCategory("Personal Living Expenses", "personalLivingExpenses"),
+		generateRowCategory("Your skills", "PCSkills"),
+		generateRowCategory("Your training expenses", "PCtraining"),
+		generateRowCategory("Your medical expenses", "PCmedical"),
+		generateRowCategory("Citizen Orphanage", "citizenOrphanage"),
+		generateRowCategory("Private Orphanage", "privateOrphanage"),
+		generateRowCategory("Stock dividents", "stocks"),
+		generateRowCategory("Stock trading", "stocksTraded")
+	]);
 
 	// SECURITY
-	generateRowGroup("Security", "SECURITY");
-	generateRowCategory("Mercenaries", "mercenaries");
-	generateRowCategory("Security Expansion", "securityExpansion");
-	generateRowCategory("Special Forces", "specialForces");
-	generateRowCategory("Peacekeepers", "peacekeepers");
+	addToggle(generateRowGroup("Security", "SECURITY"), [
+		generateRowCategory("Mercenaries", "mercenaries"),
+		generateRowCategory("Security Expansion", "securityExpansion"),
+		generateRowCategory("Special Forces", "specialForces"),
+		generateRowCategory("Peacekeepers", "peacekeepers")
+	]);
 
 	// BUDGET REPORT
-	createSectionHeader("Budget Report");
-
-	row = table.insertRow();
-	cell = row.insertCell();
-	cell.append("Tracked totals");
-
-	cell = row.insertCell();
-	V.lastWeeksCashIncome.Total = hashSum(V.lastWeeksCashIncome);
-	cell.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashIncome.Total)));
-
-	cell = row.insertCell();
-	V.lastWeeksCashExpenses.Total = hashSum(V.lastWeeksCashExpenses);
-	cell.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashExpenses.Total)));
-
-	cell = row.insertCell();
-
-	V.lastWeeksCashProfits.Total = (V.lastWeeksCashIncome.Total + V.lastWeeksCashExpenses.Total);
-	// each "profit" item is calculated on this sheet, and there's two ways to generate a profit total: the difference of the income and expense totals, and adding all the profit items. If they aren't the same, I probably forgot to properly add an item's profit calculation to this sheet.
-	node = new DocumentFragment();
-	let total = hashSum(V.lastWeeksCashProfits) - V.lastWeeksCashProfits.Total;
-	if (V.lastWeeksCashProfits.Total !== total) { // Profits includes the total number of profits, so we have to subtract it back out
-		node.append(cashFormatColorDOM(Math.trunc(total)));
-		subNode = document.createElement('span');
-		subNode.className = "red";
-		subNode.textContent = "Fix profit calc";
-		node.append(subNode);
+	generateSummary();
+
+	return table;
+
+	function generateHeader() {
+		const header = table.createTHead();
+		const row = header.insertRow();
+		const cell = row.insertCell();
+		let pent = document.createElement("h1");
+		pent.textContent = "Budget Overview";
+		cell.appendChild(pent);
+
+		for (let column of ["Income", "Expense", "Totals"]) {
+			let cell = document.createElement("th");
+			cell.textContent = column;
+			row.appendChild(cell);
+		}
 	}
-	node.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashProfits.Total)));
-	cell.append(node);
-	flipColors(row);
-
-	row = table.insertRow();
-	cell = row.insertCell();
-	cell.append(`Expenses budget for week ${V.week + 1}`);
-	cell = row.insertCell();
-	cell = row.insertCell();
-	cell.append(cashFormatColorDOM(-V.costs));
-	flipColors(row);
-
-	row = table.insertRow();
-	cell = row.insertCell();
-	cell.append(`Last week actuals`);
-	cell = row.insertCell();
-	cell = row.insertCell();
-	cell = row.insertCell();
-	cell.append(cashFormatColorDOM(V.cash - V.cashLastWeek));
-	flipColors(row);
-
-	row = table.insertRow();
-	if ((V.cash - V.cashLastWeek) === V.lastWeeksCashProfits.Total) {
+
+	function generateSummary() {
+		let row, cell;
+		createSectionHeader("Budget Report");
+
+		row = table.insertRow();
+		cell = row.insertCell();
+		cell.append("Tracked totals");
+
+		cell = row.insertCell();
+		V.lastWeeksCashIncome.Total = hashSum(V.lastWeeksCashIncome);
+		cell.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashIncome.Total)));
+
 		cell = row.insertCell();
-		node = document.createElement('span');
-		node.className = "green";
-		node.textContent = `The books are balanced, ${properTitle()}!`;
-		cell.append(node);
-	} else {
+		V.lastWeeksCashExpenses.Total = hashSum(V.lastWeeksCashExpenses);
+		cell.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashExpenses.Total)));
+
 		cell = row.insertCell();
-		cell.append("Transaction tracking off by:");
+
+		V.lastWeeksCashProfits.Total = (V.lastWeeksCashIncome.Total + V.lastWeeksCashExpenses.Total);
+		// each "profit" item is calculated on this sheet, and there's two ways to generate a profit total: the
+		// difference of the income and expense totals, and adding all the profit items. If they aren't the same, I
+		// probably forgot to properly add an item's profit calculation to this sheet.
+		const total = hashSum(V.lastWeeksCashProfits) - V.lastWeeksCashProfits.Total;
+		if (V.lastWeeksCashProfits.Total !== total) { // Profits includes the total number of profits, so we have to subtract it back out
+			cell.append(cashFormatColorDOM(Math.trunc(total)));
+			const span = document.createElement('span');
+			span.className = "red";
+			span.textContent = "Fix profit calc";
+			cell.append(span);
+		}
+		cell.append(cashFormatColorDOM(Math.trunc(V.lastWeeksCashProfits.Total)));
+		flipColors(row);
+
+		row = table.insertRow();
 		cell = row.insertCell();
+		cell.append(`Expenses budget for week ${V.week + 1}`);
 		cell = row.insertCell();
 		cell = row.insertCell();
-		cell.append(cashFormatColorDOM((V.cash - V.cashLastWeek) - V.lastWeeksCashProfits.Total));
-	}
-	flipColors(row);
+		cell.append(cashFormatColorDOM(-V.costs));
+		flipColors(row);
+
+		row = table.insertRow();
+		cell = row.insertCell();
+		cell.append(`Last week actuals`);
+		cell = row.insertCell();
+		cell = row.insertCell();
+		cell = row.insertCell();
+		cell.append(cashFormatColorDOM(V.cash - V.cashLastWeek));
+		flipColors(row);
 
-	el.appendChild(table);
-	return jQuery('#costTable').empty().append(el);
+		row = table.insertRow();
+		if ((V.cash - V.cashLastWeek) === V.lastWeeksCashProfits.Total) {
+			cell = row.insertCell();
+			const span = document.createElement('span');
+			span.className = "green";
+			span.textContent = `The books are balanced, ${properTitle()}!`;
+			cell.append(span);
+		} else {
+			cell = row.insertCell();
+			cell.append("Transaction tracking off by:");
+			cell = row.insertCell();
+			cell = row.insertCell();
+			cell = row.insertCell();
+			cell.append(cashFormatColorDOM((V.cash - V.cashLastWeek) - V.lastWeeksCashProfits.Total));
+		}
+		flipColors(row);
+	}
 
 	function createSectionHeader(text) {
 		coloredRow = true; // make sure the following section begins with color.
-		row = table.insertRow();
-		cell = row.insertCell();
-		let headline = document.createElement('h2');
+		const row = table.insertRow();
+		const cell = row.insertCell();
+		const headline = document.createElement('h2');
 		headline.textContent = text;
 		cell.append(headline);
 	}
 
 	function generateRowCategory(node, category) {
 		if (category === "") {
-			row = table.insertRow();
+			const row = table.insertRow();
 			row.append(document.createElement('br'));
 			row.insertCell();
 			row.insertCell();
 			row.insertCell();
 			flipColors(row);
-			return;
+			return row;
 		}
 
 		if (V[income][category] || V[expenses][category] || V.showAllEntries.costsBudget) {
-			row = table.insertRow();
+			const row = table.insertRow();
 			let cell = row.insertCell();
 			cell.append(node);
 			cell = row.insertCell();
@@ -351,49 +376,67 @@ App.UI.Budget.Cost = function() {
 			flipColors(row);
 			cell = row.insertCell();
 			cell.append(cashFormatColorDOM(V[profits][category]));
+			return row;
 		}
 	}
 
 	function generateRowGroup(title, group) {
 		if (F[group].income || F[group].expenses || V.showAllEntries.costsBudget) {
-			row = table.insertRow();
-			cell = row.insertCell();
-			let headline = document.createElement('h3');
+			const row = table.insertRow();
+			let cell = row.insertCell();
+			const headline = document.createElement('h3');
 			headline.textContent = title;
 			cell.append(headline);
 			cell = row.insertCell();
-			cell.append(cashFormatColorDOM(F[group].income, null, true));
+			cell.append(cashFormatColorDOM(F[group].income, null));
 			cell = row.insertCell();
-			cell.append(cashFormatColorDOM(F[group].expenses, null, true));
+			cell.append(cashFormatColorDOM(F[group].expenses, null));
 			cell = row.insertCell();
-			cell.append(cashFormatColorDOM(F[group].profits, null, true));
+			cell.append(cashFormatColorDOM(F[group].profits, null));
+			return row;
+		}
+	}
+
+	/**
+	 * @param {HTMLTableRowElement} head
+	 * @param {Array<HTMLTableRowElement>} content
+	 */
+	function addToggle(head, content) {
+		if (!head) {
+			return;
+		}
+		content = content.filter(e => !!e);
+		if (content.length === 0) {
+			return;
 		}
+		App.UI.DOM.elementToggle(head, content);
 	}
 
-	function cashFormatColorDOM(s, invert = false, temp) {
+	function cashFormatColorDOM(cash, invert = false) {
 		if (invert) {
-			s = -1 * s;
+			cash = -1 * cash;
 		}
-		let el = document.createElement('span');
-		el.textContent = cashFormat(s);
-		if (temp === true) {
-			// Gray display for totals when expanded
-			el.className = "gray";
+		let span = document.createElement('span');
+		span.textContent = cashFormat(cash);
+		if (cash === 0) {
+			// cash overwrites gray, so we don't use it here.
+			span.classList.add("gray");
 		} else {
+			span.classList.add("cash");
 			// Display red if the value is negative, unless invert is true
-			if (s < 0) {
-				el.className = "red";
+			if (cash < 0) {
+				span.classList.add("dec");
 				// Yellow for positive
-			} else if (s > 0) {
-				el.className = "yellowgreen";
-				// White for exactly zero
+			} else if (cash > 0) {
+				span.classList.add("inc");
+				// Gray for exactly zero
 			}
 		}
-		return el;
+		return span;
 	}
 
 	function flipColors(row) {
-		if (coloredRow === true) {
+		if (coloredRow) {
 			row.classList.add("colored");
 		}
 		coloredRow = !coloredRow;
diff --git a/src/uncategorized/costsBudget.tw b/src/uncategorized/costsBudget.tw
index 8af2335e3e9bf82a23307de7ebd2671c596c2e0c..fa9d10999900d0ebcacae93fc1d792000fe41c83 100644
--- a/src/uncategorized/costsBudget.tw
+++ b/src/uncategorized/costsBudget.tw
@@ -82,14 +82,13 @@
 .addValue("Normal", 0).on().addValue("Show Empty Entries", 1).neutral()>>
 <<includeDOM _options.render()>>
 
-<p>
 /* Table of Totals */
-<<if ndef $lastWeeksCashIncome>>
-	Financial data currently unavailable.
-<<else>>
-	<span id="costTable"></span>
-	<script>App.UI.Budget.Cost()</script>
-<</if>>
+<p>
+	<<if ndef $lastWeeksCashIncome>>
+		Financial data currently unavailable.
+	<<else>>
+		<<includeDOM App.UI.Budget.Cost()>>
+	<</if>>
 </p>
 
 <<if ndef $lastWeeksCashErrors>>
diff --git a/src/uncategorized/costsReport.tw b/src/uncategorized/costsReport.tw
index 5b365daa246306f026575687ddd11c9cb3f83d64..17f817d179fa90ec35a62eac0bb05f81e68dfd89 100644
--- a/src/uncategorized/costsReport.tw
+++ b/src/uncategorized/costsReport.tw
@@ -7,7 +7,7 @@
 	<<capture $i>>
 		<br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>>
 		[[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment.
-		<<includeDOM SlaveExpenses (V.slaves[V.i])>>
+		<<includeDOM slaveExpenses($slaves[$i])>>
 	<</capture>>
 <</for>>
 
diff --git a/src/uncategorized/costsReportSlaves.tw b/src/uncategorized/costsReportSlaves.tw
index ae0467edc474f629deb9c74255662f840c8890c3..0bfb98f93d160dc90419775e5e848ad647063f67 100644
--- a/src/uncategorized/costsReportSlaves.tw
+++ b/src/uncategorized/costsReportSlaves.tw
@@ -8,6 +8,6 @@
 	<<capture $i>>
 	<br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>>
 	[[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment.
-	<<includeDOM SlaveExpenses (V.slaves[V.i])>>
+	<<includeDOM slaveExpenses($slaves[$i])>>
 	<</capture>>
 <</for>>
diff --git a/src/uncategorized/coursingAssociation.tw b/src/uncategorized/coursingAssociation.tw
index a1d356c18ad9c96810ca230b75a0f323c046e479..1e6819683375a15a1b098aab61baca1d1ac5591a 100644
--- a/src/uncategorized/coursingAssociation.tw
+++ b/src/uncategorized/coursingAssociation.tw
@@ -16,13 +16,13 @@ The chasing slaves are known as lurchers, the term once used for the sighthounds
 
 <<if $LurcherID != 0>>
 	<br><br>''Fire your Lurcher:''
-	<<= App.UI.SlaveList.render.listMarkup([$LurcherID], [],
+	<<includeDOM App.UI.SlaveList.render([$LurcherID], new Array(),
 		(slave) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Coursing Association', () => removeJob(slave, Job.LURCHER)))>>
 <</if>>
 
 <br><br>''Select a slave to course as a Lurcher:''
 <br><br>
-<<= App.UI.SlaveList.slaveSelectionList(
+<<includeDOM App.UI.SlaveList.slaveSelectionList(
 		s => $LurcherID !== s.ID && canWalk(s) && canHold(s) && (canSee(s) || canHear(s)) && s.fuckdoll === 0 && isSlaveAvailable(s),
 		(slave) => App.UI.DOM.link(SlaveFullName(slave), () => assignmentTransition(slave, Job.LURCHER, "Coursing Association"))
 	)>>
diff --git a/src/uncategorized/dairy.tw b/src/uncategorized/dairy.tw
index 396eb8897115e729bace9738ada62020150cf479..8000aeccd8b2ac77311f935dd3c298f4c8526a3c 100644
--- a/src/uncategorized/dairy.tw
+++ b/src/uncategorized/dairy.tw
@@ -720,7 +720,7 @@
 <p>
 	<<set _facility = App.Entity.facilities.dairy>>
 	<<if ($Milkmaid != 0)>>
-		<<print App.UI.SlaveList.displayManager(_facility)>>
+		<<includeDOM App.UI.SlaveList.displayManager(_facility)>>
 		<<if canAchieveErection($Milkmaid) && $Milkmaid.pubertyXY == 1>>
 			<<setLocalPronouns $Milkmaid>>
 			<<if $milkmaidImpregnates == 1>>
@@ -762,7 +762,7 @@
 
 
 <p>
-	<<print App.UI.SlaveList.listSJFacilitySlaves(_facility)>>
+	<<includeDOM App.UI.SlaveList.listSJFacilitySlaves(_facility)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw
index 4004c7f2d221c535da500a3e67b4d8e82c8c6538..c5b32164e1197cef02bb9a8e63729140053f1c3a 100644
--- a/src/uncategorized/dairyReport.tw
+++ b/src/uncategorized/dairyReport.tw
@@ -63,7 +63,7 @@
 			<<if _slave.belly >= 5000>>
 				<<set _MMWorkout++>>
 			<</if>>
-			<<if !canWalk(_slave)>> /* big bonus if they can't move themselves and are fat as cows */
+			<<if !canMove(_slave)>> /* big bonus if they can't move themselves and are fat as cows */
 				<<if _slave.weight >= 70>>
 					<<set _MMWorkout += 2>>
 				<</if>>
@@ -79,6 +79,22 @@
 				<<if _slave.belly >= 5000>>
 					<<set _MMWorkout += 2>>
 				<</if>>
+			<<elseif !canWalk(_slave)>> /* smaller bonus if they are fat as cows and need assistanace with moving */
+				<<if _slave.weight >= 70>>
+					<<set _MMWorkout += 1>>
+				<</if>>
+				<<if _slave.weight >= 160>>
+					<<set _MMWorkout += 1>>
+				<</if>>
+				<<if _slave.boobs >= 20000>>
+					<<set _MMWorkout += 1>>
+				<</if>>
+				<<if _slave.balls >= 30>>
+					<<set _MMWorkout += 1>>
+				<</if>>
+				<<if _slave.belly >= 5000>>
+					<<set _MMWorkout += 1>>
+				<</if>>
 			<</if>>
 			<<if ($dairyStimulatorsSetting < 2) && ($Milkmaid.dick > 4) && (canPenetrate($Milkmaid)) && _prostateStim != 1>>
 				<<if (_slave.balls > 0) && (_slave.prostate > 0)>>
diff --git a/src/uncategorized/djSelect.tw b/src/uncategorized/djSelect.tw
index 721284c8b0bf9be71ef29ac835897be55e377d5c..7a962c67acb2dcb087239931f6a6fc6ff834293f 100644
--- a/src/uncategorized/djSelect.tw
+++ b/src/uncategorized/djSelect.tw
@@ -11,4 +11,4 @@
 <br><br>''Appoint a DJ from your devoted slaves:''
 <br><br>[[None|Club][removeJob(_S.DJ, "be the DJ")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.club, "Club")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.club, "Club")>>
diff --git a/src/uncategorized/freeRangeDairyAssignmentScene.tw b/src/uncategorized/freeRangeDairyAssignmentScene.tw
index 113cb90f27a87c8e0bc2e849f1f892a6fb4dc64a..91b07256059868e1de973e85924d63848c95fc51 100644
--- a/src/uncategorized/freeRangeDairyAssignmentScene.tw
+++ b/src/uncategorized/freeRangeDairyAssignmentScene.tw
@@ -22,7 +22,7 @@
 /* AROUSAL WHEN ENTERING */
 <<set _aroused = false >>
 <<if App.Entity.facilities.dairy.employeesIDs().size > 1 && canSee($activeSlave)>>
-	While <<if canWalk($activeSlave) >>walking<<else>>being carried<</if>> to $his designated stall, $he passes the other cows currently at their milking machines. Not being hurried, $he occasionally watches a cow in detail.
+	While <<if canWalk($activeSlave)>>walking<<elseif canMove($activeSlave)>>being helped<<else>>being carried<</if>> to $his designated stall, $he passes the other cows currently at their milking machines. Not being hurried, $he occasionally watches a cow in detail.
 	<div>
 		<<if $activeSlave.fetish == "boobs">>
 			/* TODO: check if there actually are lactating cows at the dairy */
diff --git a/src/uncategorized/headGirlSuite.tw b/src/uncategorized/headGirlSuite.tw
index af33f0331020b0323f7509c9dcb70063ec36771d..3e1d5f0c8850c6fff477df0ad3761786bcd983df 100644
--- a/src/uncategorized/headGirlSuite.tw
+++ b/src/uncategorized/headGirlSuite.tw
@@ -58,7 +58,7 @@
 		</div>
 	<</if>>
 	<p>
-		<<print App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.headGirlSuite)>>
+		<<includeDOM App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.headGirlSuite)>>
 	</p>
 <</if>>
 <p>
diff --git a/src/uncategorized/hgSelect.tw b/src/uncategorized/hgSelect.tw
index f729326e0e55e7b14bd8c46ce20f2db40176bba3..9b59519943036776a718a4ba2ca4f1ea753d87fc 100644
--- a/src/uncategorized/hgSelect.tw
+++ b/src/uncategorized/hgSelect.tw
@@ -91,4 +91,4 @@ _HGName
 <br><br>''Appoint a Head Girl from among your devoted slaves:''
 <br><br>[[None|Main][removeJob($HeadGirl, "be your Head Girl")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.headGirlSuite, "Main")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.headGirlSuite, "Main")>>
diff --git a/src/uncategorized/madamSelect.tw b/src/uncategorized/madamSelect.tw
index e72ea4a101805ba5b7f76eda8709d2ee7a88ad01..ef9dd5cba03b64805673f427aa54641c13ff5eeb 100644
--- a/src/uncategorized/madamSelect.tw
+++ b/src/uncategorized/madamSelect.tw
@@ -12,4 +12,4 @@
 <br><br>''Appoint a Madam from your devoted slaves:''
 <br><br>[[None|Brothel][removeJob($Madam, "be the Madam")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.brothel, "Brothel")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.brothel, "Brothel")>>
diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw
index 0b76b7221c2b427d8e8044ed7049d83adc368824..0229238230ddfe704103747f803dd22d64db975c 100644
--- a/src/uncategorized/manageArcology.tw
+++ b/src/uncategorized/manageArcology.tw
@@ -107,14 +107,36 @@
 	</div>
 
 	<div>
-	<<run FCTV.manage()>>
 	<<if $FCTV.receiver > -1 && !$FCTV.weekEnabled>>
-		You have not installed an FCTV receiver.
-		Installing this receiver yourself will cost <<print cashFormat(Math.trunc(25000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.
-		You can have your citizens pay for the fiberoptic upgrades, reducing the cost to <<print cashFormat(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.
-		You can also have them heavily subsidize installation, they will be upset about it, but it will only cost <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology*$HackingSkillMultiplier))>>.
+		<<set _noSub = Math.trunc(25000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
+		<<set _lightSub = Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
+		<<set _heavySub = Math.trunc(10000*$upgradeMultiplierArcology*$HackingSkillMultiplier)>>
 
-		[[No subsidy|Manage Arcology][cashX(forceNeg(Math.trunc(25000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $FCTV.receiver = 1, $FCTV.weekEnabled = $week, repX(500, "capEx"), $PC.skill.hacking += 1]] | [[Light subsidy|Manage Arcology][cashX(forceNeg(Math.trunc(20000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $FCTV.receiver = 1, $FCTV.weekEnabled= $week, $PC.skill.hacking += 1]] | [[Heavy subsidy|Manage Arcology][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology*$HackingSkillMultiplier)), "capEx"), $FCTV.receiver = 1, $FCTV.weekEnabled = $week, repX(-1500, "capEx"), $PC.skill.hacking += 1]]
+		You have not installed an FCTV receiver.
+		Installing this receiver yourself will cost <<print cashFormat(_noSub)>>.
+		You can have your citizens pay for the fiberoptic upgrades, reducing the cost to <<print cashFormat(_lightSub)>>.
+		You can also have them heavily subsidize installation, they will be upset about it, but it will only cost <<print cashFormat(_heavySub)>>.
+
+		<<link "No subsidy" "Manage Arcology">>
+			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
+			<<run FCTV.initChannels()>>
+			<<run cashX(forceNeg(_noSub), "capEx")>>
+			<<run repX(500, "capEx")>>
+		<</link>>
+		|
+		<<link "Light subsidy" "Manage Arcology">>
+			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
+			<<run FCTV.initChannels()>>
+			<<run cashX(forceNeg(_lightSub), "capEx")>>
+			/* No rep change */
+		<</link>>
+		|
+		<<link "Heavy subsidy" "Manage Arcology">>
+			<<set $FCTV.receiver = 1, $FCTV.weekEnabled = $week, $PC.skill.hacking += 1>>
+			<<run FCTV.initChannels()>>
+			<<run cashX(forceNeg(Math.trunc(_heavySub), "capEx")>>
+			<<run repX(-1500, "capEx")>>
+		<</link>>
 	<<elseif ($FCTV.receiver == 3)>>
 		You have installed the FCTV receiver and have access to the full range of FCTV's programs. High viewership rates amongst your citizens makes it easier to pursue your societal goals.
 	<<elseif ($FCTV.receiver == 2)>>
diff --git a/src/uncategorized/masterSuite.tw b/src/uncategorized/masterSuite.tw
index efa64270a4d4f9649e1bc1f395ec8c4a96ec3496..c7d5fc3a683355a4f759a4444c850ecbc7e28472 100644
--- a/src/uncategorized/masterSuite.tw
+++ b/src/uncategorized/masterSuite.tw
@@ -360,7 +360,7 @@ $masterSuiteNameCaps is furnished
 <</if>>
 
 <br><br>
-<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.masterSuite)>>
+<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.masterSuite)>>
 
 <br><br>Rename $masterSuiteName: <<textbox "$masterSuiteName" $masterSuiteName "Master Suite">> //Use a noun or similar short phrase//
 
diff --git a/src/uncategorized/masterSuiteReport.tw b/src/uncategorized/masterSuiteReport.tw
index beebf96c583f4c9e24e7b5243e0b66986703053f..011d38e4bb5f810e78c101a6bdbfcaf3c86d0645 100644
--- a/src/uncategorized/masterSuiteReport.tw
+++ b/src/uncategorized/masterSuiteReport.tw
@@ -365,7 +365,7 @@
 		<<if $verboseDescriptions == 1>>
 			<br>&nbsp;&nbsp;&nbsp;&nbsp;$He <<= App.SlaveAssignment.pleaseYou(_slave)>>
 			<br>&nbsp;&nbsp;&nbsp;
-			<<if $servantMilkers == 1 && _slave.lactation > 0 && _slave.fuckdoll == 0 && _slave.fetish != "mindbroken" && canWalk(_slave) && _slave.intelligence+_slave.intelligenceImplant >= -90>>
+			<<if $servantMilkers == 1 && _slave.lactation > 0 && _slave.fuckdoll == 0 && _slave.fetish != "mindbroken" && canMove(_slave) && _slave.intelligence+_slave.intelligenceImplant >= -90>>
 				When $his breasts begin to feel full and you aren't around, $he avails $himself to the penthouse milkers and
 				<<set $servantMilkersMultiplier = 0.25>>
 				<<run App.SlaveAssignment.getMilked(_slave)>>
@@ -385,7 +385,7 @@
 			<<silently>>
 			<<include "SA chooses own job">>
 			<<run App.SlaveAssignment.pleaseYou(_slave)>>
-			<<if $servantMilkers == 1 && _slave.lactation > 0 && _slave.fuckdoll == 0 && _slave.fetish != "mindbroken" && canWalk(_slave) && _slave.intelligence+_slave.intelligenceImplant >= -90>>
+			<<if $servantMilkers == 1 && _slave.lactation > 0 && _slave.fuckdoll == 0 && _slave.fetish != "mindbroken" && canMove(_slave) && _slave.intelligence+_slave.intelligenceImplant >= -90>>
 				<<set $servantMilkersMultiplier = 0.25>>
 				<<run App.SlaveAssignment.getMilked(_slave)>>
 				<<set $servantMilkersMultiplier = 1>>
diff --git a/src/uncategorized/milkmaidSelect.tw b/src/uncategorized/milkmaidSelect.tw
index 1123fb3d52790e7d81708c6330d72b4e06133fe1..36069c2e9c08c7a57e0c1f7a05019ab010c5aca1 100644
--- a/src/uncategorized/milkmaidSelect.tw
+++ b/src/uncategorized/milkmaidSelect.tw
@@ -12,4 +12,4 @@
 <br><br>''Appoint a Milkmaid from your obedient slaves:''
 <br><br>[[None|Dairy][removeJob($Milkmaid, "be the Milkmaid")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.dairy, "Dairy")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.dairy, "Dairy")>>
diff --git a/src/uncategorized/newGamePlus.tw b/src/uncategorized/newGamePlus.tw
index ed8e42b62e09064ac4ca23b74b50995e39b6a931..f582693fbfdbe64819a34ad5ddee809f29d225c5 100644
--- a/src/uncategorized/newGamePlus.tw
+++ b/src/uncategorized/newGamePlus.tw
@@ -1,10 +1,6 @@
 :: New Game Plus [nobr]
 
 <<set $ui = "start">> <<unset $SlaveSummaryFiler>>
-<<if ndef $slavesToImport>>
-	<<silently>><<include "Backwards Compatibility">><</silently>>
-<</if>>
-<<if ndef $slavesToImport>><<set $slavesToImport = 0>><</if>>
 <<if ndef $slavesToImportMax>><<set $slavesToImportMax = 5>><</if>>
 
 <<set _fee = 50000+($slavesToImportMax*10000)>>
@@ -54,7 +50,7 @@ You <<if $cash >= _fee>>have<<else>>lack<</if>> the funds to bring more than $sl
 
 <<if $cheatMode == 1>> <<link "DEBUG: Add all slaves to import list" "New Game Plus">> <<for _ngi = 0; _ngi < $slaves.length; _ngi++>> <<= assignJob($slaves[_ngi], Job.IMPORTED)>> <</for>> <</link>> <br> <</if>>
 
-Select up to $slavesToImportMax slaves to be imported into a new game and then click [[here.|init][$saveImported = 1,$oldCareer = "undefined",$slavesToImport = 0]]
+Select up to $slavesToImportMax slaves to be imported into a new game and then click [[here.|init][$saveImported = 1,$oldCareer = "undefined"]]
 
 <br>
-<<print App.UI.SlaveList.listNGPSlaves()>>
+<<includeDOM App.UI.SlaveList.listNGPSlaves()>>
diff --git a/src/uncategorized/newSlaveIntro.tw b/src/uncategorized/newSlaveIntro.tw
index f8f47d1f01d3a3383bb874dcf7f4b28499633603..44c4d5cf6691a27f2e62c86217d2b1740eafd640 100644
--- a/src/uncategorized/newSlaveIntro.tw
+++ b/src/uncategorized/newSlaveIntro.tw
@@ -95,7 +95,7 @@
 <</if>>
 
 <p>
-The legalities completed, <span class='slave-name'><<= SlaveFullName($activeSlave)>></span> <<if !hasAnyLegs($activeSlave)>><<if isAmputee($activeSlave)>>lies<<else>>rests<</if>> helplessly on your desk,<<elseif !canWalk($activeSlave)>>kneels before your desk,<<else>>stands before your desk,<</if>>
+The legalities completed, <span class='slave-name'><<= SlaveFullName($activeSlave)>></span> <<if !hasAnyLegs($activeSlave)>><<if isAmputee($activeSlave)>>lies<<else>>rests<</if>> helplessly on your desk,<<elseif !canStand($activeSlave)>>kneels before your desk,<<else>>stands before your desk,<</if>>
 <<if $activeSlave.devotion < -50>>
 	<<if canSee($activeSlave)>>looking you in the eyes<<else>>directly facing you<</if>> with defiance.
 <<elseif $activeSlave.devotion < -20>>
diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw
index 25f8249827c013185df19ac7747724b752bc9624..262c4c606437daec3162e5aa103526bf9be78fbc 100644
--- a/src/uncategorized/nextWeek.tw
+++ b/src/uncategorized/nextWeek.tw
@@ -348,7 +348,7 @@
 <<set $beforeGingering = null>>
 
 /% Strings Memory varies. %/
-<<set $buyer = "", $desc = "", $event = "", $goto = "", $malefactor = "", $oldName = "", $oldSurname = "">>
+<<set $buyer = "", $desc = "", $event = "", $goto = "", $malefactor = "">>
 /% Done with zeroing out, what should be for the most part Temps %/
 
 <<if $autosave != 0>>
diff --git a/src/uncategorized/nonRandomEvent.tw b/src/uncategorized/nonRandomEvent.tw
index 2f8e6418f85ef3f95c934c6c419839a87ea46a2d..2b47ddbf08dc62cf7e0735312e99a1e7906ace20 100644
--- a/src/uncategorized/nonRandomEvent.tw
+++ b/src/uncategorized/nonRandomEvent.tw
@@ -96,19 +96,17 @@
 	<<goto "P collaboration choice">>
 <<elseif (_effectiveWeek == 69)>>
 	<<goto "P hacker support">>
-<<elseif (_effectiveWeek == 70) && ($collaboration == 1)>>
-	<<if $traitorType != "trapper">>
-		<<goto "P coup collaboration">>
-	<<else>>
-		<<goto "P coup betrayal">>
-	<</if>>
+<<elseif (_effectiveWeek == 70) && ($collaboration == 1) && $traitorType != "trapper">>
+	<<goto "P coup collaboration">>
 <<elseif (_effectiveWeek == 71)>>
 	<<if $traitorType != "agent" && $traitorType != "trapper">>
 		<<set _doubleAgent = 0>>
 	<<else>>
 		<<set _doubleAgent = 1>>
 	<</if>>
-	<<if $mercenaries + $personalArms + $hackerSupport + _doubleAgent < 5>>
+	<<if $traitorType == "trapper">>
+		<<goto "P coup betrayal">>
+	<<elseif $mercenaries + $personalArms + $hackerSupport + _doubleAgent < 5>>
 		<<goto "P coup loss">>
 	<<else>>
 		<<goto "P coup attempt">>
diff --git a/src/uncategorized/nurseSelect.tw b/src/uncategorized/nurseSelect.tw
index f6ad039bf404f48abf8e98ab2abf596dba3ad50c..84211a0e169b22a1ea03c3bf0e92c6006fdfad19 100644
--- a/src/uncategorized/nurseSelect.tw
+++ b/src/uncategorized/nurseSelect.tw
@@ -12,4 +12,4 @@
 <br><br>[[None|Clinic][removeJob(_S.Nurse, "be the Nurse")]]
 <br><br>
 
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.clinic, "Clinic")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.clinic, "Clinic")>>
diff --git a/src/uncategorized/officeDescription.tw b/src/uncategorized/officeDescription.tw
index 1c2bf5c9aaccb9bbbe6626d6873070a5640e2168..d65e275d37d2728335e46fbc03428e18518e71b7 100644
--- a/src/uncategorized/officeDescription.tw
+++ b/src/uncategorized/officeDescription.tw
@@ -7,11 +7,11 @@
 
 <<if $clubAdsSpending >= 5000>>
 	A corner of your desk is piled with sample merchandise from the campaign promoting your club.
-	<<set _eventSlaves = $slaves.filter(function(s) { return s.assignment == "serve in the club" && canWalk(s); })>>
+	<<set _eventSlaves = $slaves.filter(function(s) { return s.assignment == "serve in the club"; })>>
 	<<if _eventSlaves.length > 0>>
 		<<set $activeSlave = _eventSlaves.random()>>
 		<<setLocalPronouns $activeSlave>>
-		<<if random(1,2) == 1>>
+		<<if random(1,2) == 1 || !canStand($activeSlave)>>
 			This includes a sex toy based on $activeSlave.slaveName's
 			<<if (random(1,3) == 1) && ($activeSlave.skill.vaginal >= 100)>>
 				<<if $activeSlave.vagina > 3>>massive vagina<<elseif $activeSlave.vagina > 2>>gaping cunt<<elseif $activeSlave.vagina > 1>>hot cunt<<elseif $activeSlave.vagina > 0>>tight pussy<<else>>virgin pussy<</if>>.
@@ -38,11 +38,11 @@
 	<<else>>
 		A corner of your desk is piled with sample merchandise from the campaign promoting $brothelName.
 	<</if>>
-	<<set _eventSlaves = $slaves.filter(function(s) { return s.assignment == "work in the brothel" && canWalk(s); })>>
+	<<set _eventSlaves = $slaves.filter(function(s) { return s.assignment == "work in the brothel"; })>>
 	<<if _eventSlaves.length > 0>>
 		<<set $activeSlave = _eventSlaves.random()>>
 		<<setLocalPronouns $activeSlave>>
-		<<if random(1,2) == 1>>
+		<<if random(1,2) == 1 || !canStand($activeSlave)>>
 			This includes a sex toy based on $activeSlave.slaveName's
 			<<if (random(1,3) == 1) && ($activeSlave.skill.vaginal >= 100)>>
 				<<if $activeSlave.vagina > 3>>massive vagina<<elseif $activeSlave.vagina > 2>>gaping cunt<<elseif $activeSlave.vagina > 1>>hot cunt<<elseif $activeSlave.vagina > 0>>tight pussy<<else>>virgin pussy<</if>>.
diff --git a/src/uncategorized/pCoupBetrayal.tw b/src/uncategorized/pCoupBetrayal.tw
index 4b388663b06e1c4762eec16285d530e433f06ec1..8fbf09d33914d84d5cc10c90aa09dbcb624e3333 100644
--- a/src/uncategorized/pCoupBetrayal.tw
+++ b/src/uncategorized/pCoupBetrayal.tw
@@ -29,9 +29,8 @@ You are awakened in the middle of the night by a jolt that shakes the entire arc
 @@.yellow;The Daughters of Liberty are utterly crushed.@@ $arcologies[0].name has been slightly damaged in the crossfire, but even as the last pockets of resistance are cleaned up, your citizens begin repairs themselves. The effect on your reputation is @@.green;immensely positive,@@ since you won without lifting a finger and the arcology's prosperity, if anything, was benefited. However, the PMCs took the lion's share of the loot.
 
 <<run cashX(-10000, "war")>>
-<<run cashX(forceNeg(Math.trunc($cash*0.3)), "war")>>
-<<set $arcologies[0].prosperity = Math.trunc($arcologies[0].prosperity*0.5)>>
-<<run repX(500, "war")>>
+<<set $arcologies[0].prosperity = Math.trunc($arcologies[0].prosperity*0.9)>>
+<<run repX(5000, "war")>>
 <<set $daughtersVictory = 3>>
 <<set $desc = "a leftover banner bearing Daughters of Liberty insignia">>
 <<set $trinkets.push($desc)>>
diff --git a/src/uncategorized/personalAttentionSelect.tw b/src/uncategorized/personalAttentionSelect.tw
index 74c8f24c04d6af32566e9a6f75b94aa9946b215a..c4516490fe4d061924b6ad093dfdfda1e86914eb 100644
--- a/src/uncategorized/personalAttentionSelect.tw
+++ b/src/uncategorized/personalAttentionSelect.tw
@@ -359,7 +359,7 @@
 <</if>> /* CLOSES NO SLAVE SELECTED */
 
 <br><br>__Select a slave to train:__ <<if $PC.skill.slaving >= 100>>//Your @@.springgreen;slaving experience@@ allows you to divide your attention between more than one slave each week, with slightly reduced efficiency//<</if>>
-<<= App.UI.SlaveList.slaveSelectionList(
+<<includeDOM App.UI.SlaveList.slaveSelectionList(
 		s => assignmentVisible(s) && s.fuckdoll === 0,
 		s => App.UI.DOM.link(SlaveFullName(s), (id) => {App.UI.selectSlaveForPersonalAttention(id); }, s.ID)
 	)>>
diff --git a/src/uncategorized/pit.tw b/src/uncategorized/pit.tw
index 8379add2ba0818f9351fa299b9d0a8a6e45a9e56..23b9f4956ec74aa5ce70650130574e48e9a6234b 100644
--- a/src/uncategorized/pit.tw
+++ b/src/uncategorized/pit.tw
@@ -331,7 +331,7 @@ $pitNameCaps is clean and ready,
 <</if>>
 <br><br>
 
-<<print App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.pit, passage(), false,
+<<includeDOM App.UI.SlaveList.listSJFacilitySlaves(App.Entity.facilities.pit, passage(), false,
 {assign: "Select a slave to fight", remove: "Cancel a slave's fight"})>>
 
 <br><br>Rename $pitName: <<textbox "$pitName" $pitName "Pit">> //Use a noun or similar short phrase//
diff --git a/src/uncategorized/recruiterSelect.tw b/src/uncategorized/recruiterSelect.tw
index 49ad10e6d6d3c9f3b5720de175404330b1533935..91f29f6dcdea9aa45c2aa043c1b0153449e0f675 100644
--- a/src/uncategorized/recruiterSelect.tw
+++ b/src/uncategorized/recruiterSelect.tw
@@ -65,4 +65,4 @@
 <br><br>''Appoint a recruiter from among your devoted slaves:''
 <br>[[None|Main][removeJob($Recruiter, "recruit girls")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.penthouse, "Main")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.penthouse, "Main")>>
diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw
index 17f1785363d4cb98d9102f8b3a395fde3980e2a5..ef6befa207f6033b25e16362784657e726cc9734 100644
--- a/src/uncategorized/saLongTermEffects.tw
+++ b/src/uncategorized/saLongTermEffects.tw
@@ -1247,7 +1247,7 @@
 				<<elseif ($slaves[$i].assignment == "be the Schoolteacher")>>
 					$His paraphilia is satisfied by $his work as the Schoolteacher.
 					<<set _para = 1>>
-				<<elseif canWalk($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
+				<<elseif canMove($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
 					$His paraphilia makes pinning down and raping other slaves very satisfying.
 					<<set _para = 1>>
 				<<else>>
@@ -1278,7 +1278,7 @@
 				<<elseif ($slaves[$i].assignment == "be the Wardeness")>>
 					$His paraphilia is satisfied by $his work as your Wardeness.
 					<<set _para = 1>>
-				<<elseif canWalk($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
+				<<elseif canMove($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
 					$His paraphilia makes pinning down and brutally raping other slaves very satisfying.
 					<<set _para = 1>>
 				<<else>>
@@ -4464,7 +4464,7 @@
 	<<if canGetPregnant($slaves[$i]) && (($slaves[$i].assignment == "work in the dairy" && $dairyPregSetting == 0) || $slaves[$i].assignment != "work in the dairy")>>
 
 		<<set _conceptionSeed = random(1,100)>>
-		<<set _studIgnoresRules = (_Stud && $universalRulesImpregnation == "Stud" && _Stud.career == "a breeding bull" && _Stud.fetish == "mindbroken" && canWalk(_Stud)) ? 1 : 0>>
+		<<set _studIgnoresRules = (_Stud && $universalRulesImpregnation == "Stud" && _Stud.career == "a breeding bull" && _Stud.fetish == "mindbroken" && canMove(_Stud)) ? 1 : 0>>
 
 		<<if ($universalRulesImpregnation == "PC") && canImpreg($slaves[$i], $PC)>>
 			$slaves[$i].slaveName is ripe for breeding, so you ejaculate inside $him often. When you bore of $his fertile <<if $slaves[$i].mpreg == 1>>ass<<else>>cunt<</if>>, you keep $him around as you fuck other slaves so you can pull out of them, shove your cock into $him, and fill $him with your seed anyway.
@@ -4602,7 +4602,7 @@
 			<</if>> /* closes HG impregnation */
 		<<elseif _Stud && $slaves[$i].ID != $StudID && $universalRulesImpregnation == "Stud">>
 			<<setLocalPronouns _Stud 2>>
-			<<if ($slaves[$i].StudExclude == 1 || $slaves[$i].breedingMark == 1) && (_Stud.career != "a breeding bull" || _Stud.fetish != "mindbroken" || !canWalk(_Stud))>>
+			<<if ($slaves[$i].StudExclude == 1 || $slaves[$i].breedingMark == 1) && (_Stud.career != "a breeding bull" || _Stud.fetish != "mindbroken" || !canMove(_Stud))>>
 				It's _Stud.slaveName's role to provide sperm for fertile slaves, but $slaves[$i].slaveName is not included on the list.
 			<<elseif $universalHGImpregnateMasterSuiteToggle == 1 && ["serve in the master suite", "be your Concubine"].includes($slaves[$i].assignment)>>
 				It's _Stud.slaveName's role to provide sperm for fertile slaves, but $slaves[$i].slaveName is off-limits.
@@ -4617,7 +4617,7 @@
 				<<if _Stud.fuckdoll > 0>>
 					provide sperm for $him; all $he needs to do is signal the suit to stimulate an ejaculation.
 				<<elseif _Stud.fetish == "mindbroken">>
-					<<if _Stud.career == "a breeding bull" && canWalk(_Stud)>>
+					<<if _Stud.career == "a breeding bull" && canMove(_Stud)>>
 						impregnate fertile slaves, a task the amorous Stud performs with gusto and little regard for rules.
 						<<set _studRandiness = 1>>
 					<<else>>
@@ -6752,8 +6752,6 @@
 	<</if>>
 <</if>>
 
-/* LONG TERM PHYSICAL EFFECTS */
-
 <<if $slaves[$i].fuckdoll == 0>>
 	<<if (!jQuery.isEmptyObject($slaves[$i].brand))>>
 		<<if ($slaves[$i].assignment == "serve the public") || ($slaves[$i].assignment == "whore") || ($slaves[$i].assignment == "work in the brothel") || ($slaves[$i].assignment == "serve in the club")>>
@@ -6771,6 +6769,10 @@
 	<</if>>
 <</if>>
 
+/* LONG TERM PHYSICAL EFFECTS */
+/* start here!
+<<= App.SlaveAssignment.longTermPhysicalEffects($slaves[$i])>>
+*/
 <<if $slaves[$i].fuckdoll == 0 && $slaves[$i].fetish != "mindbroken">>
 	<<set _visionFlag = 0>>
 	<<if getBestVision($slaves[$i]) === 0>>
@@ -7669,67 +7671,250 @@
 <</if>>
 
 <<if $slaves[$i].fuckdoll == 0>>
-	<<if !canWalk($slaves[$i])>>
-		$He is immobilized by $his
+	<<if !canWalk($slaves[$i]) || !canMove($slaves[$i])>>
+		<<set _mobility = 1>>
 		<<set _anchors = []>>
-		<<if tooBigBreasts($slaves[$i])>>
-			<<set _anchors.push("tits")>>
-		<</if>>
-		<<if tooBigBelly($slaves[$i])>>
-			<<set _anchors.push("belly")>>
-		<</if>>
-		<<if tooBigDick($slaves[$i])>>
-			<<set _anchors.push("dick")>>
-		<</if>>
-		<<if tooBigButt($slaves[$i])>>
-			<<set _anchors.push("butt")>>
-		<</if>>
-		<<if tooBigBalls($slaves[$i])>>
-			<<set _anchors.push("balls")>>
-		<</if>>
-		<<if tooFatSlave($slaves[$i])>>
-			<<set _anchors.push("fat body")>>
+		<<if !canMove($slaves[$i])>>
+			<<set _mobility = 0>>
+			<<if tooFatSlave($slaves[$i])>>
+				<<set _anchors.push("fat body")>>
+			<</if>>
+			<<if ($slaves[$i].physicalAge <= 3)>>
+				<<if $slaves[$i].boobs > 25000 + ($slaves[$i].muscles * 20)>>
+					<<set _anchors.push("tits")>>
+				<</if>>
+				<<if $slaves[$i].belly >= 150000>>
+					<<set _anchors.push("belly")>>
+				<</if>>
+				<<if $slaves[$i].balls >= 30 + ($slaves[$i].muscles * 0.3)>>
+					<<set _anchors.push("balls")>>
+				<</if>>
+			<<elseif ($slaves[$i].physicalAge <= 12)>>
+				<<if $slaves[$i].boobs > 100000 + ($slaves[$i].muscles * 50)>>
+					<<set _anchors.push("tits")>>
+				<</if>>
+				<<if $slaves[$i].belly >= 300000>>
+					<<set _anchors.push("belly")>>
+				<</if>>
+				<<if $slaves[$i].balls >= 60 + ($slaves[$i].muscles * 0.5)>>
+					<<set _anchors.push("balls")>>
+				<</if>>
+			<<elseif ($slaves[$i].physicalAge < 18)>>
+				<<if $slaves[$i].boobs > 250000 + ($slaves[$i].muscles * 100)>>
+					<<set _anchors.push("tits")>>
+				<</if>>
+				<<if $slaves[$i].belly >= 600000>>
+					<<set _anchors.push("belly")>>
+				<</if>>
+				<<if $slaves[$i].balls >= 90 + ($slaves[$i].muscles * 0.7)>>
+					<<set _anchors.push("balls")>>
+				<</if>>
+			<<else>>
+				<<if $slaves[$i].boobs > 500000 + ($slaves[$i].muscles * 200)>>
+					<<set _anchors.push("tits")>>
+				<</if>>
+				<<if $slaves[$i].belly >= 1000000>>
+					<<set _anchors.push("belly")>>
+				<</if>>
+				<<if $slaves[$i].balls >= 90 + ($slaves[$i].muscles * 0.7)>>
+					<<set _anchors.push("balls")>>
+				<</if>>
+			<</if>>
+		<<else>>
+			<<if tooBigBreasts($slaves[$i])>>
+				<<set _anchors.push("tits")>>
+			<</if>>
+			<<if tooBigBelly($slaves[$i])>>
+				<<set _anchors.push("belly")>>
+			<</if>>
+			<<if tooBigDick($slaves[$i])>>
+				<<set _anchors.push("dick")>>
+			<</if>>
+			<<if tooBigButt($slaves[$i])>>
+				<<set _anchors.push("butt")>>
+			<</if>>
+			<<if tooBigBalls($slaves[$i])>>
+				<<set _anchors.push("balls")>>
+			<</if>>
+			<<if tooFatSlave($slaves[$i])>>
+				<<set _anchors.push("fat body")>>
+			<</if>>
 		<</if>>
-		<<if _anchors.length > 0>>
-			<<print _anchors.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; })>>
-			<<if (isAmputee($slaves[$i]))>>
-				<<if _anchors.length > 1>>but ultimately $his limblessness<<else>>or would be if $he had limbs<</if>>,
-			<<elseif (!hasAnyLegs($slaves[$i]))>>
-				<<if _anchors.length > 1>>but ultimately $his leglessness<<else>>or would be if $he had legs<</if>>,
-			<<elseif (!hasBothLegs($slaves[$i]))>>
-				<<if _anchors.length > 1>>but ultimately $his missing leg<<else>>or would be if $he had both legs<</if>>,
-			<<elseif $slaves[$i].heels == 1 && !["boots", "extreme heels", "heels", "pumps"].includes($slaves[$i].shoes)>>
-				<<if _anchors.length > 1>>but ultimately $his heels having been clipped<<else>>or would be if $his heels weren't clipped<</if>>,
+		<<if _mobility>>
+			$His
+			<<if _anchors.length > 0>>
+				<<print _anchors.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; })>>
+				<<if (isAmputee($slaves[$i]))>>
+					<<if _anchors.length > 1>>but ultimately $his limblessness<<else>>or would be if $he had limbs<</if>>,
+				<<elseif (!hasAnyLegs($slaves[$i]))>>
+					<<if _anchors.length > 1>>but ultimately $his leglessness<<else>>or would be if $he had legs<</if>>,
+				<<elseif (!hasBothLegs($slaves[$i]))>>
+					<<if _anchors.length > 1>>but ultimately $his missing leg<<else>>or would be if $he had both legs<</if>>,
+				<<elseif $slaves[$i].heels == 1 && !setup.highHeels.includes($slaves[$i].shoes)>>
+					<<if _anchors.length > 1>>but ultimately $his heels having been clipped<<else>>or would be if $his heels weren't clipped<</if>>,
+				<</if>>
+				render<<if _anchors.length == 1>>s<</if>>
+			<<else>>
+				<<if (isAmputee($slaves[$i]))>>
+					limblessness renders
+				<<elseif (!hasAnyLegs($slaves[$i]))>>
+					leglessness renders
+				<<elseif (!hasBothLegs($slaves[$i]))>>
+					missing leg renders
+				<<elseif $slaves[$i].heels == 1 && !["boots", "extreme heels", "heels"].includes($slaves[$i].shoes)>>
+					clipped heels render
+				<</if>>
 			<</if>>
+			$him incapable of walking,
 		<<else>>
-			<<if (isAmputee($slaves[$i]))>>
-				limblessness,
-			<<elseif (!hasAnyLegs($slaves[$i]))>>
-				leglessness,
-			<<elseif (!hasBothLegs($slaves[$i]))>>
-				missing leg,
-			<<elseif $slaves[$i].heels == 1 && !["boots", "extreme heels", "heels", "pumps"].includes($slaves[$i].shoes)>>
-				heels having been clipped,
+			$He is immobilized by $his
+			<<if _anchors.length > 0>>
+				<<print _anchors.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; })>>
+				<<if (isAmputee($slaves[$i]))>>
+					<<if _anchors.length > 1>>but ultimately $his limblessness<<else>>or would be if $he had limbs<</if>>,
+				<<elseif (!hasAnyLegs($slaves[$i]))>>
+					<<if _anchors.length > 1>>but ultimately $his leglessness<<else>>or would be if $he had legs<</if>>,
+				<</if>>
+			<<else>>
+				<<if (isAmputee($slaves[$i]))>>
+					limblessness,
+				<<elseif (!hasAnyLegs($slaves[$i]))>>
+					leglessness,
+				<</if>>
 			<</if>>
 		<</if>>
-		making $his life more difficult. Other slaves have to help $him at times, which
+		making $his life more difficult.
 		<<if $slaves[$i].fetish != "mindbroken">>
-			<<if $slaves[$i].devotion > 50>>
+			<<if _mobility>>
+				<<if $slaves[$i].rules.mobility == "restrictive">>
+					<<if $slaves[$i].devotion < -20>>
+						$He <span class="mediumorchid">hates being forced</span> to crawl around like some kind of animal, but it keeps $him properly <span class="gold">afraid.</span>
+						<<set $slaves[$i].devotion -= 2>>
+						<<set $slaves[$i].trust -= 4>>
+					<<elseif $slaves[$i].devotion >= -20>>
+						<<if $slaves[$i].fetish == "submissive">>
+							<<if $slaves[$i].fetishKnown == 1>>
+								$He <span class="hotpink">loves being forced</span> to crawl around like some kind of animal.
+								<<set $slaves[$i].devotion += 1>>
+							<<else>>
+								$He seems to enjoy $his forced prostration to anyone that comes $his way. @@.lightcoral;$He's a natural submissive!@@
+								<<set $slaves[$i].fetishKnown = 1>>
+							<</if>>
+							<<set _likesImmobility = 1>>
+						<<elseif $slaves[$i].fetish == "humiliation">>
+							<<if $slaves[$i].fetishKnown == 1>>
+								$He <span class="hotpink">revels in the humiliation</span> of being forced to crawl around in the dirt.
+								<<set $slaves[$i].devotion += 1>>
+							<<else>>
+								$He seems to be excited by the humiliation not being able to walk brings. @@.lightcoral;$He's enjoys being degraded!@@
+								<<set $slaves[$i].fetishKnown = 1>>
+							<</if>>
+							<<set _likesImmobility = 1>>
+						<<elseif $slaves[$i].devotion > 50>>
+							It is your will that $he crawl around on
+							<<if (hasAllLimbs($slaves[$i]))>>
+								all fours,
+							<<else>>
+								the ground,
+							<</if>>
+							so $he embraces it as normality.
+						<<elseif $slaves[$i].devotion > 20>>
+							$He accepts being forced to crawl around on
+							<<if (hasAllLimbs($slaves[$i]))>>
+								all fours
+							<<else>>
+								the ground
+							<</if>>
+							as part of slave life.
+						<<else>>
+							Being forced to crawl around on
+							<<if (hasAllLimbs($slaves[$i]))>>
+								all fours
+							<<else>>
+								the ground
+							<</if>>
+							@@.hotpink;breaks down any remaining dignity@@ $he may have and keeps $him @@.gold;well aware of $his total vulnerability@@ to punishment.
+							<<set $slaves[$i].devotion += 2>>
+							<<set $slaves[$i].trust -= 1>>
+						<</if>>
+					<</if>>
+				<<else>>
+					<<if $slaves[$i].devotion > 50>>
+						@@.mediumaquamarine;$He is thankful@@ that $he serves a <<= writtenMaster($slaves[$i])>> so kind as to permit $him the tools $he needs to not be reduced to crawling.
+						<<set $slaves[$i].trust += 1>>
+					<<elseif $slaves[$i].devotion > 20>>
+						@@.mediumaquamarine;$He appreciates@@ being given the means to maintain some semblance of mobility.
+						<<set $slaves[$i].trust += 2>>
+					<<elseif $slaves[$i].devotion >= -20>>
+						@@.mediumaquamarine;$He takes full advantage@@ of the provided mobility aids to avoid being forced to crawl everywhere.
+						<<set $slaves[$i].trust += 3>>
+					<<else>>
+						Anything is better than crawling on the floor, so $he makes full use of the provided mobility aids @@.mediumaquamarine;to avoid such an indignity.@@
+					<</if>>
+				<</if>>
+			<<else>>
+				<<if $slaves[$i].devotion < -20>>
+					$He can't can't escape those looking to prey upon $him, <span class="gold">terrifying $him.</span>
+					<<set $slaves[$i].trust -= 4>>
+				<<elseif $slaves[$i].devotion >= -20>>
+					<<if $slaves[$i].fetish == "submissive">>
+						<<if $slaves[$i].fetishKnown == 1>>
+							$He <span class="hotpink">loves having no choice but to be submissive</span> if $he wants assistance.
+							<<set $slaves[$i].devotion += 1>>
+						<<else>>
+							$He seems to enjoy being at the mercy of you and your chattel. @@.lightcoral;$He's a natural submissive!@@
+							<<set $slaves[$i].fetishKnown = 1>>
+						<</if>>
+						<<set _likesImmobility = 1>>
+					<<elseif $slaves[$i].fetish == "humiliation">>
+						<<if $slaves[$i].fetishKnown == 1>>
+							$He <span class="hotpink">revels in the humiliation</span> of being completely stripped of any ability to do things on $his own.
+							<<set $slaves[$i].devotion += 1>>
+						<<else>>
+							$He seems to be excited by the humiliation complete immobility brings. @@.lightcoral;$He's enjoys being degraded!@@
+							<<set $slaves[$i].fetishKnown = 1>>
+						<</if>>
+						<<set _likesImmobility = 1>>
+					<<elseif $slaves[$i].devotion > 50>>
+						Since you want to keep $him from moving, $he's perfectly happy to sit around and wait for your attention.
+					<<elseif $slaves[$i].devotion > 20>>
+						$He accepts $his inability to move as part of slave life.
+					<<else>>
+						Being completely unable to move leaves $him at the mercy of others, @@.hotpink;destroying any semblance of self-reliance $he has@@ and keeps $him @@.gold;well aware of $his total vulnerability@@ to punishment.
+						<<set $slaves[$i].devotion += 3>>
+						<<set $slaves[$i].trust -= 1>>
+					<</if>>
+				<</if>>
+			<</if>>
+		<</if>>
+		<<if _mobility>>
+			Other slaves have to help $him at times, which
+		<<else>>
+			$He requires help to do nearly everything, which
+		<</if>>
+		<<if $slaves[$i].fetish != "mindbroken">>
+			<<if _likesImmobility>>
+				suits $his fetish just fine.
+			<<elseif $slaves[$i].devotion > 50>>
 				the devoted slave bears with equanimity.
 			<<elseif $slaves[$i].devotion > 20>>
 				$he can't help @@.mediumorchid;resenting@@ a little.
 				<<set $slaves[$i].devotion -= 1>>
 			<<elseif $slaves[$i].devotion >= -20>>
-				$he @@.mediumorchid;actively resents.@@
-				<<set $slaves[$i].devotion -= 2>>
+				<<if $slaves[$i].trust >= -20>>
+					$he @@.mediumorchid;actively resents.@@
+					<<set $slaves[$i].devotion -= 2>>
+				<<else>>
+					$he appreciates in $his frightening life.
+					<<set $slaves[$i].trust += 1>>
+				<</if>>
 			<<else>>
-				$he @@.mediumorchid;utterly detests.@@
-				<<set $slaves[$i].devotion -= 2>>
-			<</if>>
-			<<if $slaves[$i].devotion < 10>>
 				<<if $slaves[$i].trust >= -20>>
-					$He's @@.gold;aware of $his total vulnerability@@ to punishment.
-					<<set $slaves[$i].trust -= 1>>
+					$he @@.mediumorchid;utterly detests.@@
+					<<set $slaves[$i].devotion -= 2>>
+				<<else>>
+					$he needs in these dark times.
+					<<set $slaves[$i].trust += 2>>
 				<</if>>
 			<</if>>
 		<<else>>
@@ -7745,7 +7930,7 @@
 				<</if>>
 				<<set $slaves[$i].muscles -= 3>>
 			<</if>>
-		<<elseif !canWalk($slaves[$i]) && ($slaves[$i].diet != "muscle building")>>
+		<<elseif !canMove($slaves[$i]) && ($slaves[$i].diet != "muscle building")>>
 			<<if $slaves[$i].muscles > -80>>
 				Since $he is effectively incapable of moving $himself,
 				<<if $universalRulesImmobileSlavesMaintainMuscles == 1 && $slaves[$i].muscles >= 0>>
@@ -7880,13 +8065,15 @@
 				$His titanic breasts are so massive they dwarf $his body. $He <<if $slaves[$i].sexualFlaw == "breast growth">>happily embraces<<else>>has no choice but to accept<</if>> immobility.
 			<<elseif ($slaves[$i].boobs > 20000)>>
 				$His immense breasts are so huge they rest upon the floor even when $he tries to stand, taking the weight off $his tiny body.
-				<<if $slaves[$i].sexualFlaw == "breast growth">>
-					$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds pulling them along @@.mediumorchid;mildly annoying.@@
-					<<set $slaves[$i].devotion -= 1>>
-				<<else>>
-					$He finds pulling them along a big burden, but $his devotion to you is far stronger than $his discomfort.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breast growth">>
+						$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds pulling them along @@.mediumorchid;mildly annoying.@@
+						<<set $slaves[$i].devotion -= 1>>
+					<<else>>
+						$He finds pulling them along a big burden, but $his devotion to you is far stronger than $his discomfort.
+					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].boobs > 4700 + ($slaves[$i].muscles * 20))>>
 				<<if canWalk($slaves[$i])>>
@@ -7907,7 +8094,7 @@
 					<<else>>
 						$His giant tits are debilitatingly big. $He does everything $he can to keep comfortable and pain free as to not bother you.
 					<</if>>
-				<<else>>
+				<<elseif canMove($slaves[$i])>>
 					$His giant breasts are so big they pin $him to the floor, taking the weight off $his tiny body.
 					<<if $slaves[$i].sexualFlaw == "breast growth">>
 						$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
@@ -7983,13 +8170,15 @@
 		<<if isSlaveAvailable($slaves[$i])>>
 			<<if ($slaves[$i].boobs > 40000)>>
 				$His immense breasts are so huge they rest upon the floor even when $he tries to stand, taking the weight off $his small body.
-				<<if $slaves[$i].sexualFlaw == "breast growth">>
-					$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds pulling them along @@.mediumorchid;mildly annoying.@@
-					<<set $slaves[$i].devotion -= 1>>
-				<<else>>
-					$He finds pulling them along a burden, but $his devotion to you is far stronger than $his discomfort.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breast growth">>
+						$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds pulling them along @@.mediumorchid;mildly annoying.@@
+						<<set $slaves[$i].devotion -= 1>>
+					<<else>>
+						$He finds pulling them along a burden, but $his devotion to you is far stronger than $his discomfort.
+					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].boobs > 9500 + ($slaves[$i].muscles * 50))>>
 				<<if canWalk($slaves[$i])>>
@@ -8013,13 +8202,15 @@
 					<</if>>
 				<<else>>
 					$His giant breasts are so big they pin $him to the floor, taking the weight off $his young body.
-					<<if $slaves[$i].sexualFlaw == "breast growth">>
-						$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
-					<<elseif $slaves[$i].devotion <= 50>>
-						$He finds pulling them along @@.mediumorchid;mildly annoying.@@
-						<<set $slaves[$i].devotion -= 1>>
-					<<else>>
-						$He finds pulling them along a little annoying, but your will is far more important to $him.
+					<<if canMove($slaves[$i])>>
+						<<if $slaves[$i].sexualFlaw == "breast growth">>
+							$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
+						<<elseif $slaves[$i].devotion <= 50>>
+							$He finds pulling them along @@.mediumorchid;mildly annoying.@@
+							<<set $slaves[$i].devotion -= 1>>
+						<<else>>
+							$He finds pulling them along a little annoying, but your will is far more important to $him.
+						<</if>>
 					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].boobs > 5000)>>
@@ -8089,24 +8280,28 @@
 		<<if isSlaveAvailable($slaves[$i])>>
 			<<if ($slaves[$i].boobs > 25000 + ($slaves[$i].muscles * 100))>>
 				$His immense breasts are so big they pin $him to the floor, taking the weight off $his youthful body.
-				<<if $slaves[$i].sexualFlaw == "breast growth">>
-					$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds pulling them along @@.mediumorchid;mildly annoying.@@
-					<<set $slaves[$i].devotion -= 1>>
-				<<else>>
-					$He finds pulling them along a little annoying, but your will is far more important to $him.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breast growth">>
+						$He's perfectly fine with dragging them along as a testament to how much $he's managed to grow.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds pulling them along @@.mediumorchid;mildly annoying.@@
+						<<set $slaves[$i].devotion -= 1>>
+					<<else>>
+						$He finds pulling them along a little annoying, but your will is far more important to $him.
+					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].boobs > 17000)>>
 				$His giant tits are debilitatingly big.
-				<<if $slaves[$i].sexualFlaw == "breast growth">>
-					No amount of discomfort or pain could dissuade $him from going bigger.
-				<<elseif $slaves[$i].devotion <= 50>>
-					They are @@.mediumorchid;very uncomfortable@@ and @@.red;painful@@ for $his youthful form.
-					<<set $slaves[$i].devotion -= 3>>
-					<<run healthDamage($slaves[$i], 10)>>
-				<<else>>
-					$He finds them painfully uncomfortable, but finds ways to mitigate it to not distract you with $his worries.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breast growth">>
+						No amount of discomfort or pain could dissuade $him from going bigger.
+					<<elseif $slaves[$i].devotion <= 50>>
+						They are @@.mediumorchid;very uncomfortable@@ and @@.red;painful@@ for $his youthful form.
+						<<set $slaves[$i].devotion -= 3>>
+						<<run healthDamage($slaves[$i], 10)>>
+					<<else>>
+						$He finds them painfully uncomfortable, but finds ways to mitigate it to not distract you with $his worries.
+					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].boobs > 10000)>>
 				<<if ($slaves[$i].muscles <= 30)>>
@@ -8367,13 +8562,15 @@
 				$His _belly belly is so large it dwarfs $his body. $He <<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>enjoys<<else>>has no choice but to accept<</if>> being an accessory to $his belly.
 			<<elseif $slaves[$i].belly >= 100000>>
 				$His _belly belly is so large it reaches the floor <<if hasAnyLegs($slaves[$i])>>even when $he stands<<else>>no matter how $he rests<</if>>, taking the weight off $his tiny body.
-				<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
-					Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds dragging it along @@.mediumorchid;mildly annoying.@@
-					<<set $slaves[$i].devotion -= 1>>
-				<<else>>
-					$He's fine with this though, as it is much easier than trying to waddle along.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
+						Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds dragging it along @@.mediumorchid;mildly annoying.@@
+						<<set $slaves[$i].devotion -= 1>>
+					<<else>>
+						$He's fine with this though, as it is much easier than trying to waddle along.
+					<</if>>
 				<</if>>
 			<<elseif $slaves[$i].belly >= 30000>>
 				<<if canWalk($slaves[$i])>>
@@ -8401,17 +8598,19 @@
 				<</if>>
 			<</if>>
 		<<elseif $slaves[$i].physicalAge < 13>>
-			<<if $slaves[$i].belly >= 600000>>
+			<<if $slaves[$i].belly >= 300000>>
 				$His _belly belly is so large it dwarfs $his body. $He <<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>enjoys<<else>>has no choice but to accept<</if>> being an accessory to $his belly.
 			<<elseif $slaves[$i].belly >= 300000>>
 				$His _belly belly is so large it reaches the floor <<if hasAnyLegs($slaves[$i])>>even when $he stands<<else>>no matter how $he rests<</if>>, taking the weight off $his young figure.
-				<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
-					Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds dragging it along @@.mediumorchid;mildly annoying.@@
-					<<set $slaves[$i].devotion -= 1>>
-				<<else>>
-					While it is quite a nuisance, your will outweighs $his opinions.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
+						Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds dragging it along @@.mediumorchid;mildly annoying.@@
+						<<set $slaves[$i].devotion -= 1>>
+					<<else>>
+						While it is quite a nuisance, your will outweighs $his opinions.
+					<</if>>
 				<</if>>
 			<<elseif $slaves[$i].belly >= 120000>>
 				<<if canWalk($slaves[$i])>>
@@ -8451,17 +8650,19 @@
 				<</if>>
 			<</if>>
 		<<elseif $slaves[$i].physicalAge < 18>>
-			<<if $slaves[$i].belly >= 750000>>
+			<<if $slaves[$i].belly >= 60000>>
 				$His _belly belly is so large it dwarfs $his body. $He <<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>enjoys<<else>>has no choice but to accept<</if>> being an accessory to $his belly.
 			<<elseif $slaves[$i].belly >= 300000>>
 				$His _belly belly is so large it reaches the floor <<if hasAnyLegs($slaves[$i])>>even when $he stands<<else>>no matter how $he rests<</if>>, taking the weight off $his body.
-				<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
-					Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds dragging it along @@.mediumorchid;a painful problem.@@
-					<<set $slaves[$i].devotion -= 5>>
-				<<else>>
-					While moving it is a problem, $he struggles through it for you.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
+						Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds dragging it along @@.mediumorchid;a painful problem.@@
+						<<set $slaves[$i].devotion -= 5>>
+					<<else>>
+						While moving it is a problem, $he struggles through it for you.
+					<</if>>
 				<</if>>
 			<<elseif $slaves[$i].belly >= 200000>>
 				<<if canWalk($slaves[$i])>>
@@ -8501,17 +8702,19 @@
 				<</if>>
 			<</if>>
 		<<else>>
-			<<if $slaves[$i].belly >= 1000000>>
+			<<if $slaves[$i].belly >= 1500000>>
 				$His _belly belly is so large it dwarfs $his body. $He <<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>enjoys<<else>>has no choice but to accept<</if>> being an accessory to $his belly.
-			<<elseif $slaves[$i].belly >= 450000>>
+			<<elseif $slaves[$i].belly >= 1000000>>
 				$His _belly belly is so large it reaches the floor <<if hasAnyLegs($slaves[$i])>>even when $he stands<<else>>no matter how $he rests<</if>>, taking the weight off $his body.
-				<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
-					Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
-				<<elseif $slaves[$i].devotion <= 50>>
-					$He finds dragging it along @@.mediumorchid;a painful problem.@@
-					<<set $slaves[$i].devotion -= 5>>
-				<<else>>
-					While moving it is a problem, $he struggles through it for you.
+				<<if canMove($slaves[$i])>>
+					<<if $slaves[$i].sexualFlaw == "breeder" && $slaves[$i].preg > 0>>
+						Such an inconvenience means little when you're living the dream of being a baby-filled breeder.
+					<<elseif $slaves[$i].devotion <= 50>>
+						$He finds dragging it along @@.mediumorchid;a painful problem.@@
+						<<set $slaves[$i].devotion -= 5>>
+					<<else>>
+						While moving it is a problem, $he struggles through it for you.
+					<</if>>
 				<</if>>
 			<<elseif $slaves[$i].belly >= 300000>>
 				<<if canWalk($slaves[$i])>>
@@ -8983,7 +9186,7 @@
 				<</if>>
 			<</if>>
 
-			<<if canWalk($slaves[$i])>>
+			<<if canMove($slaves[$i])>>
 				<<if ($slaves[$i].dick >= 30)>>
 					<<if ($slaves[$i].devotion <= 50)>>
 						$His titanic penis rests upon the floor even when $he stands. $He finds moving @@.mediumorchid;terrifying@@ since $he drags $his cock along.
@@ -9016,7 +9219,7 @@
 						$He's @@.mediumaquamarine;thankful@@ to you for providing living spaces adapted to life with an enormous dick.
 						<<set $slaves[$i].trust += 1>>
 					<</if>>
-				<<else>>
+				<<elseif canMove($slaves[$i])>>
 					$His giant penis makes life a struggle: $he has to drag it along as $he moves, has trouble fitting into beds and sitting in chairs, and constantly has to make sure to not get $his dick caught in doors.
 					<<if ($slaves[$i].devotion > 50)>>
 						Since $he's devoted to you, $he just does $his best.
@@ -9030,7 +9233,7 @@
 				<</if>>
 			<</if>>
 
-			<<if canWalk($slaves[$i])>>
+			<<if canMove($slaves[$i])>>
 				<<if ($slaves[$i].balls > 90)>>
 					$His titanic balls rest upon the floor even when $he stands.
 					<<if ($slaves[$i].devotion <= 50)>>
@@ -9062,7 +9265,7 @@
 						$He's @@.mediumaquamarine;thankful@@ to you for providing living spaces adapted to life with enormous testicles.
 						<<set $slaves[$i].trust += 1>>
 					<</if>>
-				<<else>>
+				<<elseif canMove($slaves[$i])>>
 					$His giant balls make life a struggle: <<if $buttAccessibility == 1 || $pregAccessibility == 1 || $boobAccessibility == 1>>$he has trouble using appliances and furniture, and has to be constantly mindful of things striking $his oversensitive testicles, but at least the doors have already been widened for your other slaves<<else>>$he barely fits through doors, has trouble using appliances and furniture, and has to be constantly mindful of things striking $his oversensitive testicles<</if>>.
 					<<if ($slaves[$i].devotion > 50)>>
 						Since $he's devoted to you, $he just does $his best.
@@ -9093,8 +9296,8 @@
 					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].sexualFlaw == "breeder") && ($slaves[$i].hips > 2)>>
-					$He @@.hotpink;loves@@ how $his wide body basically screams "fertility goddess".
-					<<set $slaves[$i].devotion += 1>>
+				$He @@.hotpink;loves@@ how $his wide body basically screams "fertility goddess".
+				<<set $slaves[$i].devotion += 1>>
 			<</if>>
 
 			<<if canWalk($slaves[$i])>>
@@ -9154,6 +9357,7 @@
 	<</if>>
 <</if>>
 
+/* health blips */
 <<if ($curativeSideEffects != 0)>>
 	<<if ($slaves[$i].chem > 10)>>
 		<<if random(1,200) < $slaves[$i].chem + $slaves[$i].physicalAge - $slaves[$i].health.condition - (5*$slaves[$i].curatives)>>
@@ -9198,7 +9402,7 @@
 			<<run healthDamage($slaves[$i], 2)>>
 		<</if>>
 		<<if random(1,200) < 5>>
-			$He experienced @@.red;severe@@ health complications due to $his weight this week. After extensive surgery, $his health was stabilized, though $his survival is not assured.
+			$He experienced @@.red;severe health complications@@ due to $his weight this week. After extensive surgery, $his health was stabilized, though $his survival is not assured.
 			<<run healthDamage($slaves[$i], 80)>>
 		<</if>>
 	<<elseif $slaves[$i].weight > 160>>
@@ -9207,21 +9411,22 @@
 			<<run healthDamage($slaves[$i], 1)>>
 		<</if>>
 		<<if random(1,200) < 5>>
-			$He experienced @@.red;severe@@ health complications due to $his weight this week. After extensive surgery, $his health was stabilized.
+			$He experienced @@.red;severe health complications@@ due to $his weight this week. After extensive surgery, $his health was stabilized.
 			<<run healthDamage($slaves[$i], 40)>>
 		<</if>>
 	<<elseif $slaves[$i].weight > 130>>
 		<<if random(1,200) < 5>>
-			$He experienced @@.red;severe@@ health complications due to $his weight this week. After some rest, $he recovered.
+			$He experienced @@.red;severe health complications@@ due to $his weight this week. After some rest, $he recovered.
 			<<run healthDamage($slaves[$i], 20)>>
 		<</if>>
 	<<elseif $slaves[$i].weight > 95>>
 		<<if random(1,200) < 5>>
-			$He experienced @@.red;minor@@ health complications due to $his weight this week. After some rest, $he recovered.
+			$He experienced @@.red;minor health complications@@ due to $his weight this week. After some rest, $he recovered.
 			<<run healthDamage($slaves[$i], 5)>>
 		<</if>>
 	<</if>>
 <</if>>
+/* end here! */
 
 /* LANGUAGE */
 
diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw
index e47fed9f833329a931f0ac70d5f2be0b179bb949..e78749e593765d34c85f894bb9d1522296ce685d 100644
--- a/src/uncategorized/saRules.tw
+++ b/src/uncategorized/saRules.tw
@@ -1417,14 +1417,14 @@
 		<<case "get treatment in the clinic">>
 			<<if $slaves[$i].relationship > 2>>
 				<<set _lover = $slaveIndices[$slaves[$i].relationshipTarget]>>
-				<<if !canWalk($slaves[_lover]) || !isSlaveAvailable($slaves[_lover])>>
+				<<if !canMove($slaves[_lover]) || !isSlaveAvailable($slaves[_lover])>>
 					<<set _lover = 0>>
 				<</if>>
 			<<else>>
 				<<set _lover = 0>>
 			<</if>>
 			<<if _lover == 0 && $seeIncest == 1>>
-				<<set _famVisitor = randomRelatedSlave($slaves[$i], (s) => { return canWalk(s) && isSlaveAvailable(s) && App.Utils.sexAllowed($slaves[$i], s); } )>>
+				<<set _famVisitor = randomRelatedSlave($slaves[$i], (s) => { return canMove(s) && isSlaveAvailable(s) && App.Utils.sexAllowed($slaves[$i], s); } )>>
 			<</if>>
 			<<if $slaves[$i].devotion < -50>>
 				is so unhappy that $he has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
diff --git a/src/uncategorized/salon.tw b/src/uncategorized/salon.tw
index 057c9ec21c72d376abc5d4a3ab3e56d4e832b70e..2d0ef9efd71a2d4bd67968bdb7d759e3af25611a 100644
--- a/src/uncategorized/salon.tw
+++ b/src/uncategorized/salon.tw
@@ -17,13 +17,15 @@
 </span>
 
 /* 000-250-006 */
-<<if $seeImages == 1>>
-	<<if $imageChoice == 1>>
-		<div class="imageRef lrgVector"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
-	<<else>>
-		<div class="imageRef lrgRender"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
+<span id="artFrame">
+	<<if $seeImages == 1>>
+		<<if $imageChoice == 1>>
+			<div class="imageRef lrgVector"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
+		<<else>>
+			<div class="imageRef lrgRender"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
+		<</if>>
 	<</if>>
-<</if>>
+</span>
 /* 000-250-006 */
 
 /* EYES */
@@ -71,75 +73,10 @@
 
 /* EARS */
 <h3>Ears</h3>
-<div>
-	<<if getSlave($AS).earT != "none" && getSlave($AS).earTColor != "hairless">>
-		$His fluffy ears are <<= getSlave($AS).earTColor>>.
-		<div class="choices">
-			<<if getSlave($AS).earTColor != getSlave($AS).hColor>>
-				[[Match current hair|Salon][getSlave($AS).earTColor = getSlave($AS).hColor]] or <span class="note">choose a new one:</span>
-			<<else>>
-				<span class="note">Choose a dye color before dyeing $his ears:</span>
-			<</if>>
-		</div>
-		<div class="choices">
-			Colors:
-				[[Auburn|Salon][$primaryEarColor = "auburn"]]
-				| [[Black|Salon][$primaryEarColor = "black"]]
-				| [[Blazing Red|Salon][$primaryEarColor = "blazing red"]]
-				| [[Blonde|Salon][$primaryEarColor = "blonde"]]
-				| [[Blue-Violet|Salon][$primaryEarColor = "blue-violet"]]
-				| [[Blue|Salon][$primaryEarColor = "blue"]]
-				| [[Brown|Salon][$primaryEarColor = "brown"]]
-				| [[Burgundy|Salon][$primaryEarColor = "burgundy"]]
-				| [[Chestnut|Salon][$primaryEarColor = "chestnut"]]
-				| [[Chocolate|Salon][$primaryEarColor = "chocolate brown"]]
-				| [[Copper|Salon][$primaryEarColor = "copper"]]
-				| [[Dark Blue|Salon][$primaryEarColor = "dark blue"]]
-				| [[Dark Brown|Salon][$primaryEarColor = "dark brown"]]
-				| [[Dark Orchid|Salon][$primaryEarColor = "dark orchid"]]
-				| [[Deep Red|Salon][$primaryEarColor = "deep red"]]
-				| [[Ginger|Salon][$primaryEarColor = "ginger"]]
-				| [[Golden|Salon][$primaryEarColor = "golden"]]
-				| [[Green-yellow|Salon][$primaryEarColor = "green-yellow"]]
-				| [[Green|Salon][$primaryEarColor = "green"]]
-				| [[Grey|Salon][$primaryEarColor = "grey"]]
-				| [[Hazel|Salon][$primaryEarColor = "hazel"]]
-				| [[Jet Black|Salon][$primaryEarColor = "jet black"]]
-				| [[Neon Blue|Salon][$primaryEarColor = "neon blue"]]
-				| [[Neon Green|Salon][$primaryEarColor = "neon green"]]
-				| [[Neon Pink|Salon][$primaryEarColor = "neon pink"]]
-				| [[Pink|Salon][$primaryEarColor = "pink"]]
-				| [[Platinum Blonde|Salon][$primaryEarColor = "platinum blonde"]]
-				| [[Purple|Salon][$primaryEarColor = "purple"]]
-				| [[Red|Salon][$primaryEarColor = "red"]]
-				| [[Sea Green|Salon][$primaryEarColor = "sea green"]]
-				| [[Silver|Salon][$primaryEarColor = "silver"]]
-				| [[Strawberry-Blonde|Salon][$primaryEarColor = "strawberry-blonde"]]
-				| [[White|Salon][$primaryEarColor = "white"]]
-		</div>
-
-		<div class="choices">
-			Highlights:
-				[[None|Salon][$secondaryEarColor = ""]]
-				| [[Black|Salon][$secondaryEarColor = " with black highlights"]]
-				| [[Blazing Red|Salon][$secondaryEarColor = " with blazing red highlights"]]
-				| [[Blonde|Salon][$secondaryEarColor = " with blonde highlights"]]
-				| [[Grey|Salon][$secondaryEarColor = " with grey highlights"]]
-				| [[Neon Blue|Salon][$secondaryEarColor = " with neon blue highlights"]]
-				| [[Neon Green|Salon][$secondaryEarColor = " with neon green highlights"]]
-				| [[Neon Pink|Salon][$secondaryEarColor = " with neon pink highlights"]]
-				| [[Rainbow|Salon][$secondaryEarColor = " with rainbow highlights"]]
-				| [[Silver|Salon][$secondaryEarColor = " with silver highlights"]]
-				| [[White|Salon][$secondaryEarColor = " with white highlights"]]
-			</div>
-
-		<<if $primaryEarColor != 0>>
-			<div class="choices">
-				[["Dye " + $his + " ears"|Salon][getSlave($AS).earTColor = ($primaryEarColor + $secondaryEarColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryEarColor = 0, $secondaryEarColor = ""]] $primaryEarColor $secondaryEarColor now?
-			</div>
-		<</if>>
-	<</if>>
-</div>
+<p id="salonEars"></p>
+<script>
+	App.Medicine.Salon.ears(getSlave(V.AS));
+</script>
 
 <div>
 	<<if getSlave($AS).earImplant == 1>>
@@ -219,267 +156,11 @@
 /* HAIR */
 
 <h3>Hair</h3>
-<div>
-	<<if getSlave($AS).bald != 1>>
-		$His hair is <<= getSlave($AS).hColor>>.
-		<<if getSlave($AS).origHColor != getSlave($AS).hColor>>
-			[[Restore natural color|Salon][getSlave($AS).hColor = getSlave($AS).origHColor]] or <span class="note">choose a new one:</span>
-		<<else>>
-			<span class="note">Choose a dye color before dyeing $his hair:</span>
-		<</if>>
-		<div class="choices">
-			Colors:
-				[[Auburn|Salon][$primaryHairColor = "auburn"]]
-				| [[Black|Salon][$primaryHairColor = "black"]]
-				| [[Blazing Red|Salon][$primaryHairColor = "blazing red"]]
-				| [[Blonde|Salon][$primaryHairColor = "blonde"]]
-				| [[Blue-Violet|Salon][$primaryHairColor = "blue-violet"]]
-				| [[Blue|Salon][$primaryHairColor = "blue"]]
-				| [[Brown|Salon][$primaryHairColor = "brown"]]
-				| [[Burgundy|Salon][$primaryHairColor = "burgundy"]]
-				| [[Chestnut|Salon][$primaryHairColor = "chestnut"]]
-				| [[Chocolate|Salon][$primaryHairColor = "chocolate brown"]]
-				| [[Copper|Salon][$primaryHairColor = "copper"]]
-				| [[Dark Blue|Salon][$primaryHairColor = "dark blue"]]
-				| [[Dark Brown|Salon][$primaryHairColor = "dark brown"]]
-				| [[Dark Orchid|Salon][$primaryHairColor = "dark orchid"]]
-				| [[Deep Red|Salon][$primaryHairColor = "deep red"]]
-				| [[Ginger|Salon][$primaryHairColor = "ginger"]]
-				| [[Golden|Salon][$primaryHairColor = "golden"]]
-				| [[Green-yellow|Salon][$primaryHairColor = "green-yellow"]]
-				| [[Green|Salon][$primaryHairColor = "green"]]
-				| [[Grey|Salon][$primaryHairColor = "grey"]]
-				| [[Hazel|Salon][$primaryHairColor = "hazel"]]
-				| [[Jet Black|Salon][$primaryHairColor = "jet black"]]
-				| [[Neon Blue|Salon][$primaryHairColor = "neon blue"]]
-				| [[Neon Green|Salon][$primaryHairColor = "neon green"]]
-				| [[Neon Pink|Salon][$primaryHairColor = "neon pink"]]
-				| [[Pink|Salon][$primaryHairColor = "pink"]]
-				| [[Platinum Blonde|Salon][$primaryHairColor = "platinum blonde"]]
-				| [[Purple|Salon][$primaryHairColor = "purple"]]
-				| [[Red|Salon][$primaryHairColor = "red"]]
-				| [[Sea Green|Salon][$primaryHairColor = "sea green"]]
-				| [[Silver|Salon][$primaryHairColor = "silver"]]
-				| [[Strawberry-Blonde|Salon][$primaryHairColor = "strawberry-blonde"]]
-				| [[White|Salon][$primaryHairColor = "white"]]
-		</div>
-
-		<div class="choices">
-			Highlights:
-				[[None|Salon][$secondaryHairColor = ""]]
-				| [[Black|Salon][$secondaryHairColor = " with black highlights"]]
-				| [[Blazing Red|Salon][$secondaryHairColor = " with blazing red highlights"]]
-				| [[Blonde|Salon][$secondaryHairColor = " with blonde highlights"]]
-				| [[Grey|Salon][$secondaryHairColor = " with grey highlights"]]
-				| [[Neon Blue|Salon][$secondaryHairColor = " with neon blue highlights"]]
-				| [[Neon Green|Salon][$secondaryHairColor = " with neon green highlights"]]
-				| [[Neon Pink|Salon][$secondaryHairColor = " with neon pink highlights"]]
-				| [[Rainbow|Salon][$secondaryHairColor = " with rainbow highlights"]]
-				| [[Silver|Salon][$secondaryHairColor = " with silver highlights"]]
-				| [[White|Salon][$secondaryHairColor = " with white highlights"]]
-		</div>
-
-		<<if $primaryHairColor != 0>>
-			<div class="choices">
-				[["Dye " + $his + " hair"|Salon][getSlave($AS).hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryHairColor = 0, $secondaryHairColor = ""]] $primaryHairColor $secondaryHairColor now?
-			</div>
-		<</if>>
-
-		<div>
-			<<if getSlave($AS).hStyle !== "shaved">>
-				$His <<= getSlave($AS).hStyle>> hair is <<= lengthToEitherUnit(getSlave($AS).hLength)>> long.
-			<<else>>
-				$His hair is shaved smooth.
-			<</if>>
-			<span class="note">General hairstyles will conform to hair length and clothing choices.</span>
-		</div>
-		<div class="choices">
-			<<if getSlave($AS).hLength > 1>>
-				Style $his hair:
-				[[Afro|Salon][getSlave($AS).hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Braided|Salon][getSlave($AS).hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Cornrows|Salon][getSlave($AS).hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Curled|Salon][getSlave($AS).hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Dreadlocks|Salon][getSlave($AS).hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Eary|Salon][getSlave($AS).hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a bun|Salon][getSlave($AS).hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a messy bun|Salon][getSlave($AS).hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a ponytail|Salon][getSlave($AS).hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In tails|Salon][getSlave($AS).hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Luxurious|Salon][getSlave($AS).hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Messy|Salon][getSlave($AS).hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Neat|Salon][getSlave($AS).hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Permed|Salon][getSlave($AS).hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Shaved sides|Salon][getSlave($AS).hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Up|Salon][getSlave($AS).hStyle = "up",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<<else>>
-				<span class="note">$His hair is too short to style meaningfully</span>
-			<</if>>
-		</div>
-
-		<div class="choices">
-			<<if getSlave($AS).hLength > 1>>
-				Cut and style $his hair:
-				[[Shaved|Salon][getSlave($AS).hStyle = "shaved",getSlave($AS).hLength = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Trimmed short|Salon][getSlave($AS).hStyle = "trimmed",getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Buzzcut|Salon][getSlave($AS).hStyle = "buzzcut",getSlave($AS).hLength = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-		</div>
+<p id="salonHair"></p>
+<script>
+	App.Medicine.Salon.hair(getSlave(V.AS));
+</script>
 
-		<div class="choices">
-			Cut or lengthen $his hair:
-			<<if getSlave($AS).hLength > 5>>
-				[[Very short|Salon][getSlave($AS).hLength = 5,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-			<<if getSlave($AS).hLength > 10>>
-				| [[Short|Salon][getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-			<<if getSlave($AS).hLength > 30>>
-				| [[Shoulder length|Salon][getSlave($AS).hLength = 30,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-			<<if getSlave($AS).hLength > 60>>
-				| [[Long|Salon][getSlave($AS).hLength = 60,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-			<<if getSlave($AS).hLength > 100>>
-				| [[Very long|Salon][getSlave($AS).hLength = 100,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-			<<if getSlave($AS).hLength == 1>>
-				| [[Apply hair growth stimulating treatment|Salon][getSlave($AS).hLength = 1,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<<elseif getSlave($AS).hLength < 150>>
-				| [[Apply extensions|Salon][getSlave($AS).hLength += 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			<</if>>
-				| Custom length: <<textbox "_newHLength" _oldHLength "Salon">>
-			<<if $showInches == 1>>
-				cm (<<= cmToInchString(getSlave($AS).hLength)>>)
-			<<elseif $showInches == 2>>
-				inches
-			<</if>>
-			[[Apply|Salon][cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), getSlave($AS).hLength = (Number(_newHLength) || getSlave($AS).hLength)]]
-		</div>
-
-		<div class="choices">
-			Have $his hair carefully maintained at its current length:
-			<<if getSlave($AS).haircuts == 1>>
-				[[Cease maintenance|Salon][getSlave($AS).haircuts = 0]]
-			<<else>>
-				[[Begin maintenance|Salon][getSlave($AS).haircuts = 1]]
-			<</if>>
-		</div>
-	<<else>>
-		<<if getSlave($AS).hStyle == "bald">>
-			$He is completely bald.
-		<<else>>
-			$His current wig is <<= getSlave($AS).hColor>>.
-			<<if getSlave($AS).hStyle != "bald">>
-				[[Remove wig|Salon][getSlave($AS).hStyle = "bald",getSlave($AS).hLength = 0,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]] or <span class="note">choose a new one:</span>
-			<<else>>
-				<span class="note">Choose a wig color:</span>
-			<</if>>
-
-			<div class="choices">
-				Colors:
-					[[Auburn|Salon][$primaryHairColor = "auburn"]]
-					| [[Black|Salon][$primaryHairColor = "black"]]
-					| [[Blazing Red|Salon][$primaryHairColor = "blazing red"]]
-					| [[Blonde|Salon][$primaryHairColor = "blonde"]]
-					| [[Blue-Violet|Salon][$primaryHairColor = "blue-violet"]]
-					| [[Blue|Salon][$primaryHairColor = "blue"]]
-					| [[Brown|Salon][$primaryHairColor = "brown"]]
-					| [[Burgundy|Salon][$primaryHairColor = "burgundy"]]
-					| [[Chestnut|Salon][$primaryHairColor = "chestnut"]]
-					| [[Chocolate|Salon][$primaryHairColor = "chocolate brown"]]
-					| [[Copper|Salon][$primaryHairColor = "copper"]]
-					| [[Dark Blue|Salon][$primaryHairColor = "dark blue"]]
-					| [[Dark Brown|Salon][$primaryHairColor = "dark brown"]]
-					| [[Dark Orchid|Salon][$primaryHairColor = "dark orchid"]]
-					| [[Deep Red|Salon][$primaryHairColor = "deep red"]]
-					| [[Ginger|Salon][$primaryHairColor = "ginger"]]
-					| [[Golden|Salon][$primaryHairColor = "golden"]]
-					| [[Green-yellow|Salon][$primaryHairColor = "green-yellow"]]
-					| [[Green|Salon][$primaryHairColor = "green"]]
-					| [[Grey|Salon][$primaryHairColor = "grey"]]
-					| [[Hazel|Salon][$primaryHairColor = "hazel"]]
-					| [[Jet Black|Salon][$primaryHairColor = "jet black"]]
-					| [[Neon Blue|Salon][$primaryHairColor = "neon blue"]]
-					| [[Neon Green|Salon][$primaryHairColor = "neon green"]]
-					| [[Neon Pink|Salon][$primaryHairColor = "neon pink"]]
-					| [[Pink|Salon][$primaryHairColor = "pink"]]
-					| [[Platinum Blonde|Salon][$primaryHairColor = "platinum blonde"]]
-					| [[Purple|Salon][$primaryHairColor = "purple"]]
-					| [[Red|Salon][$primaryHairColor = "red"]]
-					| [[Sea Green|Salon][$primaryHairColor = "sea green"]]
-					| [[Silver|Salon][$primaryHairColor = "silver"]]
-					| [[Strawberry-Blonde|Salon][$primaryHairColor = "strawberry-blonde"]]
-					| [[White|Salon][$primaryHairColor = "white"]]
-			</div>
-
-			<div class="choices">
-				Highlights:
-					[[None|Salon][$secondaryHairColor = ""]]
-					| [[Black|Salon][$secondaryHairColor = " with black highlights"]]
-					| [[Blazing Red|Salon][$secondaryHairColor = " with blazing red highlights"]]
-					| [[Blonde|Salon][$secondaryHairColor = " with blonde highlights"]]
-					| [[Grey|Salon][$secondaryHairColor = " with grey highlights"]]
-					| [[Neon Blue|Salon][$secondaryHairColor = " with neon blue highlights"]]
-					| [[Neon Green|Salon][$secondaryHairColor = " with neon green highlights"]]
-					| [[Neon Pink|Salon][$secondaryHairColor = " with neon pink highlights"]]
-					| [[Rainbow|Salon][$secondaryHairColor = " with rainbow highlights"]]
-					| [[Silver|Salon][$secondaryHairColor = " with silver highlights"]]
-					| [[White|Salon][$secondaryHairColor = " with white highlights"]]
-			</div>
-
-			<<if $primaryHairColor != 0>>
-				<div class="choices">
-					[[Change|Salon][getSlave($AS).hColor = ($primaryHairColor + $secondaryHairColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryHairColor = 0, $secondaryHairColor = ""]] $his wig color to $primaryHairColor $secondaryHairColor
-				</div>
-			<</if>>
-		<</if>>
-
-		<div>
-			<<if getSlave($AS).hStyle != "bald">>
-				$His <<= getSlave($AS).hStyle>> wig is <<= lengthToEitherUnit(getSlave($AS).hLength)>> long.
-				<span class="note">General hairstyles will conform to hair length and clothing choices.</span>
-
-				<<if getSlave($AS).hLength == 0>><<set getSlave($AS).hLength = 10>><</if>>
-
-				<div class="choices">
-					Set wig length to:
-					<<if getSlave($AS).hLength != 10>>[[lengthToEitherUnit(10)|Salon][getSlave($AS).hLength = 10,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-					<<if getSlave($AS).hLength != 30>>[[lengthToEitherUnit(30)|Salon][getSlave($AS).hLength = 30,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-					<<if getSlave($AS).hLength != 60>>[[lengthToEitherUnit(60)|Salon][getSlave($AS).hLength = 60,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-					<<if getSlave($AS).hLength != 90>>[[lengthToEitherUnit(90)|Salon][getSlave($AS).hLength = 90,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-					<<if getSlave($AS).hLength != 120>>[[lengthToEitherUnit(120)|Salon][getSlave($AS).hLength = 120,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-					<<if getSlave($AS).hLength != 150>>[[lengthToEitherUnit(150)|Salon][getSlave($AS).hLength = 150,cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]<</if>>
-				</div>
-			<<else>>
-				$He is not wearing a wig.
-			<</if>>
-			<div class="choices">
-				<<if getSlave($AS).hStyle != "bald">>
-					Set wig style:
-				<<else>>
-					Give $him a wig:
-				<</if>>
-				[[Afro|Salon][getSlave($AS).hStyle = "afro",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Braided|Salon][getSlave($AS).hStyle = "braided",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Cornrows|Salon][getSlave($AS).hStyle = "cornrows",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Curled|Salon][getSlave($AS).hStyle = "curled",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Dreadlocks|Salon][getSlave($AS).hStyle = "dreadlocks",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Eary|Salon][getSlave($AS).hStyle = "eary",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a bun|Salon][getSlave($AS).hStyle = "bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a messy bun|Salon][getSlave($AS).hStyle = "messy bun",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In a ponytail|Salon][getSlave($AS).hStyle = "ponytail",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[In tails|Salon][getSlave($AS).hStyle = "tails",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Luxurious|Salon][getSlave($AS).hStyle = "luxurious",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Messy|Salon][getSlave($AS).hStyle = "messy",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Neat|Salon][getSlave($AS).hStyle = "neat",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Permed|Salon][getSlave($AS).hStyle = "permed",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Shaved sides|Salon][getSlave($AS).hStyle = "strip",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-				| [[Up|Salon][getSlave($AS).hStyle = "up",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			</div>
-		</div>
-	<</if>>
-</div>
 /* MAKEUP */
 <h3>Makeup</h3>
 
@@ -605,71 +286,10 @@
 	| [[Tiger Stripes|Salon][getSlave($AS).skin = "tiger striped",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 </div>
 
-<<if getSlave($AS).tail != "none">>
-	$His tail is <<= getSlave($AS).tailColor>>.
-	<<if getSlave($AS).tailColor != getSlave($AS).hColor>>
-		[[Match current hair|Salon][getSlave($AS).tailColor = getSlave($AS).hColor]] or <span class="note">choose a new one:</span>
-	<<else>>
-		<span class="note">Choose a dye color before dyeing $his tail:</span>
-	<</if>>
-	<div class="choices">
-		Colors:
-			[[Auburn|Salon][$primaryTailColor = "auburn"]]
-			| [[Black|Salon][$primaryTailColor = "black"]]
-			| [[Blazing Red|Salon][$primaryTailColor = "blazing red"]]
-			| [[Blonde|Salon][$primaryTailColor = "blonde"]]
-			| [[Blue-Violet|Salon][$primaryTailColor = "blue-violet"]]
-			| [[Blue|Salon][$primaryTailColor = "blue"]]
-			| [[Brown|Salon][$primaryTailColor = "brown"]]
-			| [[Burgundy|Salon][$primaryTailColor = "burgundy"]]
-			| [[Chestnut|Salon][$primaryTailColor = "chestnut"]]
-			| [[Chocolate|Salon][$primaryTailColor = "chocolate brown"]]
-			| [[Copper|Salon][$primaryTailColor = "copper"]]
-			| [[Dark Blue|Salon][$primaryTailColor = "dark blue"]]
-			| [[Dark Brown|Salon][$primaryTailColor = "dark brown"]]
-			| [[Dark Orchid|Salon][$primaryTailColor = "dark orchid"]]
-			| [[Deep Red|Salon][$primaryTailColor = "deep red"]]
-			| [[Ginger|Salon][$primaryTailColor = "ginger"]]
-			| [[Golden|Salon][$primaryTailColor = "golden"]]
-			| [[Green-yellow|Salon][$primaryTailColor = "green-yellow"]]
-			| [[Green|Salon][$primaryTailColor = "green"]]
-			| [[Grey|Salon][$primaryTailColor = "grey"]]
-			| [[Hazel|Salon][$primaryTailColor = "hazel"]]
-			| [[Jet Black|Salon][$primaryTailColor = "jet black"]]
-			| [[Neon Blue|Salon][$primaryTailColor = "neon blue"]]
-			| [[Neon Green|Salon][$primaryTailColor = "neon green"]]
-			| [[Neon Pink|Salon][$primaryTailColor = "neon pink"]]
-			| [[Pink|Salon][$primaryTailColor = "pink"]]
-			| [[Platinum Blonde|Salon][$primaryTailColor = "platinum blonde"]]
-			| [[Purple|Salon][$primaryTailColor = "purple"]]
-			| [[Red|Salon][$primaryTailColor = "red"]]
-			| [[Sea Green|Salon][$primaryTailColor = "sea green"]]
-			| [[Silver|Salon][$primaryTailColor = "silver"]]
-			| [[Strawberry-Blonde|Salon][$primaryTailColor = "strawberry-blonde"]]
-			| [[White|Salon][$primaryTailColor = "white"]]
-	</div>
-
-	<div class="choices">
-		Highlights:
-			[[None|Salon][$secondaryTailColor = ""]]
-			| [[Black|Salon][$secondaryTailColor = " with black highlights"]]
-			| [[Blazing Red|Salon][$secondaryTailColor = " with blazing red highlights"]]
-			| [[Blonde|Salon][$secondaryTailColor = " with blonde highlights"]]
-			| [[Grey|Salon][$secondaryTailColor = " with grey highlights"]]
-			| [[Neon Blue|Salon][$secondaryTailColor = " with neon blue highlights"]]
-			| [[Neon Green|Salon][$secondaryTailColor = " with neon green highlights"]]
-			| [[Neon Pink|Salon][$secondaryTailColor = " with neon pink highlights"]]
-			| [[Rainbow|Salon][$secondaryTailColor = " with rainbow highlights"]]
-			| [[Silver|Salon][$secondaryTailColor = " with silver highlights"]]
-			| [[White|Salon][$secondaryTailColor = " with white highlights"]]
-	</div>
-
-	<<if $primaryTailColor != 0>>
-		<div class="choices">
-			[["Dye " + $his + " tail"|Salon][getSlave($AS).tailColor = ($primaryTailColor + $secondaryTailColor),cashX(forceNeg($modCost), "slaveMod", getSlave($AS)), $primaryTailColor = 0, $secondaryTailColor = ""]] $primaryTailColor $secondaryTailColor now?
-		</div>
-	<</if>>
-<</if>>
+<p id="salonTail"></p>
+<script>
+	App.Medicine.Salon.tail(getSlave(V.AS));
+</script>
 
 /* MARKS */
 <div>
@@ -731,7 +351,7 @@
 			| [[Dark Blue|Salon][getSlave($AS).eyebrowHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Brown|Salon][getSlave($AS).eyebrowHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Orchid|Salon][getSlave($AS).eyebrowHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			| [[Deep Red|Salon][$primaryHairColor = "deep red"]]
+			| [[Deep Red|Salon][getSlave($AS).eyebrowHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Ginger|Salon][getSlave($AS).eyebrowHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Golden|Salon][getSlave($AS).eyebrowHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Green-yellow|Salon][getSlave($AS).eyebrowHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
@@ -822,7 +442,7 @@
 			| [[Dark Blue|Salon][getSlave($AS).pubicHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Brown|Salon][getSlave($AS).pubicHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Orchid|Salon][getSlave($AS).pubicHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			| [[Deep Red|Salon][$primaryHairColor = "deep red"]]
+			| [[Deep Red|Salon][getSlave($AS).pubicHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Ginger|Salon][getSlave($AS).pubicHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Golden|Salon][getSlave($AS).pubicHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Green-yellow|Salon][getSlave($AS).pubicHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
@@ -896,7 +516,7 @@
 			| [[Dark Blue|Salon][getSlave($AS).underArmHColor = "dark blue",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Brown|Salon][getSlave($AS).underArmHColor = "dark brown",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Dark Orchid|Salon][getSlave($AS).underArmHColor = "dark orchid",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
-			| [[Deep Red|Salon][$primaryHairColor = "deep red"]]
+			| [[Deep Red|Salon][getSlave($AS).underArmHColor = "deep red",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Ginger|Salon][getSlave($AS).underArmHColor = "ginger",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Golden|Salon][getSlave($AS).underArmHColor = "golden",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
 			| [[Green-yellow|Salon][getSlave($AS).underArmHColor = "green-yellow",cashX(forceNeg($modCost), "slaveMod", getSlave($AS))]]
diff --git a/src/uncategorized/schoolroom.tw b/src/uncategorized/schoolroom.tw
index 57698e3065dce302a8342418f14361a2199b0866..4e0ea70ca30a3e9f2749ba841bf8ba57cf6a324c 100644
--- a/src/uncategorized/schoolroom.tw
+++ b/src/uncategorized/schoolroom.tw
@@ -179,7 +179,7 @@
 </div>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.schoolroom, true)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.schoolroom, true)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/schoolteacherSelect.tw b/src/uncategorized/schoolteacherSelect.tw
index e7fa4148322b5e9f61491f256f1a425bf1eb9781..7572a3d974d9a863dcab5b573fc2886f6a5cb300 100644
--- a/src/uncategorized/schoolteacherSelect.tw
+++ b/src/uncategorized/schoolteacherSelect.tw
@@ -11,4 +11,4 @@
 <br><br>''Appoint a Schoolteacher from your devoted slaves:''
 <br><br>[[None|Schoolroom][removeJob(_S.Schoolteacher, "be the Schoolteacher")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.schoolroom, "Schoolroom")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.schoolroom, "Schoolroom")>>
diff --git a/src/uncategorized/servantsQuarters.tw b/src/uncategorized/servantsQuarters.tw
index 1c1d71e93e47d0b973d75c721ddc7bccc60df860..ffd1cec37fd131f76556c31cf62aca76fcc13402 100644
--- a/src/uncategorized/servantsQuarters.tw
+++ b/src/uncategorized/servantsQuarters.tw
@@ -126,7 +126,7 @@
 	<<set _facility = App.Entity.facilities.servantsQuarters>>
 	<<if _S.Stewardess>>
 		<<setLocalPronouns _S.Stewardess>>
-		<<print App.UI.SlaveList.displayManager(_facility)>>
+		<<includeDOM App.UI.SlaveList.displayManager(_facility)>>
 		<<if canAchieveErection(_S.Stewardess) && _S.Stewardess.pubertyXY == 1>>
 			<<if $stewardessImpregnates == 1>>
 				Keeping the maids pregnant is part of $his job.
@@ -146,7 +146,7 @@
 </p>
 
 <p>
-	<<print App.UI.SlaveList.listSJFacilitySlaves(_facility)>>
+	<<includeDOM App.UI.SlaveList.listSJFacilitySlaves(_facility)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/spa.tw b/src/uncategorized/spa.tw
index 696db7c3bcdffeb274137dff9adb72d4a84a601c..a3ef59996152c693a576c88a34c8ff1fc63ca28d 100644
--- a/src/uncategorized/spa.tw
+++ b/src/uncategorized/spa.tw
@@ -148,7 +148,7 @@
 </div>
 
 <p>
-	<<print App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.spa, true)>>
+	<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.spa, true)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/stewardessSelect.tw b/src/uncategorized/stewardessSelect.tw
index dfac601f9c962157abd5bff5c29e7e16b88b5f7a..a9dc36cfaa208ee59e6792dc62cb935d5337c05b 100644
--- a/src/uncategorized/stewardessSelect.tw
+++ b/src/uncategorized/stewardessSelect.tw
@@ -11,4 +11,4 @@
 <br><br>''Appoint a Stewardess from your devoted slaves:''
 <br><br>[[None|Servants' Quarters][removeJob(_S.Stewardess, Job.STEWARD)]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.servantsQuarters, "Servants' Quarters")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.servantsQuarters, "Servants' Quarters")>>
diff --git a/src/uncategorized/subordinateTargeting.tw b/src/uncategorized/subordinateTargeting.tw
index 8f357c015289900cdfc99f7a2fbcff653b40e205..7f9a8f115e9311fead3ccc60b7f63ff1158b773a 100644
--- a/src/uncategorized/subordinateTargeting.tw
+++ b/src/uncategorized/subordinateTargeting.tw
@@ -32,7 +32,7 @@
 	<</if>>
 	<br><br>[[None|Subordinate Targeting][$activeSlave.subTarget = 0]]
 	<br><br>__Select a slave for $him to submit to, sexually:__
-	<<= App.UI.SlaveList.slaveSelectionList(
+	<<includeDOM App.UI.SlaveList.slaveSelectionList(
 			s => s.devotion >= -20 && s.fuckdoll === 0 && State.variables.activeSlave.ID !== s.ID &&
 				(!isAmputee(State.variables.activeSlave) || !isAmputee(s)),
 			(s) => App.UI.DOM.passageLink(SlaveFullName(s), 'Subordinate Targeting', () => { V.activeSlave.subTarget = s.ID; }),
diff --git a/src/uncategorized/underperformingSlaves.tw b/src/uncategorized/underperformingSlaves.tw
index 2b874d7244561fcf367584c74101a3c0be465769..5fc39bb79b88343d17662c48e4678fa42608a6a9 100644
--- a/src/uncategorized/underperformingSlaves.tw
+++ b/src/uncategorized/underperformingSlaves.tw
@@ -24,58 +24,15 @@
 	<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'highSale')" id="tab highSale">Worth much but earning little</button>
 	<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'expensive')" id="tab expensive">Costing vs earning</button>
 </div>
+
 <div id="highSale" class="tabcontent">
 	<div class="content">
-		<div style="font-style:italic">
-			Take the rough value of a slave and divide it by how much they made overall last week. This will tell you how many weeks it might take them to earn the same amount you'd get for selling them right now.
-		</div>
-		<<print App.UI.SlaveList.render.listMarkup(
-			getBestSlavesIDs(
-				{
-					part:(slave) => {
-						const ratio = slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave));
-						return ratio > 0 ? ratio : 100000000 + ratio;
-					},
-					count: 7,
-					filter:(slave) => (
-						["be confined in the arcade", "get milked", "whore", "work a glory hole", "work in the brothel", "work in the dairy"].includes(slave.assignment)
-						&& ((slave.weekAcquired + 1) < V.week)
-						&& slave.lastWeeksCashIncome
-					)
-				}
-			),
-			[],
-			App.UI.SlaveList.SlaveInteract.stdInteract,
-			(slave) => $(document.createDocumentFragment()).append(
-				`Worth ${cashFormatColor(slaveCost(slave))} / Nets ${cashFormatColor(slave.lastWeeksCashIncome - getSlaveCost(slave))} a week = ${(Math.trunc(slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave)))) > 0 ? (Math.trunc(slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave)))) : "infinite"} weeks`
-			).get(0)
-		)>>
+		<<includeDOM App.Underperformers.highSale()>>
 	</div>
 </div>
 
 <div id="expensive" class="tabcontent">
 	<div class="content">
-		<div style="font-style:italic">
-			This list looks for moochers by weighing their weekly income against the weekly cost of providing for them.
-		</div>
-		<<print App.UI.SlaveList.render.listMarkup(
-			getBestSlavesIDs(
-				{
-					part:(slave) => (slave.lastWeeksCashIncome - getSlaveCost(slave)),
-					largest: false,
-					count: 7,
-					filter:(slave) => (
-						["be confined in the arcade", "get milked", "whore", "work a glory hole", "work in the brothel", "work in the dairy"].includes(slave.assignment)
-						&& ((slave.weekAcquired + 1) < V.week)
-						&& slave.lastWeeksCashIncome
-					)
-				}
-			),
-			[],
-			App.UI.SlaveList.SlaveInteract.stdInteract,
-			(slave) => $(document.createDocumentFragment()).append(
-				`${cashFormatColor(Math.trunc(slave.lastWeeksCashIncome - getSlaveCost(slave)))} net last week`
-			).get(0)
-		)>>
+		<<includeDOM App.Underperformers.expensive()>>
 	</div>
 </div>
diff --git a/src/uncategorized/wardenessSelect.tw b/src/uncategorized/wardenessSelect.tw
index d64de5bdce25ecff3aa384e8b93961e82288c7ba..6ae7bf5aed1652a53263bca874574444d24f3719 100644
--- a/src/uncategorized/wardenessSelect.tw
+++ b/src/uncategorized/wardenessSelect.tw
@@ -11,4 +11,4 @@
 <br><br>''Appoint a Wardeness from your devoted slaves:''
 <br><br>[[None|Cellblock][removeJob(_S.Wardeness, "be the Wardeness")]]
 <br><br>
-<<print App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.cellblock, "Cellblock")>>
+<<includeDOM App.UI.SlaveList.facilityManagerSelection(App.Entity.facilities.cellblock, "Cellblock")>>