diff --git a/devTools/types/FC/RA.d.ts b/devTools/types/FC/RA.d.ts
index 05fa0941fab121102720688058bb7b1919f8e84f..5c9869eebf40ce0f04076567ab027654debce32d 100644
--- a/devTools/types/FC/RA.d.ts
+++ b/devTools/types/FC/RA.d.ts
@@ -57,6 +57,7 @@ declare namespace FC {
 		interface RuleReleaseSetters {
 			masturbation: number;
 			partner: number;
+			facilityLeader: number;
 			family: number;
 			slaves: number;
 			master: number;
diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js
index 42f090ec99196d6418bb8546d70d50d9aec66cd5..fcbf269784fc60d33176e2567e696f655f1fb4e1 100644
--- a/js/003-data/miscData.js
+++ b/js/003-data/miscData.js
@@ -1539,6 +1539,10 @@ App.Data.misc = {
 
 	servantMilkersJobs: [Job.HOUSE, Job.SUBORDINATE, Job.FUCKTOY, Job.RECRUITER, Job.REST, Job.CONFINEMENT, Job.CLASSES, Job.QUARTER],
 
+	// only these specific "development" facility leaders will do anything to satisfy their employees' sexual needs.
+	// "production" facilities need their employees to stay horny to be more effective workers.
+	sexFromDevelopmentLeaders: [Job.NURSE, Job.ATTENDANT, Job.MATRON, Job.WARDEN, Job.TEACHER],
+
 	pettyCriminalPool: ["armed robbery", "arson", "assault", "battery", "blackmail", "burglary", "cat burglar", "child abuse", "child molestation", "domestic abuse", "illegal immigrant", "manslaughter", "mule", "murder", "petty theft", "pickpocketing", "rape", "robbery", "tax evasion", "theft"],
 
 	gangCriminalPool: ["arms smuggler", "assassin", "attempted murder", "drug peddler", "drug smuggler", "fence", "gang assaulter", "gang bruiser", "gang murderer", "gang thief", "hitman", "manslaughter", "mule", "murder", "smuggler"],
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index 6d4ec8ba5cfed98d933c920ebc78fe7c5eb3cef2..6ae2a51ef83af9d163427dda9db0f3e75b3a78d7 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -83,6 +83,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 				case "chastity":
 					newRule.masturbation = 0;
 					newRule.partner = 0;
+					newRule.facilityLeader = 0;
 					newRule.family = 0;
 					newRule.slaves = 0;
 					newRule.master = 0;
@@ -90,6 +91,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 				case "restrictive":
 					newRule.masturbation = 0;
 					newRule.partner = 1;
+					newRule.facilityLeader = 1;
 					newRule.family = 0;
 					newRule.slaves = 0;
 					newRule.master = 1;
@@ -97,6 +99,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 				case "masturbation":
 					newRule.masturbation = 1;
 					newRule.partner = 0;
+					newRule.facilityLeader = 1;
 					newRule.family = 0;
 					newRule.slaves = 0;
 					newRule.master = 1;
@@ -104,6 +107,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 				case "sapphic":
 					newRule.masturbation = 0;
 					newRule.partner = 1;
+					newRule.facilityLeader = 1;
 					newRule.family = 1;
 					newRule.slaves = 1;
 					newRule.master = 1;
@@ -111,6 +115,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 				case "permissive":
 					newRule.masturbation = 1;
 					newRule.partner = 1;
+					newRule.facilityLeader = 1;
 					newRule.family = 1;
 					newRule.slaves = 1;
 					newRule.master = 1;
@@ -119,6 +124,8 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 			rulestate.release = newRule;
 		} else if (typeof rulestate.release !== "object" || rulestate.release === null) {
 			rulestate.release = new App.Entity.ReleaseRulesState();
+		} else if (typeof rulestate.release.facilityLeader !== "number") {
+			rulestate.release.facilityLeader = 1;
 		}
 	}
 
diff --git a/src/endWeek/clinicReport.js b/src/endWeek/clinicReport.js
index a098ec4070df9649bd1166252fd10a3e1c8ecfda..87ffbc9daf2b9e9d620d4c0ae5f164613c4f11dc 100644
--- a/src/endWeek/clinicReport.js
+++ b/src/endWeek/clinicReport.js
@@ -4,6 +4,7 @@ App.EndWeek.clinicReport = function() {
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.clinic);
 	let devBonus = (V.clinicDecoration !== "standard") ? 1 : 0;
 	let healthBonus = 0;
+	V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.clinic); // FIXME: should be local, passed as a parameter to saRules
 
 	function nurseText() {
 		let r = [];
diff --git a/src/endWeek/facilityLeaderSex.js b/src/endWeek/facilityLeaderSex.js
new file mode 100644
index 0000000000000000000000000000000000000000..656c4e81d7324893bd3ffe3737c9077e6b736664
--- /dev/null
+++ b/src/endWeek/facilityLeaderSex.js
@@ -0,0 +1,55 @@
+/** Get the slave (or player) who's taking care of this patient's sexual needs this week.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {{type: "player" | "lover" | "friend" | "family" | "nurse" | null, slave?: App.Entity.SlaveState}}
+ */
+App.EndWeek.getClinicPartner = function(slave) {
+	const validVisitingPartner = (/** @type {App.Entity.SlaveState} */ s) => s && canMove(s) && isSlaveAvailable(s) && App.Utils.sexAllowed(slave, s);
+	if (slave.relationship === -3) { // player visits wife
+		return {type: "player"};
+	}
+	if (slave.relationship > 0) {
+		const partner = getSlave(slave.relationshipTarget);
+		if (validVisitingPartner(partner)) {
+			if (slave.relationship > 2) { // lover
+				return {type: "lover", slave: partner};
+			} else { // friend
+				return {type: "friend", slave: partner};
+			}
+		}
+	}
+	if (V.seeIncest === 1) { // close family member
+		const partner = randomRelatedSlave(slave, validVisitingPartner);
+		if (partner) {
+			return {type: "family", slave: partner};
+		}
+	}
+	if (S.Nurse && App.Utils.sexAllowed(S.Nurse, slave)) {
+		return {type: "nurse"};
+	}
+	return {type: null};
+};
+
+/** Determines which employees a given facility leader is having sex with this week
+ * @param {App.Entity.Facilities.Facility} facility
+ * @returns {Set<number>}
+ */
+App.EndWeek.getFLSex = function(facility) {
+	/** @type {Set<number>} */
+	const employeeSex = new Set();
+	const fl = facility.manager ? facility.manager.currentEmployee : null;
+	if (fl && App.Data.misc.sexFromDevelopmentLeaders.includes[fl.assignment]) {
+		const hornyEmployees = facility.employees().filter((s) => s.devotion >= -50 /* not unhappy */ && s.energy > 20 /* not frigid */);
+		for (const emp of hornyEmployees) {
+			if (fl.assignment === Job.NURSE && App.EndWeek.getClinicPartner(emp).type !== "nurse") {
+				continue; // nurse is busy, will not have sex with patients who are satisfied by someone else
+			}
+			if (fl.assignment === Job.WARDEN && emp.relationship === -3) {
+				continue; // wardeness will never molest the PC's spouse
+			}
+			if (App.Utils.sexAllowed(emp, fl)) { // no sex with a slave you've forbidden them to fuck
+				employeeSex.add(emp.ID);
+			}
+		}
+	}
+	return employeeSex;
+};
diff --git a/src/endWeek/reports/nurseryReport.js b/src/endWeek/reports/nurseryReport.js
index 9d9bfdb6df6ab4468ccdd08bf6c6c2fea888264e..7b6c161812519b95b0b3418f45f35b6bf83dfe59 100644
--- a/src/endWeek/reports/nurseryReport.js
+++ b/src/endWeek/reports/nurseryReport.js
@@ -14,6 +14,8 @@ App.Facilities.Nursery.nurseryReport = function nurseryReport() {
 	let
 		matronBonus = 0;
 
+	V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.nursery); // FIXME: should be local, passed as a parameter to saRules
+
 	function matronChanges() {
 		if (S.Matron) {
 			S.Matron.devotion += devBonus;
diff --git a/src/endWeek/schoolroomReport.js b/src/endWeek/schoolroomReport.js
index c42cf4e6009ad1ddbd1f2576d8873cb73bb1384d..1695ad789538cfb858e9c01bab8f279a4dcbadf4 100644
--- a/src/endWeek/schoolroomReport.js
+++ b/src/endWeek/schoolroomReport.js
@@ -3,6 +3,7 @@ App.EndWeek.schoolroomReport = function() {
 
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.schoolroom);
 	const devBonus = (V.schoolroomDecoration !== "standard") ? 1 : 0;
+	V.flSex = App.EndWeek.getFLSex(App.Entity.facilities.schoolroom); // FIXME: should be local, passed as a parameter to saRules
 
 	function schoolteacherText() {
 		let r = [];
diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js
index 4a34bc39245e62e77eb6e15ca32082de16631d80..9f0ef46ffdabeb3949e3850882330aa7996f2108 100644
--- a/src/endWeek/slaveAssignmentReport.js
+++ b/src/endWeek/slaveAssignmentReport.js
@@ -407,6 +407,7 @@ App.EndWeek.slaveAssignmentReport = function() {
 
 	/* Clean up global SA variables */
 	App.EndWeek.saVars = null;
+	delete V.flSex; // FIXME: remove, once this is passed as a parameter to saRules
 
 	return res;
 
diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js
index f67710899e40f372672058285461942f27f53c43..15c4c551b46241fc3ff84e85c6fdb5e3883b0815 100644
--- a/src/interaction/siRules.js
+++ b/src/interaction/siRules.js
@@ -12,7 +12,7 @@ App.UI.SlaveInteract.rules = function(slave) {
 		let choices;
 		const {
 			He, His,
-			he, him, his
+			he, him, his, himself
 		} = getPronouns(slave);
 
 		if (V.seePreg !== 0) {
@@ -292,13 +292,14 @@ App.UI.SlaveInteract.rules = function(slave) {
 			title.textContent = `Non-assignment orgasm rules: `;
 			el.append(title);
 
-			makeLinks("Masturbation", "rules.release.masturbation");
-			makeLinks("Partner", "rules.release.partner");
-			makeLinks("Family", "rules.release.family");
-			makeLinks("Other slaves", "rules.release.slaves");
-			makeLinks("Master", "rules.release.master", true);
+			makeLinks("Masturbation", "rules.release.masturbation", `Controls whether ${he} is allowed to pleasure ${himself}, should ${he} feel the need`);
+			makeLinks("Partner", "rules.release.partner", `Controls whether ${he} is allowed sexual contact with ${his} romantic partner, should you permit ${him} to have one`);
+			makeLinks("Facility Leader", "rules.release.facilityLeader", `Controls whether development facility leaders (Nurse, Attendant, etc) are allowed to satisfy ${his} sexual needs while ${he} is assigned to their facility; does not apply to production facilities`);
+			makeLinks("Family", "rules.release.family", `Controls whether ${he} is allowed sexual contact with close family members`);
+			makeLinks("Other slaves", "rules.release.slaves", `Controls whether ${he} is allowed sexual contact with your other slaves that do not fit any of the above categories`);
+			makeLinks("Master", "rules.release.master", `Controls whether you will fuck ${him} personally when ${he} needs it`, true);
 
-			function makeLinks(text, setting, master = false) {
+			function makeLinks(text, setting, note, master = false) {
 				const options =
 					[{text: master ? `Grant` : `Allow`, updateSlave: {[setting]: 1}},
 						{text: master ? `Deny` : `Forbid`, updateSlave: {[setting]: 0}}];
@@ -307,6 +308,7 @@ App.UI.SlaveInteract.rules = function(slave) {
 				links.append(`${text}: `);
 				links.append(status(_.get(slave, setting), master));
 				links.appendChild(App.UI.SlaveInteract.generateRows(options, slave, "", false, refresh));
+				App.UI.DOM.appendNewElement('span', links, ' ' + note, "note");
 				links.className = "choices";
 				el.append(links);
 			}
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index e297af1c02fc50976d68d19ef14c14085511a098..071fa076479b0c52a4b9322a365392d4b17f9a57 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1943,6 +1943,7 @@ globalThis.DefaultRules = (function() {
 			};
 			changed = processReleaseProp('masturbation') || false;
 			changed = processReleaseProp('partner') || false;
+			changed = processReleaseProp('facilityLeader') || false;
 			changed = processReleaseProp('family') || false;
 			changed = processReleaseProp('slaves') || false;
 			changed = processReleaseProp('master') || false;
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 1851c1448382fce0b34c5072ac9a1aadeb375353..971a9635cc37c695423ff172854ff0f77e1d0438 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -15,7 +15,10 @@ App.Entity.ReleaseRulesState = class ReleaseRulesState {
 		this.masturbation = 0;
 		/** Can the slave fuck her romantic partner (relationship = FWB or higher)?
 		 * @type {FC.Bool} */
-		this.partner = 0;
+		this.partner = 1;
+		/** Can the slave's development facility leader (Nurse, Attendant, etc) fuck her if she needs it?
+		 * @type {FC.Bool} */
+		this.facilityLeader = 1;
 		/** Can the slave fuck her close family members (siblings/parents/children)?
 		 * @type {FC.Bool} */
 		this.family = 0;
diff --git a/src/js/releaseRules.js b/src/js/releaseRules.js
index 68d708532c9e13af64d6bf327936f2d4cb0db8d9..fd443122021f54e376d41afbe1fb3c1caa402b32 100644
--- a/src/js/releaseRules.js
+++ b/src/js/releaseRules.js
@@ -5,13 +5,17 @@
  * @returns {boolean}
  */
 App.Utils.sexAllowed = function sexAllowed(slaveA, slaveB) {
-	/* check most specific to least specific - master, partner, family, slaves */
+	/* check most specific to least specific - master, partner, leader, family, slaves */
 	if (slaveA === V.PC) {
 		return slaveB.rules.release.master === 1;
 	} else if (slaveB === V.PC) {
 		return slaveA.rules.release.master === 1;
 	} else if (haveRelationshipP(slaveA, slaveB)) {
 		return (slaveA.rules.release.partner === 1) && (slaveB.rules.release.partner === 1);
+	} else if (App.Utils.isDevelopmentFacilityLeader(slaveA, slaveB)) {
+		return slaveA.rules.release.facilityLeader === 1;
+	} else if (App.Utils.isDevelopmentFacilityLeader(slaveB, slaveA)) {
+		return slaveB.rules.release.facilityLeader === 1;
 	} else if (areRelated(slaveA, slaveB)) {
 		return V.seeIncest && (slaveA.rules.release.family === 1) && (slaveB.rules.release.family === 1);
 	} else {
@@ -59,6 +63,23 @@ App.Utils.releaseRestricted = function releaseRestricted(slave) {
 	return (slave.rules.release.slaves === 0) || (slave.rules.release.family === 0) || (slave.rules.release.masturbation === 0) || (slave.rules.release.partner === 0);
 };
 
+/**
+ * Returns true if employee is an employee of a development facility, and leader manages that same facility. Non-commutative!
+ * @param {App.Entity.SlaveState} employee
+ * @param {App.Entity.SlaveState} leader
+ * @returns {boolean}
+ */
+App.Utils.isDevelopmentFacilityLeader = function(employee, leader) {
+	if (!App.Data.misc.sexFromDevelopmentLeaders.includes(leader.assignment)) {
+		return false;
+	}
+	try {
+		return (leader.ID === App.Utils.jobForAssignment(employee.assignment).facility.manager.currentEmployee.ID);
+	} catch {
+		return false; // could mean no job for assignment, or facility does not have a manager assigned...doesn't matter, we're only interested in matches
+	}
+};
+
 /**
  * Returns a short summary of the slave's release rules
  * @param {App.Entity.SlaveState} slave
@@ -152,7 +173,7 @@ App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) {
 App.Desc.releaseDesc = function releaseDesc(slave) {
 	const rel = slave.rules.release;
 	const includeFamily = (rel.family === 1) && (V.seeIncest === 1);
-	const {He, he, his} = getPronouns(slave);
+	const {He, he, his, him} = getPronouns(slave);
 	let r = "and ";
 	let appendFrequency = false;
 	if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
@@ -230,6 +251,9 @@ App.Desc.releaseDesc = function releaseDesc(slave) {
 			r += ` which ${he} is rarely willing to do.`;
 		}
 	}
+	if (rel.facilityLeader === 0) {
+		r += ` Your slave leaders have been told not to touch ${him}, no matter how much ${he} begs.`;
+	} // else case is "default state", no text
 	return r;
 };
 
diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js
index ac88e556abc75bad494e0b43472b54ab9d12cac1..febf9cf4b3a3ef1fa5b7f260acd0f6d01261e361 100644
--- a/src/js/rulesAssistant.js
+++ b/src/js/rulesAssistant.js
@@ -312,6 +312,7 @@ App.RA.newRule = function() {
 		return {
 			masturbation: null,
 			partner: null,
+			facilityLeader: null,
 			family: null,
 			slaves: null,
 			master: null
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 0791f92114b7d5694049c0aa6c0117fa67ac2375..fb79af53893405046e7f6e9a19bdd552c4ebe623 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -1647,6 +1647,7 @@ globalThis.rulesAssistantOptions = (function() {
 			this.appendChild(new RewardList());
 			this.appendChild(new ReleaseMasturbationSwitch());
 			this.appendChild(new ReleasePartnerSwitch());
+			this.appendChild(new ReleaseFacilityLeaderSwitch());
 			this.appendChild(new ReleaseFamilySwitch());
 			this.appendChild(new ReleaseSlavesSwitch());
 			this.appendChild(new ReleaseMasterSwitch());
@@ -2667,6 +2668,18 @@ globalThis.rulesAssistantOptions = (function() {
 		}
 	}
 
+	class ReleaseFacilityLeaderSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];
+			super("Sex with development facility leaders", pairs);
+			this.setValue(current_rule.set.releaseRules.facilityLeader);
+			this.onchange = (value) => current_rule.set.releaseRules.facilityLeader = value;
+		}
+	}
+
 	class ReleaseFamilySwitch extends RadioSelector {
 		constructor() {
 			const pairs = [
diff --git a/src/npc/surgery/surgery.js b/src/npc/surgery/surgery.js
index 43be494f1dd7324eb65ee18085e86db5fc0612a9..7b13dac846201c179b8ed94b164874cade0984ef 100644
--- a/src/npc/surgery/surgery.js
+++ b/src/npc/surgery/surgery.js
@@ -1094,6 +1094,7 @@ globalThis.beginFuckdoll = function(slave) {
 	slave.rules.living = "spare";
 	slave.rules.speech = "restrictive";
 	slave.rules.release.masturbation = 0;
+	slave.rules.release.facilityLeader = 0;
 	slave.rules.release.partner = 0;
 	slave.rules.release.family = 0;
 	slave.rules.release.slaves = 0;
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index fa6785ecd5fe173eaa1861dff617259184885b7b..c41c21ccbf766744ea13516d26f8c650e2856766 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -39,6 +39,8 @@ App.Entity.PlayerReleaseRulesState = class {
 		this.masturbation = 1;
 		/** Can you fuck your romantic partner (relationship = FWB or higher)? */
 		this.partner = 1;
+		/** Can a developemnt facility leader (Nurse, Attendant, etc) fuck you if you need it? */
+		this.facilityLeader = 1;
 		/** Can you fuck your close family members (siblings/parents/children)? */
 		this.family = 1;
 		/** Can you fuck the general slave population? */
diff --git a/src/uncategorized/cellblockReport.tw b/src/uncategorized/cellblockReport.tw
index fb2f6af05f8fb3ba3dbe26dead54308c65f28840..7c0555e8fce51ef3ce1a0f3423485b973f0c9137 100644
--- a/src/uncategorized/cellblockReport.tw
+++ b/src/uncategorized/cellblockReport.tw
@@ -9,6 +9,7 @@
 	<<set _devBonus = 0>>
 <</if>>
 <<set _cellblockNameCaps = capFirstChar($cellblockName)>>
+<<set $flSex = App.EndWeek.getFLSex(App.Entity.facilities.cellblock)>> /* FIXME: should be local, passed as a parameter to saRules */
 
 <<if (_S.Wardeness)>>
 	<<setLocalPronouns _S.Wardeness>>
diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw
index 21365a00a289061d3764dff009490d292f2892fa..fc59461007da33c079e2fececd02de5d2a1c1ec7 100644
--- a/src/uncategorized/saRules.tw
+++ b/src/uncategorized/saRules.tw
@@ -589,7 +589,7 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be the Nurse">>
-			<<set $slaves[$i].need -= (App.Entity.facilities.clinic.employeesIDs().size*3)>>
+			<<set $slaves[$i].need -= ($flSex.size*3)>>
 			<<if $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
@@ -670,78 +670,83 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "get treatment in the clinic">>
-			<<if $slaves[$i].relationship > 2>>
-				<<set _lover = $slaveIndices[$slaves[$i].relationshipTarget]>>
-				<<if !canMove($slaves[_lover]) || !isSlaveAvailable($slaves[_lover])>>
-					<<set _lover = 0>>
-				<</if>>
-			<<else>>
-				<<set _lover = 0>>
-			<</if>>
-			<<if _lover == 0 && $seeIncest == 1>>
-				<<set _famVisitor = randomRelatedSlave($slaves[$i], (s) => { return canMove(s) && isSlaveAvailable(s) && App.Utils.sexAllowed($slaves[$i], s); } )>>
-			<</if>>
 			<<if $slaves[$i].devotion < -50>>
 				is so unhappy that $he has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
 			<<elseif $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
-			<<elseif $slaves[$i].relationship == -3>>
-				is well taken care of during $his stay in $clinicName; you make sure your $wife's every sexual need is handled personally.
-				<<set $slaves[$i].need = 0>>
-				<<if canImpreg($slaves[$i], $PC) && (($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)||($slaves[$i].anus != 0 && $slaves[$i].mpreg == 1))>>
-					<<= knockMeUp($slaves[$i], 10, 0, -1, 1)>>
-					<<if ($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)>>
-						<<set $slaves[$i].counter.vaginal += 7, $vaginalTotal += 7>>
-					<<else>>
-						<<set $slaves[$i].counter.anal += 7, $analTotal += 7>>
-					<</if>>
-					<<if $slaves[$i].preg > 0>>
-						It comes as little surprise when routine health checks start to show @@.lime;$he's pregnant!@@
-					<</if>>
-				<</if>>
-			<<elseif _lover != 0>>
-				<<setLocalPronouns $slaves[_lover] 2>>
-				<<set $slaves[$i].need = 0>>
-				is well taken care of during $his stay in $clinicName; $his <<if $slaves[$i].relationship == 3>>friend with benefits<<elseif $slaves[$i].relationship == 4>>sweetheart<<else>>_wife2<</if>> frequently stops by when $he gets the chance to make sure $his sexual needs are properly handled.
-				<<set $slaves[_lover].counter.oral += 14, $oralTotal += 14>>
-			<<elseif (def _famVisitor)>>
-				is well-loved by $his family; this week, $his <<= relativeTerm($slaves[$i], _famVisitor)>> @@.lightgreen;_famVisitor.slaveName@@ pays special attention to $him, making sure $his sexual needs are met.
-				<<set $slaves[$i].need = 0>>
-				<<set _famVisitor.counter.oral += 7, $oralTotal += 7>>
-			<<elseif _S.Nurse>>
-				is routinely brought to orgasm by _S.Nurse.slaveName as part of $his duties.
-				<<if canPenetrate($slaves[$i]) && _S.Nurse.boobs >= 500>>
-					<<run actX(_S.Nurse, "mammary", 14)>>
-				<<else>>
-					<<run actX(_S.Nurse, "oral", 14)>>
-					/* possible cumflation code here */
-				<</if>>
-				<<set $slaves[$i].need -= 60>>
-			<<elseif _release.masturbation === 1>>
-				<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-					takes solace in $his permission to masturbate rather than being forced to seek other means of release, @@.mediumaquamarine;reducing $his fear@@ of you.
-					<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
-				<<elseif ($slaves[$i].devotion <= 20)>>
-					enjoys being allowed to masturbate rather than having to seek other means of release, @@.mediumaquamarine;slightly reducing $his fear@@ of you but @@.mediumorchid;allowing $him to remain in control of $him sexuality.@@
-					<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 1, $slaves[$i].need = 0>>
-				<<elseif ($slaves[$i].devotion <= 50)>>
-					accepts having to relieve $himself solely through masturbation.
-					<<set $slaves[$i].need = 0>>
-				<<else>>
-					is a little disappointed that $he's limited to $his <<if !hasAnyArms($slaves[$i])>>imagination<<else>>hand<<if hasBothArms($slaves[$i])>>s<</if>><</if>> and toys, but @@.mediumaquamarine;understands you care about $his current health.@@
-					<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
-				<</if>>
-				<<if $slaves[$i].devotion > 20>>
-					When $he does play with $himself, $he
-					<<includeDOM App.EndWeek.Rules.masturbationFetishPlay($slaves[$i])>>
-					<<includeDOM App.EndWeek.Rules.masturbationDiscoversFetish($slaves[$i])>>
-				<</if>>
-				<<includeDOM App.EndWeek.Rules.masturbationDrugEffects($slaves[$i])>>
 			<<else>>
-				eventually gives in to $his urges and is @@.gold;punished@@ for illicit masturbation.
-				<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
+				<<set _partner = App.EndWeek.getClinicPartner($slaves[$i])>>
+				<<switch _partner.type>>
+					<<case "player">>
+						is well taken care of during $his stay in $clinicName; you make sure your $wife's every sexual need is handled personally.
+						<<set $slaves[$i].need = 0>>
+						<<if canImpreg($slaves[$i], $PC) && (($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)||($slaves[$i].anus != 0 && $slaves[$i].mpreg == 1))>>
+							<<= knockMeUp($slaves[$i], 10, 0, -1, 1)>>
+							<<if ($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)>>
+								<<set $slaves[$i].counter.vaginal += 7, $vaginalTotal += 7>>
+							<<else>>
+								<<set $slaves[$i].counter.anal += 7, $analTotal += 7>>
+							<</if>>
+							<<if $slaves[$i].preg > 0>>
+								It comes as little surprise when routine health checks start to show @@.lime;$he's pregnant!@@
+							<</if>>
+						<</if>>
+					<<case "lover">>
+						<<setLocalPronouns _partner.slave 2>>
+						<<set $slaves[$i].need = 0>>
+						is well taken care of during $his stay in $clinicName; $his <<if $slaves[$i].relationship == 3>>friend with benefits<<elseif $slaves[$i].relationship == 4>>sweetheart<<else>>_wife2<</if>> frequently stops by when $he gets the chance to make sure $his sexual needs are properly handled.
+						<<set _partner.slave.counter.oral += 14, $oralTotal += 14>>
+					<<case "family">>
+						is well-loved by $his family; this week, $his <<= relativeTerm($slaves[$i], _partner.slave)>> @@.lightgreen;_partner.slave.slaveName@@ pays special attention to $him, making sure $his sexual needs are met.
+						<<set $slaves[$i].need = 0>>
+						<<set _partner.slave.counter.oral += 7, $oralTotal += 7>>
+					<<case "friend">>
+						is friends with @@.lightgreen;_partner.slave.slaveName,@@ who comes to visit $him regularly. $His sexual frustration from being confined to the clinic shows, and _partner.slave.slaveName often winds up helping $him get relief.
+						<<if _partner.slave.rules.relationship === "permissive" && $slaves[$i].rules.relationship === "permissive">>
+							They have @@.lightgreen;become lovers.@@
+							<<set $slaves[$i].relationship = 3, _partner.slave.relationship = 3>>
+						<<else>>
+							They know it your rules prevent them from becoming anything more, but they enjoy themselves anyway.
+						<</if>>
+						<<set $slaves[$i].need = 0>>
+						<<set _partner.slave.counter.oral += 7, $oralTotal += 7>>
+					<<case "nurse">>
+						is routinely brought to orgasm by _S.Nurse.slaveName as part of $his duties.
+						<<if canPenetrate($slaves[$i]) && _S.Nurse.boobs >= 500>>
+							<<run seX(_S.Nurse, "mammary", $slaves[$i], "penetrative", 14)>>
+						<<else>>
+							<<run actX(_S.Nurse, "oral", 14)>>
+							/* possible cumflation code here */
+						<</if>>
+						<<set $slaves[$i].need -= 60>>
+					<<default>>
+						<<if _release.masturbation === 1>>
+							<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+								takes solace in $his permission to masturbate rather than being forced to seek other means of release, @@.mediumaquamarine;reducing $his fear@@ of you.
+								<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
+							<<elseif ($slaves[$i].devotion <= 20)>>
+								enjoys being allowed to masturbate rather than having to seek other means of release, @@.mediumaquamarine;slightly reducing $his fear@@ of you but @@.mediumorchid;allowing $him to remain in control of $him sexuality.@@
+								<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 1, $slaves[$i].need = 0>>
+							<<elseif ($slaves[$i].devotion <= 50)>>
+								accepts having to relieve $himself solely through masturbation.
+								<<set $slaves[$i].need = 0>>
+							<<else>>
+								is a little disappointed that $he's limited to $his <<if !hasAnyArms($slaves[$i])>>imagination<<else>>hand<<if hasBothArms($slaves[$i])>>s<</if>><</if>> and toys, but @@.mediumaquamarine;understands you care about $his current health.@@
+								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
+							<</if>>
+							<<if $slaves[$i].devotion > 20>>
+								When $he does play with $himself, $he
+								<<includeDOM App.EndWeek.Rules.masturbationFetishPlay($slaves[$i])>>
+								<<includeDOM App.EndWeek.Rules.masturbationDiscoversFetish($slaves[$i])>>
+							<</if>>
+							<<includeDOM App.EndWeek.Rules.masturbationDrugEffects($slaves[$i])>>
+						<<else>>
+							eventually gives in to $his urges and is @@.gold;punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
+						<</if>>
+				<</switch>>
 			<</if>>
 
 			<<= App.EndWeek.Rules.speechRules($slaves[$i])>>
@@ -870,7 +875,11 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be the Wardeness">>
-			<<set $slaves[$i].need -= (_L.cellblock*5)>>
+			<<if _S.Wardeness.fetish == "mindbroken">>
+				<<set $slaves[$i].need -= (_L.cellblock*5)>>
+			<<else>>
+				<<set $slaves[$i].need -= ($flSex.size*5)>>
+			<</if>>
 			<<if $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
@@ -916,7 +925,8 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be confined in the cellblock">>
-			<<if _S.Wardeness && canPenetrate(_S.Wardeness)>>
+			<<set _wardenFunTimes = 0>>
+			<<if $flSex.has($slaves[$i].ID) || _S.Wardeness.fetish == "mindbroken">>
 				<<set _wardenFunTimes = random(0,5)>>
 				<<set $slaves[$i].need -= (10*_wardenFunTimes)>>
 			<</if>>
@@ -929,32 +939,27 @@
 			<<elseif $slaves[$i].relationship == -3>>
 				You make sure your troublesome $wife's sexual needs are handled, openly, in the middle of $cellblockName, where everyone can see, hear, and smell your dominance.
 				<<set $slaves[$i].need = 0>>
+				<<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0>>
+					<<run seX($PC, "penetrative", $slaves[$i], "vaginal", 7)>>
+				<<elseif canDoAnal($slaves[$i]) && $slaves[$i].anus > 0>>
+					<<run seX($PC, "penetrative", $slaves[$i], "anal", 7)>>
+				<<else>>
+					<<run seX($PC, "penetrative", $slaves[$i], "oral", 7)>>
+				<</if>>
 				<<if canImpreg($slaves[$i], $PC) && (($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)||($slaves[$i].anus != 0 && $slaves[$i].mpreg == 1))>>
 					<<= knockMeUp($slaves[$i], 10, 0, -1, 1)>>
-					<<if ($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)>>
-						<<set $slaves[$i].counter.vaginal += 7, $vaginalTotal += 7>>
-					<<else>>
-						<<set $slaves[$i].counter.anal += 7, $analTotal += 7>>
-					<</if>>
 					<<if $slaves[$i].preg > 0>>
 						As an added show, you @@.lime;proudly display $his positive pregnancy@@ test for all to see.
 					<</if>>
-				<<elseif canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0>>
-					<<set $slaves[$i].counter.vaginal += 7, $vaginalTotal += 7>>
-				<<elseif canDoAnal($slaves[$i]) && $slaves[$i].anus > 0>>
-					<<set $slaves[$i].counter.anal += 7, $analTotal += 7>>
 				<</if>>
 			<<else>>
-				<<if _S.Wardeness && canPenetrate(_S.Wardeness)>>
-					<<run SimpleSexAct.Slave($slaves[$i], _wardenFunTimes)>>
-					<<run actX(_S.Wardeness, "penetrative", _wardenFunTimes)>>
+				<<if _wardenFunTimes > 0>>
+					<<run SimpleSexAct.Slaves($slaves[$i], _S.Wardeness, _wardenFunTimes)>>
 					<<if _wardenFunTimes > 0 && canImpreg($slaves[$i], _S.Wardeness) && ($cellblockWardenCumsInside == 1 || _S.Wardeness.fetish == "mindbroken")>>
-						<<if ($slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)>>
+						<<if (canDoVaginal($slaves[$i]) && $slaves[$i].vagina > 0 && $slaves[$i].ovaries == 1)>>
 							<<= knockMeUp($slaves[$i], 10, 0, $WardenessID, 1)>>
-							<<run seX($slaves[$i], "vaginal", _S.Wardeness, 1)>>
-						<<elseif ($slaves[$i].anus > 0 && $slaves[$i].mpreg == 1)>>
+						<<elseif (canDoAnal($slaves[$i]) && $slaves[$i].anus > 0 && $slaves[$i].mpreg == 1)>>
 							<<= knockMeUp($slaves[$i], 10, 1, $WardenessID, 1)>>
-							<<run seX($slaves[$i], "anal", _S.Wardeness, 1)>>
 						<</if>>
 					<</if>>
 				<</if>>
@@ -1037,7 +1042,7 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be the Attendant">>
-			<<set $slaves[$i].need -= (App.Entity.facilities.spa.employeesIDs().size*3)>>
+			<<set $slaves[$i].need -= ($flSex.size*3)>>
 			<<if $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
@@ -1119,7 +1124,7 @@
 			<<elseif $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off.
 				<<set $slaves[$i].need = 0>>
-			<<elseif _S.Attendant>>
+			<<elseif $flSex.has($slaves[$i].ID)>>
 				is routinely relieved of any built up tension by _S.Attendant.slaveName and $his
 				<<if canPenetrate($slaves[$i]) && _S.Attendant.boobs >= 500>>
 					luscious breasts.
@@ -1282,7 +1287,7 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be the Matron">>
-			<<set $slaves[$i].need -= (_L.nursery*3)>>
+			<<set $slaves[$i].need -= ($flSex.size*3)>>
 			<<if $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
@@ -1361,7 +1366,7 @@
 			<<elseif $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off.
 				<<set $slaves[$i].need = 0>>
-			<<elseif _S.Matron>>
+			<<elseif $flSex.has($slaves[$i].ID)>>
 				is routinely relieved of any built up tension by _S.Matron.slaveName and $his
 				<<if canPenetrate($slaves[$i]) && _S.Matron.boobs >= 500>>
 					luscious breasts.
@@ -1521,18 +1526,7 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "be the Schoolteacher">>
-			<<set $slaves[$i].need -= _L.schoolroom*10>>
-			<<set _sexLessons = _L.schoolroom*2>>
-			<<if canDoVaginal($slaves[$i]) && $slaves[$i].vagina != 0>>
-				<<set $slaves[$i].counter.vaginal += _sexLessons, $vaginalTotal += _sexLessons>>
-			<</if>>
-			<<if canDoAnal($slaves[$i]) && $slaves[$i].anus != 0>>
-				<<set $slaves[$i].counter.anal += _sexLessons, $analTotal += _sexLessons>>
-			<</if>>
-			<<if canPenetrate($slaves[$i])>>
-				<<set $slaves[$i].counter.penetrative += _sexLessons, $penetrativeTotal += _sexLessons>>
-			<</if>>
-			<<set $slaves[$i].counter.oral += _sexLessons, $oralTotal += _sexLessons>>
+			<<set $slaves[$i].need -= ($flSex.size*10)>>
 			<<if $slaves[$i].energy <= 20>>
 				is frigid and has little interest in getting off<<if App.Utils.releaseRestricted($slaves[$i])>>, making the rule restricting $his sexual outlets superfluous<</if>>.
 				<<set $slaves[$i].need = 0>>
@@ -1611,9 +1605,12 @@
 
 			<<= App.SlaveAssignment.rewardAndPunishment($slaves[$i])>>
 		<<case "learn in the schoolroom">>
-			<<if _S.Schoolteacher>>
+			<<if $flSex.has($slaves[$i].ID)>>
 				<<set $slaves[$i].need -= 30>>
-				<<run actX($slaves[$i], "oral", 7), actX($slaves[$i], "mammary", 7)>>
+				<<run seX($slaves[$i], "oral", _S.Schoolteacher, "oral", 7)>>
+				<<if canPenetrate(_S.Schoolteacher) && $slaves[$i].boobs > 500>>
+					<<run seX($slaves[$i], "mammary", _S.Schoolteacher, "penetrative", 7)>>
+				<</if>>
 				<<if canDoVaginal($slaves[$i])>>
 					<<if $slaves[$i].vagina != 0>>
 						<<run seX(_S.Schoolteacher, "penetrative", $slaves[$i], "vaginal", 7)>>
diff --git a/src/uncategorized/spaReport.tw b/src/uncategorized/spaReport.tw
index 0344e2cfc87586c7dc9dde1f28e33a4d586f971c..19d64cce398f7e4b015c77a060a1277f1ab8c5b5 100644
--- a/src/uncategorized/spaReport.tw
+++ b/src/uncategorized/spaReport.tw
@@ -8,6 +8,7 @@
 <<else>>
 	<<set _devBonus = 0>>
 <</if>>
+<<set $flSex = App.EndWeek.getFLSex(App.Entity.facilities.spa)>> /* FIXME: should be local, passed as a parameter to saRules */
 
 <<if $AttendantID != 0>>
 	<<if (_S.Attendant.health.condition < 100)>>