diff --git a/devNotes/Extended Family Mode Explained.txt b/devNotes/Extended Family Mode Explained.txt
index 6e888e909c3cd5e091c850382c4c9e346714a1a4..2e80c02cca58b6815b7c5db34b31d40055a2cb9c 100644
--- a/devNotes/Extended Family Mode Explained.txt	
+++ b/devNotes/Extended Family Mode Explained.txt	
@@ -9,7 +9,7 @@ Everything about a slave's family can be gathered by looking into her mother and
 The following values are used with .mother and .father:
 Valid slave IDs (in other words, a value > 0) - Serves as both a target for checks and as a check itself to see if effort should be expended to search for the parent.
 0 - Slave has no known parent. A slave with a parent value of 0 is capable of having a parent added via reRelativeRecruiter
-MissingParentIDs (in other words, a value < -2) - Serves as a placeholder to preserve sibling relations in the case of a parent being sold or lost. Outside of extreme cases, this value will never be restored to its' previous value. $missingParentID starts at -10000 and decrements after application. On NG+, positive values are incremented the same as a normal slave and checked for validity. Should it be invalid, it will be replaced with $missingParentID. Negative values, on the other hand, are decremented by 1200000. Values of -1 and -2 are ignored by the JS, so don't use them. Also -9999 through -9994 are used by hero slaves to preserve their sibling status no matter when they are purchased or obtained during the same game.
+MissingParentIDs (in other words, a value < -2) - Serves as a placeholder to preserve sibling relations in the case of a parent being sold or lost. Outside of extreme cases, this value will never be restored to its previous value. $missingParentID starts at -10000 and decrements after application. On NG+, positive values are incremented the same as a normal slave and checked for validity. Should it be invalid, it will be replaced with $missingParentID. Negative values, on the other hand, are decremented by 1200000. Values of -1 and -2 are ignored by the JS, so don't use them. Also -9999 through -9994 are used by hero slaves to preserve their sibling status no matter when they are purchased or obtained during the same game.
 
 
 The limiters: .sisters and .daughters
diff --git a/js/003-data/careers.js b/js/003-data/careers.js
index 8764824377cbd086155963e1900c364cccbd1446..d1757edade6584a3a06edb7ca11ab35550b92d8e 100644
--- a/js/003-data/careers.js
+++ b/js/003-data/careers.js
@@ -16,6 +16,8 @@ App.Data.Careers = {
 
 		whore: ["a bimbo", "a child prostitute", "a criminal", "a cum dump", "a Futanari Sister", "a juvenile delinquent", "a mail-order bride", "a meat toilet", "a mistress", "a model", "a pageant star", "a pirate", "a porn star", "a prostitute", "a reality show star", "a saleswoman", "a serial divorcee", "a stripper", "a trophy wife", "an escort", "an exotic dancer"],
 
+		servant: ["a butler", "a cook", "a handmaiden", "a housewife", "a maid", "a shrine maiden"],
+
 		/* 	otherCareers: ["a producer", "being homeschooled by her parents", "from a middle class family", "from an upper class family"]>> */
 	},
 	Leader: {
@@ -44,7 +46,5 @@ App.Data.Careers = {
 		schoolteacher: ["a child prodigy", "a coach", "a dean", "a historian", "a librarian", "a principal", "a private instructor", "a professor", "a scholar", "a scientist", "a teacher's pet", "a teacher", "a teaching assistant", "an archaeologist", "an astronaut", "an economist"],
 
 		recruiter: ["a club recruiter", "a college scout", "a con artist", "a cult leader", "a girl scout", "a hunter", "a lobbyist", "a military recruiter", "a missionary", "a political activist", "a princess", "a spy", "a talent scout", "retired"],
-
-		servant: ["a butler", "a cook", "a handmaiden", "a housewife", "a maid", "a shrine maiden"],
 	},
 };
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index d366e2ad04ba636e2c7da0ac9a114527c2c11c31..01567d806b7000cc2829c817baf782bd09691811 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -985,39 +985,72 @@ App.Data.resetOnNGPlus = {
 	organFarmUpgrade: 0,
 	/** @type {FC.Medicine.OrganFarm.GrowingOrgan[]} */
 	completedOrgans: [],
+	/** @type {FC.Bool} */
 	ImplantProductionUpgrade: 0,
+	/** @type {FC.Bool} */
 	permaPregImplant: 0,
+	/** @type {0|1|2|3} */
 	injectionUpgrade: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradeMood: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradeShrinkage: 0,
+	/** @type {FC.Bool} */
 	hormoneUpgradePower: 0,
+	/** @type {FC.Bool} */
 	pubertyHormones: 0,
+	/** @type {FC.Bool} */
 	dietXXY: 0,
+	/** @type {FC.Bool} */
 	dietCleanse: 0,
+	/** @type {FC.Bool} */
 	cumProDiet: 0,
+	/** @type {FC.Bool} */
 	dietFertility: 0,
+	/** @type {FC.Bool} */
 	curativeUpgrade: 0,
+	/** @type {FC.Bool} */
 	growthStim: 0,
+	/** @type {FC.Bool} */
 	reproductionFormula: 0,
+	/** @type {FC.Bool} */
 	aphrodisiacUpgrade: 0,
+	/** @type {FC.Bool} */
 	aphrodisiacUpgradeRefine: 0,
+	/** @type {FC.Bool} */
 	healthyDrugsUpgrade: 0,
+	/** @type {FC.Bool} */
 	superFertilityDrugs: 0,
+	/** @type {FC.Bool} */
 	bellyImplants: 0,
+	/** @type {0|1|2} */
 	cervixImplants: 0,
+	/** @type {FC.Bool} */
 	meshImplants: 0,
+	/** @type {FC.Bool} */
 	prostateImplants: 0,
+	/** @type {FC.Bool} */
 	youngerOvaries: 0,
+	/** @type {FC.Bool} */
 	sympatheticOvaries: 0,
+	/** @type {FC.Bool} */
 	fertilityImplant: 0,
+	/** @type {FC.Bool} */
 	asexualReproduction: 0,
+	/** @type {FC.Bool} */
 	animalOvaries: 0, /* {pigOvaries: 0, canineOvaries: 0, horseOvaries: 0, cowOvaries: 0} currently unused*/
+	/** @type {FC.Bool} */
 	animalTesticles: 0, /* {pigTestes: 0, dogTestes: 0, horseTestes: 0, cowTestes: 0} currently unused*/
+	/** @type {FC.Bool} */
 	animalMpreg: 0, /* {pigMpreg: 0, dogMpreg: 0, horseMpreg: 0, cowMpreg: 0} currently unused*/
+	/** @type {0|1|2} */
 	geneticMappingUpgrade: 0,
 	toyShop: false,
+	/** @type {FC.Bool} */
 	pregnancyMonitoringUpgrade: 0,
+	/** @type {FC.Bool} */
 	cloningSystem: 0,
+	/** @type {FC.Bool} */
 	geneticFlawLibrary: 0,
 
 	projectN: App.Data.projectN,
diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js
index 461a50c97ccbde043a66889fba171855ed7eeea6..4b1f337a91da65339e6f1caec9157be6e9f748e2 100644
--- a/src/005-passages/managePassages.js
+++ b/src/005-passages/managePassages.js
@@ -94,22 +94,21 @@ new App.DomPassage("Elective Surgery",
 new App.DomPassage("Brothel Advertisement",
 	() => {
 		return App.Facilities.Brothel.ads();
-	}
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Club Advertisement",
 	() => {
 		return App.Facilities.Club.ads();
-	}
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Coursing Association",
 	() => {
 		V.nextButton = "Back to Main";
 		V.nextLink = "Main";
-		V.returnTo = "Coursing Association";
 		return App.UI.coursingAssociation();
-	}
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Personal assistant options",
diff --git a/src/005-passages/optionsPassages.js b/src/005-passages/optionsPassages.js
index dc39958b5c640ebcd25142e0fc4d55559b594550..580a3c2e0742ae04cf4b83096447f0525d17783a 100644
--- a/src/005-passages/optionsPassages.js
+++ b/src/005-passages/optionsPassages.js
@@ -59,7 +59,7 @@ new App.DomPassage("Hotkey Settings",
 new App.DomPassage("Edit Genetics",
 	() => {
 		return App.UI.editGenetics();
-	}, ["jump-to-safe", "jump-from-safe"]
+	}, ["jump-from-safe"]
 );
 
 new App.DomPassage("Variable Difference",
diff --git a/src/Mods/Catmod/events/CMRESS/lazyCat.js b/src/Mods/Catmod/events/CMRESS/lazyCat.js
index 4fe94cf7424666f77cc80c36a1f80c85cd6ac611..2add5b05d388a526fcfd9155691402b639e9331d 100644
--- a/src/Mods/Catmod/events/CMRESS/lazyCat.js
+++ b/src/Mods/Catmod/events/CMRESS/lazyCat.js
@@ -149,7 +149,7 @@ App.Events.CMRESSLazyCat = class CMRESSLazyCat extends App.Events.BaseEvent {
 				}
 				eventSlave.devotion += 4;
 			}
-			t.push(`then scurries off to tend to ${his}<span class="trust dec">bruised and reddened asscheeks.</span>`);
+			t.push(`then scurries off to tend to ${his} <span class="trust dec">bruised and reddened asscheeks.</span>`);
 			App.Events.addParagraph(node, t);
 			t = [];
 
diff --git a/src/Mods/SecExp/buildings/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw
index d1f63a74a1682f7c8aba6f0bc22413160e2b764a..347549a4749142730ded6d450e3efebbb06ffa08 100644
--- a/src/Mods/SecExp/buildings/secBarracks.tw
+++ b/src/Mods/SecExp/buildings/secBarracks.tw
@@ -4,7 +4,7 @@
 
 The Barracks
 <hr>__Upgrades__<br>
-While this a sore sight for many citizens of $arcologies[0].name, the barracks stand proud before you.
+While this is a sore sight for many citizens of $arcologies[0].name, the barracks stand proud before you.
 <<if $SecExp.buildings.barracks.size == 0>>
 	The building is relatively small and able to house a limited number of units.
 <<elseif $SecExp.buildings.barracks.size == 1>>
@@ -387,4 +387,4 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 			<</capture>>
 		<</for>>
 	</div>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/Mods/SecExp/js/authorityReport.js b/src/Mods/SecExp/js/authorityReport.js
index cf89347fb30b09449712ce35001d987926ffd076..308cf6f52f3370628d03542d6c9654940beeb05d 100644
--- a/src/Mods/SecExp/js/authorityReport.js
+++ b/src/Mods/SecExp/js/authorityReport.js
@@ -31,7 +31,7 @@ App.SecExp.authorityReport = function() {
 
 	if (["BlackHat", "escort", "servant", "wealth"].includes(V.PC.career)) {
 		authGrowth -= (10 * random(5, 15));
-	} else if (["slaver", "slaver"].includes(V.PC.career)){
+	} else if (["slaver", "gang"].includes(V.PC.career)){
 		authGrowth += (10 * random(5, 15));
 	}
 
diff --git a/src/Mods/SpecialForce/FirebaseTour.js b/src/Mods/SpecialForce/FirebaseTour.js
index ef6c3b9be6cc3186313de65eae9f7b814c906a80..6a629077790361e4bdf0c90622a8ff6372136de2 100644
--- a/src/Mods/SpecialForce/FirebaseTour.js
+++ b/src/Mods/SpecialForce/FirebaseTour.js
@@ -93,7 +93,7 @@ App.UI.firebaseTour = function() {
 		r.push(`raises a hand in greeting and nods. She is sprawled on a couch, wearing only her combat suit tank top and fingerless gloves. She's holding a near-empty bottle of strong liquor in her hand and you can see a naked slave ${girlU} kneeling on the floor between her legs. The Colonel has her legs wrapped tightly around the ${girlU}'s head, forcing the ${girlU} to service her if ${heU} wants to breathe. The Colonel is close to her climax then suddenly tenses her lower body, thus gripping the ${girlU} even tighter, and throws her head back in ecstasy as she orgasms. She lets out a long breath before finally releasing the ${girlU}, giving ${himU} a hard smack and shouting at ${himU} to fuck off.`);
 		App.Events.addParagraph(node, r);
 		r = [];
-		r.push(`The Colonel finishes off her bottle, tossing it over her shoulder then leaning back on the couch and spreading her legs wide. You look down briefly, falling into your habits of inspection. Her pussy is completely devoid of hair with heavy labia with a very large and hard clit peaking out. Beads of moisture, the result of her excitation, are visible, and you can tell from long experience that she would be tight as a vise. You return your gaze to her face to find her smirking at you. "Like what you see, ${App.SF.ColonelStatus()}?" She waves her hand at the plaza around her, "So do they. But you're not here for pussy. You're here to talk business. So, what's up?"`);
+		r.push(`The Colonel finishes off her bottle, tossing it over her shoulder then leaning back on the couch and spreading her legs wide. You look down briefly, falling into your habits of inspection. Her pussy is completely devoid of hair with heavy labia with a very large and hard clit peeking out. Beads of moisture, the result of her excitation, are visible, and you can tell from long experience that she would be tight as a vise. You return your gaze to her face to find her smirking at you. "Like what you see, ${App.SF.ColonelStatus()}?" She waves her hand at the plaza around her, "So do they. But you're not here for pussy. You're here to talk business. So, what's up?"`);
 	} else if (random(0, 100) > 50) {
 		r.push(`is in no condition initially to greet you. She's naked except for one sock that gives you a very good view of her muscled, taut body laid out across the couch with her feet on the table. She is face-down in a drugged-out stupor in the middle of a wide variety of powders and pills. Perhaps sensing your approach, her head suddenly shoots up and looks at you with unfocused, bloodshot eyes. "Sorry, ${App.SF.ColonelStatus()}," she slurs, wiping her face and weakly holding up a hand. "Hold on a second, I need something to help me out here. Long fucking night." She struggles to sit on the couch and bending over the table, loudly snorts up some of the white powder on it. "Ahhh, fuck," she says, breathing heavily.`);
 		App.Events.addParagraph(node, r);
diff --git a/src/Mods/SpecialForce/Proposal.js b/src/Mods/SpecialForce/Proposal.js
index 76cd75e01209b0a23c27c6f65182aa239199ca35..b82e8581b093949bf83074dc52b799ca9c94f421 100644
--- a/src/Mods/SpecialForce/Proposal.js
+++ b/src/Mods/SpecialForce/Proposal.js
@@ -33,7 +33,7 @@ App.Events.SecurityForceProposal = class SecurityForceProposal extends App.Event
 		choices.push(new App.Events.Result(`Prepare for an announcement`, announce,
 			App.Events.makeNode([
 				`Initial costs are`,
-				App.UI.DOM.makeElement("span", cashFormat(price), ["cash", "inc"]),
+				App.UI.DOM.cashFormat(price),
 				`and upon establishment the force will have significant support costs until it is self-sufficient.`
 			])
 		));
diff --git a/src/descriptions/arcologyDescription.js b/src/descriptions/arcologyDescription.js
index 23e97ae9262b14a70d32993a795b059113eecef7..62074f39a70242b10c98322a32f683b099667aba 100644
--- a/src/descriptions/arcologyDescription.js
+++ b/src/descriptions/arcologyDescription.js
@@ -466,7 +466,7 @@ App.Desc.playerArcology = function(lastElement) {
 				}
 				if (V.seePreg === 1) {
 					if (V.clubAdsPreg === 1) {
-						buffer.push(`Most of strippers have firm, rounded bellies.`);
+						buffer.push(`Most of the strippers have firm, rounded bellies.`);
 					} else if (V.clubAdsPreg === -1) {
 						buffer.push(`Most of the strippers have firm, flat bellies.`);
 					} else {
diff --git a/src/endWeek/economics/corporationDevelopments.js b/src/endWeek/economics/corporationDevelopments.js
index d0dd33ea5760d8a168c9cf7c8d69a7784238f442..6838a3b77c91b83dde123b062eb9b3a422d52bf2 100644
--- a/src/endWeek/economics/corporationDevelopments.js
+++ b/src/endWeek/economics/corporationDevelopments.js
@@ -15,7 +15,8 @@ App.EndWeek.corporationDevelopments = function() {
 		const division = d.division;
 		let r;
 		/* Reporting on number of slaves being processed or completed processing */
-		App.Events.addNode(el, [`${division.name}: The division ${division.message_endWeek_Slaves(d)}`], "div");
+		App.UI.DOM.appendNewElement("h3", el, division.name);
+		App.Events.addNode(el, [`The division ${division.message_endWeek_Slaves(d)}`], "div");
 
 		r = [];
 		if (d.market.originalBuy != null) {
diff --git a/src/endWeek/saBeYourHeadGirl.js b/src/endWeek/saBeYourHeadGirl.js
index 4b8cd5bc40243a1063b1cc4d645348298b350b43..f2a42ea87c43270d231cc2475ba0ae6dec53860d 100644
--- a/src/endWeek/saBeYourHeadGirl.js
+++ b/src/endWeek/saBeYourHeadGirl.js
@@ -233,6 +233,7 @@ App.SlaveAssignment.beYourHeadGirl = (function() {
 		} else {
 			if (slave.fetish === "dom") {
 				r.push(`Having all the slaves look up to and obey ${him} clearly excites ${him}; <span class="lightcoral">${he}'s a natural dom!</span>`);
+				slave.fetishKnown = 1;
 			} else if (fetishChange > jsRandom(0, 100)) {
 				r.push(`Having all the slaves look up to and obey ${him} affects ${his} sexuality, turning ${him} into a <span class="lightcoral">bit of a dominatrix.</span>`);
 				slave.fetish = "dom";
diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js
index abdbd4002001649bb838180e17a41f6300c5593f..7d6027a8b5a29372315201b5a28cd022d4a6afba 100644
--- a/src/endWeek/saLongTermMentalEffects.js
+++ b/src/endWeek/saLongTermMentalEffects.js
@@ -1396,24 +1396,28 @@ App.SlaveAssignment.longTermMentalEffects = (function() {
 					r.push(`Living in a society that glorifies ${his} paraphilia <span class="devotion inc">leaves ${him} in perpetual ecstasy.</span>`);
 					slave.devotion += 5;
 				}
-				if (["get milked", "work in the dairy"].includes(slave.assignment) && slave.lactation > 0) {
+				if (slave.drugs === "intensive breast injections" || slave.drugs === "hyper breast injections") {
+					r.push(`${His} paraphilia makes ${him} feel <span class="trust inc">fulfilled to be a sex slave</span> if it means breast expansion like this.`);
+					slave.trust += 2;
+					slave.paraphiliaSatisfied = 1;
+				} else if (slave.drugs === "breast injections") {
+					r.push(`${His} paraphilia makes breast injections very satisfying for ${him}.`);
+					slave.paraphiliaSatisfied = 1;
+				} else if (["get milked", "work in the dairy"].includes(slave.assignment) && slave.lactation > 0) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as a cow; ${he} can feel ${his} udders swelling with milk.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (slave.geneticQuirks.gigantomastia === 2 && slave.geneticQuirks.macromastia === 2 && V.geneticMappingUpgrade >= 1) {
 					r.push(`${His} paraphilia is satisfied by the knowledge that ${his} genetic abnormality will keep ${his} breasts growing for the rest of ${his} life.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (V.geneticMappingUpgrade >= 1 && (slave.geneticQuirks.gigantomastia === 2 || slave.geneticQuirks.macromastia === 2)) {
 					r.push(`${His} paraphilia is satisfied by the knowledge that ${his} genetic abnormality will keep ${his} breasts bigger than ${his} head.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (slave.geneticQuirks.gigantomastia === 2) {
 					r.push(`${His} paraphilia is satisfied by ${his} chest's curious tendency toward perpetual growth.`);
+					slave.paraphiliaSatisfied = 1;
 				} else if (slave.health.condition < 0) {
 					r.push(`${His} paraphilia is ameliorated by ${his} poor health; ${he} knows ${he} can't take expansion right now.`);
-				} else if (slave.drugs === "intensive breast injections" || slave.drugs === "hyper breast injections") {
-					r.push(`${His} paraphilia makes ${him} feel <span class="trust inc">fulfilled to be a sex slave</span> if it means breast expansion like this.`);
-					slave.trust += 2;
-					slave.paraphiliaSatisfied = 1;
-				} else if (slave.drugs === "breast injections") {
-					r.push(`${His} paraphilia makes breast injections very satisfying for ${him}.`);
-					slave.paraphiliaSatisfied = 1;
+					//paraphilia neither satisfied nor dissatisfied
 				} else {
 					r.push(`${He} feels ${his} breasts are shrinking horribly, leaving the growth addict <span class="devotion dec">depressed and anxious.</span>`);
 					slave.paraphiliaSatisfied = -1;
diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js
index 52c0e5c9eb22116fb063b4d00b2f7bc1d546c370..c4dee8e94501d586eaa731d6594635b00216dd0e 100644
--- a/src/endWeek/saLongTermPhysicalEffects.js
+++ b/src/endWeek/saLongTermPhysicalEffects.js
@@ -727,35 +727,35 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 		let youthening = 0;
 		const youtheningLevel = Math.round(Math.clamp(((slave.physicalAge - 8) / 4) + .25, 0, 10));
 		/*
-		**	r.push(`To prevent the NCS from firing on every attribute in one year, this variable counts the`);
-		**	r.push(`number of NCS affects that fire. Most affects will only trigger if one or two other`);
-		**	r.push(`have already fired, but won't fire beyond. There are two exceptions to that, first,`);
-		**	r.push(`massively oversized growth assets, which will fire always, e.g. boobs > 5000, dick > 10,`);
-		**	r.push(`etc. Second, Body structure, hips/shoulders may fire any time, (decreasing random).`);
+		**	To prevent the NCS from firing on every attribute in one year, this variable counts the
+		**	number of NCS affects that fire. Most affects will only trigger if one or two other
+		**	have already fired, but won't fire beyond. There are two exceptions to that, first,
+		**	massively oversized growth assets, which will fire always, e.g. boobs > 5000, dick > 10,
+		**	etc. Second, Body structure, hips/shoulders may fire any time, (decreasing random).
 		**
-		**	r.push(`Youthening (visual age year number reduction)`);
-		**	r.push(`Happens on a sliding scale, the older a slave is, the faster the de-aging goes.`);
-		**	r.push(`Consequently, it goes slower as the visual age approaches an 8 year old loli/shota body.`);
-		**	r.push(`Age 45+=> auto age reduction 1 year per 1 week.`);
-		**	r.push(`Age 41-44=> age reduction 1 year per 2 weeks.`);
-		**	r.push(`Age 37-40=> age reduction 1 year per 3 weeks.`);
-		**	r.push(`Age 33-36=> age reduction 1 year per 4 weeks.`);
-		**	r.push(`Age 29-32=> age reduction 1 year per 5 weeks.`);
-		**	r.push(`Age 25-28=> age reduction 1 year per 6 weeks.`);
-		**	r.push(`Age 21-24=> age reduction 1 year per 7 weeks.`);
-		**	r.push(`Age 17-20=> age reduction 1 year per 8 weeks.`);
-		**	r.push(`Age 13-16=> age reduction 1 year per 9 weeks.`);
-		**	r.push(`Age 9-12=> slowest age reduction 1 year per 10 weeks.`);
+		**	Youthening (visual age year number reduction)
+		**	Happens on a sliding scale, the older a slave is, the faster the de-aging goes.
+		**	Consequently, it goes slower as the visual age approaches an 8 year old loli/shota body.
+		**	Age 45+=> auto age reduction 1 year per 1 week.
+		**	Age 41-44=> age reduction 1 year per 2 weeks.
+		**	Age 37-40=> age reduction 1 year per 3 weeks.
+		**	Age 33-36=> age reduction 1 year per 4 weeks.
+		**	Age 29-32=> age reduction 1 year per 5 weeks.
+		**	Age 25-28=> age reduction 1 year per 6 weeks.
+		**	Age 21-24=> age reduction 1 year per 7 weeks.
+		**	Age 17-20=> age reduction 1 year per 8 weeks.
+		**	Age 13-16=> age reduction 1 year per 9 weeks.
+		**	Age 9-12=> slowest age reduction 1 year per 10 weeks.
 		**
-		**	r.push(`To track this, the ${slave.NCSyouthening} field counts the *charge* of youthening the slave`);
-		**	r.push(`currently has, and if it's over the youthening requirements, the slave will become younger.`);
+		**	To track this, the slave.NCSyouthening field counts the *charge* of youthening the slave
+		**	currently has, and if it's over the youthening requirements, the slave will become younger.
 		**
-		**	r.push(`Additionally while years fly off quickly in the beginning for older slaves, and oversized body parts`);
-		**	r.push(`shrink away, other secondary characteristics slowly but surely drop off, but based on the above`);
+		**	Additionally while years fly off quickly in the beginning for older slaves, and oversized body parts
+		**	shrink away, other secondary characteristics slowly but surely drop off, but based on the above
 		**	*charge* of youthening.
 		**
-		**	r.push(`Note that with this system a 45 year old slave given NCS would be indistinguishable from an 8 year`);
-		**	r.push(`old in a little over 4 years time.`);
+		**	Note that with this system a 45 year old slave given NCS would be indistinguishable from an 8 year
+		**	old in a little over 4 years time.
 		*/
 		slave.NCSyouthening++;
 		if (slave.visualAge > 8 && slave.NCSyouthening >= (11 - youtheningLevel)) {
@@ -768,11 +768,11 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			youthening++;
 		}
 		/*
-		**	r.push(`height always fires if over 176 cm,`);
-		**	r.push(`also fires if the slave is tall for their visual age`);
-		**	r.push(`also if they are in * NCSyouthening 3-5 (reverse teen years) and`);
-		**	r.push(`over 126 cm`);
-		**	r.push(`or over height (30% chance)`);
+		**	height always fires if over 176 cm,
+		**	also fires if the slave is tall for their visual age
+		**	also if they are in * NCSyouthening 3-5 (reverse teen years) and
+		**	over 126 cm
+		**	or over height (30% chance)
 		*/
 		const heightDelta = slave.height - Height.mean(slave);
 		let shrinkage;
@@ -793,13 +793,13 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Boobs, nipples and areolae.`);
-		**	r.push(`Boobs always fires for over 5000 cc,`);
-		**	r.push(`nipples/areolae shrinkage will fire for boobs under 5000,`);
-		**	r.push(`where nipples are tiny/cute at 30% chance.`);
-		**	r.push(`anything over 300 will fire if`);
-		**	r.push(`the slave's accumulated youthening is 6 or higher,`);
-		**	r.push(`or by a 50% chance.`);
+		**	Boobs, nipples and areolae.
+		**	Boobs always fires for over 5000 cc,
+		**	nipples/areolae shrinkage will fire for boobs under 5000,
+		**	where nipples are tiny/cute at 30% chance.
+		**	anything over 300 will fire if
+		**	the slave's accumulated youthening is 6 or higher,
+		**	or by a 50% chance.
 		*/
 		/** @type {FC.NippleShape} */
 		let nipplesString;
@@ -833,9 +833,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Hips and Shoulders reshaping`);
-		**	r.push(`One or the other can happen per week as long as the hips and shoulders are bigger than the smallest`);
-		**	r.push(`level, though the chances get much more likely for the widest sizes.`);
+		**	Hips and Shoulders reshaping
+		**	One or the other can happen per week as long as the hips and shoulders are bigger than the smallest
+		**	level, though the chances get much more likely for the widest sizes.
 		*/
 		if (((slave.hips - Math.abs(slave.hipsImplant)) > -2) && (random(1, 100) < ((slave.hips + 3) * 18))) {
 			r.push(`${His} <span class="ncs">NCS</span> gets busy <span class="change negative"> reducing the size of ${his}`);
@@ -861,9 +861,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Dick and clit shrinkage`);
-		**	r.push(`Massive 10+ Dicks or 5+ Clits always fire, and at double power.`);
-		**	r.push(`Below that by chance, (reducing chances by current size). In general clits shrink faster.`);
+		**	Dick and clit shrinkage
+		**	Massive 10+ Dicks or 5+ Clits always fire, and at double power.
+		**	Below that by chance, (reducing chances by current size). In general clits shrink faster.
 		*/
 		if (slave.dick >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> is actively <span class="change negative">reducing the size of ${his} giant dick.</span>`);
@@ -883,9 +883,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Balls.`);
-		**	r.push(`Massive testicles (10+) drop by 2 levels,`);
-		**	r.push(`Others decrease by chance based on current size.`);
+		**	Balls.
+		**	Massive testicles (10+) drop by 2 levels,
+		**	Others decrease by chance based on current size.
 		*/
 		if (slave.balls >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> gets busy <span class="change negative">reducing the size of ${his} titanic balls.</span>`);
@@ -897,9 +897,9 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Butt.`);
-		**	r.push(`Tremendous butts burn of by 2 points.`);
-		**	r.push(`Regular butts based on chances, decrease as the size does.`);
+		**	Butt.
+		**	Tremendous butts burn of by 2 points.
+		**	Regular butts based on chances, decrease as the size does.
 		*/
 		if (buttSize >= 10) {
 			r.push(`${His} <span class="ncs">NCS</span> applies and <span class="change negative">reduces the size of ${his} bulbous butt.</span>`);
@@ -911,10 +911,10 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Scrotum and Labia`);
-		**	r.push(`One or the other can fire per week.`);
-		**	r.push(`Pendulous ballsacks or sagging labia will always fire.`);
-		**	r.push(`Otherwise by reducing chance based on current sizes, but labias are a little more likely.`);
+		**	Scrotum and Labia
+		**	One or the other can fire per week.
+		**	Pendulous ballsacks or sagging labia will always fire.
+		**	Otherwise by reducing chance based on current sizes, but labias are a little more likely.
 		*/
 		if (slave.geneMods.rapidCellGrowth !== 1) {
 			if (slave.scrotum >= 5) {
@@ -936,8 +936,8 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			}
 		}
 		/*
-		**	r.push(`Voice.`);
-		**	r.push(`Small chance for any non-childlike voice.`);
+		**	Voice.
+		**	Small chance for any non-childlike voice.
 		*/
 		if ((countNCS < 3) && (slave.voice < 3) && slave.voice !== 0 && (random(1, 100) > (slave.voice * 15))) {
 			r.push(`${His} <span class="ncs">NCS</span> has <span class="change positive">raised the pitch of ${his} voice, ${he} now sounds more`);
@@ -950,7 +950,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			countNCS++;
 		}
 		/*
-		**	r.push(`Pussy/Ass-Pussy rejuvenation.`);
+		**	Pussy/Ass-Pussy rejuvenation.
 		**	10% chance of either one rejuvenating per week. (The Child Whore's delight!)
 		*/
 		if (slave.geneMods.rapidCellGrowth !== 1) {
@@ -965,7 +965,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 			}
 		}
 		/*
-		**	r.push(`reset youthening for those that just got younger (see age above) or for already lolified slaves.`);
+		**	reset youthening for those that just got younger (see age above) or for already lolified slaves.
 		*/
 		if (youthening > 0 || slave.NCSyouthening > 9) {
 			slave.NCSyouthening = 0;
diff --git a/src/endWeek/saNanny.js b/src/endWeek/saNanny.js
index 9908fd1643332cf4955f0a4aa6ae2fe78f206167..6c1a49e9b6de216f05bbaacc3d9a95fe73d7724f 100644
--- a/src/endWeek/saNanny.js
+++ b/src/endWeek/saNanny.js
@@ -61,7 +61,7 @@ App.SlaveAssignment.nanny = function(slave) {
 		let t = '';
 
 		// TODO:
-		if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+		if (App.Data.Careers.General.servant.includes(slave.career)) {
 			t += ` ${He} has experience with nannying from ${his} life before ${he} was a slave, making ${him} more effective.`;
 		} else if (slave.skill.servant >= V.masteredXP) {
 			t += ` ${He} has experience with nannying from working for you, making ${him} more effective.`;
diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js
index c5e1fdd264caef2957baf1ccb5d933f8cbf411ee..ef1f299fcec6923e1dec4774a0f7d1283f5af966 100644
--- a/src/endWeek/saServant.js
+++ b/src/endWeek/saServant.js
@@ -18,7 +18,7 @@ App.SlaveAssignment.servant = (function() {
 	return saServant;
 
 	/**
-	 * @param {App.Entity.SlaveState} slave
+	 * @param {FC.ReportSlave} slave
 	 * @param {number} [bonus=0] - bonus from facility leader effects
 	 * @returns {string}
 	 */
@@ -149,7 +149,7 @@ App.SlaveAssignment.servant = (function() {
 			r.push(`${He} does ${his} very best to be the perfect house${wife}, making ${him} an outstanding servant.`);
 		}
 
-		if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+		if (App.Data.Careers.General.servant.includes(slave.career)) {
 			r.push(`${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`);
 		} else if (slave.skill.servant >= V.masteredXP) {
 			r.push(`${He} has experience with house keeping from working for you, making ${him} more effective.`);
@@ -192,7 +192,7 @@ App.SlaveAssignment.servant = (function() {
 	}
 
 	/**
-	 * @param {App.Entity.SlaveState} slave
+	 * @param {FC.ReportSlave} slave
 	 *
 	 */
 	function physicalEffects(slave) {
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index c51cff0e4e979b6498936521b9082ea73e54d7bb..aee7713c35c10215c98ec36e11e7e9aadefc0a0e 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1394,7 +1394,7 @@ App.SlaveAssignment.serveThePublic = (function() {
 							} else {
 								r += `giving a good titfuck,`;
 							}
-							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times they were used this week.`;
+							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times ${his} breasts were used this week.`;
 							slave.need -= mammaryUse;
 						}
 						break;
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index ec8fc500ffa044c0570dc172b83f262c1ac4ed2c..c78c72a459eb8bf6867b71997db065ad6493ccf4 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -1475,7 +1475,7 @@ App.SlaveAssignment.whore = (function() {
 							} else {
 								r += `giving a good titfuck,`;
 							}
-							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times they were used this week.`;
+							r += ` and got sexual satisfaction from the ${num(mammaryUse)} times ${his} breasts were used this week.`;
 							slave.need -= mammaryUse;
 						}
 						break;
diff --git a/src/events/PESS/pessMadamStrategy.js b/src/events/PESS/pessMadamStrategy.js
index dc7335a11c488ec6a815415d64ce06b582b64782..9e2575e66ba9969fba3478810777ec667ec70b7b 100644
--- a/src/events/PESS/pessMadamStrategy.js
+++ b/src/events/PESS/pessMadamStrategy.js
@@ -81,7 +81,7 @@ App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEv
 					}
 				}
 			}
-			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way inventory review with you and ${V.assistant.name}. The three of you carefully review the appearance of each of ${his} whores. ${He} is <span class="devotion inc">properly deferential,</span> but definitely has insight to offer about how many of them appeal to customers. With ${his} input, you put together a plan to <span class="limegreen">correct</span> their deficiencies when they can be pulled out of a shift for a quick surgical improvement.`; //TODO: the fuck is a limegreen
+			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way inventory review with you and ${V.assistant.name}. The three of you carefully review the appearance of each of ${his} whores. ${He} is <span class="devotion inc">properly deferential,</span> but definitely has insight to offer about how many of them appeal to customers. With ${his} input, you put together a plan to <span class="limegreen">correct</span> their deficiencies when they can be pulled out of a shift for a quick surgical improvement.`; // TODO: the fuck is a limegreen
 		}
 	}
 };
diff --git a/src/events/RE/reRebels.js b/src/events/RE/reRebels.js
index 9727c5bfb5d24ae452a39cc7d9b50566ac6322e9..a3fe2b60180415739cb9b143df5ac4b03834fc57 100644
--- a/src/events/RE/reRebels.js
+++ b/src/events/RE/reRebels.js
@@ -45,7 +45,7 @@ App.Events.RERebels = class RERebels extends App.Events.BaseEvent {
 			`You have a rebel problem.`,
 			App.UI.DOM.slaveDescriptionDialog(thingOne),
 			`and`,
-			App.UI.DOM.slaveDescriptionDialog(thingTwo),
+			contextualIntro(thingOne, thingTwo, "DOM"),
 			`are both unbroken, and they seem to draw strength from each other. They're discreet about it, but the arcology's always-vigilant systems occasionally catch them nodding to one another after one of them is punished, or giving each other quiet words of encouragement when they think no one is listening. This is extremely dangerous and should be addressed promptly.`
 		);
 
diff --git a/src/events/RE/reShelterInspection.js b/src/events/RE/reShelterInspection.js
index 07a0675eab01dbb1dac8fab874349dc9d1f583f7..af582660654488ef066afd2d44de6c32700dac44 100644
--- a/src/events/RE/reShelterInspection.js
+++ b/src/events/RE/reShelterInspection.js
@@ -11,6 +11,8 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 
 	execute(node) {
 		const r = [];
+		V.nextButton = " ";
+		V.nextLink = "RIE Eligibility Check";
 
 		const enslaveCost = 10000;
 
@@ -499,7 +501,7 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 					r.push(`${he2} mutters,`);
 					r.push(Spoken(inspector, `"You restored ${his} mind; I can't believe it. This is incredible."`));
 					r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
-					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from out shelter."`));
+					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 					r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse.`);
 					V.shelterAbuse -= 5;
 				}
@@ -529,8 +531,8 @@ App.Events.REShelterInspection = class REShelterInspection extends App.Events.Ba
 					r.push(Spoken(inspector, `"${He} came back?"`));
 					r.push(`${he2} mutters,`);
 					r.push(Spoken(inspector, `"You restored ${his} mind; I can't believe it. This is incredible."`));
-					r.push(`${He2} carries on while writing notes on ${his2} tablet, "You're more than welcome to adopt`);
-					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from out shelter."`));
+					r.push(`${He2} carries on while writing notes on ${his2} tablet,`);
+					r.push(Spoken(inspector, `"You're more than welcome to adopt slaves from our shelter."`));
 					r.push(`You swear ${he2} seems in much better spirits as ${he2} leaves your penthouse, even though ${he2} forgot to check ${his} pussy.`);
 					V.shelterAbuse -= 5;
 				}
diff --git a/src/events/RE/reShowerPunishment.js b/src/events/RE/reShowerPunishment.js
index 7d557310c44aa89e04ea4f1216c9be4f408d79ca..c2569f8e92bee8be0e65ca46ebe2371efc0e5392 100644
--- a/src/events/RE/reShowerPunishment.js
+++ b/src/events/RE/reShowerPunishment.js
@@ -18,7 +18,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 	}
 
 	execute(node) {
-		let r = [];
+		const r = new SpacedTextAccumulator(node);
 		const slave = getSlave(this.actors[0]);
 
 		V.nextButton = "Continue";
@@ -65,8 +65,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		} else {
 			r.push(`This is the sort of mild punishment that your regime of respect and dignity requires ${him2} to use for all but the most egregious fault. Thus restricted, ${he2} does ${his2} best to come up with novel little degradations to keep ${his2} charges on their toes.`);
 		}
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 		r.push(`${slave.slaveName} is being very thorough. When you first appeared, ${he} was working ${his} way up ${S.HeadGirl.slaveName}'s `);
 		if (S.HeadGirl.muscles > 30) {
 			r.push(`muscle-corded`);
@@ -123,8 +122,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		} else {
 			r.push(`belly.`);
 		}
-
-		App.Events.addParagraph(node, r);
+		r.toParagraph();
 
 		const choices = [];
 		choices.push(new App.Events.Result(`Just spectate`, spectate));
@@ -133,8 +131,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 		App.Events.addResponses(node, choices);
 
 		function spectate() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			r.push(`You could strip off your suit, walk into the steam, and enjoy your slaves' ministrations, but sometimes the artistry of tastefully nude bodies is a welcome change of pace. You lean against the wall, far enough away that they remain unaware of your presence, and take in the sight. ${S.HeadGirl.slaveName} makes the penitent ${girl} do the job with Brahmanical thoroughness, cleaning ${his} superior's ${S.HeadGirl.race} body down to its very last pore. As ${slave.slaveName} circles the Head Girl laboriously, doing ${his} best to ingratiate ${himself} by diligence, the pair of naked`);
 			if (girl === girl2) {
 				r.push(`${women}`);
@@ -142,8 +139,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`slaves`);
 			}
 			r.push(`present a fascinating contrast. They are unclothed alike, the water streaming off their bodies without any distinction, but even an old world fool could not mistake the immense gulf between them.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`When ${slave.slaveName} is finally done, ${S.HeadGirl.slaveName}'s`);
 			if (V.HGSeverity > 0) {
 				r.push(`hands seize ${him} by the ears and pull ${his} head in for a kiss that is dominance distilled into the form of a loving gesture. Then ${he2} pokes ${his2} bitch in the side, forcing the slave to collapse in just the right way.`);
@@ -170,19 +166,17 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`${girl2}'s`);
 			}
 			r.push(`head cranes back with orgasm before long; that diligent scrub must have been quite stimulating.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${slave.slaveName} stays in the shower to clean ${himself}, so ${S.HeadGirl.slaveName} exits to see you watching the denouement. ${He2} <span class="devotion inc">smiles,</span> murmuring a greeting, and hurries over to give you a peck on the cheek, leaning in as best ${he2} can to keep ${his2} moist body away from your suit. "This is the life, ${Master}," ${he2} whispers.`);
 			seX(slave, "oral", S.HeadGirl, "penetrative");
 			S.HeadGirl.devotion += 4;
+			r.toParagraph();
 
-			App.Events.addParagraph(frag, r);
-			return frag;
+			return r.container();
 		}
 
 		function scrub() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			r.push(`You strip off your suit and enter the shower. By the time you get in, ${S.HeadGirl.slaveName}'s sponge scrub is almost done. ${He2} turns to greet you with half-lidded eyes, well pleased with ${his2} thorough scrubbing. ${His2} ${S.HeadGirl.skin} skin shines with wet cleanliness, and ${his2} ${S.HeadGirl.nipples} nipples begin to`);
 			if (S.HeadGirl.nipples === "fuckable") {
 				r.push(`swell with arousal`);
@@ -190,8 +184,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`stiffen`);
 			}
 			r.push(`as ${he2} sees your gaze take in ${his2} nude body. ${He2} brusquely orders ${slave.slaveName} to scrub you, too, anticipating your intention. The rough, exfoliating sensation of the sponge is indeed delightful, and you close your eyes to savor the feeling as the slave rubs it up and down your calves and then the backs of your knees.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			if (V.HGSeverity > 0) {
 				r.push(`You detect tremors of fear in the`);
 				if (hasAnyArms(slave)) {
@@ -213,18 +206,15 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 			seX(slave, "oral", V.PC, "penetrative");
 			r.push(knockMeUp(slave, 10, 1, V.HeadGirlID));
 			slave.trust += 4;
-
-			App.Events.addParagraph(frag, r);
-			return frag;
+			r.toParagraph();
+			return r.container();
 		}
 
 		function HG() {
-			const frag = new DocumentFragment();
-			let r = [];
+			const r = new SpacedTextAccumulator();
 			const {hersP} = getPronouns(V.PC).appendSuffix("P");
 			r.push(`You strip off your suit and walk into the steam, producing a surprised but welcoming greeting from your Head Girl and a muffled, submissive noise from ${slave.slaveName}. ${S.HeadGirl.slaveName} is held more or less stationary by the slave ${he2}'s straddling, so you step in, hook a dominant arm around ${his2} waist, and kiss ${him2}. There's precisely one person in this arcology who's allowed to treat ${him2} as ${hersP}, and it's you. ${He2} relaxes into you with gratitude as you shoulder the burden of being the leader in this little area of your empire, lifting it from ${his2} shoulders for now.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`You run a hand up the side of ${his2} neck, bringing it to rest with your fingers cupping ${him2} under the ear and your thumb running up along ${his2} temple. ${He2} shivers, unable to concentrate despite all ${his2} poise, the ongoing oral service blending into your intense closeness. Right now, ${he2}'s the`);
 			if (S.HeadGirl.physicalAge > 25) {
 				r.push(`${woman2}`);
@@ -238,8 +228,7 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 				r.push(`blowing ${him2},`);
 			}
 			r.push(`point at the dropped sponge, and then point at yourself. The oral stops as ${slave.slaveName} hurries to scrub you, starting at your feet, but your Head Girl doesn't care. You're kissing ${him2}.`);
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${He2} gently strokes your `);
 			if (V.PC.dick !== 0) {
 				r.push(`rapidly hardening member, smiling into your mouth at the speed with which it stiffens${(V.PC.vagina !== -1) ? ", and teases your pussylips with mischievous fingers" : ""}.`);
@@ -252,16 +241,15 @@ App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.Base
 			} else {
 				r.push(`hooking your fingers up underneath ${his2} taint to grope ${his2} anus. After teasing ${his2} asspussy for a moment you bring your hand slowly across ${his2} perineum${(S.HeadGirl.scrotum > 0) ? `until ${his2} ballsack rests against your wrist` : ""}. The overstimulated ${S.HeadGirl.slaveName} cums the instant the butt of your hand touches the base of ${his2} cock. ${He2} screams your name.`);
 			}
-			App.Events.addParagraph(frag, r);
-			r = [];
+			r.toParagraph();
 			r.push(`${He2} isn't terribly affected by loving shower sex with you; after all, it isn't exactly novel for ${him2}. ${slave.slaveName} was there to bear witness, though, scrubbing your back as ${S.HeadGirl.slaveName} clung to it with orgasm. ${He} can't help but be <span class="devotion inc">impressed.</span> Maybe, just maybe, that could be ${him} someday. ${He} seems distinctly uncomfortable.`);
 
 			seX(slave, "oral", S.HeadGirl, "oral");
 
 			slave.devotion += 4;
 
-			App.Events.addParagraph(frag, r);
-			return frag;
+			r.toParagraph();
+			return r.container();
 		}
 	}
 };
diff --git a/src/events/REFS/refsBodyPurismEncounter.js b/src/events/REFS/refsBodyPurismEncounter.js
index 543a1713c44bd95e0a26d54343866e1597851878..7b4aa2513a156b7ab1bc14ca12d4d87b07615d6f 100644
--- a/src/events/REFS/refsBodyPurismEncounter.js
+++ b/src/events/REFS/refsBodyPurismEncounter.js
@@ -58,6 +58,7 @@ App.Events.refsBodyPurismEncounter = class refsBodyPurismEncounter extends App.E
 
 		function pamper() {
 			const frag = new DocumentFragment();
+			repX(1500, "event");
 
 			App.Events.addParagraph(frag, [`You make your presence known to the citizen, and once the usual shock and disbelief have worn off it takes a moment to convince ${him} that your offer of a cleansing experience in your spa is neither a cruel joke nor an underhanded attempt to enslave ${him}. ${He} follows you back to the penthouse where you inform your attendant that the citizen is to be sequestered in the spa for a day of pampering, cleansing and rejuvenation. As the citizen passes through the doors to the spa, ${he} turns and blows you a kiss of gratitude.`]);
 
diff --git a/src/events/REFS/refsYouthPreferentialistEncounter.js b/src/events/REFS/refsYouthPreferentialistEncounter.js
index 2431c8e0f097fca21d5a1423ee41ca99a0d52851..87b5fc74b6423b6b5bb53a18105773c56f5c6245 100644
--- a/src/events/REFS/refsYouthPreferentialistEncounter.js
+++ b/src/events/REFS/refsYouthPreferentialistEncounter.js
@@ -34,14 +34,14 @@ App.Events.refsYouthPreferentialistEncounter = class refsYouthPreferentialistEnc
 
 		App.Events.addParagraph(node, [`Your excursions out of your penthouse and into the arcology as a whole often put you in close proximity with citizens from all levels of the social strata. After all, they themselves have their own lives to live within the walls of ${V.arcologies[0].name}.`]);
 
-		App.Events.addParagraph(node, [`On this particular outing you happen to cross paths with a nubile young ${woman}, accompanied by ${his} father. From ${his} plain clothes and rudimentary makeup, it is readily apparent that ${he} is not one of the arcology's well-to-do inhabitants. ${He} recognizes you quickly and dips ${his} head in deference to your high status,${(V.PC.visualAge >= 50) ? `${his} cheeks flushed in embarrassment and delight at an aged arcology owner's interest in a young ${girl} like ${him}.` : `${his} expression awestruck by the presence of an arcology owner before ${him}.`}`]);
+		App.Events.addParagraph(node, [`On this particular outing you happen to cross paths with a nubile young ${woman}, accompanied by ${his} father. From ${his} plain clothes and rudimentary makeup, it is readily apparent that ${he} is not one of the arcology's well-to-do inhabitants. ${He} recognizes you quickly and dips ${his} head in deference to your high status, ${(V.PC.visualAge >= 50) ? `${his} cheeks flushed in embarrassment and delight at an aged arcology owner's interest in a young ${girl} like ${him}.` : `${his} expression awestruck by the presence of an arcology owner before ${him}.`}`]);
 
 		const choices = [];
 		choices.push(new App.Events.Result(`Let them pass`, ignore));
 		if (V.cash >= (cost)) {
 			choices.push(new App.Events.Result(`Fuck ${him} over dinner`, pay, `This will cost ${cashFormat(cost)}.`));
 		} else {
-			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to promote ${him}.`));
+			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to take ${him} on a date.`));
 		}
 		choices.push(new App.Events.Result(`Manipulate ${him} into having sex with you`, fuck));
 		App.Events.addResponses(node, choices);
@@ -62,7 +62,7 @@ App.Events.refsYouthPreferentialistEncounter = class refsYouthPreferentialistEnc
 			App.Events.refreshEventArt(slave);
 
 			const frag = new DocumentFragment();
-			App.Events.addParagraph(frag, [`It only takes a moment for ${V.assistant.name} to uncover the father's financial records and the copious debt therein, and only another moment for you to browbeat the terrified father into allowing his V.daughter to sleep with you under threat of purchasing all their debt and summarily enslaving ${him}.`]);
+			App.Events.addParagraph(frag, [`It only takes a moment for ${V.assistant.name} to uncover the father's financial records and the copious debt therein, and only another moment for you to browbeat the terrified father into allowing his ${daughter} to sleep with you under threat of purchasing all their debt and summarily enslaving ${him}.`]);
 
 			App.Events.addParagraph(frag, [`Once you both retire to your private suite, you peel the ${girl}'s clothes off as easily as one might shed a gift of its wrapping. In the nude ${his} body is tastefully youthful, with narrow hips, firm breasts, and a delicate blush across ${his} shamefaced, rosy cheeks. Despite the circumstances of your sexual conquest of ${him}, ${he} seems to enjoy the fuck well enough by the sounds of ${his} frenzied moans — citizens like ${him} often do since sexual submission to a slave would be a crippling scandal to a prominent citizen, let alone one of ${his} diminished social stature.`]);
 			const choices = [];
diff --git a/src/events/RESS/imScared.js b/src/events/RESS/imScared.js
index 16194753bcb3073569a5ae0e907894b2f89bfbd5..193e4cebac1b3669a691f5a49bd125e1309e2117 100644
--- a/src/events/RESS/imScared.js
+++ b/src/events/RESS/imScared.js
@@ -35,7 +35,7 @@ App.Events.RESSImScared = class RESSImScared extends App.Events.BaseEvent {
 		let t = [];
 
 		t.push(`During ${his} weekly inspection,`);
-		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(contextualIntro(V.PC, eventSlave, "DOM"));
 		t.push(`has trouble following the routine orders that position ${him} so you can examine ${his} body. The cause is not difficult to determine: ${he}'s so cripplingly terrified that ${he}'s having difficulty functioning. ${He} seems to be trying to obey you, but ${he}'s so scared that ${his} mind is having trouble translating your simple verbal commands into physical obedience. You ask ${him} what ${he}'s so frightened of. The question stuns ${him}, and ${he} ${canSee(eventSlave) ? "stares at" : "faces"} you in mute horror, looking even more terrified than ${he} has up to this point and completely devoid of any idea how to respond. You order ${him} to respond, and this starts ${him} out of ${his} fugue. ${He} begins to cry, makes two false starts, sobs, and then begins forcing out words.`);
 		App.Events.addParagraph(node, t);
 		t = [];
diff --git a/src/events/RESS/impregnationPlease.js b/src/events/RESS/impregnationPlease.js
index 91be8ae34be6e883b08dc54595c96101403d43f6..9bf05cfb93c966bcfca353ec62e560e61b43e81d 100644
--- a/src/events/RESS/impregnationPlease.js
+++ b/src/events/RESS/impregnationPlease.js
@@ -41,7 +41,6 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 		let r = [];
 		r.push(`Taken by a mood,`);
 		r.push(contextualIntro(V.PC, eventSlave, "DOM"));
-		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave)); // TODO: Integrate contextualIntro somewhere
 		if (isPregnantAndSuperfetation) {
 			if (eventSlave.belly >= 750000) {
 				r.push(`barely makes into your office before turning and leaning against ${his} ${belly} belly. Once ${he} manages to get comfortable against the strained mass, ${he} wiggles ${his} exposed`);
@@ -219,9 +218,10 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 			r.push(`${He} faces you with the look of a child begging for candy,`);
 		}
 		r.push(`desperately awaiting your answer.`);
+		App.Events.addParagraph(node, r);
 
 		let responses = [new App.Events.Result(`Put a slave in ${him}`, impregnate)];
-		if 	(eventSlave.mpreg === 0) {
+		if (eventSlave.mpreg === 0) {
 			responses.push(new App.Events.Result(`Use ${his} ass but give ${him} what ${he} wants`, impregnateAss));
 			responses.push(new App.Events.Result(`Sneak it into ${his} ass instead`, sneak));
 		} else {
@@ -230,7 +230,6 @@ App.Events.RESSImpregnationPlease = class RESSImpregnationPlease extends App.Eve
 		if (cumSlaves().length >= 5) {
 			responses.push(new App.Events.Result(`Use the Dairy cockmilk to impregnate ${him}`, dairy));
 		}
-		App.Events.addParagraph(node, r);
 		App.Events.addResponses(node, responses);
 
 		function impregnate() {
diff --git a/src/events/RESS/review/aGift.js b/src/events/RESS/review/aGift.js
index 9bade098fc0fb8239a3d28466efece8979bdb40d..f5249269acd6757b875e34eb1fdc232cb0224210 100644
--- a/src/events/RESS/review/aGift.js
+++ b/src/events/RESS/review/aGift.js
@@ -214,8 +214,7 @@ App.Events.RESSAGift = class RESSAGift extends App.Events.BaseEvent {
 					if (V.PC.vagina !== -1) {
 						r.push(`eat you out`);
 					}
-					r.push(r.pop() + ",");
-					r.push(`${Master}?", ${He}`);
+					r.push(r.pop() + `, ${Master}?" ${He}`);
 					if (eventSlave.belly >= 300000) {
 						r.push(`leans onto ${his} ${belly} middle`);
 					} else if (eventSlave.belly >= 10000) {
diff --git a/src/events/RESS/review/wetDreams.js b/src/events/RESS/review/wetDreams.js
index 7734ab172f0c5a08e7dfbb940335df0ce0be5cb6..f1127af4f3469f3e24cb1309ebb1807689c23598 100644
--- a/src/events/RESS/review/wetDreams.js
+++ b/src/events/RESS/review/wetDreams.js
@@ -13,7 +13,6 @@ App.Events.RESSWetDreams = class RESSWetDreams extends App.Events.BaseEvent {
 				hasAnyLegs,
 				(s) => s.actualAge < 18,
 				(s) => s.devotion > 20,
-				(s) => s.ovaries === 1,
 				canPenetrate,
 				(s) => s.balls > 0,
 				(s) => s.pubertyXY === 0,
diff --git a/src/events/RETS/reDatePlease.js b/src/events/RETS/reDatePlease.js
index df348b47ce1cf02ca27a37fcaefa4975f86210ef..53cfd0f1b31ff091742080eeec1eb14c79983901 100644
--- a/src/events/RETS/reDatePlease.js
+++ b/src/events/RETS/reDatePlease.js
@@ -33,14 +33,13 @@ App.Events.RETSDatePlease = class RETSDatePlease extends App.Events.BaseEvent {
 		const {
 			He, he, his, him, girl
 		} = getPronouns(eventSlave);
-		const {say} = getEnunciation(eventSlave);
+		const {say, title: master} = getEnunciation(eventSlave);
 		const {him2, girl2, wife2} = getPronouns(subSlave).appendSuffix("2");
 		V.nextLink = "Next Week";
 		let artDiv = document.createElement("div"); // named container so we can replace it later
 		App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
 		node.appendChild(artDiv);
 
-		const master = Spoken(eventSlave, getWrittenTitle(eventSlave));
 		const partner = (eventSlave.relationship >= 5) ? `${wife2}` : `${girl2}friend`;
 		const pitch = (eventSlave.voice > 2) ? "high" : (eventSlave.voice > 1 ? "feminine" : "deep"); // When true male slaves are implemented, split "deep" into husky and masculine?
 
diff --git a/src/events/RETS/reSiblingTussle.js b/src/events/RETS/reSiblingTussle.js
index bf386b5a3b5e74c47ef4d7983627d588b629b15e..61c3495243fea5cf37f945d8b9e4ca3c2ba54a10 100644
--- a/src/events/RETS/reSiblingTussle.js
+++ b/src/events/RETS/reSiblingTussle.js
@@ -90,7 +90,7 @@ App.Events.RETSSiblingTussle = class RETSSiblingTussle extends App.Events.BaseEv
 					t = [];
 					t.push(`As soon as they realize you aren't going to stop them, the kiss gets deeper and the groping starts in earnest.`);
 					if (sib1.dick > 0) {
-						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s dick, fondling and tugging on it to make sure it's hard for what they're about to do.`);
+						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib1) ? `hard` : `as half-hard as it can be`} for what they're about to do.`);
 					} else if (sib1.vagina >= 0) {
 						t.push(`${sib2.slaveName} immediately reaches for ${his2} ${relativeTerm(sib2, sib1)}'s soft slit, rubbing and massaging it to make sure ${he}'s good and wet.`);
 					} else if (sib1.boobs >= 300) {
@@ -105,7 +105,7 @@ App.Events.RETSSiblingTussle = class RETSSiblingTussle extends App.Events.BaseEv
 					} else if (sib2.balls > 0 && sib1.dick > 0) { // avoid double dick groping by going for the balls
 						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s balls, fondling them to make sure ${he2}'s going to make plenty of cum.`);
 					} else if (sib2.dick > 0) {
-						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s dick, fondling and tugging on it to make sure it's hard for what they're about to do.`);
+						t.push(`grabs ${his} ${relativeTerm(sib1, sib2)}'s dick, fondling and tugging on it to make sure it's ${canAchieveErection(sib2) ? `hard` : `at least semi-hard`} for what they're about to do.`);
 					} else if (sib2.clit > 0 && sib1.vagina >= 0) { // avoid double vagina groping by going for the clit
 						t.push(`reaches for ${his} ${relativeTerm(sib1, sib2)}'s clit, rubbing and flicking it to make sure ${he2}'s ready for action.`);
 					} else if (sib2.vagina >= 0) {
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index a81980723b91091b70a38fa4dda4f6a717e60508..8e0de0ca21244439afa074f9c5882abc1881e4f3 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -156,8 +156,6 @@ App.Events.getIndividualEvents = function() {
 		new App.Events.rePregInventorFCTV(),
 
 		new App.Events.REStandardPunishment(),
-		new App.Events.RERebels(),
-
 		new App.Events.REAnalPunishment(),
 		new App.Events.REShowerPunishment(),
 		new App.Events.REHGReplacement(),
@@ -224,6 +222,7 @@ App.Events.getNonindividualEvents = function() {
 		new App.Events.REShippingContainer(),
 		new App.Events.REFemaleArcologyOwner(),
 		new App.Events.REBrothelFunction(),
+		new App.Events.RERebels(),
 
 		// legendary
 		new App.Events.RELegendaryFormerAbolitionist(),
diff --git a/src/events/scheduled/seCoursing.js b/src/events/scheduled/seCoursing.js
index 1b8f54c5b4be2b6918e9801c04fdca8720a3c88b..84a944970f03b0ec9dad767e14f42cb3cc36fb8a 100644
--- a/src/events/scheduled/seCoursing.js
+++ b/src/events/scheduled/seCoursing.js
@@ -174,7 +174,6 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
 				slave.weight = random(-20, 100);
-				slave.career = App.Data.Careers.General.young.random();
 			} else if (origin === "housewife") {
 				slave = GenerateNewSlave("XX", {minAge: 35, maxAge: 39, disableDisability: 1});
 				slave.boobs += 800;
@@ -187,8 +186,7 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 				slave.faceImplant += 20;
 				slave.anus = 1;
 				slave.vagina = 1;
-				slave.counter.anal += 1;
-				V.analTotal += 1;
+				actX(slave, "anal");
 				slave.preg = -1;
 				slave.ovaries = 1;
 				slave.skill.vaginal = 35;
diff --git a/src/events/scheduled/seFctvRemote.js b/src/events/scheduled/seFctvRemote.js
index 834a418f6097a2c9fa20bb2173bf855e699fb68d..f87d454d221c2c7342ab39db98bdbe2318a0d47c 100644
--- a/src/events/scheduled/seFctvRemote.js
+++ b/src/events/scheduled/seFctvRemote.js
@@ -286,7 +286,7 @@ App.Events.SEfctvRemote = class SEfctvRemote extends App.Events.BaseEvent {
 				r = [];
 				r.push(
 					Spoken(customer, `"Uh, that`),
-					App.UI.DOM.makeElement("span", Spoken(customer, `virgin ass!"`), "virginity loss"),
+					App.UI.DOM.makeElement("span", Spoken(customer, `virgin ass!"`), ["virginity", "loss"]),
 					`the customer exclaims.`,
 					Spoken(customer, `"How's THIS for an upgraded package. Last time I had a billing problem you folks told me where to shove it. Well. Here! It! Goes!"`),
 					`From the way they collapse over each other, it seems they orgasmed at about the same time.`
diff --git a/src/facilities/brothel/brothel.js b/src/facilities/brothel/brothel.js
index 5cd3e2d0567fa08e90b70a3068f0c50b01e3b84c..fe0cf230f7494657f9eb3efb67281c0842a6afbf 100644
--- a/src/facilities/brothel/brothel.js
+++ b/src/facilities/brothel/brothel.js
@@ -43,10 +43,10 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 			"Chinese Revivalist": `is furnished as an old Chinese pleasure house, with each girl set up in her own low room. They stand outside the doors, luring customers back one by one.`,
 			"Chattel Religionist": `is decorated as a place of carnal worship. The air is scented by censers, and the slaves here maintain an air of holiness even when being sodomized in public.`,
 			"Degradationist": `is decorated to look like a dungeon. The décor involves a lot of black leather and burnished steel, and the slaves on offer are mostly chained to beds and walls.`,
-			"Asset Expansionist": `is clean and full of soft couches and chairs for its' pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`,
-			"Transformation Fetishist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`,
-			"Repopulationist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage.`,
-			"Eugenics": `is sterile and clean. Interactive screens on the walls list the whores and their modifications in clinical detail.`,
+			"Repopulationist": `is clean and full of soft couches and chairs for its pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`,
+			"Eugenics": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`,
+			"Asset Expansionist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage.`,
+			"Transformation Fetishist": `is sterile and clean. Interactive screens on the walls list the whores and their modifications in clinical detail.`,
 			"Gender Radicalist": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting every possible combination of human sexual congress.`,
 			"Gender Fundamentalist": `is decorated to look like an old world whorehouse. Screens on the walls are showing pornography starring the whores, with prices flashing after each sex act.`,
 			"Physical Idealist": `is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping on a stage. There is a distinct smell of sweat, and there is as much emphasis on the strippers' muscles as their breasts.`,
@@ -58,7 +58,7 @@ App.Facilities.Brothel.brothel = class Brothel extends App.Facilities.Facility {
 			"Youth Preferentialist": `is decorated to look like the sort of bar old world students visit on spring break. Vapid music is playing, and when whores aren't with customers, they dance and make out with each other to attract some.`,
 			"Body Purist": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting idealized human forms in the act of love.`,
 			"Slimness Enthusiast": `is decorated to look like an old world bordello. The rich décor includes erotic photography and pornographic statuary, depicting slim, girlish figures playing, dancing, and loving.`,
-			"Hedonistic": `is comfortable and full of soft couches and chairs for its' overweight whores to lounge upon between clients ${V.arcologies[0].FSHedonisticDecadenceResearch === 1 ? `and enjoy a plate of snacks` : `and enjoy a big cup of slave food`}. The smells of fresh baked goods are pumped into the facility to mask the smell of sweat. It's not unusual for a client to fuck a whore right on her chosen couch, since the effort of moving is often too much.`,
+			"Hedonistic": `is comfortable and full of soft couches and chairs for its overweight whores to lounge upon between clients ${V.arcologies[0].FSHedonisticDecadenceResearch === 1 ? `and enjoy a plate of snacks` : `and enjoy a big cup of slave food`}. The smells of fresh baked goods are pumped into the facility to mask the smell of sweat. It's not unusual for a client to fuck a whore right on her chosen couch, since the effort of moving is often too much.`,
 			"Intellectual Dependency": `is decorated to look like a club. The sexually charged atmosphere has the whores horny and making out with each other. Customers are expected to come in, grab a bimbo to their tastes, and pull them off to have a good time.`,
 			"Slave Professionalism": `is decorated to look like a high-class bordello. Courtesans are expected to greet and entice customers to join them for a night they'll never forget.`,
 			"Petite Admiration": `is decorated to look like an old world whorehouse. The whores have personal platforms to stand on for inspection from their taller customers.`,
diff --git a/src/facilities/brothel/brothelAds.js b/src/facilities/brothel/brothelAds.js
index ffe8b39335fdcdcf86487c635d7e7c0b607d1897..18fc869b86717fbe2cb78518aafb34e5da1f43aa 100644
--- a/src/facilities/brothel/brothelAds.js
+++ b/src/facilities/brothel/brothelAds.js
@@ -44,7 +44,7 @@ App.Facilities.Brothel.ads = function() {
 				text.push(`${capFirstChar(V.brothelName)} is decorated to look like a dungeon. The décor involves a lot of black leather and burnished steel, and the slaves on offer are mostly chained to beds and walls.`);
 				break;
 			case "Repopulationist":
-				text.push(`${capFirstChar(V.brothelName)} is clean and full of soft couches and chairs for its' pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`);
+				text.push(`${capFirstChar(V.brothelName)} is clean and full of soft couches and chairs for its pregnant whores to lounge upon while showing off their assets. Several of the rooms are prepped to allow a whore to give birth in front of an audience. A supply of freshly squeezed breast milk is available on tap.`);
 				break;
 			case "Eugenics":
 				text.push(`${capFirstChar(V.brothelName)} is decorated to look like a club. Loud music is playing, and the whores that aren't with customers are stripping and pole dancing on a stage. Safe sex is greatly encouraged. The real action happens in several reserved rooms dedicated to society's best, since the loud music drowns out private conversations.`);
@@ -174,15 +174,15 @@ App.Facilities.Brothel.ads = function() {
 
 	function spending() {
 		const div = App.UI.DOM.makeElement("div", null, ['margin-bottom']);
-		const text = [];
+		let text = [];
 		const links = [];
 
 		if (V.brothelAdsSpending >= 5000) {
-			text.push(`Advertisements based on these scenes run constantly in media across the arcology, and there's an active merchandising campaign underway to promote your whores.`);
+			text.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}, and there's an active merchandising campaign underway to promote your whores.`);
 		} else if (V.brothelAdsSpending >= 4000) {
-			text.push(`Advertisements based on these scenes run constantly in media across the arcology.`);
+			text.push(`Advertisements based on these scenes run constantly in media across ${V.arcologies[0].name}.`);
 		} else if (V.brothelAdsSpending >= 3000) {
-			text.push(`Advertisements based on these scenes are run in media across the arcology.`);
+			text.push(`Advertisements based on these scenes are run in media across ${V.arcologies[0].name}.`);
 		} else if (V.brothelAdsSpending >= 2000) {
 			text.push(`Advertisements based on these scenes run regularly in arcology media.`);
 		} else if (V.brothelAdsSpending >= 1000) {
@@ -190,8 +190,10 @@ App.Facilities.Brothel.ads = function() {
 		} else {
 			text.push(`${V.arcologies[0].name} has a robust internal media that could be used to bring customers into the brothel.`);
 		}
+		App.Events.addNode(div, text, "p", "scene-intro");
 
-		text.push(`You are spending ${cashFormatColor(V.brothelAdsSpending)} each week to advertise ${V.brothelName}.`);
+		text = [];
+		text.push(`You are spending ${cashFormatColor(V.brothelAdsSpending, true)} each week to advertise ${V.brothelName}.`);
 
 		if (V.lastWeeksCashIncome.brothelAds > 0) {
 			text.push(`Last week's ads increased profits by ${cashFormatColor(V.lastWeeksCashIncome.brothelAds)}${App.Entity.facilities.brothel.hostedSlaves > 1 ? ` and increased business for your whores` : ``}, and cost ${cashFormatColor(V.lastWeeksCashExpenses.brothelAds)}.`);
@@ -202,7 +204,6 @@ App.Facilities.Brothel.ads = function() {
 		if (V.brothelAdsSpending >= 1000) {
 			links.push(App.UI.DOM.link(`Decrease`, () => {
 				V.brothelAdsSpending -= 1000;
-
 				App.UI.reload();
 			}));
 		} else {
@@ -211,7 +212,6 @@ App.Facilities.Brothel.ads = function() {
 		if (V.brothelAdsSpending < 5000) {
 			links.push(App.UI.DOM.link(`Increase`, () => {
 				V.brothelAdsSpending += 1000;
-
 				App.UI.reload();
 			}));
 		} else {
diff --git a/src/facilities/cellblock/cellblock.js b/src/facilities/cellblock/cellblock.js
index 68436c3dd3935507c8a9b460d2f1028ee398c7da..f59485372ae0012ad410ce05a6df2457a301a83b 100644
--- a/src/facilities/cellblock/cellblock.js
+++ b/src/facilities/cellblock/cellblock.js
@@ -50,15 +50,15 @@ App.Facilities.Cellblock.cellblock = class Cellblock extends App.Facilities.Faci
 			"Chinese Revivalist": `is furnished in a severely medieval Chinese style. There is one refinement, but it's of exquisite cruelty. Somewhere out of sight, water is dripping into an urn, drop by drop... drop... drop... drop...`,
 			"Chattel Religionist": `is built of cold stone. Most of the cells are unfurnished little cubes inside which the only bed is the bare floor. A few are smaller still, so that the inmates can neither stand nor lie flat.`,
 			"Degradationist": `is a nightmare. Everything is made of metal, and almost everything menaces with spikes of steel. Inmates must carefully avoid the walls of their own cells if they wish to avoid being stabbed.`,
-			"Repopulationist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Eugenics": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Asset Expansionist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's bimbofication. Day and night, inmates are confronted with the sight of themselves dyed, pierced, tattooed, gaped, filled with implants, or all of these.`,
-			"Transformation Fetishist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who abuses an inmate does so in full view of every other slave here, keeping the jailbirds in a state of constant fear that they're next.`,
-			"Gender Radicalist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who rapes an inmate does so in full view of every other slave here, keeping the bitches in a state of constant fear that their asses are next.`,
-			"Gender Fundamentalist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. Everyone outside the cells is $arcologies[0].FSSupremacistRace, and everyone inside them is not. The darkness of history is palpable here.`,
-			"Physical Idealist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. The inmates inside the cells are $arcologies[0].FSSubjugationistRace, and everyone outside them is not. The darkness of history is palpable here.`,
-			"Supremacist": `is a straightforward prison, with two exceptions. One cell style features a screen displaying plans for its inmate's impregnation, the other is covered with mirrors for its inmate to watch her pregnancy grow. Day and night, inmates are confronted with the sight of themselves transformed.`,
-			"Subjugationist": `is designed to make very clear to its inmates that they are subhuman. Many screens showcasing their inadequacy intermingled with propaganda play on nonstop loops.`,
+			"Asset Expansionist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Transformation Fetishist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's expansion. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Gender Radicalist": `is a straightforward prison, with one exception. Each cell features a screen displaying plans for its inmate's bimbofication. Day and night, inmates are confronted with the sight of themselves dyed, pierced, tattooed, gaped, filled with implants, or all of these.`,
+			"Gender Fundamentalist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who abuses an inmate does so in full view of every other slave here, keeping the jailbirds in a state of constant fear that they're next.`,
+			"Physical Idealist": `is a block of barred cells whose sides, offering a clear view of the whole prison, provide much menace. Anyone who rapes an inmate does so in full view of every other slave here, keeping the bitches in a state of constant fear that their asses are next.`,
+			"Supremacist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. Everyone outside the cells is $arcologies[0].FSSupremacistRace, and everyone inside them is not. The darkness of history is palpable here.`,
+			"Subjugationist": `is a straightforward prison whose menace is provided by context that, although subtle, adds up to a nightmare. The inmates inside the cells are $arcologies[0].FSSubjugationistRace, and everyone outside them is not. The darkness of history is palpable here.`,
+			"Repopulationist": `is a straightforward prison, with two exceptions. One cell style features a screen displaying plans for its inmate's impregnation, the other is covered with mirrors for its inmate to watch her pregnancy grow. Day and night, inmates are confronted with the sight of themselves transformed.`,
+			"Eugenics": `is designed to make very clear to its inmates that they are subhuman. Many screens showcasing their inadequacy intermingled with propaganda play on nonstop loops.`,
 			"Paternalist": `is a prison, but a modern and scientific one. The cells, the common areas, and even the color of the walls are all carefully designed to communicate the feeling that inmates can better themselves.`,
 			"Pastoralist": `requires its inmates to drink as much breast milk as they can hold. This sounds like a small thing, but for an unbroken slave, conquering the revulsion of drinking another slave's milk is an important step.`,
 			"Maturity Preferentialist": `is subtly designed to make very clear to its inmates that they are sex objects. Many screens showing pornography make it clear to the maturest slave here that they're still an object of lust, and will be used to slake others' pleasure.`,
diff --git a/src/facilities/club/club.js b/src/facilities/club/club.js
index 356fc76f5ef67554f676e227065de533ea5afe78..f5367bdababc87bbe3ae41b1cb2824af45b3ded2 100644
--- a/src/facilities/club/club.js
+++ b/src/facilities/club/club.js
@@ -72,7 +72,7 @@ App.Facilities.Club.club = class Club extends App.Facilities.Facility {
 
 			if (V.seePreg) {
 				if (V.clubAdsPreg === 1) {
-					text.push(`Most of strippers have firm, rounded bellies.`);
+					text.push(`Most of the strippers have firm, rounded bellies.`);
 				} else if (V.clubAdsPreg === -1) {
 					text.push(`Most of the strippers have firm, flat bellies.`);
 				} else {
diff --git a/src/facilities/club/clubAdvertisement.js b/src/facilities/club/clubAdvertisement.js
index 429ae6fa901c9a37a0ebd382146317a8677230bc..9b0036b238fb17a3079afe73f1f52d172aad86c2 100644
--- a/src/facilities/club/clubAdvertisement.js
+++ b/src/facilities/club/clubAdvertisement.js
@@ -128,7 +128,7 @@ App.Facilities.Club.ads = function() {
 		}
 		if (V.seePreg === 1) {
 			if (V.clubAdsPreg === 1) {
-				r.push(`Most of strippers have firm, rounded bellies.`);
+				r.push(`Most of the strippers have firm, rounded bellies.`);
 			} else if (V.clubAdsPreg === -1) {
 				r.push(`Most of the strippers have firm, flat bellies.`);
 			} else {
@@ -167,29 +167,28 @@ App.Facilities.Club.ads = function() {
 	}
 	App.Events.addNode(node, r, "p", "scene-intro");
 
-	App.UI.DOM.appendNewElement("div", node, `You are spending ${cashFormatColor(forceNeg(V.clubAdsSpending))} each week to advertise ${V.clubName}.`);
+	App.Events.addNode(node, [`You are spending ${cashFormatColor(V.clubAdsSpending, true)} each week to advertise ${V.clubName}.`]);
 
 	const linkArray = [];
-	if (V.clubAdsSpending > 900) {
-		linkArray.push(App.UI.DOM.link(
-			"Decrease",
-			() => {
-				V.clubAdsSpending -= 1000;
-				App.UI.reload();
-			}
-		));
+	if (V.clubAdsSpending >= 1000) {
+		linkArray.push(App.UI.DOM.link(`Decrease`, () => {
+			V.clubAdsSpending -= 1000;
+			App.UI.reload();
+		}));
+	} else {
+		linkArray.push(App.UI.DOM.disabledLink(`Decrease`, [`Minimum reached`]));
 	}
 	if (V.clubAdsSpending < 5000) {
-		linkArray.push(App.UI.DOM.link(
-			"Increase",
-			() => {
-				V.clubAdsSpending += 1000;
-				App.UI.reload();
-			}
-		));
+		linkArray.push(App.UI.DOM.link(`Increase`, () => {
+			V.clubAdsSpending += 1000;
+			App.UI.reload();
+		}));
+	} else {
+		linkArray.push(App.UI.DOM.disabledLink(`Increase`, [`Maximum reached`]));
 	}
 
-	App.UI.DOM.appendNewElement("div", node, App.UI.DOM.generateLinksStrip(linkArray));
+
+	App.UI.DOM.appendNewElement("div", node, App.UI.DOM.generateLinksStrip(linkArray), ['indent']);
 
 	App.UI.DOM.appendNewElement("h2", node, `Design ${clubNameCaps} Ad Campaign`);
 
diff --git a/src/facilities/dairy/freeRangeDairyAssignmentScene.js b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
index 4e8a41577862b1d8e939530121e010134daeb224..2cce90b7af17277dc28f46a85268f674604d549f 100644
--- a/src/facilities/dairy/freeRangeDairyAssignmentScene.js
+++ b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
@@ -478,11 +478,10 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 		r.push(`The suction on ${his} dick stops, allowing ${his} abused member to go soft and have some rest.`);
 	}
 	if (slave.balls > 0 && slave.scrotum > 0) {
-		r.push(`${His} balls rest, dangling down and relieved. They already started to produce more cum. They seem to wait for their next chance to unload.`);
+		r.push(`${His} balls rest, dangling down and relieved. They have already started to produce more cum. They seem to wait for their next chance to unload.`);
 	}
 	App.Events.addParagraph(node, r);
 	App.Events.addParagraph(node, [`The next milking cycle will start soon.`]);
 	/* MILKING ROUTINE END */
-	App.Events.addParagraph(node, r);
 	return node;
 };
diff --git a/src/facilities/masterSuite/masterSuite.js b/src/facilities/masterSuite/masterSuite.js
index f267652e9c420ecf0f6e94304a626c259303676c..970dcbbde605481cf641bff451d83119818ec05d 100644
--- a/src/facilities/masterSuite/masterSuite.js
+++ b/src/facilities/masterSuite/masterSuite.js
@@ -149,10 +149,10 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Chinese Revivalist": `as though it were the innermost sanctum of the Forbidden City. A massive bed fills the central space. The walls are gorgeous gilded hand-carved screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates an enormous stone platform that serves as a bed where penitents give their bodies to their ${properMaster()}.`,
 				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace crouch in the center of the space in the form of a massive poster bed with curtains of chain mail.`,
-				"Asset Expansionist": `comfortably, with lots of cushions and seats for pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available. There's a huge, reinforced, low to the ground bed in the middle of the suite.`,
-				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. There's a huge bed in the middle of the suite, with hidden compartments containing condoms and spermicides.`,
-				"Repopulationist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
-				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available. There's a huge, reinforced, low to the ground bed in the middle of the suite.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. There's a huge bed in the middle of the suite, with hidden compartments containing condoms and spermicides.`,
+				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
+				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible. There's a huge bed in the middle of the suite, heavily reinforced.`,
 				"Gender Radicalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls in the butt lots of fun. There's a huge bed in the middle of the suite, with straps to restrain slave girls who don't want to be fucked in the butt, but they're concealed for now.`,
 				"Gender Fundamentalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls nice and enjoyable. There's a huge bed in the middle of the suite, with straps to restrain slave girls who don't want to be fucked, but they're concealed for now.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. There's a huge bed in the middle of the space, and there are mirrors almost everywhere, including on the ceiling over the bed.`,
@@ -183,10 +183,10 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Chinese Revivalist": `as though it were the innermost sanctum of the Forbidden City. The walls are gorgeous gilded hand-carved screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates the central space.`,
 				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace decorate the walls.`,
-				"Asset Expansionist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. There are various specialized toys, as well as, lotions and creams readily available.`,
-				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
-				"Repopulationist": `comfortably, with the convenience of massive-breasted slaves in mind. There are lots of handrails, cushions, and low tables, covered with creams, lubricants, and sex toys.`,
-				"Eugenics": `comfortably, with the convenience of bimbos in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and sex toys.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. There are various specialized toys, as well as, lotions and creams readily available.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
+				"Asset Expansionist": `comfortably, with the convenience of massive-breasted slaves in mind. There are lots of handrails, cushions, and low tables, covered with creams, lubricants, and sex toys.`,
+				"Transformation Fetishist": `comfortably, with the convenience of bimbos in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and sex toys.`,
 				"Gender Radicalist": `comfortably, with the convenience of dickgirls in mind. There are lots of makeup dressers with mirrors, stripper poles, and low tables, covered with creams, lubricants, and vibrating butt plugs.`,
 				"Gender Fundamentalist": `comfortably, with the convenience and pleasure of slavegirls in mind. There are lots of makeup dressers with mirrors, soft divans, and low tables, covered with creams, lubricants, and vibrators.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. The entire area is filled with the heady odors of sweat, metabolites, and sex.`,
@@ -216,11 +216,11 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				"Arabian Revivalist": `as a beguiling haze of Arabian decadence. Soft cushions are scattered across the floor and piled against the walls to provide something for dusky, naked bodies to recline on. Gauzy curtains partition the room into a number of cozy dens.`,
 				"Chinese Revivalist": `like the mansion of a senior mandarin of ancient China. The walls are gorgeous hand-carved wooden screens, and heavy jade statues of favored gods crouch in the corners.`,
 				"Chattel Religionist": `as a severe place of cold stone and hard wood. A single shaft of sunlight illuminates the bed where penitents give their bodies to their ${properTitle()}.`,
-				"Degradationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available.`,
-				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
-				"Transformation Fetishist": `with a gothic grandeur. Blood-red upholstery and hardwood menace. There are numerous places where resistant slaves can be restrained.`,
-				"Repopulationist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible.`,
-				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible.`,
+				"Repopulationist": `comfortably, with lots of cushions and seats for a pregnant slaves to lounge on. Various specialized toys, as well as, lotions and creams are readily available.`,
+				"Eugenics": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls lots of fun. Condoms and spermicides are readily available throughout the suite.`,
+				"Degradationist": `with a gothic grandeur. Blood-red upholstery and hardwood menace. There are numerous places where resistant slaves can be restrained.`,
+				"Asset Expansionist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with stacked slaves as fun as possible.`,
+				"Transformation Fetishist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make sex with bimbo slaves as fun as possible.`,
 				"Gender Radicalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls in the butt lots of fun. The straps to restrain slave girls who don't want to be fucked in the butt are concealed for now.`,
 				"Gender Fundamentalist": `comfortably, with lots of easy-to-clean leather and plentiful tools, toys, and lubricants to make fucking slave girls nice and enjoyable. The straps to restrain slave girls who don't want to be fucked are concealed for now.`,
 				"Physical Idealist": `as a shrine to the owner's body. Athletic trophies and photographs of past victories line the walls. There are mirrors almost everywhere, including on the ceiling over the bed.`,
@@ -293,7 +293,7 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 				property: "masterSuiteUpgradePregnancy",
 				tiers: [
 					{
-						value: 2,
+						value: 1,
 						base: `The master suite does not currently have special customizations to support slave pregnancy.`,
 						upgraded: `The master suite has been further upgraded to support fertile slaves and encourage slave pregnancy, providing additional rest areas, better access to amenities, and a dedicated birthing chamber.`,
 						link: `Refit the suite to support and encourage slave pregnancy`,
@@ -321,14 +321,14 @@ App.Facilities.MasterSuite.masterSuite = class MasterSuite extends App.Facilitie
 						get text() {
 							return `Pregnant slaves have no extra luxuries to reduce stress.`;
 						},
-						link: `Lighter duties`,
+						link: `Normal duties`,
 						value: 0,
 					},
 					{
 						get text() {
 							return `Pregnant slaves are being given some luxuries to reduce stress.`;
 						},
-						link: `Normal duties`,
+						link: `Lighter duties`,
 						value: 1,
 					},
 				],
diff --git a/src/facilities/surgery/analyzePregnancy.js b/src/facilities/surgery/analyzePregnancy.js
index 1326fc33646c4f2e2a9d3fb927257afc8c7c8f8b..3633562c44e0a03b7ff1fdff0c4f1ad8e4712c21 100644
--- a/src/facilities/surgery/analyzePregnancy.js
+++ b/src/facilities/surgery/analyzePregnancy.js
@@ -80,13 +80,13 @@ globalThis.analyzePregnancies = function(mother, cheat) {
 				if (cheat) {
 					option.showTextBox().pulldown()
 						.addValue("hairless")
-						.addValue("hair");
+						.addValue("bushy");
 				}
 				option = options.addOption(`Armpit hair: ${capFirstChar(genes.underArmHStyle)}`, "underArmHStyle", genes);
 				if (cheat) {
 					option.showTextBox().pulldown()
 						.addValue("hairless")
-						.addValue("hair");
+						.addValue("bushy");
 				}
 				if (genes.markings === "freckles" || genes.markings === "heavily freckled") {
 					option = options.addOption(`Markings: ${capFirstChar(genes.markings)}`, "markings", genes);
diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 4f6155cb7bfba0db57020f5b3076d8a1dcc534db..b1e643e14e4025dcbe8fa525de0732c505286759 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -68,169 +68,44 @@ SLAVE ASSIGNMENTS:
 <<case "Career Experience">>
 	Slaves may retain useful experience from their lives before enslavement. Freedom and slavery are so different that the bonuses slaves get are minor. Careers fall into categories, each with its own bonus; these are:
 
-	<br><br><br>__Grateful__ (offering a potential bonus to @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.grateful.length; $i++>>
-		<<if $i == App.Data.Careers.General.grateful.length-1>>
-			and <<print App.Data.Careers.General.grateful[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.grateful[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Menial__ (offering a potential bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.menial.length; $i++>>
-		<<if $i == App.Data.Careers.General.menial.length-1>>
-			and <<print App.Data.Careers.General.menial[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.menial[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Servant__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("keeping your estate", "Servitude")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.servant.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.servant.length-1>>
-			and <<print App.Data.Careers.Leader.servant[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.servant[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Entertainment__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("public service", "Public Service")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.entertainment.length; $i++>>
-		<<if $i == App.Data.Careers.General.entertainment.length-1>>
-			and <<print App.Data.Careers.General.entertainment[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.entertainment[$i]>>,
-		<</if>>
-	<</for>>
-	If a slave has been in the arcology for a long time and is intelligent, she can qualify for this bonus without career experience.
-
-	<br><br><br>__Sex work__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("whoring", "Whoring")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.General.whore.length; $i++>>
-		<<if $i == App.Data.Careers.General.whore.length-1>>
-			and <<print App.Data.Careers.General.whore[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.General.whore[$i]>>,
-		<</if>>
-	<</for>>
+	<br><br><br>__Grateful__ (offering a potential bonus to @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>@@), including slaves who were <<print toSentence(App.Data.Careers.General.grateful)>>.
+
+	<br><br><br>__Menial__ (offering a potential bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "From Rebellious to Devoted")>>@@), including slaves who were <<print toSentence(App.Data.Careers.General.menial)>>.
+
+	<br><br><br>__Servant__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("keeping your estate", "Servitude")>>), including slaves who were <<print toSentence(App.Data.Careers.General.servant)>>.
+
+	<br><br><br>__Entertainment__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("public service", "Public Service")>>), including slaves who were <<print toSentence(App.Data.Careers.General.entertainment)>>.
+	If a slave has a lot of entertainment experience, she can qualify for this bonus without career experience.
+
+	<br><br><br>__Sex work__ (offering a bonus to <<= App.Encyclopedia.Dialog.linkSC("whoring", "Whoring")>>), including slaves who were <<print toSentence(App.Data.Careers.General.whore)>>.
 	If a slave is very sexually experienced, she can qualify for this bonus without career experience.
 
-	<br><br><br>__Leadership__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Head Girl", "Head Girl")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.HG.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.HG.length-1>>
-			and <<print App.Data.Careers.Leader.HG[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.HG[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Procuring__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Madam", "Madam")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.madam.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.madam.length-1>>
-			and <<print App.Data.Careers.Leader.madam[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.madam[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Musical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("DJ", "DJ")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.DJ.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.DJ.length-1>>
-			and <<print App.Data.Careers.Leader.DJ[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.DJ[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Defensive__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Bodyguard", "Bodyguard")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.bodyguard.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.bodyguard.length-1>>
-			and <<print App.Data.Careers.Leader.bodyguard[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.bodyguard[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Convincing__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Recruiter", "Recruiter")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.recruiter.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.recruiter.length-1>>
-			and <<print App.Data.Careers.Leader.recruiter[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.recruiter[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Security__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Wardeness", "Wardeness")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.wardeness.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.wardeness.length-1>>
-			and <<print App.Data.Careers.Leader.wardeness[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.wardeness[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Medical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Nurse", "Nurse")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.nurse.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.nurse.length-1>>
-			and <<print App.Data.Careers.Leader.nurse[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.nurse[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Counseling__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.attendant.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.attendant.length-1>>
-			and <<print App.Data.Careers.Leader.attendant[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.attendant[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Nannying__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Matron", "Matron")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.matron.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.matron.length-1>>
-			and <<print App.Data.Careers.Leader.matron[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.matron[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Accounting__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Stewardess", "Stewardess")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.stewardess.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.stewardess.length-1>>
-			and <<print App.Data.Careers.Leader.stewardess[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.stewardess[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Husbandry__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Milkmaid", "Milkmaid")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.milkmaid.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.milkmaid.length-1>>
-			and <<print App.Data.Careers.Leader.milkmaid[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.milkmaid[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Farming__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Farmer", "Farmer")>>), including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.farmer.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.farmer.length-1>>
-			and <<print App.Data.Careers.Leader.farmer[$i]>>.
-		<<else>>
-			<<print App.Data.Careers.Leader.farmer[$i]>>,
-		<</if>>
-	<</for>>
-
-	<br><br><br>__Teaching__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Schoolteacher", "Schoolteacher")>>, including slaves who were
-	<<for $i = 0; $i < App.Data.Careers.Leader.schoolteacher.length; $i++>>
-		<<if $i == App.Data.Careers.Leader.schoolteacher.length-1>>
-			and <<print App.Data.Careers.Leader.schoolteacher[$i]>>,
-		<<else>>
-			<<print App.Data.Careers.Leader.schoolteacher[$i]>>,
-		<</if>>
-	<</for>>
+	<br><br><br>__Leadership__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Head Girl", "Head Girl")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.HG)>>.
+
+	<br><br><br>__Procuring__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Madam", "Madam")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.madam)>>.
+
+	<br><br><br>__Musical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("DJ", "DJ")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.DJ)>>.
+
+	<br><br><br>__Defensive__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Bodyguard", "Bodyguard")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.bodyguard)>>.
+
+	<br><br><br>__Convincing__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Recruiter", "Recruiter")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.recruiter)>>.
+
+	<br><br><br>__Security__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Wardeness", "Wardeness")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.wardeness)>>.
+
+	<br><br><br>__Medical__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Nurse", "Nurse")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.nurse)>>.
+
+	<br><br><br>__Counseling__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.attendant)>>.
+
+	<br><br><br>__Nannying__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Matron", "Matron")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.matron)>>.
+
+	<br><br><br>__Accounting__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Stewardess", "Stewardess")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.stewardess)>>.
+
+	<br><br><br>__Husbandry__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Milkmaid", "Milkmaid")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.milkmaid)>>.
+
+	<br><br><br>__Farming__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Farmer", "Farmer")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.farmer)>>.
+
+	<br><br><br>__Teaching__ (offering a bonus as <<= App.Encyclopedia.Dialog.linkSC("Schoolteacher", "Schoolteacher")>>), including slaves who were <<print toSentence(App.Data.Careers.Leader.schoolteacher)>>.
+
 	<br><br>Slaves who have been in slavery long enough that it is effectively their career get a bonus to @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "Devotion")>>.@@ Slaves can forget their career experience in an industrialized Dairy, but if they do so and remain sane, they will get a special bonus to both @@.hotpink;<<= App.Encyclopedia.Dialog.linkSC("devotion", "Devotion")>>@@ and @@.mediumaquamarine;<<= App.Encyclopedia.Dialog.linkSC("trust", "Trust")>>.@@
 
 	<br><br>Facility heads and working slaves can gain work experience to provide the same benefit as having a relevant career. Intelligence is the deciding factor in how long this will take, brilliant slaves can achieve this ideally in about fourteen weeks, while borderline retarded slaves can take up two hundred weeks (Assuming that the slave's intelligence doesn't change at all and the dice roll is consistent).
@@ -620,11 +495,11 @@ SLAVE BEHAVIORAL FLAWS
 
 
 <<case "Hates Men">>
-	''Hates men '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, strong attraction to men, or the <<= App.Encyclopedia.Dialog.linkSC("boob fetish", "Boob Fetishists")>>. The <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> instead. This flaw can also be removed by serving a player character or another slave with a dick.
+	''Hates men '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, or the <<= App.Encyclopedia.Dialog.linkSC("boob fetish", "Boob Fetishists")>>. Strong attraction to men or the <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> instead. This flaw can also be removed by serving a player character or another slave with a dick.
 
 
 <<case "Hates Women">>
-	''Hates women '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, strong attraction to men, or the <<= App.Encyclopedia.Dialog.linkSC("cumslut", "Cumsluts")>> fetish. The <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> instead. This flaw can also be removed by serving a player character or another slave with a vagina.
+	''Hates women '' is a behavioral <<= App.Encyclopedia.Dialog.linkSC("flaw", "Flaws")>> that can be softened into the <<= App.Encyclopedia.Dialog.linkSC("adores men", "Adores men")>> <<= App.Encyclopedia.Dialog.linkSC("quirk", "Quirks")>> by training, a good <<= App.Encyclopedia.Dialog.linkSC("Attendant", "Attendant")>>, a powerful sex drive, or the <<= App.Encyclopedia.Dialog.linkSC("cumslut", "Cumsluts")>> fetish. Strong attraction to women or the <<= App.Encyclopedia.Dialog.linkSC("pregnancy fetish", "Pregnancy Fetishists")>> will soften it so she <<= App.Encyclopedia.Dialog.linkSC("adores women", "Adores women")>> instead. This flaw can also be removed by serving a player character or another slave with a vagina.
 
 
 <<case "Liberated">>
diff --git a/src/gui/options/optionsGroup.js b/src/gui/options/optionsGroup.js
index 8c74fc90916a0033944ffcc7649b589e9336ee0b..6e5ea6fedc63249bbdadc8e1d133f635f0fd20f7 100644
--- a/src/gui/options/optionsGroup.js
+++ b/src/gui/options/optionsGroup.js
@@ -103,7 +103,7 @@ App.UI.OptionsGroup = (function() {
 		}
 
 		/**
-		 * @param {string|HTMLElement} comment string can be HTML
+		 * @param {string|DocumentFragment|HTMLElement} comment string can be HTML
 		 * @returns {OptionButtonRow}
 		 */
 		addComment(comment) {
diff --git a/src/interaction/discard.js b/src/interaction/discard.js
index ed15c7c3d27cea282a90a88213c822a2e1fa558d..4da2b73d4fa3a2ded0e5bbe8535565aa3fc6eff0 100644
--- a/src/interaction/discard.js
+++ b/src/interaction/discard.js
@@ -28,6 +28,9 @@ App.Interact.discard = function(slave) {
 
 		cashX(cost, "slaveTransfer");
 		removeSlave(slave);
+		V.nextButton = "Back to Main";
+		V.nextLink = "Main";
+		App.Utils.scheduleSidebarRefresh();
 	}));
 
 	App.UI.DOM.appendNewElement("div", result, App.UI.DOM.passageLink(`Put ${him} up for sale instead`, "Sell Slave"));
diff --git a/src/interaction/policies/coursingAssociation.js b/src/interaction/policies/coursingAssociation.js
index e91237452fdecf9a2fb5401d489bbbe28444a4c2..aaa780153aa066133ed061d2c8fe0e7a506c0ac9 100644
--- a/src/interaction/policies/coursingAssociation.js
+++ b/src/interaction/policies/coursingAssociation.js
@@ -1,5 +1,4 @@
 App.UI.coursingAssociation = function() {
-	//	:: Coursing Association [nobr]
 	const node = new DocumentFragment();
 
 	App.Events.addParagraph(node, [`You are a member of ${V.arcologies[0].name}'s Coursing Association. Coursing is a Free Cities revival of the old sport of hunting rabbits and hares with sighthounds, with the typically Free Cities amendments that the hares are replaced by newly enslaved people, the sighthounds are replaced by trained slaves, and the killing of the hare is replaced by rape. Truly, a sport of gentlemen.`]);
diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js
index dcd96b949d677144831db76df159ae4ea1560274..cadfaacd5043554819a8d5d7dae338540b80a388 100644
--- a/src/interaction/sellSlave.js
+++ b/src/interaction/sellSlave.js
@@ -52,8 +52,8 @@ App.Interact.sellSlave = function(slave) {
 			t.push(`${He} tries to conceal ${his} terror at going from a trustworthy slave master to the cruel and uncertain world outside your penthouse, but ${he} fails.`);
 		}
 	}
-
-	cost = slaveCost(slave);
+	const costObj = slaveCost(slave, false, false, false, true);
+	cost = costObj.cost;
 	cost = (random(70, 80) * Math.trunc(cost / 100));
 
 	if (slave.breedingMark === 1 && V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") {
@@ -341,7 +341,7 @@ App.Interact.sellSlave = function(slave) {
 					t.push(`${His} background should make ${him} a bit more trusting.`);
 				} else if (App.Data.Careers.General.menial.includes(slave.career)) {
 					t.push(`${His} background should make ${him} a bit more tractable.`);
-				} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+				} else if (App.Data.Careers.General.servant.includes(slave.career)) {
 					t.push(`${His} background should make ${him} a good servant.`);
 				}
 			}
@@ -397,7 +397,7 @@ App.Interact.sellSlave = function(slave) {
 			if (slave.skill.wardeness >= V.masteredXP && !App.Data.Careers.Leader.wardeness.includes(slave.career)) {
 				careers.push("Wardeness");
 			}
-			if (slave.skill.servant >= V.masteredXP && !App.Data.Careers.Leader.servant.includes(slave.career)) {
+			if (slave.skill.servant >= V.masteredXP && !App.Data.Careers.General.servant.includes(slave.career)) {
 				careers.push("Servant");
 			}
 			if (slave.skill.entertainer >= V.masteredXP && !App.Data.Careers.General.entertainment.includes(slave.career)) {
@@ -903,7 +903,7 @@ App.Interact.sellSlave = function(slave) {
 		App.UI.DOM.appendNewElement("span", relist, ` This will cost ${cashFormat(500)}`);
 	}
 	if (V.debugMode) {
-		App.UI.DOM.appendNewElement("div", scene, `Base slave cost: `).append(App.UI.DOM.cashFormat(cost));
+		App.UI.DOM.appendNewElement("div", scene, `Estimated value: `).append(costObj.report);
 	}
 	const buyerKeys = [];
 	for (const [key, obj] of buyers) {
diff --git a/src/js/SpacedTextAccumulator.js b/src/js/SpacedTextAccumulator.js
new file mode 100644
index 0000000000000000000000000000000000000000..98dc3fdbef1630eebb4b2c028219034c55052d4a
--- /dev/null
+++ b/src/js/SpacedTextAccumulator.js
@@ -0,0 +1,93 @@
+globalThis.SpacedTextAccumulator = class SpacedTextAccumulator {
+	/** @param {HTMLElement|DocumentFragment} [container] */
+	constructor(container) {
+		/** @type {HTMLElement|DocumentFragment} */
+		this._container = container || new DocumentFragment();
+		/** @type {(string|HTMLElement|DocumentFragment)[]} */
+		this._accumulator = [];
+		this._checked = false;
+
+		this._checkScope();
+	}
+
+	/** check that the accumulator isn't carrying strings outside of a single render pass, since that's almost certainly a bug */
+	_checkScope() {
+		if (V.debugMode && !this._checked) {
+			this._checked = true;
+			setTimeout(() => {
+				if (this._accumulator.length > 0) {
+					throw new Error(`Text accumulator contains stray fragments: ${toSentence(this._accumulator.map(e => `'${e.toString()}'`))}`);
+				}
+				this._checked = false; // reset
+			}, 0);
+		}
+	}
+
+	/** get a reference the underlying container */
+	container() {
+		this._checkScope();
+		return this._container;
+	}
+
+	/** add new sentences or sentence fragments to the accumulator; may contain HTML strings or DOM objects
+	 * @param {(string|HTMLElement|DocumentFragment)[]} items
+	 */
+	push(...items) {
+		this._checkScope();
+		return this._accumulator.push(...items);
+	}
+
+	/** write the contents of the accumulator to a container and clear the accumulator
+	 * @param {ParentNode} container
+	 * @private
+	 */
+	_accumulatorToContainer(container) {
+		this._checkScope();
+		$(container).append(...App.Events.spaceSentences(this._accumulator));
+		this._accumulator = [];
+	}
+
+	/** write the accumulated sentence or sentence fragments directly into the underlying container, separated by spaces */
+	toChildren() {
+		this._accumulatorToContainer(this._container);
+	}
+
+	/** assemble an element from the accumulated sentences or sentence fragments, separated by spaces
+	 * @template {keyof HTMLElementTagNameMap} K
+	 * @param {K} element
+	 * @param {string|Array<string>} [classNames]
+	 */
+	toNode(element, classNames) {
+		const el = App.UI.DOM.makeElement(element, null, classNames);
+		this._accumulatorToContainer(el);
+		this._container.append(el);
+	}
+
+	/** assemble a paragraph from the accumulated sentences or sentence fragments, separated by spaces */
+	toParagraph() {
+		return this.toNode("p");
+	}
+
+	/** modify the last element in the accumulator to add some text, WITHOUT adding a space between them (i.e. for punctuation)
+	 * @param {string} text - strings only!
+	 */
+	addToLast(text) {
+		const lastEl = this._accumulator.pop();
+		if (!lastEl) {
+			// add to WHAT now? just stick it in there (that's what she said)
+			this._accumulator.push(text);
+		} else if (typeof lastEl === 'string') {
+			// fast case - concatenate two strings
+			this._accumulator.push(lastEl + text);
+		} else if (lastEl instanceof DocumentFragment) {
+			// fast case - if it's already a fragment, just append to it - can't do this for ParentNode in general because of styles, etc
+			$(lastEl).append(text);
+			this._accumulator.push(lastEl);
+		} else {
+			// slow case - parse the text and push it into a DocumentFragment with the existing Node
+			const frag = new DocumentFragment();
+			$(frag).append(lastEl, text);
+			this._accumulator.push(frag);
+		}
+	}
+};
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index cacc5a3709c26ef7e1a1a0562bcf78d6ee4b6d50..21c3b37531e63426a3ccf40edd38e757a71940f1 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -871,7 +871,7 @@ globalThis.calculateCosts = (function() {
 		if (slave.assignment === Job.QUARTER) {
 			effectiveness *= 1.1;
 		}
-		if (App.Data.Careers.Leader.servant.includes(slave.career) || slave.skill.servant >= V.masteredXP) {
+		if (App.Data.Careers.General.servant.includes(slave.career) || slave.skill.servant >= V.masteredXP) {
 			effectiveness *= 1.1;
 		}
 		effectiveness = Math.trunc(effectiveness * restEffects(slave) / 10);
diff --git a/src/js/pregJS.js b/src/js/pregJS.js
index a9b3dbaa556e82281bba82fc04585a4040d3742b..a124fa7a0264521b51c825d81ac4c04d864b0948 100644
--- a/src/js/pregJS.js
+++ b/src/js/pregJS.js
@@ -421,7 +421,7 @@ globalThis.setPregType = function(actor) {
  * Penetrative ability, ability to become pregnant, and canBreed() must be checked outside of this. Designed to assume .eggType === "human".
  * @param {App.Entity.SlaveState | App.Entity.PlayerState} target is the slave to get pregnant. Also accepts the PC.
  * @param {number} chance is the % chance to conceive.
- * @param {number} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this.
+ * @param {0|1|2} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this.
  * @param {number} [fatherID] is the ID of her sire or 0 if undefined.
  * @returns {string}
  */
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 2436c2d11cfc1b3c84fb666ce724426b9c17ca42..8003662e2caaca6858e750e27e3c945270bfe219 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -1341,7 +1341,7 @@ globalThis.BeautyArray = (function() {
 		if (arcology.FSTransformationFetishist > 20) {
 			if (slave.lips > 70) {
 				if (slave.lipsImplant / slave.lips < 0.5) {
-					adjustBeauty("Lips: Transformation Fetishist", -(((slave.lips / 10) + (arcology.FSTransformationFetishist / 20))));
+					adjustBeauty("Lips: Transformation Fetishist", -((slave.lips / 10) + (arcology.FSTransformationFetishist / 20)));
 				}
 			}
 			if (slave.hips === 3) {
@@ -2271,15 +2271,120 @@ globalThis.FResultTooltip = function(slave, forSale = 0) {
  * @param {boolean} [isStartingSlave=false] is the slave a "starting slave"
  * @param {boolean} [followLaws=false] Apply cost variations from enacted Slave Market Regulations
  * @param {boolean} [isSpecial=false] is this slave a special/hero slave
- * @returns {number}
+ * @param {boolean} [returnDOM]
+ * @returns {number|Object}
  */
-globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false) {
+globalThis.slaveCost = function(slave, isStartingSlave = false, followLaws = false, isSpecial = false, returnDOM = false) {
 	const milked = App.SlaveAssignment.getMilked(slave, 1.0, true);
-	const beauty = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial);
-	if ((milked.cash * 52) > beauty && !isStartingSlave) { // Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible.
-		return milked.cash * 52;
+	const beautyObj = slaveCostBeauty(slave, isStartingSlave, followLaws, isSpecial);
+	const cost = beautyObj.cost;
+	/** Arbitrarily, let's say their milk worth is what they would make in a year. Blocking starting slave for now because milk makes so much money, the estimation makes game start impossible. */
+	const milkYear = milked.cash * 52;
+	if ((milkYear) > cost && !isStartingSlave) {
+		const milkSpan = App.UI.DOM.makeElement("span", cashFormat(milkYear));
+		if (V.cheatMode || V.debugMode) {
+			milkSpan.tabIndex = 0;
+			milkSpan.classList.add("has-tooltip");
+			tippy(milkSpan, {
+				content: `Value as a cow is greater than their value as a sex object.  Value is based on a year's fluids with current body.`,
+				placement: "right", interactive: true, trigger: "click"
+			});
+		}
+		return returnDOM ? {cost: milkYear, report: milkSpan} : milkYear;
 	} else {
-		return beauty;
+		return returnDOM ? {cost: cost, report: costTooltip()} : cost;
+	}
+
+	function costTooltip() {
+		// Make a link. Clicking the link will display detailed info about that over the top of the page (tooltip-style)
+		const span = App.UI.DOM.makeElement("span", cashFormat(cost));
+		if (V.cheatMode || V.debugMode) {
+			span.tabIndex = 0;
+			span.classList.add("has-tooltip");
+			tippy(span, {
+				content: costDisplay(),
+				placement: "right", interactive: true, trigger: "click"
+			});
+		}
+		return span;
+
+		/** Upon the link being clicked, set up some links to sort the info and a span to show it in
+		 * @returns {HTMLElement}
+		 */
+		function costDisplay() {
+			let criteria = "value";
+			let direction = "descending";
+
+			// Heading line that handles sorting
+			const el = document.createElement('div');
+			el.classList.add("tip-details");
+
+			el.appendChild(document.createTextNode(`Sort by: `));
+			el.appendChild(App.UI.DOM.generateLinksStrip([
+				App.UI.DOM.link("Text", () => {
+					criteria = "text";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Value", () => {
+					criteria = "value";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Ascending", () => {
+					direction = "ascending";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, []),
+				App.UI.DOM.link("Descending", () => {
+					direction = "descending";
+					jQuery(cheatFResultContents).empty().append(costFrame);
+				}, [])
+			]));
+
+			let cheatFResultContents = App.UI.DOM.appendNewElement("div", el, costFrame());
+
+			App.UI.DOM.appendNewElement("div", el, "A slave's base value is modified by an additive multiplier.", "note");
+
+			return el;
+
+			/** Set up the frame that contains the info
+			 * @returns {HTMLDivElement}
+			 */
+			function costFrame() {
+				let el = document.createElement("div");
+				el.classList.add("grid-2columns-auto");
+
+				let sortedBeautyMapKeys;
+				if (criteria === "text") {
+					if (direction === "descending") {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a > b) ? 1 : -1);
+					} else {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (a < b) ? 1 : -1);
+					}
+				} else if (criteria === "value") {
+					if (direction === "descending") {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) < beautyObj.map.get(b)) ? 1 : -1);
+					} else {
+						sortedBeautyMapKeys = Array.from(beautyObj.map.keys()).sort((a, b) => (beautyObj.map.get(a) > beautyObj.map.get(b)) ? 1 : -1);
+					}
+				}
+
+				for (const key of sortedBeautyMapKeys) {
+					let value = beautyObj.map.get(key);
+					value = (Math.floor(value * 10) / 10);
+
+					let className;
+					if (value > 0) {
+						className = "green";
+					} else if (value < 0) {
+						className = "red";
+					}
+					App.UI.DOM.appendNewElement("div", el, value.toString(), className);
+
+					App.UI.DOM.appendNewElement("div", el, capFirstChar(key));
+				}
+
+				return el;
+			}
+		}
 	}
 };
 
@@ -2289,13 +2394,14 @@ globalThis.slaveCostBeauty = (function() {
 	let arcology;
 	let multiplier;
 	let cost;
+	const map = new Map([]);
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
 	 * @param {boolean} isStartingSlave is the slave a "starting slave"
 	 * @param {boolean} followLaws Apply cost variations from enacted Slave Market Regulations
 	 * @param {boolean} isSpecial is this slave a special/hero slave
-	 * @returns {number}
+	 * @returns {Object}
 	 */
 	function slaveCost(slave, isStartingSlave, followLaws, isSpecial) {
 		arcology = V.arcologies[0];
@@ -2321,7 +2427,7 @@ globalThis.slaveCostBeauty = (function() {
 		if (isStartingSlave) {
 			calcStartingSlaveCost(slave);
 		}
-		return cost;
+		return {cost: cost, map: map};
 	}
 
 	/**
@@ -2329,32 +2435,32 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcGenitalsCost(slave) {
 		if (slave.vagina === 0 && slave.counter.vaginal === 0) {
-			multiplier += 0.2;
+			updateMultiplyer(`virgin`, 0.2);
 		}
 		if (slave.anus === 0 && slave.counter.anal === 0) {
-			multiplier += 0.2;
+			updateMultiplyer(`anal virgin`, 0.2);
 		}
 		// Boosted these to 20% to account for the fact that it limits the skill that can be attained
 		if (slave.vagina > -1 && arcology.FSRestartSMR === 1) {
 			if (slave.dick > 0) {
 				if (slave.ovaries === 0 && slave.balls === 0) {
-					multiplier += 0.8;
+					updateMultiplyer(`castrated`, 0.8);
 				}
 			}
 		} else if (slave.vagina > -1) {
 			if (slave.dick > 0) {
 				if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === -1) {
-					multiplier += 0.2;
+					updateMultiplyer(`dick`, 0.2);
 					if (slave.ovaries > 0) {
 						if (slave.balls > 0) {
-							multiplier += 0.8;
+							updateMultiplyer(`futa`, 0.8);
 						}
 					}
 				} else {
-					multiplier += 0.1;
+					updateMultiplyer(`dick`, 0.1);
 					if (slave.ovaries > 0) {
 						if (slave.balls > 0) {
-							multiplier += 0.2;
+							updateMultiplyer(`futa`, 0.2);
 						}
 					}
 				}
@@ -2369,20 +2475,20 @@ globalThis.slaveCostBeauty = (function() {
 	function calcDevotionTrustCost(slave, isSpecial) {
 		if (isSpecial === true) {
 			if (slave.devotion > 50) {
-				multiplier += slave.devotion / 200;
+				updateMultiplyer(`special devotion`, slave.devotion / 200);
 			}
 			if (slave.trust > 50) {
-				multiplier += slave.trust / 200;
+				updateMultiplyer(`special trust`, slave.trust / 200);
 			}
 		} else {
-			multiplier += slave.devotion / 200;
+			updateMultiplyer(`devotion`, slave.devotion / 200);
 			if (slave.devotion < -20) {
 				if (slave.trust > 0) {
-					multiplier -= slave.trust / 200;
+					updateMultiplyer(`trust with low devotion`, -slave.trust / 200);
 				}
 			} else {
 				if (slave.trust > 0) {
-					multiplier += slave.trust / 200;
+					updateMultiplyer(`trust with devotion`, slave.trust / 200);
 				}
 			}
 		}
@@ -2393,31 +2499,31 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPreferencesCost(slave) {
 		if (slave.behavioralFlaw !== "none") {
-			multiplier -= 0.1;
+			updateMultiplyer(`behavioral flaw`, -0.1);
 		}
 		if (slave.behavioralQuirk !== "none") {
-			multiplier += 0.1;
+			updateMultiplyer(`behavioral quirk`, 0.1);
 		}
 		if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") {
-			multiplier += 0.3;
+			updateMultiplyer(`sexual flaw, but a breeder`, 0.3);
 		} else if (slave.sexualFlaw !== "none") {
-			multiplier -= 0.1;
+			updateMultiplyer(`sexual flaw`, -0.1);
 		}
 		if (slave.sexualQuirk !== "none") {
-			multiplier += 0.1;
+			updateMultiplyer(`sexual quirk`, 0.1);
 		}
 		if (slave.fetishKnown === 1) {
 			if (slave.fetish === "mindbroken") {
-				multiplier -= 0.3;
+				updateMultiplyer(`mindbroken`, -0.3);
 			} else if (slave.fetish !== "none") {
-				multiplier += slave.fetishStrength / 1000;
+				updateMultiplyer(`fetish`, slave.fetishStrength / 1000);
 			}
 		} else {
-			multiplier -= 0.1;
+			updateMultiplyer(`unknown fetish`, -0.1);
 		}
 		if (slave.attrKnown === 1) {
 			if (slave.energy > 95) {
-				multiplier += 0.2;
+				updateMultiplyer(`high attraction`, 0.2);
 			}
 		}
 	}
@@ -2427,37 +2533,37 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPregCost(slave) {
 		if (slave.mpreg === 1) {
-			multiplier += 0.2;
+			updateMultiplyer(`mpreg`, 0.2);
 		}
 		if (arcology.FSRepopulationFocusSMR === 1) {
 			if (slave.preg < -1) {
-				multiplier -= 0.5;
+				updateMultiplyer(`repopulationist sterile`, -0.5);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier += 1;
+				updateMultiplyer(`repopulationist mega preg`, 1);
 			} else if (slave.bellyPreg >= 120000) {
-				multiplier += 0.5;
+				updateMultiplyer(`repopulationist very preg`, 0.5);
 			} else if (slave.preg > slave.pregData.normalBirth / 4) {
-				multiplier += 0.1;
+				updateMultiplyer(`repopulationist showing`, 0.1);
 			}
 		} else if (arcology.FSRestartSMR === 1) {
 			if (slave.preg < -1) {
-				multiplier += 0.5;
+				updateMultiplyer(`restart sterile`, 0.5);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier -= 2.5;
+				updateMultiplyer(`restart mega preg`, -2.5);
 			} else if (slave.bellyPreg >= 30000) {
-				multiplier -= 1.5;
+				updateMultiplyer(`restart very preg`, -1.5);
 			} else if (slave.preg > slave.pregData.normalBirth / 4) {
-				multiplier -= 1.0;
+				updateMultiplyer(`restart showing`, -1.0);
 			}
 		} else {
 			if (slave.preg < -1) {
-				multiplier -= 0.1;
+				updateMultiplyer(`sterile`, -0.1);
 			} else if (slave.bellyPreg >= 300000) {
-				multiplier -= 1.5;
+				updateMultiplyer(`mega preg`, -1.5);
 			} else if (slave.bellyPreg >= 120000) {
-				multiplier -= 0.5;
+				updateMultiplyer(`very preg`, -0.5);
 			} else if (slave.bellyPreg >= 500 || slave.pregKnown === 1) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart showing`, -0.1);
 			}
 		}
 	}
@@ -2467,14 +2573,14 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcPrestigeCost(slave) {
 		if (slave.prestige > 0) {
-			multiplier += 0.7 * slave.prestige;
+			updateMultiplyer(`prestige`, 0.7 * slave.prestige);
 		}
 		if (slave.porn.prestige === 3) {
-			multiplier += 1.5;
+			updateMultiplyer(`porn prestige`, 1.5);
 		} else if (slave.porn.prestige === 2) {
-			multiplier += 0.7;
+			updateMultiplyer(`porn prestige`, 0.7);
 		} else if (slave.porn.prestige === 1) {
-			multiplier += 0.2;
+			updateMultiplyer(`porn prestige`, 0.2);
 		}
 	}
 
@@ -2484,86 +2590,86 @@ globalThis.slaveCostBeauty = (function() {
 	function calcFSCost(slave) {
 		if (arcology.FSSupremacistLawME !== 0) {
 			if (slave.race !== arcology.FSSupremacistRace) {
-				multiplier -= 0.1;
+				updateMultiplyer(`supremacist race`, -0.1);
 			}
 		}
 		if (arcology.FSSubjugationistLawME !== 0) {
 			if (slave.race === arcology.FSSubjugationistRace) {
-				multiplier -= 0.2;
+				updateMultiplyer(`subjugationist race`, -0.2);
 			}
 		}
 		if (V.seeCats === 1 && slave.race === "catgirl") {
 			if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 1) {
-				multiplier += 0.5;
+				updateMultiplyer(`catgirl`, 0.5);
 			} else if (arcology.FSBodyPurist === "unset" && V.projectN.techReleased === 0) {
-				multiplier += 0.9;
+				updateMultiplyer(`catgirl`, 0.9);
 			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 0) {
-				multiplier -= 0.5;
-			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 1) {
-				multiplier += 0.5;
-			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techreleased === 0) {
-				multiplier += 0.9;
+				updateMultiplyer(`catgirl`, -0.5);
+			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techReleased === 1) {
+				updateMultiplyer(`catgirl`, 0.5);
+			} else if (arcology.FSBodyPurist !== "unset" && arcology.FSBodyPuristCatLaw === 1 && V.projectN.techReleased === 0) {
+				updateMultiplyer(`catgirl`, 0.9);
 			}
 			if (arcology.FSEgyptianRevivalist !== "unset") {
-				multiplier += 0.2;
+				updateMultiplyer(`egyptian catgirl`, 0.2);
 			}
 			if (arcology.FSTransformationFetishist !== "unset") {
-				multiplier += 0.2;
+				updateMultiplyer(`transformation catgirl`, 0.2);
 			}
 		}
 		if (arcology.FSRepopulationFocusSMR !== 0) {
 			if (slave.preg > 0) {
-				multiplier += 0.1;
+				updateMultiplyer(`repopulationist preg`, 0.1);
 			}
 		} else if (arcology.FSRestartSMR !== 0) {
 			if (slave.dick > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart smr dick`, -0.1);
 			}
 			if (slave.balls > 0) {
-				multiplier -= 0.2;
+				updateMultiplyer(`restart smr balls`, -0.2);
 			}
 			if (slave.vagina > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`restart smr vagina`, -0.1);
 			}
 			if (slave.ovaries > 0) {
-				multiplier -= 0.5;
+				updateMultiplyer(`restart smr ovaries`, -0.5);
 			}
 		}
 		if (arcology.FSGenderFundamentalistSMR !== 0) {
 			if (slave.dick > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender fundamentalist smr dick`, -0.1);
 			}
 			if (slave.balls > 0) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender fundamentalist smr balls`, -0.1);
 			}
 		} else if (arcology.FSGenderRadicalist !== "unset") {
 			if (slave.dick > 0) {
-				multiplier += 0.1;
+				updateMultiplyer(`gender radicalist dick`, 0.1);
 			}
 			if (slave.balls > 0 && arcology.FSGenderRadicalistLawFuta !== 2 && arcology.FSGenderRadicalistLawFuta !== 4) {
-				multiplier -= 0.1;
+				updateMultiplyer(`gender radicalist balls`, -0.1);
 			}
 		}
 		if (arcology.FSPetiteAdmirationSMR !== 0 || arcology.FSStatuesqueGlorificationSMR !== 0) {
 			if (heightPass(slave)) {
-				multiplier += 0.1;
+				updateMultiplyer(`petite admiration smr`, 0.1);
 			} else {
-				multiplier -= 0.1;
+				updateMultiplyer(`petite admiration smr`, -0.1);
 			}
 		}
 		if (arcology.FSSlaveProfessionalism !== "unset") {
-			multiplier += 0.1 * (slave.intelligence / 20);
+			updateMultiplyer(`slave professionalism`, 0.1 * (slave.intelligence / 20));
 		}
 		if (arcology.FSHedonisticDecadenceSMR !== 0) {
 			if (slave.weight > 60 && slave.muscles < 5) {
-				multiplier += 0.1;
+				updateMultiplyer(`hedonistic decadence smr`, 0.1);
 			}
 		}
 		if (arcology.FSArabianRevivalist > 50) {
-			multiplier += 0.1;
+			updateMultiplyer(`arabian revivalist`, 0.1);
 		}
 		if (arcology.FSNeoImperialist > 40) {
-			multiplier += 0.1;
+			updateMultiplyer(`neo imperialist`, 0.1);
 		}
 	}
 
@@ -2573,21 +2679,18 @@ globalThis.slaveCostBeauty = (function() {
 	function calcAgeCost(slave) {
 		if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
 			if (slave.birthWeek === 0) {
-				multiplier += 0.4;
+				updateMultiplyer(`birthWeek`, 0.4);
 			} else if (slave.birthWeek < 4) {
-				multiplier += 0.1;
+				updateMultiplyer(`birthWeek`, 0.1);
 			}
-		} else if (slave.physicalAge === V.minimumSlaveAge) {
-			if (slave.birthWeek === 0) {
-				multiplier += 0.2;
-			} else if (slave.birthWeek < 4) {
-				multiplier += 0.05;
-			}
-		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+		} else if (
+			slave.physicalAge === V.minimumSlaveAge ||
+			(slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset"))
+		) {
 			if (slave.birthWeek === 0) {
-				multiplier += 0.2;
+				updateMultiplyer(`birthWeek`, 0.2);
 			} else if (slave.birthWeek < 4) {
-				multiplier += 0.05;
+				updateMultiplyer(`birthWeek`, 0.05);
 			}
 		}
 	}
@@ -2598,102 +2701,102 @@ globalThis.slaveCostBeauty = (function() {
 	function calcCareersCost(slave) {
 		if (slave.career !== 0) {
 			if (slave.career === "a slave") {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.bodyguard.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.wardeness.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.attendant.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.nurse.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.matron.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.schoolteacher.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.stewardess.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.milkmaid.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.farmer.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.madam.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.DJ.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.HG.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.Leader.recruiter.includes(slave.career)) {
-				multiplier += 0.1;
+				updateMultiplyer(`career`, 0.1);
 			} else if (App.Data.Careers.General.entertainment.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.whore.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.grateful.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
 			} else if (App.Data.Careers.General.menial.includes(slave.career)) {
-				multiplier += 0.05;
-			} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`career`, 0.05);
+			} else if (App.Data.Careers.General.servant.includes(slave.career)) {
+				updateMultiplyer(`career`, 0.05);
 			}
 		}
 		if (V.week - slave.weekAcquired >= 20 && slave.skill.entertainment >= 100) {
 			if (!App.Data.Careers.General.entertainment.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`entertainment career`, 0.05);
 			}
 		}
 		if (slave.counter.oral + slave.counter.anal + slave.counter.vaginal + slave.counter.mammary + slave.counter.penetrative > 1000) {
 			if (!App.Data.Careers.General.whore.includes(slave.career)) {
-				multiplier += 0.05;
+				updateMultiplyer(`whore career`, 0.05);
 			}
 		}
 		if (!App.Data.Careers.Leader.bodyguard.includes(slave.career) && slave.skill.bodyguard >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good bodyguard`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.wardeness.includes(slave.career) && slave.skill.wardeness >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good wardeness`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.attendant.includes(slave.career) && slave.skill.attendant >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good attendant`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.nurse.includes(slave.career) && slave.skill.nurse >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good nurse`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.matron.includes(slave.career) && slave.skill.matron >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good matron`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.schoolteacher.includes(slave.career) && slave.skill.teacher >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good teacher`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.stewardess.includes(slave.career) && slave.skill.stewardess >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good stewardess`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.milkmaid.includes(slave.career) && slave.skill.milkmaid >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good milkmaid`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.farmer.includes(slave.career) && slave.skill.farmer >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good farmer`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.madam.includes(slave.career) && slave.skill.madam >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good madam`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.DJ.includes(slave.career) && slave.skill.DJ >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good DJ`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.HG.includes(slave.career) && slave.skill.headGirl >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good headGirl`, 0.1);
 		}
 		if (!App.Data.Careers.Leader.recruiter.includes(slave.career) && slave.skill.recruiter >= V.masteredXP) {
-			multiplier += 0.1;
+			updateMultiplyer(`good recruiter`, 0.1);
 		}
-		if (!App.Data.Careers.Leader.servant.includes(slave.career) && slave.skill.servant >= V.masteredXP) {
-			multiplier += 0.05;
+		if (!App.Data.Careers.General.servant.includes(slave.career) && slave.skill.servant >= V.masteredXP) {
+			updateMultiplyer(`good servant`, 0.05);
 		}
 		if (!App.Data.Careers.General.entertainment.includes(slave.career) && slave.skill.entertainer >= V.masteredXP) {
-			multiplier += 0.05;
+			updateMultiplyer(`good entertainer`, 0.05);
 		}
 		if (!App.Data.Careers.General.whore.includes(slave.career) && slave.skill.whore >= V.masteredXP) {
-			multiplier += 0.05;
+			updateMultiplyer(`good whore`, 0.05);
 		}
 	}
 
@@ -2704,24 +2807,24 @@ globalThis.slaveCostBeauty = (function() {
 		const totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant, -130, 130);
 		/* make absolutely certain we do not use +-131 in the next line
 		 */
-		multiplier += Math.floor((Math.asin(totalInt / 131)) * 50) / 50;
+		updateMultiplyer(`intelligence`, Math.floor((Math.asin(totalInt / 131)) * 50) / 50);
 		if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") {
-			multiplier += 0.5;
+			updateMultiplyer(`child`, 0.5);
 		}
 		if (slave.geneticQuirks.albinism === 2) {
-			multiplier += 0.2;
+			updateMultiplyer(`albinism`, 0.2);
 		}
 		if (V.rep > 10000) {
-			multiplier += 0.1 * (Object.getOwnPropertyNames(slave.brand).length);
+			updateMultiplyer(`high rep brand`, 0.1 * (Object.getOwnPropertyNames(slave.brand).length));
 		} else if (V.rep < 5000) {
-			multiplier -= 0.1 * (Object.getOwnPropertyNames(slave.brand).length);
+			updateMultiplyer(`low rep brand`, -0.1 * (Object.getOwnPropertyNames(slave.brand).length));
 		}
-		multiplier -= getLimbCount(slave, 0) * 0.05;
+		updateMultiplyer(`limbs`, -getLimbCount(slave, 0) * 0.05);
 		if (!canSee(slave)) {
-			multiplier -= 0.2;
+			updateMultiplyer(`vision`, -0.2);
 		}
 		if (slave.hears === -2) {
-			multiplier -= 0.1;
+			updateMultiplyer(`hearing`, -0.1);
 		}
 	}
 
@@ -2730,13 +2833,19 @@ globalThis.slaveCostBeauty = (function() {
 	 */
 	function calcIndentureCost(slave) {
 		if (slave.indenture > -1) {
-			multiplier -= 0.1 * slave.indentureRestrictions;
-			multiplier -= (260 - slave.indenture) / 260;
+			updateMultiplyer(`indenture level`, -0.1 * slave.indentureRestrictions);
+			updateMultiplyer(`indenture time`, -(260 - slave.indenture) / 260);
 		} else if (V.seeAge === 1 && slave.actualAge >= (V.retirementAge - 5)) {
+			/**
+			 * replaced something like:
+			 * multiplier *= (V.retirementAge - slave.actualAge) / 5;
+			 * but allows us to save the intended difference to the multiplier for records, instead of modifying it directly
+			 */
+			const retireCalc = (tillRetire) => (multiplier * tillRetire / 5) - multiplier;
 			if (V.policies.retirement.physicalAgePolicy === 0) {
-				multiplier *= (V.retirementAge - slave.actualAge) / 5;
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.actualAge));
 			} else {
-				multiplier *= (V.retirementAge - slave.physicalAge) / 5;
+				updateMultiplyer(`near retirement`, retireCalc(V.retirementAge - slave.physicalAge));
 			}
 		}
 	}
@@ -2807,11 +2916,18 @@ globalThis.slaveCostBeauty = (function() {
 		startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10);
 		cost += cost * startingSlaveMultiplier;
 		cost = 500 * Math.trunc(cost / 500);
-		if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+		if (isPCCareerInCategory("slaver")) {
 			cost /= 2;
 		}
 	}
 
+	function updateMultiplyer(string, value) {
+		if (value) {
+			map.set(string, value);
+			multiplier += value;
+		}
+	}
+
 	return slaveCost;
 })();
 
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index 1e6b0f99e6e23358fcb3c4090814576c6c230095..9dc8690bcae36ea50fbe57514056e03af3079f6c 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -425,12 +425,22 @@ Macro.add("includeDOM", {
 	}
 });
 
-App.UI.DOM.cashFormat = function(s) {
+/**
+ * Formats the given number as currency.
+ *
+ * Positive values returns in green, negative values return in red, unless the invert parameter is set.
+ * @param {number} s The number to format.
+ * @param {boolean} [invert] Whether or not to invert the numbers (i.e. display positive numbers in red, and negative numbers in green).
+ * @returns {HTMLSpanElement}
+ */
+App.UI.DOM.cashFormat = function(s, invert) {
 	const span = document.createElement("span");
-	if (s < 0) { // Display red if the value is negative, unless invert is true
-		span.classList.add("red");
-	} else if (s !== 0) { // Yellow for positive
-		span.classList.add("cash");
+	if ((invert && s > 0) || s < 0) {
+		// Display in red (WITHOUT a negative sign) if the value is negative, unless invert is true
+		span.classList.add("cash", "dec");
+	} else if (s !== 0) {
+		// Yellow for positive
+		span.classList.add("cash", "inc");
 	}
 	span.textContent = cashFormat(Math.trunc(s));
 	return span;
diff --git a/src/js/utilsUnits.js b/src/js/utilsUnits.js
index 5e5932b1d5d8545b063ff7fa39ccb74178c26822..3c952e3e581ee0c726f85340c14d781aaf3da94d 100644
--- a/src/js/utilsUnits.js
+++ b/src/js/utilsUnits.js
@@ -334,24 +334,21 @@ globalThis.cashFormat = function(s = 0) {
 /**
  * Formats the given number as currency.
  *
- * Positive values returns in green, negative values return in red.
+ * Positive values returns in green, negative values return in red, unless the invert parameter is set.
  * @param {number} s The number to format.
- * @param {boolean} invert Whether or not to invert the numbers.
- * @returns {string} Returns a string of the number formatted as a currency with different colors depending on the amount.
+ * @param {boolean} invert Whether or not to invert the numbers (i.e. display positive numbers in red, and negative numbers in green).
+ * @returns {string}
  */
 globalThis.cashFormatColor = function(s = 0, invert = false) {
-	if (invert) {
-		s = -1 * s;
-	}
-	// Display red if the value is negative, unless invert is true
-	if (s < 0) {
-		return `<span class='red'>${cashFormat(s)}</span>`;
-		// White for exactly zero
+	if ((invert && s > 0) || s < 0) {
+		// Display in red (WITHOUT a negative sign) if the value is negative, unless invert is true
+		return `<span class='cash dec'>${cashFormat(s)}</span>`;
 	} else if (s === 0) {
+		// White for exactly zero
 		return `<span>${cashFormat(s)}</span>`;
-		// Yellow for positive
 	} else {
-		return `<span class='cash'>${cashFormat(s)}</span>`;
+		// Yellow for positive
+		return `<span class='cash inc'>${cashFormat(s)}</span>`;
 	}
 };
 
diff --git a/src/markets/marketUI.js b/src/markets/marketUI.js
index 62a8a55c97112dfde15aa925e6f3256337e37522..981baec4b2e0a85ca42e932cb084708eb4eff5ad 100644
--- a/src/markets/marketUI.js
+++ b/src/markets/marketUI.js
@@ -9,7 +9,8 @@
 App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave", sTitlePlural = "slaves", costMod = 1} = {}) {
 	const el = new DocumentFragment();
 	const {slave, text} = generateMarketSlave(slaveMarket, (V.market.numArcology || 1));
-	const cost = getCost();
+	const costObj = getCost();
+	const cost = costObj.cost;
 	let prisonCrime = "";
 	if (slaveMarket === V.prisonCircuit[V.prisonCircuitIndex]) {
 		prisonCrime = pronounsForSlaveProp(slave, text);
@@ -17,16 +18,18 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave",
 		$(el).append(` ${text}`);
 	}
 
-	App.UI.DOM.appendNewElement("p",
-		el,
-		`The offered price is ${cashFormat(cost)}. ${(V.slavesSeen > V.slaveMarketLimit) ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : ``}`
-	);
+	App.Events.addParagraph(el, [
+		`The offered price is`,
+		App.UI.DOM.combineNodes(costObj.report, "."),
+		V.slavesSeen > V.slaveMarketLimit ? `You have cast such a wide net for slaves this week that it is becoming more expensive to find more for sale. Your reputation helps determine your reach within the slave market.` : ``
+	]);
 
 	el.append(choices());
 	return el;
 
 	function getCost() {
-		let cost = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket));
+		const costObj = slaveCost(slave, false, !App.Data.misc.lawlessMarkets.includes(slaveMarket), false, true);
+		let cost = costObj.cost;
 		if (V.slavesSeen > V.slaveMarketLimit) {
 			cost += cost * ((V.slavesSeen - V.slaveMarketLimit) * 0.1);
 		}
@@ -37,7 +40,7 @@ App.Markets.purchaseFramework = function(slaveMarket, {sTitleSingular = "slave",
 		}
 		console.log("CostMod: ", costMod);
 		cost = 500 * Math.trunc(cost / 500);
-		return cost;
+		return {cost, report: costObj.report};
 	}
 
 	function choices() {
diff --git a/src/markets/specificMarkets/customSlaveMarket.js b/src/markets/specificMarkets/customSlaveMarket.js
index 5865b9287deef7920a72ec372f550cf341ef68d7..e982318348594b9f2cf5e79d8ce8bbaa32cef8f5 100644
--- a/src/markets/specificMarkets/customSlaveMarket.js
+++ b/src/markets/specificMarkets/customSlaveMarket.js
@@ -222,7 +222,7 @@ App.Markets["Custom Slave"] = function() {
 		const choices = new Map([
 			["greatly below average", "Petite"],
 			["below average", "Short"],
-			["normal", "Average height"],
+			["normal", "Average"],
 			["above average", "Tall"],
 			["greatly above average", "Very tall"],
 		]);
diff --git a/src/markets/specificMarkets/huskSlave.js b/src/markets/specificMarkets/huskSlave.js
index 287184beaab483e600b53c78928add9a9c521f27..940188ef402c869db6b65e4dd47eb4706540b537 100644
--- a/src/markets/specificMarkets/huskSlave.js
+++ b/src/markets/specificMarkets/huskSlave.js
@@ -15,7 +15,7 @@ App.Markets["Husk Slave"] = function() {
 	el.append(age());
 	el.append(sex());
 	el.append(nationality());
-	el.append(race());
+	el.append(raceSelect());
 	el.append(virginity());
 	App.UI.DOM.appendNewElement("h2", el, "Reservations");
 	el.append(reserve());
@@ -81,7 +81,7 @@ App.Markets["Husk Slave"] = function() {
 		return p;
 	}
 
-	function race() {
+	function raceSelect() {
 		const p = document.createElement("p");
 		App.UI.DOM.appendNewElement("div", p, "Race: ");
 		App.UI.DOM.appendNewElement(
@@ -97,9 +97,9 @@ App.Markets["Husk Slave"] = function() {
 		);
 
 		const linkArray = [];
-		const race = new Map(App.Data.misc.filterRaces);
-		race.set("not important", "Not Important");
-		for (const [race, capRace] of App.Data.misc.filterRaces) {
+		const races = new Map(App.Data.misc.filterRaces);
+		races.set("not important", "Not Important");
+		for (const [race, capRace] of races) {
 			if (V.huskSlave.race === race) {
 				linkArray.push(
 					App.UI.DOM.disabledLink(
diff --git a/src/npc/children/longChildDescription.js b/src/npc/children/longChildDescription.js
index 01f89e40c1102aeb496a1293c8ad141743f3e672..a1213ef4a6c2bd1ca404a27761b43a87e4c0d2dc 100644
--- a/src/npc/children/longChildDescription.js
+++ b/src/npc/children/longChildDescription.js
@@ -5540,7 +5540,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 						r += `${He}'s naturally smooth and hairless. `;
 						break;
 					case "bald":
-						r += `${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth. `;
+						r += `${He} is no longer able to grow pubic hair, leaving ${him} hairless and smooth. `;
 						break;
 					case "waxed":
 						r += `${He}'s waxed and smooth. `;
@@ -5589,7 +5589,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `Lack of hood combined with its size means ${he} can't wear any clothes without being constantly stimulated. `;
+							r += `${His} lack of hood, combined with its size, means ${he} can't wear any clothes without being constantly stimulated. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
@@ -5598,13 +5598,13 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							}
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
@@ -5623,21 +5623,21 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `${His} small hood is no longer able to cover it completely and large part of ${his} clitoris is always exposed. `;
+							r += `${His} small hood is no longer able to cover it completely, and a large part of ${his} clitoris is always exposed. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
 							} else {
 								r += `${His} clit is enormous, almost a pseudophallus. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else if (child.foreskin === 2) {
 						if (child.clit === 1) {
@@ -5663,18 +5663,18 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							r += `It's large enough that the hood can cover only half of it. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else if (child.foreskin === 3) {
 						if (child.clit === 1) {
@@ -5683,7 +5683,7 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is quite large. `;
 							}
-							r += `The hood covering it is quite large making stimulation difficult. `;
+							r += `However, the hood covering it is also quite large, making stimulation difficult. `;
 						} else if (child.clit === 2) {
 							if (child.devotion > 50) {
 								r += `${His} clit is huge and visibly erect. `;
@@ -5697,21 +5697,21 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is enormous, almost a pseudophallus. `;
 							}
-							r += `${His} large hood covers all but the tip of ${his} clit even when aroused. `;
+							r += `${His} large hood covers all but the tip of ${his} clit, even when aroused. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 							r += `Even ${his} large hood can't cover it, leaving over half of the clit exposed. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
-							r += `${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed. `;
+							r += `${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed. `;
 						}
 					} else {
 						if (child.clit === 1) {
@@ -5720,14 +5720,14 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							} else {
 								r += `${His} clit is quite large. `;
 							}
-							r += `${His} large thick hood covering it makes any stimulation difficult. `;
+							r += `However, the large, thick hood covering it makes any stimulation difficult. `;
 						} else if (child.clit === 2) {
 							if (child.devotion > 50) {
 								r += `${His} clit is huge and visibly erect. `;
 							} else {
 								r += `${His} clit is huge. `;
 							}
-							r += `${His} large thick hood covering it makes any stimulation difficult. `;
+							r += `However, the large, thick hood covering it makes any stimulation difficult. `;
 						} else if (child.clit === 3) {
 							if (child.devotion > 50) {
 								r += `${His} clit is enormous, and since it's erect with arousal, it juts out proudly. `;
@@ -5737,14 +5737,14 @@ App.Facilities.Nursery.LongChildDescription = function(child, {market = 0, event
 							r += `Matching its size is the thick hood covering it. `;
 						} else if (child.clit === 4) {
 							if (child.devotion > 50) {
-								r += `${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would. `;
+								r += `${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would. `;
 							} else {
 								r += `${His} clit has reached the size of an average penis. `;
 							}
 							r += `${His} large hood covering over half of it adds to its penis-like appearance. `;
 						} else {
 							if (child.devotion > 50) {
-								r += `${His} clit is massive, having reached the size of a large penis. It is semi-erect, since lack of erectile tissues means it can never reach full erection. `;
+								r += `${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never reach full erection. `;
 							} else {
 								r += `${His} clit is massive, having reached the size of a large penis. `;
 							}
diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index 0cb97ed2d93092160dadd203dea1ffca57c6d083..3c2b157096380ef2eb40d3a78ec44c98a621c0cf 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -943,7 +943,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
-					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
+					r.push(`and ${he} is more belly than ${girl}. While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
 					if (canWalk(slave)) {
 						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
 					} else if (canStand(slave)) {
@@ -1022,7 +1022,7 @@ App.Desc.belly = function(slave, {market, eventDescription} = {}) {
 				} else if (slave.muscles > 30) {
 					r.push(`and ${his} fit body allows ${him} to carry ${his} oversized belly normally with effort.`);
 				} else {
-					r.push(`and ${he} is more belly than ${girl}.While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
+					r.push(`and ${he} is more belly than ${girl}. While ${he} can keep ${his} massive belly from touching the floor, it takes a lot of effort to do so.`);
 					if (canWalk(slave)) {
 						r.push(`${He} walks with an exaggerated waddle in an attempt to keep balance with such an awkward bulge.`);
 					} else if (canStand(slave)) {
diff --git a/src/npc/descriptions/boobs/boobs.js b/src/npc/descriptions/boobs/boobs.js
index 55292879524c6a6d39c3ca9d36250b41fcf81578..895add8e5f5917e346fdcfa3234a431b2201ee34 100644
--- a/src/npc/descriptions/boobs/boobs.js
+++ b/src/npc/descriptions/boobs/boobs.js
@@ -784,7 +784,7 @@ App.Desc.boobs = function() {
 					} else if (slave.boobs > 4000) {
 						r += `${adjNoun} stretch ${his} custom tailored dress to its absolute limit.`;
 					} else if (slave.boobs > 800) {
-						r += `${adjNoun} stretch taut against ${his} dress, leaving nothing to the imagination.`;
+						r += `${adjNoun} stretch ${his} dress taut, leaving nothing to the imagination.`;
 					} else if (slave.boobs < 300) {
 						r += `dress tightly hugs ${his} flat chest, prominently displaying ${his} ${slave.nipples} nipples though the fabric.`;
 					} else {
diff --git a/src/npc/descriptions/career.js b/src/npc/descriptions/career.js
index 427f43796960d1635c88fda2b65898b1d3a1d4ef..c0878c988bdbb89086ee8d1252d9aa09700e0085 100644
--- a/src/npc/descriptions/career.js
+++ b/src/npc/descriptions/career.js
@@ -116,7 +116,7 @@ App.Desc.career = function(slave) {
 					}
 				} else if (App.Data.Careers.General.menial.includes(slave.career)) {
 					r.push(`${career}, giving ${him} experience following orders.`);
-				} else if (App.Data.Careers.Leader.servant.includes(slave.career)) {
+				} else if (App.Data.Careers.General.servant.includes(slave.career)) {
 					r.push(`${career}, giving ${him} a slight edge in housekeeping.`);
 				} else {
 					r.push(`${career}.`);
diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js
index 6d9ad605f45b1e66e2b8e24fb38b6afebefba20f..3aa9c4622baa088a2dbbbd2ede3577a9e793f616 100644
--- a/src/npc/descriptions/crotch/vagina.js
+++ b/src/npc/descriptions/crotch/vagina.js
@@ -293,7 +293,7 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`Lack of hood combined with its size means ${he} can't wear any clothes without being constantly stimulated.`);
+					r.push(`${His} lack of hood, combined with its size, means ${he} can't wear any clothes without being constantly stimulated.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
@@ -302,13 +302,13 @@ App.Desc.vagina = function(slave) {
 					}
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
@@ -327,28 +327,28 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`${His} small hood is no longer able to cover it completely and large part of ${his} clitoris is always exposed.`);
+					r.push(`${His} small hood is no longer able to cover it completely, and a large part of ${his} clitoris is always exposed.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
 					} else {
 						r.push(`${His} clit is enormous, almost a pseudophallus.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else if (slave.foreskin === 2) {
 				if (slave.clit === 1) {
@@ -374,18 +374,18 @@ App.Desc.vagina = function(slave) {
 					r.push(`It's large enough that the hood can cover only half of it.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else if (slave.foreskin === 3) {
 				if (slave.clit === 1) {
@@ -394,7 +394,7 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is quite large.`);
 					}
-					r.push(`The hood covering it is quite large making stimulation difficult.`);
+					r.push(`However, the hood covering it is also quite large, making stimulation difficult.`);
 				} else if (slave.clit === 2) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is huge and visibly erect.`);
@@ -408,21 +408,21 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is enormous, almost a pseudophallus.`);
 					}
-					r.push(`${His} large hood covers all but the tip of ${his} clit even when aroused.`);
+					r.push(`${His} large hood covers all but the tip of ${his} clit, even when aroused.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 					r.push(`Even ${his} large hood can't cover it, leaving over half of the clit exposed.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect since lack of erectile tissues means it can never become fully erect.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never become fully erect.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
-					r.push(`${His} hood can no longer contain it and has slid back causing ${his} clitoris to be always exposed.`);
+					r.push(`${His} hood can no longer contain it and has slid back, causing ${his} clitoris to be always exposed.`);
 				}
 			} else {
 				if (slave.clit === 1) {
@@ -431,14 +431,14 @@ App.Desc.vagina = function(slave) {
 					} else {
 						r.push(`${His} clit is quite large.`);
 					}
-					r.push(`${His} large thick hood covering it makes any stimulation difficult.`);
+					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
 				} else if (slave.clit === 2) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is huge and visibly erect.`);
 					} else {
 						r.push(`${His} clit is huge.`);
 					}
-					r.push(`${His} large thick hood covering it makes any stimulation difficult.`);
+					r.push(`However, the large, thick hood covering it makes any stimulation difficult.`);
 				} else if (slave.clit === 3) {
 					if (slave.devotion > 50) {
 						r.push(`${His} clit is enormous, and since it's erect with arousal, it juts out proudly.`);
@@ -448,14 +448,14 @@ App.Desc.vagina = function(slave) {
 					r.push(`Matching its size is the thick hood covering it.`);
 				} else if (slave.clit === 4) {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit has reached the size of an average penis, it stands at attention but due to lack of erectile tissues it can't reach the same hardness a penis would.`);
+						r.push(`${His} clit has reached the size of an average penis. It stands at attention, but due to lack of erectile tissues, it can't reach the same hardness a penis would.`);
 					} else {
 						r.push(`${His} clit has reached the size of an average penis.`);
 					}
 					r.push(`${His} large hood covering over half of it adds to its penis-like appearance.`);
 				} else {
 					if (slave.devotion > 50) {
-						r.push(`${His} clit is massive, having reached the size of a large penis. It is semi-erect, since lack of erectile tissues means it can never reach full erection.`);
+						r.push(`${His} clit is massive, having reached the size of a large penis. It is only semi-erect, since lack of erectile tissues means it can never reach full erection.`);
 					} else {
 						r.push(`${His} clit is massive, having reached the size of a large penis.`);
 					}
@@ -654,7 +654,7 @@ App.Desc.vagina = function(slave) {
 	} else if (slave.pubicHStyle === "hairless") {
 		r.push(`${He}'s naturally smooth and hairless.`);
 	} else if (slave.pubicHStyle === "bald") {
-		r.push(`${He} is no longer able to grow pubic hair leaving ${him} hairless and smooth.`);
+		r.push(`${He} is no longer able to grow pubic hair, leaving ${him} hairless and smooth.`);
 	} else if (slave.pubicHStyle === "waxed") {
 		if (slave.fuckdoll > 0) {
 			r.push(`${His} pubic hair has been removed to prevent chafing.`);
diff --git a/src/npc/interaction/fDance.js b/src/npc/interaction/fDance.js
index 9fa5693990ef457de39bd39c5e1109e88ab81c67..0ebe24ee3d4d81241c2de39f59d60234aaf391d9 100644
--- a/src/npc/interaction/fDance.js
+++ b/src/npc/interaction/fDance.js
@@ -1335,7 +1335,7 @@ App.Interact.fDance = function(slave) {
 			} else if (slave.boobs > 4000) {
 				r.push(`massive breasts stretch ${his} custom tailored dress to its absolute limit.`);
 			} else if (slave.boobs > 800) {
-				r.push(`big breasts stretch taut against ${his} dress, leaving nothing to the imagination.`);
+				r.push(`big breasts stretch ${his} dress taut, leaving nothing to the imagination.`);
 			} else if (slave.boobs < 300) {
 				r.push(`dress tightly hugs ${his} flat chest, prominently displaying ${his} ${slave.nipples} nipples though the fabric.`);
 			} else {
diff --git a/src/npc/interaction/fRelation.js b/src/npc/interaction/fRelation.js
index 48633ee820d1a94ffe56eeb8b7746518ad839bf0..181c042eed4b50fb793c76ca1633e7a28541ef09 100644
--- a/src/npc/interaction/fRelation.js
+++ b/src/npc/interaction/fRelation.js
@@ -1,11 +1,10 @@
 /**
  * @param {App.Entity.SlaveState} slave - slave to fuck with partner.
  * @param {App.Entity.SlaveState} partner - partner to fuck slave with.  must be a close relative or relationship target of slave.
- * @returns {DocumentFragment}
+ * @returns {DocumentFragment|HTMLElement}
  */
 App.Interact.fRelation = function(slave, partner) {
-	const node = new DocumentFragment();
-	let r = [];
+	const r = new SpacedTextAccumulator();
 
 	const {
 		He, His,
@@ -102,7 +101,7 @@ App.Interact.fRelation = function(slave, partner) {
 			}
 			r.push(`your strap-on`);
 		}
-		r.push(r.pop() + `.`);
+		r.addToLast(`.`);
 		r.push(`On your direction, ${slave.slaveName} sits on the couch. When ${partner.slaveName} enters, ${his2} ${activeSlaveRel} spreads ${his} arms and tells ${him2} to sit on ${his} lap. ${partner.slaveName} gets the idea and straddles ${him} so they're face to face. You take ${partner.slaveName} from behind; ${he2} gasps as ${he2} feels ${his2} ${activeSlaveRel}'s ${hasBothArms(partner) ? `hands` : `hand`} stimulate ${him2} from the front. They make out shamelessly while you take your pleasure. When you finish, ${slave.slaveName} lies down on the couch so ${partner.slaveName} can ride ${his}`);
 		if (V.seeRace === 1) {
 			r.push(slave.race);
@@ -191,7 +190,7 @@ App.Interact.fRelation = function(slave, partner) {
 			if (V.PC.dick === 0) {
 				r.push(`with a strap-on`);
 			}
-			r.push(r.pop() + `. You pull out`);
+			r.addToLast(`. You pull out`);
 		} else {
 			r.push(`floor with`);
 			if (V.PC.dick === 0) {
@@ -278,6 +277,6 @@ App.Interact.fRelation = function(slave, partner) {
 		r.push(VCheck.Partner(partner, 1));
 	}
 
-	App.Events.addParagraph(node, r);
-	return node;
+	r.toParagraph();
+	return r.container();
 };
diff --git a/src/npc/interaction/passage/fSlaveImpreg.js b/src/npc/interaction/passage/fSlaveImpreg.js
index b97a0cb57bb025b023677cf4ec5bdfae2b10e29f..6131562b403424ef97cc5d716bbe62b1e9f8ee1a 100644
--- a/src/npc/interaction/passage/fSlaveImpreg.js
+++ b/src/npc/interaction/passage/fSlaveImpreg.js
@@ -1,5 +1,5 @@
 /**
- *
+ * @param {App.Entity.SlaveState} slave
  * @returns {HTMLElement}
  */
 App.Interact.fSlaveImpreg = function(slave) {
@@ -53,13 +53,11 @@ App.Interact.fSlaveImpreg = function(slave) {
 	return node;
 
 	/**
-	 *
 	 * @param {App.Entity.SlaveState} impregnatrix
-	 * @returns {DocumentFragment}
+	 * @returns {HTMLElement|DocumentFragment}
 	 */
 	function consummate(impregnatrix) {
-		const node = new DocumentFragment();
-		let r = [];
+		const r = new SpacedTextAccumulator();
 		V.nextLink = "Slave Interact";
 		V.nextButton = "Back";
 
@@ -141,8 +139,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			r.push(`Since ${impregnatrix.slaveName} is unlikely to comply willingly, you simply restrain ${him2} and administer a massive dose of vasodilators, directly where they will do the most good. ${impregnatrix.slaveName} writhes with the pain of the injection, which is compounded as ${he2} springs agonizingly erect.`);
 		}
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		r.push(`Next, you see to ${slave.slaveName}.`);
 
@@ -230,8 +227,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 
 		knockMeUp(slave, 100, 2, impregnatrix.ID);
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		if (slave.devotion < -20 && impregnatrix.devotion < -20) {
 			r.push(`Since you have two restrained slaves, it's up to you to do all the work. You put ${slave.slaveName} on the couch with ${his} ${assPussy} available, and then maneuver ${impregnatrix.slaveName}'s dick into place. The two slaves make no further moves until you deal ${impregnatrix.slaveName} a terrific swat across the ass and promise to give ${him2} more of the same until ${he2} gets going. After watching them mechanically go at it for a while, you stop ${impregnatrix.slaveName}, insert an electrostimulator up ${his2} rectum, and administer a shock to ${his2} ${prostate} that forces ${him2} to empty ${his2} nuts into ${slave.slaveName}. Both slaves <span class="mediumorchid">resent</span> what you made them do and <span class="gold">fear you</span> as a result.`);
@@ -457,8 +453,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			}
 		}
 
-		App.Events.addParagraph(node, r);
-		r = [];
+		r.toParagraph();
 
 		r.push(`You prepare the necessary file on their possible offspring. Upon birth, it will be remanded to a slave orphanage to be raised to the age of ${V.minimumSlaveAge} and then sold, but its likely appearance and traits are already worth noting. ${slave.slaveName} and ${impregnatrix.slaveName} are likely to produce`);
 
@@ -544,7 +539,7 @@ App.Interact.fSlaveImpreg = function(slave) {
 			r.push(`slave with a decent ass.`);
 		}
 
-		App.Events.addParagraph(node, r);
-		return node;
+		r.toParagraph();
+		return r.container();
 	}
 };
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 97bb131c5bc7d15990f7e5e1eaaf0e662a793bc1..a21d427b61cbb80571288980147a4aad60d365c8 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -882,8 +882,10 @@ App.StartingGirls.upper = function(slave, cheat = false) {
 	}
 
 	option.pulldown();
-	for (/** @type {"left"|"right"}*/ const side of ["left", "right"]) {
-		if (!!slave.eye[side]) { // has eye
+	/** @type {("left"|"right")[]} */
+	const sides = ["left", "right"];
+	for (const side of sides) {
+		if (slave.eye[side]) { // has eye
 			let option = options.addOption(`${capFirstChar(side)} eye vision`, "vision", slave.eye[side]);
 			option.addValueList([["Normal", 2], ["Nearsighted", 1]]);
 			if (V.seeExtreme === 1) {
@@ -1501,6 +1503,52 @@ App.StartingGirls.lower = function(slave, cheat = false) {
 	return el;
 };
 
+/* non-persistent global data */
+App.StartingGirls.careerFilter = "Any";
+
+/** @type {Map<string, function(string): boolean>} */
+App.StartingGirls.careerBonusFilters = (function() {
+	/**
+	 * @param {Object} obj
+	 * @param {string} key
+	 * @returns {[string, function(string): boolean]}
+	 */
+	const categoryToFilterElement = (obj, key) => {
+		return [capFirstChar(key), c => obj[key].includes(c)];
+	};
+
+	const nonBonusCategories = ["veryYoung", "young", "educated", "uneducated"];
+	const generalBonusCats = Object.keys(App.Data.Careers.General).filter(c => !nonBonusCategories.includes(c));
+	const leadershipBonusCats = Object.keys(App.Data.Careers.Leader);
+	const bonusCategories = new Map([
+		["Any", () => true],
+		...generalBonusCats.map(key => categoryToFilterElement(App.Data.Careers.General, key)),
+		...leadershipBonusCats.map(key => categoryToFilterElement(App.Data.Careers.Leader, key)),
+	]);
+
+	return bonusCategories;
+})();
+
+App.StartingGirls.makeCareerFilterPulldown = function() {
+	const frag = new DocumentFragment();
+	frag.append(`Filter by desired bonus: `);
+
+	const select = document.createElement("select");
+	for (const cat of App.StartingGirls.careerBonusFilters.keys()) {
+		const choice = App.UI.DOM.appendNewElement("option", select, cat);
+		if (App.StartingGirls.careerFilter === cat) {
+			choice.selected = true;
+		}
+	}
+
+	select.onchange = () => {
+		App.StartingGirls.careerFilter = select.value;
+		App.UI.reload();
+	};
+	frag.append(select);
+	return frag;
+};
+
 /**
  * @param {App.Entity.SlaveState} slave
  * @param {boolean} cheat
@@ -1518,9 +1566,7 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 	options.addOption("Slave surname", "slaveSurname", slave).showTextBox();
 
 	option = options.addOption("Career", "career", slave).showTextBox();
-	/**
-	 * @type {Array<string>}
-	 */
+	/** @type {Array<string>} */
 	let careers;
 	let text;
 	if (slave.actualAge < 16) {
@@ -1552,6 +1598,8 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 		}
 	}
 
+	careers = careers.filter(App.StartingGirls.careerBonusFilters.get(App.StartingGirls.careerFilter));
+
 	const niceCareers = new Map();
 	for (const career of careers) {
 		const nice = capFirstChar(App.Utils.removeArticles(career));
@@ -1561,7 +1609,8 @@ App.StartingGirls.profile = function(slave, cheat = false) {
 		option.addValue(career, niceCareers.get(career));
 	}
 
-	option.addComment(`Available careers are based on age and education. Currently most influential is ${him} being ${text}.`).pulldown();
+	const optionComment = ` Available careers are based on age and education. Currently most influential is ${him} being ${text}.`;
+	option.addComment(App.UI.DOM.combineNodes(App.StartingGirls.makeCareerFilterPulldown(), optionComment)).pulldown();
 
 	const indenture = {active: slave.indenture > -1};
 
diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js
index 05ae02be81e986a9eec073dae97ed000512ff1f9..0872b6e50f28f81a2ef4a7147d980e67c48f5221 100644
--- a/src/npc/startingGirls/startingGirlsPassage.js
+++ b/src/npc/startingGirls/startingGirlsPassage.js
@@ -11,7 +11,7 @@ App.StartingGirls.passage = function() {
 		if (V.PC.dick !== 0 && V.PC.vagina !== -1 && (V.seeDicks !== 0 || V.makeDicks === 1)) {
 			r.push(`Since you have both a penis and a vagina yourself, you've obviously had access to a source of advanced surgery and organ farming. <span class="skill player">Slaves get a smaller cost increase here for having both penises and vaginas, and for having both testicles and ovaries.</span>`);
 		}
-		if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+		if (isPCCareerInCategory("slaver")) {
 			r.push(`Since you`);
 			if (V.PC.career === "slaver") {
 				r.push(`personally saw to the capture, breaking and or training of`);
@@ -86,6 +86,7 @@ App.StartingGirls.passage = function() {
 						V.activeSlave.origSkin = "fair";
 						V.activeSlave.origHColor = "red";
 						V.activeSlave.markings = "heavily freckled";
+						V.activeSlave.face = 55;
 					},
 					[],
 					"Starting Girls"
@@ -95,13 +96,13 @@ App.StartingGirls.passage = function() {
 				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
 					"Cali Girl",
 					() => {
-						V.activeSlave = App.StartingGirls.generate({nationality: "American"});
+						V.activeSlave = App.StartingGirls.generate({nationality: "American", race: "white"});
 						V.activeSlave.eye.origColor = "blue";
 						V.activeSlave.skin = "sun tanned";
 						V.activeSlave.override_Skin = 1;
 						V.activeSlave.origHColor = "blonde";
 						V.activeSlave.markings = "none";
-						V.activeSlave.face = 95;
+						V.activeSlave.face = 55;
 						V.activeSlave.muscles = 20;
 						V.activeSlave.weight = -20;
 						V.activeSlave.height = Height.forAge(190, V.activeSlave);
diff --git a/src/player/desc/pNotesCrotch.js b/src/player/desc/pNotesCrotch.js
index 3b011373851d2ae20dfa88dd7b70f6c54d590485..d6201f1c6d784d722176cdeeabf78ad875113d03 100644
--- a/src/player/desc/pNotesCrotch.js
+++ b/src/player/desc/pNotesCrotch.js
@@ -13,7 +13,7 @@ App.Desc.Player.pNotesCrotch = function(PC = V.PC) {
 		}
 	} else if (V.PC.career === "escort") {
 		if (V.PC.balls >= 30) {
-			r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peaking out from under the skirt.`);
+			r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peeking out from under the skirt.`);
 		} else if (V.PC.balls >= 14) {
 			r.push(`You've swapped up to a larger pair of slutty pants, specially designed with extra sack room. They draw the eye right to your`);
 			if (V.PC.preg >= 28) {
diff --git a/src/player/desc/playerCrotch.js b/src/player/desc/playerCrotch.js
index f208a2a2a556be8d7507ad98d6da26ebbf4b2401..0f0e3a0b8dbe9559dc724e58cea20ea7d0058648 100644
--- a/src/player/desc/playerCrotch.js
+++ b/src/player/desc/playerCrotch.js
@@ -126,7 +126,7 @@ App.Desc.Player.crotch = function() {
 			}
 		} else if (V.PC.career === "escort") {
 			if (V.PC.balls >= 30) {
-				r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peaking out from under the skirt.`);
+				r.push(`You've pretty much given up on pants because of your monstrous balls, but you've replaced them with a slutty skirt that stretches around their veiny contours. People can't help staring to see if they'll get a glimpse of your massive sack peeking out from under the skirt.`);
 			} else if (V.PC.balls >= 14) {
 				r.push(`You've swapped up to a larger pair of slutty pants, specially designed with extra sack room. They draw the eye right to your`);
 				if (V.PC.preg >= 28) {
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 2be7faf934b6ae7ccab053138fa54d31eeecfc28..02ac4d1655844fb11b0d79b706e9e668f2805acd 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -473,7 +473,7 @@ App.UI.managePersonalAffairs = function() {
 			reputationDiv.append(breeding());
 		}
 
-		if (PC.preg === 0 && PC.pregWeek === 0) {
+		if (PC.preg === 0 && PC.pregWeek === 0 && PC.vagina > -1) {
 			reputationDiv.append(
 				cumTap(),
 				impregnateSelf(),
diff --git a/src/player/pcSurgeryDegradation.js b/src/player/pcSurgeryDegradation.js
index 7325c8fc705f2ee9ecdc8bb0e433528611932004..68000e8d82b92cf630143aad61937b72b16ef9d9 100644
--- a/src/player/pcSurgeryDegradation.js
+++ b/src/player/pcSurgeryDegradation.js
@@ -293,11 +293,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else {
 				r.push(`find your balls are much bigger than you expected them to be.`);
 			}
@@ -328,11 +328,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls are now closer to the typical size one would expect.`);
 			}
@@ -358,11 +358,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are much bigger than you expected them to be after the surgery.`);
 			} else {
 				r.push(`find your balls are much bigger than you expected them to be.`);
 			}
@@ -395,11 +395,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 			}
 			r.push(`You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls are now closer to the typical size one would expect.`);
 			}
@@ -422,11 +422,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 		case "ballBigShrinkage":
 			r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness and tight feeling between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your balls are now closer to the typical size one would expect.`);
 			} else {
 				r.push(`find your balls have had a dramatic size adjustment.`);
 			}
@@ -442,11 +442,11 @@ App.UI.PCSurgeryDegradation = function(surgeryType) {
 		case "tightPussy":
 			r.push(`After a few hours, you awaken in the recovery wing with a distinct soreness between your legs. You pull the covers off of yourself to catch sight of the result of the surgery and`);
 			if (V.PC.boobs >= 1400 && V.PC.belly >= 10000) {
-				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peaking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
+				r.push(`find that not only can you barely see around your breasts, but any attempts to do so are immediately thwarted by your big, pregnant belly. You settle for a position peeking over your tits but around your middle to view the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else if (V.PC.boobs >= 1400) {
 				r.push(`find that your enormous breasts make it difficult to get a good look so you settle for the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else if (V.PC.belly >= 10000) {
-				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peaking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
+				r.push(`find that your big, pregnant belly makes it impossible to get a good look at your crotch so you settle for peeking around it at the mirror-covered wall across from your bed. Your pussy isn't gaping, so that's a good sign. You can't tell much more until you get a good feel of it.`);
 			} else {
 				r.push(`find your pussy is much tighter than it was. No hymen though, so you can't pass as a virgin.`);
 			}
diff --git a/src/player/personalAttentionSelect.js b/src/player/personalAttentionSelect.js
index 15dcdfc5068c9e49458ef6d990fae6ce201f3513..69d50cd8a847501ad413d7e7112b5559d6d07ef2 100644
--- a/src/player/personalAttentionSelect.js
+++ b/src/player/personalAttentionSelect.js
@@ -585,7 +585,7 @@ App.UI.Player.personalAttention = function() {
 
 				if (slave.behavioralFlaw !== "none") {
 					App.Events.addNode(div, [
-						`Current behavioral flaw: <span class="red">${slave.behavioralFlaw}.</span>`,
+						`Current behavioral flaw: <span class="red">${slave.behavioralFlaw}.</span> `,
 					]);
 
 					links.push(attentionLink(i, `Remove ${his} behavioral flaw`, "fix her behavioral flaw"));
diff --git a/src/uncategorized/randomEventRoll.tw b/src/uncategorized/randomEventRoll.tw
index e8af85bc01e4d49e1c12ad13b7043a4247a9f5f3..d214a3a7b751a35abfb8ada5e25fb0566bc9f350 100644
--- a/src/uncategorized/randomEventRoll.tw
+++ b/src/uncategorized/randomEventRoll.tw
@@ -1,5 +1,9 @@
 :: random event roll
 
+<<if $events.length == 0>>
+	<<set $events.push("RE no event")>>
+<</if>>
+
 <<set _goto = $events.random()>>
 <<if _goto.startsWith("JSRE")>>
 	<<run App.Events.setGlobalEventForPassageTransition(_goto)>>