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/src/004-base/facility.js b/src/004-base/facility.js
index f5bc2c16b88d8e7d20cda830c9ee74678b4d6de9..be67be3c9701de0b13ca434cd07eb2028bb3d4c3 100644
--- a/src/004-base/facility.js
+++ b/src/004-base/facility.js
@@ -279,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;
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/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/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index 61efa463e4b983af125c56f57a113ffdc75fde0c..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)) {
@@ -198,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];
 			}
 		}
 	}
@@ -1234,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/facilities/armory/armoryFramework.js b/src/facilities/armory/armoryFramework.js
index a219e606db73243e667199cc4dca544cd9c793fc..ac077b9815b7b0b0617e224f3e181fa685bac713 100644
--- a/src/facilities/armory/armoryFramework.js
+++ b/src/facilities/armory/armoryFramework.js
@@ -1,6 +1,6 @@
 App.Data.Facilities.armory = {
 	baseName: "dojo",
-	genericName: "armory",
+	genericName: "Armory",
 	jobs: {	},
 	defaultJob: null,
 	manager: {
diff --git a/src/gui/quicklinks.js b/src/gui/quicklinks.js
index a3f1295362eeaf0ae9ba8ffcaa5ddef4c685d0e8..1930c43d79224339f1fb2f6b2105e79d11d0d9e8 100644
--- a/src/gui/quicklinks.js
+++ b/src/gui/quicklinks.js
@@ -291,35 +291,40 @@ App.UI.quickMenu = (function() {
 			hotkeysEnabled = false;
 			return "";
 		}
+		hotkeysEnabled = true;
 		currentPassage = null;
 		notificationPassages = [];
 
 		const div = document.createElement("div");
 		div.classList.add("quick-links");
 
-		// quick menu
-		div.append(...generateLinkList(layout));
-		addBackLink(div);
+		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 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");
+			// 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;
 				}
-				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"));
 		}
 
-		hotkeysEnabled = true;
 		return div;
 	}