diff --git a/css/general/formatting.css b/css/general/formatting.css
index 9f08b1b2ffd3bd6c211342c7320664f6af2d9c9f..75d81a5e152118f24a8923f196ada5cdf7929453 100644
--- a/css/general/formatting.css
+++ b/css/general/formatting.css
@@ -95,3 +95,7 @@ dd {
 dt::after {
     content: ":";
 }
+
+.h1 {
+    font-size: 2em;
+}
diff --git a/css/general/layout.css b/css/general/layout.css
index 1baba2d63bfaa71ee394f069fb2278d4cf5b6a1c..73ff33591685d87187339d0524a6c53356a62d31 100644
--- a/css/general/layout.css
+++ b/css/general/layout.css
@@ -60,8 +60,8 @@ div.grid-2columns-auto {
 }
 
 .margin-x {
-    margin-left: 1em;
-    margin-right: 1em;
+    margin-left: 2em;
+    margin-right: 2em;
 }
 
 .margin-y {
@@ -75,3 +75,11 @@ div.grid-2columns-auto {
     margin-top: 1em;
     margin-bottom: 1em;
 }
+
+.space-evenly {
+    justify-content: space-evenly;
+}
+
+.absolute {
+    position: absolute;
+}
diff --git a/devTools/types/FC/RA.d.ts b/devTools/types/FC/RA.d.ts
index 3c1d84a173ded8e61137dfff5ccfd949a75cf4a7..f9816fcdafde765781fc6c95f684294d9e31a7cc 100644
--- a/devTools/types/FC/RA.d.ts
+++ b/devTools/types/FC/RA.d.ts
@@ -84,8 +84,8 @@ declare namespace FC {
 			clothes: FC.Clothes;
 			collar: string;
 			faceAccessory: string;
-			mouthAccessory: string;
-			shoes: string;
+			mouthAccessory: WithNone<MouthAccessory>;
+			shoes: WithNone<Shoes>;
 			armAccessory: string;
 			legAccessory: string;
 			chastityVagina: number;
diff --git a/devTools/types/FC/facilities.d.ts b/devTools/types/FC/facilities.d.ts
index 628dca392e2d0b768627f240bca0890b75dd1782..69ea41addb1bd05cd805fdedb7f37cb601a3479d 100644
--- a/devTools/types/FC/facilities.d.ts
+++ b/devTools/types/FC/facilities.d.ts
@@ -90,9 +90,9 @@ declare namespace FC {
 			 * Defaults to `"${facilityName} can support ${possible} slaves. It currently has ${current} slaves."`.
 			 */
 			desc?: string;
-			/**
-			 * Any link to remove all slaves from the facility, if not the default.
-			 */
+			/** The maximum number of times the facility can be expanded, if any. */
+			maximum?: number;
+			/** Any link to remove all slaves from the facility, if not the default. */
 			removeAll?: HTMLDivElement;
 			/**
 			 * The assignment to assign the facility's manager to upon decommission.
diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts
index b4565ff0d7a35f68058b3219f4a8b8115c5130d8..b7fdcf8e73f9e11ae975c6761a44f4350c5a167d 100644
--- a/devTools/types/FC/human.d.ts
+++ b/devTools/types/FC/human.d.ts
@@ -241,6 +241,8 @@ declare global {
 			"stretch pants and a crop-top" | "striped panties" | "striped underwear" | "uncomfortable straps" |	"Western clothing";
 		type HairStyle = "afro"| "braided" | "cornrows" | "curled" | "dreadlocks" | "eary" | "bun" | "messy bun" | "ponytail" | "tails" |
 			"drills" | "luxurious" | "messy" | "neat" | "permed" | "bangs" | "hime" | "strip" | "up" | "shaved" | "trimmed" | "buzzcut" | "bald" | "undercut";
+		type Shoes = "heels" | "pumps" | "extreme heels" | "boots" | "flats" | "platform heels" | "extreme heels" | "extreme platform heels" | "platform shoes";
+		type MouthAccessory = "dildo gag" | "massive dildo gag" | "ball gag" | "bit gag" | "ring gag";
 		type Diet = "healthy" | "restricted" | "corrective" | "muscle building" | "fattening" | "slimming" | "XX" | "XY" | "XXY" |
 			"cum production" | "cleansing" | "fertility" | "high caloric";
 		type Drug = "no drugs" |
diff --git a/js/003-data/clothes/001-slaveWearData.js b/js/003-data/clothes/001-slaveWearData.js
index 5fdaedc70f5c0fe38be948e5d6dbd4eb87d25aa9..a5a64627b615e6ffb62f57a38bebbd9caf94c188 100644
--- a/js/003-data/clothes/001-slaveWearData.js
+++ b/js/003-data/clothes/001-slaveWearData.js
@@ -1123,42 +1123,6 @@ App.Data.slaveWear = {
 		],
 	]),
 
-	mouthAccessory: new Map([
-		["ball gag",
-			{
-				name: "Ball gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["bit gag",
-			{
-				name: "Bit gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["ring gag",
-			{
-				name: "Ring gag",
-				note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
-			}
-		],
-		["massive dildo gag",
-			{
-				name: "Massive dildo gag",
-				get requirements() {
-					return V.boughtItem.toys.gags === 1;
-				},
-				note: "Increases oral skill up to a point and causes fear for disobedient slaves."
-			}
-		],
-		["dildo gag",
-			{
-				name: "Dildo gag",
-				note: "Increases oral skill up to a point and causes fear for disobedient slaves."
-			}
-		],
-	]),
-
 	vaginalAttachment: new Map([
 		["none", {name: "None"}],
 		["vibrator",
@@ -1244,6 +1208,51 @@ App.Data.slaveWear = {
 
 	]),
 };
+
+/**
+ * @typedef {object} mouthAccessory
+ * @property {string} name
+ * @property {boolean} [requirements]
+ * @property {string} [note]
+ */
+
+/** @type {Map<FC.MouthAccessory, mouthAccessory>} */
+App.Data.mouthAccessory = new Map([
+	["ball gag",
+		{
+			name: "Ball gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["bit gag",
+		{
+			name: "Bit gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["ring gag",
+		{
+			name: "Ring gag",
+			note: "Increases fear and devotion for disobedient slaves, submissives and nymphos also enjoy wearing one."
+		}
+	],
+	["massive dildo gag",
+		{
+			name: "Massive dildo gag",
+			get requirements() {
+				return V.boughtItem.toys.gags === 1;
+			},
+			note: "Increases oral skill up to a point and causes fear for disobedient slaves."
+		}
+	],
+	["dildo gag",
+		{
+			name: "Dildo gag",
+			note: "Increases oral skill up to a point and causes fear for disobedient slaves."
+		}
+	],
+]);
+
 /**
  * @typedef {object} slaveShoes
  * @property {string} name
@@ -1255,7 +1264,7 @@ App.Data.slaveWear = {
  */
 
 /**
- * @type {Map<string, slaveShoes>} slaveShoesCategory
+ * @type {Map<FC.Shoes, slaveShoes>} slaveShoesCategory
  */
 App.Data.shoes = new Map([ // TODO: add lift property
 	["none",
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 01567d806b7000cc2829c817baf782bd09691811..45bf1590287bfb643e7f394011cf4953e99332bc 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -617,7 +617,7 @@ App.Data.resetOnNGPlus = {
 	masterSuite: 0,
 	masterSuiteName: "the Master Suite",
 
-	// Nursery Subsection
+	// Nursery
 	/** Counts the number of children the nursery can support */
 	nursery: 0,
 	/** Counts the number of nannies the nursery can support */
@@ -637,6 +637,8 @@ App.Data.resetOnNGPlus = {
 	nurseryMusclesSetting: 0,
 	nurseryHormonesSetting: 0,
 	nurseryName: "the Nursery",
+	nurserySex: false,
+	MatronIgnoresFlaws: false,
 	/** Array of children in the Nursery */
 	cribs: [],
 	cribsIndices: {},
diff --git a/js/003-data/slaveProstheticsData.js b/js/003-data/slaveProstheticsData.js
index 80b89c1a22a502648eaed8ba15b60c75a3faf90c..1b92e734a635fb6885c715e34199eb304fea3aed 100644
--- a/js/003-data/slaveProstheticsData.js
+++ b/js/003-data/slaveProstheticsData.js
@@ -4,8 +4,8 @@
  * @type {FC.prostheticID[]}
  */
 App.Data.prostheticIDs =
-	["interfaceP1", "interfaceP2", "basicL", "sexL", "beautyL", "combatL", "cyberneticL", "ocular", "cochlear",
-		"electrolarynx", "interfaceTail", "modT", "sexT", "combatT", "erectile"];
+	["interfaceP1", "interfaceP2", "basicL", "sexL", "beautyL", "combatL", "felineL", "canineL", "cyberneticL", "ocular", "cochlear",
+		"electrolarynx", "interfaceTail", "modT", "sexT", "combatT1", "combatT2", "erectile", "interfaceBack", "modW", "flightW", "sexA", "combatW", "combatA1", "CombatA2"];
 
 /**
  * @typedef {object} prosthetics
@@ -79,6 +79,38 @@ App.Data.prosthetics = {
 		level: 3,
 		costs: 25000
 	},
+	felineL: {
+		name: "set of quadruped feline limbs",
+		adjust: 60,
+		craft: 70,
+		research: 140,
+		level: 2,
+		costs: 20000
+	},
+	canineL: {
+		name: "set of quadruped canine limbs",
+		adjust: 60,
+		craft: 80,
+		research: 140,
+		level: 2,
+		costs: 15000
+	},
+	felineCL: {
+		name: "set of feline combat limbs",
+		adjust: 100,
+		craft: 80,
+		research: 180,
+		level: 2,
+		costs: 15000
+	},
+	canineCL: {
+		name: "set of canine combat limbs",
+		adjust: 100,
+		craft: 80,
+		research: 180,
+		level: 2,
+		costs: 20000
+	},
 	ocular: {
 		name: "ocular implant",
 		adjust: 60,
@@ -119,7 +151,7 @@ App.Data.prosthetics = {
 		level: 1,
 		costs: 5000
 	},
-	combatT: {
+	combatT1: {
 		name: "combat tail",
 		adjust: 70,
 		craft: 70,
@@ -127,6 +159,14 @@ App.Data.prosthetics = {
 		level: 2,
 		costs: 15000
 	},
+	combatT2: {
+		name: `combat tail, type "Stinger"`,
+		adjust: 70,
+		craft: 70,
+		research: 140,
+		level: 3,
+		costs: 15000
+	},
 	sexT: {
 		name: "pleasure tail",
 		adjust: 60,
@@ -142,6 +182,62 @@ App.Data.prosthetics = {
 		research: 100,
 		level: 1,
 		costs: 7000
+	},
+	interfaceBack: {
+		name: "prosthetic back interface",
+		adjust: 100,
+		craft: 120,
+		research: 240,
+		level: 2,
+		costs: 10000
+	},
+	modW: {
+		name: "modular pair of wings",
+		adjust: 80,
+		craft: 80,
+		research: 120,
+		level: 2,
+		costs: 10000
+	},
+	flightW: {
+		name: "pair of flight capable wings",
+		adjust: 120,
+		craft: 120,
+		research: 240,
+		level: 2,
+		costs: 20000
+	},
+	sexA: {
+		name: "set of pleasure appendages",
+		adjust: 120,
+		craft: 120,
+		research: 240,
+		level: 2,
+		costs: 20000
+	},
+	combatW: {
+		name: "pair of combat wings",
+		adjust: 140,
+		craft: 140,
+		research: 280,
+		level: 3,
+		costs: 30000
+	},
+	combatA1: {
+		name: `set of combat appendages, type "Arachnid"`,
+		adjust: 140,
+		craft: 140,
+		research: 280,
+		level: 3,
+		costs: 30000
+	},
+	combatA2: {
+		name: `set of combat appendages, type "Kraken"`,
+		adjust: 140,
+		craft: 140,
+		research: 280,
+		level: 3,
+		costs: 30000
 	}
 };
 
@@ -149,17 +245,48 @@ App.Data.prosthetics = {
  * @type {Map<FC.TailShape, {animal: string, desc: string}>}
  */
 App.Data.modTails = new Map([
-	["neko", {animal: "Cat", desc: "a long, slender cat tail"}],
-	["inu", {animal: "Dog", desc: "a bushy dog tail"}],
-	["kit", {animal: "Fox", desc: "a soft, fluffy fox tail"}],
-	["kitsune", {animal: "Kitsune", desc: "three incredibly soft, fluffy fox tails"}],
-	["tanuki", {animal: "Tanuki", desc: "a long, fluffy tanuki tail"}],
-	["ushi", {animal: "Cow", desc: "a long cow tail"}],
-	["usagi", {animal: "Rabbit", desc: "a short rabbit tail"}],
-	["risu", {animal: "Squirrel", desc: "a large squirrel tail"}],
-	["uma", {animal: "Horse", desc: "a long horse tail"}]
+	["cat", {animal: "Cat", desc: "a long, slender cat tail"}],
+	["leopard", {animal: "Leopard", desc: "a long, fluffy leopard tail"}],
+	["tiger", {animal: "Tiger", desc: "a long, fluffy tiger tail"}],
+	["jaguar", {animal: "Jaguar", desc: "a long, fluffy jaguar tail"}],
+	["cheeta", {animal: "Cheeta", desc: "a long, slender cheeta tail"}],
+	["dog", {animal: "Dog", desc: "a bushy dog tail"}],
+	["wolf", {animal: "Wolf", desc: "a long and fluffy wolf tail"}],
+	["jackal", {animal: "Jackal", desc: "a bushy jackal tail"}],
+	["fox", {animal: "Fox", desc: "a soft, fluffy fox tail"}],
+	["kitsune", {animal: "Kitsune", desc: "nine incredibly soft, fluffy fox tails"}],
+	["raccoon", {animal: "Raccoon", desc: "a long, fluffy raccoon tail"}],
+	["rabbit", {animal: "Rabbit", desc: "a short rabbit tail"}],
+	["squirell", {animal: "Squirrel", desc: "a large squirrel tail"}],
+	["horse", {animal: "Horse", desc: "a long horse tail"}],
+	["bird", {animal: "Bird", desc: "a bundle of tail feathers"}],
+	["phoenix", {animal: "Phoenix", desc: "a magnificent bundle of luminescent tail feathers"}],
+	["peacock", {animal: "Peacock", desc: "a gorgeous bundle of peacock tail feathers"}],
+	["raven", {animal: "Raven", desc: "a bundle of crow tail feathers"}],
+	["swan", {animal: "Swan", desc: "a smal bundle of short swan tail feathers"}],
+	["sheep", {animal: "Sheep", desc: "a short, woolly sheeps tail"}],
+	["cow", {animal: "Cow", desc: "a long cow tail"}],
+	["gazelle", {animal: "Gazelle", desc: "a short, silky gazelle tail"}],
+	["deer", {animal: "Deer", desc: "a short deer tail"}],
+	["succubus", {animal: "Succubus", desc: "a long, slender succubus tail"}],
+	["dragon", {animal: "Dragon", desc: "a long, thick dragon tail"}]
 ]);
 
+App.Data.modWings = new Map([
+	["angel", {animal: "Angel", desc: "a pair of elegant angelic wings"}],
+	["seraph", {animal: "Seraph", desc: "three pairs of majestic-looking angels wings"}],
+	["demon", {animal: "Demon", desc: "a pair of sexy and sleek demonic wings"}],
+	["dragon", {animal: "Dragon", desc: "a pair of imposing draconic wings"}],
+	["phoenix", {animal: "Phoenix", desc: "a pair of magnificent, luminiscent phoenix wings"}],
+	["bird", {animal: "Bird", desc: "a pair of feathered wings"}],
+	["fairy", {animal: "Fairy", desc: "a pair of translucent, leaf-like fairy wings"}],
+	["butterfly", {animal: "Butterfly", desc: "a pair of beautiful butterfly wings"}],
+	["moth", {animal: "Moth", desc: "a pair of soft moth wings"}],
+	["insect", {animal: "Insect", desc: "a pair of transparent insect wings"}],
+	["evil", {animal: "Fiend", desc: "a pair of fiendish wings"}]
+	
+	
+]);
 /**
  * @typedef {object} prostheticLimb
  * @property {string} short
@@ -196,4 +323,24 @@ App.Data.prostheticLimbs = new Map([
 		prostheticKey: "cyberneticL",
 		minimumInterface: 2,
 	}],
+	[7, {
+		short: "quadruped feline",
+		prostheticKey: "felineL",
+		minimumInterface: 1,
+	}],
+	[8, {
+		short: "quadruped canine",
+		prostheticKey: "canineL",
+		minimumInterface: 1,
+	}],
+	[7, {
+		short: "feline combat",
+		prostheticKey: "felineCL",
+		minimumInterface: 2,
+	}],
+	[8, {
+		short: "canine combat",
+		prostheticKey: "canineCL",
+		minimumInterface: 2,
+	}],
 ]);
diff --git a/js/medicine/surgery/assets/boobs.js b/js/medicine/surgery/assets/boobs.js
index f781ead0e07b01dabcc683946fe7781aefb1dda3..f873c09c957e949fe52de1ce365afc99fb09a9a0 100644
--- a/js/medicine/surgery/assets/boobs.js
+++ b/js/medicine/surgery/assets/boobs.js
@@ -160,7 +160,7 @@ App.Medicine.Surgery.Reactions.BoobsLoss = class extends App.Medicine.Surgery.Si
 				slave.nipples = "puffy";
 			}
 		} else if ((slave.nipples === "cute" || slave.nipples === "tiny") && (slave.boobsImplant / slave.boobs >= 0.75)) {
-			this.slave.nipples = "flat";
+			slave.nipples = "flat";
 		}
 		if (slave.boobShape !== "spherical") {
 			if (slave.boobsImplant / slave.boobs >= 0.90) {
diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index 8115de9bd59fc03fb2981624c467c1bdb808b0bc..f046369d7c972dda4e8a9286a8850a352075381b 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -144,13 +144,19 @@ App.Facilities.Facility = class {
 		div.append(desc);
 
 		if (!this.expand.unexpandable) {
-			App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(`Expand ${this.facility.name}`, () => {
-				cashX(forceNeg(cost), "capEx");
-				V[this.facility.desc.baseName] += amount;	// TODO: this will likely need to be changed in the future
-				V.PC.skill.engineering += .1;
-
-				this.refresh();
-			}, [], '', `Costs ${cashFormat(cost)} and increases the capacity of ${this.facility.name} by ${amount}.`), ['indent']);
+			if (V[this.facility.desc.baseName] < this.expand.maximum) {
+				App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(`Expand ${this.facility.name}`, () => {
+					cashX(forceNeg(cost), "capEx");
+					V[this.facility.desc.baseName] += amount;	// TODO: this will likely need to be changed in the future
+					V.PC.skill.engineering += .1;
+
+					this.refresh();
+				}, [], '', `Costs ${cashFormat(cost)} and increases the capacity of ${this.facility.name} by ${amount}.`), ['indent']);
+			} else {
+				App.UI.DOM.appendNewElement("div", div, App.UI.DOM.disabledLink(`Expand ${this.facility.name}`, [
+					`${this.facility.nameCaps} can support a maximum of ${this.expand.maximum} slaves.`,
+				]));
+			}
 		}
 
 		if (this.facility.totalEmployeesCount > 0) {
diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js
index b1c4b98ffde82548da3cac954676f31aba769042..6ca2594cf215ac78064ab6f466697032ce866f1d 100644
--- a/src/005-passages/facilitiesPassages.js
+++ b/src/005-passages/facilitiesPassages.js
@@ -17,6 +17,8 @@ new App.DomPassage("Incubator", () => { return App.UI.incubator(); }, ["jump-to-
 
 new App.DomPassage("Master Suite", () => { return new App.Facilities.MasterSuite.masterSuite().render(); }, ["jump-to-safe", "jump-from-safe"]);
 
+new App.DomPassage("Nursery", () => { return new App.Facilities.Nursery.nursery().render(); }, ["jump-to-safe", "jump-from-safe"]);
+
 new App.DomPassage("Pit", () => { return new App.Facilities.Pit.pit().render(); }, ["jump-to-safe", "jump-from-safe"]);
 
 new App.DomPassage("Schoolroom", () => { return new App.Facilities.Schoolroom.schoolroom().render(); }, ["jump-to-safe", "jump-from-safe"]);
diff --git a/src/Mods/Catmod/events/CMRESS/catLove.js b/src/Mods/Catmod/events/CMRESS/catLove.js
index 5ad3a57c21527b7b6ce1ec961c129017f029e795..b7b80e50b04ccd24431019645b2d304a4c9af565 100644
--- a/src/Mods/Catmod/events/CMRESS/catLove.js
+++ b/src/Mods/Catmod/events/CMRESS/catLove.js
@@ -37,7 +37,7 @@ App.Events.CMRESSCatLove = class CMRESSCatLove extends App.Events.BaseEvent {
 			App.Events.addParagraph(node, t);
 
 			t = [];
-			t.push(`${eventSlave.slaveName} ${him}self is prominently displayed at the center of the catfolk at the bottom of the image, all of whom are looking up to you with big, worshipful smiles across their faces, pointed ears perked up. The bright golden hues make it look like a religious icon, but instead of a halo you're surrounded by two complex-looking genetic tubes; the faces of Dr. Nieskowitz and some other wizened scientists hang around you like angels. It's incredibly well-made, and even inlaid with a few sparkly things that seem to be whatever ${eventSlave.slaveName} could find lying around.`);
+			t.push(`${eventSlave.slaveName} ${himself} is prominently displayed at the center of the catfolk at the bottom of the image, all of whom are looking up to you with big, worshipful smiles across their faces, pointed ears perked up. The bright golden hues make it look like a religious icon, but instead of a halo you're surrounded by two complex-looking genetic tubes; the faces of Dr. Nieskowitz and some other wizened scientists hang around you like angels. It's incredibly well-made, and even inlaid with a few sparkly things that seem to be whatever ${eventSlave.slaveName} could find lying around.`);
 			if (canTalk(eventSlave)) {
 				t.push(
 					Spoken(eventSlave, `"I, uhm, wanted to make you something nice, ${title}..."`),
diff --git a/src/Mods/Catmod/events/CMRESS/catWorship.js b/src/Mods/Catmod/events/CMRESS/catWorship.js
index 87108458018e00e5aac3ff85f03e21c7baa9e268..b7c0a356796c9c3bcb4e8b2136f2dc2814a001d9 100644
--- a/src/Mods/Catmod/events/CMRESS/catWorship.js
+++ b/src/Mods/Catmod/events/CMRESS/catWorship.js
@@ -33,7 +33,7 @@ App.Events.CMRESSCatWorship = class CMRESSCatWorship extends App.Events.BaseEven
 
 		let t = [];
 
-		t.push(`For a dominant catgirl like ${eventSlave.slaveName}, your arcology is a virtual paradise. The similarity of ${his} feline body to the ancient Egyptian Goddesses ensures a steady stream of devout worshippers to pay their respects to every part of ${eventSlave.slaveName}'s body. To ${his} dominance-focused mind, this mostly means a steady stream of human toys.`);
+		t.push(`For a dominant cat${girl} like ${eventSlave.slaveName}, your arcology is a virtual paradise. The similarity of ${his} feline body to the ancient Egyptian Goddesses ensures a steady stream of devout worshippers to pay their respects to every part of ${eventSlave.slaveName}'s body. To ${his} dominance-focused mind, this mostly means a steady stream of human toys.`);
 		App.Events.addParagraph(node, t);
 		t = [];
 		t.push(`Today, while walking through your penthouse, a series of high moans from the showers prompt you to step in and see what's going on. It looks like ${eventSlave.slaveName} has managed to get two of your other slaves kneeling down on either side of ${him}, one of them giving ${him} some intense oral while the other rims ${him} from behind, ${his} tail flicked high up in the air as the shower's water runs down over the little orgy. ${He}'s quivering a little from the force of the two worshipful tongues toying with all ${his} sensitive bits, but the cat${girl} still manages to give you a nice little smile as you come across the hedonistic scene.`);
diff --git a/src/Mods/Catmod/events/reRecruit/runawayCat.js b/src/Mods/Catmod/events/reRecruit/runawayCat.js
index cf22d2e56bd6475e6826e696c0b5eba206979448..1526605e6eac5f34d4b15fe467901d630740cd85 100644
--- a/src/Mods/Catmod/events/reRecruit/runawayCat.js
+++ b/src/Mods/Catmod/events/reRecruit/runawayCat.js
@@ -5,7 +5,6 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 
 	eventPrerequisites() {
 		return [
-			() => V.seeDicks !== 100,
 			() => V.seeCats !== 0,
 			() => V.projectN.techReleased !== 0,
 			() => ((V.rep/400) > random(1, 100) || V.cheatMode === 1)
@@ -24,10 +23,10 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		r.push(`Coming to your desk in the morning, you see that your assistant has noted that you have a 'pressing' piece of business to attend to. With a wave of your hand, you bring up the notification to see that a runaway slave has apparently been waiting outside your penthouse for the entire night. What's more, ${he}'s owned by a prominent rival arcology owner within the cluster - and a cat${girl}, to boot. Apparently, according to the short, hand-scrawled letter that ${V.assistant.name} has digitized into the notification, ${his} former master regularly beat ${him} both out of frustration and for pleasure, and ${he}'s approached you hoping for a better life in the slavery that's defined ${his} existence.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(`The exclusive and novel nature of catgirls makes ${him} an exceptionally valuable slave, and the genetic modification that created ${him} has ensured that the feline face you look over in the automated overview is particularly attractive, but taking ${him} under your wing away from another wealthy plutocrat would cause a whole score of problems. Deciding it'd be best not to make more enemies than you have to, you call up the rival on your personal phone, who answers after only a few seconds. After you explain the situation, the abusive oligarch chuckles, admits that he hadn't even noticed the cat${girl} leaving, and says he'll formally sell ${him} over to you for "just" twenty thousand credits. Otherwise, he'll give you a little cash to show his appreciation for sending the runaway back home.`);
+		r.push(`The exclusive and novel nature of cat${girl}s makes ${him} an exceptionally valuable slave, and the genetic modification that created ${him} has ensured that the feline face you look over in the automated overview is particularly attractive, but taking ${him} under your wing away from another wealthy plutocrat would cause a whole score of problems. Deciding it'd be best not to make more enemies than you have to, you call up the rival on your personal phone, who answers after only a few seconds. After you explain the situation, the abusive oligarch chuckles, admits that he hadn't even noticed the cat${girl} leaving, and says he'll formally sell ${him} over to you for "just" twenty thousand credits. Otherwise, he'll give you a little cash to show his appreciation for sending the runaway back home.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(App.UI.DOM.makeElement("span", `The other oligarch's offer is a pretty heavy ${cashFormat(20000)}, although his catgirl slave is pretty, young, and seems fairly well-trained. ${He}'s still got a few scars from regular abuse, though, both mental and physical, and despite ${his} offer of self-enslavement seems exceptionally skittish and scared around you.`, "note"));
+		r.push(App.UI.DOM.makeElement("span", `The other oligarch's offer is a pretty heavy ${cashFormat(20000)}, although his cat${girl} slave is pretty, young, and seems fairly well-trained. ${He}'s still got a few scars from regular abuse, though, both mental and physical, and despite ${his} offer of self-enslavement seems exceptionally skittish and scared around you.`, "note"));
 
 		App.Events.addParagraph(node, r);
 		const contractCost = 20000;
@@ -40,7 +39,7 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		}
 		const incomeText = new DocumentFragment();
 		incomeText.append(`This will bring in `, App.UI.DOM.cashFormat(cost), `.`);
-		responses.push(new App.Events.Result(`Sell ${him} immediately`, sell, incomeText));
+		responses.push(new App.Events.Result(`Return ${him} to ${his} owner`, sell, incomeText));
 
 		node.append(App.Desc.longSlave(slave, {market: "generic"}));
 
@@ -66,7 +65,7 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 		}
 
 		function makeSlave() {
-			const slave = GenerateNewSlave("XX", {minAge: 18, maxAge: 22, race: "catgirl"});
+			const slave = GenerateNewSlave(null, {minAge: 16, maxAge: 22, race: "catgirl"});
 			slave.face = random(25, 75);
 			slave.origin = "$He was bioengineered by a rival arcology owner. After being mistreated, $he escaped and came to you for protection.";
 			slave.slaveName = setup.catSlaveNames.random();
@@ -91,6 +90,8 @@ App.Events.recRunawayCat = class recRunawayCat extends App.Events.BaseEvent {
 			slave.eye.right.pupil = "catlike";
 			slave.accent = 2;
 			slave.canRecruit = 0;
+			App.Medicine.Modification.addScar(slave, "back", "whip");
+			slave.behavioralFlaw = "odd";
 			return slave;
 		}
 	}
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 8ad295203cc975b9bf62a36845150606129e3306..2656ee346d81b4379813914a0587ac62db25ff5d 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -323,14 +323,6 @@ App.Update.globalVariables = function(node) {
 	// Pit
 	App.Facilities.Pit.BC();
 
-	if (V.killChoice) {
-		delete V.killChoice;
-	}
-
-	if (V.foodCrisis) {
-		delete V.foodCrisis;
-	}
-
 	App.SecExp.generalBC();
 	App.SF.BC();
 
diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js
index feb00e02e41b645151712978d739fbbe219b2f41..fefd9c8b46081fd7f2c97ab3ad0abf0c98ae6ee3 100644
--- a/src/endWeek/saChoosesOwnClothes.js
+++ b/src/endWeek/saChoosesOwnClothes.js
@@ -997,9 +997,10 @@ App.SlaveAssignment.choosesOwnClothes = (function() {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 * @returns {{text:string, shoes:string}}
+	 * @returns {{text:string, shoes:FC.Shoes}}
 	 */
 	function todaysShoes(slave) {
+		/** @type {{text:string, shoes:FC.Shoes}[]} */
 		const shoes = [];
 
 		if (slave.fetish === "mindbroken") {
diff --git a/src/events/PE/peHeadgirlConcubine.js b/src/events/PE/peHeadgirlConcubine.js
index d67e5a1be3689e971237a2f5c0cb71a2a536c9cd..0799c5d947abac9cd9bfb80c1509b1c257073643 100644
--- a/src/events/PE/peHeadgirlConcubine.js
+++ b/src/events/PE/peHeadgirlConcubine.js
@@ -55,7 +55,7 @@ App.Events.PEHeadgirlConcubine = class PEHeadgirlConcubine extends App.Events.Ba
 		};
 
 
-		r.push(`You wake up one morning to find ${S.HeadGirl.slaveName} and ${S.Concubine.slaveName} waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
+		r.push(`You wake up one morning to find`, contextualIntro(V.PC, S.HeadGirl, "DOM"), `and`, contextualIntro(S.HeadGirl, S.Concubine, "DOM"), `waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
 		if (S.HeadGirl.boobs >= 10000 && S.Concubine.boobs >= 10000) {
 			r.push(`bed (a position that smashes their massive breasts together on one side),`);
 		} else if (S.HeadGirl.belly >= 45000 && S.Concubine.belly >= 45000) {
diff --git a/src/events/RESS/review/shiftMasturbation.js b/src/events/RESS/review/shiftMasturbation.js
index 1b27ed344b5f38b79bd05e5f8157e85a7711f6b6..0aefeaa4363dd481cbb0839af81278b5e4fd56a8 100644
--- a/src/events/RESS/review/shiftMasturbation.js
+++ b/src/events/RESS/review/shiftMasturbation.js
@@ -75,7 +75,7 @@ App.Events.RESSShiftMasturbation = class RESSShiftMasturbation extends App.Event
 			} else if (eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
 				r.push(`rub ${his} limp, useless penis,`);
 			} else if (eventSlave.balls === 0) {
-				r.push(`rub ${his} limp, ballsless penis,`);
+				r.push(`rub ${his} limp, balls-less penis,`);
 			} else {
 				r.push(`rub ${his} soft penis,`);
 			}
@@ -269,7 +269,7 @@ App.Events.RESSShiftMasturbation = class RESSShiftMasturbation extends App.Event
 				} else {
 					r.push(`sensation.`);
 				}
-			} else if (eventSlave.dick > 0 && eventSlave.dick < 5 && eventSlave.belly >= 5000) {
+			} else if (eventSlave.dick.isBetween(0, 5) && eventSlave.belly >= 5000) {
 				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. However, ${he} ends up just coating ${his}`);
 				if (eventSlave.bellyPreg >= 3000) {
 					r.push(`pregnancy`);
diff --git a/src/facilities/nursery/nursery.js b/src/facilities/nursery/nursery.js
new file mode 100644
index 0000000000000000000000000000000000000000..a03f4d60b00dc19b878f65a284049a29de1a26f3
--- /dev/null
+++ b/src/facilities/nursery/nursery.js
@@ -0,0 +1,769 @@
+App.Facilities.Nursery.nursery = class Nursery extends App.Facilities.Facility {
+	constructor() {
+		const nursery = App.Entity.facilities.nursery;
+		const decommissionHandler = () => {
+			V.nursery = 0;
+			V.nurseryDecoration = "standard";
+			V.nurseryNannies = 0;
+			V.nannyInfluence = 0;
+			V.cribs = [];
+		};
+
+		super(
+			nursery,
+			decommissionHandler,
+		);
+
+		V.nextButton = "Back to Main";
+		V.nextLink = "Main";
+		V.encyclopedia = "Nursery";
+	}
+
+	/** @returns {string} */
+	get intro() {
+		// TODO: add in effects based on number of children hosted
+		const text = [];
+
+		text.push(this.facility.nameCaps, this.decorations);
+
+		if (this.facility.hostedSlaves > 2) {
+			text.push(`${this.facility.nameCaps} is bustling with activity. Nannies are busily moving about, feeding babies and changing diapers.`);
+		} else if (this.facility.hostedSlaves > 0) {
+			text.push(`${this.facility.nameCaps} is working steadily. Nannies are moving about, cleaning up and feeding hungry children.`);
+		} else if (S.Matron) {
+			text.push(`${S.Matron.slaveName} is alone in ${this.facility.name}, and keeps the place clean and looks after the children ${getPronouns(S.Matron).himself}.`);
+		} else {
+			text.push(`${this.facility.nameCaps} is empty and quiet.`);
+		}
+
+		return text.join(' ');
+	}
+
+	/** @returns {string} */
+	get decorations() {
+		/** @type {FC.Facilities.Decoration} */
+		const FS = {
+			"Roman Revivalist": `is run with the Roman dream in mind, with wide open windows exposing the babies to the elements. The sleek marble halls bring a sense of serenity and duty as wet nurses wander the halls.`,
+			"Neo-Imperialist": `is modeled as an ultra high-tech nursing area, with omnipresent advanced machinery monitoring every heartbeat of the babies within, the soft glow of machines pulsating against the banners of your family crest lining the walls.`,
+			"Aztec Revivalist": `is lined head to toe in illustrious Aztec gold. Tiny but notable subscripts lay in plaques to honor the mothers who died giving birth, the children of said mothers, alive or dead, are tirelessly watched over to tend to their every need.`,
+			"Egyptian Revivalist": `is decorated by sleek, sandstone tablets, golden statues, and even grander Egyptian wall sculptures, many of them depicting the conception, birth, and raising of a child. Each babe is reverently wrapped in linen covers as they drift to sleep to the stories of mighty pharaohs and prosperous palaces.`,
+			"Edo Revivalist": `is minimalist in nature, but the errant paintings of cherry blossoms and vibrant Japanese maples give a certain peaceful air as the caretakers do their duties.`,
+			"Arabian Revivalist": `is decorated wall to wall with splendorous carvings and religious Hamsas meant to protect the fostering children.`,
+			"Chinese Revivalist": `is ripe with Chinese spirit. Depictions of colorful dragons and oriental designs grace the halls, rooms, and cribs of the babies who reside inside.`,
+			"Chattel Religionist": `is decorated with childish religious cartoons and artistic tapestries of slaves bowing in submission, their themes always subsiding varying degrees of sexual worship. The caretakers that wander the halls obediently wear their habits, and never waste a moment to tenderly lull the children to sleep with stories of their prophet.`,
+			"Degradationist": `is bare and sullen. The cries of the neglected children destined for slavery trying to find comfort in their burlap coverings echo the halls, while those that await freedom are raised among luxury and are taught to look down on their less fortunate peers.`,
+			"Repopulationist": `is designed to be very open and public; a showing testament to your arcology's repopulation efforts. For those old enough to support them, they are strapped with big, but body warming, empathy bellies as to remind them of their destiny.`,
+			"Eugenics": `is of utmost quality without a single pleasantry missing — if the parents are of the elite blood of course. While there are rare stragglers of unworthy genes, the child populace overall is pampered with warm rooms and plentiful small toys.`,
+			"Asset Expansionist": `is not so much decorated as it is intelligently staffed. Every passerby, slave or not, burns the image of their jiggling asses and huge, wobbling tits into the minds of the children.`,
+			"Transformation Fetishist": `is kept simple and clean. From their toys down to the nursemaids, the babies are exposed to the wonders of body transformation whenever possible.`,
+			"Gender Radicalist": `is decorated by cheery cartoon depictions of slaves of many shapes, sizes, and genitals, all of them undeniably feminine. The elated smiles and yips of the nurses getting reamed constantly instill the appreciation of nice, pliable buttholes.`,
+			"Gender Fundamentalist": `is simply designed and painted with soft feminine colors. The staff heavily encourage the children to play dress up and house, subtly sculpting their minds to proper gender norms and properly put them in line if they try to do otherwise.`,
+			"Physical Idealist": `is furnished with kiddy health books and posters; their caretakers making painstakingly sure that the importance is drilled into their heads at a young age. Their food is often littered with vitamins and supplements to keep the children growing strong.`,
+			"Supremacist": `is designed and structured to give those of ${V.arcologies[0].FSSupremacistRace} ethnicity the limelight of the nursery, while the others stay sectioned off and neglected to the world.`,
+			"Subjugationist": `is made to foster and raise the young children of ${V.arcologies[0].FSSubjugationistRace} ethnicity. They are reminded of their place with every failure and are encouraged to submissively follow their stereotypes at a ripe young age.`,
+			"Paternalist": `is well-stocked and by Paternalistic customs, constantly swaddle the children with love and attention. With the warm colors and sound of child laughter, to the untrained eye, the children actually seem free.`,
+			"Pastoralist": `is decorated to make the children grow up thinking that a life focused on breast milk, cum, and other human secretions are part of the norm. The milky tits swaying above their cow-patterned cribs certainly help with that.`,
+			"Maturity Preferentialist": `decorations remind the kids to respect those curvy and mature. The older nurserymaids are always flattered whenever the children try to act like adults and take care of the younger toddlers for them.`,
+			"Youth Preferentialist": `is making young children the center of attention, their rooms supplied with plenty of toys, blankets, and surrogate mothers at their beck and call.`,
+			"Body Purist": `is decorated to be very clean cut and sterilized with perfect corners and curves; symbolic of the human figure. Nursery maids are encouraged to show off their natural assets to show the children what the appropriate body should be.`,
+			"Slimness Enthusiast": `constantly encourages the kids to try and keep their slim and cute physiques. They are given perfectly metered meals to make this possible.`,	// TODO: tie this in to food system
+			"Hedonistic": `would make any toddler drool in amazement. Meals and naps every other hour, cribs stalked with toys and blankets, and plush slaves carry them to and fro without preamble. A delicious layer of baby fat is the ideal figure of a baby, and they couldn't be happier.`,
+			"Intellectual Dependency": ``,	// TODO:
+			"Slave Professionalism": ``,	// TODO:
+			"Petite Admiration": `has large photos and paintings on the walls depicting small, petite children enjoying ${this.facility.name}'s amenities and having fun together.`,
+			"Statuesque Glorification": `has large photos and paintings on the walls depicting tall children enjoying ${this.facility.name}'s amenities and having fun together.`,
+			"standard": `is as comfortable and child-friendly as it needs to be. They have everything they need to grow into a proper slave.`,
+			"": ``,
+		};
+
+		const res = FS[V.nurseryDecoration];
+
+		if (!res) {
+			throw new Error(`Unknown V.nurseryDecoration value of '${V.nurseryDecoration}' found in decorations().`);
+		}
+
+		return res;
+	}
+
+	/** @returns {FC.Facilities.Expand} */
+	get expand() {
+		const slaves = this.facility.hostedSlaves;
+		const nannies = numberWithPluralOne(V.nurseryNannies, 'nanny', 'nannies');
+
+		return {
+			amount: 1,
+			desc: `${this.facility.nameCaps} has room to support ${num(V.nurseryNannies)} ${nannies}. There ${slaves === 1 ? `is` : `are`} currently ${nannies} taking care of ${numberWithPlural(V.nurseryChildren, 'child', 'children')}.`,
+			maximum: 5,
+		};
+	}
+
+	/** @returns {FC.IUpgrade[]} */
+	get upgrades() {
+		return [
+			{
+				property: "nurseryWeight",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} has only the most basic monitoring systems available.`,
+						link: `Upgrade the monitoring system`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `The monitoring systems have been upgraded and allow for monitoring children's food intakes.`,
+					},
+				],
+			},
+			{
+				property: "nurseryMuscles",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `There is space in one part of ${this.facility.name} where a playground and different toys and equipment could be installed to keep children fit and healthy.`,
+						link: `Install a playground`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `A playground and various toys and equipment have been installed in one part of ${this.facility.name}.`,
+					},
+				],
+			},
+			{
+				property: "nurseryHormones",
+				tiers: [
+					{
+						value: 0,
+						upgraded: 1,
+						text: `${this.facility.nameCaps} doesn't have any sort of artificial hormones designed for children.`,
+						link: `Invest in purpose-built hormones`,
+						cost: 1000 * V.upgradeMultiplierArcology,
+						handler: () => V.PC.skill.engineering += 0.1,
+						note: ` and will increase upkeep costs`,
+					},
+					{
+						value: 1,
+						text: `Hormones designed specifically for children have been developed for ${this.facility.name}.`,
+					},
+				],
+			},
+		];
+	}
+
+	/** @returns {FC.Facilities.Rule[]}*/
+	get rules() {
+		return [
+			{
+				property: "MatronIgnoresFlaws",
+				prereqs: [
+					() => !!S.Matron,
+				],
+				options: [
+					{
+						get text() { return `${S.Matron.slaveName} has been instructed to ignore flaws in the nannies serving under ${getPronouns(S.Matron).him}.`; },
+						link: `Ignore flaws`,
+						value: 1,
+					},
+					{
+						get text() { return `${S.Matron.slaveName} will attempt to fix flaws in nannies serving under ${getPronouns(S.Matron).him}.`; },
+						link: `Fix flaws`,
+						value: 0,
+					},
+				],
+			},
+			{
+				property: "nurserySex",
+				prereqs: [
+					() => !!V.extremeUnderage,
+				],
+				options: [
+					{
+						get text() { return `${capFirstChar(V.nurseryName)} staff are not allowed to molest the children.`; },
+						link: `Forbid`,
+						value: 0,
+					},
+					{
+						get text() { return `${capFirstChar(V.nurseryName)} staff are allowed to molest the children.`; },
+						link: `Allow`,
+						value: 1,
+					},
+				],
+			},
+			// TODO: really not happy with most of these – rework these
+			{
+				property: "nurseryWeightSetting",
+				prereqs: [
+					() => !!V.nurseryWeight,
+				],
+				options: [
+					{
+						get text() { return `Food intake is not being managed; children may end up malnourished.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Food intake is being managed; children will be raised at a healthy weight.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+			{
+				property: "nurseryMusclesSetting",
+				prereqs: [
+					() => !!V.nurseryMuscles,
+				],
+				options: [
+					{
+						get text() { return `Children are not getting any exercise; they may end up quite weak and frail.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Exercise is being managed; children will be raised with average fitness.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+			{
+				property: "nurseryHormonesSetting",
+				prereqs: [
+					() => !!V.nurseryHormones,
+				],
+				options: [
+					{
+						get text() { return `Artificial hormones are not being given; children will undergo normal puberty.`; },
+						link: `Don't manage`,
+						value: 0,
+					},
+					{
+						get text() { return `Artificial hormone levels are being managed; children may experience precocious puberty.`; },
+						link: `Manage`,
+						value: 1,
+					},
+				],
+			},
+		];
+	}
+
+	/** @returns {HTMLDivElement} */
+	get mothers() {
+		const div = document.createElement("div");
+
+		const text = [];
+
+		let childrenReserved = 0;
+
+		text.push(`Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of ${V.nursery} rooms, ${numberWithPlural(V.nursery - V.nurseryChildren, 'is', 'are')} unoccupied. Of those, ${numberWithPlural(FetusGlobalReserveCount("nursery"), 'room is', 'rooms are')} reserved.`);
+
+		App.Events.addNode(div, text);
+
+		const refreshDiv = document.createElement("div");
+		refreshDiv.append(content());
+		div.append(refreshDiv);
+
+		return div;
+
+		function content() {
+			const div = document.createElement("div");
+
+			div.append(
+				sort(),
+				mothers(),
+			);
+
+			return div;
+		}
+
+		function sort() {
+			const div = document.createElement("div");
+
+			const sorts = [];
+			let sort = 'Unsorted';
+
+			sorts.push(App.UI.DOM.link(`Sort by Name`, () => {
+				sort = 'Name';
+				sortNurseryPossiblesByName();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Reserved Nursery Spots`, () => {
+				sort = 'Reserved Nursery Spots';
+				sortNurseryPossiblesByReservedSpots();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Pregnancy Week`, () => {
+				sort = 'Pregnancy Week';
+				sortNurseryPossiblesByPregnancyWeek();
+			}));
+			sorts.push(App.UI.DOM.link(`Sort by Number of Children`, () => {
+				sort = 'Number of Children';
+				sortNurseryPossiblesByPregnancyCount();
+			}));
+
+			div.append(
+				`Sorting: ${sort}`,
+				App.UI.DOM.generateLinksStrip(sorts),
+			);
+
+			return div;
+		}
+
+		function mothers() {
+			const el = new DocumentFragment();
+			let r = [];
+			let eligibility = 0;
+			let linkArray;
+			const reservedChildren = FetusGlobalReserveCount("incubator");
+			const incubatorSlaves = V.incubator.tanks.length;
+			const freeTanks = V.incubator.capacity - incubatorSlaves;
+			r.push(`Reserve an eligible mother-to-be's child to be placed in a tank upon birth. Of ${V.incubator.capacity} tanks, ${freeTanks}`);
+			if (freeTanks === 1) {
+				r.push(`is`);
+			} else {
+				r.push(`are`);
+			}
+			r.push(`unoccupied. Of those, ${reservedChildren}`);
+			if (reservedChildren === 1) {
+				r.push(`tank is`);
+			} else {
+				r.push(`tanks are`);
+			}
+			r.push(`reserved.`);
+			App.Events.addNode(el, r, "div");
+
+			const sortingOptions = new Map([
+				["Name", "data-name"],
+				["Reserved Incubator Spots", "data-reserved-spots"],
+				["Pregnancy Week", "data-preg-week"],
+				["Number of Children", "data-preg-count"],
+			]);
+
+			if (V.slaves.length > 0) {
+			/**
+			 * @param {Map<string, string>} sortingOptions
+			 */
+				const sortingBarFunc = function(sortingOptions) {
+					const el = new DocumentFragment();
+					App.UI.DOM.appendNewElement("span", el, "Sorting: ", "note");
+					const linkArray = [];
+					for (const [title, attr] of sortingOptions) {
+						if (V.sortIncubatorList === title) {
+							linkArray.push(App.UI.DOM.makeElement("span", title, "bold"));
+						} else {
+							linkArray.push(
+								App.UI.DOM.link(
+									title,
+									() => {
+										V.sortIncubatorList = title;
+										sortBy(attr);
+										jQuery(sortingBar).empty().append(sortingBarFunc(sortingOptions));
+									}
+								)
+							);
+						}
+					}
+					el.append(App.UI.DOM.generateLinksStrip(linkArray));
+					return el;
+				};
+
+				const sortingBar = document.createElement("div");
+				sortingBar.classList.add("incubator-underscore");
+
+				V.sortIncubatorList = V.sortIncubatorList || 'Unsorted';
+				sortingBar.append(sortingBarFunc(sortingOptions));
+				el.append(sortingBar);
+			}
+
+			const qlIncubator = document.createElement("div");
+			for (const slave of V.slaves) {
+				if (slave.preg > 0 && slave.pregKnown === 1 && slave.eggType === "human") {
+					const r = [];
+					const reserveDisallowed = (slave.assignment === "work in the dairy" && V.dairyPregSetting > 0) || slave.assignment === "be your agent" || slave.assignment === "live with your agent";
+					if (!reserveDisallowed) {
+						const {
+							His, his
+						} = getPronouns(slave);
+						const freeTanks = V.incubator.capacity - incubatorSlaves;
+						const WL = slave.womb.length;
+						const reservedIncubator = WombReserveCount(slave, "incubator");
+						const reservedNursery = WombReserveCount(slave, "nursery");
+						const momEl = document.createElement("p");
+						momEl.id = "slave-" + slave.ID;
+						momEl.classList.add("possible");
+
+						momEl.setAttribute("data-preg-count", slave.womb.length.toString());
+						momEl.setAttribute("data-reserved-spots", reservedIncubator.toString());
+						momEl.setAttribute("data-preg-week", slave.pregWeek.toString());
+						momEl.setAttribute("data-name", SlaveFullName(slave));
+
+						linkArray = [];
+						const choices = document.createElement("div");
+						choices.classList.add("choices");
+						r.push(App.UI.DOM.slaveDescriptionDialog(slave));
+						r.push(`is ${slave.pregWeek} ${(slave.pregWeek === 1) ? `week` : `weeks`} pregnant with`);
+						if (slave.pregSource === 0 || slave.preg <= 5) {
+							r.push(`someone's${(slave.preg <= 5) ? `, though it is too early to tell whose,` : ``}`);
+						} else if (slave.pregSource === -1) {
+							r.push(`your`);
+						} else if (slave.pregSource === -2) {
+							r.push(`a citizen's`);
+						} else if (slave.pregSource === -3) {
+							r.push(`your Master's`);
+						} else if (slave.pregSource === -4) {
+							r.push(`another arcology owner's`);
+						} else if (slave.pregSource === -5) {
+							r.push(`your client's`);
+						} else if (slave.pregSource === -6) {
+							r.push(`the Societal Elite's`);
+						} else if (slave.pregSource === -7) {
+							r.push(`the lab's`);
+						} else if (slave.pregSource === -9) {
+							r.push(`the Futanari Sisters'`);
+						} else {
+							const father = getSlave(slave.pregSource);
+							if (father) {
+								r.push(`${father.slaveName}'s`);
+							} else if (WL === 1) {
+								r.push("a");
+							}
+						}
+						if (WL > 1) {
+							r.push(`${WL} babies.`);
+						} else {
+							r.push(`baby.`);
+						}
+						if (reservedIncubator > 0) {
+							childrenReserved = 1;
+							if (WL === 1) {
+								r.push(`${His} child`);
+							} else if (reservedIncubator < WL) {
+								r.push(`${reservedIncubator} of ${his} children`);
+							} else if (WL === 2) {
+								r.push(`Both of ${his} children`);
+							} else {
+								r.push(`All ${reservedIncubator} of ${his} children`);
+							}
+							r.push(`will be placed in ${V.incubator.name}.`);
+							if ((reservedIncubator + reservedNursery < WL) && (reservedChildren < freeTanks)) {
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep another child`,
+										() => {
+											WombAddToGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if (reservedIncubator > 0) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep one less child`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 1);
+												refresh();
+											}
+										)
+									);
+								}
+								if (reservedIncubator > 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep none of ${his} children`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+								if ((reservedChildren + WL - reservedIncubator) <= freeTanks) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep the rest of ${his} children`,
+											() => {
+												WombAddToGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							} else if ((reservedIncubator === WL) || (reservedChildren === freeTanks) || (reservedIncubator + reservedNursery === WL)) {
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep one less child`,
+										() => {
+											WombCleanGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if (reservedIncubator > 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep none of ${his} children`,
+											() => {
+												WombCleanGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							}
+						} else if (reservedChildren < freeTanks) {
+							if (WL - reservedNursery === 0) {
+								r.push(App.UI.DOM.makeElement("span", `${His} children are already reserved for ${V.nurseryName}`, "note"));
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Inspect pregnancy`,
+											() => {
+												V.AS = slave.ID;
+											},
+											[],
+											`Analyze Pregnancy`
+										)
+									);
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep ${his} ${((WL > 1) ? "children" : "child")} here instead`,
+										() => {
+											WombChangeReserveType(slave, 'nursery', 'incubator');
+											refresh();
+										}
+									)
+								);
+							} else {
+								r.push(`You have `);
+								if (freeTanks === 1) {
+									r.push(`an <span class="lime">available aging tank.</span>`);
+								} else {
+									r.push(`<span class="lime">available aging tanks.</span>`);
+								}
+								if (V.pregnancyMonitoringUpgrade === 1) {
+									if (V.pregnancyMonitoringUpgrade === 1) {
+										linkArray.push(
+											App.UI.DOM.link(
+												`Inspect pregnancy`,
+												() => {
+													V.AS = slave.ID;
+												},
+												[],
+												`Analyze Pregnancy`
+											)
+										);
+									}
+								}
+								linkArray.push(
+									App.UI.DOM.link(
+										`Keep ${(WL > 1) ? "a" : "the"} child`,
+										() => {
+											WombAddToGenericReserve(slave, 'incubator', 1);
+											refresh();
+										}
+									)
+								);
+								if ((WL > 1) && (reservedChildren + WL - reservedIncubator) <= freeTanks) {
+									linkArray.push(
+										App.UI.DOM.link(
+											`Keep all of ${his} children`,
+											() => {
+												WombAddToGenericReserve(slave, 'incubator', 9999);
+												refresh();
+											}
+										)
+									);
+								}
+							}
+						} else if (reservedChildren === freeTanks) {
+							if (V.pregnancyMonitoringUpgrade === 1) {
+								linkArray.push(
+									App.UI.DOM.link(
+										`Inspect pregnancy`,
+										() => {
+											V.AS = slave.ID;
+										},
+										[],
+										`Analyze Pregnancy`
+									)
+								);
+							}
+							const noRoom = new DocumentFragment();
+							noRoom.append(`You have `);
+							App.UI.DOM.appendNewElement("span", noRoom, `no room for ${his} offspring.`, "red");
+							linkArray.push(noRoom);
+						}
+						eligibility = 1;
+
+						App.Events.addNode(momEl, r, "div");
+						choices.append(App.UI.DOM.generateLinksStrip(linkArray));
+						momEl.append(choices);
+						qlIncubator.append(momEl);
+					}
+				}
+			}
+			sortByPreviousSort();
+			el.append(qlIncubator);
+			if (eligibility === 0) {
+				App.UI.DOM.appendNewElement("div", el, `You have no pregnant slaves bearing eligible children.`, "note");
+			}
+
+			if (reservedChildren !== 0 || childrenReserved === 1) { // the oops I made it go negative somehow button
+				App.UI.DOM.appendNewElement(
+					"div",
+					el,
+					App.UI.DOM.link(
+						"Clear all reserved children",
+						() => {
+							for (const slave of V.slaves) {
+								if (WombReserveCount(slave, "incubator") !== 0) {
+									WombCleanGenericReserve(slave, 'incubator', 9999);
+								}
+							}
+							WombCleanGenericReserve(V.PC, 'incubator', 9999);
+							refresh();
+						}
+					)
+				);
+			}
+			return el;
+
+			function refresh() {
+				App.UI.reload();
+			}
+
+			function sortBy(attrName) {
+				let sortedIncubatorPossibles = $(qlIncubator).children('p.possible').detach();
+				sortedIncubatorPossibles = sortDomObjects(sortedIncubatorPossibles, attrName);
+				$(sortedIncubatorPossibles).appendTo(qlIncubator);
+			}
+
+			function sortByPreviousSort() {
+				const sortAttr = sortingOptions.get(V.sortIncubatorList);
+				if (sortAttr) {
+					sortBy(sortAttr);
+				}
+			}
+		}
+	}
+
+	/** @returns {HTMLDivElement} */
+	get children() {
+		const div = document.createElement("div");
+
+		div.append(App.Facilities.Nursery.childList());
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement} */
+	get targetAge() {
+		const div = document.createElement("div");
+
+		const links = [
+			App.UI.DOM.link(`Minimum Legal Age`, () => {
+				V.targetAgeNursery = V.minimumSlaveAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Average Age of Fertility`, () => {
+				V.targetAgeNursery = V.fertilityAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Average Age of Potency`, () => {
+				V.targetAgeNursery = V.potencyAge;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+			App.UI.DOM.link(`Legal Adulthood`, () => {
+				V.targetAgeNursery = 18;
+
+				App.UI.reload();
+			}, [], '', `Will not be applied to rooms in use.`),
+		];
+
+		div.append(
+			`Target age for release: `,
+			App.UI.DOM.makeTextBox(V.targetAgeNursery, target => {
+				V.targetAgeNursery = target;
+
+				App.UI.reload();
+			})
+		);
+
+		App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(links), ['indent']);
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement} */
+	get rooms() {
+		const div = document.createElement("div");
+
+		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
+		const links = [];
+
+		div.append(`It can support ${numberWithPlural(V.nursery, 'child', 'children')}. There ${numberWithPlural(V.nurseryChildren, 'is', 'are')} currently ${numberWithPlural(V.nurseryChildren, 'room')} in use in ${this.facility.name}.`);
+
+		links.push(App.UI.DOM.link(`Add room for another 5 children`, () => {
+			cashX(forceNeg(cost), "nursery");
+			V.nursery += 5;
+
+			App.UI.reload();
+		}, [], '', `Costs ${cashFormat(cost)} and will increase upkeep costs.`));
+
+		if (V.nursery > 1 && FetusGlobalReserveCount("nursery") < V.nursery - V.nurseryChildren) {
+			links.push(App.UI.DOM.link(`Remove a room`, () => {
+				cashX(forceNeg(cost / 5), "nursery");
+				V.nursery -= 5;
+
+				App.UI.reload();
+			}, [], '', `Costs ${cashFormat(cost / 5)} and will decrease upkeep costs.`));
+		}
+
+		App.UI.DOM.appendNewElement("div", div, App.UI.DOM.generateLinksStrip(links), ['indent']);
+
+		return div;
+	}
+
+	/** @returns {HTMLDivElement[]} */
+	get customNodes() {
+		return [
+			this.mothers,
+			this.children,
+			this.targetAge,
+			this.rooms,
+		];
+	}
+};
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
deleted file mode 100644
index af80183f2710526ecbd22b4a3f0139ff92aedad6..0000000000000000000000000000000000000000
--- a/src/facilities/nursery/nursery.tw
+++ /dev/null
@@ -1,405 +0,0 @@
-:: Nursery [nobr jump-to-safe jump-from-safe]
-
-<<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Nursery", $encyclopedia = "Nursery">>
-<<set $targetAgeNursery = Number($targetAgeNursery) || $minimumSlaveAge>>
-<<set $targetAgeNursery = Math.clamp($targetAgeNursery, $minimumSlaveAge, 42)>>
-
-<<set $nurseryChildren = $cribs.length, _freecribs = $nursery - $nurseryChildren, _NL = App.Entity.facilities.nursery.employeesIDs().size, _SL = $slaves.length, _eligibility = 0, _reservedChildren = FetusGlobalReserveCount("incubator"), _reservedChildrenNursery = FetusGlobalReserveCount("nursery")>>
-<p class="scene-intro">
-	<<set _nurseryNameCaps = capFirstChar($nurseryName)>>
-	_nurseryNameCaps
-	<<switch $nurseryDecoration>>
-		<<case "Roman Revivalist">>
-			is run with the Roman dream in mind, with wide open windows exposing the babies to the elements. The sleek marble halls bring a sense of serenity and duty as wet nurses wander the halls.
-		<<case "Neo-Imperialist">>
-			is modeled as an ultra high-tech nursing area, with omnipresent advanced machinery monitoring every heartbeat of the babies within, the soft glow of machines pulsating against the banners of your family crest lining the walls.
-		<<case "Aztec Revivalist">>
-			is lined head to toe in illustrious Aztec gold. Tiny but notable subscripts lay in plaques to honor the mothers who died giving birth, the children of said mothers, alive or dead, are tirelessly watched over to tend to their every need.
-		<<case "Egyptian Revivalist">>
-			is decorated by sleek, sandstone tablets, golden statues, and even grander Egyptian wall sculptures, many of them depicting the conception, birth, and raising of a child. Each babe is reverently wrapped in linen covers as they drift to sleep to the stories of mighty pharaohs and prosperous palaces.
-		<<case "Edo Revivalist">>
-			is minimalistic in nature, but the errant paintings of cherry blossoms and vibrant Japanese maples give a certain peaceful air as the caretakers do their duties.
-		<<case "Arabian Revivalist">>
-			is decorated wall to wall with splendorous carvings and religious Hamsas meant to protect the fostering children.
-		<<case "Chinese Revivalist">>
-			is ripe with Chinese spirit. Depictions of colorful dragons and oriental designs grace the halls, rooms, and cribs of the babies who reside inside.
-		<<case "Chattel Religionist">>
-			is decorated with childish religious cartoons and artistic tapestries of slaves bowing in submission, their themes always subsiding varying degrees of sexual worship. The caretakers that wander the halls obediently wear their habits, and never waste a moment to tenderly lull the children to sleep with stories of their prophet.
-		<<case "Degradationist">>
-			is bare and sullen. The cries of the neglected children destined for slavery trying to find comfort in their burlap coverings echo the halls, while those that await freedom are raised among luxury and are taught to look down on their less fortunate peers.
-		<<case "Repopulationist">>
-			is designed to be very open and public; a showing testament to your arcology's repopulation efforts. For those old enough to support them, they are strapped with big, but body warming, empathy bellies as to remind them of their destiny.
-		<<case "Eugenics">>
-			is of utmost quality without a single pleasantry missing — if the parents are of the elite blood of course. While there are rare stragglers of unworthy genes, the child populace overall is pampered with warm rooms and plentiful small toys.
-		<<case "Asset Expansionist">>
-			is not so much decorated as it is intelligently staffed. Every passerby, slave or not, burns the image of their jiggling asses and huge, wobbling tits into the minds of the children.
-		<<case "Transformation Fetishist">>
-			is kept simple and clean. From their toys down to the nursemaids, the babies are exposed to the wonders of body transformation whenever possible.
-		<<case "Gender Radicalist">>
-			is decorated by cheery cartoon depictions of slaves of many shapes, sizes, and genitals, all of them undeniably feminine. The elated smiles and yips of the nurses getting reamed constantly instill the appreciation of nice, pliable buttholes.
-		<<case "Gender Fundamentalist">>
-			is simply designed and painted with soft feminine colors. The staff heavily encourage the children to play dress up and house, subtly sculpting their minds to proper gender norms and properly put them in line if they try to do otherwise.
-		<<case "Physical Idealist">>
-			is furnished with kiddy health books and posters; their caretakers making painstakingly sure that the importance is drilled into their heads at a young age. Their food is often littered with vitamins and supplements to keep the children growing strong.
-		<<case "Supremacist">>
-			is designed and structured to give those of $arcologies[0].FSSupremacistRace ethnicity the limelight of the nursery, while the others stay sectioned off and neglected to the world.
-		<<case "Subjugationist">>
-			is made to foster and raise the young children of $arcologies[0].FSSubjugationistRace ethnicity. They are reminded of their place with every failure and are encouraged to submissively follow their stereotypes at a ripe young age.
-		<<case "Paternalist">>
-			is well-stocked and by Paternalistic customs, constantly swaddle the children with love and attention. With the warm colors and sound of child laughter, to the untrained eye, the children actually seem free.
-		<<case "Pastoralist">>
-			is decorated to make the children grow up thinking that a life focused on breast milk, cum, and other human secretions are part of the norm. The milky tits swaying above their cow-patterned cribs certainly help with that.
-		<<case "Maturity Preferentialist">>
-			decorations remind the kids to respect those curvy and mature. The older nurserymaids are always flattered whenever the children try to act like adults and take care of the younger toddlers for them.
-		<<case "Youth Preferentialist">>
-			is making young children the center of attention, their rooms supplied with plenty of toys, blankets, and surrogate mothers at their beck and call.
-		<<case "Body Purist">>
-			is decorated to be very clean cut and sterilized with perfect corners and curves; symbolic of the human figure. Nursery maids are encouraged to show off their natural assets to show the children what the appropriate body should be.
-		<<case "Slimness Enthusiast">>
-			constantly encourages the kids to try and keep their slim and cute physiques. They are given perfectly metered meals to make this possible.	/* TODO: tie this in to food system */
-		<<case "Hedonistic">>
-			would make any toddler drool in amazement. Meals and naps every other hour, cribs stalked with toys and blankets, and plush slaves carry them to and fro without preamble. A delicious layer of baby fat is the ideal figure of a baby, and they couldn't be happier.
-		<<case "Intellectual Dependency">>
-			/* TODO: */
-		<<case "Slave Professionalism">>
-			/* TODO: */
-		<<case "Petite Admiration">>
-			has large photos and paintings on the walls depicting small, petite children enjoying $nurseryName's amenities and having fun together.
-		<<case "Statuesque Glorification">>
-			has large photos and paintings on the walls depicting tall children enjoying $nurseryName's amenities and having fun together.	/* TODO: rewrite so it's not so similar? */
-		<<default>>
-			is as comfortable and child-friendly as it needs to be. They have everything they need to grow into a proper slave.
-	<</switch>>
-
-	<<if $MatronID>>
-		<<setLocalPronouns _S.Matron>>
-	<</if>>
-
-	<<if _NL > 2>>
-		_nurseryNameCaps is bustling with activity. Nannies are busily moving about, feeding babies and changing diapers.
-	<<elseif _NL > 0>>
-		_nurseryNameCaps is working steadily. Nannies are moving about, cleaning up and feeding hungry children.
-		<<set $nannyInfluence = 1>>
-	<<elseif $MatronID>>
-		_S.Matron.slaveName is alone in $nurseryName, and keeps the place clean and looks after the children $himself.
-	<<elseif (_NL <= 0) && ($nurseryChildren <= 0)>>
-		_nurseryNameCaps is empty and quiet.
-		<div class="choices" style="font-style:normal">
-			<<link "Decommission the Nursery" "Main">>
-				<<set $nursery = 0, $nurseryNannies = 0, $nannyInfluence = 0, $nurseryDecoration = "standard", $cribs = [], _reservedChildrenNursery = 0>>
-				<<for _i = 0; _i < $slaves.length; _i++>>
-					<<run WombCleanGenericReserve($slaves[_i], "nursery", 9999)>>
-				<</for>>
-			<</link>>
-		</div>
-	<</if>>
-</p>
-
-<div class="tab-bar">
-	/* <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'nannies')" id="tab nannies">Nannies</button> */
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'pregnant-slaves')" id="tab pregnant-slaves">Pregnant Slaves</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'children')" id="tab children">Children</button>
-</div>
-
-/*
-<div id="nannies" class="tab-content">
-	<div id="content">
-	*/
-		<<set _Tmult0 = Math.trunc($nurseryNannies*1000*$upgradeMultiplierArcology)>>
-		<br>It can support $nurseryNannies <<if $nurseryNannies != 1>>nannies<<else>>nanny<</if>>.
-		There <<if _NL == 1>>is<<else>>are<</if>> _NL <<if _NL != 1>>nannies<<else>>nanny<</if>> in $nurseryName.
-		<<if $nurseryChildren > 0 && _NL < 1 && (!_S.Matron)>>
-			<div class="note">
-				You must have a Matron or at least one nanny to be able to influence the children's upbringing
-			</div>
-		<</if>>
-		<<if $nurseryNannies < 5>>
-			<div class="choices">
-				[[Expand the nursery|Nursery][cashX(forceNeg(_Tmult0), "capEx"), $nurseryNannies += 1, $PC.skill.engineering += .1]]
-				<span class="note">
-					Costs <<print cashFormat(_Tmult0)>> and will increase upkeep costs
-				</span>
-			</div>
-		<<else>>
-			<span class="note">
-				_nurseryNameCaps can support a maximum of 5 slaves
-			</span>
-		<</if>>
-
-		<div class="choices">
-			<<if _NL > 0>>
-				<<includeDOM removeFacilityWorkers(App.Entity.facilities.nursery, "rest", "rest")>>
-			<</if>>
-		</div>
-
-		<div>
-			<<if _S.Matron>>
-				<<if $MatronIgnoresFlaws != 1>>
-					_S.Matron.slaveName will attempt to fix flaws in nannies serving under $him.
-					<div class="choices">
-						[[Ignore flaws|Nursery][$MatronIgnoresFlaws = 1]]
-					</div>
-				<<else>>
-					_S.Matron.slaveName has been instructed to ignore flaws in the nannies serving under $him.
-					<div class="choices">
-						[[Fix flaws|Nursery][$MatronIgnoresFlaws = 0]]
-					</div>
-				<</if>>
-			<</if>>
-		</div>
-
-		<p>
-			<<includeDOM App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.nursery)>>
-		</p>
-		/*
-	</div>
-</div>
-*/
-
-<div id="pregnant-slaves" class="tab-content">
-	<div id="content">
-		<br><br>
-		Reserve an eligible mother-to-be's child to be placed in a room upon birth. Of $nursery rooms, <<print _freecribs>> <<if _freecribs == 1>>is<<else>>are<</if>> unoccupied. Of those, _reservedChildrenNursery room<<if _reservedChildrenNursery == 1>> is<<else>>s are<</if>> reserved.
-
-		<<if (0 < _SL)>>
-			<<set $sortNurseryList = $sortNurseryList || 'Unsorted'>>
-			<br>
-			<span class="note">
-				Sorting:
-			</span>
-			''<span id="ql-nursery-sort">$sortNurseryList</span>.''
-			<<link "Sort by Name">>
-				<<set $sortNurseryList = 'Name'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByName();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Reserved Nursery Spots">>
-				<<set $sortNurseryList = 'Reserved Nursery Spots'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByReservedSpots();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Pregnancy Week">>
-				<<set $sortNurseryList = 'Pregnancy Week'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByPregnancyWeek();
-				<</script>>
-			<</link>> |
-			<<link "Sort by Number of Children">>
-				<<set $sortNurseryList = 'Number of Children'>>
-				<<replace "#ql-nursery-sort">>$sortNurseryList<</replace>>
-				<<script>>
-					sortNurseryPossiblesByPregnancyCount();
-				<</script>>
-			<</link>>
-			<br>
-		<</if>>
-		<div id="ql-nursery">
-			<<for _u = 0; _u < _SL; _u++>>
-				<<setLocalPronouns $slaves[_u]>>
-				<<if $slaves[_u].preg > 0 && $slaves[_u].broodmother == 0 && $slaves[_u].pregKnown == 1 && $slaves[_u].eggType == "human">>
-					<<if $slaves[_u].assignment == "work in the dairy" && $dairyPregSetting > 0>>
-					<<else>>
-						<<set _slaveId = "slave-" + $slaves[_u].ID>>
-						<<set _WL = $slaves[_u].womb.length>>
-						<<set _reservedNursery = WombReserveCount($slaves[_u], "nursery")>>
-						<<set _reservedIncubator = WombReserveCount($slaves[_u], "incubator")>>
-						<<set _pregWeek = $slaves[_u].pregWeek>>
-						<<set _slaveName = SlaveFullName($slaves[_u])>>
-						<div class="possible" @id="_slaveId" @data-preg-count="_WL" @data-reserved-spots="_reservedNursery" @data-preg-week="_pregWeek" @data-name="_slaveName">
-						<<print "[[_slaveName|Slave Interact][$AS = $slaves[" + _u + "].ID, $nextLink = passage()]]">> is <<= numberWithPluralOne($slaves[_u].pregWeek, "week")>> pregnant with
-						<<if $slaves[_u].pregSource == 0 || $slaves[_u].preg <= 5>>someone's<<if $slaves[_u].preg <= 5>>, though it is too early to tell whose,<</if>>
-						<<elseif $slaves[_u].pregSource == -1>>your
-						<<elseif $slaves[_u].pregSource == -2>>a citizen's
-						<<elseif $slaves[_u].pregSource == -3>>your Master's
-						<<elseif $slaves[_u].pregSource == -4>>another arcology owner's
-						<<elseif $slaves[_u].pregSource == -5>>your client's
-						<<elseif $slaves[_u].pregSource == -6>>the Societal Elite's
-						<<elseif $slaves[_u].pregSource == -7>>the lab's
-						<<elseif $slaves[_u].pregSource == -9>>the Futanari Sisters'
-						<<else>>
-							<<set _t = $slaveIndices[$slaves[_u].pregSource]>>
-							<<if def _t>>
-								<<print $slaves[_t].slaveName>>'s
-							<</if>>
-						<</if>>
-						<<if _WL > 1>>_WL babies<<else>>baby<</if>>.
-						<<if _reservedNursery > 0>>
-							<<set _childrenReservedNursery = 1>>
-							<<if _WL == 1>>
-								$His child will be placed in $nurseryName.
-							<<elseif _reservedNursery < _WL>>
-								_reservedNursery of $his children will be placed in $nurseryName.
-							<<elseif _WL == 2>>
-								Both of $his children will be placed in $nurseryName.
-							<<else>>
-								All _reservedNursery of $his children will be placed in $nurseryName.
-							<</if>>
-							<<if (_reservedIncubator + _reservedNursery < _WL) && (_reservedChildrenNursery < _freecribs)>>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep another child|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if _reservedNursery > 0>>
-									| <<print "[[Keep one less child|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<</if>>
-								<<if _reservedNursery > 1>>
-									| <<print "[[Keep none of " + $his + " children|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-								<<if (_reservedChildrenNursery + _WL - _reservedNursery) <= _freecribs>>
-									| <<print "[[Keep the rest of " + $his + " children|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<<elseif (_reservedNursery == _WL) || (_reservedChildrenNursery == _freecribs) || (_reservedIncubator + _reservedNursery == _WL)>>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep one less child|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if _reservedNursery > 1>>
-									| <<print "[[Keep none of " + $his + " children|Nursery][WombCleanGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<</if>>
-						<<elseif (_reservedChildrenNursery < _freecribs) && (_freecribs > _WL)>>
-							<<if _WL - _reservedIncubator == 0>>
-								<span class="note">
-									$His children are already reserved for <<= $incubator.name>>
-								</span>
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep " + $his + " " + ((_WL > 1) ? "children" : "child") + " here instead|Nursery][WombChangeReserveType($slaves[" + _u + "], 'incubator', 'nursery')]]">>
-							<<else>>
-								You have <<if _freecribs == 1>>an<</if>> @@.lime;available room<<if _freecribs > 1>>s<</if>>.@@
-								<br>&nbsp;&nbsp;&nbsp;&nbsp;
-								<<print "[[Keep "+ ((_WL > 1) ? "a" : "the") +" child|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 1)]]">>
-								<<if (_WL > 1) && (_reservedChildrenNursery + _WL - _reservedNursery) <= _freecribs>>
-									| <<print "[[Keep all of " + $his + " children|Nursery][WombAddToGenericReserve($slaves[" + _u + "], 'nursery', 9999)]]">>
-								<</if>>
-							<</if>>
-						<<elseif _reservedChildrenNursery == _freecribs>>
-							<br>&nbsp;&nbsp;&nbsp;&nbsp;
-							You have @@.red;no room for $his offspring.@@
-						<</if>>
-						<<set _eligibility = 1>>
-						</div>
-					<</if>>
-				<</if>>
-			<</for>>
-		</div>
-		<<script>>
-			$('div#ql-nursery').ready(sortNurseryPossiblesByPreviousSort);
-		<</script>>
-	</div>
-</div>
-
-<div id="children" class="tab-content">
-	<div id="content">
-		<p>
-			Target age for release: <<textbox "$targetAgeNursery" $targetAgeNursery "Nursery">>
-			[[Minimum Legal Age|Nursery][$targetAgeNursery = $minimumSlaveAge]] |
-			[[Average Age of Fertility|Nursery][$targetAgeNursery = $fertilityAge]] |
-			[[Average Age of Potency|Nursery][$targetAgeNursery = $potencyAge]] |
-			[[Legal Adulthood|Nursery][$targetAgeNursery = 18]]
-			<span class="note">
-				Setting will not be applied to rooms in use.
-			</span>
-		</p>
-
-		It can support $nursery child<<if $nursery != 1>>ren<</if>>. There <<if $nurseryChildren == 1>>is<<else>>are<</if>> currently $nurseryChildren room<<if $nurseryChildren != 1>>s<</if>> in use in $nurseryName.
-		<<if $nursery < 50>>
-			<div class="choices">
-				[[Add another room|Nursery][cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "nursery"), $nursery += 5]]
-				<span class="note">
-					Costs <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-				</span>
-				<<if _freecribs == 0>>
-					All of the rooms are currently occupied by growing children.
-				<</if>>
-			</div>
-		<<else>>
-			<span class="note">
-				_nurseryNameCaps can support a maximum of 50 children
-			</span>
-		<</if>>
-
-		<<if $nursery > 1 && _reservedChildrenNursery < _freecribs>>
-			<div class="choices">
-				[[Remove a room|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nursery -= 5]]
-				<span class="note">
-					Costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will reduce upkeep costs
-				</span>
-			</div>
-		<</if>>
-
-		<br>
-		<h3>Rules</h3>
-		<hr style="margin:0">
-		<<if $extremeUnderage>>
-			<<if $nurserySex>>
-				_nurseryNameCaps staff are ''allowed'' to molest the children. [[Forbid|Nursery][$nurserySex = 0]]
-			<<else>>
-				_nurseryNameCaps staff are ''not allowed'' to molest the children. [[Allow|Nursery][$nurserySex = 1]]
-			<</if>>
-		<</if>>
-		<br>
-
-		<<if $nurseryWeight>>
-			<<if $nurseryWeightSetting>>
-				Food intake ''is'' being managed; children will be raised at a healthy weight.
-				[[End managing|Nursery][$nurseryWeightSetting = 0]]
-			<<else>>
-				Food intake ''is not'' being managed; children may end up malnourished.
-				[[Begin managing|Nursery][$nurseryWeightSetting = 1]]
-			<</if>>
-		<<else>>
-			The amount of food the children eat ''is not'' being monitored, meaning they may end up becoming malnourished.
-			[[Monitor the amount of food the children eat|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryWeight = 1]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<if $nurseryMuscles>>
-			<<if $nurseryMusclesSetting>>
-				Exercise ''is'' being managed; children will be raised with average fitness.
-				[[End managing|Nursery][$nurseryMusclesSetting = 0]]
-			<<else>>
-				Children ''are not'' getting any exercise; they may end up quite weak and frail.
-				[[Begin managing|Nursery][$nurseryMusclesSetting = 1]]
-			<</if>>
-		<<else>>
-			The children ''are not'' getting any exercise, meaning they will likely end up becoming fairly weak and frail.
-			[[Allow the children to remain active|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryMuscles = 1]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<if $nurseryUpgradeHormones>>
-			<<if $nurseryHormonesSetting>>
-				Artificial hormone levels ''are'' being managed; children may experience precocious puberty.
-				[[Disable|Nursery][$nurseryHormonesSetting = 0]]
-			<<else>>
-				Artificial hormones ''are not'' being given; children will undergo normal puberty.
-				[[Activate|Nursery][$nurseryHormonesSetting = 1]]
-			<</if>>
-		<<else>>
-			The children ''are not'' being given any artificial hormones.
-			[[Give the children growth hormones|Nursery][cashX(forceNeg(Math.trunc(1000*$upgradeMultiplierArcology)), "nursery"), $nurseryUpgradeHormones = 1, $nurseryHormonesSetting = 0]]
-			<span class="note">
-				Requires a Matron or at least one nanny and costs <<print cashFormat(Math.trunc(1000*$upgradeMultiplierArcology))>> and will increase upkeep costs
-			</span>
-		<</if>>
-		<br>
-
-		<<includeDOM App.Facilities.Nursery.childList()>>
-	</div>
-</div>
-
-<p>
-	Rename $nurseryName: <<textbox "$nurseryName" $nurseryName "Nursery">>
-	<span class="note">
-		Use a noun or similar short phrase
-	</span>
-</p>
-
-<<run App.UI.SlaveList.ScrollPosition.restore()>>
diff --git a/src/facilities/surgery/multiImplant.js b/src/facilities/surgery/multiImplant.js
index 3849bf27e49fe2e9dd608bf4b790415b192cc96a..c5463b0510b5d840f343b52d742ec2bc9fe6849c 100644
--- a/src/facilities/surgery/multiImplant.js
+++ b/src/facilities/surgery/multiImplant.js
@@ -170,7 +170,8 @@ App.UI.multipleOrganImplant = function() {
 						break;
 					case "modT":
 					case "sexT":
-					case "combatT":
+					case "combatT1":
+					case "combatT2":
 						if (slave.PTail === 0) {
 							App.UI.DOM.appendNewElement("span", div, `Since ${he} must have ${addA(App.Data.prosthetics.interfaceTail.name)} installed to attach tails the ${App.Data.prosthetics[p.id].name} will be put into storage.`, "note");
 						} else if (slave.tail !== "none") {
@@ -178,11 +179,16 @@ App.UI.multipleOrganImplant = function() {
 						} else if (p.id === "modT") {
 							App.UI.DOM.appendNewElement("span", div, `Since installing ${addA(App.Data.prosthetics.modT.name)} is complicated it can't be automated.`, "note");
 							/* Reason: there are different designs player can choose from.*/
-						} else if (p.id === "combatT") {
+						} else if (p.id === "combatT1") {
 							V.prostheticsConfig = "attachTail";
 							slave.tail = "combat";
 							slave.tailColor = "jet black";
 							node.append(App.UI.prostheticsConfigPassage());
+						} else if (p.id === "combatT2") {
+							V.prostheticsConfig = "attachTail";
+							slave.tail = "stinger";
+							slave.tailColor = "purple";
+							node.append(App.UI.prostheticsConfigPassage());
 						} else if (p.id === "sexT") {
 							V.prostheticsConfig = "attachTail";
 							slave.tail = "sex";
@@ -190,6 +196,54 @@ App.UI.multipleOrganImplant = function() {
 							node.append(App.UI.prostheticsConfigPassage());
 						}
 						break;
+					case "interfaceBack":
+						slave.PBack = 1;
+						slave.appendages = "none";
+						slave.appendagesColor = "none";
+						cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave);
+						surgeryDamage(slave, 10);
+						V.surgeryType = "backInterface";
+						node.append(App.UI.SlaveInteract.surgeryDegradation(slave));
+						break;
+					case "modW":
+					case "flightW":
+					case "sexA":
+					case "combatW":
+					case "combatA1":
+					case "combatA2":
+						if (slave.PBack === 0) {
+							App.UI.DOM.appendNewElement("span", div, `Since ${he} must have ${addA(App.Data.prosthetics.interfaceBack.name)} installed to attach dorsal appendages the ${App.Data.prosthetics[p.id].name} will be put into storage.`, "note");
+						} else if (slave.appendages !== "none") {
+							App.UI.DOM.appendNewElement("span", div, `Since ${he} currently has dorsal appendages attached the ${App.Data.prosthetics[p.id].name} will be put into storage.`, "note");
+						} else if (p.id === "modW") {
+							App.UI.DOM.appendNewElement("span", div, `Since installing ${addA(App.Data.prosthetics.modT.name)} is complicated it can't be automated.`, "note");
+							/* Reason: there are different designs player can choose from.*/
+						} else if (p.id === "combatW") {
+							V.prostheticsConfig = "attachAppendages";
+							slave.appendages = "combat";
+							slave.appendagesColor = "jet black";
+							node.append(App.UI.prostheticsConfigPassage());
+						} else if (p.id === "combatA1") {
+							V.prostheticsConfig = "attachAppendages";
+							slave.appendages = "arachnid";
+							slave.appendagesColor = "jet black";
+							node.append(App.UI.prostheticsConfigPassage());
+						} else if (p.id === "combatA2") {
+							V.prostheticsConfig = "attachAppendages";
+							slave.appendages = "kraken";
+							slave.appendagesColor = "jet black";
+							node.append(App.UI.prostheticsConfigPassage());
+						} else if (p.id === "flightW") {
+							V.prostheticsConfig = "attachAppendages";
+							slave.appendages = "flight";
+							slave.appendagesColor = "silver";
+							node.append(App.UI.prostheticsConfigPassage());
+						}  else if (p.id === "sexA") {
+							V.prostheticsConfig = "attachAppendages";
+							slave.appendages = "sex";
+							slave.appendagesColor = "pink";
+							node.append(App.UI.prostheticsConfigPassage());
+						}
 					default:
 						App.UI.DOM.appendNewElement("span", div, `Since there is no automated procedure to implant/attach ${App.Data.prosthetics[p.id].name} it will be put into storage.`, "note");
 				}
diff --git a/src/facilities/surgery/surgeryPassageStructural.js b/src/facilities/surgery/surgeryPassageStructural.js
index 85c9d6ccb4e38c77c082b52c576ddc822751c790..72903f74860444d05eb0aa135cc5778afad0ff8b 100644
--- a/src/facilities/surgery/surgeryPassageStructural.js
+++ b/src/facilities/surgery/surgeryPassageStructural.js
@@ -25,7 +25,7 @@ App.UI.surgeryPassageStructural = function(slave, refreshParent, cheat = false)
 		App.UI.DOM.appendNewElement("h3", frag, `Amputation`);
 		frag.append(amputate());
 		App.UI.DOM.appendNewElement("h3", frag, `Prosthetics`);
-		frag.append(prostheticInterface(), tail(), App.Medicine.OrganFarm.fullMenu(slave));
+		frag.append(prostheticInterface(), tail(), back(), App.Medicine.OrganFarm.fullMenu(slave));
 
 		return frag;
 
@@ -436,6 +436,31 @@ App.UI.surgeryPassageStructural = function(slave, refreshParent, cheat = false)
 			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(linkArray), "choices");
 			return el;
 		}
+		function back() {
+			const el = new DocumentFragment();
+			const r = [];
+			const linkArray = [];
+			if (slave.PBack === 1) {
+				r.push(`${He} has a neural back interface allowing attachment of dorsal appendages.`);
+			} else if (isProstheticAvailable(slave, "interfaceBack")) {
+				r.push(`${He} lacks a neural back interface allowing attachment of dorsal appendages.`);
+				linkArray.push(makeLink(
+					"Implant back interface",
+					"backInterface",
+					() => {
+						slave.PBack = 1;
+						slave.appendages = "none";
+						slave.appendagesColor = "none";
+						surgeryDamage(slave, 20);
+					}
+				));
+			} else {
+				r.push(`${He} lacks a neural back interface allowing attachment of dorsal appendages and you have none ready for ${him}.`);
+			}
+			App.Events.addNode(el, r, "div");
+			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(linkArray), "choices");
+			return el;
+		}
 	}
 
 	/**
diff --git a/src/gui/favorite.js b/src/gui/favorite.js
index 8a0447090154abb12f96f1ae2810b1eca1864cb4..97204b9bfee948bfe41e1ca34b93cc7e60ef0036 100644
--- a/src/gui/favorite.js
+++ b/src/gui/favorite.js
@@ -1,14 +1,19 @@
 /** Render a link that toggles the slave's favorite status
  * @param {App.Entity.SlaveState} slave
+ * @param {function():void} [handler]
  * @returns {HTMLAnchorElement}
  */
-App.UI.favoriteToggle = function(slave) {
+App.UI.favoriteToggle = function(slave, handler) {
 	function favLink() {
 		const linkID = `fav-link-${slave.ID}`;
 		if (V.favorites.includes(slave.ID)) {
 			const link = App.UI.DOM.link(String.fromCharCode(0xe800), () => {
 				V.favorites.delete(slave.ID);
 				$(`#${linkID}`).replaceWith(favLink());
+
+				if (handler) {
+					handler();
+				}
 			});
 			link.classList.add("icons", "favorite");
 			link.id = linkID;
@@ -17,6 +22,10 @@ App.UI.favoriteToggle = function(slave) {
 			const link = App.UI.DOM.link(String.fromCharCode(0xe801), () => {
 				V.favorites.push(slave.ID);
 				$(`#${linkID}`).replaceWith(favLink());
+
+				if (handler) {
+					handler();
+				}
 			});
 			link.classList.add("icons", "not-favorite");
 			link.id = linkID;
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index 9c0828948831cea3713ba1ed5422dabd2b594335..b22f7a2f99ed286f0e4596f3b71efe813df9b946 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -39,7 +39,27 @@ App.UI.optionsPassage = function() {
 			.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
 		el.append(options.render());
 
-		App.UI.DOM.appendNewElement("div", el, `This save was created using FC version ${V.ver} build ${V.releaseID}. You are currently playing version: ${App.Version.base}, mod version: ${App.Version.pmod}, build: ${App.Version.release}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`);
+		const table = App.UI.DOM.appendNewElement("table", el);
+		let row;
+		fillRow([
+			`You are currently playing:`,
+			`FC version: ${App.Version.base},`,
+			`mod version: ${App.Version.pmod},`,
+			`build: ${App.Version.release}${App.Version.commitHash ? `, commit: ${App.Version.commitHash}` : ``}`
+		]);
+		fillRow([
+			`This save was created using:`,
+			App.UI.DOM.makeElement("span", `FC version: ${V.ver},`, (V.ver !== App.Version.base)? "yellow": null),
+			``,
+			App.UI.DOM.makeElement("span", `build: ${V.releaseID}.`, (V.releaseID !== App.Version.release) ? "red" : null)
+		]);
+
+		function fillRow(contents) {
+			row = App.UI.DOM.appendNewElement("tr", table);
+			for (const content of contents) {
+				App.UI.DOM.appendNewElement("td", row, content);
+			}
+		}
 
 		links = [];
 		links.push(App.UI.DOM.passageLink("Apply Backwards Compatibility Update", "Backwards Compatibility"));
@@ -112,29 +132,15 @@ App.UI.optionsPassage = function() {
 
 		if ((V.releaseID >= 1000) || V.ver.startsWith("0.9") || V.ver.startsWith("0.8") || V.ver.startsWith("0.7") || V.ver.startsWith("0.6")) {
 			App.UI.DOM.appendNewElement("h3", el, `NEW GAME PLUS`);
-			r = [];
-			r.push(`You can begin a new game with up to five (or more) of your current slaves, although starting resources other than these slaves will be reduced. New Game Plus`);
-			r.push(App.UI.DOM.makeElement("span", "MAY", "yellow"));
-			r.push(`work across versions. To attempt to migrate a save across versions:`);
-			App.Events.addNode(el, r, "div", "note");
-
-			const ngpInstructions = document.createElement("ol");
-			App.UI.DOM.appendNewElement("li", ngpInstructions, "Save on this screen", "note");
-			App.UI.DOM.appendNewElement("li", ngpInstructions, "Re-open the .html in a new tab then load the above save.", "note");
-			App.UI.DOM.appendNewElement(
-				"li",
-				ngpInstructions,
-				App.UI.DOM.link(
-					"Activate New Game Plus.",
-					() => {
-						V.ui = "start";
-					},
-					[],
-					"New Game Plus"
-				),
-				"note"
-			);
-			el.append(ngpInstructions);
+			App.UI.DOM.appendNewElement("div", el, `You can begin a new game with up to five (or more) of your current slaves, although starting resources other than these slaves will be reduced.`);
+			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+				"Activate New Game Plus.",
+				() => {
+					V.ui = "start";
+				},
+				[],
+				"New Game Plus"
+			));
 		} else {
 			App.UI.DOM.appendNewElement("div", el, `New Game Plus is not available because this game was not started with a compatible version.`, "note");
 		}
@@ -144,6 +150,7 @@ App.UI.optionsPassage = function() {
 	function mods() {
 		const el = new DocumentFragment();
 		let options;
+		let option;
 
 		options = new App.UI.OptionsGroup();
 
@@ -156,9 +163,11 @@ App.UI.optionsPassage = function() {
 			.addValue("Disabled", 0).off()
 			.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div>");
 
-		options.addOption("Catmod is currently", "seeCats")
-			.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
-			.addComment("Will not murder existing catgirls, you have to do that yourself.");
+		option = options.addOption("Catmod is currently", "seeCats")
+			.addValue("Enabled", 1).on().addValue("Disabled", 0).off();
+		if (V.seeCats) {
+			option.addComment(`Disabling Catmod will not murder existing catgirls, you have to do that yourself. <span style="font-style:normal">😿</span>`);
+		}
 
 		el.append(options.render());
 
diff --git a/src/interaction/prostheticConfig.js b/src/interaction/prostheticConfig.js
index 60ecd99005b8afd647e4c58bf27dece9cc1d6540..4a9da669efac28d7ad2fad44be5aa6c9ffebb08e 100644
--- a/src/interaction/prostheticConfig.js
+++ b/src/interaction/prostheticConfig.js
@@ -34,6 +34,7 @@ App.UI.prostheticsConfig = function(slave) {
 	fragment.append(voice());
 	fragment.append(limbs());
 	fragment.append(tail());
+	fragment.append(appendages());
 
 	fragment.append(buyScreen());
 
@@ -295,13 +296,20 @@ App.UI.prostheticsConfig = function(slave) {
 					App.UI.DOM.appendNewElement("div", p, linkStrip(links), "choices");
 				}
 				const links = [];
-				if (isProstheticAvailable(slave, "combatT")) {
+				if (isProstheticAvailable(slave, "combatT1")) {
 					links.push(App.UI.DOM.passageLink("Attach Combat Tail", "Prosthetics Configuration", () => {
 						V.prostheticsConfig = "attachTail";
 						slave.tail = "combat";
 						slave.tailColor = "jet black";
 					}));
 				}
+				if (isProstheticAvailable(slave, "combatT2")) {
+					links.push(App.UI.DOM.passageLink("Attach Combat Tail Scorpio", "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachTail";
+						slave.tail = "stinger";
+						slave.tailColor = "purple";
+					}));
+				}
 				if (isProstheticAvailable(slave, "sexT")) {
 					links.push(App.UI.DOM.passageLink("Attach Pleasure Tail", "Prosthetics Configuration", () => {
 						V.prostheticsConfig = "attachTail";
@@ -332,6 +340,99 @@ App.UI.prostheticsConfig = function(slave) {
 		return f;
 	}
 
+	function appendages() {
+		const f = document.createDocumentFragment();
+		App.UI.DOM.appendNewElement("h2", f, "Back");
+
+		const p = document.createElement("p");
+
+		if (slave.PBack === 1) {
+			App.UI.DOM.appendNewElement("div", p, `${He} has a neural back interface installed. You can assign and adjust ${his} back appendages here.`);
+
+			if (slave.appendages !== "none") {
+				App.UI.DOM.appendNewElement("div", p, `${He} currently has back appendages attached, if you wish to change them you first need to detach them.`);
+				App.UI.DOM.appendNewElement("div", p,
+					App.UI.DOM.passageLink("Detach", "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "detachAppendages";
+						V.nextButton = "Continue";
+						V.nextLink = "Prosthetics Configuration";
+					}), "choices");
+			} else {
+				if (isProstheticAvailable(slave, "modW")) {
+					App.UI.DOM.appendNewElement("div", p, "Attach a pair of modular wings designed to look like a:");
+
+					const links = [];
+					App.Data.modWings.forEach((value, key) => {
+						links.push(App.UI.DOM.passageLink(`${value.animal}'s Wings`, "Prosthetics Configuration",
+							() => {
+								V.prostheticsConfig = "attachAppendages";
+								slave.appendages = "modW";
+								slave.wingsShape = key;
+								slave.appendagesColor = "white";
+							}
+						));
+					});
+					App.UI.DOM.appendNewElement("div", p, linkStrip(links), "choices");
+				}
+				const links = [];
+				if (isProstheticAvailable(slave, "combatW")) {
+					links.push(App.UI.DOM.passageLink("Attach a pair of Combat Wings", "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachAppendages";
+						slave.appendages = "falcon";
+						slave.appendagesColor = "jet black";
+					}));
+				}
+				if (isProstheticAvailable(slave, "combatA1")) {
+					links.push(App.UI.DOM.passageLink(`Attach the "Arachnid" Combat Appendages`, "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachAppendages";
+						slave.appendages = "arachnid";
+						slave.appendagesColor = "jet black";
+					}));
+				}
+				if (isProstheticAvailable(slave, "combatA2")) {
+					links.push(App.UI.DOM.passageLink(`Attach the "Kraken" Combat Appendages`, "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachAppendages";
+						slave.appendages = "kraken";
+						slave.appendagesColor = "jet black";
+					}));
+				}
+				if (isProstheticAvailable(slave, "flightW")) {
+					links.push(App.UI.DOM.passageLink("Attach a pair of Wings capable of flight", "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachAppendages";
+						slave.appendages = "flight";
+						slave.appendagesColor = "silver";
+					}));
+				}
+				if (isProstheticAvailable(slave, "sexA")) {
+					links.push(App.UI.DOM.passageLink("Attach a set of Pleasure Appendages", "Prosthetics Configuration", () => {
+						V.prostheticsConfig = "attachAppendages";
+						slave.appendages = "sex";
+						slave.appendagesColor = "pink";
+					}));
+				}
+				App.UI.DOM.appendNewElement("div", p, linkStrip(links), "choices");
+			}
+
+			if (slave.wings === "modW") {
+				App.UI.DOM.appendNewElement("div", p,
+					`${He} currently has a pair of modular wings, styled to look like ${App.Data.modWings.get(slave.wingsShape).desc}. Modify the appearance of ${his} wings:`);
+
+				const links = [];
+				App.Data.modWings.forEach((value, key) => {
+					links.push(App.UI.DOM.passageLink(value.animal, "Prosthetics Configuration", () => {
+						slave.wingsShape = key;
+						cashX(forceNeg(V.modCost), "slaveMod", slave);
+					}));
+				});
+				App.UI.DOM.appendNewElement("div", p, linkStrip(links), "choices");
+			}
+		} else {
+			App.UI.DOM.appendNewElement("span", p, `${He} does not have a neural back interface installed so you cannot attach appendages.`, "note");
+		}
+		f.append(p);
+		return f;
+	}
+
 	/**
 	 * @returns {DocumentFragment}
 	 */
@@ -561,32 +662,117 @@ App.UI.prostheticsConfigPassage = function() {
 			V.nextLink = "Prosthetics Configuration";
 			App.UI.DOM.appendNewElement("div", node, `Attaching ${his} tail is a simple procedure, you simply push the connector into a socket, right where ${his} tailbone ends, until the lock engages.`);
 			r.push(`When you are done, ${he} looks back and`);
-			if (slave.tailShape === "neko") {
+			if (slave.tailShape === "cat") {
+				r.push(`sways ${his} tail side to side enigmatically.`);
+			} else if (slave.tailShape === "leopard") {
+				r.push(`sways ${his} tail side to side enigmatically.`);
+			} else if (slave.tailShape === "tiger") {
+				r.push(`sways ${his} tail side to side enigmatically.`);
+			} else if (slave.tailShape === "jaguar") {
 				r.push(`sways ${his} tail side to side enigmatically.`);
-			} else if (slave.tailShape === "inu") {
+			} else if (slave.tailShape === "cheeta") {
+				r.push(`sways ${his} tail side to side enigmatically.`);
+			} else if (slave.tailShape === "dog") {
+				r.push(`wags ${his} tail side to side energetically.`);
+			} else if (slave.tailShape === "wolf") {
+				r.push(`wags ${his} tail side to side energetically.`);
+			} else if (slave.tailShape === "jackal") {
 				r.push(`wags ${his} tail side to side energetically.`);
-			} else if (slave.tailShape === "kit") {
+			} else if (slave.tailShape === "fox") {
 				r.push(`slowly sways ${his} tail feeling the soft fur brush against ${his} skin.`);
 			} else if (slave.tailShape === "kitsune") {
 				r.push(`slowly sways ${his} tails luxuriating in the incredibly soft, fluffy fur brushing against ${his} skin.`);
-			} else if (slave.tailShape === "tanuki") {
+			} else if (slave.tailShape === "raccoon") {
 				r.push(`admires ${his} long, thick fluffy tail.`);
-			} else if (slave.tailShape === "ushi") {
-				r.push(`swats ${himself} playfully.`);
-			} else if (slave.tailShape === "usagi") {
+			} else if (slave.tailShape === "rabbit") {
 				r.push(`wiggles ${his} little tail a bit.`);
-			} else if (slave.tailShape === "risu") {
+			} else if (slave.tailShape === "squirrel") {
 				r.push(`admires ${his} the size of ${his} fluffy tail.`);
-			} else if (slave.tailShape === "uma") {
+			} else if (slave.tailShape === "horse") {
 				r.push(`sways ${his} tail back and forth.`);
+			} else if (slave.tailShape === "bird") {
+				r.push(`ruffles ${his} tail feathers.`);
+			} else if (slave.tailShape === "phoenix") {
+				r.push(`ruffles ${his} tail feathers.`);
+			} else if (slave.tailShape === "peacock") {
+				r.push(`ruffles ${his} tail feathers.`);;
+			} else if (slave.tailShape === "raven") {
+				r.push(`ruffles ${his} tail feathers.`);
+			} else if (slave.tailShape === "swan") {
+				r.push(`wiggles ${his} small bundle of tail feathers.`);
+			} else if (slave.tailShape === "sheep") {
+				r.push(`wiggles ${his} short, wooly tail.`);
+			} else if (slave.tailShape === "cow") {
+				r.push(`swats ${himself} playfully.`);
+			} else if (slave.tailShape === "gazelle") {
+				r.push(`wiggles ${his} little tail a bit.`);
+			} else if (slave.tailShape === "deer") {
+				r.push(`wiggles ${his} little tail a bit.`);
+			} else if (slave.tailShape === "succubus") {
+				r.push(`waves ${his} tail at you, showing considerable dexterity with it.`);
+			} else if (slave.tailShape === "dragon") {
+				r.push(`strokes the scales of ${his} tail.`);
 			} else if (slave.tail === "combat") {
 				r.push(`experimentally whips the long tail side to side then takes aim at a prepared fruit, lashes out with blinding speed and smiles as it explodes into chunks.`);
+			} else if (slave.tail === "stinger") {
+				r.push(`experimentally whips the long, segmented tail side to side and tries lashing out with it. ${He} then aims its stinger towards a prepared fruit, fires a projectile and smiles as it accurately strikes ${his} target.`);
 			} else if (slave.tail === "sex") {
 				r.push(`accidentally engages the vibrating and lube functions, startling ${him} and making quite a mess.`);
 			} else {
 				r.push(`admires ${his} new tail.`);
 			}
 			break;
+		case "detachAppendages":
+			V.prostheticsConfig = "main";
+			V.nextButton = "Continue";
+			V.nextLink = "Prosthetics Configuration";
+			slave.appendages = "none";
+			slave.wingsShape = "none";
+			slave.appendagesColor = "none";
+			r.push(`You send the release signal and the mechanical locks disengage allowing the dorsal appendages to be removed.`);
+			break;
+		case "attachAppendages":
+			V.prostheticsConfig = "main";
+			V.nextButton = "Continue";
+			V.nextLink = "Prosthetics Configuration";
+			App.UI.DOM.appendNewElement("div", node, `Attaching ${his} dorsal appendages is a simple procedure, you simply push the connectors into their socket, on either side of the vertebrae located between ${his} shoulder blades , until they lock in place.`);
+			r.push(`When you are done, ${he} looks back and`);
+			if (slave.wingsShape === "angel") {
+				r.push(`tries flapping ${his} wings.`);
+			} else if (slave.wingsShape === "seraph") {
+				r.push(`tries flapping ${his} six wings.`);
+			} else if (slave.wingsShape === "demon") {
+				r.push(`tries flapping ${his} wings.`);
+			} else if (slave.wingsShape === "dragon") {
+				r.push(`tries beating ${his} wings.`);
+			} else if (slave.wingsShape === "phoenix") {
+				r.push(`tries flapping ${his} wings.`);
+			} else if (slave.wingsShape === "bird") {
+				r.push(`tries flapping ${his} wings.`);
+			} else if (slave.wingsShape === "fairy") {
+				r.push(`flutters ${his} wings.`);
+			} else if (slave.wingsShape === "butterfly") {
+				r.push(`flutters ${his} wings.`);
+			} else if (slave.wingsShape === "moth") {
+				r.push(`flutters ${his} wings.`);
+			} else if (slave.wingsShape === "insect") {
+				r.push(`flutters ${his} wings.`);
+			} else if (slave.wingsShape === "evil") {
+				r.push(`tries beating ${his} wings.`);
+			} else if (slave.appendages === "falcon") {
+				r.push(`admires ${his} sleek, sharp-edged wings.`);
+			} else if (slave.appendages === "arachnid") {
+				r.push(`tries extending and contracting ${his} menacing spider legs. Eventually ${he} manages to lift ${him}self of the ground and moves around using the legs.`);
+			} else if (slave.appendages === "kraken") {
+				r.push(`tries extending and contracting ${his} new tentacles. Eventually ${he} manages to lift ${him}self of the ground and moves around using the tentacles.`);
+			} else if (slave.appendages === "sex") {
+				r.push(`tries examening the many different tips of ${his} new pleasure appendages before accidentally engaging their vibrating and lube functions, startling ${him} and making a huge mess.`);
+			} else if (slave.appendages === "flight") {
+				r.push(`tries engaging ${his} wing thrusters. Feeling ${his} feet leave the ground, ${he} hurriedly disengages the thrusters before flying too high.`);
+			} else {
+				r.push(`admires ${his} new dorsal appendages.`);
+			}
+			break;
 	}
 	App.Utils.scheduleSidebarRefresh();
 	if (r.length > 0) {
diff --git a/src/interaction/prostheticLab.js b/src/interaction/prostheticLab.js
index 5a34abceb4f036a6730c7dd06fbdf59bcf0ace65..9020f256ce388a89a5eceae9887be35ca7da3f54 100644
--- a/src/interaction/prostheticLab.js
+++ b/src/interaction/prostheticLab.js
@@ -19,8 +19,17 @@ globalThis.getProstheticsStockpile = function() {
 		/* `<div class="choices">Erectile: ${V.prosthetics.erectile.amount}</div>` + */
 		`<div class="choices">Electrolarynx: ${V.prosthetics.electrolarynx.amount}</div>` +
 		`<div>Tail interface: ${V.prosthetics.interfaceTail.amount}</div>` +
-		`<div>Tails: ${num(V.prosthetics.modT.amount + V.prosthetics.sexT.amount + V.prosthetics.combatT.amount)}</div>` +
+		`<div>Tails: ${num(V.prosthetics.modT.amount + V.prosthetics.sexT.amount + V.prosthetics.combatT1.amount + V.prosthetics.combatT2.amount)}</div>` +
 		`<div class="choices">Modular: ${V.prosthetics.modT.amount}</div>` +
 		`<div class="choices">Pleasure: ${V.prosthetics.sexT.amount}</div>` +
-		`<div class="choices">Combat: ${V.prosthetics.combatT.amount}</div>`;
+		`<div class="choices">Combat: ${V.prosthetics.combatT1.amount}</div>` +
+		`<div class="choices">Stinger: ${V.prosthetics.combatT2.amount}</div>` +
+		`<div>Back interface: ${V.prosthetics.interfaceBack.amount}</div>` +
+		`<div>Appedages: ${num(V.prosthetics.modW.amount + V.prosthetics.flightW.amount + V.prosthetics.combatW.amount + V.prosthetics.sexA.amount + V.prosthetics.combatA1.amount + V.prosthetics.combatA2.amount)}</div>` +
+		`<div class="choices">Modular Wings: ${V.prosthetics.modW.amount}</div>` +
+		`<div class="choices">Aerial Wings: ${V.prosthetics.flightW.amount}</div>` +
+		`<div class="choices">Pleasure Appendages: ${V.prosthetics.sexA.amount}</div>`; +
+		`<div class="choices">Combat Wings: ${V.prosthetics.combatW.amount}</div>`; +
+		`<div class="choices">Arachnid: ${V.prosthetics.combatA1.amount}</div>`; +
+		`<div class="choices">Kraken: ${V.prosthetics.combatA2.amount}</div>`; 
 };
diff --git a/src/interaction/siCustom.js b/src/interaction/siCustom.js
index 49442c34c6a1a584be6c5db11cf60dc2a8de2b14..3cfde0243b1b2a4cbc9e31186f432dce1217d3b9 100644
--- a/src/interaction/siCustom.js
+++ b/src/interaction/siCustom.js
@@ -11,23 +11,29 @@ App.UI.SlaveInteract.custom = function(slave, refresh) {
 
 	const el = document.createElement('div');
 
-	el.appendChild(intro());
+	el.append(intro());
 
 	App.UI.DOM.appendNewElement("h3", el, `Art`);
-	el.appendChild(customSlaveImage());
-	el.appendChild(customHairImage());
+	el.append(
+		customSlaveImage(),
+		customHairImage()
+	);
 
 	App.UI.DOM.appendNewElement("h3", el, `Names`);
-	el.appendChild(playerTitle());
-	el.appendChild(slaveFullName());
+	el.append(
+		playerTitle(),
+		slaveFullName()
+	);
 
 	App.UI.DOM.appendNewElement("h3", el, `Description`);
-	el.appendChild(hair());
-	el.appendChild(eyeColor());
-	el.appendChild(customTattoo());
-	el.appendChild(customOriginStory());
-	el.appendChild(customDescription());
-	el.appendChild(customLabel());
+	el.append(
+		hair(),
+		eyeColor(),
+		customTattoo(),
+		customOriginStory(),
+		customDescription(),
+		customLabel()
+	);
 
 	return el;
 
diff --git a/src/interaction/siDescription.js b/src/interaction/siDescription.js
index cbf71e275f2aece1644c9b3154409a40d75b6024..b24edf931f997596a1dec77510d81b973a965f14 100644
--- a/src/interaction/siDescription.js
+++ b/src/interaction/siDescription.js
@@ -3,15 +3,17 @@ App.UI.SlaveInteract.description = function(slave) {
 	const descriptionLink = document.createElement("div");
 	descriptionLink.style.fontStyle = "italic";
 	descriptionLink.id = "description-link";
-	if (V.seeDetails === 1) {
-		descriptionLink.append(showOptions());
-		el.append(descriptionLink);
 
+	if (V.seeDetails === 1) {
 		const descriptionOptions = document.createElement("div");
+
 		descriptionOptions.id = "description-options";
 		el.append(descriptionOptions);
 
 		el.append(App.Desc.longSlave(slave, {noArt: true}));
+
+		descriptionLink.append(showOptions());
+		el.append(descriptionLink);
 	} else {
 		descriptionLink.append(
 			App.UI.DOM.link(
diff --git a/src/interaction/siFinancial.js b/src/interaction/siFinancial.js
index c5300f4e18c661b199241b16eefabffbccb0c913..c6d2f9cdadb17f1851bd81e522d63aeab1fab920 100644
--- a/src/interaction/siFinancial.js
+++ b/src/interaction/siFinancial.js
@@ -11,6 +11,7 @@ App.UI.SlaveInteract.financial = function(slave, refresh) {
 		He, His,
 		his, him
 	} = getPronouns(slave);
+
 	if (V.studio === 1) {
 		App.UI.DOM.appendNewElement("h3", el, "Media");
 		slave.porn.spending = Math.clamp(Math.ceil(slave.porn.spending / 1000) * 1000, 0, 5000);
diff --git a/src/interaction/siModify.js b/src/interaction/siModify.js
index 166c8bb194984cec08b318803e3b87818595b44b..e95089968f71eaeb21ed77f932be72f84e8c4b96 100644
--- a/src/interaction/siModify.js
+++ b/src/interaction/siModify.js
@@ -8,7 +8,7 @@ App.UI.SlaveInteract.modify = function(slave) {
 
 	const isAgent = [Job.AGENT, Job.AGENTPARTNER].includes(slave.assignment);
 
-	App.UI.DOM.appendNewElement('p', el, isAgent ? "Recall your agent to modify them." : "Take slave to another room.", "scene-intro");
+	App.UI.DOM.appendNewElement('p', el, isAgent ? "Recall your agent to modify them." : "Take slave to another room.", ["scene-intro"]);
 
 	if (isAgent) {
 		return el;
diff --git a/src/interaction/siNavigation.js b/src/interaction/siNavigation.js
index e6e7bc4b36f716b9e4cad1624e4f4927712082dc..c3c7b95432a96a96b8de212f648d899c238b0919 100644
--- a/src/interaction/siNavigation.js
+++ b/src/interaction/siNavigation.js
@@ -17,25 +17,45 @@ App.UI.SlaveInteract.navigation = function(slave) {
 	}
 
 	const placeInLine = App.UI.SlaveInteract.placeInLine(slave);
+	const div = App.UI.DOM.appendNewElement("div", p, null);
+	const previous = App.UI.DOM.makeElement("span", null, ['adjacent-slave', 'margin-right']);
+	const next = App.UI.DOM.makeElement("span", null, ['adjacent-slave', 'margin-left']);
+	const name = App.UI.DOM.makeElement("h1", slave.slaveName, ['slave-name', 'h1']);
 
-	App.UI.DOM.appendNewElement("span", p, App.UI.Hotkeys.hotkeys("prev-slave"), "hotkey");
-	const prevSpan = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Prev", "Slave Interact",
-		() => { V.AS = placeInLine[0]; }), "adjacent-slave");
-	prevSpan.id = "prev-slave";
-	p.append(" ", prevSpan);
+	name.style.display = 'inline-block';
 
-	const centerSpan = document.createElement("span");
-	centerSpan.classList.add("interact-name");
+	previous.id = "prev-slave";
+	next.id = "next-slave";
 
-	App.UI.DOM.appendNewElement("span", centerSpan, slave.slaveName, "slave-name");
-	centerSpan.append(" ", App.UI.favoriteToggle(slave));
-	p.append(centerSpan);
+	previous.append(
+		App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("prev-slave"), ['hotkey']),
+		App.UI.DOM.makeElement("span", App.UI.DOM.passageLink(" Prev ", "Slave Interact",
+			() => { V.AS = placeInLine[0]; }),
+		),
+	);
+	next.append(
+		App.UI.DOM.makeElement("span", App.UI.DOM.passageLink(" Next ", "Slave Interact",
+			() => { V.AS = placeInLine[1]; }), ["adjacent-slave"]),
+		App.UI.DOM.makeElement("span", App.UI.Hotkeys.hotkeys("next-slave"), ['hotkey']),
+	);
 
-	const nextSpan = App.UI.DOM.makeElement("span", App.UI.DOM.passageLink("Next", "Slave Interact",
-		() => { V.AS = placeInLine[1]; }), "adjacent-slave");
-	nextSpan.id = "next-slave";
-	p.append(nextSpan, " ");
-	App.UI.DOM.appendNewElement("span", p, App.UI.Hotkeys.hotkeys("next-slave"), "hotkey");
+	function content() {
+		const frag = new DocumentFragment();
+
+		frag.append(
+			previous,
+			name,
+			' ',
+			App.UI.DOM.makeElement("span", App.UI.favoriteToggle(slave, () => {
+				App.UI.DOM.replace(div, content());
+			}), ['h1']),
+			next,
+		);
+
+		return frag;
+	}
+
+	div.append(content());
 
 	return p;
 };
diff --git a/src/interaction/siPhysicalRegimen.js b/src/interaction/siPhysicalRegimen.js
index 1736d8532eb7a5bb9bae1f09290945a23cba2d7b..246b35141b5aac082ba8b8640fdcc02d9d284389 100644
--- a/src/interaction/siPhysicalRegimen.js
+++ b/src/interaction/siPhysicalRegimen.js
@@ -12,19 +12,24 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 		He,
 		His
 	} = getPronouns(slave);
+
 	const el = new DocumentFragment();
-	el.append(drugs());
-	el.append(curatives());
-	el.append(aphrodisiacs());
-	el.append(fertility());
-	el.append(incubator());
-	el.append(nursery());
-	el.append(breederEligibility());
-	el.append(bloating());
-	el.append(hormones());
-	el.append(diet());
-	el.append(dietBase());
-	el.append(snacks());
+
+	el.append(
+		drugs(),
+		curatives(),
+		aphrodisiacs(),
+		fertility(),
+		incubator(),
+		nursery(),
+		breederEligibility(),
+		bloating(),
+		hormones(),
+		diet(),
+		dietBase(),
+		snacks()
+	);
+
 	return el;
 
 	function drugs() {
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index 32d9c50c8993d8eaeaa9ac259a19878c9159b6de..19623750589fc9914cad521987717d8f609da1a1 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -46,7 +46,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 	array = [];
 	if (slave.useRulesAssistant === 0) {
 		App.UI.DOM.appendNewElement("span", p, `Not subject `, ["bold", "gray"]);
-		App.UI.DOM.appendNewElement("span", p, `to the Rules Assistant.`, "gray");
+		App.UI.DOM.appendNewElement("span", p, `to the Rules Assistant. `, "gray");
 		array.push(
 			App.UI.DOM.link(
 				`Include ${him}`,
diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js
index 9eb502029ddf7e8b470a03478782adf441f2b666..92d6e8c6416ceae92970853fb5b7c0878cae1cfe 100644
--- a/src/interaction/siWardrobe.js
+++ b/src/interaction/siWardrobe.js
@@ -19,6 +19,7 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) {
 
 	function contents() {
 		const frag = new DocumentFragment();
+
 		if (slave.fuckdoll === 0) {
 			frag.append(filtersDOM());
 			frag.append(chooseHerOwn());
@@ -322,13 +323,13 @@ App.UI.SlaveInteract.wardrobe = function(slave, contentRefresh) {
 
 		el.appendChild(label);
 
-		let array = Array.from(App.Data.slaveWear.mouthAccessory.keys());
+		let array = Array.from(App.Data.mouthAccessory.keys());
 
 		// Sort
-		array = array.sort((a, b) => (App.Data.slaveWear.mouthAccessory.get(a).name > App.Data.slaveWear.mouthAccessory.get(b).name) ? 1 : -1);
+		array = array.sort((a, b) => (App.Data.mouthAccessory.get(a).name > App.Data.mouthAccessory.get(b).name) ? 1 : -1);
 		const sortedMap = new Map([]);
 		for (const name of array) {
-			sortedMap.set(name, App.Data.slaveWear.mouthAccessory.get(name));
+			sortedMap.set(name, App.Data.mouthAccessory.get(name));
 		}
 
 		let links = document.createElement('div');
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 15948ec5a44c04b33b83318e30ec9e45f52e08d2..4b2e6ea9c3a604d79b321c052f89b5e6b0caa6f3 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -728,9 +728,8 @@ App.Entity.SlaveState = class SlaveState {
 		 * "none", "damaged", "normal", "pointy", "elven", "ushi"
 		 * @type {FC.EarShape} */
 		this.earShape = "normal";
-		/** type of kemonomimi ears if any
-		 * "neko", "inu", "kit", "tanuki", "usagi"
-		 * @type {FC.EarTypeKemonomimi}*/
+		/** type of top ears if any
+		 * @type {FC.EarT}*/
 		this.earT = "none";
 		/** kemonomimi ear color
 		 * "hairless" */
@@ -764,6 +763,19 @@ App.Entity.SlaveState = class SlaveState {
 		this.tailShape = "none";
 		/** tail color */
 		this.tailColor = "none";
+		/** type of appendages installed */
+		this.appendages = "none";
+		/** 
+		 * Does she have a back interface installed
+		 * * 0: no
+		 * * 1: yes		
+		 */
+		this.PBack = 0;
+		/**  the current shape of their modular wings
+		*/
+		this.wingsShape = "none";
+		/** appendages color */
+		this.appendagesColor = "none";
 		/** slave's original hair color, defaults to their initial hair color. */
 		this.origHColor = "brown";
 		/** hair color */
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 9845e5a93bab869a15fb50f0ac6ec10c59104934..6b96e8f8c0d2817f3511801bb756f4874f4861f6 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -2002,7 +2002,7 @@ App.RA.options = (function() {
 
 	class GagList extends ListSelector {
 		constructor() {
-			const pairs = [["No gag", "none"]].concat(isItemAccessible.array(App.Data.slaveWear.mouthAccessory ));
+			const pairs = [["No gag", "none"]].concat(isItemAccessible.array(App.Data.mouthAccessory ));
 			super("Gag", pairs);
 			this.setValue(current_rule.set.mouthAccessory );
 			this.onchange = (value) => current_rule.set.mouthAccessory = value;
diff --git a/src/npc/descriptions/butt/butt.js b/src/npc/descriptions/butt/butt.js
index a2d34410c752eaf8fa965f8f876a69ed9c1efe6a..66c7923304eeb2eb50f06a73090970441b413fd0 100644
--- a/src/npc/descriptions/butt/butt.js
+++ b/src/npc/descriptions/butt/butt.js
@@ -1270,29 +1270,97 @@ App.Desc.butt = function(slave, {market, eventDescription} = {}) {
 		}
 	}
 
-	if (slave.tailShape === "neko") {
+	if (slave.tailShape === "cat") {
 		r.push(`${He} has a long, slender, ${slave.tailColor} cat tail which tends to sway side to side when ${he} is focused on a task.`);
-	} else if (slave.tailShape === "inu") {
+	} else if (slave.tailShape === "leopard") {
+		r.push(`${He} has a long, slender, ${slave.tailColor} leopard tail which tends to sway side to side when ${he} is focused on a task.`);
+	} else if (slave.tailShape === "tiger") {
+		r.push(`${He} has a long, slender, ${slave.tailColor} tiger tail which tends to sway side to side when ${he} is focused on a task.`);
+	} else if (slave.tailShape === "jaguar") {
+		r.push(`${He} has a long, slender, ${slave.tailColor} jaguar tail which tends to sway side to side when ${he} is focused on a task.`);
+	} else if (slave.tailShape === "cheeta") {
+		r.push(`${He} has a long, slender, ${slave.tailColor} cheeta tail which tends to sway side to side when ${he} is focused on a task.`);
+	} else if (slave.tailShape === "dog") {
 		r.push(`${He} has a bushy, ${slave.tailColor} dog tail which tends to wag energetically when ${he} gets exited.`);
-	} else if (slave.tailShape === "kit") {
+	} else if (slave.tailShape === "wolf") {
+		r.push(`${He} has a fluffy, ${slave.tailColor} wolf tail which tends to wag energetically when ${he} gets exited.`);
+	} else if (slave.tailShape === "jackal") {
+		r.push(`${He} has a bushy, ${slave.tailColor} jackal tail which tends to wag energetically when ${he} gets exited.`);
+	} else if (slave.tailShape === "fox") {
 		r.push(`${He} has a soft, fluffy, ${slave.tailColor} fox tail.`);
 	} else if (slave.tailShape === "kitsune") {
-		r.push(`${He} has three incredibly soft, fluffy, ${slave.tailColor} fox tails; they feel heavenly to the touch.`);
-	} else if (slave.tailShape === "tanuki") {
-		r.push(`${He} has a long, fluffy, ${slave.tailColor} tanuki tail with a dark stripe running down the middle.`);
-	} else if (slave.tailShape === "ushi") {
-		r.push(`${He} has a long, ${slave.tailColor} cow tail; it has a small tuft of hair at the end and tends to swat at things absentmindedly.`);
-	} else if (slave.tailShape === "usagi") {
+		r.push(`${He} has nine incredibly soft, fluffy, ${slave.tailColor} fox tails; they feel heavenly to the touch.`);
+	} else if (slave.tailShape === "raccoon") {
+		r.push(`${He} has a long, fluffy, ${slave.tailColor} raccoon tail with a dark stripe running down the middle.`);
+	} else if (slave.tailShape === "rabbit") {
 		r.push(`${He} has a short and fluffy ${slave.tailColor} rabbit tail.`);
-	} else if (slave.tailShape === "risu") {
+	} else if (slave.tailShape === "squirrel") {
 		r.push(`${He} has a big and bushy ${slave.tailColor} squirrel tail.`);
-	} else if (slave.tailShape === "uma") {
-		r.push(`${He} has a long horse tail consisting of consisting of ${slave.tailColor} hair.`);
+	} else if (slave.tailShape === "horse") {
+		r.push(`${He} has a long horse tail consisting of ${slave.tailColor} hair.`);
+	} else if (slave.tailShape === "bird") {
+		r.push(`${He} has a bundle of soft ${slave.tailColor} tail feathers. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle. `);
+	} else if (slave.tailShape === "phoenix") {
+		r.push(`${He} has a bundle of magnificent, ${slave.tailColor} tail feathers that give off a luminiscent glow when in the dark. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`);
+	} else if (slave.tailShape === "peacock") {
+		r.push(`${He} has a bundle of ${slave.tailColor} peacock tail feathers; ${his} tail can fan out to proudly display ${his} pretty feathers.`);
+	} else if (slave.tailShape === "raven") {
+		r.push(`${He} has a bundle of ${slave.tailColor} raven tail feathers. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`);
+	} else if (slave.tailShape === "swan") {
+		r.push(`${He} has a small bundle of short ${slave.tailColor} swan tail feathers that have a slight upwards curve to them. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`);
+	} else if (slave.tailShape === "sheep") {
+		r.push(`${He} has a short and soft ${slave.tailColor} sheeps tail.`);
+	} else if (slave.tailShape === "cow") {
+		r.push(`${He} has a long cow tail with a small tuft of ${slave.tailColor} hair at its end; ${he} tends to swat at things absentmindedly.`);
+	} else if (slave.tailShape === "gazelle") {
+		r.push(`${He} has a short, silky ${slave.tailColor} gazelle tail with a dark stripe running down its middle.`);
+	} else if (slave.tailShape === "deer") {
+		r.push(`${He} has a short and soft ${slave.tailColor} deer tail that tends to wiggle when ${he} gets exited.`);
+	} else if (slave.tailShape === "succubus") {
+		r.push(`${He} has a long, slim  succubus tail; ${his} tail ends in a soft ${slave.tailColor} heart shape.`);
+	} else if (slave.tailShape === "draconic") {
+		r.push(`${He} has a long and thick draconic tail; ${his} tail is covered in ${slave.tailColor} scales.`);
+	} else if (slave.tail === "stinger") {
+		r.push(`${He} has a long, segmented ${slave.tailColor} colored scorpion tail made of advanced synthetic alloys. The tail ends in a sharp stinger that can fire projectiles. Its projectiles can kill or incapacitate.`);
 	} else if (slave.tail === "combat") {
 		r.push(`${He} has a very long ${slave.tailColor} metallic tail that can lash out, constrict, and deploy razor sharp spikes on command.`);
 	} else if (slave.tail === "sex") {
 		r.push(`${He} has a long, slender, ${slave.tailColor} tail. While not strong, it is very dexterous and has a small fleshy spade-shaped tip that can vibrate and dispense lube on command.`);
 	}
+	
+	if (slave.wingsShape === "angel") {
+		r.push(`${He} has a pair of ${slave.appendagesColor} angelic wings that give ${him} a noble appearance.`);
+	} else if (slave.wingsShape === "seraph") {
+		r.push(`${He} has three pairs of majestic-looking ${slave.appendagesColor} angel wings that move simultaneously.`);
+	} else if (slave.wingsShape === "demon") {
+		r.push(`${He} has a pair of sleek and sexy ${slave.appendagesColor} demonic wings that ${he} tends to wrap around ${him}self when ${he}'s being flirty.`);
+	} else if (slave.wingsShape === "dragon") {
+		r.push(`${He} has a pair of imposing ${slave.appendagesColor} draconic wings that tend to create a small breeze when ${he} flaps them.`);
+	} else if (slave.wingsShape === "phoenix") {
+		r.push(`${He} has a pair of magnificent, ${slave.appendagesColor} phoenix wings that give off a luminiscent glow when shrouded in darkness.`);
+	} else if (slave.wingsShape === "bird") {
+		r.push(`${He} has a pair of soft ${slave.appendagesColor} feathererd wings.`);
+	} else if (slave.wingsShape === "fairy") {
+		r.push(`${He} has a pair of dainty, translucent fairy wings that are shaped like leaves and tend to flutter when ${he}'s excited.`);
+	} else if (slave.wingsShape === "butterfly") {
+		r.push(`${He} has a pair of big and broad butterfly wings that have ${slave.appendagesColor} colored patterns. ${His} wings tend to flutter when excited.`);
+	} else if (slave.wingsShape === "moth") {
+		r.push(`${He} has a pair of big, soft moth wings that have ${slave.appendagesColor} colored patterns. ${His} wings tend to flutter when excited.`);
+	} else if (slave.wingsShape === "insect") {
+		r.push(`${He} has a pair of delicate transparent insect wings that tend to flutter when ${he}'s excited.`);
+	} else if (slave.wingsShape === "evil") {
+		r.push(`${He} has a pair of ${slave.appendagesColor} fiendish wings that have a sinister look to them.`);
+	} else if (slave.appendages === "falcon") {
+		r.push(`${He} has a pair of large ${slave.appendagesColor} wings made of advanced synthetic alloys. The wings enable fast aerial movement, swiping at targets with its razor sharp edges and can be used to block projectiles.`);
+	} else if (slave.appendages === "arachnid") {
+		r.push(`${He} has a set of eight ${slave.appendagesColor} deadly spider legs. The legs are made of an advanced synthetic alloy. Being extremely durable in addition to very light, allows extention to thrice their original length. An built-in AI helps with combat, 3-dimensional maneuvering and appendage coordination.`);
+	} else if (slave.appendages === "kraken") {
+		r.push(`${He} has a set of eight ${slave.appendagesColor} tentacles. The tentacles are made of an advanced synthetic alloy. Being extremely durable in addition to very light, allows the tentacles to extend to thrice their original length. An built-in AI helps with combat, 3-dimensional maneuvering and appendage coordination.`);
+	} else if (slave.appendages === "sex") {
+		r.push(`${He} has a set of eight ${slave.appendagesColor} pleasure appendages. The lithe appendages all have different shaped tips with vibration and lube dispensation built-in.`);
+	} else if (slave.appendages === "flight") {
+		r.push(`${He} has a pair of large ${slave.appendagesColor} metallic wings. Its durable frame, made of advanced materials, is sufficiently lightweight to allow its small thrusters to support flight while being strong enough to sustain structural integrity.`);
+	}
 
 	r.push(App.Desc.mods(slave, "buttock"));
 	return r.join(" ");
diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 16083f4b7f1d055ca02928867c5371887bc439c5..79b563ca34086592dd2dcbf392b55528d74e0fb8 100644
--- a/src/npc/interaction/fAnimal.js
+++ b/src/npc/interaction/fAnimal.js
@@ -26,8 +26,9 @@ App.Interact.fAnimal = function(slave, type) {
 	/** @type {App.Entity.Animal} */
 	const animal = V.active[type];
 
-	let fetishDesc;
+	/** @type {0|1|2} */
 	let hole;
+	let fetishDesc;
 	let orifice;
 
 	const anAnimal = `${animal.articleAn} ${animal.name}`;
@@ -98,9 +99,7 @@ App.Interact.fAnimal = function(slave, type) {
 		fetishDesc = `committing such a sinful act`;
 	}
 
-	const div = App.UI.DOM.appendNewElement("div", frag);
-
-	let text = [];
+	const text = new SpacedTextAccumulator(frag);
 
 	if (canWalk(slave)) {
 		text.push(`You call ${him} over and`);
@@ -127,10 +126,8 @@ App.Interact.fAnimal = function(slave, type) {
 					text.push(`${slave.slaveName} visibly blanches at the thought of having to suck down an animal's cum, but ${he} is so devoted to you that ${he} reluctantly agrees.`);
 				}
 			} else {
-				if (
-					(act === Acts.VAGINAL && slave.vagina > 0) ||
-						(act === Acts.ANAL && slave.anus > 0)
-				) {
+				if ((act === Acts.VAGINAL && slave.vagina > 0)
+					|| (act === Acts.ANAL && slave.anus > 0)) {
 					if (slaveApproves()) {
 						text.push(`${slave.slaveName}'s face visibly brightens at the thought of ${fetishDesc}, even if the dick is an animal's.`);
 					} else {
@@ -198,9 +195,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
-
+	text.toParagraph();
 
 	if (slave.devotion > 50) {
 		if (act === Acts.ORAL) {
@@ -235,7 +230,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, then gives a groan as the beast thrusts, stretching ${his} poor throat to the limit.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out moan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -253,8 +248,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
-		text = [];
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -292,7 +286,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -310,8 +304,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
-		text = [];
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -349,7 +342,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} is beginning to reevaluate just how much ${he} wants to avoid punishment.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} gives a long, drawn-out groan as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -367,8 +360,7 @@ App.Interact.fAnimal = function(slave, type) {
 				throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 		}
 
-		App.Events.addParagraph(div, text);
-		text = [];
+		text.toParagraph();
 
 		if (act !== Acts.ORAL) {
 			text.push(virginityCheck(act));
@@ -420,7 +412,7 @@ App.Interact.fAnimal = function(slave, type) {
 						text.push(`The slave visibly gags as the unfamiliar texture of ${anAnimal}'s cock fills it, and you get the feeling ${he} would have run away a long time ago if ${he} wasn't a little tied up at the moment.`);
 					}
 				} else {
-					text.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus `, slave.vagina < 4 ? `<span class="lime">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
+					text.push(`${slave.slaveName} lets out a blood-curdling scream as the huge phallus `, slave.vagina < 4 ? `<span class="change positive">stretches</span>` : `fills`, ` ${his} ${orifice()} nearly to its breaking point.`);
 				}
 				break;
 			case V.active.feline:
@@ -450,8 +442,7 @@ App.Interact.fAnimal = function(slave, type) {
 		}
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
+	text.toParagraph();
 
 	switch (animal) {
 		case V.active.canine:
@@ -484,9 +475,9 @@ App.Interact.fAnimal = function(slave, type) {
 			throw new Error(`Unexpected animal type '${animal}' in fAnimal()`);
 	}
 
-	if (act === Acts.ANAL) {
+	if (act === Acts.VAGINAL) {
 		slave.vagina = slave.vagina < animal.dick.size ? animal.dick.size : slave.vagina;
-	} else if (act === Acts.VAGINAL) {
+	} else if (act === Acts.ANAL) {
 		slave.anus = slave.anus < animal.dick.size ? animal.dick.size : slave.anus;
 	}
 
@@ -494,8 +485,7 @@ App.Interact.fAnimal = function(slave, type) {
 		knockMeUp(slave, 5, hole, -8);
 	}
 
-	App.Events.addParagraph(div, text);
-	text = [];
+	text.toParagraph();
 
 	if (random(1, 100) > 100 + slave.devotion) {
 		switch (act) {
@@ -607,8 +597,7 @@ App.Interact.fAnimal = function(slave, type) {
 			}
 		}
 
-		App.Events.addParagraph(div, text);
-		text = [];
+		text.toParagraph();
 	}
 
 	return frag;
diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index c6ebb02242839929928b3fb0c65b229d7d86d14a..451396c50676ab22aef5a4739ff815b8f358de7a 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -15,6 +15,7 @@ App.Interact.fKiss = function(slave) {
 	const {title: Master, say: say} = getEnunciation(slave);
 
 	const {womanP} = getPronouns(V.PC).appendSuffix("P");
+	/** @type {FC.MouthAccessory|""} */
 	let assignedGag = "";
 	r.push(`You tell ${slave.slaveName} to`);
 	switch (slave.mouthAccessory) {
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 02ac4d1655844fb11b0d79b706e9e668f2805acd..a07810854426b00e5ffc4aa0d5533e4b91614949 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -669,9 +669,25 @@ App.UI.managePersonalAffairs = function() {
 			const text = [];
 
 			const slaves = [...PC.partners].filter(i => i > 0);
+			const ownedSlaves = slaves
+				.filter(s => getSlave(s))				// make sure it isn't undefined
+				.map(s => SlaveFullName(getSlave(s)));	// get the name
 			const other = [];
 
-			text.push(`You've had sex with ${num(slaves.length)} different slaves so far.`);
+			const link = App.UI.DOM.link(`${num(slaves.length)} ${slaves.length > 1 ? `different slaves` : `slave`}`, () => {
+				Dialog.append(`You have slept with `, toSentence(ownedSlaves), `, as well as ${num(slaves.length - ownedSlaves.length)} slaves you don't currently own.`);
+				Dialog.open();
+			});
+
+			if (slaves.length > 0) {
+				text.push(
+					`You've had sex with`,
+					link,
+					`so far.`,
+				);
+			} else {
+				text.push(`You haven't had sex with any slaves yet.`);
+			}
 
 			if (PC.partners.has(-2)) {
 				other.push(`citizens of ${V.arcologies[0].name}`);
@@ -693,7 +709,7 @@ App.UI.managePersonalAffairs = function() {
 			}
 
 			if (other.length > 0) {
-				text.push(`You have also had sex with ${toSentence(other)}.`);
+				text.push(`You have ${slaves.length > 0 ? `also` : ``} had sex with ${toSentence(other)}${slaves.length > 0 ? `` : `, though`}.`);
 			}
 
 			App.Events.addNode(partnersDiv, text);