diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index fcbca4509a864daf2959048ac7551d1ff1a7634e..d7430655cc6b05cd55a28fa7c4d81a9534c23497 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -590,7 +590,6 @@ App.Data.resetOnNGPlus = {
 	startingGirlRelation: 0,
 	createRelatedSlave: 0,
 
-	slavesVisible: 0,
 	dormitory: 20,
 	dormitoryPopulation: 0,
 	rooms: 5,
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index 0e613fd1bb06e794a4116fd4dc3fef8bd7baf9cc..a4cf51d691f97b4cd8c8dcab3996fbb16303c8ac 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -2916,3 +2916,25 @@ window.getRevivalistNationality = function() {
 	}
 	return 0;
 };
+
+window.penthouseCensus = function() {
+	function occupiesRoom(slave) {
+		if (slave.rules.living !== "luxurious") {
+			return false; // assigned to dormitory
+		} else if (slave.assignment === "be your Head Girl" && V.HGSuite > 0) {
+			return false; // lives in HG suite
+		} else if (slave.assignment === "guard you" && V.dojo > 0) {
+			return false; // lives in dojo
+		} else if (slave.relationship >= 4) {
+			const partner = getSlave(slave.relationshipTarget);
+			if (assignmentVisible(partner) && partner.ID < slave.ID && partner.rules.living === "luxurious") {
+				return false; // living with partner, who is already assigned a room (always allocate a room to the partner with the lower ID)
+			}
+		}
+		return true; // takes her own room
+	}
+
+	const penthouseSlaves = V.slaves.filter(s => assignmentVisible(s));
+	V.roomsPopulation = penthouseSlaves.filter(occupiesRoom).length;
+	V.dormitoryPopulation = penthouseSlaves.filter(s => s.rules.living !== "luxurious").length;
+};
diff --git a/src/uncategorized/main.tw b/src/uncategorized/main.tw
index 245873ca9e116ef5010a64bf13e68f444ad9359f..d8b335a78de372ab5b163c0879eb2a9e27f5362f 100644
--- a/src/uncategorized/main.tw
+++ b/src/uncategorized/main.tw
@@ -10,21 +10,10 @@
 <</script>>
 
 <<if $tabChoice.SlaveInteract != 'Description'>>
- <<set $tabChoice.SlaveInteract = 'Description'>>
+	<<set $tabChoice.SlaveInteract = 'Description'>>
 <</if>>
 
-<<set _visibleSlaves = $slaves.filter(s => assignmentVisible(s) && (s.assignment != "be your Head Girl" || $HGSuite != 1) && (s.assignment != "guard you" || $dojo <= 1)),
-	$slavesVisible = _visibleSlaves.length,
-	$dormitoryPopulation = _visibleSlaves.filter(s => s.rules.living != "luxurious").length,
-	$roomsPopulation = $slavesVisible - $dormitoryPopulation - _visibleSlaves.filter(s => s.rules.living == "luxurious" && s.relationship >= 4).length * 0.5,
-	_PA = (Array.isArray($personalAttention) ? $personalAttention.map(function(x) { return getSlave(x.ID); }) : []),
-	_HG = $slaveIndices[$HeadGirl.ID],
-	_RC = $slaveIndices[$Recruiter.ID],
-	_BG = $slaveIndices[$Bodyguard.ID]>>
-
-<<if (def _HG && $HGSuite > 0)>><<set $slavesVisible++>><</if>>
-<<if ($HGSuiteiIDs.length > 0)>><<set $slavesVisible++>><</if>>
-<<if (def _BG && $dojo > 1)>><<set $slavesVisible++>><</if>>
+<<run penthouseCensus()>>
 
 <<set $nextButton = "END WEEK", $nextLink = "End Week", $showEncyclopedia = 1, $encyclopedia = "How to Play">>
 <<set $costs = Math.trunc(calculateCosts.predict())>>
@@ -33,8 +22,6 @@
 
 <<run SlaveSort.slaves($slaves)>>
 
-<<set _SL = $slaves.length>>
-
 <<if $newModelUI == 1>>
 	<span id="building"></span>
 	<<script>>
diff --git a/src/uncategorized/slaveAssignmentsReport.tw b/src/uncategorized/slaveAssignmentsReport.tw
index e47eccc45077f10bfaf6e53a31687ac356eaca9c..98571c44315af9a6e00c75f8d055b2693798d321 100644
--- a/src/uncategorized/slaveAssignmentsReport.tw
+++ b/src/uncategorized/slaveAssignmentsReport.tw
@@ -971,10 +971,11 @@ $sexDemandResult.topClass = Math.trunc((($NPCSexSupply.topClass + $slaveJobValue
 
 <<if $averageDick > 0>><<set $averageDick = $averageDick/$slavesWithWorkingDicks>><</if>>
 <<set $freeSexualEnergy = $PC.sexualEnergy-$fuckSlaves>>
+<<set _penthouseSlaves = App.Entity.facilities.penthouse.employees().length>>
 <<if $freeSexualEnergy > 0>>
-	<<if $freeSexualEnergy > $slavesVisible/2>>
+	<<if $freeSexualEnergy > _penthouseSlaves/2>>
 		<<set $freeSexualEnergy = 3>>
-	<<elseif $freeSexualEnergy > $slavesVisible/4>>
+	<<elseif $freeSexualEnergy > _penthouseSlaves/4>>
 		<<set $freeSexualEnergy = 2>>
 	<<else>>
 		<<set $freeSexualEnergy = 1>>
@@ -1068,6 +1069,7 @@ $sexDemandResult.topClass = Math.trunc((($NPCSexSupply.topClass + $slaveJobValue
 * @todo Figure out why we're using variable space with capitalized facility names when we can parse it from true name
 */
 
+<<set _penthouseReportLength = App.Entity.facilities.penthouse.employees().length + $HGSuiteiIDs.length>>
 <<set _facListArr = [
 	["Arcade Report", $arcadeNameCaps, $arcade, $ArcadeiIDs.length, -1, -1],
 	["Brothel Report", $brothelNameCaps, $brothel, $BrothiIDs.length, $Madam, "Madam"],
@@ -1083,7 +1085,7 @@ $sexDemandResult.topClass = Math.trunc((($NPCSexSupply.topClass + $slaveJobValue
 	["Children Report", "Nursery Children", $nursery, $nurseryBabies, -1, -1],
 	["Incubator Report", $incubatorNameCaps, $incubator, $incubatorSlaves, -1, -1],
 	["Master Suite Report", $masterSuiteNameCaps, $masterSuite, $MastSiIDs.length, $Concubine, "Concubine"],
-	["Penthouse Report", "The Penthouse", 1, $slavesVisible, -1, -1],
+	["Penthouse Report", "The Penthouse", 1, _penthouseReportLength, -1, -1],
 	["Rules Assistant Report", "Rules Assistant", $rulesAssistantAuto, 1, -1, -1] /** should be last — may reassign slaves **/
 ]>>
 
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 92a514128c5a1bb83d483443015c623cbbc2b85b..50f9d00e247dee47d93ace51e9231fc129b9984a 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -446,9 +446,7 @@
 		<<if $slaves[_i].fuckdoll > 0>>
 			//Rules have little meaning for living sex toys//
 		<<else>>
-			<<set _visibleSlaves = $slaves.filter(s => assignmentVisible(s) && (s.assignment != "be your Head Girl" || $HGSuite != 1) && (s.assignment != "guard you" || $dojo <= 1)),
-				$dormitoryPopulation = _visibleSlaves.filter(s => s.rules.living != "luxurious").length,
-				$roomsPopulation = _visibleSlaves.length - $dormitoryPopulation - _visibleSlaves.filter(s => s.rules.living == "luxurious" && s.relationship >= 4).length * 0.5>>
+			<<run penthouseCensus()>>
 
 			Living standard: ''<span id="livingRules">$slaves[_i].rules.living</span>.''
 			<<if setup.facilityCareers.includes($slaves[_i].assignment)>>