diff --git a/js/003-data/policiesData.js b/js/003-data/policiesData.js
index 8bdc865473e9e8b15aaa9ff692032c198bd909be..53ff399abb680f386922432192462322f3ad8c3a 100644
--- a/js/003-data/policiesData.js
+++ b/js/003-data/policiesData.js
@@ -1759,9 +1759,9 @@ App.Data.Policies.Selection = {
 						t += ` slaveowners,`;
 					}
 					t += ` enhances`;
-					if (V.nicaea.assignment === "whore") {
+					if (V.nicaea.assignment === Job.WHORE) {
 						t += ` prostitution,`;
-					} else if (V.nicaea.assignment === "serve the public") {
+					} else if (V.nicaea.assignment === Job.PUBLIC) {
 						t += ` public service,`;
 					} else {
 						t += ` fucktoy duty,`;
@@ -1790,9 +1790,9 @@ App.Data.Policies.Selection = {
 						t += ` slaveowners,`;
 					}
 					t += ` enhances`;
-					if (V.nicaea.assignment === "whore") {
+					if (V.nicaea.assignment === Job.WHORE) {
 						t += ` prostitution,`;
-					} else if (V.nicaea.assignment === "serve the public") {
+					} else if (V.nicaea.assignment === Job.PUBLIC) {
 						t += ` public service,`;
 					} else {
 						t += ` fucktoy duty,`;
diff --git a/js/004-base/SurgeryProcedure.js b/js/004-base/SurgeryProcedure.js
index dc5b65e44a22eb4d1538b5838739f0fa5ceec41d..07579c4e4ab4d01dd8d203a10135dbab84498768 100644
--- a/js/004-base/SurgeryProcedure.js
+++ b/js/004-base/SurgeryProcedure.js
@@ -100,8 +100,8 @@ App.Medicine.Surgery.Procedure = class {
 		const reasons = [];
 
 		/* disallow surgery for slaves on certain assignments */
-		if (this.originalSlave.assignment === "be your agent" ||
-			this.originalSlave.assignment === "live with your agent") {
+		if (this.originalSlave.assignment === Job.AGENT ||
+			this.originalSlave.assignment === Job.AGENTPARTNER) {
 			const {his, him} = getPronouns(this.originalSlave);
 			reasons.push(`You must retrieve ${this.originalSlave.slaveName} from ${his} assignment before performing surgery on ${him}.`);
 		}
diff --git a/js/medicine/surgery/genitials/geld.js b/js/medicine/surgery/genitials/geld.js
index 45f63cb509b4d079afe67efde4aa8c7d4898b0ba..b811a4990572bd923ade109cf56f4cc9303efda6 100644
--- a/js/medicine/surgery/genitials/geld.js
+++ b/js/medicine/surgery/genitials/geld.js
@@ -22,7 +22,7 @@ App.Medicine.Surgery.Reactions.Geld = class extends App.Medicine.Surgery.SimpleR
 			reaction.trust -= 20;
 			reaction.devotion -= 20;
 		}
-		if ((slave.assignment === "get milked" || slave.assignment === "work in the dairy") && slave.lactation === 0) {
+		if ((slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) && slave.lactation === 0) {
 			r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			removeJob(slave, slave.assignment);
diff --git a/js/medicine/surgery/genitials/maleToFemale.js b/js/medicine/surgery/genitials/maleToFemale.js
index 71c8ebd92b8fb20569e0769313b99b7668c42d08..c185a8e9a072f692b406c8cfecf748bba9d1276f 100644
--- a/js/medicine/surgery/genitials/maleToFemale.js
+++ b/js/medicine/surgery/genitials/maleToFemale.js
@@ -30,7 +30,7 @@ App.Medicine.Surgery.Reactions.MaletoFemale = class extends App.Medicine.Surgery
 			reaction.trust -= 20;
 			reaction.devotion -= 20;
 		}
-		if ((slave.assignment === "get milked" || slave.assignment === "work in the dairy") && slave.lactation === 0) {
+		if ((slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) && slave.lactation === 0) {
 			r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			removeJob(slave, slave.assignment);
diff --git a/js/medicine/surgery/nipples/endLactation.js b/js/medicine/surgery/nipples/endLactation.js
index f294ae085f872269273f80519727e48bf0115751..1f2a974aabf21a607f50d32f6fdc86ae85ecb583 100644
--- a/js/medicine/surgery/nipples/endLactation.js
+++ b/js/medicine/surgery/nipples/endLactation.js
@@ -6,7 +6,7 @@ App.Medicine.Surgery.Reactions.EndLactation = class extends App.Medicine.Surgery
 
 		r.push(`${He} notices almost immediately that the soreness that used to tell ${him} ${he} needed to be milked has gone. ${He} bounces ${his} breasts idly; it looks like ${he} doesn't know what to think about having ${his} lactation dry up. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`);
 
-		if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
+		if (slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) {
 			r.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			reaction.shortReaction.push(`<span class="job change">${His} assignment has defaulted to rest.</span>`);
 			removeJob(slave, slave.assignment);
diff --git a/js/rulesAssistant/conditionEditor.js b/js/rulesAssistant/conditionEditor.js
index 88a6ac2ba08643609311ea0a8be4656789d9a5ac..e6f4ec6be0004e6857e6223bd5ec849d95752fb4 100644
--- a/js/rulesAssistant/conditionEditor.js
+++ b/js/rulesAssistant/conditionEditor.js
@@ -533,9 +533,9 @@ App.RA.Activation.Editor = (function() {
 	}
 
 	/**
-	 * @typedef {"sub" | "div" | "eq" | "neq" | "gt" | "gte" | "lt" | "lte"| "substr"} RulePairComparators
+	 * @typedef {"sub" | "div" | "eq" | "neq" | "gt" | "gte" | "lt" | "lte"| "substr" | "match"} RulePairComparators
 	 * @typedef {object} RulePairComparatorDisplay
-	 * @property {string} key
+	 * @property {RulePairComparators} key
 	 * @property {string} name
 	 * @type {RulePairComparatorDisplay[]}
 	 */
@@ -549,6 +549,7 @@ App.RA.Activation.Editor = (function() {
 		{key: "sub", name: "-"},
 		{key: "div", name: "/"},
 		{key: "substr", name: "Contains"},
+		{key: "match", name: "Matches"},
 	];
 
 	class RulePair extends RuleContainer {
@@ -604,7 +605,7 @@ App.RA.Activation.Editor = (function() {
 					errorList.push("Both sides need to return the same type.");
 					return "error";
 				}
-			} else if (this.mode === "substr") {
+			} else if (this.mode === "substr" || this.mode === "match") {
 				if (this._child1.validate(errorList) === "string" && this._child2.validate(errorList) === "string") {
 					return "number";
 				} else {
@@ -1123,7 +1124,7 @@ App.RA.Activation.Editor = (function() {
 		}
 
 		/**
-		 * @param {"sub" | "div" | "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "substr"} mode
+		 * @param {"sub" | "div" | "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "substr" | "match"} mode
 		 */
 		function makePair(mode) {
 			const pair = new RulePair(mode);
@@ -1162,6 +1163,7 @@ App.RA.Activation.Editor = (function() {
 			["lt", () => makePair("lt")],
 			["lte", () => makePair("lte")],
 			["substr", () => makePair("substr")],
+			["match", () => makePair("match")],
 			["not", () => {
 				const negate = new RuleNegate();
 				negate.child = stack.popRulePart();
diff --git a/js/rulesAssistant/conditionEvaluation.js b/js/rulesAssistant/conditionEvaluation.js
index c2c2afca4d6ece627ba74ed9480857c2667875c4..e3c50573c7529e77a4f7cab7d70c471bd788ca74 100644
--- a/js/rulesAssistant/conditionEvaluation.js
+++ b/js/rulesAssistant/conditionEvaluation.js
@@ -656,15 +656,28 @@ App.RA.Activation.populateGetters = function() {
 	// Strings
 	gm.addString("label", {name: "Label", description: "Assigned Label", val: c => c.slave.custom.label});
 	gm.addString("genes", {
-		name: "Sex", description: "Genetic sex: Male: XX, Female: XY",
+		name: "Genetic sex", description: "Genetic sex: Female: XX, Male: XY",
 		val: c => c.slave.genes
 	});
+	gm.addString("phenotypesex", {
+		name: "Phenotype sex",
+		description: "A three-character string that encodes state of sexual organs" +
+			" as female('X'), male('Y'), both ('H'), or absent ('-'): vagina/dick, ovaries/balls, tits",
+		val: c => phenotypeSex(c.slave)
+	});
 	gm.addString("fetish", {
 		name: "Fetish",
 		description: "One of 'buttslut', 'cumslut', 'masochist', 'sadist', 'dom', 'submissive', 'boobs', " +
 			"'pregnancy', 'none' (AKA vanilla)",
 		val: c => c.slave.fetish
 	});
+	gm.addString("title", {
+		name: "Title",
+		description: "Slave title (class) without adjectives (slavegirl, MILF, bimbo, shemale, herm, etc.). ",
+		requirements: "The alternate titles game option is enabled",
+		enabled: () => V.newDescriptions === 1,
+		val: c => SlaveTitle(c.slave, false, false)
+	});
 };
 
 /**
@@ -750,6 +763,10 @@ App.RA.Activation.evaluate = function(slave, rule) {
 			const value = stack.popString();
 			stack.pushBoolean(stack.popString().includes(value));
 		}],
+		["match", () => {
+			const value = stack.popString();
+			stack.pushBoolean(stack.popString().match(value) !== null);
+		}],
 		["not", () => stack.pushBoolean(stack.popNumber() === 0)],
 		["ternarystr", () => {
 			const ifFalse = stack.popString();
diff --git a/src/004-base/facilityFramework.js b/src/004-base/facilityFramework.js
index e8351ab0f33a849c499d0c015a27f2c2bf1d2ec3..81aeeee1596ddae8ef624e92bf14c137692fb79e 100644
--- a/src/004-base/facilityFramework.js
+++ b/src/004-base/facilityFramework.js
@@ -256,7 +256,7 @@ App.Facilities.Facility = class Facility {
 						}
 					});
 
-					App.UI.DOM.appendNewElement("div", div, options.render(), ['indent', 'margin-bottom']);
+					App.UI.DOM.appendNewElement("div", div, options.render(), ['margin-bottom']);
 				}
 
 				if (rule.nodes) {
diff --git a/src/Mods/SecExp/buildings/riotControlCenter.js b/src/Mods/SecExp/buildings/riotControlCenter.js
index 9b0850b2d989be1383530f602f24cdff38d0782b..b7b9dc39025d0c794e21f93e6ee41feb65854fe0 100644
--- a/src/Mods/SecExp/buildings/riotControlCenter.js
+++ b/src/Mods/SecExp/buildings/riotControlCenter.js
@@ -121,7 +121,7 @@ App.Mods.SecExp.riotCenter = (function() {
 					makeLink(
 						"Start secretly installing brain implants in your citizens and resident slaves",
 						0,
-						`Will take weeks of work and will ${cashFormat(5000)} each week, but once finished rebellions will progress a lot slower.`,
+						`Will take weeks of work and will cost ${cashFormat(5000)} each week, but once finished rebellions will progress a lot slower.`,
 						"brainImplantStart"
 					)
 				);
diff --git a/src/Mods/SecExp/js/Unit.js b/src/Mods/SecExp/js/Unit.js
index 76b01e3197cfe0f0e1e0467353bf3b8db72d53ad..18a53b2d1bb91be537cda16d8694f5c8d455e152 100644
--- a/src/Mods/SecExp/js/Unit.js
+++ b/src/Mods/SecExp/js/Unit.js
@@ -171,13 +171,7 @@ App.Mods.SecExp.unit = (function() {
 			linkArray = [];
 			App.UI.DOM.appendNewElement("div", unitDetail, describe(unit, false));
 			linkArray.push(App.UI.DOM.makeTextBox(unit.platoonName, str => { unit.platoonName = str; App.UI.reload(); }));
-			linkArray.push(App.UI.DOM.link(`Disband the unit`, () => {
-				unitFree(type).add(unit.troops);
-				V.SecExp.units[type].squads.deleteAt(unit);
-				V.SecExp.battles.lastSelection.deleteAt(unit);
-				App.UI.reload();
-			}
-			));
+			linkArray.push(App.UI.DOM.link(`Disband the unit`, () => { removeUnit(); App.UI.reload(); }));
 
 			if (unit.active === 1) {
 				if (unit.troops < unit.maxTroops && unitFree(unit).canUpgrade()) {
@@ -223,9 +217,7 @@ App.Mods.SecExp.unit = (function() {
 				linkArray.push(App.UI.DOM.link(`Send this unit to improve your relationship with General ${V.peacekeepers.generalName}. Costs ${cashFormat(cost)}.`, () => { 
 					V.peacekeepers.attitude += Math.ceil(unitAdjust / 5);
 					cashX(cost, "securityExpansion");
-					unitFree(type).add(unit.troops);
-					V.SecExp.units[type].squads.deleteAt(unit);
-					V.SecExp.battles.lastSelection.deleteAt(unit);
+					removeUnit();
 					App.UI.reload();
 				}
 				));
@@ -376,6 +368,12 @@ App.Mods.SecExp.unit = (function() {
 				}
 			}
 			App.UI.DOM.appendNewElement("p", list, unitDetail);
+
+			function removeUnit() {
+				unitFree(type).add(unit.troops);
+				V.SecExp.units[type].squads.delete(unit);
+				V.SecExp.battles.lastSelection.delete(unit);
+			}
 		}
 		return list;
 
diff --git a/src/descriptions/officeDescription.js b/src/descriptions/officeDescription.js
index 3880380a73ba6581702d33243dc38097b297db79..d735c7cf7cf44678dea4ff5e1a1188f69faf18fc 100644
--- a/src/descriptions/officeDescription.js
+++ b/src/descriptions/officeDescription.js
@@ -23,7 +23,7 @@ App.Desc.officeDescription = function(lastElement) {
 
 		if (V.clubAdsSpending >= 5000) {
 			r.push(`A corner of your desk is piled with sample merchandise from the campaign promoting your club.`);
-			const clubSlaves = V.slaves.filter(s => s.assignment === "serve in the club");
+			const clubSlaves = V.slaves.filter(s => s.assignment === Job.CLUB);
 			if (clubSlaves.length > 0) {
 				const modeledSlave = clubSlaves.random();
 				const {He, his} = getPronouns(modeledSlave);
@@ -132,7 +132,7 @@ App.Desc.officeDescription = function(lastElement) {
 			} else {
 				r.push(`A corner of your desk is piled with sample merchandise from the campaign promoting ${V.brothelName}.`);
 			}
-			const brothelSlaves = V.slaves.filter(s => s.assignment === "work in the brothel");
+			const brothelSlaves = V.slaves.filter(s => s.assignment === Job.BROTHEL);
 			if (brothelSlaves.length > 0) {
 				const modeledSlave = brothelSlaves.random();
 				const {he, his} = getPronouns(modeledSlave);
diff --git a/src/endWeek/economics/arcmgmt.js b/src/endWeek/economics/arcmgmt.js
index e2e7247001659102dac73424fd68c47d18d91995..2c97e12c5860fe9e821496ab20c8f5c4c73d0d93 100644
--- a/src/endWeek/economics/arcmgmt.js
+++ b/src/endWeek/economics/arcmgmt.js
@@ -1343,12 +1343,12 @@ App.EndWeek.arcManagement = function() {
 				topClass += V.nicaea.power * 2.5;
 				topClassP *= 1 + V.nicaea.power * 0.005;
 			}
-			if (V.nicaea.assignment === "whore") {
+			if (V.nicaea.assignment === Job.WHORE) {
 				upperClass += V.nicaea.power * 6.75;
 				upperClassP *= 1 + V.nicaea.power * 0.0025;
 				topClass += V.nicaea.power * 1.25;
 				topClassP *= 1 + V.nicaea.power * 0.0025;
-			} else if (V.nicaea.assignment === "serve the public") {
+			} else if (V.nicaea.assignment === Job.PUBLIC) {
 				lowerClass += V.nicaea.power * 50;
 				lowerClassP *= 1 + V.nicaea.power * 0.0025;
 				middleClass += V.nicaea.power * 20;
diff --git a/src/endWeek/economics/neighborsDevelopment.js b/src/endWeek/economics/neighborsDevelopment.js
index 3c9c401295eda4fcb8261e7a7966e613688d60e5..6a8f16d9e0248e2baf8885fa36d7e5b2742a00d6 100644
--- a/src/endWeek/economics/neighborsDevelopment.js
+++ b/src/endWeek/economics/neighborsDevelopment.js
@@ -94,7 +94,7 @@ App.EndWeek.neighborsDevelopment = function() {
 				const {his} = getPronouns(agent);
 				r.push(`<span class="deeppink">${agent.slaveName}</span> manages to escape with the help of a few loyal citizens and returns to you <span class="gold">fearing your displeasure at ${his} failure.</span>`);
 				agent.trust -= 40;
-				assignJob(agent, "rest"); // this takes care of necessary cleanup for agent and agent companion (if any)
+				assignJob(agent, Job.REST); // this takes care of necessary cleanup for agent and agent companion (if any)
 			}
 			r.push(`A controlling interest has been taken by a single individual, leaving the arcology ruled like yours is.`);
 			arc.government = "an individual";
@@ -2077,7 +2077,7 @@ App.EndWeek.neighborsDevelopment = function() {
 					return;
 				}
 				if (validFSes.includes("FSIncestFetishist")) {
-					const lover = V.slaves.find(s => (s.ID === leader.relationshipTarget && areRelated(s, leader) && s.assignment === "live with your agent"));
+					const lover = V.slaves.find(s => (s.ID === leader.relationshipTarget && areRelated(s, leader) && s.assignment === Job.AGENTPARTNER));
 					if ((leader.behavioralQuirk === "sinful" || leader.sexualQuirk === "perverted") && lover && V.seeIncest === 1) {
 						r.push(`Your agent <span class="pink">${leader.slaveName}</span> successfully pushes it to <span class="yellow">adopt Incest Festishism,</span> to share the love and joy ${he} holds with ${his} ${relativeTerm(leader, lover)}.`);
 						arc.FSIncestFetishist = 5;
diff --git a/src/endWeek/events/death.js b/src/endWeek/events/death.js
index af9ed44407ac26922287ba547ee413ace92d2c6b..d53393b31286ba73b7d6a1ba22049c494e8d341b 100644
--- a/src/endWeek/events/death.js
+++ b/src/endWeek/events/death.js
@@ -58,7 +58,7 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 
 			switch (deathType) {
 				case "oldAge": {
-					if (slave.assignment === "be confined in the arcade") {
+					if (slave.assignment === Job.ARCADE) {
 						r.push(`You are notified by ${V.arcadeName} staff that one of the cabinets has broken down and will need to be replaced. It would seem <span class="pink bold">${slave.slaveName},</span> the fucktoy encased in it, died`);
 						if (slave.physicalAge >= 70) {
 							r.push(`naturally of old age despite`);
@@ -66,7 +66,7 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 							r.push(`suddenly, unrelated to`);
 						}
 						r.push(`${his} living conditions. ${He} was a good unit; logs show ${he} was taking dick up until the very end.`);
-					} else if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+					} else if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 						r.push(`You are notified by ${V.dairyName} staff that one of the occupied milkers has ceased producing. Upon inspection, it would seem <span class="pink bold">${slave.slaveName},</span> the cow restrained in it, died`);
 						if (slave.physicalAge >= 70) {
 							r.push(`naturally of old age despite`);
@@ -119,9 +119,9 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 				}
 
 				case "overdosed": {
-					if (slave.assignment === "be confined in the arcade") {
+					if (slave.assignment === Job.ARCADE) {
 						r.push(`You are notified by ${V.arcadeName} staff that one of the cabinets has broken down and will need to be replaced. It would seem <span class="pink bold">${slave.slaveName},</span> the fucktoy encased in it, died of an aphrodisiac overdose from the constant aphrodisiac injections. ${He} was a good unit; logs show ${he} was taking dick up until the very end.`);
-					} else if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+					} else if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 						r.push(`You are notified by ${V.dairyName} staff that one of the occupied milkers has ceased producing. Upon inspection, it would seem <span class="pink bold">${slave.slaveName},</span> the cow restrained in it, died of an aphrodisiac overdose. How ${he} managed to get them is unknown, but ${he} was a good cow; ${he} gave milk up until ${his} death.`);
 					} else if (slave.fuckdoll > 0) {
 						r.push(`One of your Fuckdolls' monitoring systems alerts you that the slave contained within has died. It would seem <span class="pink bold">${slave.slaveName}</span> has died of an aphrodisiac overdose. Thankfully the suit notifies its owner of such things; especially with the rumors of earlier models and necrophilia you hear occasionally. It does little to deal with the resulting mess of the orgasm ${he} died during, however.`);
@@ -148,9 +148,9 @@ App.Events.SEDeath = class SEDeath extends App.Events.BaseEvent {
 				}
 
 				case "lowHealth": {
-					if (slave.assignment === "be confined in the arcade") {
+					if (slave.assignment === Job.ARCADE) {
 						r.push(`You are notified by ${V.arcadeName} staff that one of the cabinets has broken down and will need to be replaced. It would seem <span class="pink bold">${slave.slaveName},</span> the fucktoy encased in it, died to poor health caused by ${his} living conditions. ${He} was a good unit; logs show ${he} was taking dick up until the very end.`);
-					} else if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+					} else if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 						r.push(`You are notified by ${V.dairyName} staff that one of the occupied milkers has ceased producing. Upon inspection, it would seem <span class="pink bold">${slave.slaveName},</span> the cow restrained in it, died to poor health caused by ${his} living conditions. ${He} was a good cow; ${he} gave milk up until ${his} death.`);
 					} else if (slave.fuckdoll > 0) {
 						r.push(`One of your Fuckdolls' monitoring systems alerts you that the slave contained within has died. It would seem <span class="pink bold">${slave.slaveName}</span> has died of general poor health. Thankfully the suit notifies its owner of such things; especially with the rumors of earlier models and necrophilia you hear occasionally. Clean up is easy enough, however.`);
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index e3d6e08816ab554f03f99c8edf06658b1a0cf1f0..e3a899688e268367af6ac92e248acac519b101e0 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -242,7 +242,7 @@ App.EndWeek.nextWeek = function() {
 		slave.intelligenceImplant = Math.clamp(slave.intelligenceImplant.toFixed(1), -15, 30);
 		slave.prematureBirth = 0;
 		if (V.HGSuiteEquality === 1 && V.HeadGirlID !== 0 && slave.devotion > 50) {
-			if (slave.assignment === "live with your Head Girl") {
+			if (slave.assignment === Job.HEADGIRLSUITE) {
 				newHG = slave.ID;
 			} else if (slave.ID === V.HeadGirlID) {
 				oldHG = slave.ID;
@@ -254,10 +254,8 @@ App.EndWeek.nextWeek = function() {
 			V.averageDevotion += slave.devotion;
 			slavesContributing++;
 		} else if (
-			slave.assignment !== "be confined in the cellblock" &&
-			slave.assignment !== "be confined in the arcade" &&
-			(slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting < 2) &&
-			slave.assignment !== "labor in the production line"
+			![Job.CELLBLOCK, Job.ARCADE, Job.BABY_FACTORY].includes(slave.assignment) &&
+			(slave.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2)
 		) {
 			V.averageTrust += slave.trust * 0.5;
 			V.averageDevotion += slave.devotion * 0.5;
diff --git a/src/endWeek/player/prLongTermPhysicalEffects.js b/src/endWeek/player/prLongTermPhysicalEffects.js
index 602390e37db21028843c6b911ead48f011ca647c..77f4d5ec1ebfe45a55b09f40d6ab17d466fc0c21 100644
--- a/src/endWeek/player/prLongTermPhysicalEffects.js
+++ b/src/endWeek/player/prLongTermPhysicalEffects.js
@@ -989,31 +989,29 @@ App.EndWeek.Player.longTermPhysicalEffects = function(PC = V.PC) {
 			}
 		}
 
-		if (PC.weight >= 100) {
-			if (PC.weight > 190) {
-				r.push(`Your extreme obesity <span class="health dec">directly impacts</span> your health, but since you let yourself get this large, it's not really that bothersome.`);
-				healthDamage(PC, 2);
-				if (random(1, 100 + PC.health.condition) < 5) {
-					r.push(`Unfortunately, this week ushered in <span class="health dec">severe health complications</span> related to it. After extensive, <span class="cash">and very costly,</span> heart surgery, your life was saved, though you'd better set aside some ¤ for when it happens again.`);
-					cashX(forceNeg(15000), "PCmedical");
-					healthDamage(PC, 80);
-				}
-			} else if (PC.weight > 160) {
-				if (random(1, 150 + PC.health.condition) < 5) {
-					r.push(`Your obesity has brought <span class="health dec">severe health complications</span> upon you this week. They required extensive, <span class="cash">and costly,</span> surgery to correct, so it may be time to pay more mind to your wellbeing.`);
-					cashX(forceNeg(5000), "PCmedical");
-					healthDamage(PC, 40);
-				}
-			} else if (PC.weight > 130) {
-				if (random(1, 175 + PC.health.condition) < 5) {
-					r.push(`Your weight caused you some <span class="health dec">severe health complications</span> this week. They passed after some time, but are rather concerning.`);
-					healthDamage(PC, 20);
-				}
-			} else if (PC.weight > 95) {
-				if (random(1, 200 + PC.health.condition) < 5) {
-					r.push(`Your weight caused you some <span class="health dec">minor health complications</span> this week. It passed quickly enough, and shouldn't be a real problem.`);
-					healthDamage(PC, 5);
-				}
+		if (PC.weight > 190) {
+			r.push(`Your extreme obesity <span class="health dec">directly impacts</span> your health, but since you let yourself get this large, it's not really that bothersome.`);
+			healthDamage(PC, 2);
+			if (random(1, 100 + PC.health.condition) < 5) {
+				r.push(`Unfortunately, this week ushered in <span class="health dec">severe health complications</span> related to it. After extensive, <span class="cash">and very costly,</span> heart surgery, your life was saved, though you'd better set aside some ¤ for when it happens again.`);
+				cashX(forceNeg(15000), "PCmedical");
+				healthDamage(PC, 80);
+			}
+		} else if (PC.weight > 160) {
+			if (random(1, 150 + PC.health.condition) < 5) {
+				r.push(`Your obesity has brought <span class="health dec">severe health complications</span> upon you this week. They required extensive, <span class="cash">and costly,</span> surgery to correct, so it may be time to pay more mind to your wellbeing.`);
+				cashX(forceNeg(5000), "PCmedical");
+				healthDamage(PC, 40);
+			}
+		} else if (PC.weight > 130) {
+			if (random(1, 175 + PC.health.condition) < 5) {
+				r.push(`Your weight caused you some <span class="health dec">severe health complications</span> this week. They passed after some time, but are rather concerning.`);
+				healthDamage(PC, 20);
+			}
+		} else if (PC.weight > 95) {
+			if (random(1, 200 + PC.health.condition) < 5) {
+				r.push(`Your weight caused you some <span class="health dec">minor health complications</span> this week. It passed quickly enough, and shouldn't be a real problem.`);
+				healthDamage(PC, 5);
 			}
 		}
 	}
diff --git a/src/endWeek/reports/clinicReport.js b/src/endWeek/reports/clinicReport.js
index 372ece308e4dccb679166b1048fcdc0ac22f79eb..9d559ae2137250d01cf1992be2b7b0662478240c 100644
--- a/src/endWeek/reports/clinicReport.js
+++ b/src/endWeek/reports/clinicReport.js
@@ -378,8 +378,8 @@ App.EndWeek.clinicReport = function() {
 				assignJobSafely(slave, oldJob);
 				if (slave.choosesOwnAssignment === 1) {
 					r.push(`and ${he} is resting before choosing another task.`);
-				} else if (slave.assignment === "rest") {
-					if (oldJob !== "rest") {
+				} else if (slave.assignment === Job.REST) {
+					if (oldJob !== Job.REST) {
 						r.push(`and since ${he} was unable to return to ${his} old task to ${oldJob}, ${his} assignment has defaulted to rest.`);
 					} else {
 						r.push(`so ${he} has returned to rest.`);
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index 33a654b76494797f3f4f1b537c3019f1387c3d0d..61def6f566f0b30de55a8690240bfc14a89a2cd5 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -28,16 +28,16 @@ App.EndWeek.penthouseReport = function() {
 		if (slave.ID === V.HeadGirlID && hgSlave) {
 			/* Output the HG's slave immediately after the hg */
 			const {He2, he2} = getPronouns(hgSlave).appendSuffix("2");
-			const hgSlaveEntry = App.UI.DOM.appendNewElement("div", el, '', "slave-report");
+			const hgSlaveEntry = App.UI.DOM.appendNewElement("div", el, '', ["slave-report"]);
 			if (hgSlave.assignment !== Job.HEADGIRLSUITE) {
-				App.UI.DOM.appendNewElement("span", hgSlaveEntry, `${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.`, "warning");
+				App.UI.DOM.appendNewElement("span", hgSlaveEntry, `${hgSlave.slaveName} had been assigned to live with your Head Girl, but this week ${he2} was assigned to ${hgSlave.assignment}. ${He2} has been released to your penthouse for reassignment.`, ["warning"]);
 				removeJob(hgSlave, Job.HEADGIRLSUITE);
 			} else {
 				if (penthouseArtRenderer) {
 					App.UI.DOM.drawOneSlaveRight(hgSlaveEntry, hgSlave, penthouseArtRenderer);
 				}
 				App.SlaveAssignment.appendSlaveLinks(hgSlaveEntry, hgSlave);
-				App.UI.DOM.appendNewElement("span", hgSlaveEntry, SlaveFullName(hgSlave), "slave-name");
+				App.UI.DOM.appendNewElement("span", hgSlaveEntry, SlaveFullName(hgSlave), ["slave-name"]);
 				if (hgSlave.choosesOwnAssignment === 2) {
 					hgSlaveEntry.append(App.SlaveAssignment.choosesOwnJob(hgSlave), ` ${He2}`);
 				}
@@ -66,51 +66,51 @@ App.EndWeek.penthouseReport = function() {
 		let r = [];
 		let milkResults;
 
-		r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), "slave-name"));
+		r.push(App.UI.DOM.makeElement("span", SlaveFullName(slave), ["slave-name"]));
 		if (slave.choosesOwnAssignment === 2) {
 			r.push(App.SlaveAssignment.choosesOwnJob(slave));
 			r.push(He);
 		}
 
 		switch (slave.assignment) {
-			case "rest":
+			case Job.REST:
 				r.push(App.SlaveAssignment.rest(slave));
 				break;
-			case "whore":
+			case Job.WHORE:
 				r.push(App.SlaveAssignment.whore(slave));
 				break;
-			case "serve the public":
+			case Job.PUBLIC:
 				r.push(App.SlaveAssignment.serveThePublic(slave));
 				break;
-			case "work a glory hole":
+			case Job.GLORYHOLE:
 				r.push(App.SlaveAssignment.workAGloryHole(slave));
 				break;
-			case "get milked":
+			case Job.MILKED:
 				milkResults = App.SlaveAssignment.getMilked(slave);
 				r.push(milkResults.text);
 				break;
-			case "take classes":
+			case Job.CLASSES:
 				r.push(App.SlaveAssignment.takeClasses(slave));
 				break;
-			case "please you":
+			case Job.FUCKTOY:
 				r.push(App.SlaveAssignment.pleaseYou(slave));
 				break;
-			case "be a subordinate slave":
+			case Job.SUBORDINATE:
 				r.push(App.SlaveAssignment.serveYourOtherSlaves(slave));
 				break;
-			case "be a servant":
+			case Job.HOUSE:
 				r.push(App.SlaveAssignment.servant(slave));
 				break;
-			case "stay confined":
+			case Job.CONFINEMENT:
 				r.push(App.SlaveAssignment.stayConfined(slave).text);
 				break;
-			case "guard you":
+			case Job.BODYGUARD:
 				r.push(App.SlaveAssignment.guardYou(slave));
 				break;
-			case "be your Head Girl":
+			case Job.HEADGIRL:
 				r.push(App.SlaveAssignment.beYourHeadGirl(slave));
 				break;
-			case "recruit girls":
+			case Job.RECRUITER:
 				r.push(App.SlaveAssignment.recruitGirls(slave));
 				break;
 			default:
@@ -118,7 +118,7 @@ App.EndWeek.penthouseReport = function() {
 				r.push(App.SlaveAssignment.rest(slave));
 		}
 
-		if (V.servantMilkers === 1 && slave.lactation > 0 && slave.assignment !== "get milked") {
+		if (V.servantMilkers === 1 && slave.lactation > 0 && slave.assignment !== Job.MILKED) {
 			r.push(`${His} assignment`);
 			if (App.Data.misc.servantMilkersJobs.includes(slave.assignment)) {
 				r.push(`is not strenuous, so ${he}`);
diff --git a/src/endWeek/reports/schoolroomReport.js b/src/endWeek/reports/schoolroomReport.js
index 5c64a0174d5d0b4cd95f2383d6651de44d45bd42..dc32b6e563a82e0a08ebb78185f1b9891afd3266 100644
--- a/src/endWeek/reports/schoolroomReport.js
+++ b/src/endWeek/reports/schoolroomReport.js
@@ -204,8 +204,8 @@ App.EndWeek.schoolroomReport = function() {
 				assignJobSafely(slave, oldJob);
 				if (slave.choosesOwnAssignment === 1) {
 					r.push(`and ${he} is resting before choosing another task.`);
-				} else if (slave.assignment === "rest") {
-					if (oldJob !== "rest") {
+				} else if (slave.assignment === Job.REST) {
+					if (oldJob !== Job.REST) {
 						r.push(`and since ${he} was unable to return to ${his} old task to ${oldJob}, ${his} assignment has defaulted to rest.`);
 					} else {
 						r.push(`so ${he} has returned to rest.`);
diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js
index bdb0208d91da6eca08a6d6108060bff044101fa2..78c93a24f1a4f42f0c1146aa31c2aeef68849156 100644
--- a/src/endWeek/reports/spaReport.js
+++ b/src/endWeek/reports/spaReport.js
@@ -354,8 +354,8 @@ App.EndWeek.spaReport = function() {
 				assignJobSafely(slave, oldJob);
 				if (slave.choosesOwnAssignment === 1) {
 					r.push(`and ${he} is resting before choosing another task.`);
-				} else if (slave.assignment === "rest") {
-					if (oldJob !== "rest") {
+				} else if (slave.assignment === Job.REST) {
+					if (oldJob !== Job.REST) {
 						r.push(`and since ${he} was unable to return to ${his} old task to ${oldJob}, ${his} assignment has defaulted to rest.`);
 					} else {
 						r.push(`so ${he} has returned to rest.`);
diff --git a/src/endWeek/saGuardYou.js b/src/endWeek/saGuardYou.js
index 48c40fa5bf082a280e922dfd594f9dd419abb6a8..4ab6b852e2663e160d4a19b5f0a4c224250b435a 100644
--- a/src/endWeek/saGuardYou.js
+++ b/src/endWeek/saGuardYou.js
@@ -239,7 +239,6 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 			slave.devotion += 1;
 		} else {
 			r.push(`Between protecting you, training, and keeping vigil while you sleep, ${he} lives a <span class="health dec">very tiring</span> life.`);
-			/** ##Note I assume these two are health effects **/
 		}
 		tired(slave);
 	}
@@ -281,9 +280,9 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 					}
 				}
 				if (!candidate) {
-					if (V.ConcubineID !== 0 && S.Concubine.skill.combat === 0 && S.Concubine.devotion > 50 && S.Concubine.muscles >= -30 && S.Concubine.weight < 150 && S.Concubine.butt < 10 && S.Concubine.boobs < 25000 && S.Concubine.belly < 5000 && S.Concubine.balls < 20 && S.Concubine.dick < 15 && S.Concubine.fuckdoll === 0 && S.Concubine.fetish !== "mindbroken" && canWalk(S.Concubine)) {
+					if (V.ConcubineID !== 0 && S.Concubine.skill.combat === 0 && S.Concubine.devotion > 50 && S.Concubine.muscles >= -30 && S.Concubine.weight < 160 && S.Concubine.butt < 10 && S.Concubine.boobs < 25000 && S.Concubine.belly < 5000 && S.Concubine.balls < 20 && S.Concubine.dick < 15 && S.Concubine.fuckdoll === 0 && S.Concubine.fetish !== "mindbroken" && canWalk(S.Concubine)) {
 						r.push(`${He} does ${his} best to train ${S.Concubine.slaveName} whenever ${he} can, hoping that your Concubine can be made capable of stepping into ${his} place.`);
-						if (S.Concubine.boobs >= 8000 || S.Concubine.butt >= 10 || S.Concubine.belly >= 5000 || S.Concubine.balls >= 10 || S.Concubine.dick >= 10 || S.Concubine.muscles < 0 || S.Concubine.weight >= 100) {
+						if (S.Concubine.boobs >= 8000 || S.Concubine.butt >= 10 || S.Concubine.belly >= 5000 || S.Concubine.balls >= 10 || S.Concubine.dick >= 10 || S.Concubine.muscles < 0 || S.Concubine.weight >= 130) {
 							r.push(`${His} body is poorly suited for combat, but ${he} can learn to work around it with enough effort.`);
 							flawedTrainee = jsRandom(0, 50);
 						}
@@ -291,7 +290,7 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 					}
 				}
 				if (!candidate) {
-					if (V.WardenessID !== 0 && S.Wardeness.skill.combat === 0 && S.Wardeness.fetish !== "mindbroken" && bodyguardSuccessorEligible(S.Wardeness)) {
+					if (V.WardenessID !== 0 && S.Wardeness.skill.combat === 0 && bodyguardSuccessorEligible(S.Wardeness)) {
 						r.push(`${He} does ${his} best to train ${S.Wardeness.slaveName} whenever ${he} can, hoping that your Wardeness can be made capable of stepping into ${his} place.`);
 						candidate = S.Wardeness;
 					}
diff --git a/src/endWeek/saLiveWithHG.js b/src/endWeek/saLiveWithHG.js
index 345ff4354e7797bbbf3bde040cae776eb167e2f8..d38389b0731f550968863dd421a00977b74d5875 100644
--- a/src/endWeek/saLiveWithHG.js
+++ b/src/endWeek/saLiveWithHG.js
@@ -93,7 +93,7 @@ App.SlaveAssignment.liveWithHG = function saliveWithHG(slave) {
 			} else {
 				t.push(`and keeps ${him} on ${his} fertility diet.`);
 			}
-		} else if ((slave.weight < 100 && arcology.FSHedonisticDecadence >= 20) || (slave.weight < -10)) {
+		} else if ((slave.weight < 130 && arcology.FSHedonisticDecadence >= 20) || (slave.weight < -10)) {
 			t.push(`${HG.slaveName} thinks ${slave.slaveName} could use a little extra weight`);
 			if (arcology.FSHedonisticDecadence >= 20) {
 				t.push(`since plump ${girl}s are all the rage in your arcology`);
diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js
index 04b70afe184d7369f03873bc0bcf9eb52ac21b0a..cdcb493e961025c590980fedb65ee1bb70e53369 100644
--- a/src/endWeek/saLongTermEffects.js
+++ b/src/endWeek/saLongTermEffects.js
@@ -17,7 +17,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 	if (slave.fuckdoll > 0) {
 		fuckdollConversion(slave);
 	}
-	if (assignmentVisible(slave) && (slave.assignment !== "live with your Head Girl" || V.HGSuiteSurgery === 0)) {
+	if (assignmentVisible(slave) && (slave.assignment !== Job.HEADGIRLSUITE || V.HGSuiteSurgery === 0)) {
 		if (hasSurgeryRule(slave, V.defaultRules) && slave.useRulesAssistant === 1 && slave.indentureRestrictions < 2 && V.cash > 0) {
 			r.push(rulesAutosurgery(slave));
 		}
@@ -2274,7 +2274,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 	 *
 	 */
 	function mainLaborTriggers(slave) {
-		if (slave.pregControl !== "labor suppressors" && slave.assignment !== "labor in the production line") {
+		if (slave.pregControl !== "labor suppressors" && slave.assignment !== Job.BABY_FACTORY) {
 			if (slave.broodmother < 1) {
 				if (WombBirthReady(slave, slave.pregData.normalBirth * 1.075) > 0) {
 					// check for really ready fetuses - 43 weeks - max, overdue
@@ -2295,7 +2295,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 		}
 		if (V.dangerousPregnancy === 1 && !isInLabor(slave)) {
 			let miscarriage = 0;
-			if (((slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting < 2) && slave.pregAdaptation < 500 && slave.broodmother < 1) || (slave.preg > slave.pregData.normalBirth / 2 && slave.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2))) {
+			if (((slave.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2) && slave.pregAdaptation < 500 && slave.broodmother < 1) || (slave.preg > slave.pregData.normalBirth / 2 && slave.womb.find((ft) => ft.genetics.geneticQuirks.polyhydramnios === 2))) {
 				let miscarriageChance = -10;
 				miscarriageChance += ((slave.bellyPreg / 1000) - slave.pregAdaptation);
 				// this could use to not be linear
@@ -2314,13 +2314,13 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 				if (slave.weight < -50) {
 					miscarriageChance -= slave.weight;
 				}
-				if (V.masterSuitePregnancySlaveLuxuries === 1 && (slave.assignment === "serve in the master suite" || slave.assignment === "be your Concubine")) {
+				if (V.masterSuitePregnancySlaveLuxuries === 1 && (slave.assignment === Job.MASTERSUITE || slave.assignment === Job.CONCUBINE)) {
 					miscarriageChance -= 300;
-				} else if (slave.assignment === "rest") {
+				} else if (slave.assignment === Job.REST) {
 					miscarriageChance -= 100;
-				} else if (slave.assignment === "rest in the spa") {
+				} else if (slave.assignment === Job.SPA) {
 					miscarriageChance -= 50;
-				} else if (slave.assignment === "get treatment in the clinic") {
+				} else if (slave.assignment === Job.CLINIC) {
 					if (S.Nurse) {
 						miscarriageChance -= 200;
 					} else {
@@ -2478,13 +2478,13 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 							if (slave.pregControl === "slow gestation") {
 								burstChance -= 20;
 							}
-							if (slave.assignment === "get treatment in the clinic") {
+							if (slave.assignment === Job.CLINIC) {
 								if (S.Nurse) {
 									burstChance -= 100;
 								} else {
 									burstChance -= 30;
 								}
-							} else if (slave.assignment === "work in the dairy" && V.dairyPregSetting === 3) {
+							} else if (slave.assignment === Job.DAIRY && V.dairyPregSetting === 3) {
 								burstChance -= 250;
 							}
 							if (slave.pregControl === "speed up") {
@@ -2520,7 +2520,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 		if (burstCheck(slave)) {
 			// already scheduled for a different kind of death
 		} else {
-			if (slave.health.health <= -90 && slave.assignment !== "get treatment in the clinic") {
+			if (slave.health.health <= -90 && slave.assignment !== Job.CLINIC) {
 				deathSeed = (slave.health.health - slave.physicalAge - (slave.chem * 2) - (slave.addict * 2));
 				if (slave.weight < -50 || slave.weight > 95) {
 					deathSeed -= 100;
diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js
index 82923894e546a7d27f22c365550c38c00e7333de..7e5df5ac31a7d00cea45df3956112940db27adb8 100644
--- a/src/endWeek/saLongTermMentalEffects.js
+++ b/src/endWeek/saLongTermMentalEffects.js
@@ -1264,7 +1264,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				} else if (V.feeder !== 0) {
 					r.push(`${His} paraphilia is satisfied by the way ${he} gets to eat.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "work in the dairy" && V.dairyFeedersSetting > 0) {
+				} else if (slave.assignment === Job.DAIRY && V.dairyFeedersSetting > 0) {
 					// something involving cum production
 				} else {
 					r.push(`${He} doesn't seem to feel ${he}'s getting enough cum, leaving the cum addict <span class="devotion dec">depressed and anxious.</span>`);
@@ -1301,7 +1301,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				} else if (plugWidth(slave) > 2) {
 					r.push(`${His} paraphilia is satisfied by the enormous plug ${he} wears in ${his} ass.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "work in the dairy" && V.dairyStimulatorsSetting > 0) {
+				} else if (slave.assignment === Job.DAIRY && V.dairyStimulatorsSetting > 0) {
 					// major ass drilling
 				} else {
 					r.push(`${He} doesn't seem to feel ${he}'s getting buttfucked often enough, leaving the anal addict <span class="devotion dec">depressed and anxious.</span>`);
@@ -1341,10 +1341,10 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				} else if (["whore", "serve the public", "work in the brothel", "serve in the club", "be the DJ"].includes(slave.assignment)) {
 					r.push(`${His} paraphilia is satisfied by how often ${he} gets publicly fucked at work.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "recruit girls" && V.recruiterTarget === "other arcologies" && V.arcologies[0].influenceTarget !== -1) {
+				} else if (slave.assignment === Job.RECRUITER && V.recruiterTarget === "other arcologies" && V.arcologies[0].influenceTarget !== -1) {
 					r.push(`${His} paraphilia is satisfied by the sheer amount of attention ${he} gets as a sexual Ambassador.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be the Schoolteacher" && V.schoolroom >= 20) {
+				} else if (slave.assignment === Job.TEACHER && V.schoolroom >= 20) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as a sexual instructor; enough eyes are fixated on ${his} lessons.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (App.Data.clothes.get(slave.clothes).exposure >= 4) {
@@ -1425,16 +1425,16 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 						slave.devotion -= 3;
 					}
 				}
-				if (slave.assignment === "be your Head Girl") {
+				if (slave.assignment === Job.HEADGIRL) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as your Head Girl.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be the Wardeness") {
+				} else if (slave.assignment === Job.WARDEN) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as your Wardeness.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be the Stewardess") {
+				} else if (slave.assignment === Job.STEWARD) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as the Stewardess.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be the Schoolteacher") {
+				} else if (slave.assignment === Job.TEACHER) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as the Schoolteacher.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (canMove(slave) && (slave.rules.release.slaves === 1 || App.Utils.hasFamilySex(slave)) && V.universalRulesConsent === 0) {
@@ -1463,10 +1463,10 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 						slave.devotion -= 3;
 					}
 				}
-				if (slave.assignment === "be your Head Girl") {
+				if (slave.assignment === Job.HEADGIRL) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as your Head Girl.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be the Wardeness") {
+				} else if (slave.assignment === Job.WARDEN) {
 					r.push(`${His} paraphilia is satisfied by ${his} work as your Wardeness.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (canMove(slave) && (slave.rules.release.slaves === 1 || App.Utils.hasFamilySex(slave)) && V.universalRulesConsent === 0) {
@@ -1495,8 +1495,8 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 						slave.devotion -= 3;
 					}
 				}
-				const dom = (slave.assignment === "be a subordinate slave" && slave.subTarget > 0) ? getSlave(slave.subTarget) : null;
-				if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting >= 2) {
+				const dom = (slave.assignment === Job.SUBORDINATE && slave.subTarget > 0) ? getSlave(slave.subTarget) : null;
+				if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting >= 2) {
 					r.push(`${His} paraphilia is satisfied by ${his} horrible life as a producer of useful fluids and a receptacle for machine rape.`);
 					slave.paraphiliaSatisfied = 1;
 				} else if (["be confined in the arcade", "work a glory hole"].includes(slave.assignment)) {
@@ -1538,7 +1538,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				} else if (["be your Concubine", "please you", "serve in the master suite"].includes(slave.assignment)) {
 					r.push(`${His} paraphilia is satisfied by how ${he}'s expected to serve your sexual needs at work.`);
 					slave.paraphiliaSatisfied = 1;
-				} else if (slave.assignment === "be a subordinate slave") {
+				} else if (slave.assignment === Job.SUBORDINATE) {
 					r.push(`${His} paraphilia is satisfied by how ${he}'s expected to serve other slaves' sexual needs.`);
 					slave.paraphiliaSatisfied = 1;
 				} else {
@@ -1728,7 +1728,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				}
 				break;
 			case "a bioreactor":
-				if (V.dairyRestraintsSetting < 2 || slave.assignment !== "work in the dairy" && slave.assignment !== "get milked") {
+				if (V.dairyRestraintsSetting < 2 || slave.assignment !== Job.DAIRY && slave.assignment !== Job.MILKED) {
 					r.push(`${He} remembers what it was like to be a living, breathing, milk-jetting,`);
 					if (isFertile(slave) && (V.dairyPregUpgrade > 0)) {
 						r.push(`baby-filled,`);
@@ -1743,7 +1743,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				break;
 			case "a Futanari Sister":
 				if (V.masterSuiteUpgradeLuxury === 2) {
-					if (slave.assignment === "serve in the master suite") {
+					if (slave.assignment === Job.MASTERSUITE) {
 						r.push(`As a former Futanari Sister, the fuckpit in ${V.masterSuiteName} feels like home to ${him}, and ${he} has <span class="trust inc">no desire to ever leave.</span>`);
 						slave.trust += 1;
 					} else {
@@ -1789,7 +1789,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 	 *
 	 */
 	function organicFetishDevelopments(slave) {
-		if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
+		if (slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) {
 			if (slave.lactation > 0) {
 				if (slave.fetishStrength <= 95) {
 					if (slave.fetish !== "boobs") {
@@ -1868,7 +1868,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 				if (slave.vagina > -1 && !canDoVaginal(slave)) {
 					if (slave.fetishStrength <= 95) {
 						if (fetishChangeChance(slave) > random(0, 100)) {
-							if (slave.assignment === "serve the public" || slave.assignment === "serve in the club") {
+							if (slave.assignment === Job.PUBLIC || slave.assignment === Job.CLUB) {
 								if (slave.fetish !== "buttslut") {
 									r.push(`With so much sexual attention focused on ${his} anus, <span class="fetish gain">${he} comes to view buttsex as the centerpiece of ${his} sexuality.</span>`);
 									slave.fetish = "buttslut";
@@ -1880,7 +1880,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 									}
 									slave.fetishStrength += 4;
 								}
-							} else if (slave.assignment === "whore" || slave.assignment === "work in the brothel") {
+							} else if (slave.assignment === Job.WHORE || slave.assignment === Job.BROTHEL) {
 								if (slave.fetish !== "buttslut") {
 									r.push(`With ${his} anus constantly sold for use, <span class="fetish gain">${he} comes to view buttsex as the centerpiece of ${his} sexuality.</span>`);
 									slave.fetish = "buttslut";
@@ -1899,7 +1899,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 					if (slave.prostate !== 0) {
 						if (slave.fetishStrength <= 95) {
 							if (fetishChangeChance(slave) > random(0, 90)) {
-								if (slave.assignment === "serve the public" || slave.assignment === "serve in the club") {
+								if (slave.assignment === Job.PUBLIC || slave.assignment === Job.CLUB) {
 									if (slave.fetish !== "buttslut") {
 										r.push(`Since most of ${his} orgasms are caused by prostate stimulation from anal sex with citizens, <span class="fetish gain">${he} comes to view ${his} asshole as ${his} primary sexual organ.</span>`);
 										slave.fetish = "buttslut";
@@ -1911,7 +1911,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 										}
 										slave.fetishStrength += 4;
 									}
-								} else if (slave.assignment === "whore" || slave.assignment === "work in the brothel") {
+								} else if (slave.assignment === Job.WHORE || slave.assignment === Job.BROTHEL) {
 									if (slave.fetish !== "buttslut") {
 										r.push(`Since most of ${his} orgasms are caused by prostate stimulation from anal sex with customers, <span class="fetish gain">${he} comes to view ${his} asshole as ${his} primary sexual organ.</span>`);
 										slave.fetish = "buttslut";
@@ -2138,7 +2138,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 							slave.sexualFlaw = "self hating";
 							slave.fetishStrength = 100;
 							FSApproves = 1;
-						} else if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting >= 2) {
+						} else if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting >= 2) {
 							r.push(`Strapped into a milking machine's tender, penetrative embrace, ${his} masochistic tendencies darken into sexual appreciation for ${his} life as a human factory. <span class="paraphilia gain">${He}'s descended into true self hatred.</span>`);
 							slave.sexualFlaw = "self hating";
 							slave.fetishStrength = 100;
@@ -2185,7 +2185,7 @@ App.SlaveAssignment.longTermMentalEffects = function saLongTermMentalEffects(sla
 							slave.sexualFlaw = "breeder";
 							slave.fetishStrength = 100;
 							FSApproves = 1;
-						} else if (slave.assignment === "work in the dairy" && V.dairyPregSetting >= 2 && slave.pregKnown === 1) {
+						} else if (slave.assignment === Job.DAIRY && V.dairyPregSetting >= 2 && slave.pregKnown === 1) {
 							r.push(`With ${his} womanhood fucked full of cum and fertility drugs, ${his} pregnancy fetish deepens into true perversity. <span class="paraphilia gain">${He}'s become obsessed with breeding.</span>`);
 							slave.sexualFlaw = "breeder";
 							slave.fetishStrength = 100;
diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js
index 909726a5b943c9a387df4cf9cc93675ecb4a91c4..cb0d9548ccf44043929e567cfbffcc67c5a08d68 100644
--- a/src/endWeek/saLongTermPhysicalEffects.js
+++ b/src/endWeek/saLongTermPhysicalEffects.js
@@ -216,8 +216,8 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 	 */
 	function holeRelaxation(slave) {
 		if (!["be confined in the arcade", "serve in the club", "serve the public", "whore", "work a glory hole", "work in the brothel"].includes(slave.assignment)) {
-			if (slave.assignment !== "serve in the master suite" || V.masterSuiteUpgradeLuxury < 2) {
-				if (slave.assignment !== "work in the dairy" || V.dairyStimulatorsSetting === 0) {
+			if (slave.assignment !== Job.MASTERSUITE || V.masterSuiteUpgradeLuxury < 2) {
+				if (slave.assignment !== Job.DAIRY || V.dairyStimulatorsSetting === 0) {
 					if (slave.geneMods.rapidCellGrowth !== 1) {
 						if (slave.vagina >= 3 && dildoWidth(slave) < 2) {
 							r.push(`With a rest from strenuous use, <span class="improvement">${his} loose vagina recovers a little.</span>`);
@@ -1067,7 +1067,7 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 				}
 			}
 			if (slave.lactationDuration === 0) {
-				if (S.Wardeness !== null && slave.assignment === "be confined in the cellblock" && (S.Wardeness.sexualFlaw === "malicious" || S.Wardeness.sexualFlaw === "abusive" || S.Wardeness.sexualFlaw === "breast growth")) {
+				if (S.Wardeness !== null && slave.assignment === Job.CELLBLOCK && (["malicious", "abusive", "breast growth"].includes(S.Wardeness.sexualFlaw))) {
 					slave.boobs -= slave.boobsMilk;
 					slave.boobsMilk = 0;
 					slave.lactationDuration = 2;
@@ -1156,7 +1156,7 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 			triggerSize = 30000;
 		}
 		if (boobSize > triggerSize) {
-			if (slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting < 2 || V.arcologies[0].FSAssetExpansionistResearch === 0) {
+			if (slave.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2 || V.arcologies[0].FSAssetExpansionistResearch === 0) {
 				if (slave.drugs !== "breast injections" && slave.drugs !== "intensive breast injections" && V.arcologies[0].FSAssetExpansionistResearch === 0) {
 					if (slave.bellyPreg < 300000 && slave.hormoneBalance < 300 && gigantomastiaMod !== 3) {
 						if (boobSize < triggerSize * 2) {
@@ -1218,7 +1218,7 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 			}
 		}
 		/*
-		if (V.masterSuitePregnancySlaveLuxuries === 1 && slave.broodmother === 2 && (slave.assignment === "serve in the master suite" || slave.assignment === "be your Concubine")) {
+		if (V.masterSuitePregnancySlaveLuxuries === 1 && slave.broodmother === 2 && (slave.assignment === Job.MASTERSUITE || slave.assignment === Job.CONCUBINE)) {
 			if (slave.diet !== "high caloric") {
 				if (slave.preg > slave.pregData.normalBirth / 2) {
 					r.push(`The pregnancy generator places heavy strain on ${him} as ${his} body <span class="health dec">consumes itself</span> to keep releasing eggs and maintain ${his} many developing babies.`);
@@ -2352,13 +2352,13 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 		}
 
 		if (V.seeExtreme === 1 && V.dangerousPregnancy === 1 && ((slave.belly > (slave.pregAdaptation * 3200)) || slave.bellyPreg > 600000) && slave.bellyPreg >= 100000) {
-			if (slave.assignment === "get treatment in the clinic") {
+			if (slave.assignment === Job.CLINIC) {
 				if (S.Nurse) {
 					r.push(`The fast actions of ${V.clinicName}'s nurse, ${S.Nurse.slaveName}, saved ${his} life a few times. <span class="health dec">${His} womb is breaking!</span>`);
 				} else {
 					r.push(`Automatic monitors in ${V.clinicName} detected critical pressure and called junior medical staff. They managed to hold ${him} together, for now; <span class="health dec">${his} womb is breaking!</span>`);
 				}
-			} else if (slave.assignment === "work in the dairy" && V.dairyPregSetting === 3) {
+			} else if (slave.assignment === Job.DAIRY && V.dairyPregSetting === 3) {
 				r.push(`Automatic monitors in ${his} harness detected ${his} womb has reached critical mass and applied a special adaptive belly corset to hold <span class="health dec">${his} breaking womb</span> together.`);
 			}
 		}
@@ -2950,35 +2950,33 @@ App.SlaveAssignment.longTermPhysicalEffects = function saLongTermPhysicalEffects
 			}
 		}
 
-		if (slave.weight >= 100) {
-			if (slave.weight > 190) {
-				if (slave.curatives !== 1) {
-					r.push(`${His} extreme obesity <span class="health dec">directly affects</span> ${his} health.`);
-					healthDamage(slave, 2);
-				}
-				if (random(1, 200) < 5) {
-					r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After extensive surgery, ${his} health was stabilized, though ${his} survival is not assured.`);
-					healthDamage(slave, 80);
-				}
-			} else if (slave.weight > 160) {
-				if (slave.curatives !== 1) {
-					r.push(`${His} obesity <span class="health dec">directly affects</span> ${his} health.`);
-					healthDamage(slave, 1);
-				}
-				if (random(1, 200) < 5) {
-					r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After extensive surgery, ${his} health was stabilized.`);
-					healthDamage(slave, 40);
-				}
-			} else if (slave.weight > 130) {
-				if (random(1, 200) < 5) {
-					r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After some rest, ${he} recovered.`);
-					healthDamage(slave, 20);
-				}
-			} else if (slave.weight > 95) {
-				if (random(1, 200) < 5) {
-					r.push(`${He} experienced <span class="health dec">minor health complications</span> due to ${his} weight this week. After some rest, ${he} recovered.`);
-					healthDamage(slave, 5);
-				}
+		if (slave.weight > 190) {
+			if (slave.curatives !== 1) {
+				r.push(`${His} extreme obesity <span class="health dec">directly affects</span> ${his} health.`);
+				healthDamage(slave, 2);
+			}
+			if (random(1, 200) < 5) {
+				r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After extensive surgery, ${his} health was stabilized, though ${his} survival is not assured.`);
+				healthDamage(slave, 80);
+			}
+		} else if (slave.weight > 160) {
+			if (slave.curatives !== 1) {
+				r.push(`${His} obesity <span class="health dec">directly affects</span> ${his} health.`);
+				healthDamage(slave, 1);
+			}
+			if (random(1, 200) < 5) {
+				r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After extensive surgery, ${his} health was stabilized.`);
+				healthDamage(slave, 40);
+			}
+		} else if (slave.weight > 130) {
+			if (random(1, 200) < 5) {
+				r.push(`${He} experienced <span class="health dec">severe health complications</span> due to ${his} weight this week. After some rest, ${he} recovered.`);
+				healthDamage(slave, 20);
+			}
+		} else if (slave.weight > 95) {
+			if (random(1, 200) < 5) {
+				r.push(`${He} experienced <span class="health dec">minor health complications</span> due to ${his} weight this week. After some rest, ${he} recovered.`);
+				healthDamage(slave, 5);
 			}
 		}
 	}
diff --git a/src/endWeek/saPregnancy.js b/src/endWeek/saPregnancy.js
index 27fb4cbede5f774f05e7e14dd15a3800758d6cc3..766ddca086d0578850b520c7e12540112c02cf4f 100644
--- a/src/endWeek/saPregnancy.js
+++ b/src/endWeek/saPregnancy.js
@@ -414,7 +414,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 		}
 		switch (slave.pregControl) {
 			case "speed up":
-				if (!S.Nurse || slave.assignment !== "get treatment in the clinic") {
+				if (!S.Nurse || slave.assignment !== Job.CLINIC) {
 					if (slave.pregType >= 20 && slave.devotion <= 20 && slave.trust <= 50) {
 						if (slave.sexualFlaw === "self hating") {
 							r.push(`${He} is <span class="devotion inc">delirious with joy</span> over ${his} straining womb. Every week ${he} gets bigger, fuller and tighter; in ${his} mind, it won't be long until ${he} bursts, bringing ${his} children into the world.`);
@@ -672,7 +672,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 			const boobSize = slave.boobs - slave.boobsImplant - slave.boobsMilk;
 			const buttSize = slave.butt - slave.buttImplant;
 			const hipSize = slave.hips - slave.hipsImplant;
-			if (slave.pregType >= 30 && (((slave.assignment === "be your Concubine" || slave.assignment === "serve in the master suite") && V.masterSuitePregnancySlaveLuxuries === 1) || slave.diet === "high caloric")) {
+			if (slave.pregType >= 30 && (((slave.assignment === Job.CONCUBINE || slave.assignment === Job.MASTERSUITE) && V.masterSuitePregnancySlaveLuxuries === 1) || slave.diet === "high caloric")) {
 				if (slave.weight <= 65) {
 					r.push(`${He} has <span class="change positive">gained weight</span> in order to better sustain ${himself} and ${his} children.`);
 					slave.weight += 1;
@@ -775,7 +775,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 		if (isFertile(slave)) {
 			needToBreed(slave);
 		}
-		if (canGetPregnant(slave) && ((slave.assignment === "work in the dairy" && V.dairyPregSetting === 0) || slave.assignment !== "work in the dairy")) {
+		if (canGetPregnant(slave) && ((slave.assignment === Job.DAIRY && V.dairyPregSetting === 0) || slave.assignment !== Job.DAIRY)) {
 			impregnation(slave);
 		}
 		if (slave.ovaImplant === "asexual" && isFertile(slave) && (slave.preg === 0 || (slave.preg >= 0 && slave.geneticQuirks.superfetation === 2))) {
@@ -1621,7 +1621,7 @@ App.SlaveAssignment.pregnancy = function saPregnancy(slave) {
 					if (pcCanKnockUpSlave(slave)) {
 						pcDoKnockUpSlave(slave);
 					} else { // look for a random father among master suite slaves
-						const msSlaves = V.slaves.filter((s) => s.assignment === "serve in the master suite").shuffle();
+						const msSlaves = V.slaves.filter((s) => s.assignment === Job.MASTERSUITE).shuffle();
 						for (const msSlave of msSlaves) {
 							if (canImpreg(slave, msSlave) && App.Utils.sexAllowed(slave, msSlave)) {
 								/* catch for self-impregnation */
diff --git a/src/endWeek/saRules.js b/src/endWeek/saRules.js
index f76ffc75a756a6dae7191a9f1ae1d13e9043099d..0773271fe34b427805e4760aa16f361c65234451 100644
--- a/src/endWeek/saRules.js
+++ b/src/endWeek/saRules.js
@@ -2570,7 +2570,7 @@ App.SlaveAssignment.rules = function(slave) {
 
 					r.push(App.EndWeek.Rules.speechRules(slave));
 
-					if (slave.assignment !== "be your Head Girl" && slave.assignment !== "guard you") {
+					if (slave.assignment !== Job.HEADGIRL && slave.assignment !== Job.BODYGUARD) {
 						if (V.roomsPopulation > V.rooms) {
 							if (slave.rules.living === "luxurious") {
 								r.push(`There are <span class="yellow">too many slaves for the penthouse's individual rooms,</span> so ${he} moves out into the dormitory.`);
diff --git a/src/events/PESS/pessMadamStrategy.js b/src/events/PESS/pessMadamStrategy.js
index c0a7949c37bbee90350573f508ed0bad2c62d971..f4565873d12d4ce24110b49724c979b41aae82e5 100644
--- a/src/events/PESS/pessMadamStrategy.js
+++ b/src/events/PESS/pessMadamStrategy.js
@@ -30,7 +30,7 @@ App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEv
 		function review() {
 			S.Madam.devotion += 4;
 			for (const slave of V.slaves) {
-				if (slave.assignment === "work in the brothel") {
+				if (slave.assignment === Job.BROTHEL) {
 					if (slave.skill.oral < 100) {
 						slave.skill.oral += 5;
 					} else if (slave.skill.anal < 100) {
@@ -46,7 +46,7 @@ App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEv
 		function surgery() {
 			S.Madam.devotion += 4;
 			for (const slave of V.slaves) {
-				if (slave.assignment === "work in the brothel") {
+				if (slave.assignment === Job.BROTHEL) {
 					if (slave.boobs < 400) {
 						slave.boobs += 200;
 						slave.boobsImplant += 200;
diff --git a/src/events/PETS/petsNurseMolestation.js b/src/events/PETS/petsNurseMolestation.js
index 18e79ef74d57b0249f2da3c993a094efe89a3605..65da7408a9944ce4c4fe92ce9a1dba7738bd293d 100644
--- a/src/events/PETS/petsNurseMolestation.js
+++ b/src/events/PETS/petsNurseMolestation.js
@@ -71,7 +71,7 @@ App.Events.petsNurseMolestation = class petsNurseMolestation extends App.Events.
 			}
 			actX(S.Nurse, "oral", 20);
 			V.slaves.forEach(function(s) {
-				if (s.assignment === "get treatment in the clinic") {
+				if (s.assignment === Job.CLINIC) {
 					s.trust += 2;
 				}
 			});
diff --git a/src/events/RE/reCitizenHookup.js b/src/events/RE/reCitizenHookup.js
index c4c71ac0758e6a1e85ea856ff1899a828bbb976c..39e8a0b1379ad0c95dfe6d82801a67239bd7718f 100644
--- a/src/events/RE/reCitizenHookup.js
+++ b/src/events/RE/reCitizenHookup.js
@@ -514,7 +514,7 @@ App.Events.RECitizenHookup = class RECitizenHookup extends App.Events.BaseEvent
 				default:
 					r.push(`hot young body`);
 			}
-			r.push(`is obvious to everyone. The message is clear, and your guest of honor is the center of attention as you take her there in view of the arcology's leading citizens. Naturally, the story percolates, making it clear that there's nothing you won't do to <span class="green">further acceptance of ${fsArray.length > 0 ? FutureSocieties.displayAdj(FS) : "societal"}} principles.</span>`);
+			r.push(`is obvious to everyone. The message is clear, and your guest of honor is the center of attention as you take her there in view of the arcology's leading citizens. Naturally, the story percolates, making it clear that there's nothing you won't do to <span class="green">further acceptance of ${fsArray.length > 0 ? FutureSocieties.displayAdj(FS) : "societal"} principles.</span>`);
 
 			App.Events.addParagraph(frag, r);
 			return frag;
diff --git a/src/events/RE/reMalefactor.js b/src/events/RE/reMalefactor.js
index dd59eb54575b250d0271e826835dbe2d9c7a07bc..fd2f9c636917ffaa3e9ae9b446233c27c1a2580e 100644
--- a/src/events/RE/reMalefactor.js
+++ b/src/events/RE/reMalefactor.js
@@ -232,35 +232,35 @@ App.Events.REMalefactor = class REMalefactor extends App.Events.BaseEvent {
 			cashX(forceNeg(contractCost), "slaveTransfer", slave);
 			switch (malefactor) {
 				case "addict":
-					r.push(`You declare ${his} holes fair game for the entire arcology, since ${he} must somehow repay ${his} debt to society. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology, since ${he} must somehow repay ${his} debt to society. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "escapee":
-					r.push(`You declare ${his} holes fair game for the entire arcology, so that all free citizens can own ${him} for a moment, if they wish. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology, so that all free citizens can own ${him} for a moment, if they wish. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "orphanloli":
 					r.push(`You declare ${his} holes fair game for the entire arcology, so that all free citizens can own ${him} for a moment, if they wish. ${He} spends a torturous day in the stocks before being hauled in for enslavement, <span class="health dec">completely broken</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					applyMindbroken(slave, slave.intelligence);
 					break;
 				case "anchorBaby":
-					r.push(`You declare ${his} holes fair game for the entire arcology; since ${he} wants to produce future slaves, your arcology might as well have the privilege of fathering them. ${He} spends a torturous day in the stocks after ${his} children are taken to a slave orphanage before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology; since ${he} wants to produce future slaves, your arcology might as well have the privilege of fathering them. ${He} spends a torturous day in the stocks after ${his} children are taken to a slave orphanage before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "businesswoman":
-					r.push(`You declare ${his} holes fair game for the entire arcology, in payment for ${his} crimes. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology, in payment for ${his} crimes. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "whore":
-					r.push(`You declare ${his} holes fair game for the entire arcology, to repay ${his} thefts. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology, to repay ${his} thefts. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "rapist":
-					r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "mule":
-					r.push(`You declare ${his} holes fair game for the entire arcology as punishment for trying to smuggle in a load instead of taking one. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology as punishment for trying to smuggle in a load instead of taking one. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 					break;
 				case "liberator":
-					r.push(`Slaveownership is the cornerstone of the society you're building in your arcology, and this ${woman} attempted to undermine it. ${His} holes are thus fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun,</span> and small slaveholders are <span class="green">encouraged to do business with your arcology</span> after word of the incident gets around.`);
+					r.push(`Slaveownership is the cornerstone of the society you're building in your arcology, and this ${woman} attempted to undermine it. ${His} holes are thus fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun,</span> and small slaveholders are <span class="green">encouraged to do business with your arcology</span> after word of the incident gets around.`);
 					break;
 				case "passfail":
-					r.push(`You declare ${his} holes fair game for the entire arcology; after all, ${he} did want to be around lots of ${fakeRace} people, didn't ${he}? ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
+					r.push(`You declare ${his} holes fair game for the entire arcology; after all, ${he} did want to be around lots of ${fakeRace} people, didn't ${he}? ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(slave.vagina > -1) ? ' and <span class="lime">fucked-out</span> pussy' : ""}. The public <span class="reputation inc">enjoys the fun.</span>`);
 			}
 			repX(500, "event", slave);
 			V.arcologies[0].prosperity += 2;
@@ -421,34 +421,34 @@ App.Events.REMalefactor = class REMalefactor extends App.Events.BaseEvent {
 			cashX(forceNeg(contractCost), "slaveTransfer", slave);
 			switch (malefactor) {
 				case "addict":
-					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs for a fix until ${he} realizes what's coming, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
+					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs for a fix until ${he} realizes what's coming, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
 					break;
 				case "escapee":
-					r.push(`An example must be made. If ${he} escaped once with ${his} tendons clipped, ${he} must be rather talented at it. It remains to be seen if ${he} can manage to escape with neither arms nor legs, so you announce ${his} sentence to the crowd and send ${his} unconscious form for reduction. Of course, <span class="health.dec">${his} health is affected.</span> The public <span class="reputation inc">approves of this harshness,</span> believing that you have taken strong measures against escapees.`);
+					r.push(`An example must be made. If ${he} escaped once with ${his} tendons clipped, ${he} must be rather talented at it. It remains to be seen if ${he} can manage to escape with neither arms nor legs, so you announce ${his} sentence to the crowd and send ${his} unconscious form for reduction. Of course, <span class="health dec">${his} health is affected.</span> The public <span class="reputation inc">approves of this harshness,</span> believing that you have taken strong measures against escapees.`);
 					break;
 				case "orphanloli":
-					r.push(`An example must be made. If ${he} thinks ${he} can escape captivity and steal to survive, let's see ${him} try without arms and legs, so you announce ${his} sentence to the crowd and send ${his} unconscious form for reduction. Of course, <span class="health.dec">${his} health is affected.</span> The public <span class="reputation inc">approves of this harshness,</span> believing that you have taken strong measures against escapees.`);
+					r.push(`An example must be made. If ${he} thinks ${he} can escape captivity and steal to survive, let's see ${him} try without arms and legs, so you announce ${his} sentence to the crowd and send ${his} unconscious form for reduction. Of course, <span class="health dec">${his} health is affected.</span> The public <span class="reputation inc">approves of this harshness,</span> believing that you have taken strong measures against escapees.`);
 					break;
 				case "anchorBaby":
-					r.push(`An example must be made. Potential immigrants must understand that attempting to circumvent the process will result in severe fines and proportional punishment when they are incapable of paying them. The protesting mother is stripped, both of clothing and children, and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly attempt to smuggle things into your arcology without the ability to move.`);
+					r.push(`An example must be made. Potential immigrants must understand that attempting to circumvent the process will result in severe fines and proportional punishment when they are incapable of paying them. The protesting mother is stripped, both of clothing and children, and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly attempt to smuggle things into your arcology without the ability to move.`);
 					break;
 				case "businesswoman":
-					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
+					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
 					break;
 				case "whore":
-					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly attempt to steal anything without hands.`);
+					r.push(`An example must be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly attempt to steal anything without hands.`);
 					break;
 				case "rapist":
-					r.push(`An example must be made. Rape is rare in your arcology, since citizens are so generously provided with means of sexual outlet. When the price of renting a slave that's impossible to rape is as low as it is, sexual assault of a free woman is doubly unforgivable. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since even if ${he} cheers up and ever manages an erection again, ${he}'s not likely to rape anyone without arms or legs.`);
+					r.push(`An example must be made. Rape is rare in your arcology, since citizens are so generously provided with means of sexual outlet. When the price of renting a slave that's impossible to rape is as low as it is, sexual assault of a free woman is doubly unforgivable. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since even if ${he} cheers up and ever manages an erection again, ${he}'s not likely to rape anyone without arms or legs.`);
 					break;
 				case "mule":
-					r.push(`An example must be made. With the quantity of drugs consumed in the arcology, quality is everything and attempting to undermine that is unforgivable. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly haul contraband into your arcology without the ability to move ${himself}.`);
+					r.push(`An example must be made. With the quantity of drugs consumed in the arcology, quality is everything and attempting to undermine that is unforgivable. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} can hardly haul contraband into your arcology without the ability to move ${himself}.`);
 					break;
 				case "liberator":
-					r.push(`An example must be made. Slaveownership is the cornerstone of the society you're building in your arcology, and this ${woman} attempted to undermine it. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} will scarcely be able to liberate anyone without arms or legs.`);
+					r.push(`An example must be made. Slaveownership is the cornerstone of the society you're building in your arcology, and this ${woman} attempted to undermine it. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness,</span> since ${he} will scarcely be able to liberate anyone without arms or legs.`);
 					break;
 				case "passfail":
-					r.push(`An example must be made. The citizens of your arcology must be assured that the racially inferior will not try to rise above their station, no matter their deceptions. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
+					r.push(`An example must be made. The citizens of your arcology must be assured that the racially inferior will not try to rise above their station, no matter their deceptions. The protesting malefactor is stripped and stuffed into your remote surgery on public video feed. ${He} begs and pleads until ${he} sees ${his} doom in the form of the surgical machinery, at which point ${he} switches to fighting vainly to escape. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> Then it's off to the penthouse for basic slave induction. The public <span class="reputation inc">approves of this harshness.</span>`);
 			}
 			repX(500, "event", slave);
 			r.push(App.UI.newSlaveIntro(slave));
diff --git a/src/events/RE/reNickname.js b/src/events/RE/reNickname.js
index 446102ea72a1d16e92e8c790b4f038fa9b385ec8..310939edb9d5aa86102b3d078cfb40af04b2230e 100644
--- a/src/events/RE/reNickname.js
+++ b/src/events/RE/reNickname.js
@@ -840,7 +840,7 @@ App.Events.RENickname = class RENickname extends App.Events.BaseEvent {
 				applyDesc: `likes being a lurcher, especially because of what ${he}'s allowed to do to captured hares, and is happy to learn that the role is part of ${his} name now.`,
 				notApplyDesc: `is a bit sad that ${his} role isn't part of ${his} name, since ${he} likes being a lurcher, especially because of what ${he}'s allowed to do to captured hares, and now wonders whether ${he}'ll be allowed to keep doing so.`,
 			});
-		} else if (slave.assignment === "be a subordinate slave") {
+		} else if (slave.assignment === Job.SUBORDINATE) {
 			nickMap.set("server", {
 				nicknameArray: ["Bedwarmer", "Bottom Rung", "Bottom", "Doormat", "Girltoy", "Group Whore", "House Slave", "Kick Me", "Lovergirl", "Please No", "Rapebait", "Servant", "Server", "Servile", "Slave Slut", "Sub", "Submissive"],
 				situationDesc: `holds a place in the hierarchy of your penthouse that almost demands a nickname. ${He} is the lowest of the low, below even your other slaves. ${He} is a pitiable creature, living with a large number of sexually charged people, slave and free, all of whom have the right to demand any sexual service they wish of ${him}.`,
diff --git a/src/events/RESS/milkgasm.js b/src/events/RESS/milkgasm.js
index f42a81e954552613d4811be0594488d6d28b7598..f613d0969fc00b827e96610c0e4d6760ed058b0b 100644
--- a/src/events/RESS/milkgasm.js
+++ b/src/events/RESS/milkgasm.js
@@ -32,7 +32,7 @@ App.Events.RESSMilkgasm = class RESSMilkgasm extends App.Events.BaseEvent {
 			contextualIntro(V.PC, eventSlave, true),
 			`has to use milkers every couple of`
 		);
-		if (eventSlave.assignment !== "get milked") {
+		if (eventSlave.assignment !== Job.MILKED) {
 			r.push(`hours even though ${he} isn't assigned to give milk as ${his} primary job.`);
 		} else {
 			r.push(`hours.`);
diff --git a/src/events/RESS/review/breastExpansionBlues.js b/src/events/RESS/review/breastExpansionBlues.js
index 29042aec71a62a0cc8323923e8aa1fd84df4587d..49e58ed50efbd65937cab732558f1b69dce10984 100644
--- a/src/events/RESS/review/breastExpansionBlues.js
+++ b/src/events/RESS/review/breastExpansionBlues.js
@@ -205,7 +205,7 @@ App.Events.RESSBreastExpansionBlues = class RESSBreastExpansionBlues extends App
 			eventSlave.lactation = 2;
 			cashX(forceNeg(V.surgeryCost), "slaveSurgery", eventSlave);
 			surgeryDamage(eventSlave, 10);
-			return `You announce that you're resolved to continue growing ${his} breasts, and since ${he} feels like a cow, plan to help ${him} fulfill ${his} image of ${himself}. ${He}'s experienced enough to know not to question what that means, just to <span class="trust dec">fear the intent behind it.</span> ${He}'s right to worry, as you drag ${him} to the remote surgery for an impromptu lactation implant installation. When ${he} comes to, ${he} immediately realizes ${his} breasts are larger than ever. As ${he} brings a hand to each of the full mounds, a moan laced with relief and disdain escapes ${his} lips; along with a strong gush of milk from ${his} engorged breasts. ${He} has been taught a harsh lesson about questioning your will, a lesson ${he} will be reminded of every time ${he} has to empty ${his} ever swelling breasts of their excessive milk. As with all surgery <span class="health.dec">${his} health has been slightly affected.</span>`;
+			return `You announce that you're resolved to continue growing ${his} breasts, and since ${he} feels like a cow, plan to help ${him} fulfill ${his} image of ${himself}. ${He}'s experienced enough to know not to question what that means, just to <span class="trust dec">fear the intent behind it.</span> ${He}'s right to worry, as you drag ${him} to the remote surgery for an impromptu lactation implant installation. When ${he} comes to, ${he} immediately realizes ${his} breasts are larger than ever. As ${he} brings a hand to each of the full mounds, a moan laced with relief and disdain escapes ${his} lips; along with a strong gush of milk from ${his} engorged breasts. ${He} has been taught a harsh lesson about questioning your will, a lesson ${he} will be reminded of every time ${he} has to empty ${his} ever swelling breasts of their excessive milk. As with all surgery <span class="health dec">${his} health has been slightly affected.</span>`;
 		}
 
 		function boost() {
diff --git a/src/events/RESS/review/confidentTanning.js b/src/events/RESS/review/confidentTanning.js
index 8b142c3748805a8b6c3ccdc3be0da95c109c011e..bd439b81c6152f3469d35cdaea582b691d2321bf 100644
--- a/src/events/RESS/review/confidentTanning.js
+++ b/src/events/RESS/review/confidentTanning.js
@@ -38,7 +38,7 @@ App.Events.RESSConfidentTanning = class RESSConfidentTanning extends App.Events.
 			contextualIntro(PC, eventSlave, true),
 			`was struck by a similar impulse.`,
 		);
-		if (eventSlave.assignment === "rest") {
+		if (eventSlave.assignment === Job.REST) {
 			r.push(`${He}'s assigned to do little but rest,`);
 		} else {
 			r.push(`This is one of ${his} rest periods,`);
@@ -259,7 +259,7 @@ App.Events.RESSConfidentTanning = class RESSConfidentTanning extends App.Events.
 				r.push(`realizes`);
 			}
 			r.push(`what you're doing, ${he} smiles with simple satisfaction and closes ${his} eyes again. You strip and lie down next to ${him}. ${He} made a good decision`);
-			if (eventSlave.assignment === "rest") {
+			if (eventSlave.assignment === Job.REST) {
 				r.push(`about how to spend ${his} rest.`);
 			} else {
 				r.push(`about what to do with ${his} rest period.`);
diff --git a/src/events/RESS/review/cowMilking.js b/src/events/RESS/review/cowMilking.js
index eba3f70eaa9cb55d5238852ac50dcc3a83418d56..84543d89835c13aab330e3c4794694638263f44f 100644
--- a/src/events/RESS/review/cowMilking.js
+++ b/src/events/RESS/review/cowMilking.js
@@ -36,7 +36,7 @@ App.Events.RESSCowMilking = class RESSCowMilking extends App.Events.BaseEvent {
 			contextualIntro(PC, eventSlave, true)
 		);
 		r.addToLast(`, heading for the penthouse milkers.`);
-		if (eventSlave.assignment === "get milked") {
+		if (eventSlave.assignment === Job.MILKED) {
 			r.push(`Though it's ${his} job to be a human cow, ${he}'s allowed to roam as ${he} pleases when ${he}'s not getting milked, being fed, or otherwise occupied, and ${he} must have been elsewhere.`);
 		} else {
 			r.push(`${He}'s not assigned to be a human cow full time, since it's ${his} main focus to ${eventSlave.assignment}, but ${he}'s still obliged to visit the milkers regularly.`);
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index 23330f02e9424538ee8825da50c6bb059509715b..19e6afd9fb78d5a0463d697cd7ad1b5ad1b619e9 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -240,13 +240,11 @@ App.Intro.acquisition = function() {
 			V.averageDevotion += slave.devotion;
 			slavesContributing += 1;
 		} else {
-			if (slave.assignment !== "be confined in the cellblock") {
-				if (slave.assignment !== "be confined in the arcade") {
-					if (slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting < 2) {
-						V.averageTrust += slave.trust * 0.5;
-						V.averageDevotion += slave.devotion * 0.5;
-						slavesContributing += 0.5;
-					}
+			if (slave.assignment !== Job.CELLBLOCK && slave.assignment !== Job.ARCADE) {
+				if (slave.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2) {
+					V.averageTrust += slave.trust * 0.5;
+					V.averageDevotion += slave.devotion * 0.5;
+					slavesContributing += 0.5;
 				}
 			}
 		}
@@ -891,7 +889,7 @@ App.Intro.acquisition = function() {
 				SoftenSexualFlaw(slave);
 				slave.clothes = "a ball gown";
 				slave.shoes = "flats";
-				slave.assignment = "rest";
+				slave.assignment = Job.REST;
 				break;
 			case "FSRepopulationFocus":
 				slave = GenerateNewSlave("XX", {
@@ -940,7 +938,7 @@ App.Intro.acquisition = function() {
 				slave.shoes = "flats";
 				slave.diet = "fattening";
 				slave.rules.living = "luxurious";
-				slave.assignment = "rest";
+				slave.assignment = Job.REST;
 				break;
 			case "FSIntellectualDependency":
 				slave = GenerateNewSlave("XX", {minAge: 14, maxAge: 18, disableDisability: 1});
diff --git a/src/events/nonRandom/daughters/pCoupAttempt.js b/src/events/nonRandom/daughters/pCoupAttempt.js
index 9afd04086f21a5d62684d709ed9169481a215fe2..18878cae9b9ef8de062d40c8efde379f996db271 100644
--- a/src/events/nonRandom/daughters/pCoupAttempt.js
+++ b/src/events/nonRandom/daughters/pCoupAttempt.js
@@ -233,10 +233,10 @@ App.Events.PCoupAttempt = class PCoupAttempt extends App.Events.BaseEvent {
 		if (V.traitor !== 0 && traitorDeath !== 1) {
 			if (["agent", "trapper"].includes(V.traitorType)) {
 				r.push(`${V.traitor.slaveName} returns to your service having completed the task assigned to ${him}.`);
-				V.traitor.assignment = "rest";
+				V.traitor.assignment = Job.REST;
 			} else if (V.traitorType === "hostage") {
 				r.push(`${V.traitor.slaveName} wanders back to the penthouse, battered and bloody, but alive.`);
-				V.traitor.assignment = "rest";
+				V.traitor.assignment = Job.REST;
 				setHealth(V.traitor, V.traitor.health.condition, V.traitor.health.condition - V.traitor.health.shortDamage + 80, V.traitor.health.longDamage, V.traitor.health.illness, V.traitor.health.tired);
 			} else {
 				r.push(`${V.traitor.slaveName} was captured and has been returned to you.`);
diff --git a/src/events/nonRandom/daughters/pUndergroundRailroad.js b/src/events/nonRandom/daughters/pUndergroundRailroad.js
index 4470899dfae953ce941db1870356f0ff34e7ddb5..adffa438b3c93839ea31129dcc695722887f81f2 100644
--- a/src/events/nonRandom/daughters/pUndergroundRailroad.js
+++ b/src/events/nonRandom/daughters/pUndergroundRailroad.js
@@ -261,7 +261,7 @@ App.Events.PUndergroundRailroad = class PUndergroundRailroad extends App.Events.
 			}
 			V.traitorWeeks = 1;
 			V.traitor = clone(traitor);
-			V.traitor.assignment = "rest";
+			V.traitor.assignment = Job.REST;
 			V.traitor.pregControl = "none";
 			deflate(V.traitor);
 			V.traitorStats = {
diff --git a/src/events/nonRandom/pAbducted.js b/src/events/nonRandom/pAbducted.js
index a5a0d53948b362eb198d170a0ddeab53a93d7185..dfc61d192a5007ee1c810c0fabc54990de48db96 100644
--- a/src/events/nonRandom/pAbducted.js
+++ b/src/events/nonRandom/pAbducted.js
@@ -200,7 +200,7 @@ App.Events.pAbducted = class pAbducted extends App.Events.BaseEvent {
 				}
 				cashX(forceNeg(contractCost), "slaveTransfer", abductor);
 
-				r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health.dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(abductor.vagina > -1) ? ` and <span class="lime">fucked-out</span> pussy` : ``}. The public <span class="green">enjoys the fun.</span>`);
+				r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat <span class="health dec">the worse for wear</span> and <span class="red">acting oddly</span> due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} <span class="lime">loosened</span> anus${(abductor.vagina > -1) ? ` and <span class="lime">fucked-out</span> pussy` : ``}. The public <span class="green">enjoys the fun.</span>`);
 				repX(500, "event");
 				V.arcologies[0].prosperity += 2;
 				r.push(App.UI.newSlaveIntro(abductor));
@@ -265,7 +265,7 @@ App.Events.pAbducted = class pAbducted extends App.Events.BaseEvent {
 				removeLimbs(abductor, "all");
 				abductor.behavioralFlaw = "odd";
 				cashX(forceNeg(contractCost), "slaveTransfer", abductor);
-				r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery. You take great pleasure in watching ${him} struggle as ${his} limbs are taken, one by one. Of course, <span class="health.dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> After ${he} has stabilized, it's off to the penthouse for basic slave induction. You'd like to see ${him} try and carry you off again without arms and legs.`);
+				r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery. You take great pleasure in watching ${him} struggle as ${his} limbs are taken, one by one. Of course, <span class="health dec">${his} health is affected</span> and the horrible experience has left ${him} <span class="red">acting oddly.</span> After ${he} has stabilized, it's off to the penthouse for basic slave induction. You'd like to see ${him} try and carry you off again without arms and legs.`);
 				if (abductor.balls > 0) {
 					const geld = function() {
 						const el = new DocumentFragment();
diff --git a/src/events/nonRandom/pBioreactorPerfected.js b/src/events/nonRandom/pBioreactorPerfected.js
index 6f6eb89d9cfb4f4a9616bdd3017e243a1a35828e..860b03663dbcca51f6b64fd7b2f659283a188cef 100644
--- a/src/events/nonRandom/pBioreactorPerfected.js
+++ b/src/events/nonRandom/pBioreactorPerfected.js
@@ -8,7 +8,7 @@ App.Events.PBioreactorPerfected = class PBioreactorPerfected extends App.Events.
 
 	actorPrerequisites() {
 		return [[
-			(s) => s.assignment === "work in the dairy",
+			(s) => s.assignment === Job.DAIRY,
 			(s) => s.boobs > 48000,
 			(s) => (s.balls === 0 || s.balls >= 10),
 			(s) => s.fetish === "mindbroken",
diff --git a/src/events/nonRandom/rival/pRivalInitiation.js b/src/events/nonRandom/rival/pRivalInitiation.js
index f655fbccb812d85eee3262966b9e5c4bed2c7e18..d83e355010ed6531d2a892f32b4b5913fe2cb474 100644
--- a/src/events/nonRandom/rival/pRivalInitiation.js
+++ b/src/events/nonRandom/rival/pRivalInitiation.js
@@ -93,7 +93,7 @@ App.Events.PRivalInitiation = class PRivalInitiation extends App.Events.BaseEven
 			} else {
 				r.push(`strap-on`);
 			}
-			r.push(`forcing its way past ${his} virgin sphincter. Raping a virgin anus is not a new pleasure for you, but the usual shrieking, struggling and spasming is all the sweeter this time. <span class="green">Half the arcology</span> has used ${his} <span class="health.dec">poor injured butthole</span> by the end of the day; ${he} <span class="gold">is learning to fear you,</span> and hates you <span class="mediumorchid">even more</span> if possible.`);
+			r.push(`forcing its way past ${his} virgin sphincter. Raping a virgin anus is not a new pleasure for you, but the usual shrieking, struggling and spasming is all the sweeter this time. <span class="green">Half the arcology</span> has used ${his} <span class="health dec">poor injured butthole</span> by the end of the day; ${he} <span class="gold">is learning to fear you,</span> and hates you <span class="mediumorchid">even more</span> if possible.`);
 			slave.devotion -= 4;
 			slave.trust -= 5;
 			slave.anus = 3;
diff --git a/src/events/reRecruit/princelyBetrayal.js b/src/events/reRecruit/princelyBetrayal.js
index d5377e9904cae7eaf85f1bc4f4f763d43fc60428..067448a3852253c70339e10e60b4195f6468894c 100644
--- a/src/events/reRecruit/princelyBetrayal.js
+++ b/src/events/reRecruit/princelyBetrayal.js
@@ -78,8 +78,13 @@ App.Events.recPrincelyBetrayal = class recPrincelyBetrayal extends App.Events.Ba
 			slave.weight = random(-10, 10);
 			slave.muscles = random(10, 40);
 			slave.anus = 0;
+			slave.balls = Math.max(slave.balls, 2);
+			slave.scrotum = slave.balls;
+			slave.boobs = 100;
 			slave.skill.oral = 0;
 			slave.skill.anal = 0;
+			slave.skill.whoring = 0;
+			slave.skill.entertainment = random(5, 9) * 5;
 			slave.behavioralFlaw = "arrogant";
 			slave.hStyle = "luxurious";
 			slave.hLength = 2;
diff --git a/src/events/recETS/recetsMismatchedPair.js b/src/events/recETS/recetsMismatchedPair.js
index ede9d5c653a9994c91df5ca99a060e5c59b07e7c..a29631effe56604bfe04022b766f361968227133 100644
--- a/src/events/recETS/recetsMismatchedPair.js
+++ b/src/events/recETS/recetsMismatchedPair.js
@@ -93,7 +93,7 @@ App.Events.recetsMismatchedPair = class recetsMismatchedPair extends App.Events.
 		const {title: Master} = getEnunciation(S.HeadGirl);
 
 		App.Events.addParagraph(node, [
-			`Your Head Girl comes to see you. ${He3} flags a slave posted for sale on your desk. The posting seems completely unimpressive — just a bitch barely past ${his} ${ordinalSuffix(sis.actualAge)} birthday with basic implants and a pathetic little dick — until ${he3} points out that the person posting ${him} for sale is ${his} ${sister2}. ${His} slightly older, naturally female ${sister2}. Who, to go by the pictures, the younger sibling has desperately been trying to mold ${himself} to look more like.`,
+			`Your Head Girl comes to see you. ${He3} flags a slave posted for sale on your desk. The posting seems completely unimpressive — just a bitch barely past ${his} ${ordinalSuffix(bro.actualAge)} birthday with basic implants and a pathetic little dick — until ${he3} points out that the person posting ${him} for sale is ${his} ${sister2}. ${His} ${sis.actualAge - bro.actualAge > 3 ? `` : `slightly`} older, naturally female ${sister2}. Who, to go by the pictures, the younger sibling has desperately been trying to mold ${himself} to look more like.`,
 			Spoken(S.HeadGirl, `"It won't show on the desk yet, but rumor is the little cunt's gotten them both in bad debt, ${Master}. You could grab them both cheap."`),
 			`You bring up a video feed of the one-room apartment they share. A man, clearly a client, is sitting on the bed while the sissy rides him. ${He}'s facing away from the john, so ${he} isn't trying to hide the fact that ${he} isn't happy selling ${his} anus for money. The older ${sister2} is naked, but ${he2}'s trying to act as a pimp of sorts rather than helping fuck. ${He2} alternately poses and preens for the john and nonverbally scolds the wincing sissy when he's not paying attention. After the customer finishes, the sissy heads to the toilet to clean ${himself}, and ${his} older ${sister2} whispers to the john that the sissy's for sale. The john laughs at ${him2} and excuses himself.`
 		]);
diff --git a/src/events/scheduled/murderAttempt.js b/src/events/scheduled/murderAttempt.js
index b5a2fef5c761d57d0d9b6dc07deb3546eb5b880d..5af3bc3b4821f045e6dbff1efd7d5eb8fc232167 100644
--- a/src/events/scheduled/murderAttempt.js
+++ b/src/events/scheduled/murderAttempt.js
@@ -15,7 +15,6 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 		V.murderAttemptWeek = V.week + 26 + Math.floor(Math.random() * 26);
 		// disable Continue
 		V.nextButton = " ";
-		const nextPassage = "Scheduled Event";
 		const perceptiveCareers = ["escort", "gang", "hoodlum", "mercenary", "prostitute", "street urchin"];
 		// event unique
 		const variation = jsEither(["trade", "slave", "drug", "military"]);
@@ -148,7 +147,7 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 				App.Events.addParagraph(fragment, r);
 
 				App.Events.addResponses(fragment, [
-					new App.Events.Result(`Order ${him} to leave for making such a request`, endEvent),
+					new App.Events.Result(`Order ${him} to leave for making such a request`, sentOutRoute),
 					new App.Events.Result(`${S.Bodyguard.slaveName} goes everywhere and does everything with you. ${HeBG} stays`, bgStaysRoute),
 					new App.Events.Result(`This better be worth it. Order ${S.Bodyguard.slaveName} to leave`, bgLeavesRoute)
 				]);
@@ -188,6 +187,14 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 			}
 		}
 
+		function sentOutRoute() {
+			const fragment = document.createDocumentFragment();
+			const r = [`Grumbling under ${his} breath ${he} quickly leaves.`]
+			App.Events.addParagraph(fragment, r);
+			continueButton(fragment);
+			return fragment;
+		}
+
 		function bgStaysRoute() {
 			const fragment = document.createDocumentFragment();
 
@@ -286,7 +293,7 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 			const options = [];
 			switch (variation) {
 				case "trade":
-					paragraphStart.push(`${companyName} is planning a trade deal with an old world corporation that wants to expand into the Free Cities, but with the added twist of effectively robbing them during this. Their problem is they need something to show them and your arcology would ideal for this. Your role would be simple, just follow a short script before leaving both sides to negotiate. If everything goes well, your share could be in the six digit realm, but if something goes wrong, your reputation would be severely damaged.`);
+					paragraphStart.push(`${companyName} is planning a trade deal with an old world corporation that wants to expand into the Free Cities, but with the added twist of effectively robbing them during this. Their problem is they need something to show them and your arcology would be ideal for this. Your role would be simple, just follow a short script before leaving both sides to negotiate. If everything goes well, your share could be in the six digit realm, but if something goes wrong, your reputation would be severely damaged.`);
 					options.push(
 						new App.Events.Result("A windfall like this doesn't come by every day. Of course you'll take this opportunity.", accept()),
 						new App.Events.Result("The potential winnings are not worth the risk. You will not be a part of their plans.", refused)
@@ -379,14 +386,13 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 		}
 
 		function endEvent() {
-			Engine.play(nextPassage);
+			Engine.play(V.nextLink);
 			return [];
 		}
 
 		function continueButton(fragment) {
-			fragment.append(App.UI.DOM.passageLink("Continue", nextPassage));
+			fragment.append(App.UI.DOM.passageLink("Continue", V.nextLink));
 			V.nextButton = "Continue";
-			V.nextLink = nextPassage;
 			App.Utils.scheduleSidebarRefresh();
 		}
 	}
diff --git a/src/events/scheduled/seNicaeaCouncil.js b/src/events/scheduled/seNicaeaCouncil.js
index 58c749deee2c94c7f33287689221f79b357cd3a1..a84db3a84a94f58bed996f0fb317460d7bfd7fdc 100644
--- a/src/events/scheduled/seNicaeaCouncil.js
+++ b/src/events/scheduled/seNicaeaCouncil.js
@@ -38,9 +38,9 @@ App.Events.SENicaeaCouncil = class SENicaeaCouncil extends App.Events.BaseEvent
 			App.Events.addParagraph(node, r);
 			r = [];
 			r.push(`Second, one of the ways it states that free people can make their devotions is to`);
-			if (V.nicaea.assignment === "whore") {
+			if (V.nicaea.assignment === Job.WHORE) {
 				r.push(`fuck a slave whore. Not surprisingly, this will increase demand for prostitutes.`);
-			} else if (V.nicaea.assignment === "serve the public") {
+			} else if (V.nicaea.assignment === Job.PUBLIC) {
 				r.push(`fuck a public slut. Not surprisingly, this will increase demand for public servants.`);
 			} else {
 				r.push(`have sex with one's slaves. This will likely increase respect for those that keep their own fucktoys.`);
@@ -134,9 +134,9 @@ App.Events.SENicaeaCouncil = class SENicaeaCouncil extends App.Events.BaseEvent
 				App.Events.addParagraph(frag, [`On the second question, there are advocates for holy prostitution, sacred public sluts, and pure private harems. Whatever is decided, Chattel Religionism will continue to support and advocate for slaves performing all these roles. This decision will be most important in how it affects Chattel Religionist citizens. The question is whether the creed should encourage free people to patronize slave whores, have sex with public sluts, or purchase and keep their own sex slaves and respect those who have large harems of them? The effectiveness of slaves on the emphasized assignment will be improved.`]);
 
 				r.push(`A majority of the Council currently supports deciding this question in favor of`);
-				if (V.nicaea.assignment === "whore") {
+				if (V.nicaea.assignment === Job.WHORE) {
 					r.push(App.UI.DOM.makeElement("span", `prostitution.`, "bold"));
-				} else if (V.nicaea.assignment === "serve the public") {
+				} else if (V.nicaea.assignment === Job.PUBLIC) {
 					r.push(App.UI.DOM.makeElement("span", `public service.`, "bold"));
 				} else {
 					r.push(App.UI.DOM.makeElement("span", `fucktoy duty.`, "bold"));
@@ -188,9 +188,9 @@ App.Events.SENicaeaCouncil = class SENicaeaCouncil extends App.Events.BaseEvent
 				App.Events.addParagraph(frag, r);
 				r = [];
 				r.push(`The second question was decided in favor of`);
-				if (V.nicaea.assignment === "whore") {
+				if (V.nicaea.assignment === Job.WHORE) {
 					r.push(App.UI.DOM.makeElement("span", `prostitution.`, "bold"));
-				} else if (V.nicaea.assignment === "serve the public") {
+				} else if (V.nicaea.assignment === Job.PUBLIC) {
 					r.push(App.UI.DOM.makeElement("span", `public service.`, "bold"));
 				} else {
 					r.push(App.UI.DOM.makeElement("span", `fucktoy duty.`, "bold"));
diff --git a/src/events/scheduled/sePlayerBirth.js b/src/events/scheduled/sePlayerBirth.js
index 9d66fcaedb9a8761d2646bc64ec68eefb42d5f47..a4f3f5dd4a3c23b9d8d941f437a7f86040894e63 100644
--- a/src/events/scheduled/sePlayerBirth.js
+++ b/src/events/scheduled/sePlayerBirth.js
@@ -1105,7 +1105,7 @@ App.Events.SEPlayerBirth = class SEPlayerBirth extends App.Events.BaseEvent {
 				}
 
 				if (wounded === 1) {
-					r.push(`Things didn't quite go as planned, leaving you <span class="health.dec">weak and wounded.</span> You'll need a couple weeks to recover from the ordeal before you're back on your feet.`);
+					r.push(`Things didn't quite go as planned, leaving you <span class="health dec">weak and wounded.</span> You'll need a couple weeks to recover from the ordeal before you're back on your feet.`);
 					healthDamage(V.PC, 40);
 				}
 				r.toParagraph();
diff --git a/src/facilities/dairy/freeRangeDairyAssignmentScene.js b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
index 14d5cf95245e788b625f163190eb7a448a300d9b..d5fd1d75c907818c4c1cd8fff39583f636e50e3b 100644
--- a/src/facilities/dairy/freeRangeDairyAssignmentScene.js
+++ b/src/facilities/dairy/freeRangeDairyAssignmentScene.js
@@ -56,7 +56,7 @@ App.Facilities.Dairy.freeRangeAssignmentScene = function(slave) {
 		App.Events.addParagraph(node, r);
 		r = [];
 
-		const cow = V.slaves.find(s => s.assignment === "work in the dairy" && s.ID !== slave.ID && s.balls >= 10 && s.dick > 0);
+		const cow = V.slaves.find(s => s.assignment === Job.DAIRY && s.ID !== slave.ID && s.balls >= 10 && s.dick > 0);
 		if (cow) {
 			const {
 				He2, His2,
diff --git a/src/facilities/farmyard/animals/animals.js b/src/facilities/farmyard/animals/animals.js
index 09ee4edd805744e34c32d3d9fb7523a24b9117a7..68b37e1953cd387f19c34db6dc4e9b83ca931c23 100644
--- a/src/facilities/farmyard/animals/animals.js
+++ b/src/facilities/farmyard/animals/animals.js
@@ -58,7 +58,10 @@ App.Facilities.Farmyard.animals = function() {
 			const option = options.addOption(null, "canine", V.active);
 			V.animals.canine.forEach(canine => {
 				const _canine = getAnimal(canine);
-				option.addValue(capFirstChar(_canine.name), _canine.name).pulldown();
+
+				if (_canine) {
+					option.addValue(capFirstChar(_canine.name), _canine.name).pulldown();
+				}
 			});
 
 			div.append(`Your ${V.active.canine} is currently set as your active canine.`, options.render());
@@ -75,7 +78,10 @@ App.Facilities.Farmyard.animals = function() {
 			const option = options.addOption(null, "hooved", V.active);
 			V.animals.hooved.forEach(hooved => {
 				const _hooved = getAnimal(hooved);
-				option.addValue(capFirstChar(_hooved.name), _hooved.name).pulldown();
+
+				if (_hooved) {
+					option.addValue(capFirstChar(_hooved.name), _hooved.name).pulldown();
+				}
 			});
 
 			div.append(`Your ${V.active.hooved} is currently set as your active hooved animal.`, options.render());
@@ -92,7 +98,10 @@ App.Facilities.Farmyard.animals = function() {
 			const option = options.addOption(null, "feline", V.active);
 			V.animals.feline.forEach(feline => {
 				const _felines = getAnimal(feline);
-				option.addValue(capFirstChar(_felines.name), _felines.name).pulldown();
+
+				if (_felines) {
+					option.addValue(capFirstChar(_felines.name), _felines.name).pulldown();
+				}
 			});
 
 			div.append(`Your ${V.active.feline} is currently set as your active feline.`, options.render());
@@ -633,4 +642,4 @@ App.Facilities.Farmyard.animals.init = function() {
 };
 
 /** @type {Set<App.Entity.Animal>} */
-App.Data.animals = App.Data.animals || new Set;
+App.Data.animals = App.Data.animals ?? new Set;
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index 9260ae223aa05d7d326dcfcf58344d1660abe3df..ef13c786155f9f80f1ea2b45bca68ffbef9e880f 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -488,7 +488,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		links = [];
 
 		if (V.farmMenialsSpace < 2000) {
-			App.UI.DOM.appendNewElement("div", div, `There is enough room in ${V.farmyardName} to build housing, enough to give ${V.farmMenialsSpace + 100} menial slaves a place to sleep and relax.`);
+			App.UI.DOM.appendNewElement("div", div, `There is enough room in ${V.farmyardName} to build enough housing for an additional ${num(100)} menial slaves.`);
 
 			App.UI.DOM.appendNewElement("div", div, makePurchase(`Build a new housing unit`, unitCost, "capEx", {
 				handler: () => {
diff --git a/src/facilities/incubator/incubatorInteract.js b/src/facilities/incubator/incubatorInteract.js
index ea6ce2fc56137af7fa9102925cf27b7ce39b4a0d..b97f065d16fc52366bdc05c7e139697cf685f8f8 100644
--- a/src/facilities/incubator/incubatorInteract.js
+++ b/src/facilities/incubator/incubatorInteract.js
@@ -194,7 +194,7 @@ App.UI.incubator = function() {
 		for (const slave of V.slaves) {
 			if (slave.preg > 0 && slave.pregKnown === 1 && slave.eggType === "human") {
 				const r = [];
-				const reserveDisallowed = (slave.assignment === "work in the dairy" && V.dairyPregSetting > 0) || slave.assignment === "be your agent" || slave.assignment === "live with your agent";
+				const reserveDisallowed = (slave.assignment === Job.DAIRY && V.dairyPregSetting > 0) || slave.assignment === Job.AGENT || slave.assignment === Job.AGENTPARTNER;
 				if (!reserveDisallowed) {
 					const {
 						His, his
diff --git a/src/facilities/nursery/nursery.js b/src/facilities/nursery/nursery.js
index 81eebf3378eb7dac4af4ec2b3663f3bae0449817..c8723e569509e44c892cf9278086fecf671e86dd 100644
--- a/src/facilities/nursery/nursery.js
+++ b/src/facilities/nursery/nursery.js
@@ -382,7 +382,7 @@ App.Facilities.Nursery.nursery = class Nursery extends App.Facilities.Facility {
 			for (const slave of V.slaves) {
 				if (slave.preg > 0 && slave.pregKnown === 1 && slave.eggType === "human") {
 					const r = [];
-					const reserveDisallowed = (slave.assignment === "work in the dairy" && V.dairyPregSetting > 0) || slave.assignment === "be your agent" || slave.assignment === "live with your agent";
+					const reserveDisallowed = (slave.assignment === Job.DAIRY && V.dairyPregSetting > 0) || slave.assignment === Job.AGENT || slave.assignment === Job.AGENTPARTNER;
 					if (!reserveDisallowed) {
 						const {
 							His, his
diff --git a/src/facilities/penthouse/penthouseFramework.js b/src/facilities/penthouse/penthouseFramework.js
index ee9be3de8a40e2c19d9e6dbcf2bc800c4f822241..87faabbda1e4e42d0af84edd07ae9b5bc4490962 100644
--- a/src/facilities/penthouse/penthouseFramework.js
+++ b/src/facilities/penthouse/penthouseFramework.js
@@ -69,7 +69,7 @@ App.Data.Facilities.penthouse = {
 			fuckdollAccepted: true
 		}
 	},
-	defaultJob: "rest",
+	defaultJob: Job.REST,
 	manager: {
 		position: "Recruiter",
 		assignment: Job.RECRUITER,
diff --git a/src/facilities/surgery/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js
index 7250ecafaa210c6fc98b8588c94d753ecce2ad48..115f2eb04bfa63fa6ee5a92289a929a96c41f735 100644
--- a/src/facilities/surgery/surgeryPassageLower.js
+++ b/src/facilities/surgery/surgeryPassageLower.js
@@ -360,7 +360,7 @@ App.UI.surgeryPassageLower = function(slave, refresh, cheat = false) {
 				if (V.seeExtreme === 1 && V.seeHyperPreg === 1 && V.seePreg !== 0 && V.permaPregImplant === 1) {
 					r = [];
 					linkArray = [];
-					if (slave.assignment === "work in the dairy" && V.dairyPregSetting > 0) {
+					if (slave.assignment === Job.DAIRY && V.dairyPregSetting > 0) {
 						r.push(`${His} womb is already rented out for the production of calves.`);
 					} else if (slave.broodmother > 0) {
 						r.push(`${He} has been made into a`);
diff --git a/src/futureSocieties/futureSociety.js b/src/futureSocieties/futureSociety.js
index ef28cb60a6c758131e22069205cd3437a83f2d57..a6245aa4d737ae9bc05f36cefe8b1f83065ea8fa 100644
--- a/src/futureSocieties/futureSociety.js
+++ b/src/futureSocieties/futureSociety.js
@@ -28,6 +28,7 @@ globalThis.FutureSocieties = (function() {
 		HighestDecoration: FSHighestDecoration,
 		arcSupport: arcSupport,
 		researchAvailable,
+		isActive,
 	};
 
 	/** get the list of FSes active for a particular arcology
@@ -810,4 +811,14 @@ globalThis.FutureSocieties = (function() {
 	function researchAvailable(fs, arcology) {
 		return (arcology || V.arcologies[0])[`FS${fs}Research`] === 1;
 	}
+
+	/**
+	 * Checks if the given FS active (i.e. not "unset")
+	 * @param {FC.FutureSociety} fs
+	 * @param {FC.ArcologyState} [arcology] Arcology to test, defaults to the PC's arcology
+	 * @returns {boolean}
+	 */
+	function isActive(fs, arcology) {
+		return (arcology || V.arcologies[0])[fs] !== "unset";
+	}
 })();
diff --git a/src/gui/Encyclopedia/encyclopediaRAActivationEditor.js b/src/gui/Encyclopedia/encyclopediaRAActivationEditor.js
index 5fa62bc7cac8f4e6b6381f63d5ccd45a69fa8c02..6347e8031d5b2a1d93336bb8f52cdd6c80913738 100644
--- a/src/gui/Encyclopedia/encyclopediaRAActivationEditor.js
+++ b/src/gui/Encyclopedia/encyclopediaRAActivationEditor.js
@@ -68,6 +68,8 @@ App.Encyclopedia.addArticle("RA Condition Editor", function() {
 		transformerRow(el, "/", "Divides the second value by the first value", "Number");
 		transformerRow(el, "Contains", "True, if the second value is somewhere in the first value",
 			"String");
+		transformerRow(el, "Matches", "True, if the first value matches the regular expression in the second value",
+			"String");
 		transformerRow(el, "Not …", "Negates the input value.", "Boolean");
 		transformerRow(el, "If … Then … Else …",
 			"If the first value is true, returns the second value, otherwise the third value. The second " +
diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js
index 06ed5b232bfc3793e8e9b665ff20b9d3bb9f027a..32473df24e617c7ce260256555ca64947f4f88d9 100644
--- a/src/interaction/sellSlave.js
+++ b/src/interaction/sellSlave.js
@@ -955,7 +955,7 @@ App.Interact.sellSlave = function(slave) {
 					V.boomerangSlave = clone(slave);
 					V.boomerangWeeks = 1;
 					V.boomerangBuyer = key;
-					V.boomerangSlave.assignment = "rest";
+					V.boomerangSlave.assignment = Job.REST;
 					V.boomerangStats = {
 						PCpregSource: 0, PCmother: 0, PCfather: 0, boomerangMother: [], boomerangFather: [], boomerangPregSources: [], boomerangMotherTank: [], boomerangFatherTank: [], boomerangRelationship: 0, boomerangRivalry: 0, boomerangRelation: 0, boomerangBody: 0
 					};
@@ -2463,7 +2463,7 @@ App.Interact.sellSlave = function(slave) {
 					let slaveImpact;
 					r.push(`${slave.slaveName} is soon seen on shift outside a seedy establishment in the lower arcology, mechanically offering ${his} holes to passersby and flinching whenever ${his} superiors come out to check on ${him}.`);
 					for (const s of V.slaves) {
-						if (s.assignment === "whore" || s.assignment === "work in the brothel") {
+						if (s.assignment === Job.WHORE || s.assignment === Job.BROTHEL) {
 							s.trust -= 2;
 							slaveImpact = 1;
 						}
@@ -2554,7 +2554,7 @@ App.Interact.sellSlave = function(slave) {
 					let slaveImpact;
 					r.push(`${slave.slaveName} disappears for a time as ${his} training is perfected, but ${he} reappears in the refined brothel, wearing classy clothes and flirting gracefully with patrons of ${his} body.`);
 					for (const s of V.slaves) {
-						if ((s.assignment === "whore") || (s.assignment === "work in the brothel")) {
+						if ((s.assignment === Job.WHORE) || (s.assignment === Job.BROTHEL)) {
 							s.trust += 1;
 							slaveImpact = 1;
 						}
@@ -2575,7 +2575,7 @@ App.Interact.sellSlave = function(slave) {
 					let slaveImpact;
 					r.push(`${slave.slaveName} is a common sight around the arcology, since free range cows are allowed to range between milkings. ${He} seems reasonably content.`);
 					for (const s of V.slaves) {
-						if ((s.assignment === "get milked") || (s.assignment === "work in the dairy")) {
+						if ((s.assignment === Job.MILKED) || (s.assignment === Job.DAIRY)) {
 							s.trust += 1;
 							slaveImpact = 1;
 						}
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index 2b05a1c0f80b98d186b21c889b4c2db1f065c9dd..d781013b6a3db01f3c44ccb0e71d5e8cba3022c4 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -124,11 +124,11 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 		p.append("Living standard: ");
 
 		if (App.Data.misc.facilityCareers.includes(slave.assignment)) {
-			App.UI.DOM.appendNewElement("span", p, ` ${His} living conditions are managed by ${his} assignment.`, "note");
-		} else if ((slave.assignment === "be your Head Girl") && (V.HGSuite === 1)) {
-			App.UI.DOM.appendNewElement("span", p, ` ${He} has ${his} own little luxurious room in the penthouse with everything ${he} needs to be a proper Head Girl.`, "note");
-		} else if ((slave.assignment === "guard you") && (V.dojo > 1)) {
-			App.UI.DOM.appendNewElement("span", p, ` ${He} has a comfortable room in the armory to call ${his} own.`, "note");
+			App.UI.DOM.appendNewElement("span", p, ` ${His} living conditions are managed by ${his} assignment.`, ["note"]);
+		} else if ((slave.assignment === Job.HEADGIRL) && (V.HGSuite === 1)) {
+			App.UI.DOM.appendNewElement("span", p, ` ${He} has ${his} own little luxurious room in the penthouse with everything ${he} needs to be a proper Head Girl.`, ["note"]);
+		} else if ((slave.assignment === Job.BODYGUARD) && (V.dojo > 1)) {
+			App.UI.DOM.appendNewElement("span", p, ` ${He} has a comfortable room in the armory to call ${his} own.`, ["note"]);
 		} else {
 			choices = [
 				{value: "spare"},
@@ -161,7 +161,7 @@ App.UI.SlaveInteract.rules = function(slave, refresh) {
 			];
 			div.append(listChoices(choices, "rest"));
 		} else {
-			App.UI.DOM.appendNewElement("span", div, ` ${His} assignment does not allow setting a sleeping schedule.`, "note");
+			App.UI.DOM.appendNewElement("span", div, ` ${His} assignment does not allow setting a sleeping schedule.`, ["note"]);
 		}
 		p.append(div);
 
diff --git a/src/interaction/subordinateTargeting.js b/src/interaction/subordinateTargeting.js
index ceefe61bdccf4ddcfdfd506be89f3f41ed543620..608e9ef2e8604963a36745223c88e2645a3ee5f8 100644
--- a/src/interaction/subordinateTargeting.js
+++ b/src/interaction/subordinateTargeting.js
@@ -13,8 +13,8 @@ App.UI.subordinateTargeting = function() {
 			slave.subTarget = 0;
 		}
 	}
-	if (slave.assignment !== "be a subordinate slave") {
-		assignJob(slave, "be a subordinate slave");
+	if (slave.assignment !== Job.SUBORDINATE) {
+		assignJob(slave, Job.SUBORDINATE);
 	}
 	const st = getSlave(slave.subTarget);
 	r.push(slave.slaveName);
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index a72cb6f6c69ab1757c1505142ac97f65d3818bd4..6a06d50558075ad86c5ef965db52c7401945a10c 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -1000,7 +1000,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 								// did she make it to her birthing area?
 								r.push(birthDescription());
 							} else { // did not make it to birthing area
-								if (((birthDamage > 15 && random(1, 100) > 50) || (birthDamage > 20)) && (slave.assignment !== "be the Nurse" && slave.assignment !== "get treatment in the clinic")) {
+								if (((birthDamage > 15 && random(1, 100) > 50) || (birthDamage > 20)) && (slave.assignment !== Job.NURSE && slave.assignment !== Job.CLINIC)) {
 									r.push(deadlyBirthScene());
 								} else {
 									r.push(suddenBirthScene());
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 5cbe49ea29c91399fb6bb976f50faebab65d12b5..af9d7569c2ec83f4bf0181250a2f2c50490d7917 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -660,12 +660,12 @@ globalThis.calculateCosts = (function() {
 
 	function getFarmyardCosts() {
 		const facility = V.farmyard * V.facilityCost;
-		const exotic = V.animals.canine.map(c => getAnimal(c)).filter(c => c.rarity === "exotic").length +
-			V.animals.hooved.map(h => getAnimal(h)).filter(h => h.rarity === "exotic").length +
-			V.animals.feline.map(f => getAnimal(f)).filter(f => f.rarity === "exotic").length;
-		const domestic = V.animals.canine.map(c => getAnimal(c)).filter(c => c.rarity === "domestic").length +
-			V.animals.hooved.map(h => getAnimal(h)).filter(h => h.rarity === "domestic").length +
-			V.animals.feline.map(f => getAnimal(f)).filter(f => f.rarity === "domestic").length;
+		const exotic = V.animals.canine.map(c => getAnimal(c)).filter(c => !!c && c.rarity === "exotic").length +
+			V.animals.hooved.map(h => getAnimal(h)).filter(h => !!h && h.rarity === "exotic").length +
+			V.animals.feline.map(f => getAnimal(f)).filter(f => !!f && f.rarity === "exotic").length;
+		const domestic = V.animals.canine.map(c => getAnimal(c)).filter(c => !!c && c.rarity === "domestic").length +
+			V.animals.hooved.map(h => getAnimal(h)).filter(h => !!h && h.rarity === "domestic").length +
+			V.animals.feline.map(f => getAnimal(f)).filter(f => !!f && f.rarity === "domestic").length;
 		return (
 			(
 				(facility) +
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index 781a6287e8d5ec70199e231f7d5e571115768236..c1c4133cd75ee5f024dcb0424c8d5a1576470d7c 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -628,7 +628,7 @@ globalThis.isFertile = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState | App.Entity.PlayerState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canAchieveErection = function(slave) {
@@ -653,7 +653,7 @@ globalThis.canAchieveErection = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canPenetrate = function(slave) {
@@ -674,7 +674,7 @@ globalThis.canPenetrate = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canSee = function(slave) {
@@ -686,7 +686,7 @@ globalThis.canSee = function(slave) {
 
 /**
  *
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canSeePerfectly = function(slave) {
@@ -705,7 +705,7 @@ globalThis.canSeePerfectly = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canHear = function(slave) {
@@ -716,7 +716,7 @@ globalThis.canHear = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canSmell = function(slave) {
@@ -727,7 +727,7 @@ globalThis.canSmell = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canTaste = function(slave) {
@@ -738,7 +738,7 @@ globalThis.canTaste = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canHold = function(slave) {
@@ -751,7 +751,7 @@ globalThis.canHold = function(slave) {
 };
 
 /** If a slave can walk, she can move and stand.
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canWalk = function(slave) {
@@ -780,7 +780,7 @@ globalThis.canWalk = function(slave) {
 };
 
 /** If a slave can stand, she can move, but not necessarily walk.
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.canStand = function(slave) {
@@ -968,7 +968,7 @@ globalThis.canDoVaginal = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooFatSlave = function(slave) {
@@ -987,7 +987,7 @@ globalThis.tooFatSlave = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooBigBreasts = function(slave) {
@@ -1006,7 +1006,7 @@ globalThis.tooBigBreasts = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooBigBelly = function(slave) {
@@ -1025,7 +1025,7 @@ globalThis.tooBigBelly = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooBigBalls = function(slave) {
@@ -1042,7 +1042,7 @@ globalThis.tooBigBalls = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooBigDick = function(slave) {
@@ -1059,7 +1059,7 @@ globalThis.tooBigDick = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {boolean}
  */
 globalThis.tooBigButt = function(slave) {
@@ -1131,6 +1131,10 @@ globalThis.canBeReceptrix = function(slave) {
 	);
 };
 
+/**
+ * @param {FC.HumanState} slave
+ * @returns {string}
+ */
 globalThis.milkFlavor = function(slave) {
 	if (slave.milkFlavor === "none") {
 		return ``;
diff --git a/src/js/storyJS.js b/src/js/storyJS.js
index d086bd7528ae0e40ce840c343627a6b83936d005..c5b3f795609688b0ad67a63ffb579b095fedb685 100644
--- a/src/js/storyJS.js
+++ b/src/js/storyJS.js
@@ -374,7 +374,7 @@ globalThis.bodyguardSuccessorEligible = function(slave) {
 	if (!slave) {
 		return false;
 	}
-	return (slave.devotion > 50 && slave.muscles >= 0 && slave.weight < 100 && slave.boobs < 8000 && slave.butt < 10 && slave.belly < 5000 && slave.balls < 10 && slave.dick < 10 && slave.preg < 20 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canWalk(slave) && canHold(slave) && canSee(slave) && canHear(slave));
+	return (slave.devotion > 50 && slave.muscles >= 0 && slave.weight < 130 && slave.boobs < 8000 && slave.butt < 10 && slave.belly < 5000 && slave.balls < 10 && slave.dick < 10 && slave.preg < 20 && slave.fuckdoll === 0 && slave.fetish !== "mindbroken" && canWalk(slave) && canHold(slave) && canSee(slave) && canHear(slave));
 };
 
 /**
diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js
index 39bf59bcf3e96d9e135c1cacd80d7d6ca0f88c9f..d3233de8c6d292b48cd90f55c44e926894e034e3 100644
--- a/src/js/utilsAssessSlave.js
+++ b/src/js/utilsAssessSlave.js
@@ -120,7 +120,7 @@ globalThis.maxHeight = function(slave) {
 	if (slave.geneticQuirks.neoteny === 2 && slave.physicalAge > 12) { /* Limit neoteny slaves to 12 year old max height */
 		max = Math.clamp(((Height.mean(slave.nationality, slave.race, slave.genes, 12) * 1.25) + slave.heightImplant * 10), 0, 274);
 	}
-	
+
 	if (slave.geneticQuirks.dwarfism === 2 && slave.geneticQuirks.gigantism !== 2) {
 		max = Math.min(max, 160);
 	}
@@ -249,7 +249,7 @@ globalThis.canMoveToRoom = function(slave) {
 };
 
 /**
- * @param {App.Entity.SlaveState} slave
+ * @param {FC.HumanState} slave
  * @returns {0|1|2|3} 0: No heel boost at all. 1: Pumps, slight boost. 2: High heels. 3: Painfully/extreme high heels
  */
 globalThis.shoeHeelCategory = function(slave) {
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 20fee37c3cc7c7102025d4a28b342f37cbdc8bc7..20e87593345b0c504b33984652e4a1df4b5bffe5 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -2169,13 +2169,15 @@ globalThis.PoliteRudeTitle = function(slave) {
 
 /**
  * @param {App.Entity.SlaveState} slave
+ * @param {boolean} [adjective=true] Add adjectives
+ * @param {boolean} [variability=true] Use alternative titles
  * @returns {string}
  */
-globalThis.SlaveTitle = function(slave) {
+globalThis.SlaveTitle = function(slave, adjective = true, variability = true) {
 	let r;
 	if (V.newDescriptions === 1) {
 		if (slave.dick > 0 && slave.balls > 0 && slave.boobs > 300 && slave.vagina > -1 && slave.ovaries === 1) {
-			if (jsRandom(1, 100) > 50) {
+			if (variability && jsRandom(1, 100) > 50) {
 				r = "futanari";
 			} else {
 				r = "herm";
@@ -2236,6 +2238,10 @@ globalThis.SlaveTitle = function(slave) {
 			r = "slave";
 		}
 
+		if (!adjective) {
+			return r;
+		}
+
 		if (slave.visualAge < 13) {
 			if (slave.actualAge < 3) {
 				if (slave.actualAge < 1) {
@@ -2548,6 +2554,20 @@ globalThis.SlaveTitle = function(slave) {
 	return r;
 };
 
+/**
+ * Phenotype sex: a three-character string that encodes state of sexual organs
+ * as female('X'), male('Y'), both ('H'), or absent ('-'): vagina/dick, ovaries/balls, tits
+ * @param {FC.HumanState} human
+ * @returns {string}
+ */
+globalThis.phenotypeSex = function(human) {
+	const encode = (haveFemale, haveMale) =>
+		'-XYH'[haveFemale + haveMale * 2];
+	return encode(human.vagina > -1, human.dick > 0) +
+		encode(human.ovaries > 0, human.balls > 0) +
+		encode(human.boobs > 0, false);
+};
+
 /**
  * @param {App.Entity.SlaveState} slave
  */
@@ -3624,7 +3644,7 @@ globalThis.restoreTraitor = function() {
 	if (V.traitor === 0) { // typing only
 		return;
 	}
-	V.traitor.assignment = "rest";
+	V.traitor.assignment = Job.REST;
 	if (V.traitorStats.PCpregSource > 0 && V.PC.preg > 0 && V.PC.pregSource === 0) {
 		V.PC.pregSource = V.traitor.ID;
 	}
diff --git a/src/npc/descriptions/belly/belly.js b/src/npc/descriptions/belly/belly.js
index 7632b7d525db50bdab7293c34413dc7046c962d8..0c6256017e7f85188d1f5d29803a783be02303c7 100644
--- a/src/npc/descriptions/belly/belly.js
+++ b/src/npc/descriptions/belly/belly.js
@@ -2447,7 +2447,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 				r.push(`overstretched`);
 			}
 			r.push(`stomach sags massively after being distended for so long.`);
-		} else if ((slave.assignment === "work in the dairy") && (V.dairyFeedersSetting + V.dairyStimulatorsSetting > 2)) {
+		} else if ((slave.assignment === Job.DAIRY) && (V.dairyFeedersSetting + V.dairyStimulatorsSetting > 2)) {
 			r.push(`${His} stomach is painfully distended from the nutrition and hydration being pumped down ${his} throat and up ${his} butt.`);
 		} else if (slave.weight > 190) {
 			if (slave.muscles > 95) {
@@ -14234,7 +14234,7 @@ App.Desc.belly = function(slave, descType = DescType.NORMAL) {
 					} else {
 						r.push(`It is easily as large as ${his} torso, making ${him} at least half belly.`);
 					}
-					if (slave.assignment !== "labor in the production line" && slave.assignment !== "be confined in the arcade" && (slave.assignment !== "work in the dairy" || V.dairyRestraintsSetting < 2) && slave.belly >= 300000) {
+					if (slave.assignment !== Job.BABY_FACTORY && slave.assignment !== Job.ARCADE && (slave.assignment !== Job.DAIRY || V.dairyRestraintsSetting < 2) && slave.belly >= 300000) {
 						if (V.pregAccessibility === 1) {
 							r.push(`Fortunately for ${him}, the penthouse is adapted for daily life with a`);
 							if (slave.bellyPreg >= 3000) {
diff --git a/src/npc/descriptions/butt/butt.js b/src/npc/descriptions/butt/butt.js
index 3b2d0b828b8422a494fc0f1e2cb323954b5e495c..01858a392442a98d319500d072891fb258cb4e81 100644
--- a/src/npc/descriptions/butt/butt.js
+++ b/src/npc/descriptions/butt/butt.js
@@ -1106,7 +1106,7 @@ App.Desc.butt = function(slave, descType = DescType.NORMAL) {
 		r.push(`${either("gigantic", "titanic")} ass,`);
 	} else if (slave.butt <= 10) {
 		r.push(`${either("gigantic", "titanic")} ass,`);
-		if (slave.assignment === "work in the dairy" && V.dairyStimulatorsSetting > 1) {
+		if (slave.assignment === Job.DAIRY && V.dairyStimulatorsSetting > 1) {
 			r.push(`so big it jiggles as the machine rapes ${his} asshole,`);
 		} else if (!canWalk(slave)) {
 			r.push(`so big it would jiggle as ${he} walked — if ${he} could walk —`);
@@ -1115,7 +1115,7 @@ App.Desc.butt = function(slave, descType = DescType.NORMAL) {
 		}
 	} else if (slave.butt <= 14) {
 		r.push(`${either("cushion-like", "hall-crowding")} ass,`);
-		if (slave.assignment === "work in the dairy" && V.dairyStimulatorsSetting > 1) {
+		if (slave.assignment === Job.DAIRY && V.dairyStimulatorsSetting > 1) {
 			r.push(`so big it massively jiggles as the machine rapes ${his} asshole,`);
 		} else if (!canWalk(slave)) {
 			r.push(`so big it would jiggle nonstop as ${he} walked — if ${he} could walk —`);
@@ -1124,7 +1124,7 @@ App.Desc.butt = function(slave, descType = DescType.NORMAL) {
 		}
 	} else {
 		r.push(`${either("bean bag sized", "room-crowding")} ass,`);
-		if (slave.assignment === "work in the dairy" && V.dairyStimulatorsSetting > 1) {
+		if (slave.assignment === Job.DAIRY && V.dairyStimulatorsSetting > 1) {
 			r.push(`so massive it jiggles endlessly as the machine rapes ${his} asshole,`);
 		} else if (!canWalk(slave)) {
 			r.push(`so massive it would jiggle endlessly as ${he} walked — if ${he} could walk —`);
diff --git a/src/npc/descriptions/butt/buttplug.js b/src/npc/descriptions/butt/buttplug.js
index bf6b9f715d142bcad15fc9521dc25fef16b5df15..b2736db64e53771820118bbb1cf5188e8417960d 100644
--- a/src/npc/descriptions/butt/buttplug.js
+++ b/src/npc/descriptions/butt/buttplug.js
@@ -8,7 +8,7 @@ App.Desc.buttplug = function(slave, descType = DescType.NORMAL) {
 	const {
 		he, him, his, He, His
 	} = getPronouns(slave);
-	if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+	if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 		r.push(`${slave.slaveName}'s anus is`);
 		if (V.dairyStimulatorsSetting > 1) {
 			r.push(`filled by an enormous dildo`);
diff --git a/src/npc/descriptions/crotch/crotch.js b/src/npc/descriptions/crotch/crotch.js
index f18d10114d71e95071d12113a34243f29f4cf186..12b99298486f8777afb445e62ba6eb8d460ea249 100644
--- a/src/npc/descriptions/crotch/crotch.js
+++ b/src/npc/descriptions/crotch/crotch.js
@@ -9,7 +9,7 @@ App.Desc.crotch = function(slave, descType = DescType.NORMAL) {
 		he, him, his, He, His, hers
 	} = getPronouns(slave);
 	if (V.showClothing === 1 && descType !== DescType.MARKET) {
-		if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+		if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 			if (V.dairyPregSetting > 1 && slave.ovaries === 1) {
 				r.push(`${slave.slaveName}'s pussy is occupied by a massive dildo, servicing ${his} womb with its ejaculate.`);
 			} else if (slave.balls > 0) {
diff --git a/src/npc/descriptions/crotch/dick.js b/src/npc/descriptions/crotch/dick.js
index 1a98ebe438d7aa8d2b668b25ba9d65bae4585244..36049affe03d5417a1100e47dc586efdd43e7dfa 100644
--- a/src/npc/descriptions/crotch/dick.js
+++ b/src/npc/descriptions/crotch/dick.js
@@ -497,7 +497,7 @@ App.Desc.dick = function(slave, descType = DescType.NORMAL) {
 		if (slave.fuckdoll === 0) {
 			if (slave.mpreg === 1 && canAchieveErection(slave) && slave.bellyPreg >= 10000 && slave.prostate > 0) {
 				r.push(`${His} huge pregnancy puts pressure on ${his} prostate at all times, leaving ${him} fully erect and trailing cum.`);
-			} else if ((slave.assignment === "work in the dairy") && (V.dairyStimulatorsSetting > 1) && canAchieveErection(slave)) {
+			} else if ((slave.assignment === Job.DAIRY) && (V.dairyStimulatorsSetting > 1) && canAchieveErection(slave)) {
 				if (slave.dick > 8) {
 					r.push(`${He}'s soft despite the drugs ejaculated by the dildo up ${his} asshole, since ${his} cock is too huge to ever become hard. The soft monstrosity simply exists to gush cum into a catch basin.`);
 				} else if (slave.dick > 6) {
diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js
index 81b0d83a9a166054cfd7b10924f2edd8f8d588a4..424337c06591bb1ec92913477eb3886bab4994b0 100644
--- a/src/npc/descriptions/crotch/vagina.js
+++ b/src/npc/descriptions/crotch/vagina.js
@@ -111,7 +111,7 @@ App.Desc.vagina = function(slave) {
 					}
 				}
 			} else if (slave.vaginaLube < 2) {
-				if (slave.assignment === "work in the dairy" && V.dairyPregSetting > 1) {
+				if (slave.assignment === Job.DAIRY && V.dairyPregSetting > 1) {
 					r.push(`The dildo's ejaculate includes a drug that causes copious, constant vaginal lubrication, allowing it to fuck ${him} despite its giant size. The excess female fluid drips off ${him} and into a catch basin.`);
 				} else if ((slave.aphrodisiacs > 0) || (slave.inflationType === "aphrodisiac")) {
 					r.push(`The aphrodisiacs have them`);
@@ -184,7 +184,7 @@ App.Desc.vagina = function(slave) {
 					}
 				}
 			} else {
-				if (slave.assignment === "work in the dairy" && V.dairyPregSetting > 1) {
+				if (slave.assignment === Job.DAIRY && V.dairyPregSetting > 1) {
 					r.push(`The dildo's ejaculate includes a drug that encourages vaginal lubrication, which is having a drastic effect on ${him}, since ${he}'s already very gifted in that regard. The dildo makes a wet noise every time it thrusts into ${him}, and femcum streams into a catch basin beneath ${him}. The smell of pussy is overwhelming.`);
 				} else if ((slave.aphrodisiacs > 0) || (slave.gingering && slave.gingering.type === "vasodilator") || (slave.inflationType === "aphrodisiac")) {
 					r.push(`The combination of the aphrodisiacs and ${his} natural tendency to produce a lot of female lubricant is having a drastic effect. ${His} cunt is absolutely beribboned with femcum, and ${he} smells strongly of wet, clean pussy.`);
@@ -656,9 +656,7 @@ App.Desc.vagina = function(slave) {
 	} else if (slave.pubicHStyle === "bald") {
 		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.`);
-		} else if ((slave.assignment === "work in the dairy") && (V.dairyRestraintsSetting > 1)) {
+		if (slave.fuckdoll > 0 || (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1)) {
 			r.push(`${His} pubic hair has been removed to prevent chafing.`);
 		} else {
 			r.push(`${He}'s waxed and smooth.`);
diff --git a/src/npc/descriptions/describePiercings.js b/src/npc/descriptions/describePiercings.js
index 695d8823c90f11b806613b5a2c110e5727fb92da..d981dddc46dff4a9c09415e82fd8bd5e877916eb 100644
--- a/src/npc/descriptions/describePiercings.js
+++ b/src/npc/descriptions/describePiercings.js
@@ -23,7 +23,7 @@ App.Desc.piercing = function(slave, surface) {
 				} else {
 					r.push(`${His} ears are heavily pierced, with multiple lobe piercings and a row of helix piercings.`);
 				}
-				if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
+				if (slave.assignment === Job.MILKED || slave.assignment === Job.DAIRY) {
 					r.push(`${He} has a plastic livestock tag in one ear to help identify ${him} for milking.`);
 				} else if (clothing && clothing.desc && "earPiercing" in clothing.desc) {
 					r.push(clothing.desc.earPiercing(slave));
diff --git a/src/npc/descriptions/longSlave.js b/src/npc/descriptions/longSlave.js
index 095cbddbeda4543323c0baf59dd86bf6e6efc701..b0e4a208996b7a3f5a074abcebfb38eb5fcb326b 100644
--- a/src/npc/descriptions/longSlave.js
+++ b/src/npc/descriptions/longSlave.js
@@ -192,7 +192,7 @@ App.Desc.longSlave = function(slave, {descType, market = 0, marketText, noArt} =
 	if (descType === DescType.NORMAL) {
 		if (canSee(slave)) {
 			if (slave.attrKnown === 1) {
-				if ((slave.assignment !== "work in the dairy") || (V.dairyRestraintsSetting > 1)) {
+				if ((slave.assignment !== Job.DAIRY) || (V.dairyRestraintsSetting > 1)) {
 					if ((slave.attrXX > 85) && (V.PC.boobs >= 400)) {
 						r.push(`${His} attraction to women is obvious: ${he} can't seem to stop staring at your breasts.`);
 					} else if ((slave.attrXY > 85) && (V.PC.dick !== 0)) {
@@ -487,7 +487,7 @@ App.Desc.longSlave = function(slave, {descType, market = 0, marketText, noArt} =
 		} else if (slave.underArmHStyle === "bald") {
 			r.push(`${His} armpits no longer grow hair, leaving them smooth and hairless.`);
 		} else if (slave.underArmHStyle === "waxed") {
-			if (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting > 1) {
+			if (slave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 				r.push(`${His} armpit hair has been removed to prevent chafing.`);
 			} else {
 				r.push(`${His} armpits are waxed and smooth.`);
diff --git a/src/npc/descriptions/mouth.js b/src/npc/descriptions/mouth.js
index 606e946e08b9de5625ecb50a793902ab9d78cd5f..9699e36f7c2741e450701a43b77d1121b6c9088d 100644
--- a/src/npc/descriptions/mouth.js
+++ b/src/npc/descriptions/mouth.js
@@ -47,7 +47,7 @@ App.Desc.mouth = function(slave) {
 
 	if (slave.fuckdoll > 0) {
 		r.push(`${His} mouth is held open by the suit's oral insert.`);
-	} else if ((slave.assignment === "work in the dairy") && (V.dairyRestraintsSetting > 1)) {
+	} else if ((slave.assignment === Job.DAIRY) && (V.dairyRestraintsSetting > 1)) {
 		if (V.dairyFeedersSetting > 1) {
 			r.push(`${His} milking machine has a phallus a long way down ${his} throat to rehydrate ${him}.`);
 		} else {
diff --git a/src/npc/descriptions/sceneIntro.js b/src/npc/descriptions/sceneIntro.js
index b9132008ecbdf0a3602975f07958e18a3e25ab01..76bd52bc258e95bdd2d36ba3300b4997bd1edb42 100644
--- a/src/npc/descriptions/sceneIntro.js
+++ b/src/npc/descriptions/sceneIntro.js
@@ -138,7 +138,7 @@ App.Desc.sceneIntro = function(slave, descType) {
 	function sentence() {
 		const r = [];
 
-		if (slave.assignment === "work a glory hole") {
+		if (slave.assignment === Job.GLORYHOLE) {
 			r.push(`${His} sentence lasts another`);
 			if (slave.sentence > 1) {
 				r.push(`${slave.sentence} weeks.`);
@@ -281,7 +281,7 @@ App.Desc.sceneIntro = function(slave, descType) {
 			r.push(`${He} lives in ${his} own room within the armory,`);
 		} else if ([Job.MASTERSUITE, Job.CONCUBINE].includes(slave.assignment) && V.masterSuiteUpgradeLuxury === 1) {
 			r.push(`${He} sleeps with you in your bed,`);
-		} else if ((slave.assignment === "work in the dairy") && (V.dairyRestraintsSetting > 1)) {
+		} else if ((slave.assignment === Job.DAIRY) && (V.dairyRestraintsSetting > 1)) {
 			r.push(`${He} sleeps attached to a milking machine,`);
 		} else if (slave.rules.living === "spare") {
 			r.push(`${He} sleeps on a bedroll,`);
diff --git a/src/npc/generate/generateNewSlaveJS.js b/src/npc/generate/generateNewSlaveJS.js
index 691e0b754e72ccbf4a0d7039f7288f0488129ec1..4fb1209114eb4a1ed7c556dd768a7f41dfd03a6e 100644
--- a/src/npc/generate/generateNewSlaveJS.js
+++ b/src/npc/generate/generateNewSlaveJS.js
@@ -1194,21 +1194,21 @@ globalThis.GenerateNewSlave = (function() {
 			slave.geneticQuirks.uterineHypersensitivity = 2;
 		}
 		chance = jsRandom(1, 20000);
-		if (chance === 777) {
+		if (chance >= 19950) {
 			slave.geneticQuirks.albinism = 2;
 		} else if (chance >= 19500) {
 			slave.geneticQuirks.albinism = 1;
 		}
 		chance = jsRandom(1, 20000);
-		if (chance === 10001) {
+		if (chance >= 19990) {
 			slave.geneticQuirks.heterochromia = 2;
 		} else if (chance >= 19750) {
 			slave.geneticQuirks.heterochromia = 1;
 		}
 		chance = jsRandom(1, 20000);
-		if (chance === 19999) {
+		if (chance >= 19980) {
 			slave.geneticQuirks.rearLipedema = 2;
-		} else if (chance < 100) {
+		} else if (chance >= 19850) {
 			slave.geneticQuirks.rearLipedema = 1;
 		}
 		chance = jsRandom(1, 20000);
@@ -1305,13 +1305,14 @@ globalThis.GenerateNewSlave = (function() {
 		if (chance < 3) {
 			slave.geneticQuirks.uterineHypersensitivity = 1;
 		}
-		if (chance === 777) {
+		chance = jsRandom(1, 20000);
+		if (chance >= 19950) {
 			slave.geneticQuirks.albinism = 2;
 		} else if (chance >= 19500) {
 			slave.geneticQuirks.albinism = 1;
 		}
 		chance = jsRandom(1, 20000);
-		if (chance === 10001) {
+		if (chance >= 19990) {
 			slave.geneticQuirks.heterochromia = 2;
 		} else if (chance >= 19750) {
 			slave.geneticQuirks.heterochromia = 1;
@@ -1327,7 +1328,7 @@ globalThis.GenerateNewSlave = (function() {
 			slave.geneticQuirks.gigantomastia = 1;
 		}
 		chance = jsRandom(1, 20000);
-		if (chance > 19900) {
+		if (chance >= 19900) {
 			slave.geneticQuirks.macromastia = 1;
 		}
 		chance = jsRandom(1, 20000);
@@ -1342,6 +1343,19 @@ globalThis.GenerateNewSlave = (function() {
 		} else if (chance >= 19950) {
 			slave.geneticQuirks.gigantism = 1;
 		}
+		// Progeria and neoteny never appear in normal slavegen
+		if (V.seeAge === 1) {
+			chance = jsRandom(1, 20000);
+			if (chance >= 19950) {
+				slave.geneticQuirks.progeria = 1;
+			}
+			chance = jsRandom(1, 20000);
+			if (chance >= 19990 && slave.actualAge < 13) {
+				slave.geneticQuirks.neoteny = 3;
+			} else if (chance >= 19950) {
+				slave.geneticQuirks.neoteny = 1;
+			}
+		}
 		chance = jsRandom(1, 20000);
 		if (chance >= 19875) {
 			slave.geneticQuirks.mGain = 2;
diff --git a/src/npc/generate/lawCompliance.js b/src/npc/generate/lawCompliance.js
index ee337eda42df03c75828b834d6d68a09b46cb055..9f197d832c40b55ab1039c99e36a7f0ba49661e3 100644
--- a/src/npc/generate/lawCompliance.js
+++ b/src/npc/generate/lawCompliance.js
@@ -626,7 +626,7 @@ App.Desc.lawCompliance = function(slave, market = 0) {
 	}
 
 	function weightSMR() {
-		if (slave.weight > 100) {
+		if (slave.weight > 95) {
 			slave.weight = jsRandom(-50, 50);
 		}
 		slave.trust -= 5;
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index 8513da0032af949507d877e4a022a395d0f60d9c..29bdf29f305491ecd5cacd6b2923ce7f6aea275d 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -1472,7 +1472,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(`like the slut ${he2} is.`);
 							} else if (slave2.skill.whoring > 30) {
 								r.push(`like the whore ${he2} is.`);
-							} else if ((slave2.assignment === "serve in the master suite") || (slave2.assignment === "please you")) {
+							} else if ((slave2.assignment === Job.MASTERSUITE) || (slave2.assignment === Job.FUCKTOY)) {
 								r.push(`like the fucktoy ${he2} is.`);
 							} else {
 								r.push(r.pop() + ".");
@@ -1540,7 +1540,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(`like the slut ${he2} is.`);
 							} else if (slave2.skill.whoring > 30) {
 								r.push(`like the whore ${he2} is.`);
-							} else if ((slave2.assignment === "serve in the master suite") || (slave2.assignment === "please you")) {
+							} else if ((slave2.assignment === Job.MASTERSUITE) || (slave2.assignment === Job.FUCKTOY)) {
 								r.push(`like the fucktoy ${he2} is.`);
 							} else {
 								r.push(r.pop() + ".");
@@ -1608,7 +1608,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(`like the slut ${he2} is.`);
 							} else if (slave2.skill.whoring > 30) {
 								r.push(`like the whore ${he2} is.`);
-							} else if ((slave2.assignment === "serve in the master suite") || (slave2.assignment === "please you")) {
+							} else if ((slave2.assignment === Job.MASTERSUITE) || (slave2.assignment === Job.FUCKTOY)) {
 								r.push(`like the fucktoy ${he2} is.`);
 							} else {
 								r.push(r.pop() + ".");
@@ -1667,7 +1667,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(`like the slut ${he2} is.`);
 							} else if (slave2.skill.whoring > 30) {
 								r.push(`like the whore ${he2} is.`);
-							} else if ((slave2.assignment === "serve in the master suite") || (slave2.assignment === "please you")) {
+							} else if ((slave2.assignment === Job.MASTERSUITE) || (slave2.assignment === Job.FUCKTOY)) {
 								r.push(`like the fucktoy ${he2} is.`);
 							} else {
 								r.push(r.pop() + ".");
@@ -1735,7 +1735,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(`like the slut ${he2} is.`);
 							} else if (slave2.skill.whoring > 30) {
 								r.push(`like the whore ${he2} is.`);
-							} else if ((slave2.assignment === "serve in the master suite") || (slave2.assignment === "please you")) {
+							} else if ((slave2.assignment === Job.MASTERSUITE) || (slave2.assignment === Job.FUCKTOY)) {
 								r.push(`like the fucktoy ${he2} is.`);
 							} else {
 								r.push(r.pop() + ".");
diff --git a/src/npc/interaction/FFuckdollImpreg.js b/src/npc/interaction/FFuckdollImpreg.js
index e1a288bd003058658c1bdac2847d6d0d39888eb2..480dd340eb72b93132e36ec7be15a9ab37fe1710 100644
--- a/src/npc/interaction/FFuckdollImpreg.js
+++ b/src/npc/interaction/FFuckdollImpreg.js
@@ -172,7 +172,7 @@ App.Interact.fFuckdollImpreg = function(slave) {
 
 	if (V.arcologies[0].FSRestart !== "unset" && V.eugenicsFullControl !== 1) {
 		if (slave.breedingMark !== 1 || V.propOutcome === 0) {
-			r.push(`Rumors spread about you knocking up your playthings; the Societal Elite are <span class="elites.loss"> very displeased</span> by these rumors.`);
+			r.push(`Rumors spread about you knocking up your playthings; the Societal Elite are <span class="elites loss">very displeased</span> by these rumors.`);
 			V.failedElite += 5;
 		}
 	}
diff --git a/src/npc/interaction/fSlaveSelfImpreg.js b/src/npc/interaction/fSlaveSelfImpreg.js
index 8d85793f0c7018e35a2351e2b12cb8d30d42832d..1bd7684ff26caa5cbab9aaecf6211ae88622273e 100644
--- a/src/npc/interaction/fSlaveSelfImpreg.js
+++ b/src/npc/interaction/fSlaveSelfImpreg.js
@@ -45,7 +45,7 @@ App.Interact.fSlaveSelfImpreg = function(slave) {
 					slave.devotion -= 1;
 					slave.trust -= 1;
 				} else {
-					r.push(`and this <span class="gold">uniquely degrading</span> violation of ${his} person only reinforces ${his} <span class="mediumorchid">hatred</span> towards you. ${He} resists so violently that you must <span class="health.dec">physically coerce ${him}</span> into cooperating with the procedure.`);
+					r.push(`and this <span class="gold">uniquely degrading</span> violation of ${his} person only reinforces ${his} <span class="mediumorchid">hatred</span> towards you. ${He} resists so violently that you must <span class="health dec">physically coerce ${him}</span> into cooperating with the procedure.`);
 				}
 				coop = false;
 				enjoy = false;
diff --git a/src/npc/interaction/fillUpButt.js b/src/npc/interaction/fillUpButt.js
index 34f18ada1928a13d0ce257ac34e9569b06be6f8a..f1d6526c219dec31aac8b6962ef1284e0d1ca0ca 100644
--- a/src/npc/interaction/fillUpButt.js
+++ b/src/npc/interaction/fillUpButt.js
@@ -734,7 +734,7 @@ App.Interact.fillUpButt = function(slave) {
 			} else {
 				r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`);
 			}
-			r.push(`Being filled so full <span class="health.dec">surely had negative effects</span> on ${his} health.`);
+			r.push(`Being filled so full <span class="health dec">surely had negative effects</span> on ${his} health.`);
 			healthDamage(slave, 10);
 		} else if (slave.inflation === 2) {
 			if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) {
diff --git a/src/npc/interaction/forceFeeding.js b/src/npc/interaction/forceFeeding.js
index 1fd95e2d9f4407536d0806ad2b27cfa242ed8464..c4826660980e499975b6809245e43fe61ed508d3 100644
--- a/src/npc/interaction/forceFeeding.js
+++ b/src/npc/interaction/forceFeeding.js
@@ -646,7 +646,7 @@ App.Interact.forceFeeding = function(slave) {
 			} else {
 				r.push(`${His} belly wobbles heavily as ${he} is helped from your office.`);
 			}
-			r.push(`Being filled so full <span class="health.dec">surely had negative effects</span> on ${his} health.`);
+			r.push(`Being filled so full <span class="health dec">surely had negative effects</span> on ${his} health.`);
 			healthDamage(slave, 10);
 		} else if (slave.inflation === 2) {
 			if (canWalk(slave) || (canMove(slave) && slave.rules.mobility === "permissive")) {