diff --git a/devTools/checkJS.sh b/devTools/checkJS.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a6cb4356a17232fe03a46e9d9b6a3ff4c2b62f66
--- /dev/null
+++ b/devTools/checkJS.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+tmpJoinedFile=`mktemp --suffix=.js`
+
+files=$(find js src -name '*.js' -print)
+files=$(echo "$files" | sort)
+for f in $files; do
+	printf "\n/* ${f} */\n" >> "$tmpJoinedFile"
+	cat "$f" >> "$tmpJoinedFile"
+done
+
+node -c "$tmpJoinedFile"
+
+test $? -eq 0 && rm "$tmpJoinedFile"
diff --git a/devTools/makeTwineJSPassage.sh b/devTools/makeTwineJSPassage.sh
index 9b4c4b85261e294b25ff91c7a9fc939890d7151c..1699140b1c6275ff57cc0b8d220966dc7dbd7a84 100755
--- a/devTools/makeTwineJSPassage.sh
+++ b/devTools/makeTwineJSPassage.sh
@@ -6,7 +6,7 @@
 # $1: root repo dir
 # $2: output file name
 collectJSForTwine() {
-	local files=$(find js src/js -path ./art/assistantArt.js -prune -o -name '*.js' -print)
+	local files=$(find js src -path ./src/art/assistantArt.js -prune -o -name '*.js' -print)
 	files=$(echo "$files" | sort)
 	echo "" > "$2"
 	for f in $files; do
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index ec378a28afb14ad3e9ba656a41a507100f55994a..5f582337e8a64c6709f25e24d9c8485602440b04 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -201,7 +201,6 @@ App.Data.defaultGameStateVariables = {
 	AgeTrainingLowerBoundPC: 12,
 	childSex: 0,
 	showClothingErection: true,
-	masturbationAllowed: 0,
 
 	// Default location
 	continent: "North America",
@@ -1424,7 +1423,7 @@ App.Data.resetOnNGPlus = {
 	postSexCleanUp: 1,
 
 	sideBarOptions: {
-		compact: 1, Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0,
+		Cash: 1, Upkeep: 1, SexSlaveCount: 1, roomPop: 1, Rep: 1, GSP: 1, Authority: 1, Security: 1, Crime: 1, confirmWeekEnd: 0,
 	},
 	DefaultBirthDestination: "individually decided fates",
 	legendaryFacility: 0,
diff --git a/src/002-config/modSC.css b/src/002-config/modSC.css
new file mode 100644
index 0000000000000000000000000000000000000000..b09893b63ac65cc1c62b2bedf44ecd1bf831cbfd
--- /dev/null
+++ b/src/002-config/modSC.css
@@ -0,0 +1,17 @@
+/* change some SC2 styles */
+
+/* make the sidebar more compact by reducing the space between major parts */
+#ui-bar-body {
+    /* height: calc(100% - 2.5em); */
+    /* margin: 2.5em 0; */
+    height: calc(100% - 1.5em);
+    margin: 1.5em 0;
+}
+#ui-bar-body > :not(:first-child) {
+    /* margin-top: 2em; */
+    margin-top: 1.5em;
+}
+#story-author {
+    /* margin-top: 2em; */
+    margin-top: 0;
+}
diff --git a/src/002-config/mousetrapConfig.js b/src/002-config/mousetrapConfig.js
index 0a8bc6f2df416623886e07b4450030df2ee48a87..df31dc5fb398961e29312bfaca764e0dab3ac096 100644
--- a/src/002-config/mousetrapConfig.js
+++ b/src/002-config/mousetrapConfig.js
@@ -5,47 +5,21 @@ Mousetrap.bind("enter", function() {
 Mousetrap.bind("space", function() {
 	$("#story-caption #nextButton a.macro-link").trigger("click");
 });
-Mousetrap.bind("c", function() {
-	$("#story-caption #manageArcology a.macro-link").trigger("click");
-});
-Mousetrap.bind("p", function() {
-	$("#story-caption #managePenthouse a.macro-link").trigger("click");
-});
-Mousetrap.bind("n", function() {
-	$("#story-caption #manageEconomy a.macro-link").trigger("click");
-});
 Mousetrap.bind("left", function() {
 	$("#prevSlave a.macro-link").trigger("click");
-	$("#prevRule a").trigger("click");
 	$("#prevChild a.macro-link").trigger("click");
 });
 Mousetrap.bind("q", function() {
 	$("#prevSlave a.macro-link").trigger("click");
-	$("#prevRule a").trigger("click");
 	$("#prevChild a.macro-link").trigger("click");
 });
-Mousetrap.bind("shift+left", function() {
-	$("#firstRule a").trigger("click");
-});
-Mousetrap.bind("shift+q", function() {
-	$("#firstRule a").trigger("click");
-});
 Mousetrap.bind("right", function() {
 	$("#nextSlave a.macro-link").trigger("click");
-	$("#nextRule a").trigger("click");
 	$("#nextChild a.macro-link").trigger("click");
 });
-Mousetrap.bind("shift+right", function() {
-	$("#lastRule a").trigger("click");
-});
 Mousetrap.bind("e", function() {
 	$("#nextSlave a.macro-link").trigger("click");
-	$("#nextRule a").trigger("click");
 	$("#nextChild a.macro-link").trigger("click");
-	$("#story-caption #edictButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+e", function() {
-	$("#lastRule a").trigger("click");
 });
 Mousetrap.bind("f", function() {
 	$("#walkpast a.macro-link").trigger("click");
@@ -53,57 +27,3 @@ Mousetrap.bind("f", function() {
 Mousetrap.bind("h", function() {
 	$("#manageHG a").trigger("click");
 });
-Mousetrap.bind("s", function() {
-	$("#buySlaves a").trigger("click");
-});
-Mousetrap.bind("a", function() {
-	$("#managePA a").trigger("click");
-});
-Mousetrap.bind("b", function() {
-	$("#manageBG a").trigger("click");
-});
-Mousetrap.bind("u", function() {
-	$("#manageRecruiter a").trigger("click");
-});
-Mousetrap.bind("o", function() {
-	$("#story-caption #optionsButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("y", function() {
-	$("#story-caption #policyButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("f", function() {
-	$("#story-caption #FSButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("t", function() {
-	$("#story-caption #PAOButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("v", function() {
-	$("#story-caption #URButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("r", function() {
-	$("#RAButton a").trigger("click");
-});
-Mousetrap.bind("x", function() {
-	$("#story-caption #managePerson a.macro-link").trigger("click");
-});
-Mousetrap.bind("z", function() {
-	$("#story-caption #SFMButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("d", function() {
-	$("#story-caption #diplomacyButton a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+s", function() {
-	$("#story-caption #securityHQ a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+a", function() {
-	$("#story-caption #secBarracks a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+h", function() {
-	$("#story-caption #propHub a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+r", function() {
-	$("#story-caption #riotCenter a.macro-link").trigger("click");
-});
-Mousetrap.bind("shift+c", function() {
-	$("#story-caption #manageCorporation a.macro-link").trigger("click");
-});
diff --git a/src/003-assets/CSS/quicklinks.css b/src/003-assets/CSS/quicklinks.css
new file mode 100644
index 0000000000000000000000000000000000000000..05a90ade95b41788d25e449bc5ef74b56c53c02c
--- /dev/null
+++ b/src/003-assets/CSS/quicklinks.css
@@ -0,0 +1,62 @@
+div.quick-links {
+    margin-bottom: 2px; /* the last menu link has a bottom outline, make enough space for it */
+}
+
+div.quick-links div.toggle {
+    position: relative; /* so ::before/::after works in relation to this element */
+    background-color: #444444;
+    cursor: pointer;
+}
+
+div.quick-links div.toggle:hover {
+    background-color: #5f5f5f;
+}
+
+div.quick-links div.toggle::before {
+    font-family: "tme-fa-icons";
+    position: absolute;
+    left: 5px;
+    content: "\e818";
+}
+
+div.quick-links div.collapsed div.toggle::before {
+    content: "\e81a";
+}
+
+div.quick-links div.content {
+    margin: 0 5px;
+}
+
+div.quick-links div.collapsed div.content {
+    display: none
+}
+
+div.quick-links div.menu-link {
+    background-color: #2b2b2b;
+    border: solid #3c3c3c;
+    border-width: 0 2px;
+    margin: 0 2px;
+    /* we cannot detect if an element has something after it, so we just add a shadow to every element. Only for the
+        last element the shadow is not hidden behind another element. */
+    box-shadow: 0 2px 0 0 #3c3c3c;
+    /* make sure the notification is relative to the correct element */
+    position: relative;
+}
+
+div.quick-links > div.menu-link:first-child, /* give the very first link an upper border */
+div.quick-links div:not(.menu-link):not(.collapsed) + div.menu-link /* give the link directly after an opened toggle an upper border */
+{
+    border-top-width: 2px;
+}
+
+/* notification */
+div.quick-links div.notification:not(.category)::after /* notification for entry */,
+div.quick-links div.category.notification.collapsed > div.toggle::after /* notification for category, disable when uncollapsed */
+{
+    font-family: "tme-fa-icons";
+    position: absolute;
+    right: 5px;
+    top: 0;
+    content: "\e80c";
+    color: yellow;
+}
diff --git a/src/004-base/facility.js b/src/004-base/facility.js
index 6c5c4b92124bad73f0c65f9d0f0b929c737c232a..be67be3c9701de0b13ca434cd07eb2028bb3d4c3 100644
--- a/src/004-base/facility.js
+++ b/src/004-base/facility.js
@@ -231,6 +231,11 @@ App.Entity.Facilities.ManagingJob = class extends App.Entity.Facilities.Job {
 	get _facilityHasFreeSpace() {
 		return true;
 	}
+
+	/** @returns {string} */
+	get positionAbbreviation() {
+		return this.desc.positionAbbreviation || "L";
+	}
 };
 
 App.Entity.Facilities.Facility = class {
@@ -274,11 +279,13 @@ App.Entity.Facilities.Facility = class {
 		return res !== undefined ? res : 'the ' + this.genericName;
 	}
 
+	/** @returns {string} */
 	get nameCaps() {
 		const res = V[this.desc.baseName + "NameCaps"];
 		return res ? res : this.name.replace("the ", "The ");
 	}
 
+	/** @returns {string} */
 	get UIName() {
 		const nameCaps = this.nameCaps;
 		return nameCaps === "The " + this.genericName ? this.genericName : nameCaps;
@@ -522,6 +529,21 @@ App.Entity.Facilities.Facility = class {
 		return res;
 	}
 
+	/**
+	 * @param {boolean} long
+	 * @returns {string}
+	 */
+	occupancyReport(long) {
+		if (this.jobs.length === 0) {
+			return this.manager && this.manager.currentEmployee ? this.manager.positionAbbreviation : "";
+		}
+		const nonEmployees = this.nonEmployeeOccupantsCount;
+		const managerStr = this.manager && this.manager.currentEmployee ? (
+			long ? `, ${this.manager.desc.position}` : `, ${this.manager.positionAbbreviation}`) : "";
+		const slavesStr = long ? ` ${this.job().desc.position}${this.capacity !== 1 ? 's' : ''}` : "";
+		return `${this.hostedSlaves}${nonEmployees ? `+${nonEmployees}` : ""}/${this.capacity}${slavesStr}${managerStr}`;
+	}
+
 	/**
 	 * @protected
 	 * @param {string} jobName
diff --git a/src/Corporation/manageCorporation.tw b/src/Corporation/manageCorporation.tw
index f3eeb541247ee504304dd8a45f4dca3e3a235620..628b630257010ac9dd04e48ba4371b614c9d992a 100644
--- a/src/Corporation/manageCorporation.tw
+++ b/src/Corporation/manageCorporation.tw
@@ -1,4 +1,4 @@
-:: Manage Corporation [nobr]
+:: Manage Corporation [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "The Corporation">>
 
diff --git a/src/Mods/SecExp/buildings/propagandaHub.tw b/src/Mods/SecExp/buildings/propagandaHub.tw
index f178296465e2e34312037bbec2ce252862020b91..2d147704b537648d320f6f847c241c28ef25af7a 100644
--- a/src/Mods/SecExp/buildings/propagandaHub.tw
+++ b/src/Mods/SecExp/buildings/propagandaHub.tw
@@ -1,4 +1,4 @@
-:: propagandaHub [nobr]
+:: propagandaHub [nobr jump-to-safe jump-from-safe]
 
 <<if $career == "capitalist" || $career == "celebrity" || $career == "wealth">>
 	<<set _HistoryDiscount = .5>>
@@ -7,11 +7,7 @@
 <</if>>
 
 <<set $nextButton = "Back">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 Propaganda Hub
 <hr>
diff --git a/src/Mods/SecExp/buildings/riotControlCenter.tw b/src/Mods/SecExp/buildings/riotControlCenter.tw
index 78acfd20e68744c92a704eb8beeb19228c9854c3..1f4074f665c266e021bfba72e670b4606285c6fe 100644
--- a/src/Mods/SecExp/buildings/riotControlCenter.tw
+++ b/src/Mods/SecExp/buildings/riotControlCenter.tw
@@ -1,11 +1,7 @@
-:: riotControlCenter [nobr]
+:: riotControlCenter [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 Riot Control Center
 <hr>
diff --git a/src/Mods/SecExp/buildings/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw
index 92cbb8d39760eefc67aecdfc07ab69de407de8e2..3b3826a3fb2b64dbc0a0f110e02202e7f7ac8272 100644
--- a/src/Mods/SecExp/buildings/secBarracks.tw
+++ b/src/Mods/SecExp/buildings/secBarracks.tw
@@ -1,11 +1,7 @@
-:: secBarracks [nobr]
+:: secBarracks [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 The Barracks
 <hr>
diff --git a/src/Mods/SecExp/buildings/securityHQ.tw b/src/Mods/SecExp/buildings/securityHQ.tw
index 02dffc50f5cf2f38a5d8ece5d941d75e5ed47a64..36f6fc97eb0c7825234a9692043fb2b2a672fa2a 100644
--- a/src/Mods/SecExp/buildings/securityHQ.tw
+++ b/src/Mods/SecExp/buildings/securityHQ.tw
@@ -1,4 +1,4 @@
-:: securityHQ [nobr]
+:: securityHQ [nobr jump-to-safe jump-from-safe]
 
 <<if $career == "mercenary" || $career == "gang" || $career == "slaver">>
 	<<set _HistoryDiscount = .5>>
@@ -7,11 +7,7 @@
 <</if>>
 
 <<set $nextButton = "Back">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 Security Headquarters
 <hr>
diff --git a/src/Mods/SecExp/edicts.tw b/src/Mods/SecExp/edicts.tw
index f9369fa13425f3f526a1593f83f6d7a2e943866f..47b162f4983027b03ed70bd1b6e02cd1d9d36161 100644
--- a/src/Mods/SecExp/edicts.tw
+++ b/src/Mods/SecExp/edicts.tw
@@ -1,4 +1,4 @@
-:: edicts [nobr]
+:: edicts [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main">>
 
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index 013a57b987beccbd58c001457c51ea3b3a04c33d..85043b8e8b504ce3dc18a62542558050538a4ee4 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -391,6 +391,9 @@ App.SecExp.Check = (function() {
 		if (jsDef(V.secExp)) {
 			if (V.secExpEnabled !== 1) {
 				V.secExpEnabled = V.secExp;
+				if (typeof V.secExpEnabled !== "number") {
+					V.secExpEnabled = 0;
+				}
 			}
 			delete V.secExp;
 		}
diff --git a/src/Mods/SpecialForce/Firebase.tw b/src/Mods/SpecialForce/Firebase.tw
index 07eb1d1b4200e3c70745ff2435215b9ca2b7d1d9..28060521187a3995a94917d4fb1e321358baf16f 100644
--- a/src/Mods/SpecialForce/Firebase.tw
+++ b/src/Mods/SpecialForce/Firebase.tw
@@ -1,4 +1,4 @@
-:: Firebase [nobr]
+:: Firebase [nobr jump-to-safe jump-from-safe]
 <<= App.SF.Count()>>
 <<if $SF.FS.Tension > 100>> <<= App.SF.fsIntegration('BadOutcome')>>
 <<else>>
@@ -12,11 +12,7 @@
 		<</switch>>
 
 		<<set $nextButton = "Back">>
-		<<if $sideBarOptions.compact > 0>>
-			<<set $nextLink = "Manage Arcology">>
-		<<else>>
-			<<set $nextLink = "Main">>
-		<</if>>
+		<<set $nextLink = "Main">>
 
 		<<if $cheatMode > 0>> [[Cheat edit|CheatEdit][]] <br> <</if>>
 		The firebase of $arcologies[0].name's <<textbox "$SF.Lower" $SF.Lower "Firebase">> is located in the lower levels, occupying unneeded warehouse space. It is not accessible to the general citizenry, but your personal elevator has express service to it. As you step off, two soldiers in combat armor manning the entry checkpoint tense before recognizing their Marshal and stepping aside with a sharp salute.<br>
diff --git a/src/arcologyBuilding/base.js b/src/arcologyBuilding/base.js
index 8f1e33500bb6a3c598bf8d6eb0cf54eaed64ddc6..4100bda35e4855c8f9136b4c983256d6a679fea3 100644
--- a/src/arcologyBuilding/base.js
+++ b/src/arcologyBuilding/base.js
@@ -58,18 +58,18 @@ App.Arcology.sectionOrder = ["fountain", "penthouse", "spire", "shops", "ravine-
  * @param {App.Entity.Facilities.Facility} facility
  * @param {string} [passageName]
  * @param {string} [statsStr]
- * @return {Node}
+ * @returns {Node}
  */
 App.Arcology.facilityCellContent = function(facility, passageName, statsStr) {
 	const res = document.createDocumentFragment();
 	res.append(App.UI.DOM.passageLink(facility.UIName, passageName || facility.genericName));
-	const stats = document.createElement("span");
-	stats.style.whiteSpace = "nowrap";
-	stats.textContent = statsStr ? statsStr : ` (${facility.employeesIDs().size}/${facility.capacity})`;
-	if (facility.manager && facility.manager.currentEmployee) {
-		stats.textContent += ", L";
+	const report = facility.occupancyReport(false);
+	if (report !== "") {
+		const stats = document.createElement("span");
+		stats.style.whiteSpace = "nowrap";
+		stats.textContent = ` (${report})`;
+		res.append(stats);
 	}
-	res.append(stats);
 	return res;
 };
 
diff --git a/src/arcologyBuilding/cell.tw b/src/arcologyBuilding/cell.tw
index aa51dc8caa38271c94c3047b48bde840b61307fe..5875dadfa14b53fb708c8d3c3e7436dfae16616a 100644
--- a/src/arcologyBuilding/cell.tw
+++ b/src/arcologyBuilding/cell.tw
@@ -1,4 +1,4 @@
-:: Cell [nobr]
+:: Cell [nobr jump-from-safe no-history]
 
 <<set $nextButton = "Back", $nextLink = "Main">>
 
diff --git a/src/arcologyBuilding/manufacturing.js b/src/arcologyBuilding/manufacturing.js
index 2130b2e24cc081d3c6ac92f4c0e42634cdaa5bbe..82b17cfa7871d3e633f7a21330118da2e455dbdb 100644
--- a/src/arcologyBuilding/manufacturing.js
+++ b/src/arcologyBuilding/manufacturing.js
@@ -49,8 +49,7 @@ App.Arcology.Cell.Manufacturing = class extends App.Arcology.Cell.BaseCell {
 	 */
 	cellContent(path) {
 		if (this.type === "Dairy") {
-			return App.Arcology.facilityCellContent(App.Entity.facilities.dairy, null,
-				` (${App.Entity.facilities.dairy.employeesIDs().size}${V.bioreactorsXY + V.bioreactorsXX + V.bioreactorsHerm + V.bioreactorsBarren > 0 ? "+" : ""}/${App.Entity.facilities.dairy.capacity})`);
+			return App.Arcology.facilityCellContent(App.Entity.facilities.dairy);
 		}
 		if (this.type === "Farmyard") {
 			return App.Arcology.facilityCellContent(App.Entity.facilities.farmyard);
diff --git a/src/arcologyBuilding/markets.js b/src/arcologyBuilding/markets.js
index 0210f6ff8b62d4b6cb56881d2e9158a8918b613a..e93f11c3b8c68b1db212f02c80389e2ca1b9ca24 100644
--- a/src/arcologyBuilding/markets.js
+++ b/src/arcologyBuilding/markets.js
@@ -41,17 +41,11 @@ App.Arcology.Cell.Market = class extends App.Arcology.Cell.BaseCell {
 	 * @returns {Node}
 	 */
 	cellContent(path) {
-		if (this.type === "Arcade") {
-			return App.Arcology.facilityCellContent(App.Entity.facilities.arcade);
-		}
-		if (this.type === "Pit") {
-			const pit = App.Entity.facilities.pit;
-			const fragment = document.createDocumentFragment();
-			fragment.append(App.UI.DOM.passageLink(pit.UIName, "Pit"),
-				`(${pit.employeesIDs().size})`);
-			return fragment;
-		}
 		switch (this.type) {
+			case "Arcade":
+				return App.Arcology.facilityCellContent(App.Entity.facilities.arcade);
+			case "Pit":
+				return App.Arcology.facilityCellContent(App.Entity.facilities.pit);
 			case "Markets":
 				return App.Arcology.getCellLink(path, "Markets");
 			case "Transport Hub":
diff --git a/src/arcologyBuilding/penthouse.js b/src/arcologyBuilding/penthouse.js
index 945dad029aad83ee2d3f5043e0de247dfc0370b0..f4d9e75ca14cfddc5bb908064c603dc88f2c4463 100644
--- a/src/arcologyBuilding/penthouse.js
+++ b/src/arcologyBuilding/penthouse.js
@@ -34,53 +34,29 @@ App.Arcology.Cell.Penthouse = class extends App.Arcology.Cell.BaseCell {
 			fragment.append(link, " ", hotkey);
 		}
 
-		let wrapper = getWrapper(fragment);
-
+		const wrapper = getWrapper(fragment);
 		const fcs = App.Entity.facilities;
 
 		/**
 		 * @param {App.Entity.Facilities.Facility} facility
 		 * @param {string} [passageName]
-		 * @param {string} [leaderAbbr]
 		 */
-		function addFacility(facility, passageName, leaderAbbr = 'L') {
+		function addFacility(facility, passageName) {
 			if (facility.established) {
-				wrapper.append(createFacilityDiv(App.UI.DOM.passageLink(facility.UIName, passageName || facility.genericName),
-					`(${facility.employeesIDs().size}/${facility.capacity}${facility.manager.employeesIDs().size > 0 ? `, ${leaderAbbr}` : ""})`));
-			}
-		}
-
-		addFacility(fcs.masterSuite, fcs.masterSuite.genericName, "C");
-
-		if (fcs.headGirlSuite.established) {
-			const link = App.UI.DOM.passageLink(fcs.headGirlSuite.UIName, "Head Girl Suite");
-
-			if (V.HeadGirl !== 0) {
-				wrapper.append(createFacilityDiv(link, `(HG${fcs.headGirlSuite.employeesIDs().size > 0 ? ", 1" : ""})`));
-			} else {
-				wrapper.append(createFacilityDiv(link));
-			}
-		}
-
-		if (V.dojo > 1) {
-			const link = App.UI.DOM.passageLink("Armory", "BG Select");
-
-			if (V.Bodyguard !== 0) {
-				wrapper.append(createFacilityDiv(link, "BG"));
-			} else {
-				wrapper.append(createFacilityDiv(link));
+				const report = facility.occupancyReport(false);
+				wrapper.append(createFacilityDiv(
+					App.UI.DOM.passageLink(facility.UIName, passageName || facility.genericName),
+					report ? `(${report})` : null
+				));
 			}
 		}
 
+		addFacility(fcs.masterSuite);
+		addFacility(fcs.headGirlSuite, "Head Girl Suite");
+		addFacility(fcs.armory, "BG Select");
 		addFacility(fcs.servantsQuarters);
 		addFacility(fcs.spa);
-
-		if (fcs.nursery.established) {
-			const n = fcs.nursery;
-			wrapper.append(createFacilityDiv(App.UI.DOM.passageLink(n.UIName, "Nursery"),
-				`(${numberWithPluralOne(n.capacity - V.nurseryBabies, "empty room")}, ${n.employeesIDs().size}/${V.nurseryNannies}${V.Matron ? ", L" : ""})`));
-		}
-
+		addFacility(fcs.nursery);
 		addFacility(fcs.clinic);
 		addFacility(fcs.schoolroom);
 		addFacility(fcs.cellblock);
@@ -119,19 +95,21 @@ App.Arcology.Cell.Penthouse = class extends App.Arcology.Cell.BaseCell {
 		/**
 		 *
 		 * @param {HTMLElement} link
-		 * @param {(Node|string)[]} content
+		 * @param {(Node|string)} [content]
 		 * @returns {HTMLDivElement}
 		 */
-		function createFacilityDiv(link, ...content) {
+		function createFacilityDiv(link, content) {
 			const div = document.createElement("div");
 			div.append(link);
 			// in collapsed mode additional information needs to be in it's own div to stop linebreaks at weird places
 			if (V.verticalizeArcologyLinks === 0) {
 				div.classList.add("collapsed");
-				div.append(" ", ...content);
-			} else {
+				if (content) {
+					div.append(" ", content);
+				}
+			} else if (content) {
 				const innerDiv = document.createElement("div");
-				innerDiv.append(...content);
+				innerDiv.append(content);
 				div.append(" ", innerDiv);
 			}
 			return div;
diff --git a/src/cheats/mod_EditArcologyCheatDatatypeCleanup.tw b/src/cheats/mod_EditArcologyCheatDatatypeCleanup.tw
index c2d33e3141751253c1896d553fe3b29e522731dc..41f53158762723bffd3e53d033282e5998653159 100644
--- a/src/cheats/mod_EditArcologyCheatDatatypeCleanup.tw
+++ b/src/cheats/mod_EditArcologyCheatDatatypeCleanup.tw
@@ -1,11 +1,7 @@
 :: MOD_Edit Arcology Cheat Datatype Cleanup [nobr]
 
 <<set $nextButton = "Continue">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 <<if $customEvalCode>>
 	<<if $customEvalCode.charAt(0) != "(" || $nextLink == ")">> /* second condition is only there for sanityCheck */
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 75ad567df681ed06f0a4869ed8673bb0b1ee391f..7889818b32d2be19fd5ce391403829b43b3b5b90 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -164,10 +164,6 @@ App.Update.globalVariables = function(node) {
 		}
 	}
 
-	// Jobs
-	{
-		V.JobIDMap = makeJobIdMap();
-	}
 	// Reminders
 	{
 		if (!Array.isArray(V.reminders)) {
@@ -190,9 +186,6 @@ App.Update.globalVariables = function(node) {
 		if (typeof V.sideBarOptions.roomPop === "undefined") {
 			V.sideBarOptions.roomPop = 1;
 		}
-		if (typeof V.sideBarOptions.compact === "undefined") {
-			V.sideBarOptions.compact = 1;
-		}
 		if (typeof V.sideBarOptions.confirmWeekEnd === "undefined") {
 			V.sideBarOptions.confirmWeekEnd = 0;
 		}
@@ -201,9 +194,10 @@ App.Update.globalVariables = function(node) {
 		}
 
 		if (typeof V.abbreviateClothes === "number") {
+			V.UI.slaveSummary = App.UI.SlaveSummary.makeNewState();
 			for (const key of ["clothes", "devotion", "diet", "drugs", "genitalia", "health", "hormoneBalance",
 				"mental", "nationality", "origins", "physicals", "race", "rules", "rulesets", "skills"]) {
-				V.UI.slaveSummary.abbreviation[key] = V["abbreviate" + capFirstChar(key)];
+				V.UI.slaveSummary.abbreviation[key] = V["abbreviate" + capFirstChar(key)] || V.UI.slaveSummary.abbreviation[key];
 			}
 		}
 	}
@@ -1237,6 +1231,11 @@ App.Update.slaveRecords = function(node) {
 	if (V.relationLinks) {
 		resetFamilyCounters();
 	}
+
+	// Jobs
+	{
+		V.JobIDMap = makeJobIdMap();
+	}
 };
 
 App.Update.genePoolRecords = function(node) {
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index c08fd9325c4e8f783d7e131888154c81c562239a..3ce6a3b7a02f1d9526fbceebd16bd4b27046b1f8 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -38,13 +38,14 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 	function migrateHealth(slave) {
 		if (typeof slave.health === "number") {
 			const condition = slave.health;
-			slave.health = {};
-			slave.health.condition = condition;
-			slave.health.shortDamage = 0;
-			slave.health.longDamage = 0;
-			slave.health.illness = 0;
-			slave.health.tired = 0;
-			slave.health.health = condition;
+			slave.health = {
+				condition: condition,
+				shortDamage: 0,
+				longDamage: 0,
+				illness: 0,
+				tired: 0,
+				health: condition
+			};
 		}
 	}
 
@@ -524,11 +525,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		if (typeof slave.minorInjury !== "string") {
 			slave.minorInjury = 0;
 		}
-		if (typeof slave.health === "number") {
-			const condition = slave.health;
-			slave.health = {};
-			slave.health.condition = condition;
-		}
+
 		slave.health.condition = Math.clamp(slave.health.condition, -100, 100) || 0;
 		slave.health.shortDamage = Math.max(+slave.health.shortDamage, 0) || 0;
 		slave.health.longDamage = Math.max(+slave.health.longDamage, 0) || 0;
@@ -1142,6 +1139,9 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		slave.sexQuality = Math.max(+slave.sexQuality, 0) || 0;
 		slave.whoreClass = Math.max(+slave.whoreClass, 0) || 0;
 		slave.effectiveWhoreClass = Math.max(+slave.effectiveWhoreClass, effectiveWhoreClass(slave)) || 0;
+		if (!Object.values(Job).includes(slave.assignment)) {
+			slave.assignment = Job.REST;
+		}
 	}
 })();
 
diff --git a/src/endWeek/saServeYourOtherSlaves.js b/src/endWeek/saServeYourOtherSlaves.js
index 09078bc565375886ae85155db34107645d3f11d7..19b2a1ace4df760a9fa7c02946672b569b72b9a7 100644
--- a/src/endWeek/saServeYourOtherSlaves.js
+++ b/src/endWeek/saServeYourOtherSlaves.js
@@ -861,7 +861,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 			}
 			r.push(`before asking for ${his2} portion to be plated appropriately. ${subName} struggles to eat`);
 			if (slave.dick > 0) {
-				if (slave.chastityDick) {
+				if (slave.chastityPenis) {
 					r.push(`with an eager tongue probing the gaps around ${his} chastity cage trying to gather every last drop of slave food.`);
 				} else {
 					r.push(`while ${his}`);
@@ -905,7 +905,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 						if (slave.vasectomy) {
 							r.push(`forcing ${him} to buck and ram ${his} cock a little too far into ${domName}.`);
 						} else if (slave.balls >= 30 || slave.prostate > 2) {
-							r.push(`unleashing a massive spurt down ${domName}'s throat. ${domName} gags and pulls back, recieving the rest of ${subName}'s load across ${his2} face and body. ${domName} couldn't even come close to hiding what happened — just the way ${he2} likes it.`);
+							r.push(`unleashing a massive spurt down ${domName}'s throat. ${domName} gags and pulls back, receiving the rest of ${subName}'s load across ${his2} face and body. ${domName} couldn't even come close to hiding what happened — just the way ${he2} likes it.`);
 						} else if (slave.balls >= 10) {
 							r.push(`filling ${domName}'s throat with such volume it sprays out ${his2} nose. ${domName} stands no chance of cleaning ${himself2} up without being seen — quite enjoyable, really.`);
 						} else {
@@ -1006,7 +1006,7 @@ App.SlaveAssignment.serveYourOtherSlaves = (function() {
 					slave.counter.vaginal += fuckCount;
 					V.vaginalTotal += fuckCount;
 				}
-			} else if (domslave.pregKnown === 1 || slave.belly > 10000 || slave.bellyPreg >= 1500) {
+			} else if (domSlave.pregKnown === 1 || slave.belly > 10000 || slave.bellyPreg >= 1500) {
 				if (domSlave.pregKnown === 1) {
 					if (domFetishKnown) {
 						r.push(`Since ${domName} is pregnant,`);
diff --git a/src/facilities/arcade/arcadeFramework.js b/src/facilities/arcade/arcadeFramework.js
index 961d529eb867cb9f1e3dd59602e8f87a032e01fc..58f5d63338c3742e12960635e9fa64656060e756 100644
--- a/src/facilities/arcade/arcadeFramework.js
+++ b/src/facilities/arcade/arcadeFramework.js
@@ -3,7 +3,7 @@ App.Data.Facilities.arcade = {
 	genericName: null,
 	jobs: {
 		assignee: {
-			position: "whore",
+			position: "inmate",
 			assignment: Job.ARCADE,
 			publicSexUse: true,
 			fuckdollAccepted: true,
diff --git a/src/facilities/armory/armoryFramework.js b/src/facilities/armory/armoryFramework.js
index 2f866ee1672196432a108dfd58668d6efc8f54da..ac077b9815b7b0b0617e224f3e181fa685bac713 100644
--- a/src/facilities/armory/armoryFramework.js
+++ b/src/facilities/armory/armoryFramework.js
@@ -1,10 +1,11 @@
 App.Data.Facilities.armory = {
 	baseName: "dojo",
-	genericName: "armory",
+	genericName: "Armory",
 	jobs: {	},
 	defaultJob: null,
 	manager: {
 		position: "bodyguard",
+		positionAbbreviation: "BG",
 		assignment: Job.BODYGUARD,
 		careers: App.Data.misc.bodyguardCareers,
 		skill: "bodyguard",
@@ -21,6 +22,4 @@ App.Data.Facilities.armory = {
 	}
 };
 
-App.Entity.facilities.armory = new App.Entity.Facilities.Facility(
-	App.Data.Facilities.armory
-);
+App.Entity.facilities.armory = new App.Entity.Facilities.Facility(App.Data.Facilities.armory);
diff --git a/src/facilities/club/clubFramework.js b/src/facilities/club/clubFramework.js
index 02638c99d132484e645147919c8ba836d0d6fd57..3d25fd0af3b9d6da98fb3f78a1d5fd02ce10bf83 100644
--- a/src/facilities/club/clubFramework.js
+++ b/src/facilities/club/clubFramework.js
@@ -3,7 +3,7 @@ App.Data.Facilities.club = {
 	genericName: null,
 	jobs: {
 		slut: {
-			position: "Slut",
+			position: "slut",
 			assignment: Job.CLUB,
 			publicSexUse: true,
 			fuckdollAccepted: false,
diff --git a/src/facilities/farmyard/farmerSelect.tw b/src/facilities/farmyard/farmerSelect.tw
index aa3f1cdd49ce026b6b7f254e3f951e924113442f..e94fb005024f84ead1a820fcc4e6bf75d210d905 100644
--- a/src/facilities/farmyard/farmerSelect.tw
+++ b/src/facilities/farmyard/farmerSelect.tw
@@ -1,4 +1,4 @@
-:: Farmer Select [nobr]
+:: Farmer Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Farmyard", $encyclopedia = "Farmer">>
 <<if ($Farmer != 0)>>
diff --git a/src/facilities/farmyard/farmyard.tw b/src/facilities/farmyard/farmyard.tw
index 98ed68b19ecd28d255ebff29d362dd55e766a23e..60d10497b5c54964ad83dc078deb82b11b090c34 100644
--- a/src/facilities/farmyard/farmyard.tw
+++ b/src/facilities/farmyard/farmyard.tw
@@ -1,4 +1,4 @@
-:: Farmyard [nobr]
+:: Farmyard [nobr jump-to-safe jump-from-safe]
 
 /* TODO: add "plots" of "crops" */
 /* TODO: allow slaves that can't walk to put on shows */
diff --git a/src/facilities/farmyard/food/foodMarket.tw b/src/facilities/farmyard/food/foodMarket.tw
index 0773bc2bafe22f8efcf29491369af7242af163cd..75f2109bee0acad584721e3e9053c53ceab90cfd 100644
--- a/src/facilities/farmyard/food/foodMarket.tw
+++ b/src/facilities/farmyard/food/foodMarket.tw
@@ -7,11 +7,7 @@
 <<set _maxFood = Math.trunc($cash/$farmyardFoodCost)>>
 The food market has @@.chocolate;<<print massFormat($foodStored)>>@@ in storage, valued at a total of @@.yellowgreen;<<print cashFormat(_foodValue)>>.@@
 
-<<if $sideBarOptions.compact > 0>>
-	<<set _link = "Manage Arcology">>
-<<else>>
-	<<set _link = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 <br>
 <<link "Buy <<= massFormat(1)>>" _link>><<set cashX(forceNeg($farmyardFoodCost*1), "farmyard"), $foodStored += 1>><</link>>
diff --git a/src/facilities/headGirlSuite/headGirlSuiteFramework.js b/src/facilities/headGirlSuite/headGirlSuiteFramework.js
index a980f8a700c8a8105d7c0ce2f95ef6db5f6a6d41..6a059b0541cbb2941cad8cad94d0dbbaa92af8ca 100644
--- a/src/facilities/headGirlSuite/headGirlSuiteFramework.js
+++ b/src/facilities/headGirlSuite/headGirlSuiteFramework.js
@@ -33,6 +33,25 @@ App.Data.Facilities.headGirlSuite = {
 	}
 };
 
-App.Entity.facilities.headGirlSuite = new App.Entity.Facilities.SingleJobFacility(
-	App.Data.Facilities.headGirlSuite
-);
+App.Entity.Facilities.HeadGirlSuite = class extends App.Entity.Facilities.SingleJobFacility {
+	constructor() {
+		super(App.Data.Facilities.headGirlSuite);
+	}
+
+	/** @override */
+	get UIName() {
+		const nameCaps = this.nameCaps;
+		return nameCaps === "The Head Girl Suite" ? "Head Girl Suite"  : nameCaps;
+	}
+
+	/** @override */
+	occupancyReport(long) {
+		return this.manager.currentEmployee
+			? `HG${this.hostedSlaves ? long
+				? ` and ${getPronouns(this.manager.currentEmployee).his} slave`
+				: ", 1" : ""}`
+			: "";
+	}
+};
+
+App.Entity.facilities.headGirlSuite = new App.Entity.Facilities.HeadGirlSuite();
diff --git a/src/facilities/incubator/incubatorFramework.js b/src/facilities/incubator/incubatorFramework.js
index a425efb8c58157fb43d9149345fc79084223ed6d..bf1867fa54dd85fa93e66e6489e680d5fb5d75d4 100644
--- a/src/facilities/incubator/incubatorFramework.js
+++ b/src/facilities/incubator/incubatorFramework.js
@@ -3,7 +3,7 @@ App.Data.Facilities.incubator = {
 	genericName: null,
 	jobs: {
 		tank: {
-			position: "Tank",
+			position: "tank",
 			assignment: Job.TANK,
 			publicSexUse: false,
 			fuckdollAccepted: false
diff --git a/src/facilities/masterSuite/masterSuiteFramework.js b/src/facilities/masterSuite/masterSuiteFramework.js
index e94886e242a7970b0469b231d5d2ea3ce2334236..be55b6008cd4dcb8e21ed8a18baa991b3acbc065 100644
--- a/src/facilities/masterSuite/masterSuiteFramework.js
+++ b/src/facilities/masterSuite/masterSuiteFramework.js
@@ -17,6 +17,7 @@ App.Data.Facilities.masterSuite = {
 	defaultJob: "fucktoy",
 	manager: {
 		position: "concubine",
+		positionAbbreviation: "C",
 		assignment: Job.CONCUBINE,
 		careers: [],
 		skill: null,
diff --git a/src/facilities/nursery/matronSelect.tw b/src/facilities/nursery/matronSelect.tw
index c761b76cc31d00777a3a899f1b74aa96f235586b..334c05b7a2356cc2b7173502765c72563b0f40e1 100644
--- a/src/facilities/nursery/matronSelect.tw
+++ b/src/facilities/nursery/matronSelect.tw
@@ -1,4 +1,4 @@
-:: Matron Select [nobr]
+:: Matron Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Nursery", $encyclopedia = "Matron">>
 <<if ($Matron != 0)>>
diff --git a/src/facilities/nursery/nursery.tw b/src/facilities/nursery/nursery.tw
index 813bfb70328be4a14f6ce3f92748848c2dd2dc51..4fa0c863e9e028a14206a878c88c190e3c7e1d2d 100644
--- a/src/facilities/nursery/nursery.tw
+++ b/src/facilities/nursery/nursery.tw
@@ -1,4 +1,4 @@
-:: Nursery [nobr]
+:: Nursery [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Nursery", $encyclopedia = "Nursery">>
 <<set $targetAgeNursery = Number($targetAgeNursery) || $minimumSlaveAge>>
diff --git a/src/facilities/nursery/nurseryFramework.js b/src/facilities/nursery/nurseryFramework.js
index 2403edffab0a54573e70cbdae905ca5c62211615..394def23fd3d40792329f06c30d00577bb2982e0 100644
--- a/src/facilities/nursery/nurseryFramework.js
+++ b/src/facilities/nursery/nurseryFramework.js
@@ -60,6 +60,13 @@ App.Entity.Facilities.Nursery = class extends App.Entity.Facilities.SingleJobFac
 	// get capacity() {
 	// 	return State.Variables.nurseryNannies;
 	// }
+
+	/** @override */
+	occupancyReport(long) {
+		return long
+			? `${V.nurseryBabies}/${V.nursery} babies, ${this.hostedSlaves}/${V.nurseryNannies} nannies${this.manager.currentEmployee ? `, ${this.manager.desc.position}` : ""}`
+			: `${V.nurseryBabies}/${V.nursery}, ${this.hostedSlaves}/${V.nurseryNannies}${this.manager.currentEmployee ? ", L" : ""}`;
+	}
 };
 
 App.Entity.facilities.nursery = new App.Entity.Facilities.Nursery();
diff --git a/src/facilities/pit/pitFramework.js b/src/facilities/pit/pitFramework.js
index bac95c22fe173666f8675c8b6d08b0f79941cb4e..df3b2e7fda084849d5bab94a29d0fc922dfb0e42 100644
--- a/src/facilities/pit/pitFramework.js
+++ b/src/facilities/pit/pitFramework.js
@@ -45,6 +45,11 @@ App.Entity.Facilities.Pit = class extends App.Entity.Facilities.SingleJobFacilit
 	get capacity() {
 		return super.capacity > 0 ? Number.MAX_VALUE : 0;
 	}
+
+	/** @override */
+	occupancyReport(long) {
+		return `${this.hostedSlaves}${long ? ` ${this.job().desc.position}s` : ""}`;
+	}
 };
 
 App.Entity.facilities.pit = new App.Entity.Facilities.Pit();
diff --git a/src/facilities/schoolroom/schoolroomFramework.js b/src/facilities/schoolroom/schoolroomFramework.js
index 04b487df197d89d545eb0d85b6d4b5da4bc6afb5..0676a003f17de5a89e004ed18fc1186a0bf19b57 100644
--- a/src/facilities/schoolroom/schoolroomFramework.js
+++ b/src/facilities/schoolroom/schoolroomFramework.js
@@ -3,7 +3,7 @@ App.Data.Facilities.schoolroom = {
 	genericName: null,
 	jobs: {
 		student: {
-			position: "",
+			position: "student",
 			assignment: Job.SCHOOL,
 			publicSexUse: false,
 			fuckdollAccepted: false,
diff --git a/src/facilities/spa/spaFramework.js b/src/facilities/spa/spaFramework.js
index 2375a1bde62716d9d86ebce91e3a25a87a48b98e..475e5f10aa202dc58ba0fb7fc29accf6d0f85494 100644
--- a/src/facilities/spa/spaFramework.js
+++ b/src/facilities/spa/spaFramework.js
@@ -3,7 +3,7 @@ App.Data.Facilities.spa = {
 	genericName: null,
 	jobs: {
 		assignee: {
-			position: "",
+			position: "bather",
 			assignment: Job.SPA,
 			publicSexUse: false,
 			fuckdollAccepted: false,
diff --git a/src/gui/Encyclopedia/encyclopediaDialog.js b/src/gui/Encyclopedia/encyclopediaDialog.js
index b6f5521a71e1df351a856ead8ad5a36c283b9a07..379d4f575f1c715259d7282ea5d83e82b9a86e39 100644
--- a/src/gui/Encyclopedia/encyclopediaDialog.js
+++ b/src/gui/Encyclopedia/encyclopediaDialog.js
@@ -1,5 +1,5 @@
 App.Encyclopedia.Dialog = (function() {
-	/** Create a link to an encylopedia dialog for a given article with the given text
+	/** Create a link to an encyclopedia dialog for a given article with the given text
 	 * @param {string} text Text for link
 	 * @param {string} article Encyclopdia article to link to
 	 * @returns {string} SugarCube link markup
@@ -8,7 +8,7 @@ App.Encyclopedia.Dialog = (function() {
 		return App.UI.link(text, () => showArticleInDialog(article));
 	}
 
-	/** Create a link to an encylopedia dialog for a given article with the given text
+	/** Create a link to an encyclopedia dialog for a given article with the given text
 	 * @param {string} text Text for link
 	 * @param {string} article Encyclopdia article to link to
 	 * @returns {HTMLElement} DOM link element
diff --git a/src/gui/quicklinks.js b/src/gui/quicklinks.js
new file mode 100644
index 0000000000000000000000000000000000000000..1930c43d79224339f1fb2f6b2105e79d11d0d9e8
--- /dev/null
+++ b/src/gui/quicklinks.js
@@ -0,0 +1,514 @@
+/**
+ * Generate a list of links the player can safely jump to.
+ *
+ * Tags are:
+ * jump-to-safe: Allow to jump to this passage from anywhere
+ * jump-from-safe: Allow to jump from this passage to anywhere
+ * no-history: Do not record history for this passage, act as if was never opened; mutually exclusive with the jump tags
+ *
+ * @returns {DocumentFragment}
+ */
+App.UI.quickMenu = (function() {
+	// setup safe passages
+	const jumpFrom = Story.lookup("tags", "jump-from-safe").map(passage => passage.title);
+	const jumpTo = Story.lookup("tags", "jump-to-safe").map(passage => passage.title);
+	const noHistory = Story.lookup("tags", "no-history").map(passage => passage.title);
+
+	// if property name is a passage name, then it's a link, otherwise only text.
+	// category titles  are never links to passages
+	// Only two values are allowed: true or an object following the same rules
+	const layout = addOtherCategory({
+		Main: true,
+		Manage: {
+			"Manage Penthouse": true,
+			"Manage Arcology": true,
+			"Manage Personal Affairs": true,
+			"Manage Corporation": true,
+			"Personal assistant options":true,
+			Firebase: true,
+			propagandaHub: true,
+			securityHQ: true,
+			secBarracks: true,
+			riotControlCenter: true,
+		},
+		Social: {
+			"Future Society": true,
+			Policies: true,
+			edicts: true,
+			"Neighbor Interact": true,
+		},
+		Facilities: {
+			"Head Girl Suite": true,
+			"BG Select": true,
+			Brothel: true,
+			Club: true,
+			Arcade: true,
+			Dairy: true,
+			Farmyard: true,
+			"Servants' Quarters": true,
+			"Master Suite": true,
+			Schoolroom: true,
+			Spa: true,
+			Nursery: true,
+			Clinic: true,
+			Cellblock: true,
+			Incubator: true,
+			Pit: true,
+		},
+		Locations: {
+			"Gene Lab": true,
+			Dispensary: true,
+			"Organ Farm": true,
+			"Implant Manufactory": true,
+			"Prosthetic Lab": true,
+			Wardrobe: true,
+			"The Black Market": true,
+		},
+		Tools: {
+			"Find Slave": true,
+			"Rules Assistant":true,
+			"Personal Attention Select":true,
+		},
+		Options: {
+			Options: true,
+			"Summary Options": true,
+			"Description Options": true,
+			"Universal Rules": true,
+		}
+	});
+
+	// true means hidden
+	const hiddenPassages = cleanPassageMapping({
+		Arcade: () => !V.arcade,
+		"BG Select": () => V.dojo <= 1,
+		Brothel: () => !V.brothel,
+		Cellblock: () => !V.cellblock,
+		Clinic: () => !V.clinic,
+		Club: () => !V.club,
+		Dairy: () => !V.dairy,
+		Dispensary: () => !V.dispensary,
+		edicts: () => V.secExpEnabled <= 0,
+		Farmyard: () => !V.farmyard,
+		Firebase: () => !V.SF.Toggle || V.SF.Toggle < 1 || V.SF.Active < 1,
+		"Future Society": () => !V.FSAnnounced,
+		"Gene Lab": () => !V.geneticMappingUpgrade,
+		"Head Girl Suite": () => !V.HGSuite,
+		"Implant Manufactory": () => !V.ImplantProductionUpgrade,
+		Incubator: () => !V.incubator,
+		"Manage Corporation": () => V.corp.Announced !== 1,
+		"Master Suite": () => !V.masterSuite,
+		"Neighbor Interact": () => V.arcologies.length === 0,
+		Nursery: () => !V.nursery,
+		"Organ Farm": () => !V.organFarmUpgrade,
+		Pit: () => !V.pit,
+		propagandaHub: () => V.secExpEnabled <= 0 || V.SecExp.buildings.propHub.active <= 0,
+		"Prosthetic Lab": () => V.researchLab.level === 0,
+		riotControlCenter: () => V.secExpEnabled <= 0 || V.riotCenter <= 0,
+		Schoolroom: () => !V.schoolroom,
+		secBarracks: () => V.secExpEnabled <= 0 || V.SecExp.buildings.barracks.active <= 0,
+		securityHQ: () => V.secExpEnabled <= 0 || V.secHQ <= 0,
+		"Servants' Quarters": () => !V.servantsQuarters,
+		Spa: () => !V.spa,
+		"The Black Market": () => V.rep < 10000,
+	});
+
+	// show different names than the actual passage name, can be a function
+	const uiNames = cleanPassageMapping({
+		Arcade: () => App.Entity.facilities.arcade.UIName,
+		"BG Select": "Armory",
+		Brothel: () => App.Entity.facilities.brothel.UIName,
+		Cellblock: () => App.Entity.facilities.cellblock.UIName,
+		Clinic: () => App.Entity.facilities.clinic.UIName,
+		Club: () => App.Entity.facilities.club.UIName,
+		Dairy: () => App.Entity.facilities.dairy.UIName,
+		Dispensary: "Pharmaceutical Fabricator",
+		edicts: "Edicts",
+		Farmyard: () => App.Entity.facilities.farmyard.UIName,
+		"Find Slave": "Locate Slave",
+		Firebase: () => `${App.SF.Caps()}'s Firebase`,
+		"Future Society": "Future Societies",
+		"Head Girl Suite": () => App.Entity.facilities.headGirlSuite.UIName,
+		Incubator: () => App.Entity.facilities.incubator.UIName,
+		"Master Suite": () => App.Entity.facilities.masterSuite.UIName,
+		"Neighbor Interact": "Diplomacy",
+		Nursery: () => App.Entity.facilities.nursery.UIName,
+		Options: "Game Options",
+		"Personal assistant options": "Personal Assistant",
+		"Personal Attention Select":"Personal Attention",
+		Pit: () => App.Entity.facilities.pit.UIName,
+		propagandaHub: "Manage PR",
+		riotControlCenter: "Manage Rebels",
+		Schoolroom: () => App.Entity.facilities.schoolroom.UIName,
+		secBarracks: "Manage Military",
+		securityHQ: "Manage Security",
+		"Servants' Quarters": () => App.Entity.facilities.servantsQuarters.UIName,
+		Spa: () => App.Entity.facilities.spa.UIName,
+		"The Black Market": "Black Market",
+	});
+
+	// extra information behind the link, is a function
+	const f = App.Entity.facilities;
+	const extraInfo = cleanPassageMapping({
+		Arcade: () => occupancy(f.arcade),
+		"BG Select": () => occupancy(f.armory),
+		Brothel: () => occupancy(f.brothel),
+		Cellblock: () => occupancy(f.cellblock),
+		Clinic: () => occupancy(f.clinic),
+		Club: () => occupancy(f.club),
+		Dairy: () => occupancy(f.dairy),
+		Farmyard: () => occupancy(f.farmyard),
+		"Head Girl Suite": () => occupancy(f.headGirlSuite),
+		Incubator: () => occupancy(f.incubator),
+		"Master Suite": () => occupancy(f.masterSuite),
+		Nursery: () => occupancy(f.nursery),
+		Pit: () => occupancy(f.pit),
+		Schoolroom: () => occupancy(f.schoolroom),
+		"Servants' Quarters": () => occupancy(f.servantsQuarters),
+		Spa: () => occupancy(f.spa),
+	});
+
+	// true shows a notification symbol
+	const notifications = cleanPassageMapping({
+		"Future Society": () => V.FSCredits > 0 || V.FSReminder,
+		Incubator: () => V.readySlaves > 0,
+		"Manage Corporation": () => V.corp.SpecToken > 0 && V.corp.SpecTimer === 0,
+	});
+
+	// setup hotkeys list, upper/lower case is important!
+	// Due to limitation to the key capture library keys can not be used when they are already used in
+	// src/002-config/mousetrapConfig.js
+	const hotkeys = cleanPassageMapping({
+		"BG Select": "b",
+		"Buy Slaves": "s",
+		edicts: "E",
+		Firebase: "z",
+		"Future Society": "f",
+		Main: "m",
+		"Manage Arcology": "c",
+		"Manage Corporation":"C",
+		"Manage Penthouse": "p",
+		"Manage Personal Affairs": "x",
+		"Neighbor Interact": "d",
+		Options: "o",
+		"Personal assistant options": "t",
+		"Personal Attention Select":"a",
+		Policies: "y",
+		propagandaHub:"H",
+		"Recruiter Select": "u",
+		riotControlCenter:"R",
+		"Rules Assistant": "r",
+		secBarracks: "A",
+		securityHQ: "S",
+		"Universal Rules": "v",
+	});
+
+	/**
+	 * The DOM element of name of the currently played passage or any of it's parents. Used during generation to
+	 * uncollapse the category with the current passage.
+	 * @type {HTMLElement}
+	 */
+	let currentPassage;
+	/**
+	 * DOM elements that have a notification. Used to traverse upwards to give the categories notifications too.
+	 * @type {Array<HTMLElement>}
+	 */
+	let notificationPassages;
+
+	let hotkeysEnabled = false;
+
+	// register hotkeys
+	for (const passage in hotkeys) {
+		Mousetrap.bind(hotkeys[passage], () => {
+			if (hotkeysEnabled
+				// the passage is accessible
+				&& !(hiddenPassages[passage] && hiddenPassages[passage]())) {
+				Engine.play(passage);
+			}
+		});
+	}
+
+	// setup history
+	let history = [];
+	let historyNavigation = false;
+	$(document).on(':passageinit', event => {
+		// if navigated here normally, add passage to history, otherwise remove last entry from history
+		if (!historyNavigation) {
+			if (State.passage === event.passage.title // reloaded
+				|| noHistory.includes(State.passage) // came from a no-history passage
+				|| noHistory.includes(event.passage.title) // no history for this passage
+			) {
+				return;
+			}
+			// if last passage can be jumped to add passage to history, otherwise clear history
+			if (jumpTo.includes(State.passage)) {
+				history.unshift(State.passage);
+			} else {
+				history = [];
+			}
+		} else {
+			historyNavigation = false;
+			history.shift();
+		}
+	});
+	Mousetrap.bind("backspace", () => {
+		// jump back in history
+		goBack();
+	});
+
+	/**
+	 * Goes back in history if possible.
+	 */
+	function goBack() {
+		if (history.length > 0 && jumpFrom.includes(State.passage)) {
+			historyNavigation = true;
+			Engine.play(history[0]);
+		}
+	}
+
+	/**
+	 * Add a "Return" link at second position if there is a history.
+	 * @param {HTMLDivElement} container
+	 */
+	function addBackLink(container) {
+		if (history.length > 0) {
+			const div = document.createElement("div");
+			div.classList.add("menu-link");
+			const a = document.createElement("a");
+			a.append("Return");
+			a.onclick = goBack;
+			div.append(a, " ", App.UI.DOM.makeElement("span", "[backspace]", "hotkey"));
+			// insert at second position
+			container.insertBefore(div, container.firstChild.nextSibling);
+		}
+	}
+
+	/**
+	 * Generate a quick menu
+	 * @returns {string|HTMLDivElement}
+	 */
+	function generateMenu() {
+		if (!jumpFrom.includes(State.passage)) {
+			hotkeysEnabled = false;
+			return "";
+		}
+		hotkeysEnabled = true;
+		currentPassage = null;
+		notificationPassages = [];
+
+		const div = document.createElement("div");
+		div.classList.add("quick-links");
+
+		try {
+			// quick menu
+			div.append(...generateLinkList(layout));
+			addBackLink(div);
+
+			// traverse from current passage up to uncollapse.
+			if (currentPassage !== null) {
+				while (!currentPassage.classList.contains("quick-links")) {
+					currentPassage.classList.remove("collapsed");
+					currentPassage = currentPassage.parentElement;
+				}
+			}
+
+			// traverse from notifications up to add icon
+			for (let i = 0; i < notificationPassages.length; i++) {
+				while (!notificationPassages[i].classList.contains("quick-links")) {
+					if (notificationPassages[i].classList.contains("category")) {
+						notificationPassages[i].classList.add("notification");
+					}
+					notificationPassages[i] = notificationPassages[i].parentElement;
+				}
+			}
+		} catch (e) {
+			console.error(e);
+			div.append("Quick Links generation failed. Please run ", App.UI.DOM.passageLink("Backwards Compatibility", "Backwards Compatibility"));
+		}
+
+		return div;
+	}
+
+	/**
+	 * Create a list of links and/or categories based on the given category
+	 *
+	 * @param {object} category
+	 * @returns {Array<HTMLElement>}
+	 */
+	function generateLinkList(category) {
+		/** @type {Array<HTMLElement>} */
+		const links = [];
+		for (const passage in category) {
+			if (category[passage] === true) {
+				addMenuLink(links, passage);
+			} else {
+				addCategory(links, passage, category[passage]);
+			}
+		}
+		return links;
+	}
+
+	/**
+	 * Add a category to a link list
+	 *
+	 * @param {Array<HTMLElement>} outerLinkList
+	 * @param {string} name
+	 * @param {object} category
+	 */
+	function addCategory(outerLinkList, name, category) {
+		const innerLinkList = generateLinkList(category);
+		if (innerLinkList.length === 0) {
+			// category is empty
+			return;
+		}
+		const toggle = document.createElement("div");
+		toggle.classList.add("toggle");
+		toggle.append(name);
+		const content = document.createElement("div");
+		content.classList.add("content");
+		content.append(...innerLinkList);
+
+		// wrap everything in one div, so we can control collapsing by changing only one class
+		const wrapper = document.createElement("div");
+		wrapper.classList.add("category", "collapsed");
+		toggle.onclick = () => {
+			wrapper.classList.toggle("collapsed");
+		};
+		wrapper.append(toggle, content);
+		outerLinkList.push(wrapper);
+	}
+
+	/**
+	 * Create a link to the given passage and add it to the link list if link is accessible.
+	 *
+	 * @param {Array<HTMLElement>} linkList
+	 * @param {string} passage
+	 */
+	function addMenuLink(linkList, passage) {
+		// passage is hidden
+		if (hiddenPassages.hasOwnProperty(passage) && hiddenPassages[passage]()) {
+			return;
+		}
+		// we show some kind of text/link
+		const div = document.createElement("div");
+		linkList.push(div);
+		div.classList.add("menu-link");
+		// this passage has a notification
+		if (notifications[passage] && notifications[passage]()) {
+			notificationPassages.push(div);
+			div.classList.add("notification");
+		}
+		// there is additional non-link info
+		if (extraInfo[passage]) {
+			div.append(" ", extraInfo[passage]());
+		}
+		// we are already on this passage
+		if (State.passage === passage) {
+			div.prepend(uiName(passage));
+			currentPassage = div;
+			return;
+		}
+		// That is not a passage we can safely jump to, it's a deco element
+		if (!jumpTo.includes(passage)) {
+			div.prepend(uiName(passage));
+			return;
+		}
+		// Create link
+		const a = document.createElement("a");
+		a.append(uiName(passage));
+		a.onclick = () => {
+			Engine.play(passage);
+		};
+		div.prepend(a);
+		if (hotkeys[passage]) {
+			div.append(" ", App.UI.DOM.makeElement("span", `[${hotkeys[passage]}]`, "hotkey"));
+		}
+	}
+
+	/**
+	 * Gives back the proper name for the passage or the passage title itself if there is none
+	 *
+	 * @param {string} passage
+	 * @returns {string}
+	 */
+	function uiName(passage) {
+		if (uiNames[passage]) {
+			if (typeof uiNames[passage] === "function") {
+				return uiNames[passage]();
+			}
+			return uiNames[passage];
+		}
+		return passage;
+	}
+
+	/**
+	 * Adds an "Other" category to a given layout consisting of passages that can be jumped to not sorted into the
+	 * existing layout.
+	 *
+	 * @param {object} layout
+	 * @returns {object}
+	 */
+	function addOtherCategory(layout) {
+		const passages = jumpTo.slice();
+		filterPassages(passages, layout);
+
+		if (passages.length > 0) {
+			const other = {};
+			for (let i = 0; i < passages.length; i++) {
+				other[passages[i]] = true;
+			}
+			layout.Other = other;
+		}
+		return layout;
+	}
+
+	/**
+	 * Remove all entries from a given list that exist as keys in a given layout.
+	 *
+	 * @param {Array<string>} passages
+	 * @param {object} layout
+	 */
+	function filterPassages(passages, layout) {
+		for (const category in layout) {
+			const index = passages.indexOf(category);
+			if (layout[category] === true) {
+				if (index > -1) {
+					passages.splice(index, 1);
+				}
+			} else {
+				filterPassages(passages, layout[category]);
+			}
+		}
+	}
+
+	/**
+	 * @param {App.Entity.Facilities.Facility} facility
+	 * @returns {string}
+	 */
+	function occupancy(facility) {
+		const desc = facility.occupancyReport(V.abbreviateSidebar === 2);
+		if (desc === "") {
+			return "";
+		}
+		return `(${desc})`;
+	}
+
+	/**
+	 * Cleans out all mappings that are not contained in jumpTo and therefore not considered safe.
+	 *
+	 * @param {object} keys
+	 * @returns {object}
+	 */
+	function cleanPassageMapping(keys) {
+		const result = {};
+		for (const key in keys) {
+			if (jumpTo.includes(key)) {
+				result[key] = keys[key];
+			} else {
+				console.log("Found mapping to unsafe passage: " + key + " to " + keys[key]);
+			}
+		}
+		return result;
+	}
+
+	return generateMenu;
+})();
diff --git a/src/gui/storyCaption.tw b/src/gui/storyCaption.tw
index 9f9122d65aa7659f1bfe398125e72ff70922d8e3..c73a92b0d4a98ec45195ad8eca0f36e41d353ef3 100644
--- a/src/gui/storyCaption.tw
+++ b/src/gui/storyCaption.tw
@@ -2,7 +2,7 @@
 
 <<set _Pass = passage()>>
 
-<<if $ui != "start">> <<userButton>> <br> <</if>>
+<<if $ui != "start">><p><<userButton>></p><</if>>
 
 <<if $ui != "start">>
 	<<if $cheatMode || $debugMode>>
@@ -268,298 +268,59 @@
 		<</if>> /* Closes secExp check and associated sideBarOptions options */
 	<</if>> /* Closes Pass != "Manage Penthouse""*/
 
-	<<if $nextButton != "Continue" && $nextButton != " ">>
-		<<if $nextButton != "Refresh" && _Pass != "RE recruit">>
-			<<if _Pass != "Manage Penthouse">> <br>
-				<span id="managePenthouse">
-					<<link [[Manage Penthouse]]>><</link>>
-				</span> @@.cyan;[P]@@
-			<</if>>
-			<<if _Pass != "Manage Arcology">> <br>
-				<span id="manageArcology">
-					<<link [[Manage Arcology]]>><</link>>
-				</span> @@.cyan;[C]@@
-			<</if>>
-
-			<<if _Pass != "Manage Personal Affairs">>
-				<span id="managePerson"> <br>
-					<<link [[Manage Personal Affairs]]>><</link>>
-				</span> @@.cyan;[X]@@
-			<</if>>
-			<<if $corp.Announced == 1 && _Pass != "Manage Corporation">>
-				<span id="manageCorporation"> <br>
-					<<link [[Manage Corporation][$nextButton = "Back", $nextLink = _Pass]]>><</link>>
-				</span>
-				<<if ($corp.SpecToken > 0) && ($corp.SpecTimer == 0)>>@@.yellow;[!]@@<</if>>
-			<</if>>
-		<</if>>
-
-		<<if _Pass == "Main">>
-			<span id="findSlave"> <br>
-				<<link [[Locate Slave|Find Slave]]>><</link>>
-			</span>
-		<</if>>
-
-		<<if ($sideBarOptions.compact == 0 && _Pass == "Main") || ($sideBarOptions.compact == 1 && _Pass == "Manage Arcology")>> <br>
-			<<if $FSAnnounced>>
-				<span id="FSButton"> <br>
-				<<link [[Future Societies|Future Society][$nextButton = "Back", $nextLink = "Main"]]>><</link>>
-				</span> @@.cyan;[F]@@
-				<<if ($FSCredits > 0) || ($FSReminder)>>@@.yellow;[!]@@<</if>>
-			<</if>>
-			<span id="PAOButton"> <br>
-				<<link [[Personal Assistant|Personal assistant options]]>><</link>>
-			</span> @@.cyan;[T]@@
-		<</if>>
-
-		<<if _Pass == "Main" && $newModelUI == 0>>
-				<<set _L = App.Utils.countFacilityWorkers()>>
-				<<if ($HGSuite)>>
-					<br> <<link "$HGSuiteNameCaps""Head Girl Suite">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						<<if $HeadGirl != 0>>(HG<<if _L.HGSuite > 0>>, 1)<<else>>)<</if>><</if>>
-					<<else>>
-						<<if $HeadGirl != 0>>(HG<<if  _L.HGSuite > 0>> and slave<<else>>)<</if>><</if>>
-					<</if>>
-				<</if>>
-				<<if ($dojo > 1)>>
-					<br>[[Armory|BG Select]]
-					<<if $Bodyguard != 0>>
-						(BG)
-					<</if>>
-				<</if>>
-
-				<<if ($brothel)>>
-					<br> <<link "$brothelNameCaps""Brothel">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.brothel/<<= $brothel>> whores<<if $Madam>>, madam<</if>>)
-					<<else>>
-						(_L.brothel/<<= $brothel>><<if $Madam>>, L<</if>>)
-					<</if>>
-				<</if>>
-				<<if ($club)>>
-					<br> <<link "$clubNameCaps""Club">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.club/<<= $club>> sluts<<if $DJ>>, DJ<</if>>)
-					<<else>>
-						(_L.club/<<= $club>><<if $DJ>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($arcade)>>
-					<br> <<link "$arcadeNameCaps""Arcade">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.arcade/<<= $arcade>> inmates)
-					<<else>>
-						(_L.arcade/<<= $arcade>>)
-					<</if>>
-				<</if>>
-				<<if ($dairy)>>
-					<br> <<link "$dairyNameCaps""Dairy">><</link>>
-					<<set _SCapT9 = $bioreactorsXY+$bioreactorsXX+$bioreactorsHerm+$bioreactorsBarren>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.dairy<<if _SCapT9>>+_SCapT9<</if>>/<<= $dairy>> cows<<if $Milkmaid>>, milkmaid<</if>>)
-					<<else>>
-						(_L.dairy<<if _SCapT9>>+_SCapT9<</if>>/<<= $dairy>><<if $Milkmaid>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($farmyard)>>
-					<br> <<link "$farmyardNameCaps""Farmyard">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.farmyard/$farmyard farmhands<<if $Farmer>>, farmer<</if>>)
-					<<else>>
-						(_L.farmyard/$farmyard<<if $Farmer>>, L<</if>>)
-					<</if>>
-				<</if>>
-				<<if ($servantsQuarters)>>
-					<br> <<link "$servantsQuartersNameCaps""Servants' Quarters">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.servantsQuarters/$servantsQuarters servants<<if $Stewardess>>, stewardess<</if>>)
-					<<else>>
-						(_L.servantsQuarters/$servantsQuarters<<if $Stewardess>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($masterSuite)>>
-					<br> <<link "$masterSuiteNameCaps""Master Suite">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.masterSuite/$masterSuite <<if _L.masterSuite != 1>>fucktoys<<else>>fucktoy<</if>><<if $Concubine>>, Concubine<</if>>)
-					<<else>>
-						(_L.masterSuite/$masterSuite<<if $Concubine>>, C<</if>>)
-					<</if>>
-				<</if>>
-				<<if ($schoolroom)>>
-					<br> <<link "$schoolroomNameCaps""Schoolroom">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.schoolroom/$schoolroom <<if _L.schoolroom != 1>>students<<else>>student<</if>><<if $Schoolteacher>>, schoolteacher<</if>>)
-					<<else>>
-						(_L.schoolroom/$schoolroom<<if $Schoolteacher>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($spa)>>
-					<br> <<link "$spaNameCaps""Spa">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.spa/$spa <<if _L.spa != 1>>bathers<<else>>bathing<</if>><<if _S.Attendant>>, attendant<</if>>)
-					<<else>>
-						(_L.spa/$spa<<if _S.Attendant>>, L<</if>>)
-					<</if>>
-				<</if>>
-				<<if ($nursery)>>
-					<br> <<link "$nurseryNameCaps""Nursery">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(<<if $nursery-$nurseryBabies == 0>>No empty rooms<<elseif $nursery-$nurseryBabies == 1>>1 empty room<<else>><<= $nursery-$nurseryBabies>> empty rooms<</if>>, _L.nursery/$nurseryNannies <<if _L.nursery != 1>>nannies<<else>>nanny<</if>><<if $Matron>>, attendant<</if>>)
-					<<else>>
-						($nurseryBabies/$nursery, _L.nursery/$nurseryNannies<<if $Matron>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($clinic)>>
-					<br> <<link "$clinicNameCaps""Clinic">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.clinic/$clinic <<if _L.clinic != 1>>patients<<else>>patient<</if>><<if $Nurse>>, nurse<</if>>)
-					<<else>>
-						(_L.clinic/$clinic<<if $Nurse>>, L<</if>>)
-					<</if>>
-				<</if>>
-				<<if ($cellblock)>>
-					<br> <<link "$cellblockNameCaps""Cellblock">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(_L.cellblock/$cellblock <<if _L.cellblock != 1>>prisoners<<else>>prisoner<</if>><<if $Wardeness>>, wardeness<</if>>)
-					<<else>>
-						(_L.cellblock/$cellblock<<if $Wardeness>>, L<</if>>)
-					<</if>>
-				<</if>>
-
-				<<if ($incubator)>>
-					<br> <<link "$incubatorNameCaps""Incubator">><</link>>
-					<<if $abbreviateSidebar == 2>>
-						(<<if $incubator-$incubatorSlaves == 0>>No empty tanks<<elseif $incubator-$incubatorSlaves == 1>>1 empty tank<<else>><<= $incubator-$incubatorSlaves>> empty tanks<</if>>)
-					<<else>>
-						($incubatorSlaves/$incubator)
-					<</if>>
-					<<if $readySlaves > 0>> @@.yellow;[!]@@ <</if>>
-				<</if>>
-				<<if ($pit)>>
-					<br> <<link "$pitNameCaps""Pit">><</link>>
-					<<set _SCapT = $fighterIDs.length>>
-					<<if $abbreviateSidebar == 2>>
-						(_SCapT <<if _SCapT != 1>>combatants<<else>>combatant<</if>>)
-					<<else>>
-						(_SCapT)
-					<</if>>
-					<br>
-				<</if>>
-		<</if>> /* closes _Pass == "Main" && $newModelUI == 0 */
-
-		<<if ($sideBarOptions.compact == 0 && _Pass == "Main") || ($sideBarOptions.compact == 1 && _Pass == "Manage Arcology")>>
-			<span id="policyButton"> <br>
-				<<link [[Policies]]>><</link>>
-			</span> @@.cyan;[Y]@@
-
-			<<if $secExpEnabled > 0>>
-				<span id="edictButton"> <br>
-					<<link [[Edicts|edicts]]>><</link>>
-				</span> @@.cyan;[E]@@
-			<</if>>
-			<<if $arcologies.length > 1>>
-				<span id="diplomacyButton"> <br>
-					<<link [[Diplomacy|Neighbor Interact]]>><</link>>
-				</span> @@.cyan;[D]@@
-			<</if>>
-
-			<span id="Security">
-			<<if ($secExpEnabled > 0 && ($SecExp.buildings.propHub.active + $secHQ + $SecExp.buildings.barracks.active + $riotCenter > 0)) || $SF.Toggle && $SF.Active >= 1>> <br>
-				<<link "Manage Security">> <<replace "#Security">> <<security>> <</replace>> <</link>>
-			<</if>>
-			</span>
-		<</if>>
+	<p>
+		<<includeDOM App.UI.quickMenu()>>
+	</p>
 
-		<<if _Pass == "Manage Penthouse">>
-			<span id="URButton"> <br><br>
-				<<link [[Universal Rules]]>><</link>>
-			</span> @@.cyan;[V]@@
-
-			<<if $geneticMappingUpgrade>> <br>[[Gene Lab|Gene Lab]]<</if>>
-			<<if $dispensary>> <br>[[Pharmaceutical Fabricator|Dispensary]]<</if>>
-			<<if $organFarmUpgrade>> <br>[[Organ Farm]]<</if>>
-			<<if $ImplantProductionUpgrade>> <br>[[Implant Manufactory]]<</if>>
-			<<if $researchLab.level > 0>> <br>[[Prosthetic Lab]]<</if>>
-			<<if $geneticMappingUpgrade + $dispensary + $organFarmUpgrade + $ImplantProductionUpgrade + $researchLab.level > 0>>
-				<br>
-			<</if>>
-
-			<br> [[Wardrobe]]
-			<<if $rep >= 10000>>
-				<br>[[Black Market|The Black Market]]
-			<<else>>
-				<br>You lack the reputation (<<= num(10000)>>) to be invited to the underground Black Market.
-			<</if>>
-
-		<<elseif ["Dispensary", "Organ Farm", "Implant Manufactory", "Gene Lab", "Prosthetic Lab"].includes(_Pass)>>
-			<<if $dispensary && _Pass != "Dispensary">> <br>[[Pharmaceutical Fabricator|Dispensary]]<</if>>
-			<<if $organFarmUpgrade && _Pass != "Organ Farm">> <br>[[Organ Farm]]<</if>>
-			<<if $ImplantProductionUpgrade && _Pass != "Implant Manufactory">> <br>[[Implant Manufactory]]<</if>>
-			<<if $geneticMappingUpgrade && _Pass != "Gene Lab">> <br>[[Gene Lab]]<</if>>
-			<<if $prostheticsUpgrade && _Pass != "Prosthetic Lab">> <br>[[Prosthetic Lab]]<</if>>
-
-		<<elseif _Pass == "Rules Assistant">> <br>
-			[[Rules Assistant Summary]]
-
-		<<elseif ["Firebase", "propagandaHub", "securityHQ", "secBarracks", "riotControlCenter"].includes(_Pass)>>
-			<<security>>
+	<<if $nextButton != "Continue" && $nextButton != " ">>
+		<<if _Pass == "Rules Assistant">>
+			<p>[[Rules Assistant Summary]]</p>
 		<</if>> /* Closes Pass state check */
 
-		<br><br>
-		<<if $nextButton != "Refresh" && _Pass != "RE recruit">>
-			<<if !["Description Options", "Options", "Summary Options"].includes(_Pass)>>
-				<span id="optionsButton">
-					<<link [[Game Options|Options][$nextButton = "Back", $nextLink = _Pass]]>><</link>>
-				</span> @@.cyan;[O]@@
-			<<else>>
-				<<if _Pass != "Summary Options">> [[Summary Options]] <</if>>
-				<<if _Pass == "Options">> <br> <</if>>
-				<<if _Pass != "Description Options">> [[Description Options]] <</if>>
-			<</if>>
-		<</if>>
-
 		<<if $debugMode > 0>>
-			<br><br>Debugging Tools<br> <<link "Display Variables">><<checkvars>><</link>>
-			<br> <<link "Display Changed Variables">>
-				<<set Config.history.maxStates = 2>> /* makes sure we store the current state so we can return to it */
-				<<goto "Variable Difference">>
-			<</link>>
-
-			<br> <<link "Bug Report">><<bugreport>><</link>>
-			<<if $debugModeCustomFunction > 0>>
-				<br> <<textarea "_customEvalCode" "">>
-				<<link "Run Custom Function">>
-					<<if _customEvalCode>>
-						<<if _customEvalCode.charAt(0) != "(" || $nextLink == ")">> /* second condition is only there for sanityCheck */
-							<<set _customEvalCode = "(" + _customEvalCode + ")">>
-						<</if>>
-						<<if typeof eval(_customEvalCode) === "function">>
-							<<run (eval(_customEvalCode))()>>
-						<</if>>
-					<</if>>
-					<<goto _Pass>>
-				<</link>>
-			<</if>>
-			<br> <<link "Dump Game State">><<run App.Debug.dumpGameState()>><</link>>
+			<p>
+				Debugging Tools
+				<div><<link "Display Variables">><<checkvars>><</link>></div>
+				<div>
+					<<link "Display Changed Variables">>
+						<<set Config.history.maxStates = 2>> /* makes sure we store the current state so we can return to it */
+						<<goto "Variable Difference">>
+					<</link>>
+				</div>
+				<div><<link "Bug Report">><<bugreport>><</link>></div>
+				<<if $debugModeCustomFunction > 0>>
+					<div>
+						<<textarea "_customEvalCode" "">>
+						<<link "Run Custom Function">>
+							<<if _customEvalCode>>
+								<<if _customEvalCode.charAt(0) != "(" || $nextLink == ")">> /* second condition is only there for sanityCheck */
+									<<set _customEvalCode = "(" + _customEvalCode + ")">>
+								<</if>>
+								<<if typeof eval(_customEvalCode) === "function">>
+									<<run (eval(_customEvalCode))()>>
+								<</if>>
+							<</if>>
+							<<goto _Pass>>
+						<</link>>
+					</div>
+				<</if>>
+				<div><<link "Dump Game State">><<run App.Debug.dumpGameState()>><</link>></div>
+			</p>
 		<</if>>
 	<</if>> /* Closes nextButton != "Continue" && nextButton != " " */
-	<br>
 <<elseif _Pass == "Starting Girls">>
 	<<set _slaveCost = startingSlaveCost($activeSlave)>>
-	<<if _slaveCost > $cash>>
-	@@.red;This slave will cost ''<<print cashFormat(_slaveCost)>>.''<br>
-	You only have: <<print cashFormat($cash)>>@@
-	<<else>>
-	This slave will cost @@.yellowgreen;''<<print cashFormat(_slaveCost)>>.''@@<br>
-	You have <<print cashFormat($cash)>>.
-	<</if>>
-	<br>
+	<p>
+		<<if _slaveCost > $cash>>
+			@@.red;This slave will cost ''<<print cashFormat(_slaveCost)>>.''<br>
+			You only have: <<print cashFormat($cash)>>@@
+		<<else>>
+			This slave will cost @@.yellowgreen;''<<print cashFormat(_slaveCost)>>.''@@<br>
+			You have <<print cashFormat($cash)>>.
+		<</if>>
+	</p>
 <</if>>
 
-//''FCE'':// <<= App.Encyclopedia.Dialog.linkSC($encyclopedia, $encyclopedia)>>
+<p>
+	//''FCE'':// <<= App.Encyclopedia.Dialog.linkSC($encyclopedia, $encyclopedia)>>
+</p>
diff --git a/src/gui/storyCaptionWidgets.tw b/src/gui/storyCaptionWidgets.tw
index 7e20114b35f6e1f0b7f361f1ed75cf47575d0522..a8616c836cd97a0ccaa8c7a5a96f418853a33889 100644
--- a/src/gui/storyCaptionWidgets.tw
+++ b/src/gui/storyCaptionWidgets.tw
@@ -16,10 +16,6 @@
 			<strong><div id="nextButton">
 			<<if $nextButton != " ">>
 				<<link "$nextButton">>
-					<<if _passageSwitchHandler>>
-						<<run _passageSwitchHandler();>>
-						<<set _passageSwitchHandler = null>>
-					<</if>>
 					<<goto $nextLink>>
 				<</link>> @@.cyan;[Space]@@
 			<</if>>
@@ -27,38 +23,3 @@
 		<</if>>
 	<</if>>
 <</widget>>
-
-<<widget "security">>
-	<<if ($SF.Toggle && $SF.Active >= 1) || $secExpEnabled > 0 && ($SecExp.buildings.propHub.active + $secHQ + $SecExp.buildings.barracks.active + $riotCenter) > 1>>
-		<br>
-	<</if>>
-	<<if $SF.Toggle && $SF.Active >= 1 && _Pass != "Firebase">>
-		<span id="SFMButton"> <br>
-			<<link "<<= App.SF.Caps()>>'s firebase""Firebase">><</link>>
-		</span> @@.cyan;[Z]@@
-	<</if>>
-
-	<<if $secExpEnabled > 0>>
-		<<if $SecExp.buildings.propHub.active > 0 && _Pass != "propagandaHub">>
-			<span id="propHub"> <br>
-				<<link [[Manage PR|propagandaHub]]>><</link>>
-			</span> @@.cyan;[Shift+H]@@
-		<</if>>
-		<<if $secHQ > 0 && _Pass != "securityHQ">>
-			<span id="securityHQ"> <br>
-				<<link [[Manage Security|securityHQ]]>><</link>>
-			</span> @@.cyan;[Shift+S]@@
-		<</if>>
-
-		<<if $SecExp.buildings.barracks.active > 0 && _Pass != "secBarracks">>
-			<span id="secBarracks"> <br>
-				<<link [[Manage Military|secBarracks]]>><</link>>
-			</span> @@.cyan;[Shift+A]@@
-		<</if>>
-		<<if $riotCenter > 0 && _Pass != "riotControlCenter">>
-			<span id="riotCenter"> <br>
-				<<link [[Manage Rebels|riotControlCenter]]>><</link>>
-			</span> @@.cyan;[Shift+R]@@
-		<</if>>
-	<</if>>
-<</widget>>
diff --git a/src/interaction/policies/policies.tw b/src/interaction/policies/policies.tw
index 630654d3e3e3a405195093e7b792201e8675344d..cd3de14313d8f410571e5d11793e479a2ba2c206 100644
--- a/src/interaction/policies/policies.tw
+++ b/src/interaction/policies/policies.tw
@@ -1,4 +1,4 @@
-:: Policies [nobr]
+:: Policies [nobr jump-to-safe jump-from-safe]
 
 <style>
 .active {
@@ -7,7 +7,7 @@
 </style>
 
 <<set $nextButton = "Back">>
-<<set _passageSwitchHandler = App.EventHandlers.societyChanged>>
+<<set $passageSwitchHandler = App.EventHandlers.societyChanged>>
 <<if $arcologies[0].FSSupremacistLawME && $PC.race != $arcologies[0].FSSupremacistRace>>
 	<<set $nextLink = "Gameover", $gameover = "Idiot Ball 2 The Dumbassening">>
 <<elseif $arcologies[0].FSSubjugationistLawME && $PC.race == $arcologies[0].FSSubjugationistRace>>
diff --git a/src/interaction/prostheticLab.tw b/src/interaction/prostheticLab.tw
index 1d8d739b8409bbf18d9f4a323e30f546e62ff8b4..d79406219171cdbe75c9cb7732cc43e0a8073730 100644
--- a/src/interaction/prostheticLab.tw
+++ b/src/interaction/prostheticLab.tw
@@ -1,4 +1,4 @@
-:: Prosthetic Lab [nobr]
+:: Prosthetic Lab [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse">>
 
diff --git a/src/js/slaveListing.js b/src/js/slaveListing.js
index 9aa9560067b09220357b15590088ebf8824e817e..b97674baaa0da8c76dccc5452ac654ad4a279026 100644
--- a/src/js/slaveListing.js
+++ b/src/js/slaveListing.js
@@ -314,7 +314,12 @@ App.UI.SlaveList.render = function() {
 			if (slave.subTarget === -1) {
 				assignment.innerText += ", serving as your Stud";
 			} else if (slave.subTarget !== 0) {
-				assignment.innerText += ", serving " + SlaveFullName(slaves[V.slaveIndices[slave.subTarget]]) + " exclusively";
+				const domSlave = getSlave(slave.subTarget);
+				if (domSlave) {
+					assignment.innerText += ", serving " + SlaveFullName(domSlave) + " exclusively";
+				} else {
+					slave.subTarget = 0;
+				}
 			}
 		}
 		assignment.innerText += ".";
diff --git a/src/npc/agent/agentSelect.tw b/src/npc/agent/agentSelect.tw
index 4b66d67ac2881b8a2cc8de545b5902ccc3d1b462..147416474dbbb8ae100fc6168f18b47cb21a9610 100644
--- a/src/npc/agent/agentSelect.tw
+++ b/src/npc/agent/agentSelect.tw
@@ -1,11 +1,11 @@
-:: Agent Select [nobr]
+:: Agent Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Neighbor Interact", $encyclopedia = "Agents">>
 ''Appoint an Agent from your devoted slaves:''
 
 <<= App.UI.SlaveList.slaveSelectionList(
-		s => (s.fuckdoll === 0 && s.devotion > 20 && s.intelligence + s.intelligenceImplant > 15 && s.intelligenceImplant >= 15 && canWalk(s) && canSee(s) && canHear(s) && canTalk(s) && s.broodmother < 2 && (s.breedingMark !== 1 || State.variables.propOutcome === 0 || State.variables.eugenicsFullControl === 1 || State.variables.arcologies[0].FSRestart === "unset")),
-		(slave, index) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Agent Workaround',
-			() => { variables().i = index; }),
+		s => (s.fuckdoll === 0 && s.devotion > 20 && s.intelligence + s.intelligenceImplant > 15 && s.intelligenceImplant >= 15 && canWalk(s) && canSee(s) && canHear(s) && canTalk(s) && s.broodmother < 2 && (s.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")),
+		(slave) => App.UI.DOM.passageLink(SlaveFullName(slave), 'Agent Workaround',
+			() => { V.i = V.slaves.findIndex((s) => s.ID === slave.ID); }),
 		s => App.Entity.facilities.arcologyAgent.manager.slaveHasExperience(s)
 	)>>
diff --git a/src/npc/agent/agentWorkaround.tw b/src/npc/agent/agentWorkaround.tw
index 47b08f4975ac1f709d496790a44f474bffa3fef6..9a0412913bca906d783ad0181089556796fd90ba 100644
--- a/src/npc/agent/agentWorkaround.tw
+++ b/src/npc/agent/agentWorkaround.tw
@@ -1,4 +1,4 @@
-:: Agent Workaround [nobr]
+:: Agent Workaround [nobr jump-from-safe]
 
 <<set $nextButton = "Continue", $nextLink = "Neighbor Interact">>
 
diff --git a/src/npc/asDump.tw b/src/npc/asDump.tw
index 53e23167d226133b5a0afb078d0306344d404705..b4cbe49c29a289151e1421f15e92cfe2384ee915 100644
--- a/src/npc/asDump.tw
+++ b/src/npc/asDump.tw
@@ -1,4 +1,4 @@
-:: AS Dump
+:: AS Dump [no-history]
 
 <<if (ndef $activeSlave) || ($activeSlave == 0)>>
 
diff --git a/src/npc/findSlave.tw b/src/npc/findSlave.tw
index 31ccfef53bbc1ff889aad854173001a86a2921ed..204f8a2b4b9f614b74a95a9c5bd366c9f03189e3 100644
--- a/src/npc/findSlave.tw
+++ b/src/npc/findSlave.tw
@@ -1,4 +1,4 @@
-:: Find Slave [nobr]
+:: Find Slave [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main">>
 
diff --git a/src/npc/interaction/FFuckdollAnal.tw b/src/npc/interaction/FFuckdollAnal.tw
index 1482ff00fc8cf78e5aac9221aed8ecd23deb15ff..1eb3cb0e90e5b3ea82476f72778db26eb3ba835b 100644
--- a/src/npc/interaction/FFuckdollAnal.tw
+++ b/src/npc/interaction/FFuckdollAnal.tw
@@ -1,4 +1,4 @@
-:: FFuckdollAnal [nobr]
+:: FFuckdollAnal [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/FFuckdollImpreg.tw b/src/npc/interaction/FFuckdollImpreg.tw
index 698559bab8f5f6df7509f58968e8ac4c3bef79ed..00db19147b0c1e2f4c0499b841734303eb08a34f 100644
--- a/src/npc/interaction/FFuckdollImpreg.tw
+++ b/src/npc/interaction/FFuckdollImpreg.tw
@@ -1,4 +1,4 @@
-:: FFuckdollImpreg [nobr]
+:: FFuckdollImpreg [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/FFuckdollOral.tw b/src/npc/interaction/FFuckdollOral.tw
index 9a7dc13fa8fd4f5bbcae4bdbc15c6c75bac7cb53..66cfc24ef2f8af2be2b5bad756442374a1c96503 100644
--- a/src/npc/interaction/FFuckdollOral.tw
+++ b/src/npc/interaction/FFuckdollOral.tw
@@ -1,4 +1,4 @@
-:: FFuckdollOral [nobr]
+:: FFuckdollOral [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/FFuckdollVaginal.tw b/src/npc/interaction/FFuckdollVaginal.tw
index 268ace4bf2289a1f511813bec52d690e0bc61022..77f62d82afb749e73e274e237ad5f739ea22fd88 100644
--- a/src/npc/interaction/FFuckdollVaginal.tw
+++ b/src/npc/interaction/FFuckdollVaginal.tw
@@ -1,4 +1,4 @@
-:: FFuckdollVaginal [nobr]
+:: FFuckdollVaginal [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/FSuckle.tw b/src/npc/interaction/FSuckle.tw
index 23c23895362898b25b29433c21f60353465842ef..4a2a5eb7eb129d2db6d19cb3ea8ee583230cb2b9 100644
--- a/src/npc/interaction/FSuckle.tw
+++ b/src/npc/interaction/FSuckle.tw
@@ -1,4 +1,4 @@
-:: FSuckle [nobr]
+:: FSuckle [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<run Enunciate($activeSlave)>>
diff --git a/src/npc/interaction/fAbuse.tw b/src/npc/interaction/fAbuse.tw
index e111159628637e985e12b605b0414774a44c57a9..3576b3642a3f38bab98acd39ecb32b7edf812c50 100644
--- a/src/npc/interaction/fAbuse.tw
+++ b/src/npc/interaction/fAbuse.tw
@@ -1,4 +1,4 @@
-:: FAbuse [nobr]
+:: FAbuse [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fAnus.tw b/src/npc/interaction/fAnus.tw
index 73cff54da5e28e089edf47fea647038998a4639b..2218ff43a6ea48b24d9451d0f88897eb20ec9c4a 100644
--- a/src/npc/interaction/fAnus.tw
+++ b/src/npc/interaction/fAnus.tw
@@ -1,4 +1,4 @@
-:: FAnus [nobr]
+:: FAnus [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fAssistedSex.tw b/src/npc/interaction/fAssistedSex.tw
index dc1d9326fc511f24b81134e3fb2d84a0bf57e28b..e809d033e2bd48e1ddba47c53d8687f8c09ebb98 100644
--- a/src/npc/interaction/fAssistedSex.tw
+++ b/src/npc/interaction/fAssistedSex.tw
@@ -1,4 +1,4 @@
-:: FAssistedSex [nobr]
+:: FAssistedSex [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fBeg.tw b/src/npc/interaction/fBeg.tw
index bb171297eee93986705a6da2c970a5e52222dff7..a1f94f2c2159a3d0613fdecb2d92607a40a3f36f 100644
--- a/src/npc/interaction/fBeg.tw
+++ b/src/npc/interaction/fBeg.tw
@@ -1,4 +1,4 @@
-:: FBeg [nobr]
+:: FBeg [nobr no-history]
 
 /* things I need: checks for canWalk() to see how easily she can move, blindness checks, replacement for BoobsDesc, maybe devotion catches for certain flaws */
 /* priority! femPC support! */
diff --git a/src/npc/interaction/fBellyFuck.tw b/src/npc/interaction/fBellyFuck.tw
index febe54b84ee640f729d7150d6722e93b37020eea..bb2c5857ae12c972aa1dfdc0435fb2d6295a8f7e 100644
--- a/src/npc/interaction/fBellyFuck.tw
+++ b/src/npc/interaction/fBellyFuck.tw
@@ -1,4 +1,4 @@
-:: FBellyFuck [nobr]
+:: FBellyFuck [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fBoobs.tw b/src/npc/interaction/fBoobs.tw
index 9216055783c9c60e00e1a3e5fd6f9fab650c23fa..037516b5a9676580d68035ba2ae809abbf06bd03 100644
--- a/src/npc/interaction/fBoobs.tw
+++ b/src/npc/interaction/fBoobs.tw
@@ -1,4 +1,4 @@
-:: FBoobs [nobr]
+:: FBoobs [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fButt.tw b/src/npc/interaction/fButt.tw
index 2f262587180cafbf2ddff0696b91d3e441e4c9bf..99d02192b0a64675463bcfc2b8e4c63fa1e37850 100644
--- a/src/npc/interaction/fButt.tw
+++ b/src/npc/interaction/fButt.tw
@@ -1,4 +1,4 @@
-:: FButt [nobr]
+:: FButt [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fCaress.tw b/src/npc/interaction/fCaress.tw
index be2830bfe89b0c9dd64f2a783e9590d299ccfe3d..4548eacf591df2d17044471d28abc65ec952102f 100644
--- a/src/npc/interaction/fCaress.tw
+++ b/src/npc/interaction/fCaress.tw
@@ -1,4 +1,4 @@
-:: FCaress [nobr]
+:: FCaress [nobr no-history]
 
 <<setPlayerPronouns>>
 <<set $AS = $activeSlave.ID>>
diff --git a/src/npc/interaction/fDance.tw b/src/npc/interaction/fDance.tw
index 7a1c6a83e086ed8bbe6af87e1a6d84f2e1a2afea..7ccc9dbf4589a3c5cd9ed43bf9fd49a3174b7bc9 100644
--- a/src/npc/interaction/fDance.tw
+++ b/src/npc/interaction/fDance.tw
@@ -1,4 +1,4 @@
-:: FDance [nobr]
+:: FDance [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fDick.tw b/src/npc/interaction/fDick.tw
index 18af069c27870fca63db405ae769b0b598513383..4463b3e59ad556f1d0ebb1555167dc48feca9985 100644
--- a/src/npc/interaction/fDick.tw
+++ b/src/npc/interaction/fDick.tw
@@ -1,4 +1,4 @@
-:: FDick [nobr]
+:: FDick [nobr no-history]
 /* TODO: .pregMood and more amp variants */
 
 <<set $AS = $activeSlave.ID>>
diff --git a/src/npc/interaction/fEmbrace.tw b/src/npc/interaction/fEmbrace.tw
index ce6dafb6cf64aa66b697ba144bfc3e9ff05c661b..d91ada3ada5b6c9594d912b0203bfbca1e1fd499 100644
--- a/src/npc/interaction/fEmbrace.tw
+++ b/src/npc/interaction/fEmbrace.tw
@@ -1,4 +1,4 @@
-:: FEmbrace [nobr]
+:: FEmbrace [nobr no-history]
 
 <<setPlayerPronouns>>
 <<set $AS = $activeSlave.ID>>
diff --git a/src/npc/interaction/fFeelings.tw b/src/npc/interaction/fFeelings.tw
index 02a1f016a4ec24cd89d83776df58fb541f7f9d6c..e3ee640ff841615771a0aad2e0449529bf426c31 100644
--- a/src/npc/interaction/fFeelings.tw
+++ b/src/npc/interaction/fFeelings.tw
@@ -1,4 +1,4 @@
-:: FFeelings [nobr]
+:: FFeelings [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 
diff --git a/src/npc/interaction/fFeet.tw b/src/npc/interaction/fFeet.tw
index bbeca8c26e70c5c3ee128f731aa4a764212f5e72..9e4085ccf539145177d813a72b459630a36485ed 100644
--- a/src/npc/interaction/fFeet.tw
+++ b/src/npc/interaction/fFeet.tw
@@ -1,4 +1,4 @@
-:: FFeet [nobr]
+:: FFeet [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fKiss.tw b/src/npc/interaction/fKiss.tw
index a377816d00d355bea8c05d580d192c8996859fc9..c708b599c0b01f490dd1c1a72b12203340a52d19 100644
--- a/src/npc/interaction/fKiss.tw
+++ b/src/npc/interaction/fKiss.tw
@@ -1,4 +1,4 @@
-:: FKiss [nobr]
+:: FKiss [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fLickPussy.tw b/src/npc/interaction/fLickPussy.tw
index eee1cdb815084f41147012348d07a9637f493a3a..d060cddc6a5c768cbed77a2007ff331791c4e18d 100644
--- a/src/npc/interaction/fLickPussy.tw
+++ b/src/npc/interaction/fLickPussy.tw
@@ -1,4 +1,4 @@
-:: FLickPussy [nobr]
+:: FLickPussy [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fLips.tw b/src/npc/interaction/fLips.tw
index 0cc558174b3adf3aa96660106ca3088ce231c021..3ea471f467cb7ef269c3e02ff130a702e39e0eb9 100644
--- a/src/npc/interaction/fLips.tw
+++ b/src/npc/interaction/fLips.tw
@@ -1,4 +1,4 @@
-:: FLips [nobr]
+:: FLips [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fMaternitySwing.tw b/src/npc/interaction/fMaternitySwing.tw
index 2642f35c493b4821314edc47361caca76b4df676..2d3a9eeceab5640382ebcc2629c42e9517755bf2 100644
--- a/src/npc/interaction/fMaternitySwing.tw
+++ b/src/npc/interaction/fMaternitySwing.tw
@@ -1,4 +1,4 @@
-:: FMaternitySwing [nobr]
+:: FMaternitySwing [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fNippleFuck.tw b/src/npc/interaction/fNippleFuck.tw
index 48631df4c303f32b0744b87786eee59cb04d1d2a..33b2065de50e7301498c43ea15a3bb32ba85ec4d 100644
--- a/src/npc/interaction/fNippleFuck.tw
+++ b/src/npc/interaction/fNippleFuck.tw
@@ -1,4 +1,4 @@
-:: FNippleFuck [nobr]
+:: FNippleFuck [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<run Enunciate($activeSlave)>>
diff --git a/src/npc/interaction/fPCImpreg.tw b/src/npc/interaction/fPCImpreg.tw
index 72b261d6aaf86303c3bf3625685459b73fe8795c..73651bcafd52d185d1fa9af5f3a100e307f0d02d 100644
--- a/src/npc/interaction/fPCImpreg.tw
+++ b/src/npc/interaction/fPCImpreg.tw
@@ -1,4 +1,4 @@
-:: FPCImpreg [nobr]
+:: FPCImpreg [nobr no-history]
 
 /* TODO: add reactions for incest */
 
diff --git a/src/npc/interaction/fPat.tw b/src/npc/interaction/fPat.tw
index a56458e24b4a01960a0da2f9b195e856832a371c..4de3f628f04259edebc253d5867a9a1e81e3b8d2 100644
--- a/src/npc/interaction/fPat.tw
+++ b/src/npc/interaction/fPat.tw
@@ -1,4 +1,4 @@
-:: FPat [nobr]
+:: FPat [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<run Enunciate($activeSlave)>>
diff --git a/src/npc/interaction/fPoolSex.tw b/src/npc/interaction/fPoolSex.tw
index 0b7378211243d7cff6cfc6d4ff2017b2750d747a..baf3d3a14ea16aba4189841c7d195e5eaf565151 100644
--- a/src/npc/interaction/fPoolSex.tw
+++ b/src/npc/interaction/fPoolSex.tw
@@ -1,4 +1,4 @@
-:: FPoolSex [nobr]
+:: FPoolSex [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fRelation.tw b/src/npc/interaction/fRelation.tw
index f02f48bae408c9bc94aba0fccbe39658e91906af..d3863431b65406ebe9269ca18460e1a7617db8c3 100644
--- a/src/npc/interaction/fRelation.tw
+++ b/src/npc/interaction/fRelation.tw
@@ -1,4 +1,4 @@
-:: FRelation [nobr]
+:: FRelation [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 
diff --git a/src/npc/interaction/fRival.tw b/src/npc/interaction/fRival.tw
index 7221a0b16fa65e0c720add2e8b26e36d69232aaa..19ea7feae342d52ceab63358db87b2bf25edf0a8 100644
--- a/src/npc/interaction/fRival.tw
+++ b/src/npc/interaction/fRival.tw
@@ -1,4 +1,4 @@
-:: FRival [nobr]
+:: FRival [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<set $partner = $slaveIndices[$activeSlave.rivalryTarget]>>
diff --git a/src/npc/interaction/fSlaveFeed.tw b/src/npc/interaction/fSlaveFeed.tw
index cf62f44f5dec021085e89ab51997040b01eb3289..c621bc715e69a3cdc4b039f1325aa630c1445ff3 100644
--- a/src/npc/interaction/fSlaveFeed.tw
+++ b/src/npc/interaction/fSlaveFeed.tw
@@ -1,4 +1,4 @@
-:: FSlaveFeed [nobr]
+:: FSlaveFeed [nobr no-history]
 
 <<set _pregDiscovery = 0>>
 <<set $AS = $activeSlave.ID>>
diff --git a/src/npc/interaction/fSlaveImpregConsummate.tw b/src/npc/interaction/fSlaveImpregConsummate.tw
index b699a90178af110121174b0ccd7aca5a04264c8f..a0fa8f1bc53b1a3b220319efb0597b7931862211 100644
--- a/src/npc/interaction/fSlaveImpregConsummate.tw
+++ b/src/npc/interaction/fSlaveImpregConsummate.tw
@@ -1,4 +1,4 @@
-:: FSlaveImpreg Consummate [nobr]
+:: FSlaveImpreg Consummate [nobr no-history]
 
 The first necessary step is to prepare the donatrix.
 <<set $AS = $activeSlave.ID>>
diff --git a/src/npc/interaction/fSlaveSelfImpreg.tw b/src/npc/interaction/fSlaveSelfImpreg.tw
index 9cb8eb637c0dbca9179b9e40f744252b1249ca93..aa21bdccf157a51adb2ed7ddb6aadef31ec1e6b7 100644
--- a/src/npc/interaction/fSlaveSelfImpreg.tw
+++ b/src/npc/interaction/fSlaveSelfImpreg.tw
@@ -1,4 +1,4 @@
-:: FSlaveSelfImpreg [nobr]
+:: FSlaveSelfImpreg [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fSlaveSlaveVagConsummate.tw b/src/npc/interaction/fSlaveSlaveVagConsummate.tw
index 5783fe47165c1fbaff46849159a937ab5439c94b..b6d8636bc430e874ebd1cfee196aa592d9ce6864 100644
--- a/src/npc/interaction/fSlaveSlaveVagConsummate.tw
+++ b/src/npc/interaction/fSlaveSlaveVagConsummate.tw
@@ -1,4 +1,4 @@
-:: FSlaveSlaveVag Consummate [nobr]
+:: FSlaveSlaveVag Consummate [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fVagina.tw b/src/npc/interaction/fVagina.tw
index 77e5cfcd43015f35183244ccf8caf6fefd111b00..028877f94692bddd85efb3916cc31919964532c3 100644
--- a/src/npc/interaction/fVagina.tw
+++ b/src/npc/interaction/fVagina.tw
@@ -1,4 +1,4 @@
-:: FVagina [nobr]
+:: FVagina [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fillUpButt.tw b/src/npc/interaction/fillUpButt.tw
index be0f17d9262b4b985087a59ac8d6caee98518eb3..b369ec7e73482ca2679b0c435320023779ef829c 100644
--- a/src/npc/interaction/fillUpButt.tw
+++ b/src/npc/interaction/fillUpButt.tw
@@ -1,4 +1,4 @@
-:: FillUpButt [nobr]
+:: FillUpButt [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fillUpFace.tw b/src/npc/interaction/fillUpFace.tw
index 73d86553a5843c2e0b522c5eca5a63b88c843ee2..fa1034e68fd38d49180ee464fbc85fff518ed35c 100644
--- a/src/npc/interaction/fillUpFace.tw
+++ b/src/npc/interaction/fillUpFace.tw
@@ -1,4 +1,4 @@
-:: FillUpFace [nobr]
+:: FillUpFace [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fondleBoobs.tw b/src/npc/interaction/fondleBoobs.tw
index 0d1419563a9fdcc1b6195affeb249d6d009a2659..fbc258757e1c6c7bec5b37f5ee2090823f4d65ac 100644
--- a/src/npc/interaction/fondleBoobs.tw
+++ b/src/npc/interaction/fondleBoobs.tw
@@ -1,4 +1,4 @@
-:: FondleBoobs [nobr]
+:: FondleBoobs [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fondleButt.tw b/src/npc/interaction/fondleButt.tw
index 6eb7d1f0c80b5c1ae7a47e1736d539828ff408ef..2da14590e42757bb51814871e3ceccdb30494bbe 100644
--- a/src/npc/interaction/fondleButt.tw
+++ b/src/npc/interaction/fondleButt.tw
@@ -1,4 +1,4 @@
-:: FondleButt [nobr]
+:: FondleButt [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fondleDick.tw b/src/npc/interaction/fondleDick.tw
index a4b10f25e859c330e39dfaf96f9b6f5caf0bbcee..be287a36854e21cb6a94aa79c796b25d74929b3e 100644
--- a/src/npc/interaction/fondleDick.tw
+++ b/src/npc/interaction/fondleDick.tw
@@ -1,4 +1,4 @@
-:: FondleDick [nobr]
+:: FondleDick [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/fondleVagina.tw b/src/npc/interaction/fondleVagina.tw
index 7e31cec7558285f6074b1662740a6cc4dee096dd..e8a4358665ca87fd3117ffb80d64eef5392bcadb 100644
--- a/src/npc/interaction/fondleVagina.tw
+++ b/src/npc/interaction/fondleVagina.tw
@@ -1,4 +1,4 @@
-:: FondleVagina [nobr]
+:: FondleVagina [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/npc/interaction/forceFeeding.tw b/src/npc/interaction/forceFeeding.tw
index c99bbb40b6855b070c830a5c1d537f0a7008b7a6..263e4f0d5f54682692e2182e19dad3aeaa89fefe 100644
--- a/src/npc/interaction/forceFeeding.tw
+++ b/src/npc/interaction/forceFeeding.tw
@@ -1,4 +1,4 @@
-:: forceFeeding [nobr]
+:: forceFeeding [nobr no-history]
 
 <<set $AS = $activeSlave.ID>>
 <<setLocalPronouns $activeSlave>>
diff --git a/src/personalAssistant/assistantAppearance.tw b/src/personalAssistant/assistantAppearance.tw
index bd374414e011b173ad034f839229c6e3e2bbdff3..a30c52a6dba9203754b66a43ece4754bb961863e 100644
--- a/src/personalAssistant/assistantAppearance.tw
+++ b/src/personalAssistant/assistantAppearance.tw
@@ -2,6 +2,7 @@
 
 <<setAssistantPronouns>>
 <<setNonlocalPronouns $seeDicks>>
+<<set _masturbationAllowed = $slaves.some((s) => s.rules.release.masturbation === 1) ? 1 : 0>>
 <<set _paSeed = random(1,8)>>
 <<switch $assistant.appearance>>
 <<case "monstergirl">>
@@ -70,7 +71,7 @@ _HeA's a cute little <<if $assistant.fsAppearance == "supremacist">>$arcologies[
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, busily sucking off one of _hisA cocks. The slave must be down in the kitchen, getting a meal out of the phallic food dispensers. As you watch, the monster<<= _girlA>> orgasms copiously, _hisA tentacle hair caressing _hisA own breasts.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, taking both of _hisA cocks up _hisU ass. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the monster<<= _girlA>> looks up at you, winks, and then maliciously increases _hisA pace, making the depiction of the slave wince.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's manually stimulating a recognizable little representation of one of your slaves. The slave must be using one of the penthouse's many vibrators. The monster<<= _girlA>> is looking after _himselfA, too, tweaking _hisA nipples with _hisA own tentacle hair.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The monster<<= _girlA>> is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The monster<<= _girlA>> is restraining _himselfA for once, and _hisA hair is even patting the slave's head reassuringly.
@@ -160,7 +161,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, gagging on _hisA enormous dick. The slave must be down in the kitchen, getting a meal out of the phallic food dispensers. As you watch, the shemale orgasms; _heA notices you watching _himA, and blows you a wet kiss.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, moaning as it takes _hisA massive prick. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the shemale looks up at you, winks, and starts pulling out after each thrust, _hisA cock making a popping noise each time it leaves the slave's butthole.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's giving a blowjob to a recognizable little representation of one of your slaves. The slave must be using one of the penthouse's many vibrators. The shemale is looking after _himselfA, too, jerking _himselfA off with one hand and playing with _hisA asshole with the other.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The shemale is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The shemale is restraining _himselfA for once, patting the slave's head and cooing reassuringly.
@@ -253,7 +254,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. As you watch, the amazon orgasms, producing a little female barbarian shout.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, letting the amazon use two fingers on _hisU butthole. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the amazon looks up at you, winks, and shoves _hisA entire hand up the struggling slave's ass.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's holding a recognizable little representation of one of your slaves in _hisA lap, giving _himU a powerful handjob. The slave must be using one of the penthouse's many vibrators. The slave gets off and collapses, exhausted.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The amazon is poking and prodding _himU; the slave must be getting a checkup. Once finished, the amazon gives _himU a powerful massage, making the slave groan with relief.
@@ -346,7 +347,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves has _hisU head under the front of _hisA skirt, and is eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. The business<<= _womanA>> notices you watching and winks, running a possessive hand through the slave's hair.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, and the business<<= _womanA>> is using a big strap-on on the poor slave's butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. The business<<= _womanA>> notices you watching _himA and gives you a cheerful little wave, ignoring the slave's distress.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's fucking a recognizable little representation of one of your slaves with a strap-on, which the slave is obviously enjoying. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and whispers something in the slave's ear; the slave looks up at you and blushes.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The business<<= _womanA>> is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The business<<= _womanA>> is taking notes on a tablet; _heA nods in satisfaction.
@@ -439,7 +440,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is suckling at _hisA milky tits. The slave must be down in the kitchen, getting a meal out of the food dispensers. The goddess notices you watching, and smiles while _heA cradles the slave to _hisA nourishing bosom.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is laying face-down in _hisA lap, letting the goddess slowly but firmly put more and more of _hisA hand up the slave's butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. The slave writhes under the strain, and the goddess starts stroking _hisU back to calm _himU down.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's having sex with a recognizable little representation of one of your slaves, kissing deeply and pulling _himU tight to _hisA pillowy chest. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and lays farther back, balancing the slave atop _hisA stomach and reaching down to fondle more thoroughly.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The goddess is checking the slave's temperature with the back of _hisA hand, a concerned but tender look on _hisA face; the slave must be getting a checkup. _HeA gently explores the slave's neck and chest for any sign of discomfort.
@@ -532,7 +533,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves has _hisU head under the front of _hisA skirt, and is eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. As you watch, the school<<= _girlA>> orgasms, blushing furiously when _heA notices you watching.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, letting the school<<= _girlA>> push two fingers gently in and out of _hisU butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the school<<= _girlA>> notices you watching _himA, blushes, looks away, and starts working faster.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's having sex with a recognizable little representation of one of your slaves, kissing _himU and giggling occasionally. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and blushes, but then shifts a little so you can see better.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The school<<= _girlA>> is wearing a little stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The school<<= _girlA>> is patting the _girlU's head reassuringly.
@@ -631,7 +632,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is suckling at _hisA milky tits, _hisU stomach bloated with milk. The slave must be down in the kitchen, getting a meal out of the food dispensers. The goddess notices you watching, and smiles while _heA cradles the swollen slave to _hisA nourishing bosom.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is laying face-down in _hisA lap, letting the goddess slowly but firmly put more and more of _hisA hand up the slave's butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. The slave writhes under the strain, and the goddess starts stroking _hisU back to calm _himU down.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's having sex with a recognizable little representation of one of your slaves, kissing deeply and pulling _himU tight to _hisA pillowy chest. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and lays farther back, balancing the slave atop _hisA stomach and reaching down to fondle more thoroughly.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The goddess is checking the slave's temperature with the back of _hisA hand, a concerned but tender look on _hisA face; the slave must be getting a checkup. _HeA gently explores the slave's neck and chest for any sign of discomfort.
@@ -724,7 +725,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves has _hisU head between _hisA legs, and is eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. As you watch, the little _girlA orgasms, blushing furiously when _heA notices you watching.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, letting the young _girlA push two fingers gently in and out of _hisU butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the little _girlA notices you watching _himA, blushes, looks away, and starts working faster.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's having sex with a recognizable little representation of one of your slaves, kissing _himU and giggling occasionally. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and blushes, but then shifts a little so you can see better.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The little _girlA is wearing a toy stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The little _girlA is patting the _girlU's head reassuringly.
@@ -817,7 +818,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves has _hisU head under _hisA pregnant belly, and is eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. As you watch, the little _girlA orgasms, blushing furiously when _heA notices you watching.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, letting the young _girlA push two fingers gently in and out of _hisU butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the little _girlA notices you watching _himA, blushes, looks away, and starts working faster.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA's having sex with a recognizable little representation of one of your slaves, kissing _himU and giggling occasionally. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and blushes, but then shifts a little so you can see better.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The little _girlA is wearing a toy stethoscope and is listening to the slave breathe; the slave must be getting a checkup. The little _girlA is patting the _girlU's head reassuringly.
@@ -908,7 +909,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves underneath _himA, with _hisU tongue sticking out to catch _hisA dripping love juices. The slave must be down in the kitchen, getting a meal out of the food dispensers. The fairy notices you watching and winks, dripping even more with your eyes on _himA.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is sitting upside-down in front of _himA, and the fairy is slowly teasing the poor slave's butt with a dildo as big as _heA is. The slave must be receiving _hisU drugs from one of the dildo dispensers. The fairy notices you watching _himA and gives you a cheerful little wave, twisting the dildo around and humming a tune.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves fucks _himselfU with a toy while _heA twists the control dial around, to the slave's enjoyment. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and whispers something in the slave's ear; the slave looks up at you and blushes.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is sitting up. The fairy is wearing a little doctor's coat and has _hisA head pressed to the slave's chest to hear the slave breathe; the slave must be getting a checkup. The fairy is humming happily as _heA flies over to a tablet to take notes.
@@ -999,7 +1000,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves sits beside _himA, with _hisU tongue scraping across _hisA breast to catch the beads of milk that flow. The slave must be down in the kitchen, getting a meal out of the food dispensers. The fairy notices you watching and winks, _hisA unattended breast giving out a small spray of milk.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is sitting upside-down in front of _himA, and the fairy is slowly teasing the poor slave's butt with a dildo as big as _heA is. The slave must be receiving _hisU drugs from one of the dildo dispensers. The fairy notices you watching _himA and gives you a cheerful little wave, twisting the dildo around and humming a tune.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves fucks _himselfU with a toy while _heA twists the control dial around, to the slave's enjoyment. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and whispers something in the slave's ear; the slave looks up at you and blushes.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is sitting up. The fairy is wearing a little doctor's coat, kept open to accommodate for _hisA belly, and has _hisA head pressed to the slave's chest to hear the slave breathe; the slave must be getting a checkup. The fairy is humming happily as _heA flies over to a tablet to take notes.
@@ -1086,7 +1087,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 		A recognizable little representation of one of your slaves has _hisU head in _hisA moist crotch, and is eating _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. As you watch, the goo _girlA orgasms, nearly turning into a puddle when _heA notices you watching.
 	<<elseif ($suppository == 1) && (_paSeed == 2)>>
 		A recognizable little representation of one of your slaves is down on _hisU knees in front of _himA, letting the slime _girlA insert _himselfA gently in and out of _hisU butt. The slave must be receiving _hisU drugs from one of the dildo dispensers. As you watch, the goo _girlA notices you watching _himA, and attempts to retract entirely into the slave's ass.
-	<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+	<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 		_HeA's having sex with a recognizable little representation of one of your slaves, kissing _himU and giggling occasionally. The slave must be using one of the penthouse's many vibrators. _HeA sees you watching and blushes, but then reshapes _himselfA so you can see better.
 	<<elseif (_paSeed == 4)>>
 		A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The goo _girlA is covering _hisU chest and is listening to the slave breathe; the slave must be getting a checkup. The goo _girlA is patting the _girlU's head reassuringly.
@@ -1173,7 +1174,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is locking lips with _himA. The slave must be down in the kitchen, getting a meal out of the food dispensers. The angel notices you watching, blushes deeply and covers _himselfA and the slave with a wing.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is across _hisA lap, _hisU rear red from a recent spanking. The slave must be receiving _hisU drugs from one of the dildo dispensers. The angel notices you watching, nods, and resumes spanking, ignoring the slave's distress.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	_HeA has a visible representation of one of your slaves across _hisA lap, a vibrator partially inserted into _himU, which the slave is obviously enjoying. The slave must be using one of the penthouse's many vibrators. _HeA notices you watching and blushes deeply before returning to pleasuring the slave.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying with _hisU head in _hisA lap. The angel is embracing _himU gently and silently; the slave must be getting a checkup. _HeA looks up at you with a smile; the slave must be doing well.
@@ -1266,7 +1267,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	A recognizable little representation of one of your slaves is eating _himA out as _heA flutters in front of them. The slave must be down in the kitchen, getting a meal out of the food dispensers. The cherub notices you watching and shoots you a thumbs up.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is before _himA, ass in the air, as _heA eagerly fists _hisU rear. The slave must be receiving _hisU drugs from one of the dildo dispensers. The cherub notices you watching and tosses you a thumbs up with _hisA free hand.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is before _himA, ass in the air, as _heA eagerly fucks _himU with a strap-on, which the slave is obviously enjoying. The slave must be using one of the penthouse's many vibrators. _HeA notices you watching, tosses up a thumbs up at you and increases _hisA thrusting.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying before _himA. The cherub is hovering in front of _hisU chest, head to _hisU breast, listening to _hisU heartbeat; the slave must be getting a checkup. _HeA beams you a smile; the slave must be doing well.
@@ -1359,7 +1360,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	_HeA is steadily forcing a dildo the size of your arm down a recognizable little representation of one of your slaves' throat. The slave must be down in the kitchen, getting a meal out of the food dispensers. The imp notices you watching, points to the obscene bulge in the slave's throat and laughs maniacally.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is before _himA, ass in the air, as _heA enthusiastically winds an anal pear. The slave must be receiving _hisU drugs from one of the dildo dispensers. The imp notices you watching and laughs as _heA gapes the slave's asshole further, enjoying _hisU obvious discomfort.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is before _himA, perched atop a wooden horse with sexual fluids running down its sides. The slave must be using one of the penthouse's many sex toys. Noticing you watching, the imp flies above _himU and roughly forces _himU down, eliciting a scream of surprise from the horny slave. _HeA likely upped the output on whatever toy the slave was using.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying on _hisU side before _himA; belly painfully distended. The imp is hovering over _himU holding an enema bag; the slave must be getting a checkup. _HeA notices your gaze and squeezes the bag, forcing a burst of liquid into the slave's gut and drawing a moan of discomfort out of the _girlU.
@@ -1464,7 +1465,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	_HeA is steadily conjuring cake slices out of thin air and sending them down a recognizable little representation of one of your slaves' throat as _hisU belly swells. The slave must be down in the kitchen, getting a meal out of the food dispensers. The witch notices you watching, creates a whole cake, and sends it on its way, causing the slave's gut to double in size.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is before _himA, writhing in pleasure, as a summoned tentacle explores _hisU anus. The slave must be receiving _hisU drugs from one of the dildo dispensers. The witch notices you watching and pats _hisA own squirming belly, causing the tentacle to seek shelter deeper in the slave.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is squatting atop a magic circle before _himA, a dildo pistoning in and out of _himU. The slave must be using one of the penthouse's many sex toys. Noticing you watching, the witch snaps _hisA fingers, causing the toy to blow a load deep inside the slave. A load moan echoes down the halls of your penthouse; someone must be having a good time.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is lying before _himA as _heA runs _hisA wand over _hisU body. The slave must be getting a checkup. _HeA notices your gaze and taps the wand to the slave's breasts, causing them to jump up a cup size.
@@ -1570,7 +1571,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	_HeA is steadily thrusting several tentacles extending from _hisA crotch down the throat of a recognizable little representation of one of your slaves. The slave must be down in the kitchen, getting a meal out of the food dispensers. _HeA notices you watching and moans as multiple bulges work their way down _hisA shafts and into the slave. Your eyes are drawn to the hapless _girlU's rapidly swelling stomach as the creature's seed takes root.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	A recognizable little representation of one of your slaves is before _himA, writhing in pleasure and pain, as multiple tentacles fuck _hisU ass. The slave must be receiving _hisU drugs from one of the dildo dispensers. _HeA notices you watching and moans as multiple bulges work their way down _hisA shafts and into the slave. Your eyes are drawn to the hapless _girlU's rapidly swelling stomach as the creature's seed takes root.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is lying on _hisU back, writhing in pleasure and pain, as multiple tentacles fuck _himU. The slave must be using one of the penthouse's many sex toys. _HeA notices you watching and moans as multiple bulges work their way down _hisA shafts and into the slave. Your eyes are drawn to the hapless _girlU's rapidly swelling stomach as the creature's seed takes root. A loud moan echoes through the penthouse; it seems the slave got a little surprise _himselfU.
 <<elseif (_paSeed == 4)>>
 	A recognizable little representation of one of your slaves is partially merged with _hisA body. The slave must be getting a checkup. _HeA notices your gaze and forces _hisA way more into the slave, causing the breast, butt and thighs on _hisA side of the body to swell disproportionately.
@@ -1686,7 +1687,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	_HeA has a recognizable little representation of one of your slaves with _hisU lips around the base of _hisA dick and a huge bulge down _hisU throat. The slave must be down in the kitchen, getting a meal out of the food dispensers. _HeA notices you watching and energetically renews deepthroating the slave. _HeA moans lewdly as _heA blows _hisA load in the slave's mouth, forcing cum to spray out the slave's nose and around _hisA cock. _HeA sighs with disappointment at the mess the slave has made.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	_HeA is happily assfucking a recognizable little representation of one of your slaves. The slave must be receiving _hisU drugs from one of the dildo dispensers. _HeA notices you watching, increases _hisA pace and cums deep in the slave's rear, slightly rounding _hisU belly with cum.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is riding _hisA erect cock. The slave must be using one of the penthouse's many sex toys. _HeA notices you watching and winks at you, before promising not to suck too much life from _hisA enthusiastic partner.
 <<elseif (_paSeed == 4)>>
 	_HeA has _hisA cock forced deep into a recognizable little representation of one of your slaves. The slave must be getting a checkup. _HeA notices your gaze, and states "What? I can feel _hisU heartbeat clearly like this."
@@ -1891,7 +1892,7 @@ _HeA's a cute little <<if $arcologies[0].FSSupremacist != "unset" && $assistant.
 	_HeA has a recognizable little representation of one of your slave between _hisA legs and is moaning with lust as the slave eagerly eats _himA out. The slave must be down in the kitchen, getting a meal out of the food dispensers. When _heA notices you watching, _heA gives you a show by cumming hard across the slave's face.
 <<elseif ($suppository == 1) && (_paSeed == 2)>>
 	_HeA is happily assfucking a recognizable little representation of one of your slaves with a strap-on. The slave must be receiving _hisU drugs from one of the dildo dispensers. Noticing you watching, _heA unwinds _hisA tail from the around the slave and begins fucking _hisA own pussy with it.
-<<elseif ($masturbationAllowed == 1) && (_paSeed == 3)>>
+<<elseif (_masturbationAllowed == 1) && (_paSeed == 3)>>
 	A recognizable little representation of one of your slaves is sharing a double-ended dildo with _himA. The slave must be using one of the penthouse's many sex toys. _HeA notices you watching and blows you a kiss, before promising not to suck too much life from _hisA enthusiastic partner.
 <<elseif (_paSeed == 4)>>
 	_HeA has _hisA body pressed up against a recognizable little representation of one of your slaves as _heA feels _himU up. The slave must be getting a checkup. _HeA notices your gaze and pinches the slave's erect nipples.
diff --git a/src/personalAssistant/assistantOptions.tw b/src/personalAssistant/assistantOptions.tw
index ba4862b23a3f8b03d5dd59a18d0fbdb62a7eded3..67e449706bff4e424dc388923328b1fef942be35 100644
--- a/src/personalAssistant/assistantOptions.tw
+++ b/src/personalAssistant/assistantOptions.tw
@@ -1,4 +1,4 @@
-:: Personal assistant options [nobr]
+:: Personal assistant options [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main">>
 
@@ -17,12 +17,6 @@ Seated at your desk, you glance at the visual representation of
 	$assistant.name,
 <</if>> in a corner of your desk's glass top.
 
-<<set $masturbationAllowed = 0>>
-<<set $i = $slaves.findIndex(function(s) { return s.rules.release.masturbation === 1; })>>
-<<if $i != -1>>
-	<<set $masturbationAllowed = 1>>
-<</if>>
-
 <<include "Personal Assistant Appearance">>
 
 <<if $assistant.power > 0>>
diff --git a/src/pregmod/geneLab.tw b/src/pregmod/geneLab.tw
index 6ff269ae709bfd3acc73bf2d784b4041975c3907..9ca80165ac9d9a7ca13c434bf0d6b86203161d93 100644
--- a/src/pregmod/geneLab.tw
+++ b/src/pregmod/geneLab.tw
@@ -1,4 +1,4 @@
-:: Gene Lab [nobr]
+:: Gene Lab [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
 
diff --git a/src/pregmod/implantManufactory.tw b/src/pregmod/implantManufactory.tw
index a490c0459ddc38e0ebbc5cc25cb40d15eda09899..546fac7272b6f3c2ab2c78b4e300e5b6794f5676 100644
--- a/src/pregmod/implantManufactory.tw
+++ b/src/pregmod/implantManufactory.tw
@@ -1,4 +1,4 @@
-:: Implant Manufactory [nobr]
+:: Implant Manufactory [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
 
diff --git a/src/pregmod/incubator.tw b/src/pregmod/incubator.tw
index 65a4748933a59a2c47848333ca2b6d28da936c83..3b04c078da90a3e67ecea272d27b8f4460f43c74 100644
--- a/src/pregmod/incubator.tw
+++ b/src/pregmod/incubator.tw
@@ -1,4 +1,4 @@
-:: Incubator [nobr]
+:: Incubator [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Incubator", $encyclopedia = "The Incubation Facility">>
 <<set $targetAge = Number($targetAge) || $minimumSlaveAge>>
diff --git a/src/pregmod/managePersonalAffairs.tw b/src/pregmod/managePersonalAffairs.tw
index d60db9032171b75d3ee8cc760518052e5b7fbd4a..3b36ea4884a7679a7d43e8a72de958a43d492823 100644
--- a/src/pregmod/managePersonalAffairs.tw
+++ b/src/pregmod/managePersonalAffairs.tw
@@ -1,4 +1,4 @@
-:: Manage Personal Affairs [nobr]
+:: Manage Personal Affairs [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "Being in Charge">>
 <<run PCTitle()>>
diff --git a/src/pregmod/organFarm.tw b/src/pregmod/organFarm.tw
index e09fb5101aef57d1d88f0e5b605c5860ac91ce36..5caf33806cf54a2b60825b9182cdfcf71b339b6e 100644
--- a/src/pregmod/organFarm.tw
+++ b/src/pregmod/organFarm.tw
@@ -1,4 +1,4 @@
-:: Organ Farm [nobr]
+:: Organ Farm [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
 
diff --git a/src/pregmod/theBlackMarket.tw b/src/pregmod/theBlackMarket.tw
index bb47f7c81a933207856eacb4004c7680e406af04..f0113cd964357e4ab05158b66ea8a718463cb101 100644
--- a/src/pregmod/theBlackMarket.tw
+++ b/src/pregmod/theBlackMarket.tw
@@ -1,4 +1,4 @@
-:: The Black Market [nobr]
+:: The Black Market [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main", $returnTo = "Main", $encyclopedia = "The Black Market">>
 
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 194396d4952f9b5a39d4d651658321d3d957dba9..3bf52cf63aff857dbc9bd9e65df377da3023267e 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -18129,7 +18129,7 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<<setNonlocalPronouns $seeDicks>>
 	<<replace "#result">>
 		<<set _pussy = App.Entity.facilities.arcade.employees().some(s => s.vagina > 0)>>
-		<<set _balls = App.Entity.facilities.arcade.employees().some(s => s.balls > 0)
+		<<set _balls = App.Entity.facilities.arcade.employees().some(s => s.balls > 0)>>
 		You order $him to explain further. "<<Master>>," $he <<say>>s carefully, "it'<<s>> $arcadeName. There'<<s>> a <<s>>pe<<c>>ific pla<<c>>e there, and, well, I can't de<<s>>cribe it. It'<<s>> in the <<s>>ervi<<c>>e area under $arcadeName. Can I <<sh>>ow you what I mean?" Intrigued, you order $him to show you the place $he's talking about, and lead $him to $arcadeName through the access hallway. $He points to the service tunnel under one of the rows of inmates, which allows trusted slaves to clean up and perform maintenance.
 		<<if $activeSlave.belly >= 100000>>
 			Once you've managed to shove the massive slut
diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw
index ba4f540aeae913f689fde41c011b74081b5c61b3..37823197d061dfd6483dd3e216b802784b8c78c7 100644
--- a/src/uncategorized/arcade.tw
+++ b/src/uncategorized/arcade.tw
@@ -1,4 +1,4 @@
-:: Arcade [nobr]
+:: Arcade [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Arcade", $encyclopedia = "Arcade", _AL = App.Entity.facilities.arcade.employeesIDs().size>>
 
diff --git a/src/uncategorized/attendantSelect.tw b/src/uncategorized/attendantSelect.tw
index f2a58e2d5de63835c09379988522a555972cd2ec..f6d21e712e56d517ca691d222711b4910f324853 100644
--- a/src/uncategorized/attendantSelect.tw
+++ b/src/uncategorized/attendantSelect.tw
@@ -1,4 +1,4 @@
-:: Attendant Select [nobr]
+:: Attendant Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Spa", $encyclopedia = "Attendant">>
 <<if _S.Attendant>>
diff --git a/src/uncategorized/bgSelect.tw b/src/uncategorized/bgSelect.tw
index 8d83007228ad15a6ef30e33c726a94cdde4645c3..b888caa6e8fcf56c4fb3b593e5205cfcc857366b 100644
--- a/src/uncategorized/bgSelect.tw
+++ b/src/uncategorized/bgSelect.tw
@@ -1,4 +1,4 @@
-:: BG Select [nobr]
+:: BG Select [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Bodyguard">>
 
diff --git a/src/uncategorized/bodyModification.tw b/src/uncategorized/bodyModification.tw
index ba557c462ccf679c62ca0d6273bdc802da9b09ca..b09cdf0fc60a223add59cb89330200bba7bb1191 100644
--- a/src/uncategorized/bodyModification.tw
+++ b/src/uncategorized/bodyModification.tw
@@ -1,4 +1,4 @@
-:: Body Modification [nobr]
+:: Body Modification [nobr jump-from-safe]
 
 <<set $nextButton = "Confirm changes", $nextLink = "Slave Interact">>
 <<set $AS = $activeSlave.ID>>
diff --git a/src/uncategorized/brothel.tw b/src/uncategorized/brothel.tw
index 837f5efc26d8c6ca0e2659dcc66e461a7e7bc270..8cecc0d4392b290e9fa91da566d9b255956f0262 100644
--- a/src/uncategorized/brothel.tw
+++ b/src/uncategorized/brothel.tw
@@ -1,4 +1,4 @@
-:: Brothel [nobr]
+:: Brothel [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Brothel", $encyclopedia = "Brothel", _BL = App.Entity.facilities.brothel.employeesIDs().size>>
 
diff --git a/src/uncategorized/buySlaves.tw b/src/uncategorized/buySlaves.tw
index 63244a6a5436675b5037631dbab80cc8d76eccd1..55201fd3c888e84363f6f9cdd54f8bb2b343f1ca 100644
--- a/src/uncategorized/buySlaves.tw
+++ b/src/uncategorized/buySlaves.tw
@@ -1,4 +1,4 @@
-:: Buy Slaves [nobr]
+:: Buy Slaves [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back">>
 <<set $nextLink = "Main">>
diff --git a/src/uncategorized/cellblock.tw b/src/uncategorized/cellblock.tw
index 32028b0d60807f8edab2119d2f74f5e7a0d25efb..b6945d008a6ba7c0e53b14a255f639faa181f312 100644
--- a/src/uncategorized/cellblock.tw
+++ b/src/uncategorized/cellblock.tw
@@ -1,4 +1,4 @@
-:: Cellblock [nobr]
+:: Cellblock [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Cellblock", $encyclopedia = "Cellblock", _CL = App.Entity.facilities.cellblock.employeesIDs().size>>
 
diff --git a/src/uncategorized/changeLanguage.tw b/src/uncategorized/changeLanguage.tw
index 6050573779d97e09dac69244dbb44c8a7f4fbc96..7dbd3c9616c9cf89294ac9efac6a34a2e914611f 100644
--- a/src/uncategorized/changeLanguage.tw
+++ b/src/uncategorized/changeLanguage.tw
@@ -1,11 +1,7 @@
-:: Change Language [nobr]
+:: Change Language [nobr jump-from-safe]
 
 <<set $nextButton = "Confirm changes">>
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 
 <<set $revivalistLanguage = 0>>
 <<if $arcologies[0].FSRomanRevivalist != "unset">>
diff --git a/src/uncategorized/clinic.tw b/src/uncategorized/clinic.tw
index 510361844776ddd97111b0e70ca790b5f1111796..4dad8233e513302660c1a51ca0ff1680c2895d2c 100644
--- a/src/uncategorized/clinic.tw
+++ b/src/uncategorized/clinic.tw
@@ -1,4 +1,4 @@
-:: Clinic [nobr]
+:: Clinic [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Clinic", $encyclopedia = "Clinic", _CL = App.Entity.facilities.clinic.employeesIDs().size>>
 
diff --git a/src/uncategorized/club.tw b/src/uncategorized/club.tw
index 8e77c328305925f9310a8d8d2e2366e62ac2fcf0..2a779b3a3708938d2a7b023d220c2f62a9de0283 100644
--- a/src/uncategorized/club.tw
+++ b/src/uncategorized/club.tw
@@ -1,4 +1,4 @@
-:: Club [nobr]
+:: Club [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Club", $encyclopedia = "Club", _CL = App.Entity.facilities.club.employeesIDs().size>>
 
diff --git a/src/uncategorized/concubineSelect.tw b/src/uncategorized/concubineSelect.tw
index 6dc78c2a7c571b8801e3966acf399d43f7887c2f..4911d97db586459cde01553710fb136f056b8d79 100644
--- a/src/uncategorized/concubineSelect.tw
+++ b/src/uncategorized/concubineSelect.tw
@@ -1,4 +1,4 @@
-:: Concubine Select [nobr]
+:: Concubine Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Master Suite", $encyclopedia = "Concubine">>
 <<if ($Concubine != 0)>>
diff --git a/src/uncategorized/costsBudget.tw b/src/uncategorized/costsBudget.tw
index 2f019b3ac1c4f4ed7ca4ce9bda2640ef77e66aa9..8af2335e3e9bf82a23307de7ebd2671c596c2e0c 100644
--- a/src/uncategorized/costsBudget.tw
+++ b/src/uncategorized/costsBudget.tw
@@ -1,4 +1,4 @@
-:: Costs Budget [nobr]
+:: Costs Budget [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", _arcologyCosts = 0>>
 
diff --git a/src/uncategorized/dairy.tw b/src/uncategorized/dairy.tw
index 94c52c5a02bcf842e95fc9204c07c29a11bc5924..ef5ea69333c6194d2abf625782db428cdf16226f 100644
--- a/src/uncategorized/dairy.tw
+++ b/src/uncategorized/dairy.tw
@@ -1,4 +1,4 @@
-:: Dairy [nobr]
+:: Dairy [nobr jump-to-safe jump-from-safe]
 
 <<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.dairy)>>
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Dairy", $encyclopedia = "Dairy", _SL = $slaves.length, _DL = _slaves.length>>
@@ -82,7 +82,7 @@
 			<<set _purgedSlaves = false>>
 			<<for _slave range _slaves>>
 				<<if (_slave.anus < 3)>>
-					<<setLocalPronouns _slave>
+					<<setLocalPronouns _slave>>
 					_slave.slaveName's milking machine ejects $him, since it cannot fit its massive anal dildo up $his tight asshole.
 					<<= removeJob(_slave, Job.DAIRY)>>
 					<<set _purgedSlaves = true>>
diff --git a/src/uncategorized/descriptionOptions.tw b/src/uncategorized/descriptionOptions.tw
index 19a45f677ea6c8c8a17fb6598eba5c45b02fe581..b4b0c1a7075d5b046b65e1b92fdaf8ac4a4ede47 100644
--- a/src/uncategorized/descriptionOptions.tw
+++ b/src/uncategorized/descriptionOptions.tw
@@ -1,4 +1,4 @@
-:: Description Options [nobr]
+:: Description Options [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back">>
 <<if $storedLink !== "Slave Interact">>
diff --git a/src/uncategorized/dispensary.tw b/src/uncategorized/dispensary.tw
index 551bf6d86f17b3c2aba1350e8bd29f3526c2cdfb..e4b441d7688532d14d6a85058fb1dc9056db99b8 100644
--- a/src/uncategorized/dispensary.tw
+++ b/src/uncategorized/dispensary.tw
@@ -1,4 +1,4 @@
-:: Dispensary [nobr]
+:: Dispensary [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse", $encyclopedia = "The Pharmaceutical Fab.", _PCSkillCheck = Math.min($upgradeMultiplierMedicine, $HackingSkillMultiplier)>>
 
diff --git a/src/uncategorized/djSelect.tw b/src/uncategorized/djSelect.tw
index 0f8ce2b700bb654980e89b47b360285d697105be..b96cb766b59193f820975a399f5de8e61732fc3f 100644
--- a/src/uncategorized/djSelect.tw
+++ b/src/uncategorized/djSelect.tw
@@ -1,4 +1,4 @@
-:: DJ Select [nobr]
+:: DJ Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Club", $encyclopedia = "DJ">>
 <<if ($DJ != 0)>>
diff --git a/src/uncategorized/futureSociety.tw b/src/uncategorized/futureSociety.tw
index 0823900a7425aa297880fa87c8cbc0d556bd3439..0053f2d4503c63eb33461461b8fe116bf816d6d0 100644
--- a/src/uncategorized/futureSociety.tw
+++ b/src/uncategorized/futureSociety.tw
@@ -1,4 +1,4 @@
-:: Future Society [nobr]
+:: Future Society [nobr jump-to-safe jump-from-safe]
 
 <<setAssistantPronouns>>
 <<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "Future Societies", $FSReminder = "">>
diff --git a/src/uncategorized/headGirlSuite.tw b/src/uncategorized/headGirlSuite.tw
index 9c514dfcea59d2f25a87e2b70ace36a003ed802e..af33f0331020b0323f7509c9dcb70063ec36771d 100644
--- a/src/uncategorized/headGirlSuite.tw
+++ b/src/uncategorized/headGirlSuite.tw
@@ -1,4 +1,4 @@
-:: Head Girl Suite [nobr]
+:: Head Girl Suite [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Head Girl Suite", $encyclopedia = "Head Girl Suite", _SL = $slaves.length>>
 
diff --git a/src/uncategorized/hgSelect.tw b/src/uncategorized/hgSelect.tw
index b1595ad809c406df1d3da55e7cc2f31cdcb2367e..d84ed190e4314ebd3c5dc33362ed1be2c55bfae5 100644
--- a/src/uncategorized/hgSelect.tw
+++ b/src/uncategorized/hgSelect.tw
@@ -1,4 +1,4 @@
-:: HG Select [nobr]
+:: HG Select [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Head Girl">>
 
diff --git a/src/uncategorized/madamSelect.tw b/src/uncategorized/madamSelect.tw
index da0f7201f29841d922769f4402fc9da3adfc7df4..9ba7e7ef90caad2c2c5639db5311ac5f88ac46b2 100644
--- a/src/uncategorized/madamSelect.tw
+++ b/src/uncategorized/madamSelect.tw
@@ -1,4 +1,4 @@
-:: Madam Select [nobr]
+:: Madam Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Brothel", $encyclopedia = "Madam">>
 <<if ($Madam != 0)>>
diff --git a/src/uncategorized/main.tw b/src/uncategorized/main.tw
index 44bfce82fbbb268ef73226909e9cb80ea59bbdcf..7df482f44febb0ff06a6ef8ff6f8579e28a618bd 100644
--- a/src/uncategorized/main.tw
+++ b/src/uncategorized/main.tw
@@ -1,4 +1,4 @@
-:: Main [nobr]
+:: Main [nobr jump-to-safe jump-from-safe]
 
 /* make sure the first thing that happens is the error check */
 <<set _errors = App.MainView.errors()>>
diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw
index c197b19c1e850893ba0e1eef01d2187bcbe3cf2f..a3f4578e91d990e977a9a02412ef1ce0e142d8f0 100644
--- a/src/uncategorized/manageArcology.tw
+++ b/src/uncategorized/manageArcology.tw
@@ -1,4 +1,4 @@
-:: Manage Arcology [nobr]
+:: Manage Arcology [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "The X-Series Arcology">>
 
diff --git a/src/uncategorized/managePenthouse.tw b/src/uncategorized/managePenthouse.tw
index f7e0b11df9e2bd2f4a1dfde8a9e60d06e72b907d..0d21179cc0b4d92b24f5e94532da1137f144178f 100644
--- a/src/uncategorized/managePenthouse.tw
+++ b/src/uncategorized/managePenthouse.tw
@@ -1,4 +1,4 @@
-:: Manage Penthouse [nobr]
+:: Manage Penthouse [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Main", $encyclopedia = "What the Upgrades Do">>
 
@@ -437,3 +437,11 @@
 		</div>
 	<</if>>
 </p>
+
+<p>
+	<<if $rep >= 10000>>
+		[[Black Market|The Black Market]]
+	<<else>>
+		You lack the reputation (<<= num(10000)>>) to be invited to the underground Black Market.
+	<</if>>
+</p>
diff --git a/src/uncategorized/masterSuite.tw b/src/uncategorized/masterSuite.tw
index 4fb0fb79409d95c0f7bf74097b9e347349df6baf..ffe42ab296eafb910f8ce955782ab8cbdb261513 100644
--- a/src/uncategorized/masterSuite.tw
+++ b/src/uncategorized/masterSuite.tw
@@ -1,4 +1,4 @@
-:: Master Suite [nobr]
+:: Master Suite [nobr jump-to-safe jump-from-safe]
 
 <<set _slaves = App.Utils.sortedEmployees(App.Entity.facilities.masterSuite)>>
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Master Suite", $encyclopedia = "Master Suite", _SL = $slaves.length, _MsL = _slaves.length>>
diff --git a/src/uncategorized/milkmaidSelect.tw b/src/uncategorized/milkmaidSelect.tw
index 0422098d463f8f07a09f527bf1a0878c891c5d2c..f10c82b5ebef70ec58b1089db42709376ddff0a7 100644
--- a/src/uncategorized/milkmaidSelect.tw
+++ b/src/uncategorized/milkmaidSelect.tw
@@ -1,4 +1,4 @@
-:: Milkmaid Select [nobr]
+:: Milkmaid Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Dairy", $encyclopedia = "Milkmaid">>
 <<if ($Milkmaid != 0)>>
diff --git a/src/uncategorized/neighborInteract.tw b/src/uncategorized/neighborInteract.tw
index dda077d9ef4fb3c7e53e1be587ea5f85554b56f2..180a47096060cc06d7e1e1699b070e0bd304c53c 100644
--- a/src/uncategorized/neighborInteract.tw
+++ b/src/uncategorized/neighborInteract.tw
@@ -1,14 +1,4 @@
-:: Neighbor Interact [nobr]
-
-<<if def $buyArcologyDirection>>
-	<<run delete $buyArcologyDirection>>
-<</if>>
-<<if def $sellArcologyDirection>>
-	<<run delete $sellArcologyDirection>>
-<</if>>
-<<if def $transaction>>
-	<<run delete $transaction>>
-<</if>>
+:: Neighbor Interact [nobr jump-to-safe jump-from-safe]
 
 <<set $averageProsperity = 0>>
 <<set _neighboringArcologyCount = 0>>
@@ -22,11 +12,7 @@
 	[[Cheat Edit Neighboring Arcologies|MOD_Edit Neighbor Arcology Cheat]]<br><br>
 <</if>>
 
-<<if $sideBarOptions.compact > 0>>
-	<<set $nextLink = "Manage Arcology">>
-<<else>>
-	<<set $nextLink = "Main">>
-<</if>>
+<<set $nextLink = "Main">>
 <<set $nextButton = "Back">>
 You have <<print $arcologies.length-1>> neighbors. <br><br>
 
diff --git a/src/uncategorized/nurseSelect.tw b/src/uncategorized/nurseSelect.tw
index e5e92cd225fedb325be4705d88e5eeb0c9788db1..debce7c0d981fe95efba21d0ba0805323ceb237b 100644
--- a/src/uncategorized/nurseSelect.tw
+++ b/src/uncategorized/nurseSelect.tw
@@ -1,4 +1,4 @@
-:: Nurse Select [nobr]
+:: Nurse Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Clinic", $encyclopedia = "Nurse">>
 <<if ($Nurse != 0)>>
diff --git a/src/uncategorized/options.tw b/src/uncategorized/options.tw
index d48ba7a26b461764ad0497c379954319ed68d1fa..2e5e940f852f4bec7ee15d35a88206086738579d 100644
--- a/src/uncategorized/options.tw
+++ b/src/uncategorized/options.tw
@@ -1,4 +1,4 @@
-:: Options [nobr]
+:: Options [nobr jump-to-safe jump-from-safe]
 
 <style>
 .subHeading {
@@ -23,7 +23,7 @@
 <</if>>
 
 <<set $nextButton = "Back", $nextLink = $storedLink, $encyclopedia = "How to Play">>
-<<set _passageSwitchHandler = App.EventHandlers.optionsChanged>>
+<<set $passageSwitchHandler = App.EventHandlers.optionsChanged>>
 
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("End of week autosaving is currently", "autosave")
@@ -166,10 +166,6 @@ This save was created using FC version $ver build $releaseID.
 
 		<<set _options = new App.UI.OptionsGroup()>>
 
-		<<run _options.addOption("Compact side bar is", "compact", $sideBarOptions)
-		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
-		.addComment("Disabling this will move the sidebar 'Manage Arcology' links onto the Main menu, while keeping the passage visible.")>>
-
 		<<run _options.addOption("Cash is", "Cash", $sideBarOptions)
 		.addValue("Shown", 1).on().addValue("Hidden", 0).off()>>
 
diff --git a/src/uncategorized/personalAttentionSelect.tw b/src/uncategorized/personalAttentionSelect.tw
index 05f1689433798fa60c2fb79f9e5bb0046b4300ac..74c8f24c04d6af32566e9a6f75b94aa9946b215a 100644
--- a/src/uncategorized/personalAttentionSelect.tw
+++ b/src/uncategorized/personalAttentionSelect.tw
@@ -1,4 +1,4 @@
-:: Personal Attention Select [nobr]
+:: Personal Attention Select [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main">>
 
diff --git a/src/uncategorized/pit.tw b/src/uncategorized/pit.tw
index 87fc9402c86f6b349d01f1a972bf3dbe75233b88..88b3f79797b64931c649fe99c7c37f8b604b9c1f 100644
--- a/src/uncategorized/pit.tw
+++ b/src/uncategorized/pit.tw
@@ -1,4 +1,4 @@
-:: Pit [nobr]
+:: Pit [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Pit", $encyclopedia = "Pit", _DL = $fighterIDs.length, _SL = $slaves.length, _CL = $canines.length, _HL = $hooved.length, _FL = $felines.length>>
 <<if $pitName != "the Pit">>
diff --git a/src/uncategorized/reBusyArcade.tw b/src/uncategorized/reBusyArcade.tw
index cf3504175da09fcba2c593f132ca59a81e0c6d35..dbfb67e9cea4ad1ae8e9229ed5b22ffb2f19383f 100644
--- a/src/uncategorized/reBusyArcade.tw
+++ b/src/uncategorized/reBusyArcade.tw
@@ -1,6 +1,6 @@
 :: RE busy arcade [nobr]
 
-<<set $activeSlave = App.Entity.facilities.arcade.employees().filter(s => hasAnyArms(s) && s.fetish !== "mindbroken" && s.devotion <45).random()>>
+<<set $activeSlave = App.Entity.facilities.arcade.employees().filter(s => hasAnyArms(s) && s.fetish !== "mindbroken" && s.devotion < 45).random()>>
 
 <<if (ndef $activeSlave)>>
 	<<goto "RIE Eligibility Check">>
diff --git a/src/uncategorized/recruiterSelect.tw b/src/uncategorized/recruiterSelect.tw
index b1155515ae8b9931dd3a8481eac8d2f9ff05ae24..49ad10e6d6d3c9f3b5720de175404330b1533935 100644
--- a/src/uncategorized/recruiterSelect.tw
+++ b/src/uncategorized/recruiterSelect.tw
@@ -1,4 +1,4 @@
-:: Recruiter Select [nobr]
+:: Recruiter Select [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", $encyclopedia = "Recruiter">>
 <<if ($Recruiter != 0)>>
diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw
index 0a1006d5b6f938dcadc1f4e989b631fb763d9ce1..02f6493441392045dad16dafc8bd5ab64eb81d46 100644
--- a/src/uncategorized/remoteSurgery.tw
+++ b/src/uncategorized/remoteSurgery.tw
@@ -1,4 +1,4 @@
-:: Remote Surgery [nobr]
+:: Remote Surgery [nobr jump-from-safe]
 
 <style>
 .active {
diff --git a/src/uncategorized/repBudget.tw b/src/uncategorized/repBudget.tw
index 6bfaba0cf7f9a7a77c8706061c282bb134a8b22e..b07dae6ff9c1eeb55bdd1e8c126c5b702c6607ad 100644
--- a/src/uncategorized/repBudget.tw
+++ b/src/uncategorized/repBudget.tw
@@ -1,4 +1,4 @@
-:: Rep Budget [nobr]
+:: Rep Budget [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back to Main", $nextLink = "Main", _arcologyCosts = 0>>
 
diff --git a/src/uncategorized/rulesAssistant.tw b/src/uncategorized/rulesAssistant.tw
index 1eb4a9890e539dd550c5a18170e50378b894af95..662b7abb69484c8d982fcd4bf31a37733e7507a6 100644
--- a/src/uncategorized/rulesAssistant.tw
+++ b/src/uncategorized/rulesAssistant.tw
@@ -1,3 +1,3 @@
-:: Rules Assistant [nobr]
+:: Rules Assistant [nobr jump-to-safe jump-from-safe]
 
 <<run html5passage(rulesAssistantOptions)>>
diff --git a/src/uncategorized/salon.tw b/src/uncategorized/salon.tw
index f35b17b3be6fe24c655b20876169ed7b16c012c7..057c9ec21c72d376abc5d4a3ab3e56d4e832b70e 100644
--- a/src/uncategorized/salon.tw
+++ b/src/uncategorized/salon.tw
@@ -1,4 +1,4 @@
-:: Salon [nobr]
+:: Salon [nobr jump-from-safe]
 
 <<set $nextButton = "Confirm changes", $nextLink = "Slave Interact", $encyclopedia = "The Auto Salon">>
 <<set $AS = $activeSlave.ID>>
diff --git a/src/uncategorized/schoolroom.tw b/src/uncategorized/schoolroom.tw
index 3805a51143cfa881f1b22a21ebe05c54628f17a1..e55b592a89ce9d967c42d5f6cee9595a3f0e21ae 100644
--- a/src/uncategorized/schoolroom.tw
+++ b/src/uncategorized/schoolroom.tw
@@ -1,4 +1,4 @@
-:: Schoolroom [nobr]
+:: Schoolroom [nobr jump-to-safe jump-from-safe]
 
 <<set _DL = App.Entity.facilities.schoolroom.employeesIDs().size, $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Schoolroom", $encyclopedia = "Schoolroom">>
 
diff --git a/src/uncategorized/schoolteacherSelect.tw b/src/uncategorized/schoolteacherSelect.tw
index 904b0599509a28a16897ccfc885c053a8e8b210a..43cb233361149a1d9d5db3b098661e99afde3b0e 100644
--- a/src/uncategorized/schoolteacherSelect.tw
+++ b/src/uncategorized/schoolteacherSelect.tw
@@ -1,4 +1,4 @@
-:: Schoolteacher Select [nobr]
+:: Schoolteacher Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Schoolroom", $encyclopedia = "Schoolteacher">>
 <<if ($Schoolteacher != 0)>>
diff --git a/src/uncategorized/servantsQuarters.tw b/src/uncategorized/servantsQuarters.tw
index c952fb38433624afb2717372e682f271ceb37c6b..1d14602cf0d2ced5fafa2e500094d930097ea02d 100644
--- a/src/uncategorized/servantsQuarters.tw
+++ b/src/uncategorized/servantsQuarters.tw
@@ -1,4 +1,4 @@
-:: Servants' Quarters [nobr]
+:: Servants' Quarters [nobr jump-to-safe jump-from-safe]
 
 <<set _DL = App.Entity.facilities.servantsQuarters.employeesIDs().size, $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Servants' Quarters", $encyclopedia = "Servants' Quarters">>
 
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 1ea450e187455c25a1cfd1eee126a104d82b6ce5..3052912793446c8b4de549988409c765eda39cec 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -1,4 +1,4 @@
-:: Slave Interact [nobr]
+:: Slave Interact [nobr jump-from-safe]
 
 <<set $nextButton = "Confirm changes", $nextLink = "Main">>
 <<set _SL = $slaves.length, _CL = $canines.length, _HL = $hooved.length, _FL = $felines.length>>
diff --git a/src/uncategorized/spa.tw b/src/uncategorized/spa.tw
index e71ea8b1438a58002068fffe2f49d3debf1fb4a7..696db7c3bcdffeb274137dff9adb72d4a84a601c 100644
--- a/src/uncategorized/spa.tw
+++ b/src/uncategorized/spa.tw
@@ -1,4 +1,4 @@
-:: Spa [nobr]
+:: Spa [nobr jump-to-safe jump-from-safe]
 
 <<set _DL = App.Entity.facilities.spa.employeesIDs().size, $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Spa", $encyclopedia = "Spa">>
 
diff --git a/src/uncategorized/stewardessSelect.tw b/src/uncategorized/stewardessSelect.tw
index 112c0ed0da9dcac90c240592120d0f06c6b8012b..8ea988a80db05d4de778ff68be0c637e8c317a5f 100644
--- a/src/uncategorized/stewardessSelect.tw
+++ b/src/uncategorized/stewardessSelect.tw
@@ -1,4 +1,4 @@
-:: Stewardess Select [nobr]
+:: Stewardess Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Servants' Quarters", $encyclopedia = "Stewardess">>
 <<if ($Stewardess != 0)>>
diff --git a/src/uncategorized/subordinateTargeting.tw b/src/uncategorized/subordinateTargeting.tw
index ccd8f8edf27d26aaddde165af2d8c57162960bdb..3f47d39320546204e76528875c86b8cdfb737757 100644
--- a/src/uncategorized/subordinateTargeting.tw
+++ b/src/uncategorized/subordinateTargeting.tw
@@ -31,7 +31,7 @@
 	<<= App.UI.SlaveList.slaveSelectionList(
 			s => s.devotion >= -20 && s.fuckdoll === 0 && State.variables.activeSlave.ID !== s.ID &&
 				(!isAmputee(State.variables.activeSlave) || !isAmputee(s)),
-			(s, i) => App.UI.DOM.passageLink(SlaveFullName(s), 'Subordinate Targeting', () => { V.activeSlave.subTarget = s.ID; }),
+			(s) => App.UI.DOM.passageLink(SlaveFullName(s), 'Subordinate Targeting', () => { V.activeSlave.subTarget = s.ID; }),
 		)>>
 	<<if $universalRulesImpregnation == "Stud" && $StudID == 0>>
 		<br><br>[[Stud|Subordinate Targeting][$activeSlave.subTarget = -1, $StudID = $activeSlave.ID]]
diff --git a/src/uncategorized/summaryOptions.tw b/src/uncategorized/summaryOptions.tw
index 74411f44be29f280123bfec197c36ffec5970c28..bb269e7d04b462c6a004bc93f6468a106ef0d059 100644
--- a/src/uncategorized/summaryOptions.tw
+++ b/src/uncategorized/summaryOptions.tw
@@ -1,4 +1,4 @@
-:: Summary Options [nobr]
+:: Summary Options [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back">>
 <<if $storedLink !== "Slave Interact" && $storedLink !== "Main">>
@@ -9,7 +9,7 @@
 	<</if>>
 <</if>>
 <<set $nextLink = $storedLink>>
-<<set _passageSwitchHandler = App.EventHandlers.optionsChanged>>
+<<set $passageSwitchHandler = App.EventHandlers.optionsChanged>>
 
 <h1>Summary Options</h1>
 
diff --git a/src/uncategorized/universalRules.tw b/src/uncategorized/universalRules.tw
index d3b689b92c749377bbace8f4c0add129325d1af7..696769d1fd89af563834f5af2f51cb52ac3c8858 100644
--- a/src/uncategorized/universalRules.tw
+++ b/src/uncategorized/universalRules.tw
@@ -1,4 +1,4 @@
-:: Universal Rules [nobr]
+:: Universal Rules [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse">>
 
diff --git a/src/uncategorized/wardenessSelect.tw b/src/uncategorized/wardenessSelect.tw
index 5473502a82e844a89e2c8902f65315ece0ccd4a3..7180dd34750985c253a84ad2a2dcd41b42c5420d 100644
--- a/src/uncategorized/wardenessSelect.tw
+++ b/src/uncategorized/wardenessSelect.tw
@@ -1,4 +1,4 @@
-:: Wardeness Select [nobr]
+:: Wardeness Select [nobr jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Cellblock", $encyclopedia = "Wardeness">>
 <<if ($Wardeness != 0)>>
diff --git a/src/uncategorized/wardrobe.tw b/src/uncategorized/wardrobe.tw
index 77435f54c98f4d1925eb4bc5ff90aad9e56a90a5..4859b05c7cd64511dff75f53bcb892a1dedffcee 100644
--- a/src/uncategorized/wardrobe.tw
+++ b/src/uncategorized/wardrobe.tw
@@ -1,4 +1,4 @@
-:: Wardrobe [nobr]
+:: Wardrobe [nobr jump-to-safe jump-from-safe]
 
 <<set $nextButton = "Back", $nextLink = "Manage Penthouse">>
 
diff --git a/src/zz1-last/setupEventHandlers.js b/src/zz1-last/setupEventHandlers.js
index 44cba09f389236f963c15e85054696220dd01ff1..0a6ef4160227ad480de47f3b895c24cc870cd2ba 100644
--- a/src/zz1-last/setupEventHandlers.js
+++ b/src/zz1-last/setupEventHandlers.js
@@ -2,7 +2,7 @@
 Config.saves.onLoad = App.EventHandlers.onLoad;
 Config.saves.onSave = App.EventHandlers.onSave;
 
-$(document).on(':storyready', function(ev) {
+$(document).on(':storyready', function() {
 	App.EventHandlers.storyReady();
 });
 
@@ -15,3 +15,10 @@ $(document).on(':passagestart', function() {
 		get: () => S
 	});
 });
+
+$(document).on("passageinit", () => {
+	if (V.passageSwitchHandler) {
+		V.passageSwitchHandler();
+		delete V.passageSwitchHandler;
+	}
+});