diff --git a/CHANGELOG.md b/CHANGELOG.md
index 297aa3daaaeb8012192a74750547a63e4ada0f20..e5957a7b35e7a4b796e76cc53d84b09881a7455c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,14 +6,28 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
 ## Unreleased
 
+## 0.10.7.1-4.0.0-alpha.2 - 2021-05-23
+
+* more fixes
+
+## 0.10.7.1-4.0.0.alpha.1 - 2021-05-22
+
+* fixes
+
+## 0.10.7.1-4.0.0.alpha.0 - 2021-05-22
+
+* Base 4.0.0 foundation added
+* Age based player careers implemented (4.0.0)
 * Reminders system improvements
 * Elohiem's webgl art update 2 & 3
 * added new hairstyles (bangs, hime, drills)
 * added slave distribution presets (PLC, Japan/Korea, Carribean)
 * heavy reconstruction of the event systems
 * REFI conversion complete
+* Cheat mode and debug mode controls for event selection
 * fixes
 * RA UI tweaks
+* tooltips now managed by Tippy
 
 ## 0.10.7.1-3.9.6 - 2021-04-02
 
diff --git a/player variables documentation - Pregmod.txt b/player variables documentation - Pregmod.txt
index 1eddbc1385ad5c208599a727f86fa3316b49d45d..d8fd24f46feb390f6093293bbf6c92c4cb7be7fb 100644
--- a/player variables documentation - Pregmod.txt	
+++ b/player variables documentation - Pregmod.txt	
@@ -541,6 +541,21 @@ face:
 
 100
 
+lips:
+
+lip size (0-100)
+0  - 10 - thin
+11 - 20 - normal
+21 - 40 - pretty
+41 - 70 - plush
+71 - 95 - huge (lisps)
+96 - 100- facepussy (mute)
+
+lipsImplant:
+
+how large her lip implants are
+See .lips
+
 reservedChildren:
 
 how many of your children will be added to the incubator
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index b51ecbc0720c5ee7275a26f60f3eb99044fc3f69..2f2d540f2fbb6c4994a03913d1ca9485f34f296b 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,6 +1,6 @@
 App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
-	pmod: "3.9.6",
+	pmod: "4.0.0-alpha.0",
 	commitHash: null,
-	release: 1129 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1130 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js
index 24a7377bdd10c2ee4e58dd34d663eff406332533..96780671218e4ceb7cc159aabcb00946d789fba6 100644
--- a/src/005-passages/facilitiesPassages.js
+++ b/src/005-passages/facilitiesPassages.js
@@ -1,8 +1,10 @@
 /* ### Standard Facilities ### */
-new App.DomPassage("Pit", () => { return App.Facilities.Pit.pit(); }, ["jump-to-safe", "jump-from-safe"]);
+new App.DomPassage("Farmyard", () => { return App.Facilities.Farmyard.farmyard(); }, ["jump-to-safe", "jump-from-safe"]);
 
 new App.DomPassage("Incubator", () => { return App.UI.incubator(); }, ["jump-to-safe", "jump-from-safe"]);
 
+new App.DomPassage("Pit", () => { return App.Facilities.Pit.pit(); }, ["jump-to-safe", "jump-from-safe"]);
+
 new App.DomPassage("Spa", () => { return App.Facilities.Spa.spa(); }, ["jump-to-safe", "jump-from-safe"]);
 
 /* ### Slave Interact Facilities ### */
diff --git a/src/005-passages/interactPassages.js b/src/005-passages/interactPassages.js
index cc3673cb1a6786656b20785e1ba7daa3e525d89e..bab037625e48943f339c9b1ee53441e3bbd2a919 100644
--- a/src/005-passages/interactPassages.js
+++ b/src/005-passages/interactPassages.js
@@ -161,47 +161,6 @@ new App.DomPassage("Aztec Slave Sacrifice Life",
 	}
 );
 
-new App.DomPassage("fLips",
-	() => {
-		return App.Interact.fLips(getSlave(V.AS));
-	}
-);
-
-new App.DomPassage("fBoobs",
-	() => {
-		return App.Interact.fBoobs(getSlave(V.AS));
-	}
-);
-
-new App.DomPassage("fVagina",
-	() => {
-		return App.Interact.fVagina(getSlave(V.AS));
-	}
-);
-
-new App.DomPassage("fRival",
-	() => {
-		return App.Interact.fRival(getSlave(V.AS));
-	}
-);
-new App.DomPassage("fButt",
-	() => {
-		return App.Interact.fButt(getSlave(V.AS));
-	}
-);
-
-new App.DomPassage("fDick",
-	() => {
-		return App.Interact.fDick(getSlave(V.AS));
-	}
-);
-
-new App.DomPassage("fAnus",
-	() => {
-		return App.Interact.fAnus(getSlave(V.AS));
-	}
-);
-
 new App.DomPassage("Abort",
 	() => {
 		V.nextButton = "Back";
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index be6f467b4c9e93574b4b590acb2393ee124793ed..00183102f1b2670ff4e3c92306462d83daadbdcc 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -351,9 +351,9 @@ App.SecExp.initTrade = function() {
 		} else if (V.terrain === "ravine") {
 			init -= jsRandom(5, 5);
 		}
-		if (["BlackHat", "capitalist", "celebrity", "wealth"].includes(V.PC.career)) {
+		if (isPCCareerInCategory("wealth") || isPCCareerInCategory("capitalist") || isPCCareerInCategory("celebrity") || isPCCareerInCategory("BlackHat")) {
 			init += jsRandom(5, 5);
-		} else if (["escort", "gang", "servant"].includes(V.PC.career)) {
+		} else if (isPCCareerInCategory("escort") || isPCCareerInCategory("gang") || isPCCareerInCategory("servant")) {
 			init -= jsRandom(5, 5);
 		}
 		V.SecExp.core.trade = init;
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index a202550464b45fb8c33116926dcff1511fd35754..5973ea3894dc67824d18940dc36885124c14bb57 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -256,7 +256,7 @@ App.Update.globalVariables = function(node) {
 
 	// PC
 	{
-		PCDatatypeCleanup();
+		PCDatatypeCleanup(V.PC);
 		V.enduringTrust = Number(V.enduringTrust) || 0;
 		V.enduringDevotion = Number(V.enduringDevotion) || 0;
 		V.averageTrust = Number(V.averageTrust) || 0;
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index 8e934c7070f1ab93a54e1eb9dc44c38f18705254..f29bd8ed39c7b2301f3be2829b7afe074fdd92f5 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -579,7 +579,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 			slave.hLength = Math.clamp(+slave.hLength, 0, 300) || 60;
 		}
 		if (typeof slave.hStyle !== "string") {
-			slave.hStyle = "long";
+			slave.hStyle = "neat";
 		}
 		slave.haircuts = Math.clamp(+slave.haircuts, 0, 1) || 0;
 		slave.bald = Math.clamp(+slave.bald, 0, 1) || 0;
@@ -1200,194 +1200,485 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 	}
 })();
 
-/* Make sure any new PC variables put into use are added to this! */
-globalThis.PCDatatypeCleanup = function() {
-	const PC = V.PC;
+/* See slave datatype cleanup for details */
+globalThis.PCDatatypeCleanup = (function PCDatatypeCleanup() {
+	"use strict";
 
-	if (PC.title !== 0) {
-		PC.title = Math.clamp(+PC.title, 0, 1) || 1;
-	}
-	if (PC.dick !== 0) {
-		PC.dick = Math.clamp(+PC.dick, 0, 5) || 4;
-	}
-	if (PC.vagina !== -1) {
-		PC.vagina = Math.clamp(+PC.vagina, 0, 5) || 0;
-	}
-	if (typeof PC.genes !== "string") {
-		PC.genes = "XY";
-	}
-	if (typeof PC.nationality !== "string") {
-		PC.nationality = "Stateless";
-	}
-	if (typeof PC.race !== "string") {
-		PC.race = "white";
-	}
-	if (typeof PC.skin !== "string") {
-		PC.skin = "light";
-	}
-	if (typeof PC.markings !== "string") {
-		PC.markings = "none";
-	}
-	if (typeof PC.hColor !== "string") {
-		PC.hColor = "blonde";
-	}
-	if (typeof PC.eye.origColor !== "string") {
-		PC.eye.origColor = "blue";
-	}
-	PC.belly = Math.max(+PC.belly, 0) || 0;
-	PC.fertPeak = Math.clamp(+PC.fertPeak, 0, 4) || 0;
-	PC.pregMood = Math.clamp(+PC.pregMood, 0, 2) || 0;
-	PC.boobs = Math.clamp(+PC.boobs, 100, 1500) || 100;
-	PC.boobsImplant = Math.clamp(+PC.boobsImplant, 0, 1000) || 0;
-	PC.butt = Math.clamp(+PC.butt, 0, 5) || 2;
-	PC.buttImplant = Math.clamp(+PC.buttImplant, 0, 5) || 0;
-	PC.balls = Math.clamp(+PC.balls, 0, 100) || 0;
-	PC.ballsImplant = Math.clamp(+PC.ballsImplant, 0, 100) || 0;
-	PC.prostate = Math.clamp(+PC.prostate, 0, 1) || 0;
-	PC.degeneracy = Math.max(+PC.degeneracy, 0) || 0;
-	PC.birthWeek = Math.clamp(+PC.birthWeek, 0, 51) || 0;
-	if (PC.sexualEnergy !== 0) {
-		PC.sexualEnergy = +PC.sexualEnergy || 4;
-	}
-	if (typeof PC.refreshment !== "string") {
-		PC.refreshment = "cigar";
+	return PCDatatypeCleanup;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCDatatypeCleanup(PC) {
+		PCAgeDatatypeCleanup(PC);
+		PCPhysicalDatatypeCleanup(PC);
+		PCFaceDatatypeCleanup(PC);
+		PCHairDatatypeCleanup(PC);
+		PCBoobsDatatypeCleanup(PC);
+		PCButtDatatypeCleanup(PC);
+		PCPregnancyDatatypeCleanup(PC);
+		PCBellyDatatypeCleanup(PC);
+		PCGenitaliaDatatypeCleanup(PC);
+		PCImplantsDatatypeCleanup(PC);
+		PCCosmeticsDatatypeCleanup(PC);
+		PCDietDatatypeCleanup(PC);
+		PCRelationDatatypeCleanup(PC);
+		PCSkillsDatatypeCleanup(PC);
+		PCStatCountDatatypeCleanup(PC);
+		PCPreferencesDatatypeCleanup(PC);
+		PCRulesDatatypeCleanup(PC);
+		PCCustomStatsDatatypeCleanup(PC);
+		PCMiscellaneousDatatypeCleanup(PC);
+		App.Entity.Utils.migratePronouns(PC);
+		generatePlayerPronouns(PC);
 	}
-	if (!(V.ver.startsWith("0.10"))) {
-		if (V.PC.refreshment === "cigar") {
-			V.PC.refreshmentType = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCAgeDatatypeCleanup(PC) {
+		if (PC.birthWeek > 51) {
+			PC.birthWeek = PC.birthWeek % 52;
+		}
+		PC.birthWeek = Math.clamp(+PC.birthWeek, 0, 51) || 0;
+		if (PC.age > 0) {
+			PC.actualAge = Math.clamp(+PC.actualAge, 10, 80) || PC.age; /* if undefined, this sets to PC.age */
+			delete PC.age;
 		} else {
-			V.PC.refreshmentType = 1;
-		}
-	}
-	PC.refreshmentType = Math.clamp(+PC.refreshmentType, 0, 6) || 0;
-	PC.skill.trading = Math.clamp(+PC.skill.trading, -100, 100) || 0;
-	PC.skill.warfare = Math.clamp(+PC.skill.warfare, -100, 100) || 0;
-	PC.skill.slaving = Math.clamp(+PC.skill.slaving, -100, 100) || 0;
-	PC.skill.engineering = Math.clamp(+PC.skill.engineering, -100, 100) || 0;
-	PC.skill.medicine = Math.clamp(+PC.skill.medicine, -100, 100) || 0;
-	PC.skill.hacking = Math.clamp(+PC.skill.hacking, -100, 100) || 0;
-	PC.skill.cumTap = Math.max(+PC.skill.cumTap, 0) || 0;
-	PC.mother = +PC.mother || 0;
-	PC.father = +PC.father || 0;
-	PC.labor = Math.clamp(+PC.labor, 0, 1) || 0;
-	PC.counter.birthsTotal = Math.max(+PC.counter.birthsTotal, 0) || 0;
-	PC.counter.birthElite = Math.max(+PC.counter.birthElite, 0) || 0;
-	PC.counter.birthMaster = Math.max(+PC.counter.birthMaster, 0) || 0;
-	PC.counter.birthDegenerate = Math.max(+PC.counter.birthDegenerate, 0) || 0;
-	PC.counter.birthClient = Math.max(+PC.counter.birthClient, 0) || 0;
-	PC.counter.birthOther = Math.max(+PC.counter.birthOther, 0) || 0;
-	PC.counter.birthArcOwner = Math.max(+PC.counter.birthArcOwner, 0) || 0;
-	PC.counter.birthCitizen = Math.max(+PC.counter.birthCitizen, 0) || 0;
-	PC.counter.birthSelf = Math.max(+PC.counter.birthSelf, 0) || 0;
-	PC.counter.birthLab = Math.max(+PC.counter.birthLab, 0) || 0;
-	PC.counter.birthFutaSis = Math.max(+PC.counter.birthFutaSis, 0) || 0;
-	PC.counter.slavesFathered = Math.max(+PC.counter.slavesFathered, 0) || 0;
-	PC.counter.slavesKnockedUp = Math.max(+PC.counter.slavesKnockedUp, 0) || 0;
-	PC.counter.storedCum = Math.max(+PC.counter.storedCum, 0) || 0;
-	PC.intelligence = 100;
-	PC.face = 100;
-	PC.actualAge = Math.clamp(+PC.actualAge, 14, 80) || 35;
-	PC.physicalAge = Math.clamp(+PC.physicalAge, 14, 80) || PC.actualAge;
-	PC.visualAge = Math.clamp(+PC.visualAge, 14, 80) || PC.actualAge;
-	PC.ovaryAge = Math.clamp(+PC.ovaryAge, 14, 80) || PC.physicalAge;
-	if (V.playerAging !== 0) {
-		V.playerAging = Math.clamp(+V.playerAging, 0, 2) || 2;
-	}
-	PC.newVag = Math.clamp(+PC.newVag, 0, 1) || 0;
-	PC.fertDrugs = Math.clamp(+PC.fertDrugs, 0, 1) || 0;
-	PC.forcedFertDrugs = Math.max(+PC.forcedFertDrugs, 0) || 0;
-	PC.staminaPills = Math.clamp(+PC.staminaPills, 0, 1) || 0;
-	PC.mpreg = 0; /* So knockMeUp() may be used with the PC */
-	PC.lactation = Math.max(+PC.lactation, 0) || 0;
-	PC.lactationDuration = Math.max(+PC.lactationDuration, 0) || 0;
-	PC.muscles = Math.clamp(+PC.muscles, -100, 100) || 50;
-	PC.hLength = Math.clamp(+PC.hLength, 0, 150) || 2;
-	PC.voice = Math.clamp(+PC.voice, 1, 3) || 1;
-	if (typeof PC.health === "number") {
-		const condition = PC.health;
-		PC.health = {};
-		PC.health.condition = condition;
-	}
-	PC.health.condition = Math.clamp(PC.health.condition, -100, 100) || 0;
-	if (PC.majorInjury !== undefined) {
-		if (PC.majorInjury > 0) {
-			PC.health.shortDamage = Math.max(PC.majorInjury * 20, 30);
+			PC.actualAge = Math.clamp(+PC.actualAge, 10, Infinity) || 35;
+		}
+		PC.physicalAge = Math.clamp(+PC.physicalAge, 14, 80) || PC.actualAge;
+		PC.visualAge = Math.clamp(+PC.visualAge, 14, 80) || PC.actualAge;
+		PC.ovaryAge = Math.clamp(+PC.ovaryAge, 14, 80) || PC.physicalAge;
+		if (V.playerAging !== 0) {
+			V.playerAging = Math.clamp(+V.playerAging, 0, 2) || 2;
+		}
+		PC.pubertyAgeXX = Math.max(+PC.pubertyAgeXX, 0) || 13;
+		PC.pubertyAgeXY = Math.max(+PC.pubertyAgeXY, 0) || 13;
+		if (typeof PC.health === "number") {
+			const condition = PC.health;
+			PC.health = {};
+			PC.health.condition = condition;
+		}
+		PC.health.condition = Math.clamp(PC.health.condition, -100, 100) || 0;
+		if (PC.majorInjury !== undefined) {
+			if (PC.majorInjury > 0) {
+				PC.health.shortDamage = Math.max(PC.majorInjury * 20, 30);
+			} else {
+				PC.health.shortDamage = 0;
+			}
+			delete PC.majorInjury;
 		} else {
-			PC.health.shortDamage = 0;
+			PC.health.shortDamage = Math.max(+PC.health.shortDamage, 0) || 0;
 		}
-		delete PC.majorInjury;
-	} else {
+		PC.health.longDamage = Math.max(+PC.health.longDamage, 0) || 0;
+		PC.health.illness = Math.max(+PC.health.illness, 0) || 0;
+		PC.health.tired = Math.clamp(+PC.health.tired, 0, 100) || 0;
+		PC.health.health = Math.clamp(PC.health.condition - PC.health.shortDamage - PC.health.longDamage, -100, 100) || 0;
+	}
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCPhysicalDatatypeCleanup(PC) {
+		if (PC.title !== 0) {
+			PC.title = Math.clamp(+PC.title, 0, 1) || 1;
+		}
+		if (typeof PC.genes !== "string") {
+			PC.genes = "XY";
+		}
+		if (typeof PC.nationality !== "string") {
+			PC.nationality = "Stateless";
+		}
+		if (typeof PC.race !== "string") {
+			PC.race = "white";
+		}
+		if (typeof PC.origRace !== "string") {
+			PC.origRace = PC.race;
+		}
+		if (typeof PC.skin !== "string") {
+			PC.skin = "light";
+		}
+		if (typeof PC.origSkin !== "string") {
+			PC.origSkin = PC.skin;
+		}
+
+		// why is this duplicated?
+		PC.health.condition = Math.clamp(PC.health.condition, -100, 200) || 0;
 		PC.health.shortDamage = Math.max(+PC.health.shortDamage, 0) || 0;
+		PC.health.longDamage = Math.max(+PC.health.longDamage, 0) || 0;
+		PC.health.illness = Math.max(+PC.health.illness, 0) || 0;
+		PC.health.tired = Math.clamp(+PC.health.tired, 0, 100) || 0;
+		PC.health.health = Math.clamp(PC.health.condition - PC.health.shortDamage - PC.health.longDamage, -100, 100) || 0;
+
+		PC.muscles = Math.clamp(+PC.muscles, -100, 100) || 0;
+		PC.weight = Math.clamp(+PC.weight, -100, 200) || 0;
+		PC.waist = Math.clamp(+PC.waist, -100, 100) || 0;
+		PC.height = Math.round(Math.max(+PC.height, 0)) || Math.round(Height.mean(PC));
+		PC.shoulders = Math.clamp(+PC.shoulders, -2, 2) || 0;
+		PC.hips = Math.clamp(+PC.hips, -2, 3) || 0;
 	}
-	PC.health.longDamage = Math.max(+PC.health.longDamage, 0) || 0;
-	PC.health.illness = Math.max(+PC.health.illness, 0) || 0;
-	PC.health.tired = Math.clamp(+PC.health.tired, 0, 100) || 0;
-	PC.health.health = Math.clamp(PC.health.condition - PC.health.shortDamage - PC.health.longDamage, -100, 100) || 0;
-	if (typeof PC.rules.living !== "string") {
-		PC.rules.living = "normal";
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCFaceDatatypeCleanup(PC) {
+		if (typeof PC.eye.origColor !== "string") {
+			PC.eye.origColor = "blue";
+		}
+		PC.face = 100;
+		if (PC.lips !== 0) {
+			PC.lips = Math.clamp(+PC.lips, 0, 100) || 15;
+		}
 	}
-	if (typeof PC.rules.lactation !== "string") {
-		PC.rules.lactation = "none";
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCHairDatatypeCleanup(PC) {
+		if (typeof PC.hColor !== "string") {
+			PC.hColor = "blonde";
+		}
+		if (typeof PC.origHColor !== "string") {
+			PC.origHColor = PC.hColor;
+		}
+		if (PC.hLength !== 0) {
+			PC.hLength = Math.clamp(+PC.hLength, 0, 300) || 2;
+		}
+		if (typeof PC.hStyle !== "string") {
+			PC.hStyle = "neat";
+		}
+		if (typeof PC.pubicHColor !== "string") {
+			PC.pubicHColor = PC.hColor;
+		}
+		if (typeof PC.pubicHStyle !== "string") {
+			PC.pubicHStyle = "hairless";
+		}
+		if (typeof PC.underArmHColor !== "string") {
+			PC.underArmHColor = PC.hColor;
+		}
+		if (typeof PC.underArmHStyle !== "string") {
+			PC.underArmHStyle = "hairless";
+		}
+		if (typeof PC.eyebrowHColor !== "string") {
+			PC.eyebrowHColor = PC.hColor;
+		}
+		if (typeof PC.eyebrowHStyle !== "string") {
+			PC.eyebrowHStyle = "natural";
+		}
+		if (typeof PC.eyebrowFullness !== "string") {
+			PC.eyebrowFullness = "natural";
+		}
 	}
-	if (typeof PC.rules.rest !== "string") {
-		PC.rules.rest = "permissive";
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCBoobsDatatypeCleanup(PC) {
+		PC.boobs = Math.max(+PC.boobs, 200) || 200;
+		if (typeof PC.boobShape !== "string") {
+			PC.boobShape = "normal";
+		}
+		if (PC.boobShape === "spherical" && PC.boobsImplant === 0) {
+			PC.boobShape = "normal";
+		}
+		if (typeof PC.nipples !== "string") {
+			PC.nipples = "tiny";
+		}
+		PC.areolae = Math.clamp(+PC.areolae, 0, 4) || 0;
+		PC.lactation = Math.max(+PC.lactation, 0) || 0;
+		PC.lactationDuration = Math.max(+PC.lactationDuration, 0) || 0;
+		if (PC.boobsMilk > 0 && PC.boobs - PC.boobsMilk - PC.boobsImplant < 0) {
+			// should never get here, but if it does, just immediately abort!
+			PC.boobsMilk = 0;
+		}
+		PC.lactationAdaptation = Math.clamp(+PC.lactationAdaptation, 0, 100) || 0;
 	}
-	App.Entity.Utils.migratePronouns(PC);
-	generatePlayerPronouns(PC);
 
-	if (PC.age !== undefined) {
-		delete PC.age;
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCButtDatatypeCleanup(PC) {
+		if (PC.butt !== 0) {
+			PC.butt = Math.clamp(+PC.butt, 0, 20) || 2;
+		}
+		PC.anus = Math.clamp(+PC.anus, 0, 4) || 0;
+		PC.analArea = Math.max(+PC.analArea, 0) || 0;
 	}
-	if (PC.indenture !== undefined) {
-		delete PC.indenture;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCPregnancyDatatypeCleanup(PC) {
+		PC.induce = Math.clamp(+PC.induce, 0, 1) || 0;
+		PC.labor = Math.clamp(+PC.labor, 0, 1) || 0;
+		PC.prematureBirth = Math.clamp(+PC.prematureBirth, 0, 1) || 0;
+		PC.ovaries = Math.clamp(+PC.ovaries, 0, 1) || 0;
+		PC.vasectomy = Math.clamp(+PC.vasectomy, 0, 1) || 0;
+		PC.mpreg = Math.clamp(+PC.mpreg, 0, 1) || 0;
+		if (PC.pregAdaptation !== 0) {
+			PC.pregAdaptation = Math.max(+PC.pregAdaptation, 0) || 50;
+		}
+		if (PC.pubertyXX === 0 && (PC.ovaries > 0 || PC.mpreg > 0) && PC.preg === -1) {
+			PC.preg = 0; // no contraceptives for prepubescent slaves
+		}
+		PC.fertPeak = Math.clamp(+PC.fertPeak, 0, 4) || 0;
+		PC.pregSource = +PC.pregSource || 0;
+		PC.pregMood = Math.clamp(+PC.pregMood, 0, 2) || 0;
+		PC.fertDrugs = Math.clamp(+PC.fertDrugs, 0, 1) || 0;
+		PC.forcedFertDrugs = Math.max(+PC.forcedFertDrugs, 0) || 0;
+		WombNormalizePreg(PC);
 	}
-	if (PC.indentureRestrictions !== undefined) {
-		delete PC.indentureRestrictions;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCBellyDatatypeCleanup(PC) {
+		PC.inflation = Math.clamp(+PC.inflation, 0, 3) || 0;
+		if (typeof PC.inflationType !== "string") {
+			PC.inflationType = "none";
+		}
+		PC.inflationMethod = Math.clamp(+PC.inflationMethod, 0, 3) || 0;
+		PC.milkSource = Math.max(+PC.milkSource, 0) || 0;
+		PC.cumSource = Math.max(+PC.cumSource, 0) || 0;
+		if (PC.bellyImplant !== 0) {
+			PC.bellyImplant = Math.max(+PC.bellyImplant, -1) || -1;
+		}
+		PC.cervixImplant = Math.clamp(+PC.cervixImplant, 0, 3) || 0;
+		PC.bellySag = Math.max(+PC.bellySag, 0) || 0;
+		PC.bellySagPreg = Math.max(+PC.bellySagPreg, 0) || PC.bellySag;
+		PC.bellyPain = Math.clamp(+PC.bellyPain, 0, 2) || 0;
+		SetBellySize(PC);
 	}
-	if (PC.boobsImplant > 0) {
-		// update with 4.0.0
-		PC.boobsImplantType = "normal";
-	} else {
-		PC.boobsImplantType = "none";
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCGenitaliaDatatypeCleanup(PC) {
+		PC.newVag = Math.clamp(+PC.newVag, 0, 1) || 0;
+		if (PC.vagina !== -1) {
+			PC.vagina = Math.clamp(+PC.vagina, 0, 10) || 1;
+		}
+		PC.vaginaLube = Math.clamp(+PC.vaginaLube, 0, 2) || 0;
+		PC.labia = Math.clamp(+PC.labia, 0, 3) || 0;
+		PC.clit = Math.clamp(+PC.clit, 0, 5) || 0;
+		PC.foreskin = Math.max(+PC.foreskin, 0) || 0;
+		if (PC.dick !== 0) {
+			PC.dick = Math.max(+PC.dick, 1) || 4;
+			PC.prostate = Math.clamp(+PC.prostate, 0, 1) || 1;
+			PC.balls = Math.max(+PC.balls, 0) || 3;
+		} else {
+			PC.prostate = Math.clamp(+PC.prostate, 0, 1) || 0;
+			PC.balls = Math.max(+PC.balls, 0) || 0;
+		}
+		if (PC.scrotum !== 0) {
+			PC.scrotum = Math.max(+PC.scrotum, 0) || PC.balls;
+		}
 	}
-	if (PC.buttImplant > 0) {
-		PC.buttImplantType = "normal";
-	} else {
-		PC.buttImplantType = "none";
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCImplantsDatatypeCleanup(PC) {
+		PC.ageImplant = Math.clamp(+PC.ageImplant, 0, 1) || 0;
+		PC.faceImplant = Math.clamp(+PC.faceImplant, 0, 100) || 0;
+		PC.lipsImplant = Math.clamp(+PC.lipsImplant, 0, 100) || 0;
+		PC.voiceImplant = Math.clamp(+PC.voiceImplant, -1, 1) || 0;
+		PC.boobsImplant = Math.clamp(+PC.boobsImplant, 0, PC.boobs) || 0;
+		if (PC.boobsImplant === 0) {
+			PC.boobsImplantType = "none";
+		} else if (PC.boobsImplant > 0 && PC.boobsImplantType === "none") {
+			if (PC.boobsImplant > 10000) {
+				PC.boobsImplantType = "hyper fillable";
+			} else if (PC.boobsImplant > 2200) {
+				PC.boobsImplantType = "advanced fillable";
+			} else if (PC.boobsImplant > 1000) {
+				PC.boobsImplantType = "fillable";
+			} else {
+				PC.boobsImplantType = "normal";
+			}
+		}
+		PC.breastMesh = Math.clamp(+PC.breastMesh, 0, 1) || 0;
+		PC.buttImplant = Math.clamp(+PC.buttImplant, 0, Math.min(PC.butt, 20)) || 0;
+		if (typeof PC.buttImplantType !== "string") {
+			if (PC.buttImplant === 0) {
+				PC.buttImplantType = "none";
+			} else if (PC.buttImplant > 0) {
+				PC.buttImplantType = "normal";
+			}
+		}
+		PC.heightImplant = Math.clamp(+PC.heightImplant, -10, 10) || 0;
+		PC.earImplant = Math.clamp(+PC.earImplant, 0, 1) || 0;
+		PC.shouldersImplant = Math.clamp(+PC.shouldersImplant, -10, 10) || 0;
+		PC.hipsImplant = Math.clamp(+PC.hipsImplant, -10, 10) || 0;
+		PC.ballsImplant = Math.clamp(+PC.ballsImplant, 0, 100) || 0;
 	}
-	if (V.PC.customTitle === "") {
-		V.PC.customTitle = undefined;
-		V.PC.customTitleLisp = undefined;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCCosmeticsDatatypeCleanup(PC) {
+		if (typeof PC.clothes !== "string") {
+			PC.clothes = "nice business attire";
+		}
+		if (typeof PC.eyewear !== "string") {
+			PC.eyewear = "none";
+		}
+		if (typeof PC.markings !== "string") {
+			PC.markings = "none";
+		}
 	}
-	if (typeof V.PC.counter.oral === "undefined") {
-		V.PC.counter.oral = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCDietDatatypeCleanup(PC) {
+		if (typeof PC.refreshment !== "string") {
+			PC.refreshment = "cigar";
+		}
+		if (!(V.ver.startsWith("0.10"))) {
+			if (PC.refreshment === "cigar") {
+				PC.refreshmentType = 0;
+			} else {
+				PC.refreshmentType = 1;
+			}
+		}
+		PC.refreshmentType = Math.clamp(+PC.refreshmentType, 0, 6) || 0;
+		if (typeof PC.diet !== "string") {
+			PC.diet = "healthy";
+		}
+		PC.hormones = Math.clamp(+PC.hormones, -2, 2) || 0;
+		PC.hormoneBalance = Math.clamp(+PC.hormoneBalance, -500, 500) || 0;
+		if (typeof PC.drugs !== "string") {
+			PC.drugs = "no drugs";
+		}
+		PC.aphrodisiacs = Math.clamp(+PC.aphrodisiacs, -1, 2) || 0;
+		PC.staminaPills = Math.clamp(+PC.staminaPills, 0, 1) || 0;
 	}
-	if (typeof V.PC.counter.vaginal === "undefined") {
-		V.PC.counter.vaginal = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCRelationDatatypeCleanup(PC) {
+		PC.mother = +PC.mother || 0;
+		PC.father = +PC.father || 0;
 	}
-	if (typeof V.PC.counter.anal === "undefined") {
-		V.PC.counter.anal = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCSkillsDatatypeCleanup(PC) {
+		PC.skill.trading = Math.clamp(+PC.skill.trading, -100, 100) || 0;
+		PC.skill.warfare = Math.clamp(+PC.skill.warfare, -100, 100) || 0;
+		PC.skill.slaving = Math.clamp(+PC.skill.slaving, -100, 100) || 0;
+		PC.skill.engineering = Math.clamp(+PC.skill.engineering, -100, 100) || 0;
+		PC.skill.medicine = Math.clamp(+PC.skill.medicine, -100, 100) || 0;
+		PC.skill.hacking = Math.clamp(+PC.skill.hacking, -100, 100) || 0;
+		PC.skill.cumTap = Math.max(+PC.skill.cumTap, 0) || 0;
 	}
-	if (typeof V.PC.counter.mammary === "undefined") {
-		V.PC.counter.mammary = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCStatCountDatatypeCleanup(PC) {
+		PC.counter.oral = Math.max(+PC.counter.oral, 0) || 0;
+		PC.counter.vaginal = Math.max(+PC.counter.vaginal, 0) || 0;
+		PC.counter.anal = Math.max(+PC.counter.anal, 0) || 0;
+		PC.counter.mammary = Math.max(+PC.counter.mammary, 0) || 0;
+		PC.counter.penetrative = Math.max(+PC.counter.penetrative, 0) || 0;
+		PC.counter.milk = Math.max(+PC.counter.milk, 0) || 0;
+		PC.counter.cum = Math.max(+PC.counter.cum, 0) || 0;
+		PC.counter.birthsTotal = Math.max(+PC.counter.birthsTotal, 0) || 0;
+		PC.counter.birthElite = Math.max(+PC.counter.birthElite, 0) || 0;
+		PC.counter.birthMaster = Math.max(+PC.counter.birthMaster, 0) || 0;
+		PC.counter.birthDegenerate = Math.max(+PC.counter.birthDegenerate, 0) || 0;
+		PC.counter.birthClient = Math.max(+PC.counter.birthClient, 0) || 0;
+		PC.counter.birthOther = Math.max(+PC.counter.birthOther, 0) || 0;
+		PC.counter.birthArcOwner = Math.max(+PC.counter.birthArcOwner, 0) || 0;
+		PC.counter.birthCitizen = Math.max(+PC.counter.birthCitizen, 0) || 0;
+		PC.counter.birthSelf = Math.max(+PC.counter.birthSelf, 0) || 0;
+		PC.counter.birthLab = Math.max(+PC.counter.birthLab, 0) || 0;
+		PC.counter.birthFutaSis = Math.max(+PC.counter.birthFutaSis, 0) || 0;
+		PC.counter.abortions = Math.max(+PC.counter.abortions, 0) || 0;
+		PC.counter.miscarriages = Math.max(+PC.counter.miscarriages, 0) || 0;
+		PC.counter.slavesFathered = Math.max(+PC.counter.slavesFathered, 0) || 0;
+		PC.counter.slavesKnockedUp = Math.max(+PC.counter.slavesKnockedUp, 0) || 0;
+		PC.counter.storedCum = Math.max(+PC.counter.storedCum, 0) || 0;
+		PC.bodySwap = Math.max(+PC.bodySwap, 0) || 0;
 	}
-	if (typeof V.PC.counter.penetrative === "undefined") {
-		V.PC.counter.penetrative = 0;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCPreferencesDatatypeCleanup(PC) {
+		if (PC.sexualEnergy !== 0) {
+			PC.sexualEnergy = +PC.sexualEnergy || 4;
+		}
+		PC.energy = Math.clamp(+PC.energy, 0, 100) || 80;
+		PC.need = Math.max(+PC.need, 0) || 0;
+		PC.degeneracy = Math.max(+PC.degeneracy, 0) || 0;
 	}
-	WombInit(V.PC);
-	if (typeof V.PC.ID === "undefined") {
-		V.PC.ID = -1;
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCRulesDatatypeCleanup(PC) {
+		if (typeof PC.rules.living !== "string") {
+			PC.rules.living = "normal";
+		}
+		if (typeof PC.rules.lactation !== "string") {
+			PC.rules.lactation = "none";
+		}
+		if (typeof PC.rules.rest !== "string") {
+			PC.rules.rest = "permissive";
+		}
 	}
-	if (typeof V.PC.partners !== "object") {
-		V.PC.partners = new Set();
+
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCCustomStatsDatatypeCleanup(PC) {
+		if (PC.customTitle === "") {
+			PC.customTitle = undefined;
+			PC.customTitleLisp = undefined;
+		}
 	}
 
-	/* None of these are in use */
-	PC.bellyPreg = PC.belly;
-	PC.ageImplant = 0;
-	PC.voiceImplant = 0;
-	PC.accent = 0;
-};
+	/**
+	 * @param {App.Entity.PlayerState} PC
+	 */
+	function PCMiscellaneousDatatypeCleanup(PC) {
+		if (typeof PC.ID === "undefined") {
+			PC.ID = -1;
+		}
+		PC.chem = Math.max(+PC.chem, 0) || 0;
+		PC.addict = Math.max(+PC.addict, 0) || 0;
+		PC.intelligence = 100;
+		PC.intelligenceImplant = Math.clamp(+PC.intelligenceImplant, -15, 30) || 30;
+		PC.hears = Math.clamp(+PC.hears, -2, 0) || 0;
+		PC.smells = Math.clamp(+PC.smells, -1, 0) || 0;
+		PC.tastes = Math.clamp(+PC.tastes, -1, 0) || 0;
+		PC.PLimb = Math.clamp(+PC.PLimb, 0, 2) || 0;
+		if (PC.voice !== 0) {
+			PC.voice = Math.clamp(+PC.voice, 0, 3) || 1;
+		}
+		PC.electrolarynx = Math.clamp(+PC.electrolarynx, 0, 1) || 0;
+		if (typeof PC.origBodyOwner !== "string") {
+			PC.origBodyOwner = "";
+		}
+		PC.origBodyOwnerID = Math.max(+PC.origBodyOwnerID, 0) || 0;
+		if (PC.indenture !== undefined) {
+			delete PC.indenture;
+		}
+		if (PC.indentureRestrictions !== undefined) {
+			delete PC.indentureRestrictions;
+		}
+		if (typeof PC.partners !== "object") {
+			PC.partners = new Set();
+		}
+		PC.accent = 0; // Might not use? Would be related to changing languages. Might not work out.
+	}
+})();
 
 globalThis.EconomyDatatypeCleanup = function() {
 	V.AProsperityCap = Math.max(+V.AProsperityCap, 0) || 0;
@@ -2295,10 +2586,6 @@ App.Entity.Utils.PCCheatCleanup = function() {
 		V.PC.pregWeek = 0;
 	}
 
-	if (V.PC.boobs < 300) {
-		V.PC.boobs = 100;
-		V.PC.boobsImplant = 0;
-	}
 	if (V.PC.boobsImplant > V.PC.boobs) {
 		V.PC.boobsImplant = V.PC.boobs;
 	}
@@ -2330,7 +2617,7 @@ App.Entity.Utils.PCCheatCleanup = function() {
 	}
 
 	ibc.recalculate_coeff_id(-1);
-	PCDatatypeCleanup();
+	PCDatatypeCleanup(V.PC);
 	V.upgradeMultiplierArcology = upgradeMultiplier('engineering');
 	V.upgradeMultiplierMedicine = upgradeMultiplier('medicine');
 	V.upgradeMultiplierTrade = upgradeMultiplier('trading');
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index a9926dd3060bea79f6ed066009f08a6f5e15228f..fe29fa942a6840f5e1ca0b0bb399aaac1bb0af8a 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -37,6 +37,9 @@ App.EndWeek.nextWeek = function() {
 	} else if (V.PC.fertPeak !== 0) {
 		V.PC.fertPeak = 0;
 	}
+	if (V.PC.health.shortDamage > 0) {
+		V.PC.health.shortDamage--;
+	}
 
 	// Adding random changes to the economy
 	if (V.difficultySwitch === 1) {
diff --git a/src/endWeek/saSocialEffects.js b/src/endWeek/saSocialEffects.js
index bda16c9945ec1a4c523c91dd5aaf9500b60b28a7..105927457cb6151899aaae7b7412b2eabf48c6cd 100644
--- a/src/endWeek/saSocialEffects.js
+++ b/src/endWeek/saSocialEffects.js
@@ -520,6 +520,9 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 			} else if ([Job.HEADGIRL, Job.ATTENDANT, Job.FARMER, Job.MADAM, Job.MATRON, Job.NURSE, Job.TEACHER, Job.STEWARD, Job.BODYGUARD].includes(slave.assignment)) {
 				t.push(new SocialEffect("Intellectual Dependency", 0, `Intelligence required by job`,
 					`Society understands the value of intelligence in ${his} appointed position and is willing to overlook it.`));
+			} else if ([Job.ARCADE, Job.GLORYHOLE].includes(slave.assignment) && (slave.intelligence + slave.intelligenceImplant > 10)) {
+				t.push(new SocialEffect("Intellectual Dependency", 1, `Smart Fuckmeat`,
+					`Society finds it <span class="green">amusing</span> to see a smart slave being reduced to nothing but a set of holes; ${his} intelligence will not bore anyone here.`));
 			} else if ((slave.intelligence + slave.intelligenceImplant > 10)) {
 				t.push(new SocialEffect("Intellectual Dependency", -1, `Too smart`,
 					`Society <span class="red">disapproves</span> of ${slave.slaveName}'s sharp mind; this holds back acceptance of the idea that slaves should be dumb and dependent.`));
@@ -527,6 +530,9 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 			if (slave.energy > 95) {
 				t.push(new SocialEffect("Intellectual Dependency", 1, `Nymphomania`,
 					`Society <span class="green">approves</span> of ${slave.slaveName}'s bottomless lust, showing the public one more way a slave may be reliant on ${his} owner.`));
+			} else if ([Job.ARCADE, Job.GLORYHOLE].includes(slave.assignment) && (slave.energy <= 60)) {
+				t.push(new SocialEffect("Intellectual Dependency", 0, `Low Libido Fuckmeat`,
+					`Society doesn't notice ${slave.slaveName}'s low libido when ${he}'s reduced to nothing more than a fuckhole.`));
 			} else if ((slave.energy <= 60)) {
 				t.push(new SocialEffect("Intellectual Dependency", -1, `Low libido`,
 					`Society <span class="red">disapproves</span> of ${slave.slaveName}'s restrained libido; to the public, this gives ${him} too much freedom to focus on things other than sex.`));
@@ -674,9 +680,15 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 					`Society <span class="green">approves</span> of your owning a Fuckdoll.`));
 				transformed += 5; // total transformation
 			}
-			if (transformed === 0) {
+			if (transformed === 0 && [Job.ARCADE, Job.GLORYHOLE].includes(slave.assignment)) {
+				t.push(new SocialEffect("Transformation Fetishist", -1, `Totally unmodified fuckmeat`,
+					`Society <span class="red">would prefer</span> ${slave.slaveName}'s body to be a little more interesting but agrees that a simple fuckhole probably doesn't deserve much investment.`));
+			} else if (transformed === 0) {
 				t.push(new SocialEffect("Transformation Fetishist", -2, `Totally unmodified`,
 					`Society <span class="red">strongly disapproves</span> of ${slave.slaveName}'s complete lack of any obvious transformations; ${he} does not advance the ideal of body modification.`));
+			} else if (transformed === 1 && [Job.ARCADE, Job.GLORYHOLE].includes(slave.assignment)) {
+				t.push(new SocialEffect("Transformation Fetishist", 0, `Slightly modified fuckmeat`,
+					`Society accepts the minimal amount of modification ${slave.slaveName} has undergone; it's not a smart investment improving a lowly fuckhole's appearance, after all.`));
 			} else if (transformed === 1) {
 				t.push(new SocialEffect("Transformation Fetishist", -1, `Too few modifications`,
 					`Society <span class="red">disapproves</span> of ${slave.slaveName}'s mostly-natural appearance; more transformations would help advance the ideal of body modification.`));
@@ -742,7 +754,10 @@ App.SlaveAssignment.saSocialEffects = function(slave) {
 					`Society <span class="green">approves</span> of ${his} expanded lips.`));
 				assets++;
 			}
-			if (assets === 0) {
+			if (assets === 0 && [Job.ARCADE, Job.GLORYHOLE].includes(slave.assignment)) {
+				t.push(new SocialEffect("Asset Expansionist", 0, `Unexceptional fuckmeat`,
+					`Society is not thrilled about ${his} small assets but accepts ${his} role as a mere fuckhole; of course it would be better if ${he} were spilling out of the unit, but why waste the money on a worthless slab of fuckmeat?`));
+			} else if (assets === 0) {
 				t.push(new SocialEffect("Asset Expansionist", -1, `Unexceptional assets`,
 					`Society <span class="red">is disappointed</span> by ${his} normal-sized (or even petite, by expansionist standards) assets.`));
 			}
diff --git a/src/events/RESS/whoreRebellious.js b/src/events/RESS/whoreRebellious.js
new file mode 100644
index 0000000000000000000000000000000000000000..d973352082d223248d5621c44f049bde4bb3c170
--- /dev/null
+++ b/src/events/RESS/whoreRebellious.js
@@ -0,0 +1,193 @@
+App.Events.RESSWhoreRebellious = class RESSWhoreRebellious extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return []; // always valid if sufficient actors can be cast successfully
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				s => s.assignment === Job.WHORE,
+				s => s.devotion < -20,
+				s => s.trust >= -20,
+				s => (canDoAnal(s) || canDoVaginal(s))
+			]
+		];
+	}
+
+	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);
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave, "restrictive latex"); // TODO: Add mouth-plug?
+
+
+		let r = [];
+
+		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		r.push(`is kicked out of bed early in the morning. ${He}'s not yet obedient, but ${he} has to earn ${his} keep anyway. This means selling ${his} body, or in ${his} particular case, having ${his} unwilling body sold. ${He} knows the score and allows ${himself} to be stuffed into a special latex public whore suit. ${He}'s learned the hard way that resisting being suited up just means ${he}'ll be painfully punished before being suited up.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		r.push(`The suit is quite special. It is made of thick, durable latex with temperature regulation and anchor points for restraint. It is specially crafted to be able to accommodate its wearer's ${eventSlave.boobs > 250 ? "tits" : "breast"}, belly,`);
+		if (V.seeDicks !== 0) {
+			r.push(`dick, balls,`);
+		}
+		r.push(`and rear, however large. It has a hole at ${his} mouth that holds ${his} jaws well open, with a plug to fill it completely when not in use. ${He} breathes through a port at ${his} nose that muffles all noise, in and out.`);
+		if (eventSlave.dick > 0) {
+			r.push(`${His} cock is neglected inside the latex, with no means of access.`);
+		}
+		if (eventSlave.vagina !== -1) {
+			r.push(`There's a hole over ${his} pussy, of course.`);
+		}
+		r.push(`Finally, there's a hole over ${his} anus.`);
+		App.Events.addParagraph(node, r);
+		r = [];
+
+		r.push(`${He} will spend the day restrained in public, with your other slaves periodically stopping by to hydrate ${him} and wash out ${his} holes.`);
+
+		App.Events.addParagraph(node, r);
+		App.Events.addResponses(node, [
+			new App.Events.Result(`Increase ${his} assignment to 24 hours a day`, H24, virginityWarning()),
+			new App.Events.Result(`Take the first and last every day`, firstLast, virginityWarning()),
+			(V.arcade > 0)
+				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
+				: new App.Events.Result(),
+		]);
+
+		function virginityWarning() {
+			if ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) {
+				return `This option will take ${his} virginity`;
+			}
+			return null;
+		}
+
+		function popCherry() {
+			if (eventSlave.vagina === 0 && canDoVaginal(eventSlave) && eventSlave.anus === 0 && canDoAnal(eventSlave)) {
+				eventSlave.anus++;
+				eventSlave.vagina++;
+				VCheck.Both(eventSlave, 1);
+				return `You made sure to claim <span class="virginity loss">both ${his} virginity and anal cherry</span> before anyone else could.`;
+			} else if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
+				eventSlave.vagina++;
+				VCheck.Vaginal(eventSlave, 1);
+				return `You made sure to claim <span class="virginity loss">${his} virginity</span> before anyone else could.`;
+			} else if (eventSlave.anus === 0 && canDoAnal(eventSlave)) {
+				eventSlave.anus++;
+				VCheck.Anal(eventSlave, 1);
+				return `You made sure to claim <span class="virginity loss">${his} anal cherry</span> before anyone else could.`;
+			}
+		}
+
+		function H24() {
+			r = [];
+			r.push(`You give ${contextualIntro(V.PC, eventSlave)} no indication that ${his} public use assignment is about to change. Late in the day, when ${his} shift would normally end, another of your slaves simply maintains ${him} as usual and then leaves ${him} be. ${eventSlave.slaveName} is so deprived of any way to tell time that ${he} doesn't realize ${he}'s been left for some time. The first indication ${he} gets that something's different is when liquid food is squirted down ${his} throat the next morning. When ${he}'s finally stripped out of the suit at the end of the week, ${he}'s pale and wan and ${his} holes are puffy and red. <span class="health dec">${His} health was damaged.</span> However, ${his} permanent presence became quite noted. <span class="reputation inc">Your reputation has increased.</span> And when ${he}'s out of the suit, ${he} instantly begs you to allow ${him} to do anything to save ${himself} from more of that. <span class="trust dec">${His} fear of you has increased.</span>`);
+			r.push(popCherry());
+			repX(500, "event", eventSlave);
+			healthDamage(eventSlave, 10);
+			eventSlave.trust -= 10;
+			if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative", 10);
+				if (!canDoAnal(eventSlave)) {
+					seX(eventSlave, "vaginal", "public", "penetrative", 10);
+				}
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 2, -2));
+				}
+			}
+			if (canDoAnal(eventSlave)) {
+				seX(eventSlave, "anal", "public", "penetrative", 10);
+				if (!canDoVaginal(eventSlave)) {
+					seX(eventSlave, "anal", "public", "penetrative", 10);
+				}
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			}
+			seX(eventSlave, "oral", "public", "penetrative", 10);
+			return r;
+		}
+
+		function firstLast() {
+			r = [];
+			r.push(`When ${contextualIntro(V.PC, eventSlave)} feels a cock entering ${his} mouth right after ${he}'s suited up, ${he} knows it's you and wriggles as best ${he} can in the suit. It doesn't help much, and ${his} struggles don't prevent you from moving from ${his} mouth to ${his} ass, either. At the end of the day, on the other hand, the`);
+			// There is a function planned for this in the male slave overhaul. DO NOT FORGET IT!
+			if (girl === "girl") {
+				r.push(`female-shaped`);
+			} else {
+				r.push(`male-shaped`);
+			}
+			r.push(`latex form is completely still and quiescent as you`);
+			if (V.PC.dick === 0) {
+				r.push(`use a couple of fingers to brutally molest`);
+			} else {
+				r.push(`molest`);
+			}
+			r.push(`each of its holes. It takes`);
+			if (canDoVaginal(eventSlave)) {
+				r.push(`a serious vaginal reaming`);
+			} else {
+				r.push(`viciously hard anal penetration`);
+			}
+			r.push(`to elicit any response at all, and even then, it's just the slightest hint of a moan. <span class="trust dec">${His} fear of you has increased.</span>`);
+			r.push(popCherry());
+			eventSlave.trust -= 5;
+			if (canDoVaginal(eventSlave)) {
+				seX(eventSlave, "vaginal", "public", "penetrative", 6);
+				if (!canDoAnal(eventSlave)) {
+					seX(eventSlave, "vaginal", "public", "penetrative", 3);
+				}
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 2, -2));
+				}
+			}
+			if (canDoAnal(eventSlave)) {
+				seX(eventSlave, "anal", "public", "penetrative", 6);
+				if (!canDoVaginal(eventSlave)) {
+					seX(eventSlave, "anal", "public", "penetrative", 3);
+				}
+				if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
+					r.push(knockMeUp(eventSlave, 10, 1, -2));
+				}
+			}
+			seX(eventSlave, "oral", "public", "penetrative", 7);
+
+			return r;
+		}
+
+		function arcade() {
+			r = [];
+			r.push(`When ${he} realizes what ${his} punishment is, ${contextualIntro(V.PC, eventSlave)} ${canTalk(eventSlave) ? "screams and " : ""}begs, but you are obdurate.`);
+			if (eventSlave.muscles > 30) {
+				r.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
+			} else if ((eventSlave.weight >= 190)) {
+				r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
+			} else if (eventSlave.belly >= 120000) {
+				r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${bellyAdjective(eventSlave)} middle limits ${his} ability to struggle.`);
+			} else if ((eventSlave.weight >= -10)) {
+				r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
+			} else if (eventSlave.belly >= 1500) {
+				r.push(`${His}`);
+				if (eventSlave.bellyPreg >= 3000) {
+					r.push(`pregnant`);
+				} else {
+					r.push(bellyAdjective(eventSlave));
+				}
+				r.push(`body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`);
+			} else if (eventSlave.muscles < -15) {
+				r.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`);
+			} else {
+				r.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`);
+			}
+			r.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} butt as ${he} wriggles desperately against ${his} restraints.`);
+			r.push(assignJob(eventSlave, Job.ARCADE));
+			eventSlave.sentence = 4;
+			return r;
+		}
+	}
+};
diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js
index 4841494db14a3bddc92cbc3eb37678d63ff37afc..d1b201b38fa65a75671c694152c8ce1d447ad94e 100644
--- a/src/events/intro/introSummary.js
+++ b/src/events/intro/introSummary.js
@@ -3,7 +3,7 @@ App.Intro.summary = function() {
 
 	V.neighboringArcologies = variableAsNumber(V.neighboringArcologies, 0, 8, 3);
 	V.FSCreditCount = variableAsNumber(V.FSCreditCount, 4, 7, 5);
-	V.PC.actualAge = variableAsNumber(V.PC.actualAge, 14, 80, 35);
+	V.PC.actualAge = variableAsNumber(V.PC.actualAge, 10, 80, 35);
 	V.PC.birthWeek = variableAsNumber(V.PC.birthWeek, 0, 51, 0);
 
 	el.append(introContent());
@@ -372,28 +372,30 @@ App.Intro.summary = function() {
 						} else if (V.PC.rumor === "force") {
 							V.PC.muscles += 20;
 						}
-					}
+						// I hope this works
+						PCDatatypeCleanup(V.PC);
 
-					if (V.PC.dick !== 0) {
-						V.PC.geneticQuirks.wellHung = 2;
-					} else {
-						V.PC.balls = 0;
-						V.PC.scrotum = 0;
-						V.PC.prostate = 0;
-					}
-					if (V.PC.title === 0) {
-						V.PC.hLength = 15;
-						V.PC.waist = -20;
-						V.PC.voice = 2;
-						V.PC.shoulders = -1;
-						V.PC.hips = 1;
-					}
-					if (V.PC.vagina === -1) {
-						V.PC.ovaries = 0;
-					} else if (V.PC.vagina > 0) {
-						V.PC.vaginaLube = 1;
+						if (V.PC.dick >= 3) {
+							V.PC.geneticQuirks.wellHung = 2;
+						}
+						if (V.PC.title === 0) {
+							V.PC.hLength = 15;
+							V.PC.waist = -20;
+							V.PC.voice = 2;
+						}
+						if (V.PC.eye.right.vision === 1 || V.PC.eye.left.vision === 1) {
+							V.PC.eyewear = "corrective glasses";
+						}
+						if (V.PC.pubertyXX === 0 && V.PC.pubertyXY === 0) {
+							if (V.PC.age < 11) {
+								V.PC.energy = 20;
+							} else if (V.PC.age < 12) {
+								V.PC.energy = 30;
+							} else if (V.PC.age < 13) {
+								V.PC.energy = 40;
+							}
+						}
 					}
-					V.PC.ovaryAge = V.PC.physicalAge;
 
 					V.PC.birthName = V.PC.slaveName;
 					V.PC.birthSurname = V.PC.slaveSurname;
diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js
index 47f9ba6e9f959aa667032a0587569ec817ce169d..188d9d15eaee76c9fb3cc0a1f9d6d1027df84b4e 100644
--- a/src/events/intro/pcAppearance.js
+++ b/src/events/intro/pcAppearance.js
@@ -1,6 +1,8 @@
 App.UI.Player = {};
 
-App.UI.Player.appearance = function(options) {
+App.UI.Player.appearance = function(options, summary = false) {
+	let option;
+
 	options.addOption("Your nationality is", "nationality", V.PC).showTextBox()
 		.addValueList(App.Data.misc.baseNationalities)
 		.addComment("For best result capitalize it.").pulldown();
@@ -13,6 +15,23 @@ App.UI.Player.appearance = function(options) {
 			.addValueList(Array.from(App.Data.misc.filterRaces, (k => [k[1], k[0]])));
 	}
 
+	options.addOption("You are genetically", "genes", V.PC)
+		.addValue("XY").addValue("XX");
+
+	options.addOption(`You are`, "height", V.PC).showTextBox({unit: "cm"})
+		.addRange(145, 150, "<", "Petite")
+		.addRange(155, 160, "<", "Short")
+		.addRange(165, 170, "<", "Average")
+		.addRange(180, 185, "<", "Tall")
+		.addRange(190, 185, ">=", "Very tall")
+		.addComment(`Average height for a ${V.PC.actualAge} year old is ${heightToEitherUnit(Math.round(Height.mean(V.PC)))}`);
+	option = options.addCustomOption()
+		.addButton(
+			"Make average",
+			() => resyncSlaveHight(V.PC),
+			""
+		);
+
 	options.addOption("Your skin tone is", "skin", V.PC).showTextBox()
 		.addValueList(makeAList(App.Medicine.Modification.naturalSkins));
 
@@ -21,12 +40,6 @@ App.UI.Player.appearance = function(options) {
 			.addValueList(makeAList(App.Medicine.Modification.naturalSkins));
 	}
 
-	options.addOption("Your body", "markings", V.PC)
-		.addValueList([["Is clear of blemishes", "none"], ["Has light freckling", "freckles"], ["Has heavy freckling", "heavily freckled"]]);
-
-	options.addOption("Your genetic eye color is", "origColor", V.PC.eye).showTextBox()
-		.addValueList(makeAList(App.Medicine.Modification.eyeColor.map(color => color.value)));
-
 	if (V.cheatMode) {
 		options.addOption("Your original hair is", "origHColor", V.PC).showTextBox()
 			.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value)));
@@ -35,11 +48,440 @@ App.UI.Player.appearance = function(options) {
 			.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value)));
 	}
 
+	options.addOption("Your genetic eye color is", "origColor", V.PC.eye).showTextBox()
+		.addValueList(makeAList(App.Medicine.Modification.eyeColor.map(color => color.value)));
+
+	options.addOption("You", "vision", V.PC.eye.right)
+		.addValueList([
+			["Need glasses to see properly", 1, () => { V.PC.eye.right.vision = 1; V.PC.eye.left.vision = 1; }],
+			["have normal vision", 2, () => { V.PC.eye.right.vision = 2; V.PC.eye.left.vision = 2; }]
+		]);
+
+	options.addOption("Your face is", "faceShape", V.PC)
+		.addValueList([
+			["Normal", "normal"],
+			["Androgynous", "androgynous"],
+			["Masculine", "masculine"],
+			["Cute", "cute"],
+			["Sensual", "sensual"],
+			["Exotic", "exotic"]
+		]);
+
+	options.addOption("Your body", "markings", V.PC)
+		.addValueList([["Is clear of blemishes", "none"], ["Has light freckling", "freckles"], ["Has heavy freckling", "heavily freckled"]]);
+
+	options.addOption("You have", "lips", V.PC).addValue("Thin lips", 5)
+		.addValueList([
+			["Normal lips", 15],
+			["Kissable lips", 25],
+			["Plush lips", 45],
+		]);
+
+	/* Handled by career currently
+	options.addOption("You are", "weight", V.PC).addValue("Very thin", -50);
+	options.addValueList([
+		["Thin", -20],
+		["Healthy", 0],
+		["Curvy", 20],
+		["Chubby", 60],
+		["Fat", 100],
+	])
+	.showTextBox();
+	*/
+
+	option = options.addOption("Your shoulders are", "shoulders", V.PC).addValue("Very narrow", -2);
+	option.addValueList([
+		["Narrow", -1],
+		["Average", 0],
+	]);
+	if (V.PC.physicalAge > 13) {
+		option.addValue("Broad", 1);
+	}
+	if (V.PC.physicalAge > 18) {
+		option.addValue("Very broad", 2);
+	}
+
+	if (V.PC.boobs >= 200 || summary) {
+		if (V.PC.title === 1 && V.PC.boobs <= 200) {
+			option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 200, () => { V.PC.boobsImplant = 0; V.PC.boobsImplantType = "none"; });
+		} else {
+			option = options.addOption("Your breasts are", "boobs", V.PC).addValue("Non-existent", 200, () => { V.PC.boobsImplant = 0; V.PC.boobsImplantType = "none"; });
+		}
+		option.addValueList([
+			["A-cups", 300],
+			["B-cups", 400],
+			["C-cups", 500],
+		]);
+		if (V.PC.physicalAge <= 13) {
+			option.addValueList([
+				["hefty D-cups", 650],
+				["heavy DD-cups", 900],
+			]);
+		} else {
+			option.addValueList([
+				["D-cups", 650],
+				["DD-cups", 900],
+				["F-cups", 1100],
+				["G-cups", 1300]
+			]);
+		}
+		option.showTextBox({unit: "CCs"});
+		if (V.PC.boobs >= 500) {
+			options.addOption("Your breasts are", "boobsImplant", V.PC)
+				.addValueList([
+					["All natural", 0, () => { V.PC.boobsImplant = 0; V.PC.boobsImplantType = "none"; }],
+					["Fake", V.PC.boobs / 2, () => V.PC.boobsImplantType = "normal"]
+				]);
+		}
+		if (V.PC.boobsImplant > 0) {
+			option = options.addOption("You have", "boobsImplantType", V.PC).addValue("Regular implants", "normal");
+			if (V.PC.boobsImplant > 400) {
+				option.addValue("string implants", "string");
+			}
+			if (V.PC.boobsImplant > 600) {
+				option.addValue("Fillable implants", "fillable");
+			}
+		}
+		if (V.PC.boobs >= 300) {
+			option = options.addOption("Your nipples are", "nipples", V.PC).addValue("Tiny", "tiny");
+			option.addValue("Cute", "cute");
+			if (V.PC.boobs >= 500) {
+				option.addValue("Puffy", "puffy");
+				option.addValue("Partially inverted", "partially inverted");
+			}
+			if (V.PC.boobs >= 1000) {
+				option.addValue("Inverted", "inverted");
+				option.addValue("Huge", "huge");
+			}
+		}
+	}
+
+	option = options.addOption("Your hips are", "hips", V.PC).addValue("Very narrow", -2);
+	option.addValueList([
+		["Narrow", -1],
+		["Average", 0],
+	]);
+	if (V.PC.physicalAge > 13) {
+		option.addValue("Wide", 1);
+	}
+	if (V.PC.physicalAge > 18) {
+		option.addValue("Very Wide", 2);
+	}
+
+
+	option = options.addOption("Your butt is", "butt", V.PC).addValue("Flat", 0, () => { V.PC.buttImplant = 0; V.PC.buttImplantType = "none"; });
+	option.addValueList([
+		["Small", 1],
+		["Plump", 2],
+		["Big", 3],
+	]);
+	if (V.PC.physicalAge > 13) {
+		option.addValue("Huge", 4);
+	}
+	if (V.PC.physicalAge > 18) {
+		option.addValueList([
+			["Enormous", 5],
+			["Gigantic", 6],
+		]);
+	}
+	if (V.PC.butt >= 3) {
+		options.addOption("Your ass is", "buttImplant", V.PC)
+			.addValueList([
+				["All natural", 0, () => V.PC.buttImplantType = "none"],
+				["Fake", Math.round(V.PC.butt / 2), () => V.PC.buttImplantType = "normal"]
+			]);
+	}
+	if (V.PC.buttImplant > 0) {
+		option = options.addOption("You have", "buttImplantType", V.PC).addValue("Regular implants", "normal");
+		if (V.PC.buttImplant > 1) {
+			option.addValue("string implants", "string");
+			option.addValue("Fillable implants", "fillable");
+		}
+	}
+
+	if (V.PC.dick !== 0) {
+		option = options.addOption("Your dick is", "dick", V.PC).addValue("Tiny", 1, () => V.PC.foreskin = 2);
+		option.addValueList([
+			["Small", 2, () => V.PC.foreskin = 3],
+			["Average", 3, () => V.PC.foreskin = 3],
+			["Big", 4, () => V.PC.foreskin = 4],
+		]);
+		if (V.PC.physicalAge > 13) {
+			option.addValue("Huge", 5, () => V.PC.foreskin = 5);
+		}
+		if (V.PC.physicalAge > 18) {
+			option.addValue("Gigantic", 6, () => V.PC.foreskin = 5);
+		}
+		options.addOption("You are", "foreskin", V.PC)
+			.addValueList([
+				["Cut", 0],
+				["Uncut", V.PC.dick]
+			])
+			.showTextBox()
+			.addComment("Any value above 0 is uncircumcised. For comfort, keep equal or one greater than dick size.");
+	}
+
+	if (V.PC.balls !== 0) {
+		option = options.addOption("Your balls are", "balls", V.PC).addValue("Small", 2, () => V.PC.scrotum = 2);
+		option.addValueList([
+			["Average", 3, () => V.PC.scrotum = 4],
+			["Large", 4, () => V.PC.scrotum = 5],
+		]);
+		if (V.PC.physicalAge > 13) {
+			option.addValue("Massive", 5, () => V.PC.scrotum = 5);
+		}
+		if (V.PC.physicalAge > 18) {
+			option.addValue("Huge", 6, () => V.PC.scrotum = 6);
+		}
+		option.addComment("Small balls may be located internally.");
+		if (V.PC.balls <= 2) {
+			options.addOption("Your balls are", "scrotum", V.PC)
+				.addValueList([
+					["Internal", 0],
+					["External", V.PC.balls]
+				])
+				.showTextBox()
+				.addComment("Any value above 0 is external. For comfort, keep equal or one greater than ball size.");
+		}
+		if (V.PC.physicalAge < 14) {
+			options.addOption("You are", "pubertyXY", V.PC)
+				.addValueList([["Not producing potent sperm yet", 0], ["Producing potent sperm", 1]]);
+		}
+	}
+
+	if (V.PC.vagina !== -1) {
+		if (V.PC.dick === 0 && V.PC.physicalAge > 13) {
+			options.addOption("Your clit is", "clit", V.PC)
+				.addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]]);
+		}
+		if (V.PC.physicalAge <= 18) {
+			options.addOption("You are", "vagina", V.PC)
+				.addValueList([["A virgin", 0], ["Not a virgin", 1]]);
+			if (V.PC.physicalAge < 14 && V.PC.preg <= 0) {
+				options.addOption("You have", "pubertyXX", V.PC)
+					.addValueList([["Not had your first period", 0], ["Had your first period", 1]]);
+			}
+		}
+	}
+
+	options.addOption("You are", "anus", V.PC)
+		.addValueList([["An anal virgin", 0], ["Not an anal virgin", 1]]);
+
 	function makeAList(iterable) {
 		return Array.from(iterable, (k => [capFirstChar(k), k]));
 	}
 };
 
+App.UI.Player.syncAgeBasedParameters = function() {
+	V.PC.actualAge = Math.clamp(V.PC.actualAge, 10, 80);
+	V.PC.physicalAge = V.PC.actualAge;
+	V.PC.visualAge = V.PC.actualAge;
+	V.PC.ovaryAge = V.PC.actualAge;
+	V.PC.height = Math.round(Height.random(V.PC, {limitMult: [2, 4]}));
+	if (V.PC.genes === "XY") {
+		if (V.PC.physicalAge <= 13) {
+			V.PC.hips = -2;
+			V.PC.shoulders = -1;
+			V.PC.butt = 0;
+			V.PC.boobs = 100;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 0;
+				V.PC.vaginaLube = 0;
+				if (V.PC.preg <= 0) {
+					V.PC.pubertyXX = 0;
+				}
+			}
+			V.PC.pregAdaptation = 10;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 2;
+				V.PC.balls = 2;
+				V.PC.scrotum = V.PC.balls + 1;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 0;
+			}
+		} else if (V.PC.physicalAge <= 18) {
+			V.PC.hips = -2;
+			V.PC.shoulders = 0;
+			V.PC.butt = 1;
+			V.PC.boobs = 200;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 1;
+				V.PC.vaginaLube = 0;
+				V.PC.pubertyXX = 1;
+			}
+			V.PC.pregAdaptation = 15;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 3;
+				V.PC.balls = 3;
+				V.PC.scrotum = V.PC.balls;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 1;
+			}
+		} else {
+			V.PC.hips = -1;
+			V.PC.shoulders = 1;
+			V.PC.butt = 2;
+			V.PC.boobs = 200;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 1;
+				V.PC.vaginaLube = 1;
+				V.PC.pubertyXX = 1;
+			}
+			V.PC.pregAdaptation = 20;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = V.PC.balls + 1;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 1;
+			}
+		}
+	} else {
+		if (V.PC.physicalAge <= 13) {
+			V.PC.hips = -2;
+			V.PC.shoulders = -2;
+			V.PC.butt = 0;
+			V.PC.boobs = 350;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 0;
+				V.PC.vaginaLube = 0;
+				if (V.PC.preg <= 0) {
+					V.PC.pubertyXX = 0;
+				}
+			}
+			V.PC.pregAdaptation = 30;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 2;
+				V.PC.balls = 2;
+				V.PC.scrotum = V.PC.balls + 1;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 0;
+			}
+		} else if (V.PC.physicalAge <= 18) {
+			V.PC.hips = 0;
+			V.PC.shoulders = -1;
+			V.PC.butt = 1;
+			V.PC.boobs = 600;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 1;
+				V.PC.vaginaLube = 1;
+				V.PC.pubertyXX = 1;
+			}
+			V.PC.pregAdaptation = 50;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 3;
+				V.PC.balls = 3;
+				V.PC.scrotum = V.PC.balls;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 1;
+			}
+		} else {
+			V.PC.hips = 1;
+			V.PC.shoulders = 0;
+			V.PC.butt = 2;
+			V.PC.boobs = 900;
+			if (V.PC.vagina !== -1) {
+				V.PC.vagina = 1;
+				V.PC.vaginaLube = 1;
+				V.PC.pubertyXX = 1;
+			}
+			V.PC.pregAdaptation = 50;
+			if (V.PC.dick !== 0) {
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = V.PC.balls + 1;
+				V.PC.foreskin = V.PC.dick;
+				V.PC.pubertyXY = 1;
+			}
+		}
+		if (V.PC.boobs < 250) {
+			V.PC.nipples = "tiny";
+		} else if (V.PC.boobs < 1000) {
+			V.PC.nipples = "cute";
+		} else {
+			V.PC.nipples = "puffy";
+		}
+	}
+};
+
+App.UI.Player.assignCareerByAge = function(selection) {
+	let career;
+
+	if (V.disableForcedCareers || V.PC.actualAge >= 22) {
+		career = selection;
+	} else if (selection === "wealth") {
+		if (V.PC.actualAge < 14) {
+			career = "rich kid";
+		} else {
+			career = "trust fund";
+		}
+	} else if (selection === "capitalist") {
+		if (V.PC.actualAge < 14) {
+			career = "business kid";
+		} else {
+			career = "entrepreneur";
+		}
+	} else if (selection === "mercenary") {
+		if (V.PC.actualAge < 14) {
+			career = "child soldier";
+		} else {
+			career = "recruit";
+		}
+	} else if (selection === "slaver") {
+		if (V.PC.actualAge < 14) {
+			career = "slave tender";
+		} else {
+			career = "slave overseer";
+		}
+	} else if (selection === "engineer") {
+		if (V.PC.actualAge < 14) {
+			career = "worksite helper";
+		} else {
+			career = "construction";
+		}
+	} else if (selection === "medicine") {
+		if (V.PC.actualAge < 14) {
+			career = "nurse";
+		} else {
+			career = "medical assistant";
+		}
+	} else if (selection === "celebrity") {
+		if (V.PC.actualAge < 14) {
+			career = "child star";
+		} else {
+			career = "rising star";
+		}
+	} else if (selection === "BlackHat") {
+		if (V.PC.actualAge < 14) {
+			career = "script kiddy";
+		} else {
+			career = "hacker";
+		}
+	} else if (selection === "escort") {
+		if (V.PC.actualAge < 14) {
+			career = "child prostitute";
+		} else {
+			career = "prostitute";
+		}
+	} else if (selection === "servant") {
+		if (V.PC.actualAge < 14) {
+			career = "child servant";
+		} else {
+			career = "handmaiden";
+		}
+	} else if (selection === "gang") {
+		if (V.PC.actualAge < 14) {
+			career = "street urchin";
+		} else {
+			career = "hoodlum";
+		}
+	}
+
+	V.disableForcedCareers = null;
+
+	return career;
+};
+
 App.UI.Player.refreshmentChoice = function(options) {
 	let option = options.addOption("Your preferred refreshment is", "refreshmentType", V.PC);
 	for (const [key, value] of App.Data.player.refreshmentType) {
@@ -112,6 +554,12 @@ App.UI.Player.design = function() {
 				.addRange(55, 65, "<", "Well into middle age").addRange(70, 65, ">=", "Old");
 
 			options.addOption(`Your birthday was <strong>${V.PC.birthWeek}</strong> weeks ago.`, "birthWeek", V.PC).showTextBox();
+			option = options.addCustomOption()
+				.addButton(
+					"Adjust body to match age",
+					() => App.UI.Player.syncAgeBasedParameters(),
+					""
+				);
 		}
 	} else {
 		r = [];
@@ -123,15 +571,19 @@ App.UI.Player.design = function() {
 		}
 		r.push(`and everyone that matters calls you	${PlayerName()}.`);
 
-		r.push(`You are ${V.PC.actualAge} years old which is`);
+		r.push(`You are ${V.PC.actualAge} years old, which is`);
 		if (V.PC.actualAge >= 65) {
 			r.push(`<strong>old</strong>.`);
 		} else if (V.PC.actualAge >= 50) {
 			r.push(`<strong>well into middle age</strong>.`);
 		} else if (V.PC.actualAge >= 35) {
 			r.push(`<strong>entering middle age</strong>.`);
-		} else {
+		} else if (V.PC.actualAge >= 22) {
 			r.push(`<strong>surprisingly young</strong>.`);
+		} else if (V.PC.actualAge >= 14) {
+			r.push(`<strong>exceedingly young</strong>.`);
+		} else {
+			r.push(`<strong>merely a child</strong>.`);
 		}
 		App.Events.addNode(el, r, "p");
 	}
@@ -161,21 +613,51 @@ App.UI.Player.design = function() {
 
 	// Appearance
 	if (allowEdits) {
-		App.UI.Player.appearance(options);
+		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+			State.temporary.vaginaPenis = 2;
+		} else if (V.PC.vagina !== -1) {
+			State.temporary.vaginaPenis = 1;
+		} else {
+			State.temporary.vaginaPenis = 0;
+		}
 
-		options.addOption("Your face is", "faceShape", V.PC)
-			.addValueList([
-				["Normal", "normal"],
-				["Androgynous", "androgynous"],
-				["Masculine", "masculine"],
-				["Cute", "cute"],
-				["Sensual", "sensual"],
-				["Exotic", "exotic"]
-			]);
+		option = options.addOption("You have a", "vaginaPenis", State.temporary)
+			.addValue("Penis", 0, () => {
+				V.PC.preg = 0;
+				V.PC.pregType = 0;
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = -1;
+				V.PC.ovaries = 0;
+			}).addValue("Vagina", 1, () => {
+				V.PC.dick = 0;
+				V.PC.balls = 0;
+				V.PC.scrotum = 0;
+				V.PC.prostate = 0;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			}).addValue("Penis and Vagina", 2, () => {
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			});
+		if (State.temporary.vaginaPenis === 0) {
+			option.addComment("Standard sex scenes; easiest reputation maintenance.");
+		} else if (State.temporary.vaginaPenis === 1) {
+			option.addComment("Sex scene variations; most difficult reputation maintenance.");
+		} else {
+			option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
+		}
+		App.UI.Player.appearance(options, true);
 	} else {
 		r = [];
 
-		r.push(`You are a ${V.PC.nationality} ${V.PC.race} with`);
+		r.push(`You are a ${heightToEitherUnit(V.PC.height)} tall ${V.PC.nationality} ${V.PC.race} with`);
 		if (V.PC.markings === "heavily freckled") {
 			r.push(`heavily freckled`);
 		} else if (V.PC.markings === "freckles") {
@@ -183,7 +665,18 @@ App.UI.Player.design = function() {
 		} else {
 			r.push(`clear`);
 		}
-		r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape} face.`);
+		r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape}`);
+		if (V.PC.lips > 95) {
+			r.push(`face with way too much lip; you can't shut your mouth properly anymore.`);
+		} else if (V.PC.lips > 70) {
+			r.push(`face with truly massive lips.`);
+		} else if (V.PC.lips > 40) {
+			r.push(`face with plump lips.`);
+		} else if (V.PC.lips > 20) {
+			r.push(`face with full lips.`);
+		} else {
+			r.push(`face.`);
+		}
 		App.Events.addNode(el, r, "p");
 	}
 
@@ -209,40 +702,35 @@ App.UI.Player.design = function() {
 				["Servant", "servant"],
 				["Gang leader", "gang"]]
 			);
+			option = options.addCustomOption()
+				.addButton(
+					"Adjust career for age",
+					() => V.PC.career = App.UI.Player.assignCareerByAge(V.PC.career),
+					""
+				);
 			if (V.secExpEnabled > 0) {
-				switch (V.PC.career) {
-					case "capitalist":
-						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-						break;
-					case "mercenary":
-						option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "slaver":
-						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "engineer":
-						option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
-						break;
-					case "medicine":
-						option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
-						break;
-					case "celebrity":
-						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-						break;
-					case "escort":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					case "servant":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					case "gang":
-						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "BlackHat":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					default:
-						option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
+				if (isPCCareerInCategory("capitalist")) {
+					option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("mercenary")) {
+					option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("slaver")) {
+					option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("engineer")) {
+					option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("medicine")) {
+					option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("celebrity")) {
+					option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("escort")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else if (isPCCareerInCategory("servant")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else if (isPCCareerInCategory("gang")) {
+					option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("BlackHat")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else {
+					option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
 				}
 			}
 		}
@@ -261,39 +749,81 @@ App.UI.Player.design = function() {
 		r = [];
 		switch (V.PC.career) {
 			case "wealth":
+			case "trust fund":
+			case "rich kid":
 				r.push(`Prior to being an arcology owner, you were a member of the idle wealthy.`);
 				break;
 			case "capitalist":
 				r.push(`Prior to being an arcology owner, you were a business leader.`);
 				break;
+			case "entrepreneur":
+			case "business kid":
+				r.push(`Prior to being an arcology owner, you were a cunning entrepreneur.`);
+				break;
 			case "mercenary":
+			case "recruit":
 				r.push(`Prior to being an arcology owner, you were a mercenary.`);
 				break;
+			case "child soldier":
+				r.push(`Prior to being an arcology owner, you were a disposable conscript.`);
+				break;
 			case "slaver":
+			case "slave overseer":
 				r.push(`Prior to being an arcology owner, you were a slaver.`);
 				break;
+			case "slave tender":
+				r.push(`Prior to being an arcology owner, you were a slaver tasked with looking after fresh captures.`);
+				break;
 			case "engineer":
 				r.push(`Prior to being an arcology owner, you were an engineer.`);
 				break;
+			case "construction":
+			case "worksite helper":
+				r.push(`Prior to being an arcology owner, you built buildings.`);
+				break;
 			case "medicine":
 				r.push(`Prior to being an arcology owner, you were a surgeon.`);
 				break;
+			case "medical assistant":
+				r.push(`Prior to being an arcology owner, you assisted with surgeries.`);
+				break;
+			case "nurse":
+				r.push(`Prior to being an arcology owner, you were a nurse.`);
+				break;
 			case "celebrity":
 				r.push(`Prior to being an arcology owner, you were a minor celebrity.`);
 				break;
+			case "rising star":
+				r.push(`Prior to being an arcology owner, you were an up-and-coming star.`);
+				break;
+			case "child star":
+				r.push(`Prior to being an arcology owner, you were a child actor.`);
+				break;
 			case "BlackHat":
+			case "hacker":
+			case "script kiddy":
 				r.push(`Prior to being an arcology owner, you specialized in cracking databases and making mockeries of cyber security.`);
 				break;
 			case "arcology owner":
 				r.push(`Being an arcology owner defines your life now.`);
 				break;
 			case "escort":
+			case "prostitute":
 				r.push(`Prior to being an arcology owner, you knew how to survive off your looks and body.`);
 				break;
+			case "child prostitute":
+				r.push(`Prior to being an arcology owner, you had no choice but to sell your body to survive.`);
+				break;
 			case "servant":
+			case "handmaiden":
+			case "child servant":
 				r.push(`Prior to being an arcology owner, you served a well-off`);
-				if (V.PC.counter.birthMaster >= 2) {
+				if (V.PC.counter.birthMaster >= 8) {
+					r.push(`master as his breeder.`);
+				} else if (V.PC.counter.birthMaster >= 2) {
 					r.push(`master and bore him several children.`);
+				} else if (V.PC.counter.birthMaster >= 1) {
+					r.push(`master and bore him a child.`);
 				} else {
 					r.push(`master.`);
 				}
@@ -301,6 +831,12 @@ App.UI.Player.design = function() {
 			case "gang":
 				r.push(`Prior to being an arcology owner, you were the leader of a ruthless gang.`);
 				break;
+			case "hoodlum":
+				r.push(`Prior to being an arcology owner, you were a troublemaker in a gang.`);
+				break;
+			case "street urchin":
+				r.push(`Prior to being an arcology owner, you lived a hard life on the streets.`);
+				break;
 		}
 
 		r.push(`Word in the arcology is you acquired it through`);
@@ -330,47 +866,7 @@ App.UI.Player.design = function() {
 	if (allowEdits) {
 		options = new App.UI.OptionsGroup();
 
-		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-			State.temporary.vaginaPenis = 2;
-		} else if (V.PC.vagina !== -1) {
-			State.temporary.vaginaPenis = 1;
-		} else {
-			State.temporary.vaginaPenis = 0;
-		}
-
-		option = options.addOption("You have a", "vaginaPenis", State.temporary)
-			.addValue("Penis", 0, () => {
-				V.PC.preg = 0;
-				V.PC.pregType = 0;
-				V.PC.dick = 4;
-				V.PC.balls = 3;
-				V.PC.scrotum = 3;
-				V.PC.prostate = 1;
-				V.PC.vagina = -1;
-				V.PC.ovaries = 0;
-			}).addValue("Vagina", 1, () => {
-				V.PC.dick = 0;
-				V.PC.balls = 0;
-				V.PC.scrotum = 0;
-				V.PC.prostate = 0;
-				V.PC.vagina = 1;
-				V.PC.ovaries = 1;
-			}).addValue("Penis and Vagina", 2, () => {
-				V.PC.dick = 4;
-				V.PC.balls = 3;
-				V.PC.scrotum = 3;
-				V.PC.prostate = 1;
-				V.PC.vagina = 1;
-				V.PC.ovaries = 1;
-			});
-		if (State.temporary.vaginaPenis === 0) {
-			option.addComment("Standard sex scenes; easiest reputation maintenance.");
-		} else if (State.temporary.vaginaPenis === 1) {
-			option.addComment("Sex scene variations; most difficult reputation maintenance.");
-		} else {
-			option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
-		}
-
+		// obsolete?
 		if (V.cheatMode) {
 			options.addOption("Vagina", "vagina", V.PC).showTextBox();
 			options.addOption("New vagina", "newVag", V.PC).showTextBox();
@@ -385,7 +881,7 @@ App.UI.Player.design = function() {
 			options.addOption("Balls implant", "ballsImplant", V.PC).showTextBox();
 		}
 
-		if (V.PC.vagina !== -1) {
+		if (V.PC.vagina !== -1 && V.PC.pubertyXX === 1) {
 			option = options.addOption("You are", "preg", V.PC)
 				.addValue("Taking contraceptives", -1, () => { V.PC.pregType = 0; V.PC.labor = 0; })
 				.addValue("Not taking contraceptives", 0, () => { V.PC.pregType = 0; V.PC.labor = 0; })
@@ -438,83 +934,201 @@ App.UI.Player.design = function() {
 			}
 		}
 
-		if (V.PC.title === 1 && V.PC.boobs <= 100) {
-			option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 100, () => V.PC.boobsImplant = 0);
+		el.append(options.render());
+	} else {
+		r = [];
+
+		if (V.PC.boobs >= 300) {
+			r.push(`You have a`);
+			if (V.PC.title > 0) {
+				r.push(`masculine`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`body with`);
+			if (V.PC.shoulders > 1) {
+				r.push(`very broad shoulders`);
+			} else if (V.PC.shoulders > 0) {
+				r.push(`broad shoulders`);
+			} else if (V.PC.shoulders < -1) {
+				r.push(`very narrow shoulders`);
+			} else if (V.PC.shoulders < 0) {
+				r.push(`narrow shoulders`);
+			}
+			if (V.PC.shoulders !== 0) {
+				r.push(`and`);
+			}
+			let breastShapeDesc;
+			if (V.PC.boobShape === "saggy") {
+				breastShapeDesc = ` that sag a bit`;
+			} else if (V.PC.boobShape === "spherical") {
+				breastShapeDesc = ` that might just be a little too much implant now.`;
+			}
+			if (V.PC.boobs >= 1400) {
+				r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 1200) {
+				r.push(`huge`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 1000) {
+				r.push(`big`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 800) {
+				r.push(`noticeable breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 650) {
+				r.push(`unremarkable breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 500) {
+				r.push(`average breasts${breastShapeDesc}.`);
+			} else {
+				r.push(`small breasts${breastShapeDesc}.`);
+			}
 		} else {
-			option = options.addOption("Your breasts are", "boobs", V.PC).addValue("Flat", 100, () => V.PC.boobsImplant = 0);
+			if (V.PC.title > 0) {
+				r.push(`You have a manly chest.`);
+			} else {
+				r.push(`You are flat as a board.`);
+			}
 		}
-		option.addValueList([
-			["C-cups", 500],
-			["DD-cups", 900],
-			["F-cups", 1100],
-			["G-cups", 1300]
-		]);
-		option.showTextBox("CCs");
-
-		if (V.PC.boobs >= 500) {
-			options.addOption("Your breasts are", "boobsImplant", V.PC)
-				.addValueList([
-					["All natural", 0],
-					["Fake", 400]
-				])
-				.showTextBox("CCs");
+		r.push(`Around back, you have`);
+		if (V.PC.butt > 10) {
+			r.push(`a disproportionate swelling of flesh`);
+		} else if (V.PC.butt > 7) {
+			r.push(`an absurdly large butt`);
+		} else if (V.PC.butt > 6) {
+			r.push(`a ridiculous ass`);
+		} else if (V.PC.butt > 5) {
+			r.push(`a gigantic ass`);
+		} else if (V.PC.butt > 4) {
+			r.push(`an enormous ass`);
+		} else if (V.PC.butt > 3) {
+			r.push(`a huge ass`);
+		} else if (V.PC.butt > 2) {
+			r.push(`a big butt`);
+		} else if (V.PC.butt > 1) {
+			r.push(`a shapely rear`);
+		} else if (V.PC.butt > 0) {
+			r.push(`a trim rear`);
+		} else {
+			r.push(`a flat ass`);
 		}
-
-		if (V.cheatMode) {
-			if (V.PC.boobs >= 500) {
-				options.addOption("Your breasts are", "lactation", V.PC)
-					.addValueList([
-						["Lactating", 1],
-						["Not Lactating", 0]
-					]);
-			}
+		r.push(`attached to a pair of`);
+		if (V.PC.hips > 2) {
+			r.push(`inhumanly wide hips.`);
+		} else if (V.PC.hips > 1) {
+			r.push(`very wide hips.`);
+		} else if (V.PC.hips > 0) {
+			r.push(`wide hips.`);
+		} else if (V.PC.hips > -1) {
+			r.push(`average hips.`);
+		} else if (V.PC.hips > -2) {
+			r.push(`narrow hips.`);
+		} else {
+			r.push(`very narrow hips.`);
 		}
 
-		options.addOption("Your butt size", "butt", V.PC)
-			.addValueList([
-				["Normal", 2],
-				["Big", 3],
-				["Huge", 4],
-				["Enormous", 5],
-			])
-			.showTextBox();
-
-		options.addOption("Your butt is", "buttImplant", V.PC)
-			.addValueList([
-				["All natural", 0],
-				["Fake", 1]
-			])
-			.showTextBox("CCs");
-
-
-		options.addOption("You are genetically", "genes", V.PC)
-			.addValue("XY").addValue("XX");
-
-		el.append(options.render());
-	} else {
-		r = [];
-		r.push(`You have a`);
-		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-			r.push(`penis and vagina`);
-		} else if (V.PC.dick !== 0) {
-			r.push(`penis.`);
-		} else if (V.PC.vagina !== -1) {
-			r.push(`vagina`);
+		r.push(`Between your legs, you have`);
+		if (V.PC.dick !== 0) {
+			if (V.PC.dick === 1) {
+				r.push(`a tiny, humiliating`);
+			} else if (V.PC.dick === 2) {
+				r.push(`a small`);
+			} else if (V.PC.dick === 3) {
+				r.push(`an average`);
+			} else if (V.PC.dick === 4) {
+				r.push(`a big`);
+			} else if (V.PC.dick === 5) {
+				r.push(`a huge`);
+			} else if (V.PC.dick === 6) {
+				r.push(`a pussy wrecking`);
+			} else if (V.PC.dick === 7) {
+				r.push(`a massive, unusable`);
+			} else if (V.PC.dick === 8) {
+				r.push(`an imposing, if unusable,`);
+			} else if (V.PC.dick === 9) {
+				r.push(`a monster of a`);
+			} else if (V.PC.dick === 10) {
+				r.push(`an inhuman`);
+			} else {
+				r.push(`an unusable slab of sensitive flesh you call a`);
+			}
+			r.push(`dick`);
+			if (V.PC.balls !== 0) {
+				r.push(r.pop() + ",");
+			}
+			if (V.PC.balls === 1) {
+				if (V.PC.scrotum === 0) {
+					r.push(`a tiny pair of internal balls`);
+				} else {
+					r.push(`vestigial testicles`);
+				}
+			} else if (V.PC.balls === 2) {
+				if (V.PC.scrotum === 0) {
+					r.push(`a pair of internal balls`);
+				} else {
+					r.push(`a pair of small testicles`);
+				}
+			} else if (V.PC.balls === 3) {
+				r.push(`a pair of average testicles`);
+			} else if (V.PC.balls === 4) {
+				r.push(`a dangling pair of large balls`);
+			} else if (V.PC.balls === 5) {
+				r.push(`a dangling pair of heavy testicles`);
+			} else if (V.PC.balls === 6) {
+				r.push(`a heavy pair of huge balls`);
+			} else if (V.PC.balls === 7) {
+				r.push(`a ponderous set of giant testicles`);
+			} else if (V.PC.balls === 8) {
+				r.push(`a ponderous set of enormous testicles`);
+			} else if (V.PC.balls === 9) {
+				r.push(`a monstrous pair of testicles`);
+			} else {
+				r.push(`an inhuman pair of testicles`);
+			}
+			if (V.PC.vagina !== -1) {
+				r.push(`and`);
+			} else {
+				r.push(r.pop() + ".");
+			}
 		}
 		if (V.PC.vagina !== -1) {
-			r.push(`and are`);
+			if (V.PC.vagina === 0) {
+				r.push(`an unsullied`);
+			} else if (V.PC.vagina === 1 || V.PC.newVag === 1) {
+				// nothing
+			} else if (V.PC.vagina === 2) {
+				r.push(`an experienced`);
+			} else if (V.PC.vagina === 3) {
+				r.push(`a loose`);
+			} else if (V.PC.vagina === 4) {
+				r.push(`a very well-traveled`);
+			} else {
+				r.push(`a ruined`);
+			}
+			r.push(`vagina.`);
+		}
+		if (V.PC.vagina !== -1 && V.PC.mpreg !== 0) {
+			r.push(`You are`);
 			if (V.PC.pregWeek < 0) {
-				r.push(`recovering from your last pregnancy.`);
+				r.push(`currently recovering from your last pregnancy.`);
 			} else if (V.PC.preg === -2) {
-				r.push(`infertile.`);
+				r.push(`infertile and can't get pregnant.`);
 			} else if (V.PC.preg === -1) {
-				r.push(`taking contraceptives.`);
+				r.push(`taking contraceptives to avoid potential pregnancy.`);
 			} else if (V.PC.preg === 0) {
-				r.push(`fertile.`);
+				if (V.PC.pubertyXX === 0) {
+					r.push(`not yet fertile.`);
+				} else {
+					r.push(`fertile and capable of becoming pregnant.`);
+				}
 			} else if (V.PC.preg > 37) {
-				r.push(`extremely pregnant.`);
+				r.push(`extremely pregnant and likely to give birth soon.`);
 			} else if (V.PC.preg > 0) {
-				r.push(`pregnant.`);
+				r.push(`currently pregnant.`);
 			}
 
 			linkArray = [];
@@ -548,44 +1162,6 @@ App.UI.Player.design = function() {
 			}
 		}
 
-		if (V.PC.boobs >= 300) {
-			r.push(`You have a`);
-			if (V.PC.title > 0) {
-				r.push(`masculine`);
-			} else {
-				r.push(`feminine`);
-			}
-			r.push(`body with`);
-			if (V.PC.boobs >= 1400) {
-				r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits.`);
-			} else if (V.PC.boobs >= 1200) {
-				r.push(`huge`);
-				if (V.PC.boobsImplant !== 0) {
-					r.push(`fake`);
-				}
-				r.push(`breasts.`);
-			} else if (V.PC.boobs >= 1000) {
-				r.push(`big`);
-				if (V.PC.boobsImplant !== 0) {
-					r.push(`fake`);
-				}
-				r.push(`breasts.`);
-			} else if (V.PC.boobs >= 800) {
-				r.push(`noticeable breasts.`);
-			} else if (V.PC.boobs >= 650) {
-				r.push(`unremarkable breasts.`);
-			} else if (V.PC.boobs >= 500) {
-				r.push(`average breasts.`);
-			} else {
-				r.push(`small breasts.`);
-			}
-		} else {
-			if (V.PC.title > 0) {
-				r.push(`You have a manly chest.`);
-			} else {
-				r.push(`You are flat as a board.`);
-			}
-		}
 		App.Events.addNode(el, r, "p");
 	}
 
diff --git a/src/events/intro/pcAppearanceIntro.tw b/src/events/intro/pcAppearanceIntro.tw
index 3854ab1ddaba89663f214985123f95b35b00ad02..e982aa0d9f2fba6a8a77381876e23bbf9fe15557 100644
--- a/src/events/intro/pcAppearanceIntro.tw
+++ b/src/events/intro/pcAppearanceIntro.tw
@@ -3,7 +3,7 @@
 <p>
 	Race and appearance are largely irrelevant in the Free Cities; there are only the free and the enslaved.
 	<div class="indent note">
-		Appearance only, no effect on gameplay (unless you make a big deal out of it).
+		Appearance only, will mostly have a superficial effect (unless you make a big deal out of it).
 	</div>
 </p>
 <<set _options = new App.UI.OptionsGroup()>>
@@ -11,5 +11,9 @@
 <<includeDOM _options.render()>>
 
 <p>
-	[[Finish player character customization|PC Experience Intro][resetEyeColor($PC)]]
+	<<if isFertile(V.PC)>>
+		[[Continue player character customization|PC Preg Intro][resetEyeColor($PC)]]
+	<<else>>
+		[[Finish player character customization|PC Experience Intro][resetEyeColor($PC)]]
+	<</if>>
 </p>
diff --git a/src/events/intro/pcBodyIntro.js b/src/events/intro/pcBodyIntro.js
index 187dd896654d64c5c0566bd03ea4b485aac01227..1dd639982445185ea0ed73fe42d1ceb5bc6e9023 100644
--- a/src/events/intro/pcBodyIntro.js
+++ b/src/events/intro/pcBodyIntro.js
@@ -1,7 +1,6 @@
 App.Intro.PCBodyIntro = function() {
+
 	V.PC.actualAge = Math.clamp(V.PC.actualAge, 14, 80);
-	V.PC.physicalAge = V.PC.actualAge;
-	V.PC.visualAge = V.PC.actualAge;
 
 	const el = new DocumentFragment();
 	let r = [];
@@ -42,7 +41,7 @@ App.Intro.PCBodyIntro = function() {
 
 		// Chest
 		options.addOption("Under my suit jacket", "boobs", V.PC)
-			.addValue((V.PC.title > 0) ? `Masculine muscles` : `A flat chest`, 100)
+			.addValue((V.PC.title > 0) ? `Masculine muscles` : `A flat chest`, 200)
 			.addValue("Feminine breasts", 900)
 			.addComment("These options will affect scenes. Sporting breasts will increase difficulty");
 
@@ -121,19 +120,23 @@ App.Intro.PCBodyIntro = function() {
 
 		App.UI.DOM.appendNewElement("div", el, `How old are you?`, ["intro", "question"]);
 		const r = [];
-		r.push(`I'm`);
+		r.push(`You're`);
 		if (V.PC.actualAge >= 65) {
-			r.push(`getting up in years. I've made a legacy for myself, and I'm not done yet.`);
+			r.push(`getting up in years. You've made a legacy for myself, and not done with life just yet.`);
 		} else if (V.PC.actualAge >= 50) {
-			r.push(`well into middle age. I've made a name for myself, and I've still got it.`);
+			r.push(`well into middle age. You've made a name for myself, and still got your groove.`);
 		} else if (V.PC.actualAge >= 35) {
-			r.push(`entering middle age. I'm accomplished, and I retain some youthful vigor.`);
+			r.push(`entering middle age. You're accomplished, and retain some youthful vigor.`);
+		} else if (V.PC.actualAge >= 22) {
+			r.push(`surprisingly young. You'll need to prove myself, but you've got energy to burn.`);
+		} else if (V.PC.actualAge >= 14) {
+			r.push(`exceedingly young. You're nobody, but you're full of youthful vigor and ready to make the world yours.`);
 		} else {
-			r.push(`surprisingly young. I'll need to prove myself, but I've got energy to burn.`);
+			r.push(`just a child. You may be emancipated, but society won't accept you as a leader.`);
 		}
-		r.push(`My age:`);
+		r.push(`Your age:`);
 		options.addOption(r.join(" "), "actualAge", V.PC).showTextBox()
-			.addComment(`Older player characters start with more reputation and maintain reputation somewhat more easily, but have slightly less sexual energy.`);
+			.addComment(`Older player characters start with more reputation and maintain reputation somewhat more easily, but have slightly less sexual energy. Exceedingly young characters will not be accepted by society, even more so if underage, and will face additional hurdles and complications.`);
 
 		el.append(options.render());
 
@@ -156,12 +159,17 @@ App.Intro.PCBodyIntro = function() {
 
 	function endScene() {
 		const el = document.createElement("p");
-		const linkTitle = "Confirm player character customization";
-		if (V.PC.vagina !== -1) {
-			el.append(App.UI.DOM.passageLink(linkTitle, "PC Preg Intro"));
-		} else {
-			el.append(App.UI.DOM.passageLink(linkTitle, "PC Appearance Intro"));
-		}
+		el.append(
+			App.UI.DOM.link(
+				"Confirm player character overview",
+				() => {
+					App.UI.Player.syncAgeBasedParameters();
+				},
+				[],
+				"PC Appearance Intro"
+			)
+		);
+
 		return el;
 	}
 };
diff --git a/src/events/intro/pcExperienceIntro.tw b/src/events/intro/pcExperienceIntro.tw
index 422ae0db6cbf415fac6867c2f070259de93e027b..137604a09654c94de2023a77bb4342327cc7eb83 100644
--- a/src/events/intro/pcExperienceIntro.tw
+++ b/src/events/intro/pcExperienceIntro.tw
@@ -3,6 +3,10 @@
 <<if $PC.career == "arcology owner">>
 	<<goto "PC Rumor Intro">>
 <<else>>
+	<<if !$disableForcedCareers>>
+		<<set $disableForcedCareers = $PC.actualAge >= 22 ? 1 : 0>>
+	<</if>>
+
 	<p>
 		You're a relative unknown in the Free Cities, but it's clear you're already accomplished. The meek and average cannot aspire to acquire arcologies. You've got all the necessary skills to take over an arcology and succeed as its owner, but you should be able to leverage the skills and experience you retain from your past, too.
 		<span class="intro question">
@@ -11,7 +15,7 @@
 	</p>
 
 	<div>
-		[[Idle wealth|PC Rumor Intro][$PC.career = "wealth"]]
+		[[Idle wealth|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("wealth")]]
 	</div>
 	<div class="indent note">
 		Start with <span class="cash inc">extra money.</span>
@@ -22,7 +26,7 @@
 	</div>
 
 	<div>
-		[[Venture capitalism|PC Rumor Intro][$PC.career = "capitalist"]]
+		[[Venture capitalism|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("capitalist")]]
 	</div>
 	<div class="indent note">
 		You will be more @@.green;effective at business pursuits.@@
@@ -33,7 +37,7 @@
 	</div>
 
 	<div>
-		[[Private military work|PC Rumor Intro][$PC.career = "mercenary"]]
+		[[Private military work|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("mercenary")]]
 	</div>
 	<div class="indent note">
 		You retain mercenary contacts
@@ -46,7 +50,7 @@
 	</div>
 
 	<div>
-		[[Slaving|PC Rumor Intro][$PC.career = "slaver"]]
+		[[Slaving|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("slaver")]]
 	</div>
 	<div class="indent note">
 		Your slave breaking experience will be useful.
@@ -57,21 +61,21 @@
 	</div>
 
 	<div>
-		[[Arcology engineering|PC Rumor Intro][$PC.career = "engineer"]]
+		[[Engineering|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("engineer")]]
 	</div>
 	<div class="indent note">
 		<span class="cash inc">Upgrading the arcology will be cheaper.</span> Also, the arcology will start with <span class="cash inc">basic economic upgrades</span> already installed.
 	</div>
 
 	<div>
-		[[Slave surgery|PC Rumor Intro][$PC.career = "medicine"]]
+		[[Surgery|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("medicine")]]
 	</div>
 	<div class="indent note">
 		Surgery will be <span class="cash inc">cheaper</span> and @@.green;healthier@@ and <span class="cash inc">drug upgrades will be cheaper.</span> Your starting slaves will have free implants available.
 	</div>
 
 	<div>
-		[[Minor celebrity|PC Rumor Intro][$PC.career = "celebrity"]]
+		[[Minor celebrity|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("celebrity")]]
 	</div>
 	<div class="indent note">
 		Start with @@.green;extra reputation.@@
@@ -82,7 +86,7 @@
 	</div>
 
 	<div>
-		[[High class escort|PC Rumor Intro][$PC.career = "escort"]]
+		[[Sex industry|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("escort")]]
 	</div>
 	<div class="indent note">
 		As an ex-whore, you will find it @@.red;hard to maintain reputation@@<<if $showSecExp == 1>>, @@.red;in addition to authority@@<</if>>.
@@ -90,7 +94,7 @@
 	</div>
 
 	<div>
-		[[Servant|PC Rumor Intro][$PC.career = "servant"]]
+		[[Servant|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("servant")]]
 	</div>
 	<div class="indent note">
 		As an ex-servant, you will find it @@.red;hard to maintain reputation@@<<if $showSecExp == 1>>, @@.red;in addition to authority@@<</if>>.
@@ -98,10 +102,10 @@
 	</div>
 
 	<div>
-		[[Gang Leader|PC Rumor Intro][$PC.career = "gang"]]
+		[[Gang affiliation|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("gang")]]
 	</div>
 	<div class="indent note">
-		As an ex-gang leader, you know how to haggle slaves.
+		As an ex-gang member, you know how to haggle slaves.
 		<<if $showSecExp == 1>>
 			In addition, asserting your authority @@.green;will be easier@@ and <span class="cash inc">security HQ upgrades will be cheaper.</span>
 		<</if>>
@@ -109,10 +113,10 @@
 	</div>
 
 	<div>
-		[[Incursion Specialist|PC Rumor Intro][$PC.career = "BlackHat"]]
+		[[Incursion Specialist|PC Rumor Intro][$PC.career = App.UI.Player.assignCareerByAge("BlackHat")]]
 	</div>
 	<div class="indent note">
-		As an ex-hacker for hire, you know how to gain access computer systems and other devices. @@.green;Certain upgrades will be cheaper@@ and you may find alternative approaches to problems.
+		As an ex-hacker, you know how to gain access computer systems and other devices. @@.green;Certain upgrades will be cheaper@@ and you may find alternative approaches to problems.
 		<<if $showSecExp == 1>>
 			However, you will @@.red;find authority quite hard@@ to maintain.
 		<</if>>
@@ -130,4 +134,29 @@
 			<<set $showSecExp = 1>>
 		<</link>>
 	<</if>>
+</p>
+
+<p>
+	<<if $disableForcedCareers != 1>>
+		<<link "Disable forced career choices" "PC Experience Intro">>
+			<<set $disableForcedCareers = 1>>
+		<</link>>
+		<div class="indent note">
+			<<if $PC.actualAge < 14>>
+				Due to your young age, you will be given the child variant of your chosen career line.
+			<<elseif $PC.actualAge < 22>>
+				Due to your age, you will be given the inexperienced variant of your chosen career line.
+			<</if>>
+			Over time and with effort, you will be capable of achieving everything of importance in the adult careers.
+		</div>
+	<<else>>
+		<<if $PC.actualAge < 22>>
+			<<link "Enable forced career choices" "PC Experience Intro">>
+				<<set $disableForcedCareers = 0>>
+			<</link>>
+			<div class="indent note">
+				Use age based careers.
+			</div>
+		<</if>>
+	<</if>>
 </p>
\ No newline at end of file
diff --git a/src/events/intro/pcPregIntro.tw b/src/events/intro/pcPregIntro.tw
index 71d6886523392ae37b5375261bf849c69ec9a7ef..78ffe760712e87a063df04f0cf8f60a1c576f4a7 100644
--- a/src/events/intro/pcPregIntro.tw
+++ b/src/events/intro/pcPregIntro.tw
@@ -54,5 +54,5 @@
 	</div>
 </p>
 <p>
-	[[Confirm player character customization|PC Appearance Intro]]
+	[[Confirm player character customization|PC Experience Intro]]
 </p>
diff --git a/src/events/nonRandom/pAbducted.js b/src/events/nonRandom/pAbducted.js
index 4067dd1b46a36f9635ab6bdc7c18a1dc14ce351e..18eb7c21c7445626c2e7084d961244a9a9681b02 100644
--- a/src/events/nonRandom/pAbducted.js
+++ b/src/events/nonRandom/pAbducted.js
@@ -87,7 +87,8 @@ App.Events.pAbducted = class pAbducted extends App.Events.BaseEvent {
 				cashX(-1000, "event");
 			}
 			continueButton(node);
-			// injury code here
+			V.PC.health.shortDamage = 2;
+			V.PC.health.longDamage = 1;
 		} else {
 			r.push(`Once your vision is obscured, your attacker sweeps your legs and tosses you into a waiting crate.`);
 			r.push(Spoken(abductor, `"Be a good little ${girlP} and keep quiet. Wouldn't want anything bad to happen to ya, eh? I'd really hate to damage the merchandise."`));
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index 072492877bc35bd021dc4240f5b47066157c3503..e86d56e01e6423fae601ec85010d66653166ceb0 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -44,6 +44,7 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.RESSSuppositoryResistance(),
 		new App.Events.RESSTooThinForCumDiet(),
 		new App.Events.RESSWaistlineWoes(),
+		new App.Events.RESSWhoreRebellious(),
 
 		new App.Events.RECIButthole(),
 		new App.Events.RECIFeminization(),
diff --git a/src/facilities/farmyard/animals/animals.js b/src/facilities/farmyard/animals/animals.js
index ad525d0a2b0ace954f0c65352fc9e8c842a10204..fa0b4e0185c6be724ae334e5f7bf7f3e7cf1ad4d 100644
--- a/src/facilities/farmyard/animals/animals.js
+++ b/src/facilities/farmyard/animals/animals.js
@@ -103,8 +103,8 @@ App.Facilities.Farmyard.animals = function() {
 
 	const frag = new DocumentFragment();
 
-	const domesticDiv = App.UI.DOM.appendNewElement("div", frag, '', "farmyard-domestic");
-	const exoticDiv = App.UI.DOM.appendNewElement("div", frag, '', "farmyard-exotic");
+	const domesticDiv = App.UI.DOM.appendNewElement("div", frag, '', 'farmyard-domestic');
+	const exoticDiv = App.UI.DOM.appendNewElement("div", frag, '', 'farmyard-exotic');
 
 	const hrMargin = '0';
 
@@ -119,10 +119,10 @@ App.Facilities.Farmyard.animals = function() {
 	V.returnTo = "Farmyard Animals";
 	V.encyclopedia = "Farmyard";
 
-	App.UI.DOM.appendNewElement("span", domesticDiv, 'Domestic Animals', "farmyard-heading");
+	App.UI.DOM.appendNewElement("span", domesticDiv, 'Domestic Animals', 'farmyard-heading');
 
 	if (V.farmyardKennels > 1 || V.farmyardStables > 1 || V.farmyardCages > 1) {
-		App.UI.DOM.appendNewElement("span", exoticDiv, 'Exotic Animals', "farmyard-heading");
+		App.UI.DOM.appendNewElement("span", exoticDiv, 'Exotic Animals', 'farmyard-heading');
 	}
 
 	if (V.farmyardKennels) {
@@ -157,15 +157,15 @@ App.Facilities.Farmyard.animals = function() {
 
 
 
-	// MARK: Domestic Animals
+	// Domestic Animals
 
 	function domesticCanines() {
-		const canineDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const canineDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", canineDiv, 'Dogs', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", canineDiv, 'Dogs', 'farmyard-animal-type');
 
 		canineDiv.append(hr, animalList(canine, domestic, 5000, canine));
 
@@ -173,12 +173,12 @@ App.Facilities.Farmyard.animals = function() {
 	}
 
 	function domesticHooved() {
-		const hoovedDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const hoovedDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", hoovedDiv, 'Hooved Animals', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", hoovedDiv, 'Hooved Animals', 'farmyard-animal-type');
 
 		hoovedDiv.append(hr, animalList(hooved, domestic, 20000, hooved));
 
@@ -186,12 +186,12 @@ App.Facilities.Farmyard.animals = function() {
 	}
 
 	function domesticFelines() {
-		const felineDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const felineDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", felineDiv, 'Cats', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", felineDiv, 'Cats', 'farmyard-animal-type');
 
 		felineDiv.append(hr, animalList(feline, domestic, 1000, feline));
 
@@ -200,15 +200,15 @@ App.Facilities.Farmyard.animals = function() {
 
 
 
-	// MARK: Exotic Animals
+	// Exotic Animals
 
 	function exoticCanines() {
-		const canineDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const canineDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", canineDiv, 'Canines', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", canineDiv, 'Canines', 'farmyard-animal-type');
 
 		canineDiv.append(hr, animalList(canine, exotic, 50000, canine));
 
@@ -216,12 +216,12 @@ App.Facilities.Farmyard.animals = function() {
 	}
 
 	function exoticHooved() {
-		const hoovedDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const hoovedDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", hoovedDiv, 'Hooved Animals', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", hoovedDiv, 'Hooved Animals', 'farmyard-animal-type');
 
 		hoovedDiv.append(hr, animalList(hooved, exotic, 75000, hooved));
 
@@ -229,12 +229,12 @@ App.Facilities.Farmyard.animals = function() {
 	}
 
 	function exoticFelines() {
-		const felineDiv = App.UI.DOM.makeElement("div", '', "farmyard-animals");
+		const felineDiv = App.UI.DOM.makeElement("div", '', 'farmyard-animals');
 		const hr = document.createElement("hr");
 
 		hr.style.margin = hrMargin;
 
-		App.UI.DOM.appendNewElement("span", felineDiv, 'Felines', "farmyard-animal-type");
+		App.UI.DOM.appendNewElement("span", felineDiv, 'Felines', 'farmyard-animal-type');
 
 		felineDiv.append(hr, animalList(feline, exotic, 100000, feline));
 
@@ -243,7 +243,7 @@ App.Facilities.Farmyard.animals = function() {
 
 
 
-	// MARK: Helper Functions
+	// Helper Functions
 
 	/**
 	 * Creates either a link or note text depending on parameters given
@@ -316,11 +316,11 @@ App.Facilities.Farmyard.animals = function() {
 		const addAnimalDiv = document.createElement("div");
 		const dickDiv = document.createElement("div");
 		const deadlinessDiv = document.createElement("div");
-		const addDiv = App.UI.DOM.makeElement("div", null, ["animal-add"]);
+		const addDiv = App.UI.DOM.makeElement("div", null, ['animal-add']);
 
 		const animal = new App.Entity.Animal(null, null, "canine", "domestic");
 
-		App.UI.DOM.appendNewElement("div", addAnimalDiv, `Add a New Animal`, ["farmyard-heading"]);
+		App.UI.DOM.appendNewElement("div", addAnimalDiv, `Add a New Animal`, ['farmyard-heading']);
 
 		addAnimalDiv.append(
 			name(),
@@ -496,13 +496,13 @@ App.Facilities.Farmyard.animals = function() {
 				const dickSizeDiv = document.createElement("div");
 
 				dickSizeDiv.append(
-					`How large is ${animal.name ? `${animal.articleAn} ${animal.name}` : `the animal`}'s dick? `,
+					`How large is ${animal.name ? `${animal.articleAn} male ${animal.name}` : `a male`}'s penis? `,
 					App.UI.DOM.makeTextBox(animal.dick.size || 2, value => {
 						animal.setDick(value, animal.dick.desc || null);
 
 						App.UI.DOM.replace(dickSizeDiv, dickSize);
 					}, true),
-					App.UI.DOM.makeElement("span", `1 is smallest, and default is 2. `, ["note"]),
+					App.UI.DOM.makeElement("span", `1 is smallest, and default is 2. `, ['note']),
 				);
 
 				return dickSizeDiv;
@@ -518,7 +518,7 @@ App.Facilities.Farmyard.animals = function() {
 
 						App.UI.DOM.replace(dickDescDiv, dickDesc);
 					}),
-					App.UI.DOM.makeElement("span", `Default is 'large'. `, ["note"]),
+					App.UI.DOM.makeElement("span", `Default is 'large'. `, ['note']),
 				);
 
 				return dickDescDiv;
@@ -531,7 +531,7 @@ App.Facilities.Farmyard.animals = function() {
 				App.UI.DOM.makeTextBox(5, value => {
 					animal.setDick(value);
 				}, true),
-				App.UI.DOM.makeElement("span", `Default is 5. `, ["note"]),
+				App.UI.DOM.makeElement("span", `Default is 5. `, ['note']),
 			);
 
 			return deadlinessDiv;
@@ -613,7 +613,7 @@ App.Facilities.Farmyard.animals.init = function() {
 				.setDick(5, 'huge'),
 			new Animal("elephant", "elephant", hooved, exotic)
 				.setArticle(an)
-				.setDick(6, 'enormous'),	// not exactly true to life, but more fun
+				.setDick(6, 'enormous'),	// not exactly true to life, but more interesting
 
 			new Animal("Abbysinian", cat, feline, domestic)
 				.setArticle(an),
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 137e46ac40784b9846bc30fc00c83d41d45c2084..63c2fe6c8abdf7acf72ef666ace27cb27ed7bb9b 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -1,18 +1,21 @@
 App.Facilities.Farmyard.farmyard = function() {
 	const frag = new DocumentFragment();
 
-	const introDiv = document.createElement("div");
-	const expandDiv = document.createElement("div");
-	const menialsDiv = document.createElement("div");
-	const rulesDiv = document.createElement("div");
-	const upgradesDiv = document.createElement("div");
-	const animalsDiv = document.createElement("div");
-	const kennelsDiv = document.createElement("div");
-	const stablesDiv = document.createElement("div");
-	const cagesDiv = document.createElement("div");
-	const removeHousingDiv = document.createElement("div");
-
-	const farmyardNameCaps = capFirstChar(V.farmyardName);
+	const introDiv = App.UI.DOM.makeElement("div", null, ['farmyard-intro']);
+	const expandDiv = App.UI.DOM.makeElement("div", null, ['farmyard-expand']);
+	const menialsDiv = App.UI.DOM.makeElement("div", null, ['farmyard-menials']);
+	const rulesDiv = App.UI.DOM.makeElement("div", null, ['farmyard-rules']);
+	const upgradesDiv = App.UI.DOM.makeElement("div", null, ['farmyard-upgrades']);
+	const kennelsDiv = App.UI.DOM.makeElement("div", null, ['farmyard-kennels']);
+	const stablesDiv = App.UI.DOM.makeElement("div", null, ['farmyard-stables']);
+	const cagesDiv = App.UI.DOM.makeElement("div", null, ['farmyard-cages']);
+	const removeHousingDiv = App.UI.DOM.makeElement("div", null, ['farmyard-remove']);
+	const renameDiv = App.UI.DOM.makeElement("div", null, ['farmyard-rename']);
+	const slavesDiv = App.UI.DOM.makeElement("div", null, ['farmyard-slaves']);
+
+	let farmyardNameCaps = capFirstChar(V.farmyardName);
+
+	const count = App.Entity.facilities.farmyard.totalEmployeesCount;
 
 	V.nextButton = "Back to Main";
 	V.nextLink = "Main";
@@ -25,200 +28,186 @@ App.Facilities.Farmyard.farmyard = function() {
 		menials(),
 		rules(),
 		upgrades(),
-		animals(),
+		kennels(),
+		stables(),
+		cages(),
+		removeHousing(),
+		rename(),
+		slaves(),
 	);
 
-	App.UI.DOM.appendNewElement("div", frag, App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard), "farmyard-slaves");
-
-	App.UI.SlaveList.ScrollPosition.restore();
-
-	frag.appendChild(App.Facilities.rename(App.Entity.facilities.farmyard, () => {
-		App.UI.DOM.replace(introDiv, intro);
-		App.UI.DOM.replace(expandDiv, expand);
-		App.UI.DOM.replace(menialsDiv, menials);
-		App.UI.DOM.replace(rulesDiv, rules);
-		App.UI.DOM.replace(upgradesDiv, upgrades);
-		App.UI.DOM.replace(animalsDiv, animals);
-	}));
-
 	return frag;
 
 	function intro() {
-		introDiv.classList.add("farmyard-intro", "scene-intro");
+		const text = [];
 
-		const desc = App.UI.DOM.appendNewElement("div", introDiv, `${farmyardNameCaps} is an oasis of growth in the midst of the jungle of steel and concrete that is ${V.arcologies[0].name}. Animals are kept in pens, tended to by your slaves, while ${V.farmyardUpgrades.hydroponics
+		text.push(`${farmyardNameCaps} is an oasis of growth in the midst of the jungle of steel and concrete that is ${V.arcologies[0].name}. Animals are kept in pens, tended to by your slaves, while ${V.farmyardUpgrades.hydroponics
 			? `rows of hydroponics equipment`
 			: `makeshift fields`} grow crops. `);
 
-		const count = App.Entity.facilities.farmyard.totalEmployeesCount;
-
 		switch (V.farmyardDecoration) {
 			case "Roman Revivalist":
-				desc.append(`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${V.seeBestiality ? `. Mercury watches over the health of the animals, and Feronia ensures strong litters in your slaves.` : `, and Mercury watches over the health of the animals.`} The slaves here are all looked after well, as they have one of the most important jobs in ${V.arcologies[0].name}.`);
+				text.push(`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${V.seeBestiality ? `. Mercury watches over the health of the animals, and Feronia ensures strong litters in your slaves.` : `, and Mercury watches over the health of the animals.`} The slaves here are all looked after well, as they have one of the most important jobs in ${V.arcologies[0].name}.`);
 				break;
 			case "Neo-Imperialist":
-				desc.append(`Its high-tech, sleek black design invocates an embracement of the future, tempered by the hanging banners displaying your family crest as the rightful lord and master of these farms. Serf-like peasants work tirelessly in the fields, both to grow crops and oversee the slaves beneath them. Despite the harsh nature of the fieldwork, the slaves here are all looked after well, as they have one of the most important jobs in ${V.arcologies[0].name}.`);
+				text.push(`Its high-tech, sleek black design invocates an embracement of the future, tempered by the hanging banners displaying your family crest as the rightful lord and master of these farms. Serf-like peasants work tirelessly in the fields, both to grow crops and oversee the slaves beneath them. Despite the harsh nature of the fieldwork, the slaves here are all looked after well, as they have one of the most important jobs in ${V.arcologies[0].name}.`);
 				break;
 			case "Aztec Revivalist":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Egyptian Revivalist":
-				desc.append(`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, ${V.seeBestiality ? `with animal-bloated slaves featured prominently.` : `hieroglyphs spelling out a volumes of praise.`}`);
+				text.push(`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, ${V.seeBestiality ? `with animal-bloated slaves featured prominently.` : `hieroglyphs spelling out volumes of praise.`}`);
 				break;
 			case "Edo Revivalist":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Arabian Revivalist":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Chinese Revivalist":
-				desc.append(`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 to${V.seeBestiality ? ` or breeding with` : ``} your animals.`);
+				text.push(`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 to${V.seeBestiality ? ` or breeding with` : ``} your animals.`);
 				break;
 			case "Chattel Religionist":
-				desc.append(`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 ${V.seeBestiality ? `around animal-bloated bellies ` : ``}as divine will dictates.`);
+				text.push(`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 ${V.seeBestiality ? `around animal-bloated bellies ` : ``}as divine will dictates.`);
 				break;
 			case "Degradationist":
-				desc.append(`It is constructed less as a converted warehouse and more as something to visit, allowing guests to enjoy the spectacle of slaves ${V.seeBestiality ? `being pounded by eager animals` : `elbow deep in scrubbing animal waste`} to their satisfaction.`);
+				text.push(`It is constructed less as a converted warehouse and more as something to visit, allowing guests to enjoy the spectacle of slaves ${V.seeBestiality ? `being pounded by eager animals` : `elbow deep in scrubbing animal waste`} to their satisfaction.`);
 				break;
 			case "Repopulationist":
-				desc.append(`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 ${V.seeBestiality ? `of this farm` : `of the arcology`} in their bellies.`);
+				text.push(`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 ${V.seeBestiality ? `of this farm` : `of the arcology`} in their bellies.`);
 				break;
 			case "Eugenics":
-				desc.append(`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${V.seeBestiality ? ` and bred with only the highest quality slaves` : ``}, while the sub-par stock is neglected off to the side.`);
+				text.push(`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${V.seeBestiality ? ` and bred with only the highest quality slaves` : ``}, while the sub-par stock is neglected off to the side.`);
 				break;
 			case "Asset Expansionist":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Transformation Fetishist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Gender Radicalist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Gender Fundamentalist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Physical Idealist":
-				desc.append(`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${V.seeBestiality ? ` and an abundance of curatives for the slaves full of their fierce, kicking offspring` : ``}.`);
+				text.push(`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${V.seeBestiality ? ` and an abundance of curatives for the slaves full of their fierce, kicking offspring` : ``}.`);
 				break;
 			case "Supremacist":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Subjugationist":
-				desc.append(`It is a clean and orderly operation, stables and cages mucked by a multitude of ${V.arcologies[0].FSSubjugationistRace} slaves, while the others are tasked with grooming your animals and harvesting your crops.`);
+				text.push(`It is a clean and orderly operation, stables and cages mucked by a multitude of ${V.arcologies[0].FSSubjugationistRace} slaves, while the others are tasked with grooming your animals and harvesting your crops.`);
 				break;
 			case "Paternalist":
-				desc.append(`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${V.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` : ``}.`);
+				text.push(`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${V.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` : ``}.`);
 				break;
 			case "Pastoralist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Maturity Preferentialist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Youth Preferentialist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Body Purist":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Slimness Enthusiast":
-				desc.append(`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.`);
+				text.push(`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.`);
 				break;
 			case "Hedonistic":
-				desc.append(`It features wider gates and stalls, for both the humans visiting or tending the occupants, and the animals starting to mimic their handlers${V.seeBestiality ? ` and company` : ``}, with plenty of seats along the way.`);
+				text.push(`It features wider gates and stalls, for both the humans visiting or tending the occupants, and the animals starting to mimic their handlers${V.seeBestiality ? ` and company` : ``}, with plenty of seats along the way.`);
 				break;
 			case "Slave Professionalism":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			case "Intellectual Dependency":
-				// desc.append(`TODO:`);
+				// text.push(`TODO:`);
 				break;
 			default:
-				desc.append(`It is very much a converted warehouse still, sectioned off in various 'departments'${V.farmyardUpgrades.machinery ? ` with machinery placed where it can be` : V.farmyardUpgrades.hydroponics ? ` and plumbing for the hydroponics system running every which way` : ``}.`);
+				text.push(`It is very much a converted warehouse still, sectioned off in various 'departments'${V.farmyardUpgrades.machinery ? ` with machinery placed where it can be` : V.farmyardUpgrades.hydroponics ? ` and plumbing for the hydroponics system running every which way` : ``}.`);
 				break;
 		}
 
 		if (count > 2) {
-			desc.append(` ${farmyardNameCaps} is bustling with activity. Farmhands are hurrying about, on their way to feed animals and maintain farming equipment.`);
+			text.push(`${farmyardNameCaps} is bustling with activity. Farmhands are hurrying about, on their way to feed animals and maintain farming equipment.`);
 		} else if (count) {
-			desc.append(` ${farmyardNameCaps} is working steadily. Farmhands are moving about, looking after the animals and crops.`);
+			text.push(`${farmyardNameCaps} is working steadily. Farmhands are moving about, looking after the animals and crops.`);
 		} else if (S.Farmer) {
-			desc.append(` ${S.Farmer.slaveName} is alone in ${V.farmyardName}, and has nothing to do but look after the animals and crops.`);
+			text.push(`${S.Farmer.slaveName} is alone in ${V.farmyardName}, and has nothing to do but look after the animals and crops.`);
 		} else {
-			desc.append(` ${farmyardNameCaps} is empty and quiet.`);
+			text.push(`${farmyardNameCaps} is empty and quiet.`);
 		}
 
-		App.UI.DOM.appendNewElement("div", desc, App.UI.DOM.passageLink(`Decommission ${V.farmyardName}`, "Main", () => {
-			if (V.farmMenials) {
-				V.menials += V.farmMenials;
-				V.farmMenials = 0;
-			}
+		App.UI.DOM.appendNewElement("div", introDiv, text.join(' '), ['scene-intro']);
 
-			V.farmyardName = "the Farmyard";
-			V.farmyard = 0;
-			V.farmyardDecoration = "standard";
+		if (count === 0) {
+			App.UI.DOM.appendNewElement("div", introDiv, App.UI.DOM.passageLink(`Decommission ${V.farmyardName}`, "Main", () => {
+				if (V.farmMenials) {
+					V.menials += V.farmMenials;
+					V.farmMenials = 0;
+				}
 
-			V.farmMenials = 0;
-			V.farmMenialsSpace = 0;
+				V.farmyardName = "the Farmyard";
+				V.farmyard = 0;
+				V.farmyardDecoration = "standard";
 
-			V.farmyardShows = 0;
-			V.farmyardBreeding = 0;
-			V.farmyardCrops = 0;
+				V.farmMenials = 0;
+				V.farmMenialsSpace = 0;
 
-			V.farmyardKennels = 0;
-			V.farmyardStables = 0;
-			V.farmyardCages = 0;
+				V.farmyardShows = 0;
+				V.farmyardBreeding = 0;
+				V.farmyardCrops = 0;
 
-			if (V.pit) {
-				V.pit.animal = null;
-			}
+				V.farmyardKennels = 0;
+				V.farmyardStables = 0;
+				V.farmyardCages = 0;
 
-			V.farmyardUpgrades = {
-				pump: 0,
-				fertilizer: 0,
-				hydroponics: 0,
-				machinery: 0,
-				seeds: 0
-			};
+				if (V.pit) {
+					V.pit.animal = null;
+				}
 
-			clearAnimalsPurchased();
-			App.Arcology.cellUpgrade(V.building, App.Arcology.Cell.Manufacturing, "Farmyard", "Manufacturing");
-		}));
+				V.farmyardUpgrades = {
+					pump: 0,
+					fertilizer: 0,
+					hydroponics: 0,
+					machinery: 0,
+					seeds: 0
+				};
+
+				clearAnimalsPurchased();
+				App.Arcology.cellUpgrade(V.building, App.Arcology.Cell.Manufacturing, "Farmyard", "Manufacturing");
+			}), ['indent']);
+		}
 
 		return introDiv;
 	}
 
 	function expand() {
-		expandDiv.classList.add("farmyard-expand");
+		const cost = Math.trunc(V.farmyard * 1000 * V.upgradeMultiplierArcology);
 
-		const upgradeCost = Math.trunc(V.farmyard * 1000 * V.upgradeMultiplierArcology);
-		const farmhands = App.Entity.facilities.farmyard.totalEmployeesCount;
+		expandDiv.append(`It can support ${num(V.farmyard)} farmhands. There ${count === 1 ? `is currently ${count} farmhand` : `are currently ${count} farmhands`} in ${V.farmyardName}.`);
 
-		App.UI.DOM.appendNewElement('div', expandDiv, `It can support ${V.farmyard} farmhands. Currently there ${farmhands === 1 ? `is` : `are`} ${farmhands} ${farmhands === 1 ? `farmhand` : `farmhands`} in ${V.farmyardName}. `);
-
-		App.UI.DOM.appendNewElement('div', expandDiv, App.UI.DOM.link(`Expand ${V.farmyardName}`, () => {
-			cashX(forceNeg(upgradeCost), "capEx");
+		App.UI.DOM.appendNewElement("div", expandDiv, App.UI.DOM.link(`Expand ${V.farmyardName}`, () => {
+			cashX(forceNeg(cost), "capEx");
 			V.farmyard += 5;
 			V.PC.skill.engineering += .1;
 
 			App.UI.DOM.replace(expandDiv, expand);
 		},
-		null,
-		'',
-		`Costs ${cashFormat(upgradeCost)} and will increase upkeep costs`),
-		['indent']);
+		[], '', `Costs ${cashFormat(cost)} and increases the capacity of ${V.farmyardName} by 5.`), ['indent']);
 
-		if (App.Entity.facilities.farmyard.totalEmployeesCount) {
-			App.UI.DOM.appendNewElement("div", expandDiv, removeFacilityWorkers("farmyard"), "indent");
+		if (count > 0) {
+			App.UI.DOM.appendNewElement("div", expandDiv, removeFacilityWorkers("farmyard"), 'indent');
 		}
 
 		return expandDiv;
 	}
 
 	function menials() {
-		menialsDiv.classList.add("farmyard-menials");
-
 		menialsDiv.append(transferMenials(), buyMenials(), houseMenials());
 
 		return menialsDiv;
@@ -364,120 +353,35 @@ App.Facilities.Farmyard.farmyard = function() {
 				cashX(forceNeg(unitCost), "farmyard");
 				V.farmMenialsSpace += 100;
 			},
-			null,
-			'',
-			`Costs ${cashFormat(unitCost)} and will increase upkeep costs`),
-			['indent']);
+			[], '', `Costs ${cashFormat(unitCost)} and increases housing by 100.`), ['indent']);
 		}
 
 		return frag;
 	}
 
 	function rules() {
-		rulesDiv.classList.add("farmyard-rules");
+		if (App.Entity.facilities.farmyard.employeesIDs().size > 0 && (V.farmyardKennels || V.farmyardStables || V.farmyardCages)) {	// TODO: redo this with V.farmyardShowgirls
+			const options = new App.UI.OptionsGroup();
 
-		if (App.Entity.facilities.farmyard.employeesIDs().size > 0) {	// TODO: redo this with V.farmyardShowgirls
-			if (V.farmyardShows && (V.canine || V.hooved || V.feline)) {
-				const rule = makeRule(
-					['Slaves', 'are putting on shows with animals'],
-					'are',
-					"End shows",
-					[],
-					["farmyardShows", "farmyardBreeding", "farmyardRestraints"]
-				);
-
-				rulesDiv.append(rule);
+			options.addOption(`Slaves ${V.farmyardShows ? `are` : `are not`} putting on shows.`, "farmyardShows")
+				.addValue(`Begin shows`, 1)
+				.addValue(`End shows`, 0);
 
+			if (V.farmyardShows && (V.canine || V.hooved || V.feline)) {
 				if (V.seeBestiality) {
+					options.addOption(`Slaves ${V.farmyardBreeding ? `are` : `are not`} being bred with animals.`, "farmyardBreeding")
+						.addValue(`Begin breeding`, 1)
+						.addValue(`End breeding`, 0);
+
 					if (V.farmyardBreeding) {
-						const rule = makeRule(
-							['Slaves', 'are being bred with animals'],
-							'are',
-							"End breeding",
-							["farmyardShows"],
-							["farmyardBreeding", "farmyardRestraints"]
-						);
-
-						rulesDiv.append(rule);
-
-						if (V.farmyardRestraints) {
-							const rule = makeRule(
-								'are being restrained',
-								'All of the slaves',
-								"Restrain only disobedient slaves",
-								["farmyardShows", "farmyardBreeding"],
-								["farmyardRestraints"]
-							);
-
-							rulesDiv.append(rule);
-						} else {
-							const rule = makeRule(
-								'are being restrained',
-								'Only disobedient slaves',
-								"Restrain all slaves",
-								["farmyardShows", "farmyardBreeding", "farmyardRestraints"],
-								[]
-							);
-
-							rulesDiv.append(rule);
-						}
-					} else {
-						const rule = makeRule(
-							['Slaves', 'being bred with animals'],
-							'are not',
-							"Begin breeding",
-							["farmyardShows", "farmyardBreeding"],
-							["farmyardRestraints"]
-						);
-
-						rulesDiv.append(rule);
+						options.addOption(`${V.farmyardRestraints ? `All of the slaves` : `Only disobedient slaves`} are being restrained.`, "farmyardRestraints")
+							.addValue(`Restrain all slaves`, 1)
+							.addValue(`Restrain only disobedient slaves`, 0);
 					}
 				}
-			} else {
-				const rule = makeRule(
-					['Slaves', 'putting on shows with animals'],
-					'are not',
-					"Begin shows",
-					["farmyardShows"],
-					["farmyardBreeding", "farmyardRestraints"]
-				);
-
-				rulesDiv.append(rule);
-			}
-		}
-
-		/**
-		 * Creates a new rule button
-		 * @param {string|string[]} descText The base description for the rule
-		 * @param {string} boldText The part in bold
-		 * @param {string} linkText The link text
-		 * @param {string[]} enabled Variables to be set to 1
-		 * @param {string[]} disabled Variables to be set to 0
-		 */
-		function makeRule(descText, boldText, linkText, enabled, disabled) {
-			const frag = new DocumentFragment();
-
-			const desc = document.createElement("div");
-			const bold = App.UI.DOM.makeElement("span", boldText, "bold");
-			const link = document.createElement("span");
-
-			if (Array.isArray(descText)) {
-				desc.append(`${descText[0]} `, bold, ` ${descText[1]}. `);
-			} else {
-				desc.append(bold, ` ${descText}. `);
 			}
 
-			link.append(App.UI.DOM.link(linkText, () => {
-				enabled.forEach(i => V[i] = 1);
-				disabled.forEach(i => V[i] = 0);
-
-				App.UI.DOM.replace(rulesDiv, rules);
-			}));
-
-			desc.append(link);
-			frag.append(desc);
-
-			return frag;
+			rulesDiv.append(options.render());
 		}
 
 		return rulesDiv;
@@ -496,9 +400,9 @@ App.Facilities.Farmyard.farmyard = function() {
 			App.UI.DOM.appendNewElement("div", upgradesDiv, `${farmyardNameCaps} is currently using the basic water pump that it came with.`);
 
 			upgradesDiv.append(createUpgrade(
-				"Upgrade the water pump",
+				`Upgrade the water pump`,
 				pumpCost,
-				'slightly decreases upkeep costs',
+				`slightly decreases upkeep costs`,
 				"pump"
 			));
 		} else {
@@ -506,9 +410,9 @@ App.Facilities.Farmyard.farmyard = function() {
 
 			if (!farmyardUpgrades.fertilizer) {
 				upgradesDiv.append(createUpgrade(
-					"Use a higher-quality fertilizer",
+					`Use a higher-quality fertilizer`,
 					fertilizerCost,
-					'moderately increases crop yield and slightly increases upkeep costs',
+					`moderately increases crop yield and slightly increases upkeep costs`,
 					"fertilizer"
 				));
 			} else {
@@ -516,9 +420,9 @@ App.Facilities.Farmyard.farmyard = function() {
 
 				if (!farmyardUpgrades.hydroponics) {
 					upgradesDiv.append(createUpgrade(
-						"Purchase an advanced hydroponics system",
+						`Purchase an advanced hydroponics system`,
 						hydroponicsCost,
-						'moderately decreases upkeep costs',
+						`moderately decreases upkeep costs`,
 						"hydroponics"
 					));
 				} else {
@@ -526,9 +430,9 @@ App.Facilities.Farmyard.farmyard = function() {
 
 					if (!farmyardUpgrades.seeds) {
 						upgradesDiv.append(createUpgrade(
-							"Purchase genetically modified seeds",
+							`Purchase genetically modified seeds`,
 							seedsCost,
-							'moderately increases crop yield and slightly increases upkeep costs',
+							`moderately increases crop yield and slightly increases upkeep costs`,
 							"seeds"
 						));
 					} else {
@@ -536,9 +440,9 @@ App.Facilities.Farmyard.farmyard = function() {
 
 						if (!farmyardUpgrades.machinery) {
 							upgradesDiv.append(createUpgrade(
-								"Upgrade the machinery",
+								`Upgrade the machinery`,
 								machineryCost,
-								'moderately increases crop yield and slightly increases upkeep costs',
+								`moderately increases crop yield and slightly increases upkeep costs`,
 								"machinery"
 							));
 						} else {
@@ -564,10 +468,7 @@ App.Facilities.Farmyard.farmyard = function() {
 
 				App.UI.DOM.replace(upgradesDiv, upgrades);
 			},
-			null,
-			'',
-			`Costs ${cashFormat(price)} and ${effect}.`),
-			['indent']);
+			[], '', `Costs ${cashFormat(price)} and ${effect}.`), ['indent']);
 
 			return frag;
 		}
@@ -575,21 +476,8 @@ App.Facilities.Farmyard.farmyard = function() {
 		return upgradesDiv;
 	}
 
-	function animals() {
-		animalsDiv.classList.add("farmyard-animals");
-
-		animalsDiv.append(kennels(), stables(), cages());
-
-		if (V.farmyardKennels || V.farmyardStables || V.farmyardCages) {
-			animalsDiv.append(removeHousing());
-		}
-
-		return animalsDiv;
-	}
-
 	function kennels() {
-		const baseCost = Math.trunc(5000 * V.upgradeMultiplierArcology);
-		const upgradedCost = Math.trunc(10000 * V.upgradeMultiplierArcology);
+		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
 
 		const CL = V.canine.length;
 
@@ -609,29 +497,24 @@ App.Facilities.Farmyard.farmyard = function() {
 				: `all kinds of canines`;
 
 		if (V.farmyardKennels === 0) {
-			kennelsDiv.append(App.UI.DOM.link(`Add kennels`, () => {
-				cashX(forceNeg(baseCost), "farmyard");
+			App.UI.DOM.appendNewElement("div", kennelsDiv, App.UI.DOM.link(`Add kennels`, () => {
+				cashX(forceNeg(cost), "farmyard");
 				V.farmyardKennels = 1;
+				V.PC.skill.engineering += .1;
 
-				App.UI.DOM.replace(kennelsDiv, kennels);
-			},
-			null,
-			'',
-			`Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic canines`));
+				refresh();
+			}, [], '', `Costs ${cashFormat(cost)}, will incur upkeep costs, and unlocks domestic canines.`), ['indent']);
 		} else if (V.farmyardKennels === 1) {
 			kennelsDiv.append(App.UI.DOM.passageLink("Kennels", "Farmyard Animals"), ` have been built in one corner of ${V.farmyardName}, and are currently ${CL < 1 ? `empty` : `occupied by ${dogs}`}.`);
 
 			if (V.rep > 10000) {
 				App.UI.DOM.appendNewElement("div", kennelsDiv, App.UI.DOM.link("Upgrade kennels", () => {
-					cashX(forceNeg(upgradedCost), "farmyard");
+					cashX(forceNeg(cost * 2), "farmyard");
 					V.farmyardKennels = 2;
+					V.PC.skill.engineering += .1;
 
-					App.UI.DOM.replace(kennelsDiv, kennels);
-				},
-				null,
-				'',
-				`Costs ${cashFormat(upgradedCost)} will incur additional upkeep costs, and unlocks exotic canines`),
-				['indent']);
+					refresh();
+				}, [], '', `Costs ${cashFormat(cost * 2)} will incur additional upkeep costs, and unlocks exotic canines.`), ['indent']);
 			} else {
 				App.UI.DOM.appendNewElement("div", stablesDiv, App.UI.DOM.disabledLink("Upgrade kennels",
 					[`You must be more reputable to be able to house exotic canines.`]),
@@ -645,8 +528,7 @@ App.Facilities.Farmyard.farmyard = function() {
 	}
 
 	function stables() {
-		const baseCost = Math.trunc(5000 * V.upgradeMultiplierArcology);
-		const upgradedCost = Math.trunc(10000 * V.upgradeMultiplierArcology);
+		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
 
 		const HL = V.hooved.length;
 
@@ -657,28 +539,23 @@ App.Facilities.Farmyard.farmyard = function() {
 
 		if (V.farmyardStables === 0) {
 			App.UI.DOM.appendNewElement("div", stablesDiv, App.UI.DOM.link("Add stables", () => {
-				cashX(forceNeg(baseCost), "farmyard");
+				cashX(forceNeg(cost), "farmyard");
 				V.farmyardStables = 1;
+				V.PC.skill.engineering += .1;
 
-				App.UI.DOM.replace(stablesDiv, stables);
-			},
-			null,
-			'',
-			`Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic hooved animals`));
+				refresh();
+			}, [], '', `Costs ${cashFormat(cost)}, will incur upkeep costs, and unlocks domestic hooved animals.`), ['indent']);
 		} else if (V.farmyardStables === 1) {
 			stablesDiv.append(App.UI.DOM.passageLink("Stables", "Farmyard Animals"), ` have been built in one corner of ${V.farmyardName}, and are currently ${HL < 1 ? `empty` : `occupied by ${hooved}`}.`);
 
 			if (V.rep > 10000) {
 				App.UI.DOM.appendNewElement("div", stablesDiv, App.UI.DOM.link("Upgrade stables", () => {
-					cashX(forceNeg(upgradedCost), "farmyard");
+					cashX(forceNeg(cost * 2), "farmyard");
 					V.farmyardStables = 2;
+					V.PC.skill.engineering += .1;
 
-					App.UI.DOM.replace(stablesDiv, stables);
-				},
-				null,
-				'',
-				`Costs ${cashFormat(upgradedCost)}, will incur additional upkeep costs, and unlocks exotic hooved animals`),
-				['indent']);
+					refresh();
+				}, [], '', `Costs ${cashFormat(cost * 2)}, will incur additional upkeep costs, and unlocks exotic hooved animals.`), ['indent']);
 			} else {
 				App.UI.DOM.appendNewElement("div", stablesDiv, App.UI.DOM.disabledLink("Upgrade stables",
 					[`You must be more reputable to be able to house exotic hooved animals.`]),
@@ -692,8 +569,7 @@ App.Facilities.Farmyard.farmyard = function() {
 	}
 
 	function cages() {
-		const baseCost = Math.trunc(5000 * V.upgradeMultiplierArcology);
-		const upgradedCost = Math.trunc(10000 * V.upgradeMultiplierArcology);
+		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
 
 		const FL = V.feline.length;
 
@@ -713,29 +589,24 @@ App.Facilities.Farmyard.farmyard = function() {
 				: `all kinds of felines`;
 
 		if (V.farmyardCages === 0) {
-			cagesDiv.append(App.UI.DOM.link("Add cages", () => {
-				cashX(forceNeg(baseCost), "farmyard");
+			App.UI.DOM.appendNewElement("div", cagesDiv, App.UI.DOM.link("Add cages", () => {
+				cashX(forceNeg(cost), "farmyard");
 				V.farmyardCages = 1;
+				V.PC.skill.engineering += .1;
 
-				App.UI.DOM.replace(cagesDiv, cages);
-			},
-			null,
-			'',
-			`Costs ${cashFormat(baseCost)}, will incur upkeep costs, and unlocks domestic felines`));
+				refresh();
+			}, [], '', `Costs ${cashFormat(cost)}, will incur upkeep costs, and unlocks domestic felines.`), ['indent']);
 		} else if (V.farmyardCages === 1) {
 			cagesDiv.append(App.UI.DOM.passageLink("Cages", "Farmyard Animals"), ` have been built in one corner of ${V.farmyardName}, and are currently ${FL < 1 ? `empty` : `occupied by ${cats}`}.`);
 
 			if (V.rep > 10000) {
 				App.UI.DOM.appendNewElement("div", cagesDiv, App.UI.DOM.link("Upgrade cages", () => {
-					cashX(forceNeg(upgradedCost), "farmyard");
+					cashX(forceNeg(cost * 2), "farmyard");
 					V.farmyardCages = 2;
+					V.PC.skill.engineering += .1;
 
-					App.UI.DOM.replace(cagesDiv, cages);
-				},
-				null,
-				'',
-				`Costs ${cashFormat(upgradedCost)}, will increase upkeep costs, and unlocks exotic felines`),
-				['indent']);
+					refresh();
+				}, [], '', `Costs ${cashFormat(cost * 2)}, will increase upkeep costs, and unlocks exotic felines.`), ['indent']);
 			} else {
 				App.UI.DOM.appendNewElement("div", cagesDiv, App.UI.DOM.disabledLink("Upgrade cages",
 					[`You must be more reputable to be able to house exotic felines.`]),
@@ -749,27 +620,25 @@ App.Facilities.Farmyard.farmyard = function() {
 	}
 
 	function removeHousing() {
-		removeHousingDiv.classList.add("farmyard-remove");
-
-		const removeHousingPrice = ((V.farmyardKennels + V.farmyardStables + V.farmyardCages) * 5000) * V.upgradeMultiplierArcology;
+		const cost = ((V.farmyardKennels + V.farmyardStables + V.farmyardCages) * 5000) * V.upgradeMultiplierArcology;
 
-		App.UI.DOM.appendNewElement("div", removeHousingDiv, App.UI.DOM.link("Remove the animal housing", () => {
-			V.farmyardKennels = 0;
-			V.farmyardStables = 0;
-			V.farmyardCages = 0;
+		if (V.farmyardKennels || V.farmyardStables || V.farmyardCages) {
+			App.UI.DOM.appendNewElement("div", removeHousingDiv, App.UI.DOM.link("Remove the animal housing", () => {
+				V.farmyardKennels = 0;
+				V.farmyardStables = 0;
+				V.farmyardCages = 0;
 
-			V.farmyardShows = 0;
-			V.farmyardBreeding = 0;
-			V.farmyardRestraints = 0;
+				V.farmyardShows = 0;
+				V.farmyardBreeding = 0;
+				V.farmyardRestraints = 0;
 
-			clearAnimalsPurchased();
-			cashX(forceNeg(removeHousingPrice), "farmyard");
+				clearAnimalsPurchased();
+				cashX(forceNeg(cost), "farmyard");
 
-			App.UI.DOM.replace(removeHousingDiv, removeHousing);
-		},
-		null,
-		'',
-		`Will cost ${cashFormat(removeHousingPrice)}`));
+				refresh();
+			},
+			[], '', `Will cost ${cashFormat(cost)}.`), ['indent']);
+		}
 
 		return removeHousingDiv;
 	}
@@ -783,4 +652,34 @@ App.Facilities.Farmyard.farmyard = function() {
 		V.active.hooved = null;
 		V.active.feline = null;
 	}
+
+	function rename() {
+		renameDiv.append(frag.appendChild(App.Facilities.rename(App.Entity.facilities.farmyard, () => {
+			farmyardNameCaps = capFirstChar(V.farmyardName);
+
+			refresh();
+		})));
+
+		return renameDiv;
+	}
+
+	function slaves() {
+		slavesDiv.append(App.UI.DOM.appendNewElement("div", frag, App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard), 'farmyard-slaves'));
+
+		return slavesDiv;
+	}
+
+	function refresh() {
+		App.UI.DOM.replace(introDiv, intro);
+		App.UI.DOM.replace(expandDiv, expand);
+		App.UI.DOM.replace(menialsDiv, menials);
+		App.UI.DOM.replace(rulesDiv, rules);
+		App.UI.DOM.replace(upgradesDiv, upgrades);
+		App.UI.DOM.replace(kennelsDiv, kennels);
+		App.UI.DOM.replace(stablesDiv, stables);
+		App.UI.DOM.replace(cagesDiv, cages);
+		App.UI.DOM.replace(removeHousingDiv, removeHousing);
+		App.UI.DOM.replace(renameDiv, rename);
+		App.UI.DOM.replace(slavesDiv, slaves);
+	}
 };
diff --git a/src/facilities/farmyard/farmyard.tw b/src/facilities/farmyard/farmyard.tw
deleted file mode 100644
index c7f495ae5e62b3e2b6eb07feb32ee61e6f293d70..0000000000000000000000000000000000000000
--- a/src/facilities/farmyard/farmyard.tw
+++ /dev/null
@@ -1,7 +0,0 @@
-:: Farmyard [nobr jump-to-safe jump-from-safe]
-
-/* TODO: add "plots" of "crops" */
-/* TODO: allow slaves that can't walk to put on shows */
-/* TODO: write placeholders */
-
-<<includeDOM App.Facilities.Farmyard.farmyard()>>
diff --git a/src/gui/mainMenu/AlphaDisclaimer.tw b/src/gui/mainMenu/AlphaDisclaimer.tw
index a911ece80df19776e74e4e23ff5982471fda3f82..0a8d2f9cf61d42b6e21fabcc7c99e37b5094920c 100644
--- a/src/gui/mainMenu/AlphaDisclaimer.tw
+++ b/src/gui/mainMenu/AlphaDisclaimer.tw
@@ -32,6 +32,9 @@
 	<div class="note">
 		version: $ver, mod version: $pmodVer, build: $releaseID<<if App.Version.commitHash>>, commit: <<= App.Version.commitHash>><</if>>
 	</div>
+	<span style="font-weight:Bold"> /* remove me with 4.0.0! */
+		4.0.0 is in alpha release. This means the new player content has minimal implementation.
+	</span>
 	<div id="version">
 		<<link "More version info">>
 			<<replace "#version">>
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index 07f5fd05e1d98c31c62c3dd8365c5684c8e48a81..c01f554a9ad0e6e7b26a903da870fdf129d606c2 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -1078,7 +1078,10 @@ App.UI.artOptions = function() {
 	const el = new DocumentFragment();
 	let options = new App.UI.OptionsGroup();
 
-	App.Events.drawEventArt(el, BaseSlave());
+	const art = App.UI.DOM.appendNewElement("span", el);
+	art.style.position = "relative";
+	art.style.zIndex = "-1";
+	App.Events.drawEventArt(art, BaseSlave());
 
 	options.addOption("Images are", "seeImages")
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
diff --git a/src/interaction/universalRules.js b/src/interaction/universalRules.js
index 8cc36e2042f4db1c1dd8a6085f3ad3dbb67fdcbf..96e0f24a0ee525b9466587a40f27b54eefbda860 100644
--- a/src/interaction/universalRules.js
+++ b/src/interaction/universalRules.js
@@ -78,13 +78,13 @@ App.UI.universalRules = function() {
 		const options = new App.UI.OptionsGroup();
 
 		options.addOption("Slaves keep surnames", "surnamesForbidden")
-			.addValue("Yes", 1).on()
-			.addValue(`No going forward`, 0).off()
+			.addValue("Yes", 0).on()
+			.addValue(`No going forward`, 1).off()
 			.customButton(`No and strip all current surnames`, () => {
 				for (const slave of V.slaves) {
 					slave.slaveSurname = 0;
 				}
-				V.surnamesForbidden = 0;
+				V.surnamesForbidden = 1;
 			}, passage());
 
 		if (V.surnamesForbidden === 0) {
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index c4242bccc77d37461f4ad9351ed6ea5a1581f66c..b9b98c3c964fd62f2662e73f2d0a1bbdfd758151 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -1120,14 +1120,6 @@ if(eventSlave.drugs === "breast injections") {
 			}
 		}
 
-		if (eventSlave.assignment === Job.WHORE) {
-			if (canDoAnal(eventSlave) && (eventSlave.vagina < 0 || canDoVaginal(eventSlave))) {
-				if (eventSlave.devotion < -20 && eventSlave.trust >= -20) {
-					V.RESSevent.push("whore rebellious");
-				}
-			}
-		}
-
 		if (eventSlave.assignment !== Job.QUARTER) {
 			if (isAmputee(eventSlave)) {
 				if (eventSlave.devotion > 20) {
diff --git a/src/js/main.js b/src/js/main.js
index accb599874e0ddcaccefa47d2e195874ae600359..66b976f0875448a8da8fb8f81021601b714ba29e 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -3,14 +3,6 @@
  * @returns {HTMLDivElement}
  */
 App.MainView.useFucktoy = function(slave) {
-	const fragment = document.createDocumentFragment();
-
-	function setEnvironment() {
-		V.AS = slave.ID;
-		V.nextButton = "Back";
-		V.nextLink = passage();
-	}
-
 	const {him, his} = getPronouns(slave);
 
 	const div = document.createElement("div");
@@ -29,37 +21,38 @@ App.MainView.useFucktoy = function(slave) {
 	if (slave.fuckdoll === 0) {
 		div.append(", but for now:");
 
+		const showScene = (passage, ...args) => $(linkDiv).empty().append(App.Interact[passage](slave, ...args));
+
 		const linkArray = [];
 
 		linkArray.push(
-			App.UI.DOM.passageLink(`Use ${his} mouth`, "fLips", setEnvironment),
-			App.UI.DOM.passageLink("Play with " + his + " tits", "fBoobs", setEnvironment)
+			App.UI.DOM.link(`Use ${his} mouth`, showScene, ["fLips"]),
+			App.UI.DOM.link(`Play with ${his} tits`, showScene, ["fBoobs"])
 		);
 
 		if (canDoVaginal(slave)) {
-			linkArray.push(App.UI.DOM.passageLink(`Fuck ${him}`, "fVagina", setEnvironment));
+			linkArray.push(App.UI.DOM.link(`Fuck ${him}`, showScene, ["fVagina"]));
 			if (canDoAnal(slave)) {
-				linkArray.push(App.UI.DOM.passageLink(`Use ${his} holes`, "fButt", setEnvironment));
+				linkArray.push(App.UI.DOM.link(`Use ${his} holes`, showScene, ["fButt"]));
 			}
 		}
 		if (canDoAnal(slave)) {
-			linkArray.push(App.UI.DOM.passageLink(`Fuck ${his} ass`, "fAnus", setEnvironment));
+			linkArray.push(App.UI.DOM.link(`Fuck ${his} ass`, showScene, ["fAnus"]));
 		}
 		if (canDoVaginal(slave) || canDoAnal(slave)) {
 			if (slave.belly >= 300000) {
-				linkArray.push(App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "fBellyFuck", setEnvironment));
+				linkArray.push(App.UI.DOM.link(`Fuck ${him} over ${his} belly`, showScene, ["fBellyFuck"]));
 			}
 		}
 		if (canPenetrate(slave)) {
-			linkArray.push(App.UI.DOM.passageLink(`Ride ${him}`, "fDick", setEnvironment));
+			linkArray.push(App.UI.DOM.link(`Ride ${him}`, showScene, ["fDick"]));
 		}
-		linkArray.push(App.UI.DOM.passageLink(`Abuse ${him}`, "fAbuse", setEnvironment));
+		linkArray.push(App.UI.DOM.link(`Abuse ${him}`, showScene, ["fAbuse"]));
 
-		App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(linkArray), "indent");
+		const linkDiv = App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(linkArray), "indent");
 	} else {
 		div.append(".");
 	}
-	fragment.append(div);
 
 	return div;
 };
@@ -78,38 +71,36 @@ App.MainView.useGuard = function() {
 
 	App.UI.DOM.appendNewElement("span", outerDiv, App.Interact.guardPose(guard), "scene-intro");
 
-	function setEnvironment() {
-		V.AS = guard.ID;
-		V.nextButton = "Back";
-		V.nextLink = passage();
-	}
+	const showScene = (passage, ...args) => $(linkDiv).empty().append(App.Interact[passage](guard, ...args));
 
 	const {him, his} = getPronouns(guard);
 	const linkArray = [];
 
 	linkArray.push(
-		App.UI.DOM.passageLink(`Use ${his} mouth`, "fLips", setEnvironment),
-		App.UI.DOM.passageLink(`Play with ${his} tits`, "fBoobs", setEnvironment)
+		App.UI.DOM.link(`Use ${his} mouth`, showScene, ["fLips"]),
+		App.UI.DOM.link(`Play with ${his} tits`, showScene, ["fBoobs"])
 	);
 
 	if (canDoVaginal(guard)) {
-		linkArray.push(App.UI.DOM.passageLink(`Fuck ${him}`, "fVagina", setEnvironment));
+		linkArray.push(App.UI.DOM.link(`Fuck ${him}`, showScene, ["fVagina"]));
 		if (canDoAnal(guard)) {
-			linkArray.push(App.UI.DOM.passageLink(`Use ${his} holes`, "fButt", setEnvironment));
+			linkArray.push(App.UI.DOM.link(`Use ${his} holes`, showScene, ["fButt"]));
 		}
+	}
+	if (canDoAnal(guard)) {
+		linkArray.push(App.UI.DOM.link(`Fuck ${his} ass`, showScene, ["fAnus"]));
+	}
+	if (canDoVaginal(guard) || canDoAnal(guard)) {
 		if (guard.belly >= 300000) {
-			linkArray.push(App.UI.DOM.passageLink(`Fuck ${him} over ${his} belly`, "fBellyFuck", setEnvironment));
+			linkArray.push(App.UI.DOM.link(`Fuck ${him} over ${his} belly`, showScene, ["fBellyFuck"]));
 		}
 	}
 
 	if (canPenetrate(guard)) {
-		linkArray.push(App.UI.DOM.passageLink(`Ride ${him}`, "fDick", setEnvironment));
-	}
-	if (canDoAnal(guard)) {
-		linkArray.push(App.UI.DOM.passageLink(`Fuck ${his} ass`, "fAnus", setEnvironment));
+		linkArray.push(App.UI.DOM.link(`Ride ${him}`, showScene, ["fDick"]));
 	}
 	linkArray.push(App.UI.DOM.passageLink(`Abuse ${him}`, "Gameover", () => { V.gameover = "idiot ball"; }));
-	App.UI.DOM.appendNewElement("div", outerDiv, App.UI.DOM.generateLinksStrip(linkArray), "indent");
+	const linkDiv = App.UI.DOM.appendNewElement("div", outerDiv, App.UI.DOM.generateLinksStrip(linkArray), "indent");
 
 	return outerDiv;
 };
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index fd9c58062c802844409818e16f4936a31eed1edf..8ca229103b20d9a2c1958fd9c8bddfa62e7a6e39 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -900,6 +900,14 @@ globalThis.isHindered = function(slave) {
 	} else if (slave.muscles < -30) {
 		return true;
 	}
+	// player exclusives
+	if (slave.ID === -1) {
+		if (onBedRest(slave)) {
+			return true;
+		} else if (slave.criticalDamage !== 0) {
+			return true;
+		}
+	}
 	return false;
 };
 
diff --git a/src/js/utilsPC.js b/src/js/utilsPC.js
index 845579e23f79e57db65befdaf0cb518180b905c7..905c6c460f3b62101e772ec62bbea6df2ce17b44 100644
--- a/src/js/utilsPC.js
+++ b/src/js/utilsPC.js
@@ -627,6 +627,8 @@ globalThis.onBedRest = function(actor) {
 	// consider player health and injury in the future!
 	if (!actor) {
 		return null;
+	} else if (actor.health.shortDamage > 0) {
+		return true;
 	} else if (!canMove(actor)) {
 		return true;
 	} else if (actor.preg > actor.pregData.normalBirth / 1.33 && actor.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2 && ft.age >= 20)) {
diff --git a/src/npc/descriptions/style/clothing.js b/src/npc/descriptions/style/clothing.js
index 7c8b2bdbe611251e4a6065c5748b4a519a09dd67..8783390414d6d6f5514dd07226297c9a19c01046 100644
--- a/src/npc/descriptions/style/clothing.js
+++ b/src/npc/descriptions/style/clothing.js
@@ -957,7 +957,7 @@ App.Desc.clothing = function(slave, {market, eventDescription} = {}) {
 				}
 				r.push(`built-in corset and an elegant, layered skirt that evokes the feeling of a flower ready to blossom.`);
 				if (hasAnyLegs(slave)) {
-					r.push(`${He} is wearing`);
+					r.push(`${He} is`);
 					r.push(App.Desc.footwear(slave));
 				}
 				break;
diff --git a/src/npc/descriptions/style/footwear.js b/src/npc/descriptions/style/footwear.js
index 619b1405f2b7ded7e529669b47e545eab5158a74..d767d0964e3928554535aff1e7c33cda4f26abc3 100644
--- a/src/npc/descriptions/style/footwear.js
+++ b/src/npc/descriptions/style/footwear.js
@@ -4371,66 +4371,62 @@ App.Desc.footwear = function(slave) {
 				switch (slave.shoes) {
 					case "flats":
 						if (bothFeet) {
-							r.push(`an elegant pair of dancing slippers.`);
+							r.push(`wearing an elegant pair of dancing slippers.`);
 						} else {
-							r.push(`an elegant dancing slipper.`);
+							r.push(`wearing an elegant dancing slipper.`);
 						}
 						break;
 					case "boots":
 						if (bothFeet) {
-							r.push(`an elegant pair of heeled booties.`);
+							r.push(`wearing an elegant pair of heeled booties.`);
 						} else {
-							r.push(`an elegant heeled boot.`);
+							r.push(`wearing an elegant heeled boot.`);
 						}
 						break;
 					case "heels":
 						if (bothFeet) {
-							r.push(`an elegant pair of heels.`);
+							r.push(`wearing an elegant pair of heels.`);
 						} else {
-							r.push(`an elegant heel.`);
+							r.push(`wearing an elegant heel.`);
 						}
 						break;
 					case "pumps":
 						if (bothFeet) {
-							r.push(`an elegant pair of pumps.`);
+							r.push(`wearing an elegant pair of pumps.`);
 						} else {
-							r.push(`an elegant heel.`);
+							r.push(`wearing an elegant heel.`);
 						}
 						break;
 					case "extreme heels":
 						if (bothFeet) {
-							r.push(`an elegant pair of excruciatingly high heels that test ${his} grace.`);
+							r.push(`wearing an elegant pair of excruciatingly high heels that test ${his} grace.`);
 						} else {
-							r.push(`an elegant, excruciatingly high heel that makes it impossible for ${him} to stand.`);
+							r.push(`wearing an elegant, excruciatingly high heel that makes it impossible for ${him} to stand.`);
 						}
 						break;
 					case "platform shoes":
 						if (bothFeet) {
-							r.push(`a fragile pair of platform shoes.`);
+							r.push(`wearing a fragile pair of platform shoes.`);
 						} else {
-							r.push(`a fragile platform shoe.`);
+							r.push(`wearing a fragile platform shoe.`);
 						}
 						break;
 					case "platform heels":
 						if (bothFeet) {
-							r.push(`a fragile pair of platform heels.`);
+							r.push(`wearing a fragile pair of platform heels.`);
 						} else {
-							r.push(`a fragile platform heel.`);
+							r.push(`wearing a fragile platform heel.`);
 						}
 						break;
 					case "extreme platform heels":
 						if (bothFeet) {
-							r.push(`a fragile pair of excruciatingly high platform heels that test ${his} focus with each step.`);
+							r.push(`wearing a fragile pair of excruciatingly high platform heels that test ${his} focus with each step.`);
 						} else {
-							r.push(`a fragile, excruciatingly high platform heel that makes it impossible for ${him} to stand.`);
+							r.push(`wearing a fragile, excruciatingly high platform heel that makes it impossible for ${him} to stand.`);
 						}
 						break;
 					default:
-						if (bothFeet) {
-							r.push(`elegantly bare feet.`);
-						} else {
-							r.push(`an elegant bare feet.`);
-						}
+						r.push(`elegantly bare footed.`);
 				}
 				break;
 			case "a bimbo outfit":
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 1b871d618282454fda2dd414a4a9967f08b33f0b..01e098ca988324918d831d3360566d3a423af619 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -3114,6 +3114,60 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 					lineBreak();
 				}
 
+				if (slave.boobs > 300 && slave.lactation > 0) {
+					choice({
+						linkName: `Milk ${him}`,
+						result(slave) {
+							const r = [];
+							r.push(`You`);
+							if (tankBorn) {
+								r.push(`pull the curious ${desc}`);
+							} else {
+								if (slave.devotion > 20 || slave.trust < -20) {
+									r.push(`instruct the obedient ${desc}`);
+								} else {
+									r.push(`force the reluctant ${desc}`);
+								}
+								r.push(`to sit`);
+							}
+							r.push(`atop your desk in front of you and present ${his} chest. After a quick look, you extend an idle hand and begin to fondle ${his}`);
+							if (slave.boobs > 2000) {
+								r.push(`massive milky tits,`);
+							} else if (slave.boobs > 400) {
+								r.push(`healthy milky breasts,`);
+							} else {
+								r.push(`cute little milky boobs,`);
+							}
+							r.push(`continuing your work with your other hand. You quickly focus your fiddling on ${his} ${slave.nipples} nipples, the stimulation`);
+							if (slave.nipples === "fuckable") {
+								if (slave.devotion > 20) {
+									r.push(`rapidly engorging them around your fingers.`);
+								} else {
+									r.push(`slowly engorging them around your fingers despite ${his} feelings.`);
+								}
+							} else {
+								r.push(`bringing them`);
+								if (slave.devotion > 20) {
+									r.push(`quickly erect.`);
+								} else {
+									r.push(`slowly erect despite ${his} feelings.`);
+								}
+							}
+							r.push(`Once you feel satisfied with the state of those two bumps, you move to tug and squeeze ${his} breasts in a much different way, expertly putting pressure as to draw out the cream held within those swollen bags. You take your time to work as much out as you can, both for your own enjoyment and to judge your slave's character better.`);
+							if (slave.devotion > 20) {
+								r.push(`${He} easily accepts your orders and commands, being devoted enough to not make any fuss, especially for something as simple as this.`);
+								slave.devotion += 4;
+							} else {
+								r.push(`${He} expects something worse to happen immediately, and slowly relaxes when ${he} realizes that ${he}'s nothing more than your desktop stress relief toy, at least for now. ${He} experiences the usual effects of nipple play, but seems <span class="trust dec">somewhat frightened</span> to be dehumanized so thoroughly.`);
+								slave.trust -= 4;
+							}
+							return r.join(" ");
+						}
+					});
+					lineBreak();
+				}
+
+
 				choice({
 					linkName: `Tease ${his} nipples`,
 					result(slave) {
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index befb2e66c94e4b8f9bc05aa7ca1b03bc6fecdd58..dd4173e855497fa45df1def71a10920719d7c37c 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -312,7 +312,7 @@ App.Entity.PlayerState = class PlayerState {
 			 * * 90  -  : Unnaturally healthy
 			 */
 			condition: 0,
-			/** your short term health damage */
+			/** your short term health damage, used to determine how long you are in recovery */
 			shortDamage: 0,
 			/** your long term health damage */
 			longDamage: 0,
@@ -609,7 +609,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * 70000-89999 - door-crowding
 		 * * 90000-100000 - door-jamming
 		 */
-		this.boobs = 100;
+		this.boobs = 200;
 		/** breast engorgement from unmilked tits */
 		this.boobsMilk = 0;
 		/**
@@ -1879,13 +1879,13 @@ App.Entity.PlayerState = class PlayerState {
 		/** Have you gone through female puberty.
 		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
-		this.pubertyXX = 1;
+		this.pubertyXX = 0;
 		/** Target .physicalAge for male puberty to occur. */
 		this.pubertyAgeXY = 13;
 		/** Have you slave gone through male puberty.
 		 * @type {FC.Bool}
 		 * 0: no; 1: yes */
-		this.pubertyXY = 1;
+		this.pubertyXY = 0;
 		/**
 		 * scar
 		 * Sub-object:
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index e497162eecb3ad64120416d70cf4219637194ca4..75812a26fbf77c4f6bcc4004e8c867f7a5a7b249 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -46,9 +46,6 @@
 /*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" "bonded love" "breast expansion blues" "confident tanning" "devoted exhibition" "devoted lotion" "desperate null" "devoted nympho" "extreme aphrodisiacs" "fearful balls" "fucktoy tribbing" "gaped asshole" "happy dance" "heavy piercing" "huge naturals" "huge tits" "hugely pregnant" "ignorant horny" "implant inspection" "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 dick huge" "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. */
-	<<set $activeSlave.clothes = "restrictive latex">>
 <<case "inconvenient labia">>
 	/* "pulling down the compression shorts $he was wearing" */
 	<<if isItemAccessible.entry("sport shorts", "clothes")>>
@@ -1665,14 +1662,6 @@ $He constantly passes by your desk as you work, going back and forth between the
 <</if>>
 gingerly, supporting $his udders with <<if hasBothArms($activeSlave)>>both hands<<else>>$his hand<</if>><<if $activeSlave.belly >= 10000>> and $his _belly <<if $activeSlave.belly >= 3000>>pregnant<<else>>rounded<</if>> belly<</if>>, <<if $activeSlave.nipples == "inverted">>wincing<<else>>dribbling a little milk<</if>> as $he goes. The other way, $he has a distinctly relieved expression and $his breasts are much saggier.
 
-<<case "whore rebellious">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> is kicked out of bed early in the morning. $He's not yet obedient, but $he has to earn $his keep anyway. This means selling $his body, or in $his particular case, having $his unwilling body sold. $He knows the score and allows $himself to be stuffed into a special latex public whore suit. $He's learned the hard way that resisting being suited up just means $he'll be painfully punished before being suited up.
-<br><br>
-The suit is quite special. It is made of thick, durable latex with temperature regulation and anchor points for restraint. It is specially crafted to be able to accommodate its wearer's tits, belly,<<if $seeDicks != 0>> dick, balls,<</if>> and rear, however large. It has a hole at $his mouth that holds $his jaws well open, with a plug to fill it completely when not in use. $He breathes through a port at $his nose that muffles all noise, in and out.<<if ($activeSlave.dick > 0)>> $His cock is neglected inside the latex, with no means of access.<</if>><<if ($activeSlave.vagina != -1)>> There's a hole over $his pussy, of course.<</if>> Finally, there's a hole over $his anus.
-<br><br>
-$He will spend the day restrained in public, with your other slaves periodically stopping by to hydrate $him and wash out $his holes.
-
 <<case "millenary">>
 
 Late one night, <<= App.UI.slaveDescriptionDialog($activeSlave)>> comes to see you. Strangely, several of your other slaves are stealing glances at $him as $he does. $He seems oddly proud of $himself. Asked why, $he says, "It'<<s>> my millenary, <<Master>>. The arcology has logged me getting fucked <<= num(999)>> time<<s>>." The other slaves obviously view it as significant, too.
@@ -9879,120 +9868,6 @@ $He cranes $his neck, glancing over $his shoulder to give you a pleading look.
 	<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
 <</if>>
 
-<<case "whore rebellious">>
-
-<<link "Increase $his assignment to 24 hours a day">>
-	<<replace "#result">>
-		You give $activeSlave.slaveName no indication that $his public use assignment is about to change. Late in the day, when $his shift would normally end, another of your slaves simply maintains $him as usual and then leaves $him be. $activeSlave.slaveName is so deprived of any way to tell time that $he doesn't realize $he's been left for some time. The first indication $he gets that something's different is when liquid food is squirted down $his throat the next morning. When $he's finally stripped out of the suit at the end of the week, $he's pale and wan and $his holes are puffy and red. @@.health.dec;$His health was damaged.@@ However, $his permanent presence became quite noted. @@.green;Your reputation has increased.@@ And when $he's out of the suit, $he instantly begs you to allow $him to do anything to save $himself from more of that. @@.gold;$His fear of you has increased.@@
-	<</replace>>
-	<<run repX(500, "event", $activeSlave), healthDamage($activeSlave, 10)>>
-	<<set $activeSlave.trust -= 10>>
-	<<if canDoVaginal($activeSlave)>>
-		<<if canDoAnal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 10)>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 10)>>
-			<<run seX($activeSlave, "oral", "public", "penetrative", 10)>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 2, -2)>>
-			<</if>>
-		<<else>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 20)>>
-			<<run seX($activeSlave, "oral", "public", "penetrative", 10)>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 25, 0, -2)>>
-			<</if>>
-		<</if>>
-	<<else>>
-		<<run seX($activeSlave, "anal", "public", "penetrative", 20)>>
-		<<run seX($activeSlave, "oral", "public", "penetrative", 10)>>
-		<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-			<<= knockMeUp($activeSlave, 20, 1, -2)>>
-		<</if>>
-	<</if>>
-	<<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-		$His patrons, however, enjoyed claiming @@.lime;both $his virginity and anal cherry.@@
-		<<set $activeSlave.anus++, $activeSlave.vagina++>>
-	<<elseif $activeSlave.vagina == 0>>
-		$His patrons, however, enjoyed claiming @@.lime;$his virginity.@@
-		<<set $activeSlave.vagina++>>
-	<<elseif $activeSlave.anus == 0>>
-		$His patrons, however, enjoyed claiming @@.lime;$his anal cherry.@@
-		<<set $activeSlave.anus++>>
-	<</if>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<br><<link "Take the first and last every day">>
-	<<replace "#result">>
-		When $activeSlave.slaveName feels a cock entering $his mouth right after $he's suited up, $he knows it's you and wriggles as best $he can in the suit. It doesn't help much, and $his struggles don't prevent you from moving from $his mouth to $his ass, either. At the end of the day, on the other hand, the <<if $girl == "girl">>fe<</if>>male-shaped latex form is completely still and quiescent as you <<if $PC.dick == 0>>use a couple of fingers to brutally molest<<else>>molest<</if>> each of its holes. It takes viciously hard anal penetration to elicit any response at all, and even then, it's just the slightest hint of a moan. @@.gold;$His fear of you has increased.@@
-	<</replace>>
-	<<set $activeSlave.trust -= 5>>
-	<<if canDoVaginal($activeSlave)>>
-		<<if canDoAnal($activeSlave)>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 6)>>
-			<<run seX($activeSlave, "anal", "public", "penetrative", 6)>>
-			<<run seX($activeSlave, "oral", "public", "penetrative", 6)>>
-			<<if canImpreg($activeSlave, $PC)>>
-				<<= knockMeUp($activeSlave, 5, 2, -1)>>
-			<</if>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 10, 2, -2)>>
-			<</if>>
-		<<else>>
-			<<run seX($activeSlave, "vaginal", "public", "penetrative", 9)>>
-			<<run seX($activeSlave, "oral", "public", "penetrative", 9)>>
-			<<if canImpreg($activeSlave, $PC)>>
-				<<= knockMeUp($activeSlave, 10, 0, -1)>>
-			<</if>>
-			<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-				<<= knockMeUp($activeSlave, 15, 0, -2)>>
-			<</if>>
-		<</if>>
-	<<else>>
-		<<run seX($activeSlave, "anal", "public", "penetrative", 9)>>
-		<<run seX($activeSlave, "oral", "public", "penetrative", 9)>>
-		<<if canImpreg($activeSlave, $PC)>>
-			<<= knockMeUp($activeSlave, 5, 1, -1)>>
-		<</if>>
-		<<if canGetPregnant($activeSlave) && $activeSlave.eggType == "human">>
-			<<= knockMeUp($activeSlave, 10, 1, -2)>>
-		<</if>>
-	<</if>>
-	<<if $activeSlave.vagina == 0 && $activeSlave.anus == 0>>
-		You made sure to claim @@.lime;both $his virginity and anal cherry@@ before anyone else could.
-		<<set $activeSlave.anus++, $activeSlave.vagina++>>
-	<<elseif $activeSlave.vagina == 0>>
-		You made sure to claim @@.lime;$his virginity@@ before anyone else could.
-		<<set $activeSlave.vagina++>>
-	<<elseif $activeSlave.anus == 0>>
-		You made sure to claim @@.lime;$his anal cherry@@ before anyone else could.
-		<<set $activeSlave.anus++>>
-	<</if>>
-<</link>><<if ($activeSlave.anus == 0 && canDoAnal($activeSlave)) || ($activeSlave.vagina == 0 && canDoVaginal($activeSlave))>> //This option will take $his virginity//<</if>>
-<<if $arcade > 0>>
-	<br><<link "Sentence $him to a month in the arcade">>
-		<<replace "#result">>
-			$activeSlave.slaveName screams and begs when $he realizes what $his punishment is, but you are obdurate.
-			<<if ($activeSlave.muscles > 30)>>
-				$His powerful form has to be sedated for immurement in the arcade.
-			<<elseif ($activeSlave.weight >= 190)>>
-				$He is so massively fat that immuring $him in the arcade is a struggle, even when $he isn't trying to.
-			<<elseif $activeSlave.belly >= 120000>>
-				$He is so enormously gravid that immuring $him in the arcade is a hassle, even though $his _belly middle limits $his ability to struggle.
-			<<elseif ($activeSlave.weight >= -10)>>
-				$His desperate struggles make immuring $him in the arcade difficult.
-			<<elseif $activeSlave.belly >= 1500>>
-				$His <<if $activeSlave.bellyPreg >= 3000>>pregnant<<else>>_belly<</if>> body makes it slightly difficult to fit $him properly into the restraints for immurement in the arcade.
-			<<elseif $activeSlave.muscles < -15>>
-				$His weak body makes immuring $him in the arcade pathetically easy.
-			<<else>>
-				$His thin form makes immuring $him in the arcade pathetically easy.
-			<</if>>
-			After $he's properly confined, the only sign of $his discomfiture is a slight movement of $his butt as $he wriggles desperately against $his restraints.
-			<<= assignJob($activeSlave, "be confined in the arcade")>>
-			<<set $activeSlave.sentence = 4>>
-		<</replace>>
-	<</link>>
-<</if>>
-
 <<case "millenary">>
 
 <<if canDoAnal($activeSlave) || canDoVaginal($activeSlave)>>