diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index 3b28365077a1b1ed3128866a9bdca8ec52bd309f..afc7c72f6e102bc11edd27bd4893c9f3c4e32d0d 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -161,20 +161,22 @@ App.Facilities.Facility = class Facility {
 				} else {
 					const link = document.createElement("span");
 					const baseCost = cost;
-					const array = [];
-					for (const expand of [10, 25, 50, 100].filter(s => capacity - occupancy >= s)) {
+					const upgrades = [10, 25, 50, 100];
+					const available = maximum ? upgrades.filter(s => maximum - occupancy >= s) : upgrades;
+					const options = [];
+					for (const expand of available) {
 						cost = baseCost * (expand / 5);
-						array.push(
+						options.push(
 							App.UI.DOM.link(`x${expand}`, () => { expandFacility(expand, cost); }, [], '', `An additional ${num(expand)} slots will cost ${cashFormat(Math.trunc(cost))}.`)
 						);
 					}
-					link.append(App.UI.DOM.generateLinksStrip(array));
+					link.append(App.UI.DOM.generateLinksStrip(options));
 
 					const linkArray = [];
 					App.UI.DOM.appendNewElement("div", div);
 					div.append(`Expanding ${this.facility.name} by ${num(5)} slots will cost ${cashFormat(Math.trunc(baseCost))}: `);
 					linkArray.push(App.UI.DOM.link(`x5`, () => { expandFacility(5, baseCost); }));
-					if (capacity - occupancy >= 10) {
+					if (!maximum || maximum - occupancy >= 10) {
 						linkArray.push(App.UI.DOM.linkReplace(`Additional options`, link));
 					}
 					div.append(App.UI.DOM.generateLinksStrip(linkArray));
diff --git a/src/budget/repBudget.js b/src/budget/repBudget.js
index d7df45658b2ebf65a2b5461b374754704e1cceea..f3a1be735b4c0eee337340735e5f31cb08134efb 100644
--- a/src/budget/repBudget.js
+++ b/src/budget/repBudget.js
@@ -31,7 +31,7 @@ App.Budget.rep = function() {
 	 */
 	function settings() {
 		const p = document.createElement("p");
-		App.UI.DOM.appendNewElement("div", p, "Your weekly reputation changes are as follows:", "detail");
+		App.UI.DOM.appendNewElement("div", p, "Your weekly reputation changes are as follows:", ["detail"]);
 
 		let options = new App.UI.OptionsGroup();
 		options.addOption("", "repBudget", V.showAllEntries)
diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js
index ee4fdf53effc7400691bde33b62af0cc8f1ed65e..28d89c48b80c66a5858df42d0364e263997377e9 100644
--- a/src/endWeek/reports/arcadeReport.js
+++ b/src/endWeek/reports/arcadeReport.js
@@ -87,16 +87,12 @@ App.EndWeek.arcadeReport = function() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			r = [];
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
 
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is confined in ${V.arcadeName}.`);
+				slaveEntry.append(`is confined in ${V.arcadeName}.`);
 			}
 			App.Events.addNode(slaveEntry, r);
 
diff --git a/src/endWeek/reports/brothelReport.js b/src/endWeek/reports/brothelReport.js
index 3a5a06cb94dea80b201c26434b7c2c6261621a95..91f1928c02fd36763a91a36ee00edc85ab86324f 100644
--- a/src/endWeek/reports/brothelReport.js
+++ b/src/endWeek/reports/brothelReport.js
@@ -269,17 +269,7 @@ App.EndWeek.brothelReport = function() {
 		if (V.showEWD) {
 			const madamEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", madamEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(madam, SlaveFullName(madam));
-
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(madamEntry, madam);
-			App.Events.addNode(
-				madamEntry,
-				[
-					popup,
-					`is serving as the Madam.`
-				]
-			);
+			madamEntry.append(App.SlaveAssignment.saSlaveName(madam), `is serving as the Madam.`);
 			madamEntry.append(App.SlaveAssignment.standardSlaveReport(madam, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, madam);
 		} else {
@@ -338,19 +328,13 @@ App.EndWeek.brothelReport = function() {
 				const {He} = getPronouns(slave);
 				const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-
-				App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-				r = [];
-				popup.classList.add("slave-name", "bold");
-				r.push(popup);
+				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 
 				if (slave.choosesOwnAssignment) {
-					r.push(App.SlaveAssignment.choosesOwnJob(slave));
+					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 				} else {
-					r.push(`is working out of ${V.brothelName}.`);
+					slaveEntry.append(`is working out of ${V.brothelName}.`);
 				}
-				App.Events.addNode(slaveEntry, r);
 
 				App.Events.addNode(
 					slaveEntry,
diff --git a/src/endWeek/reports/cellblockReport.js b/src/endWeek/reports/cellblockReport.js
index dc9b66490df2e3748e9320ffd3a8b8841171e0d1..802e2e182c0ec65cf6770c66b0b286554cc321fe 100644
--- a/src/endWeek/reports/cellblockReport.js
+++ b/src/endWeek/reports/cellblockReport.js
@@ -182,14 +182,7 @@ App.EndWeek.cellblockReport = function() {
 		if (V.showEWD !== 0) {
 			const wardenessEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", wardenessEntry);
-			App.SlaveAssignment.appendSlaveLinks(wardenessEntry, slave);
-			App.Events.addNode(
-				wardenessEntry,
-				[
-					App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name"),
-					`is serving as the Wardeness in ${V.cellblockName}.`,
-				]
-			);
+			wardenessEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as the Wardeness in ${V.cellblockName}.`);
 			wardenessEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -302,18 +295,13 @@ App.EndWeek.cellblockReport = function() {
 		if (V.showEWD) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is confined in ${V.cellblockName}.`);
+				slaveEntry.append(`is confined in ${V.cellblockName}.`);
 			}
-			App.Events.addNode(slaveEntry, r);
 
 			confinedResults = App.SlaveAssignment.stayConfined(slave);
 			App.Events.addNode(slaveEntry, [He, confinedResults.text], "div", "indent");
diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js
index 211dd727a803c6d57bb0471f104a46b50e09f5ec..e6b9f9a1d602548d33197efbf9670c970fd2e959 100644
--- a/src/endWeek/reports/clinicReport.js
+++ b/src/endWeek/reports/clinicReport.js
@@ -258,16 +258,8 @@ App.EndWeek.clinicReport = function() {
 		if (V.showEWD !== 0) {
 			const nurseEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", nurseEntry);
-			App.SlaveAssignment.appendSlaveLinks(nurseEntry, S.Nurse);
-			const r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Nurse, SlaveFullName(S.Nurse));
-			popup.classList.add("slave-name", "bold");
-			r.push(
-				popup,
-				`is serving as the clinical nurse.`,
-				App.SlaveAssignment.standardSlaveReport(slave, false),
-			);
-			App.Events.addNode(nurseEntry, r);
+			nurseEntry.append(App.SlaveAssignment.saSlaveName(S.Nurse), `is serving as the clinical nurse.`);
+			nurseEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(slave, true);
@@ -413,25 +405,21 @@ App.EndWeek.clinicReport = function() {
 		if (V.showEWD !== 0) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			let r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
+
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is receiving treatment in ${V.clinicName}.`);
+				slaveEntry.append(`is receiving treatment in ${V.clinicName}.`);
 			}
-			App.Events.addNode(slaveEntry, r);
-			r = [];
-			const patientContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', ["indent"]);
-			r.push(`${He} ${App.SlaveAssignment.rest(slave)} `);
+
+			let r = [];
+			r.push(He, App.SlaveAssignment.rest(slave));
 			if (remainReasons.length > 0) {
 				r.push(`${He} stays in the clinic ${toSentence(remainReasons)}.`);
 			}
-			r.push(App.SlaveAssignment.standardSlaveReport(slave, false));
-			App.Events.addNode(patientContent, r);
+			App.Events.addNode(slaveEntry, r, "div", "indent");
+			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
diff --git a/src/endWeek/reports/clubReport.js b/src/endWeek/reports/clubReport.js
index 2b5d71a43a148c77b0c85b8432abc8aa4f1c7219..ed32c689c123099af164292910a97593b77f7afe 100644
--- a/src/endWeek/reports/clubReport.js
+++ b/src/endWeek/reports/clubReport.js
@@ -147,16 +147,7 @@ App.EndWeek.clubReport = function() {
 		if (V.showEWD !== 0) {
 			const DJEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", DJEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.DJ, SlaveFullName(S.DJ));
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(DJEntry, dj);
-			App.Events.addNode(
-				DJEntry,
-				[
-					popup,
-					`is performing as the DJ in ${V.clubName}.`,
-				]
-			);
+			DJEntry.append(App.SlaveAssignment.saSlaveName(dj), `is performing as the DJ in ${V.clubName}.`);
 			DJEntry.append(App.SlaveAssignment.standardSlaveReport(dj, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, dj);
 		} else {
@@ -196,17 +187,13 @@ App.EndWeek.clubReport = function() {
 			if (V.showEWD) {
 				const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-				r = [];
-				const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-				popup.classList.add("slave-name", "bold");
-				r.push(popup);
+				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
+
 				if (slave.choosesOwnAssignment) {
-					r.push(App.SlaveAssignment.choosesOwnJob(slave));
+					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 				} else {
-					r.push(`is serving in ${V.clubName}.`);
+					slaveEntry.append(`is serving in ${V.clubName}.`);
 				}
-				App.Events.addNode(slaveEntry, r);
 
 				const {He} = getPronouns(slave);
 				App.Events.addNode(
diff --git a/src/endWeek/reports/dairyReport.js b/src/endWeek/reports/dairyReport.js
index 5b92ab91f6d79cdf816ee54e0a5a875753067ead..8ae82f326f44b15ea76abb9da4358d9efa99611c 100644
--- a/src/endWeek/reports/dairyReport.js
+++ b/src/endWeek/reports/dairyReport.js
@@ -355,16 +355,7 @@ App.EndWeek.dairyReport = function() {
 		if (V.showEWD !== 0) {
 			const milkMaidEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", milkMaidEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Milkmaid, SlaveFullName(S.Milkmaid));
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(milkMaidEntry, slave);
-			App.Events.addNode(
-				milkMaidEntry,
-				[
-					popup,
-					`is serving as your Milkmaid.`,
-				]
-			);
+			milkMaidEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Milkmaid.`);
 			milkMaidEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
@@ -464,17 +455,13 @@ App.EndWeek.dairyReport = function() {
 		if (V.showEWD !== 0) {
 			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			r = [];
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
+
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is serving as a cow in ${V.dairyName}.`);
+				slaveEntry.append(`is serving as a cow in ${V.dairyName}.`);
 			}
-			App.Events.addNode(slaveEntry, r);
 
 			const {He} = getPronouns(slave);
 			App.Events.addNode(
diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js
index f75629caee145f9ef1289b0128e2865c6d58cbe9..b53c30f4cc2047cfc9312e4ac3a623b6aaafd8f0 100644
--- a/src/endWeek/reports/farmyardReport.js
+++ b/src/endWeek/reports/farmyardReport.js
@@ -29,12 +29,8 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 		if (V.showEWD) {
 			const farmerEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", farmerEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Farmer, SlaveFullName(S.Farmer));
-			const r = [];
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(farmerEntry, Farmer);
-			r.push(popup, farmerText());
-			App.Events.addNode(farmerEntry, r);
+			App.Events.addNode(farmerEntry, [App.SlaveAssignment.saSlaveName(Farmer), `is serving as the Farmer.`, farmerText()]);
+			farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer));
 			App.SlaveAssignment.appendSlaveArt(artSpan, Farmer);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(Farmer, true);
@@ -56,17 +52,12 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 			if (V.showEWD) {
 				const slaveEntry = App.UI.DOM.appendNewElement("div", frag, null, ["slave-report"]);
 				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-				const r = [];
-				const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-				popup.classList.add("slave-name", "bold");
-				r.push(popup);
+				slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 				if (slave.choosesOwnAssignment) {
-					r.push(App.SlaveAssignment.choosesOwnJob(slave));
+					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 				} else {
-					r.push(`is working out of ${V.farmyardName}.`);
+					slaveEntry.append(`is working out of ${V.farmyardName}.`);
 				}
-				App.Events.addNode(slaveEntry, r);
 
 				farmhandLivingRules(slave);
 				farmhandHealth(slave);
@@ -178,7 +169,6 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 		const r = [];
 
 		r.push(
-			farmerIntro(Farmer),
 			farmerRelationshipPC(Farmer),
 			farmerFetishEffects(Farmer, farmerFetish(Farmer)),
 			farmerSkill(Farmer),
@@ -339,10 +329,6 @@ App.EndWeek.farmyardReport = function farmyardReport() {
 		}
 	}
 
-	function farmerIntro(slave) {
-		return `<span class="indent">${SlaveFullName(slave)} is serving as the Farmer.</span>`;
-	}
-
 	// Farmhands
 
 	function farmhandCount(count) {
diff --git a/src/endWeek/reports/masterSuiteReport.js b/src/endWeek/reports/masterSuiteReport.js
index 02cdb0766bddc9064cba2a464b27d458bb91228a..bae08cbd9c50a3f5be63e05d4cef6837913bbe1a 100644
--- a/src/endWeek/reports/masterSuiteReport.js
+++ b/src/endWeek/reports/masterSuiteReport.js
@@ -9,11 +9,8 @@ App.EndWeek.masterSuiteReport = function() {
 	function concubineText() {
 		const frag = new DocumentFragment();
 		let r = [];
-		const {He, he, his, him, himself} = getPronouns(S.Concubine);
-		App.SlaveAssignment.appendSlaveLinks(frag, concubine);
-		const popup = App.UI.DOM.slaveDescriptionDialog(S.Concubine, SlaveFullName(S.Concubine));
-		popup.classList.add("slave-name", "bold");
-		r.push(popup, `is serving as your concubine in ${V.masterSuiteName}. More than any other slave, ${his} sexual brilliance and physical appeal are <span class="green">critical</span> to your reputation.`);
+		const {He, he, his, him, himself} = getPronouns(S.Concubine);		
+		r.push(App.SlaveAssignment.saSlaveName(S.Concubine), `is serving as your concubine in ${V.masterSuiteName}. More than any other slave, ${his} sexual brilliance and physical appeal are <span class="green">critical</span> to your reputation.`);
 
 		if (S.Concubine.prestigeDesc === "You bankrupted and enslaved $him in revenge for $his part in the attack on your arcology by the Daughters of Liberty." && S.Concubine.newGamePlus === 0) {
 			r.push(`${He} was once your rival, and your relationship is widely thought to be <span class="green">the perfect modern romance.</span>`);
@@ -103,14 +100,11 @@ App.EndWeek.masterSuiteReport = function() {
 	 */
 	function nonConcubineText(slave) {
 		const frag = new DocumentFragment();
-		let r = [];
-		const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-		popup.classList.add("slave-name", "bold");
-		r.push(popup);
+		frag.append(App.SlaveAssignment.saSlaveName(slave));
 		if (slave.choosesOwnAssignment) {
-			r.push(App.SlaveAssignment.choosesOwnJob(slave));
+			$(frag).append(App.SlaveAssignment.choosesOwnJob(slave));
 		} else {
-			r.push(`sees to your pleasure in ${V.masterSuiteName}.`);
+			frag.append(`sees to your pleasure in ${V.masterSuiteName}.`);
 		}
 		/* Perform facility based rule changes - FIXME - dev/trust living condition changes probably should be in saRules; there's no text reporting these changes here */
 		if (V.masterSuiteUpgradeLuxury === 1) {
@@ -157,8 +151,6 @@ App.EndWeek.masterSuiteReport = function() {
 			slave.devotion++;
 		}
 
-		App.Events.addNode(frag, r);
-
 		return frag;
 	}
 
@@ -343,8 +335,7 @@ App.EndWeek.masterSuiteReport = function() {
 		App.Events.addNode(frag, r);
 
 		if (V.verboseDescriptions === 1) {
-			const msContent = App.UI.DOM.appendNewElement("div", frag, '', ["indent"]);
-			App.Events.addNode(msContent, [`${He} ${App.SlaveAssignment.pleaseYou(slave)}`]);
+			App.Events.addNode(frag, [He, App.SlaveAssignment.pleaseYou(slave)], "div", ["indent"]);
 
 			if (V.servantMilkers === 1 && slave.lactation > 0 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canMove(slave) && slave.intelligence + slave.intelligenceImplant >= -90) {
 				const milkingResults = App.SlaveAssignment.getMilked(slave, 0.25);
@@ -454,23 +445,17 @@ App.EndWeek.masterSuiteReport = function() {
 	for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
 		const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 		const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-		const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-		popup.classList.add("slave-name", "bold");
-		slaveEntry.append(popup);
-		App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
 		App.Events.addNode(slaveEntry, [nonConcubineText(slave), commonText(slave)]);
 		App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 	}
 
 	if (pregnantSlaves > 0 && V.arcologies[0].FSRestart !== "unset" && V.propOutcome !== 1 && V.eugenicsFullControl !== 1) {
-		const eliteEffects = App.UI.DOM.appendNewElement("p", frag, '', ["indent"]);
-		App.Events.addNode(eliteEffects, [`The Societal Elite know what you are doing with your bedslaves. <span class="red">They do not approve.</span>`]);
+		App.Events.addNode(frag, [`The Societal Elite know what you are doing with your bedslaves. <span class="red">They do not approve.</span>`], "p", ["indent"]);
 		V.failedElite += (5 * pregnantSlaves);
 	}
 
 	if (V.masterSuiteDecoration !== "standard") {
-		const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', ["indent"]);
-		App.Events.addNode(decorationEffects, [`${capFirstChar(V.masterSuiteName)}'s ${V.masterSuiteDecoration} atmosphere <span class="hotpink">has a minor impact on your fucktoys.</span>`]);
+		App.Events.addNode(frag, [`${capFirstChar(V.masterSuiteName)}'s ${V.masterSuiteDecoration} atmosphere <span class="hotpink">has a minor impact on your fucktoys.</span>`], "p", ["indent"]);
 	}
 
 	return frag;
diff --git a/src/endWeek/reports/nurseryReport.js b/src/endWeek/reports/nurseryReport.js
index 5e8673aa62341b2b36b2e29ecd3bc6635b0c52ef..1fdbb61619d2ce10464e0f823b9e83664b2c1ce9 100644
--- a/src/endWeek/reports/nurseryReport.js
+++ b/src/endWeek/reports/nurseryReport.js
@@ -51,14 +51,6 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 			const {He, he, His, his, him} = getPronouns(S.Matron);
 
 			let r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Matron, SlaveFullName(S.Matron));
-			popup.classList.add("slave-name", "bold");
-
-			r.push(
-				popup,
-				`is serving as your Matron.`
-			);
-
 			if (S.Matron.relationship === -3 && S.Matron.devotion > 50) {
 				r.push(`${He} does ${his} best to ${V.nurseryChildren
 					? `properly raise and look after the children in ${V.nurseryName}`
@@ -146,8 +138,8 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 		if (V.showEWD) {
 			const matronEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", matronEntry);
-			App.SlaveAssignment.appendSlaveLinks(matronEntry, slave);
-			App.Events.addNode(matronEntry, [matronText(), App.SlaveAssignment.standardSlaveReport(slave, false)]);
+			App.Events.addNode(matronEntry, [App.SlaveAssignment.saSlaveName(slave), `is serving as the Madam.`, matronText()]);
+			matronEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(slave, true);
@@ -202,23 +194,16 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			const r = [];
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 
-			r.push(popup);
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is working out of ${V.nurseryName}.`);
+				slaveEntry.append(`is working out of ${V.nurseryName}.`);
 			}
 
-			App.Events.addNode(slaveEntry, [
-				...r,
-				`${He} ${App.SlaveAssignment.nanny(slave)}`,
-				App.SlaveAssignment.standardSlaveReport(slave, false),
-			], "div", ["indent"]);
+			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.nanny(slave)], "div", ["indent"]);
+			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {	// silently discard return values
 			App.SlaveAssignment.nanny(slave);
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index bef20116ad42ecae263d5966cdec142d58d24e3d..4a0fcd51b86b954aeb56150f44d957556e10d1f9 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -18,37 +18,25 @@ App.EndWeek.penthouseReport = function() {
 	}
 
 	for (const slave of App.SlaveAssignment.reportSlaves(penthouseSlaves)) {
-		const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
+		const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 		if (penthouseArtRenderer) {
 			App.UI.DOM.drawOneSlaveRight(slaveEntry, slave, penthouseArtRenderer);
 		}
-		App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
 		slaveEntry.append(fullReport(slave));
 
 		if (slave.ID === V.HeadGirlID && hgSlave) {
 			/* Output the HG's slave immediately after the hg */
-			const {He2, he2} = getPronouns(hgSlave).appendSuffix("2");
+			const {He2} = getPronouns(hgSlave).appendSuffix("2");
 			const hgSlaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			popup.classList.add("slave-name", "bold");
-			if (hgSlave.assignment !== Job.HEADGIRLSUITE) {
-				hgSlaveEntry.classList.add("warning");
-				r.push(
-					popup,
-					`had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.`
-				);
-				removeJob(hgSlave, Job.HEADGIRLSUITE);
-			} else {
-				if (penthouseArtRenderer) {
-					App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer);
-				}
-				App.SlaveAssignment.appendSlaveLinks(hgSlaveEntry, hgSlave);
-				r.push(popup);
-				if (hgSlave.choosesOwnAssignment) {
-					r.push(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`);
-				}
+			if (penthouseArtRenderer) {
+				App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer);
 			}
+			r.push(App.SlaveAssignment.saSlaveName(hgSlave));
+			if (hgSlave.choosesOwnAssignment) {
+				r.push(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`);
+			}
+			r.push(App.SlaveAssignment.liveWithHG(hgSlave));
 
 			App.Events.addNode(hgSlaveEntry, r);
 		}
@@ -73,10 +61,8 @@ App.EndWeek.penthouseReport = function() {
 		} = getPronouns(slave);
 		let r = [];
 		let milkResults;
-
-		const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-		popup.classList.add("slave-name", "bold");
-		r.push(popup);
+		
+		r.push(App.SlaveAssignment.saSlaveName(slave));
 		if (slave.choosesOwnAssignment) {
 			r.push(App.SlaveAssignment.choosesOwnJob(slave));
 			r.push(He);
diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js
index c5488c01e439d09900f15a93741db72f7dbee7f9..8f1ea58b847fe46f619f06266d62796ace5967a1 100644
--- a/src/endWeek/reports/schoolroomReport.js
+++ b/src/endWeek/reports/schoolroomReport.js
@@ -53,11 +53,6 @@ App.EndWeek.schoolroomReport = function() {
 			}
 
 			const {He, he, His, his, him, himself, wife} = getPronouns(S.Schoolteacher);
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Schoolteacher, SlaveFullName(S.Schoolteacher));
-			popup.classList.add("slave-name", "bold");
-			r.push(
-				popup,
-				`is serving as your Schoolteacher.`);
 			if (S.Schoolteacher.relationship === -3 && S.Schoolteacher.devotion > 50) {
 				r.push(`As your loving ${wife}, ${he} tries ${his} best to teach ${his} pupils how to please you.`);
 			}
@@ -160,8 +155,9 @@ App.EndWeek.schoolroomReport = function() {
 		if (V.showEWD !== 0) {
 			const schoolteacherEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", schoolteacherEntry);
-			App.SlaveAssignment.appendSlaveLinks(schoolteacherEntry, slave);
-			App.Events.addNode(schoolteacherEntry, [schoolteacherText(), App.SlaveAssignment.standardSlaveReport(slave, false)]);
+			schoolteacherEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Schoolteacher.`);
+			App.Events.addNode(schoolteacherEntry, [schoolteacherText()], "div", ["indent"]);
+			schoolteacherEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(slave, true);
@@ -239,13 +235,10 @@ App.EndWeek.schoolroomReport = function() {
 			const {He} = getPronouns(slave);
 			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			let r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
+
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
 				let leaderTraining = '';
 				for (const role of Object.keys(V.slaveTutor)) {
@@ -253,14 +246,11 @@ App.EndWeek.schoolroomReport = function() {
 						leaderTraining = ` on being a ${role}`; break;
 					}
 				}
-				r.push(`is studying in ${V.schoolroomName}${leaderTraining}.`);
+				slaveEntry.append(`is studying in ${V.schoolroomName}${leaderTraining}.`);
 			}
-			App.Events.addNode(slaveEntry, r);
-			r = [];
-			const studentContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', ["indent"]);
-			r.push(`${He} ${App.SlaveAssignment.takeClasses(slave)}`);
-			r.push(App.SlaveAssignment.standardSlaveReport(slave, false));
-			App.Events.addNode(studentContent, r);
+
+			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.takeClasses(slave)], "div", ["indent"]);
+			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			// discard return values silently
@@ -271,22 +261,20 @@ App.EndWeek.schoolroomReport = function() {
 	}
 
 	if (restedSlaves > 0) {
-		const rested = App.UI.DOM.appendNewElement("p", frag, '', ["indent"]);
 		const r = [];
 		r.push((restedSlaves === 1) ? `One slave has ` : `${restedSlaves} slaves have`);
-		App.UI.DOM.appendNewElement("span", rested, "learned", ["green"]);
+		r.push(App.UI.DOM.makeElement("span", "learned", ["green"]));
 		r.push(`all they can, and will be released from the schoolroom before the end of the week.`);
-		App.Events.addNode(rested, r);
+		App.Events.addNode(frag, r, "p", ["indent"]);
 	}
 
 	if (V.schoolroomDecoration !== "standard") {
-		const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', ["indent"]);
 		const r = [];
 		r.push(`${capFirstChar(V.schoolroomName)}'s ${V.schoolroomDecoration} atmosphere <span class="hotpink">has a minor impact on the students.</span>`);
 		if (App.Entity.facilities.schoolroom.revivalistLanguageDecorationBonus()) {
 			r.push(`They also <span class="positive">learn ${V.language} more quickly</span> in this environment.`);
 		}
-		App.Events.addNode(decorationEffects, r);
+		App.Events.addNode(frag, r, "p", ["indent"]);
 	}
 
 	return frag;
diff --git a/src/endWeek/reports/servantsQuartersReport.js b/src/endWeek/reports/servantsQuartersReport.js
index ab31b35d454940ab07d8bdbc5bd76e05bde9cecb..5c5730bf07747f855c6dff918629d281073393e3 100644
--- a/src/endWeek/reports/servantsQuartersReport.js
+++ b/src/endWeek/reports/servantsQuartersReport.js
@@ -54,9 +54,6 @@ App.EndWeek.servantsQuartersReport = function() {
 			}
 
 			const {He, he, His, his, him, wife} = getPronouns(S.Stewardess);
-			const popup = App.UI.DOM.slaveDescriptionDialog(S.Stewardess, SlaveFullName(S.Stewardess));
-			popup.classList.add("slave-name", "bold");
-			r.push(popup, `is serving as your Stewardess.`);
 			if (S.Stewardess.relationship === -3 && S.Stewardess.devotion > 50) {
 				r.push(`${He} does ${his} best to be your perfect lovely house${wife}.`);
 			}
@@ -246,8 +243,9 @@ App.EndWeek.servantsQuartersReport = function() {
 		if (V.showEWD) {
 			const stewardessEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", stewardessEntry);
-			App.SlaveAssignment.appendSlaveLinks(stewardessEntry, slave);
-			App.Events.addNode(stewardessEntry, [stewardessText(), App.SlaveAssignment.standardSlaveReport(slave, false)]);
+			stewardessEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as your Stewardess.`);
+			App.Events.addNode(stewardessEntry, [stewardessText()], "div", ["indent"])
+			stewardessEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(slave, true);
@@ -317,30 +315,23 @@ App.EndWeek.servantsQuartersReport = function() {
 
 		if (V.showEWD) {
 			const {He} = getPronouns(slave);
-			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
+			const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			const r = [];
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			popup.classList.add("slave-name", "bold");
-			r.push(popup);
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is working out of ${V.servantsQuartersName}.`);
+				slaveEntry.append(`is working out of ${V.servantsQuartersName}.`);
 			}
-			const servantContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', ["indent"]);
-			App.Events.addNode(servantContent, [`${He} ${App.SlaveAssignment.servant(slave, stewardessBonus)}`]);
+			App.Events.addNode(slaveEntry, [He, App.SlaveAssignment.servant(slave, stewardessBonus)], "div", ["indent"]);
 			if (V.servantMilkers === 1 && slave.lactation > 0) {
-				const milkContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', "indent");
 				const milkResults = App.SlaveAssignment.getMilked(slave, 0.5);
-				App.Events.addNode(milkContent, [`${He} ${milkResults.text}`]);
+				App.Events.addNode(slaveEntry, [He, milkResults.text], "div", ["indent"]);
 				SQMilk += milkResults.milk;
 				SQMilkSale += milkResults.milkSale;
 			}
-			r.push(App.SlaveAssignment.standardSlaveReport(slave, false));
+			slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
-			App.Events.addNode(slaveEntry, r);
 		} else {
 			// discard return values silently
 			App.SlaveAssignment.choosesOwnJob(slave);
diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js
index 473e92766d989d248563e67882e0b0f6fbbb56e5..7bf56b5409405af5efed1928df851257b371c6d2 100644
--- a/src/endWeek/reports/spaReport.js
+++ b/src/endWeek/reports/spaReport.js
@@ -293,17 +293,8 @@ App.EndWeek.spaReport = function() {
 		if (V.showEWD !== 0) {
 			const attendantEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
 			const artSpan = App.UI.DOM.appendNewElement("span", attendantEntry);
-			const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
-			popup.classList.add("slave-name", "bold");
-			App.SlaveAssignment.appendSlaveLinks(attendantEntry, slave);
-			App.Events.addNode(
-				attendantEntry,
-				[
-					popup,
-					`is serving as the Attendant in ${V.spaName}.`,
-					App.SlaveAssignment.standardSlaveReport(slave, false),
-				]
-			);
+			attendantEntry.append(App.SlaveAssignment.saSlaveName(slave), `is serving as the Attendant in ${V.spaName}.`);
+			attendantEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
 			App.SlaveAssignment.appendSlaveArt(artSpan, slave);
 		} else {
 			App.SlaveAssignment.standardSlaveReport(slave, true);
@@ -379,17 +370,15 @@ App.EndWeek.spaReport = function() {
 		}
 
 		if (V.showEWD !== 0) {
-			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
+			const slaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-			App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-			r = [];
-			r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name"));
+			slaveEntry.append(App.SlaveAssignment.saSlaveName(slave));
+
 			if (slave.choosesOwnAssignment) {
-				r.push(App.SlaveAssignment.choosesOwnJob(slave));
+				$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
 			} else {
-				r.push(`is resting in ${V.spaName}.`);
+				slaveEntry.append(`is resting in ${V.spaName}.`);
 			}
-			App.Events.addNode(slaveEntry, r);
 
 			r = [];
 			r.push(He);
diff --git a/src/endWeek/saStayConfined.js b/src/endWeek/saStayConfined.js
index f70ce07583fdb782ed3bd0ae7ad076130fe80b68..6bfd27178f538478673ba60230cc4c751a49b52d 100644
--- a/src/endWeek/saStayConfined.js
+++ b/src/endWeek/saStayConfined.js
@@ -12,7 +12,6 @@ App.SlaveAssignment.stayConfined = function(slave) {
 	const {
 		he, him, his, He, His
 	} = getPronouns(slave);
-	/* eslint-enable */
 
 	let t = "";
 	let brokenSlaves = false;
@@ -118,12 +117,7 @@ App.SlaveAssignment.stayConfined = function(slave) {
 	}
 
 	if (slave.sentence !== 0) {
-		t += ` ${He} has ${slave.sentence}`;
-		if (slave.sentence === 1) {
-			t += ` week remaining.`;
-		} else {
-			t += ` weeks remaining.`;
-		}
+		t += ` ${He} has ${numberWithPluralOne(slave.sentence, "week")} remaining.`;
 	} else if (slave.devotion > 20 || (slave.devotion >= -20 && slave.trust < -20) || (slave.devotion >= -50 && slave.trust < -50) || slave.fetish === Fetish.MINDBROKEN) {
 		if (slave.fetish === Fetish.MINDBROKEN) {
 			t += ` ${His} broken mind hinges entirely on other's guidance,`;
diff --git a/src/endWeek/standardSlaveReport.js b/src/endWeek/standardSlaveReport.js
index 9faa88abd3379699f31a845e2c4aee823546fbd2..370f6dd48a7b36f869e1a828258a43a9ff0f7d21 100644
--- a/src/endWeek/standardSlaveReport.js
+++ b/src/endWeek/standardSlaveReport.js
@@ -1,5 +1,5 @@
 /**
- * Generates (and returns if not silent) a standard slave report
+ * Generates (and returns if not silent) a standard slave report.
  * This is the part after the slave's job in most facilities.
  * @param {FC.ReportSlave} slave
  * @param {boolean} silent
@@ -47,13 +47,17 @@ App.SlaveAssignment.appendSlaveArt = function(node, slave) {
 };
 
 /**
- * Render favorite and reminder links
- * @param {ParentNode} node
+ * Render slave name (with popup link) and favorite and reminder links
  * @param {App.Entity.SlaveState} slave
  */
-App.SlaveAssignment.appendSlaveLinks = function(node, slave) {
-	node.append(
+App.SlaveAssignment.saSlaveName = function(slave) {
+	const frag = new DocumentFragment();
+	const popup = App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave));
+	popup.classList.add("slave-name", "bold");
+	frag.append(
 		App.UI.favoriteToggle(slave), " ",
-		App.Reminders.slaveLink(slave.ID), " "
+		App.Reminders.slaveLink(slave.ID), " ",
+		popup, " "
 	);
+	return frag;
 };
diff --git a/src/events/eventUtils.js b/src/events/eventUtils.js
index 37f975a09b1c4df7560ca9430a4f0fe108215f4a..24ec34502205a3b20984e54410a8bba5fdee86f2 100644
--- a/src/events/eventUtils.js
+++ b/src/events/eventUtils.js
@@ -256,7 +256,7 @@ App.Events.Result = class {
 			node.append(" ");
 		}
 		if (this.note) {
-			node.appendChild(App.UI.DOM.makeElement("span", this.note, "detail"));
+			node.appendChild(App.UI.DOM.makeElement("span", this.note, ["detail"]));
 			wrote = true;
 		}
 		return wrote;
diff --git a/src/events/recETS/recetsIdenticalHermPair.js b/src/events/recETS/recetsIdenticalHermPair.js
index 2128d10917c6a8068df18a68a01719b792d54858..cf6663d961bf3b45d0d881a924305ec59dc5f54e 100644
--- a/src/events/recETS/recetsIdenticalHermPair.js
+++ b/src/events/recETS/recetsIdenticalHermPair.js
@@ -60,9 +60,7 @@ App.Events.recetsIdenticalHermPair = class recetsIdenticalHermPair extends App.E
 		setMissingParents(thing1);
 		thing1.canRecruit = 0;
 		thing1.relationship = 4;
-
-		let cost = slaveCost(thing1);
-		let contractCost = cost;
+		const contractCost = slaveCost(thing1) * 2;
 
 		const thing2 = generateRelatedSlave(thing1, "twin");
 		thing2.energy = Math.max(thing2.energy, 40);
@@ -123,15 +121,15 @@ App.Events.recetsIdenticalHermPair = class recetsIdenticalHermPair extends App.E
 		}
 
 		App.Events.addParagraph(node, [Spoken(thing2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`)]);
-		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, ["detail"]);
 
 		const newSlaves = [thing1, thing2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -139,9 +137,9 @@ App.Events.recetsIdenticalHermPair = class recetsIdenticalHermPair extends App.E
 
 		function both() {
 			newSlave(thing1);
-			cashX(forceNeg(contractCost), "slaveTransfer", thing1);
 			newSlave(thing2);
-			cashX(forceNeg(contractCost), "slaveTransfer", thing2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", thing1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", thing2);
 			return [
 				`They giggle and kiss each other rather passionately, their miniskirts ${V.seePreg ? `becoming pinned against their pregnancies` : `being lifted toward their navels`} by their stiffening pricks. They're very well trained but not very disciplined, though their pervertedness will be fun.`,
 				Spoken(thing2, `"You know we ${V.seePreg ? `each are carrying the other's twins` : `took each other's virginities`}, right?"`),
diff --git a/src/events/recETS/recetsIdenticalPair.js b/src/events/recETS/recetsIdenticalPair.js
index d47deb0310eeea3bdccb4417211d012f6bcf0372..551ad443bdb640dd50a64fda94e1458e8cbe5113 100644
--- a/src/events/recETS/recetsIdenticalPair.js
+++ b/src/events/recETS/recetsIdenticalPair.js
@@ -53,8 +53,7 @@ App.Events.recetsIdenticalPair = class recetsIdenticalPair extends App.Events.Ba
 		setMissingParents(thing1);
 		thing1.canRecruit = 0;
 		thing1.relationship = 2;
-		let cost = slaveCost(thing1);
-		const contractCost = cost;
+		const contractCost = slaveCost(thing1) * 2 ;
 
 		const thing2 = generateRelatedSlave(thing1, "twin");
 		thing2.energy = Math.max(thing2.energy, 40);
@@ -77,15 +76,15 @@ App.Events.recetsIdenticalPair = class recetsIdenticalPair extends App.Events.Ba
 		]);
 
 		App.Events.addParagraph(node, [Spoken(thing2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`)]);
-		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, ["detail"]);
 
 		const newSlaves = [thing1, thing2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -93,9 +92,9 @@ App.Events.recetsIdenticalPair = class recetsIdenticalPair extends App.Events.Ba
 
 		function both() {
 			newSlave(thing1);
-			cashX(forceNeg(contractCost), "slaveTransfer", thing1);
 			newSlave(thing2);
-			cashX(forceNeg(contractCost), "slaveTransfer", thing2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", thing1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", thing2);
 			return App.UI.DOM.combineNodes(
 				`They giggle and kiss each other rather sexually, pressing their nearly identical bodies closely together. They're clearly very well trained.`,
 				newSlaveIncestSex(thing1, thing2)
diff --git a/src/events/recETS/recetsIncestBrotherBrother.js b/src/events/recETS/recetsIncestBrotherBrother.js
index 6268372492c0142c2ff3b94233d7e9d66db9d7f5..f32c9036ae9b21ea231589f0d2062833c2d5e8a7 100644
--- a/src/events/recETS/recetsIncestBrotherBrother.js
+++ b/src/events/recETS/recetsIncestBrotherBrother.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const brother1 = GenerateNewSlave("XY", {
 			minAge: Math.max(V.potencyAge + 2, V.minimumSlaveAge + 2), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -35,7 +35,6 @@ App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends
 		setMissingParents(brother1);
 		brother1.canRecruit = 0;
 		brother1.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const brother2 = generateRelatedSlave(brother1, "younger brother");
 		brother2.height += random(-5, 5);
@@ -55,9 +54,7 @@ App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends
 		brother2.relationshipTarget = brother1.ID;
 		brother1.relationshipTarget = brother2.ID;
 
-		const {
-			sister
-		} = getPronouns(brother1);
+		const {sister} = getPronouns(brother1);
 		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
@@ -66,15 +63,15 @@ App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [brother1, brother2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -83,8 +80,8 @@ App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends
 		function both() {
 			newSlave(brother2);
 			newSlave(brother1);
-			cashX(forceNeg(contractCost), "slaveTransfer", brother1);
-			cashX(forceNeg(contractCost), "slaveTransfer", brother2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", brother1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", brother2);
 			return [
 				`They hug each other tightly as the older ${sister} slips a hand down the younger's pants. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(brother1, brother2)
diff --git a/src/events/recETS/recetsIncestBrotherSister.js b/src/events/recETS/recetsIncestBrotherSister.js
index 6f07cec0db1ec9b645ef082b995020e8cff786c2..33d02a20b8d8b5ca1af275345268644bcd6d5e8e 100644
--- a/src/events/recETS/recetsIncestBrotherSister.js
+++ b/src/events/recETS/recetsIncestBrotherSister.js
@@ -14,7 +14,7 @@ App.Events.recetsIncestBrotherSister = class recetsIncestBrotherSister extends A
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const sis = GenerateNewSlave("XX", {
 			minAge: Math.max(V.fertilityAge, V.potencyAge + 2, V.minimumSlaveAge + 2), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -39,7 +39,6 @@ App.Events.recetsIncestBrotherSister = class recetsIncestBrotherSister extends A
 		setMissingParents(sis);
 		sis.canRecruit = 0;
 		sis.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const bro = generateRelatedSlave(sis, "younger brother");
 		bro.pubicHStyle = "shaved";
@@ -83,15 +82,15 @@ App.Events.recetsIncestBrotherSister = class recetsIncestBrotherSister extends A
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [sis, bro];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -100,8 +99,8 @@ App.Events.recetsIncestBrotherSister = class recetsIncestBrotherSister extends A
 		function both() {
 			newSlave(bro);
 			newSlave(sis);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis);
-			cashX(forceNeg(contractCost), "slaveTransfer", bro);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", bro);
 			return [
 				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(sis, bro)
diff --git a/src/events/recETS/recetsIncestFatherDaughter.js b/src/events/recETS/recetsIncestFatherDaughter.js
index 1feb9d539cbff392c4b18b889039eb97b4ae3616..b45a91f700f868aad58e1988ec70cdc1b6f5b7a6 100644
--- a/src/events/recETS/recetsIncestFatherDaughter.js
+++ b/src/events/recETS/recetsIncestFatherDaughter.js
@@ -15,7 +15,7 @@ App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const father = GenerateNewSlave("XY", {
 			minAge: Math.max(V.potencyAge + 20, V.fertilityAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -38,7 +38,6 @@ App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends
 		father.behavioralQuirk = "sinful";
 		father.canRecruit = 0;
 		father.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const daughter = generateRelatedSlave(father, "daughter");
 		daughter.vagina = 3;
@@ -92,15 +91,15 @@ App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost*2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [father, daughter];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -109,8 +108,8 @@ App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends
 		function both() {
 			newSlave(daughter);
 			newSlave(father);
-			cashX(forceNeg(contractCost), "slaveTransfer", father);
-			cashX(forceNeg(contractCost), "slaveTransfer", daughter);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", father);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", daughter);
 			return [
 				`The ${daughter2} cheers happily and hugs ${his2} relieved father. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(father, daughter)
diff --git a/src/events/recETS/recetsIncestFatherSon.js b/src/events/recETS/recetsIncestFatherSon.js
index 44a969d7d21a960001f4d8422158357cbe9de019..50458bd83118316f521bfd5f5e1b318ab8075375 100644
--- a/src/events/recETS/recetsIncestFatherSon.js
+++ b/src/events/recETS/recetsIncestFatherSon.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestFatherSon = class recetsIncestFatherSon extends App.Event
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const father = GenerateNewSlave("XY", {
 			minAge: Math.max(V.potencyAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -36,7 +36,6 @@ App.Events.recetsIncestFatherSon = class recetsIncestFatherSon extends App.Event
 		father.behavioralQuirk = "sinful";
 		father.canRecruit = 0;
 		father.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const son = generateRelatedSlave(father, "son");
 		son.career = "a student";
@@ -66,15 +65,15 @@ App.Events.recetsIncestFatherSon = class recetsIncestFatherSon extends App.Event
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [father, son];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -83,8 +82,8 @@ App.Events.recetsIncestFatherSon = class recetsIncestFatherSon extends App.Event
 		function both() {
 			newSlave(son);
 			newSlave(father);
-			cashX(forceNeg(contractCost), "slaveTransfer", father);
-			cashX(forceNeg(contractCost), "slaveTransfer", son);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", father);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", son);
 			return [
 				`The father hugs ${his} ${daughter2} tight and slips a hand down ${his2} pants. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(father, son)
diff --git a/src/events/recETS/recetsIncestMotherDaughter.js b/src/events/recETS/recetsIncestMotherDaughter.js
index 9d24ea18678e4d4f738c17d998680d3a3cc85f13..bc220e238aff8684bf8388882a0cc9a68f36c569 100644
--- a/src/events/recETS/recetsIncestMotherDaughter.js
+++ b/src/events/recETS/recetsIncestMotherDaughter.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestMotherDaughter = class recetsIncestMotherDaughter extends
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const mother = GenerateNewSlave("XX", {
 			minAge: Math.max(V.fertilityAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -47,7 +47,6 @@ App.Events.recetsIncestMotherDaughter = class recetsIncestMotherDaughter extends
 		mother.behavioralQuirk = "sinful";
 		mother.canRecruit = 0;
 		mother.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const daughter = generateRelatedSlave(mother, "daughter");
 		daughter.career = "a student";
@@ -87,15 +86,15 @@ App.Events.recetsIncestMotherDaughter = class recetsIncestMotherDaughter extends
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [mother, daughter];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -104,8 +103,8 @@ App.Events.recetsIncestMotherDaughter = class recetsIncestMotherDaughter extends
 		function both() {
 			newSlave(daughter);
 			newSlave(mother);
-			cashX(forceNeg(contractCost), "slaveTransfer", mother);
-			cashX(forceNeg(contractCost), "slaveTransfer", daughter);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", mother);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", daughter);
 			return [
 				`The ${daughter2} cheers happily and hugs ${his2} relieved mother. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(mother, daughter)
diff --git a/src/events/recETS/recetsIncestMotherSon.js b/src/events/recETS/recetsIncestMotherSon.js
index c4c921ccda5e5bb565bc6513fadcba4d047b445a..4cc7983b64c523863af89e51790b46e96be6357f 100644
--- a/src/events/recETS/recetsIncestMotherSon.js
+++ b/src/events/recETS/recetsIncestMotherSon.js
@@ -14,7 +14,7 @@ App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Event
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const mother = GenerateNewSlave("XX", {
 			minAge: Math.max(V.fertilityAge + 20, V.potencyAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -47,7 +47,6 @@ App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Event
 		mother.behavioralQuirk = "sinful";
 		mother.canRecruit = 0;
 		mother.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const son = generateRelatedSlave(mother, "son");
 		son.career = "a student";
@@ -82,16 +81,11 @@ App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Event
 			WombChangeGene(mother, "motherName", mother.slaveName);
 		}
 
-		const {
-			He,
-			his
-		} = getPronouns(mother);
+		const {He, his} = getPronouns(mother);
 		const {
 			daughter2, his2, him2
 		} = getPronouns(son).appendSuffix("2");
-		const {
-			HeA
-		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 		const children = mother.pregType > 1 ? "children" : "child";
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
@@ -100,15 +94,15 @@ App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Event
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [mother, son];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -117,8 +111,8 @@ App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Event
 		function both() {
 			newSlave(son);
 			newSlave(mother);
-			cashX(forceNeg(contractCost), "slaveTransfer", mother);
-			cashX(forceNeg(contractCost), "slaveTransfer", son);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", mother);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", son);
 			return [
 				`The ${daughter2} cheers happily and hugs ${his2} relieved mother. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(mother, son)
diff --git a/src/events/recETS/recetsIncestSisterSister.js b/src/events/recETS/recetsIncestSisterSister.js
index ff684f5355d1c16f100e5af37f1e844107e777b6..9c81d5d7d17a61854fc7f588b5db618b2d379f8e 100644
--- a/src/events/recETS/recetsIncestSisterSister.js
+++ b/src/events/recETS/recetsIncestSisterSister.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const sis1 = GenerateNewSlave("XX", {
 			minAge: V.minimumSlaveAge + 2, maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -37,7 +37,6 @@ App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App
 		setMissingParents(sis1);
 		sis1.canRecruit = 0;
 		sis1.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const sis2 = generateRelatedSlave(sis1, "younger sister");
 		sis2.pubicHStyle = "bushy";
@@ -54,12 +53,8 @@ App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App
 
 		sis1.relationshipTarget = sis2.ID;
 
-		const {
-			sister
-		} = getPronouns(sis1);
-		const {
-			HeA
-		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+		const {sister} = getPronouns(sis1);
+		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
 
@@ -67,15 +62,15 @@ App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [sis1, sis2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -84,8 +79,8 @@ App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App
 		function both() {
 			newSlave(sis2);
 			newSlave(sis1);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis2);
 			return [
 				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(sis1, sis2)
diff --git a/src/events/recETS/recetsIncestTwinBrother.js b/src/events/recETS/recetsIncestTwinBrother.js
index 1606396cb110305e872d6d7bbb0c7d64d97f012a..8ab785f01258588c744138c8b8ef81215b3bfdfa 100644
--- a/src/events/recETS/recetsIncestTwinBrother.js
+++ b/src/events/recETS/recetsIncestTwinBrother.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.E
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const brother1 = GenerateNewSlave("XY", {
 			minAge: Math.max(V.potencyAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -47,10 +47,7 @@ App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.E
 		brother2.relationshipTarget = brother1.ID;
 		brother1.relationshipTarget = brother2.ID;
 
-		const {
-			sister
-		} = getPronouns(brother1);
-
+		const {sister} = getPronouns(brother1);
 		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
@@ -59,15 +56,15 @@ App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.E
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [brother1, brother2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -76,8 +73,8 @@ App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.E
 		function both() {
 			newSlave(brother2);
 			newSlave(brother1);
-			cashX(forceNeg(contractCost), "slaveTransfer", brother1);
-			cashX(forceNeg(contractCost), "slaveTransfer", brother2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", brother1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", brother2);
 			return [
 				`They hug each other tightly as they slip a hand down the other's pants. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(brother1, brother2)
diff --git a/src/events/recETS/recetsIncestTwinSister.js b/src/events/recETS/recetsIncestTwinSister.js
index 86359872b6232ac9d254533d7227f666c5a69722..091551daba1c0aa53aff34f6db38158740bd63df 100644
--- a/src/events/recETS/recetsIncestTwinSister.js
+++ b/src/events/recETS/recetsIncestTwinSister.js
@@ -13,7 +13,7 @@ App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Eve
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const sis1 = GenerateNewSlave("XX", {
 			minAge: Math.max(V.fertilityAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -36,7 +36,6 @@ App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Eve
 		setMissingParents(sis1);
 		sis1.canRecruit = 0;
 		sis1.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const sis2 = generateRelatedSlave(sis1, "twin");
 		sis2.slaveName = sis2.birthName;
@@ -51,10 +50,7 @@ App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Eve
 		sis1.relationshipTarget = sis2.ID;
 
 		const {sister} = getPronouns(sis1);
-
-		const {
-			HeA
-		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
 
@@ -62,15 +58,15 @@ App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Eve
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [sis1, sis2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -79,8 +75,8 @@ App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Eve
 		function both() {
 			newSlave(sis2);
 			newSlave(sis1);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis2);
 			return [
 				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(sis1, sis2)
diff --git a/src/events/recETS/recetsIncestTwinsMixed.js b/src/events/recETS/recetsIncestTwinsMixed.js
index 7ce1c60997e0e337fdf09cb3d11c856c26d51c9a..da82a05d02f9cc6568edb6973acbe3d802197aca 100644
--- a/src/events/recETS/recetsIncestTwinsMixed.js
+++ b/src/events/recETS/recetsIncestTwinsMixed.js
@@ -14,7 +14,7 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		const contractCost = 10000;
+		const contractCost = 10000 * 2;
 		const sis = GenerateNewSlave("XX", {
 			minAge: Math.max(V.fertilityAge, V.potencyAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
 		});
@@ -38,7 +38,6 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 		setMissingParents(sis);
 		sis.canRecruit = 0;
 		sis.relationship = 3;
-		/* cost not needed, no option to sell */
 
 		const bro = generateRelatedSlave(sis, "twin", true);
 		bro.height += random(-5, 5);
@@ -78,10 +77,8 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 			WombChangeGene(sis, "motherName", sis.slaveName);
 		}
 
+		const {he, his} = getPronouns(sis);
 		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
-		const {
-			he, his
-		} = getPronouns(sis);
 		const children = sis.pregType > 1 ? "children" : "child";
 
 		App.Events.addParagraph(node, [`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`]);
@@ -90,15 +87,15 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 
 		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);
 
-		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost)} to enslave the two of them.`, ["detail"]);
 
 		const newSlaves = [sis, bro];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -107,8 +104,8 @@ App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Eve
 		function both() {
 			newSlave(bro);
 			newSlave(sis);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis);
-			cashX(forceNeg(contractCost), "slaveTransfer", bro);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", bro);
 			return [
 				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
 				newSlaveIncestSex(sis, bro)
diff --git a/src/events/recETS/recetsMatchedPair.js b/src/events/recETS/recetsMatchedPair.js
index 84dd394ec1bd703545464342ff51e48947520d6d..27ffa9b7645aa30a94a4647d429436711873e265 100644
--- a/src/events/recETS/recetsMatchedPair.js
+++ b/src/events/recETS/recetsMatchedPair.js
@@ -13,7 +13,6 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 
 	execute(node) {
 		V.encyclopedia = "Enslaving People";
-		/* contractCost not needed, no option to sell */
 		const sis1 = GenerateNewSlave("XY", {minAge: 12, maxAge: 21, disableDisability: 1});
 		sis1.origin = "$He was brought up in a radical slave school to match $his twin.";
 		sis1.career = "a slave";
@@ -55,8 +54,7 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 		setMissingParents(sis1);
 		sis1.canRecruit = 0;
 		sis1.relationship = 2;
-		let cost = slaveCost(sis1);
-		let contractCost = cost;
+		const contractCost = slaveCost(sis1) * 2;
 
 		const sis2 = generateRelatedSlave(sis1, "twin", true);
 		sis2.vagina = 1;
@@ -82,9 +80,7 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 		sis1.relationshipTarget = sis2.ID;
 
 		const {His, his} = getPronouns(sis1);
-		const {
-			he2, sister2,
-		} = getPronouns(sis2).appendSuffix("2");
+		const {he2, sister2} = getPronouns(sis2).appendSuffix("2");
 
 		let r = [];
 
@@ -104,15 +100,15 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 		r = [];
 		r.push(Spoken(sis2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`));
 		App.Events.addParagraph(node, r);
-		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical except that ${he2} is naturally female and lacks implants, having reached that size the normal way.`, "detail");
+		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical except that ${he2} is naturally female and lacks implants, having reached that size the normal way.`, ["detail"]);
 
 		const newSlaves = [sis1, sis2];
 
 		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
 		const choices = [];
 
-		if (V.cash >= (contractCost * 2)) {
-			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
+		if (V.cash >= contractCost) {
+			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost)}`));
 		} else {
 			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
 		}
@@ -120,9 +116,9 @@ App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEv
 
 		function both() {
 			newSlave(sis1);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
 			newSlave(sis2);
-			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis1);
+			cashX(forceNeg(contractCost / 2), "slaveTransfer", sis2);
 			return [
 				`They giggle and kiss each other rather sexually, pressing their nearly identical bodies closely together so their hips and shapely buttocks hide any sign of their difference. They're clearly very well trained.`,
 				newSlaveIncestSex(sis1, sis2)];
diff --git a/src/events/recETS/recetsMismatchedPair.js b/src/events/recETS/recetsMismatchedPair.js
index a29631effe56604bfe04022b766f361968227133..eb07df36e443b4edc4acae61e8829f6939a66ab7 100644
--- a/src/events/recETS/recetsMismatchedPair.js
+++ b/src/events/recETS/recetsMismatchedPair.js
@@ -141,8 +141,8 @@ App.Events.recetsMismatchedPair = class recetsMismatchedPair extends App.Events.
 
 		function both() {
 			newSlave(bro);
-			cashX(forceNeg(contractCost), "slaveTransfer", bro);
 			newSlave(sis);
+			cashX(forceNeg(contractCost), "slaveTransfer", bro);
 			cashX(forceNeg(contractCost), "slaveTransfer", sis);
 			const frag = new DocumentFragment();
 			App.Events.addParagraph(frag, [`The poor sissy isn't happy to become a slave, but ${he}'s clearly relieved to be away from ${his} ${sister2}. The bitch isn't likely to have an easy time; the sale didn't clear ${him2} from debt. ${bro.slaveName} describes ${his} basic sexual experience, which includes a lot of sucking and anal whoring. Without further ado ${he} moves from practical sexual slavery at the hands of ${his} ${sister2} to actual sexual slavery.`]);
diff --git a/src/facilities/incubator/incubatorInteract.js b/src/facilities/incubator/incubatorInteract.js
index ad264abc7cc3fd468f4ae71a91763a61a780d9f2..1194ce6383300821461e2bcfa2cfc72af57761ae 100644
--- a/src/facilities/incubator/incubatorInteract.js
+++ b/src/facilities/incubator/incubatorInteract.js
@@ -931,7 +931,7 @@ App.UI.incubator = function() {
 								)
 							);
 						} else {
-							linkArray.push(App.UI.DOM.makeElement("span", `Ovaries are already prepared.`, "detail"));
+							linkArray.push(App.UI.DOM.makeElement("span", `Ovaries are already prepared.`, ["detail"]));
 						}
 					}
 					if (V.incubator.tanks[i].dick === 0 && (V.seeDicks > 0 || V.makeDicks > 0)) {
@@ -940,14 +940,14 @@ App.UI.incubator = function() {
 								makeLink("Prepare penis", () => { App.Medicine.OrganFarm.growIncubatorOrgan(V.incubator.tanks[i], "penis"); }, refresh)
 							);
 						} else {
-							linkArray.push(App.UI.DOM.makeElement("span", `A penis is already prepared`, "detail"));
+							linkArray.push(App.UI.DOM.makeElement("span", `A penis is already prepared`, ["detail"]));
 						}
 					}
 					if (V.incubator.tanks[i].balls === 0) {
 						if (tankOrgans.testicles !== 1) {
 							linkArray.push(makeLink("Prepare testicles", () => { App.Medicine.OrganFarm.growIncubatorOrgan(V.incubator.tanks[i], "testicles"); }, refresh));
 						} else {
-							linkArray.push(App.UI.DOM.makeElement("span", `Testicles are already prepared.`, "detail"));
+							linkArray.push(App.UI.DOM.makeElement("span", `Testicles are already prepared.`, ["detail"]));
 						}
 					}
 					const vision = {
diff --git a/src/facilities/wardrobe/wardrobeShopping.js b/src/facilities/wardrobe/wardrobeShopping.js
index d6bd9c1caeb1473ba0a37de14341de06a3bd6fec..54bc1a170c8067f0d45588f0174ef9d045c2d373 100644
--- a/src/facilities/wardrobe/wardrobeShopping.js
+++ b/src/facilities/wardrobe/wardrobeShopping.js
@@ -133,7 +133,7 @@ App.UI.WardrobeShopping = function() {
 							}
 						)
 					);
-					App.UI.DOM.appendNewElement("div", el, ` Costs ${cashFormat(cost)}`, "detail");
+					App.UI.DOM.appendNewElement("div", el, ` Costs ${cashFormat(cost)}`, ["detail"]);
 				} else {
 					div = App.UI.DOM.disabledLink(
 						`Order ${clothingObj.title}`,
@@ -189,7 +189,7 @@ App.UI.WardrobeShopping = function() {
 						)
 					);
 					if (cost > 0) {
-						App.UI.DOM.appendNewElement("span", div, ` Costs ${cashFormat(cost)}`, "detail");
+						App.UI.DOM.appendNewElement("span", div, ` Costs ${cashFormat(cost)}`, ["detail"]);
 					}
 				} else {
 					div.append(
diff --git a/src/js/ibcJS.js b/src/js/ibcJS.js
index 7006c2d3368f50f2c6be0d203cc286660a7625ee..e7dde696f7298466afb896af1a0883916ed344ae 100644
--- a/src/js/ibcJS.js
+++ b/src/js/ibcJS.js
@@ -12,7 +12,6 @@
 // TODO: replace snake_case with camelCase
 
 /* eslint-disable camelcase */
-/* eslint-disable eqeqeq */
 globalThis.ibc = (() => {
 	let realWorld =
 	{
diff --git a/src/neighbor/neighborInteract.js b/src/neighbor/neighborInteract.js
index 1e0d86eab240e66dde8168991abcb937358a81c3..c5d724a3c4f3e88304149f8efa2097f7e750a096 100644
--- a/src/neighbor/neighborInteract.js
+++ b/src/neighbor/neighborInteract.js
@@ -208,7 +208,7 @@ App.Neighbor.Interact = function() {
 					}
 					const div = App.UI.DOM.appendNewElement("div", frag, App.UI.DOM.generateLinksStrip(links));
 					if (links.length > 1) {
-						App.UI.DOM.appendNewElement("span", div, " Transaction costs will only be paid once.", "detail");
+						App.UI.DOM.appendNewElement("span", div, " Transaction costs will only be paid once.", ["detail"]);
 					}
 				}
 
@@ -426,7 +426,7 @@ App.Neighbor.Interact = function() {
 								replaceDetails(arcID);
 							});
 							const div = App.UI.DOM.appendNewElement("div", container, link);
-							App.UI.DOM.appendNewElement("span", div, `Will cost ${cashFormat(itemPrice)}`, "detail");
+							App.UI.DOM.appendNewElement("span", div, `Will cost ${cashFormat(itemPrice)}`, ["detail"]);
 						}
 					} else {
 						App.UI.DOM.appendNewElement("div", container, `You already have enough ${itemDisplay}.`);
diff --git a/src/npc/descriptions/limbs.js b/src/npc/descriptions/limbs.js
index 7b38f1e61c4ca34a1dcdc8a0ccfa3ab6762062d6..e35ec86d77acd0f2d91d6babdfd350a15218edef 100644
--- a/src/npc/descriptions/limbs.js
+++ b/src/npc/descriptions/limbs.js
@@ -40,10 +40,10 @@ App.Medicine.Limbs.currentLimbs = function(slave) {
 App.Medicine.Limbs.selector = function(slave, oldLimbs) {
 	const {her} = getPronouns(slave);
 	if (hasAllNaturalLimbs(slave)) {
-		return App.UI.DOM.makeElement("span", `You must amputate ${her} limbs before you can attach prosthetics.`, "detail");
+		return App.UI.DOM.makeElement("span", `You must amputate ${her} limbs before you can attach prosthetics.`, ["detail"]);
 	}
 	if (slave.PLimb < 1) {
-		return App.UI.DOM.makeElement("span", `You must surgically install a prosthetic interface before you can attach prosthetics.`, "detail");
+		return App.UI.DOM.makeElement("span", `You must surgically install a prosthetic interface before you can attach prosthetics.`, ["detail"]);
 	}
 
 	const {his} = getPronouns(slave);
diff --git a/src/npc/surgery/organFarm.js b/src/npc/surgery/organFarm.js
index 469de81f6f7660d63cac96a572278c5165b6c55c..aaa889265c91e8d4f9c24f15c7a59d3e0641250c 100644
--- a/src/npc/surgery/organFarm.js
+++ b/src/npc/surgery/organFarm.js
@@ -43,7 +43,7 @@ App.Medicine.OrganFarm.growActions = function(slave) {
 				})));
 
 				const tooltip = typeof organ.tooltip === "string" ? organ.tooltip : organ.tooltip(slave);
-				array.push(App.UI.DOM.makeElement("div", `Costs ${cashFormat(organ.cost)}${tooltip !== "" ? ` and ${tooltip}` : ""}.`, "detail"));
+				array.push(App.UI.DOM.makeElement("div", `Costs ${cashFormat(organ.cost)}${tooltip !== "" ? ` and ${tooltip}` : ""}.`, ["detail"]));
 
 				if (organ.implantActions.some((o) => {
 					return o.canImplant(slave);
@@ -377,7 +377,7 @@ App.Medicine.OrganFarm.currentlyGrowing = function() {
 	}
 
 	if (growLines.length === 0 && finishLines.length === 0) {
-		App.UI.DOM.appendNewElement("div", frag, "Organs must be genetically matched to their host slave. To begin growing organs for a slave, take them to the Remote Surgery.", "detail");
+		App.UI.DOM.appendNewElement("div", frag, "Organs must be genetically matched to their host slave. To begin growing organs for a slave, take them to the Remote Surgery.", ["detail"]);
 	}
 
 	return frag;