diff --git a/devNotes/Useful JS Function Documentation.txt b/devNotes/Useful JS Function Documentation.txt
index 2953c34658c964b684d3a83d80108c3d585ea4d8..b8ff71e8f8b673349a166440c45c716eb32cac62 100644
--- a/devNotes/Useful JS Function Documentation.txt	
+++ b/devNotes/Useful JS Function Documentation.txt	
@@ -354,6 +354,19 @@ $slave.bellyPreg = WombGetWolume($slave) - return double, with current womb volu
 findFather(ID) - searches for the ID given and returns an object or undefined
 
 
+Release Functions:
+
+sexAllowed - returns true if both slaves are allowed to have sex with each other.  All non-assignment sex should check here first; use disobedience() to determine if the slave or slaves involved will ignore the rules.
+
+hasPartnerSex - returns true if the slave has a romantic partner, the relationship is sexual, and they are allowed to sex.  Unless you are specifically checking the theoretical rule, check this instead of rules.release.partner.
+
+hasFamilySex - returns true if the slave has a close family member, they are allowed to have sex, and the player is OK with seeing the result.  Unless you are specifically checking the theoretical rule, check this instead of rules.release.family.
+
+hasNonassignmentSex - returns true if the slave is having some kind of sex while off-duty with a partner other than the PC.  This function provides the answer to "can I mention this slave having an off-duty sexual encounter of some kind."
+
+releaseRestricted - returns true if the slave has some kind of rule limiting the off-duty sex they have.  If it returns false, the slave is completely free to fuck whomever they want.
+
+
 Other Functions:
 
 isItemAccessible(itemName) - Returns if the string is available for use. Defaults to true.
@@ -384,3 +397,4 @@ UtilJS [script]
 
 	SkillIncrease() - Depreciates the sugarcube functions.
 
+	disobedience - Returns a 0-100 value indicating likelyhood of a slave ignoring the rules.
diff --git a/devTools/FC.d.ts b/devTools/FC.d.ts
index a108933461732835792b1d23ceaae83025620747..c348d54bf8bf87b2ef737890af4d176e07810e0c 100644
--- a/devTools/FC.d.ts
+++ b/devTools/FC.d.ts
@@ -89,8 +89,16 @@ declare namespace App {
 			intensity: number;
 		}
 
+		class RuleReleaseSetters {
+			masturbation: number;
+			partner: number;
+			family: number;
+			slaves: number;
+			master: number;
+		}
+
 		class RuleSetters {
-			releaseRules: string;
+			releaseRules: RuleReleaseSetters;
 			toyHole: string;
 			clitSetting: string;
 			clitSettingXY: number;
diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt
index 43ab72ec9e1dbc46b84eaf1eff5ca557e5d4dcac..48393978976701c1065c1d107eca556ab1ca9855 100644
--- a/slave variables documentation - Pregmod.txt	
+++ b/slave variables documentation - Pregmod.txt	
@@ -461,11 +461,14 @@ rules.relationship:
 
 rules.release:
 
-"permissive"
-"sapphic"
-"masturbation"
-"restrictive"
-"chastity"
+Release rules control who a slave is allowed to routinely fuck "off-camera."  0 forbids sexual contact in that category, 1 allows it.
+Narrower categories generally override broader ones, but a slave who is forbidden sexual contact with close family will avoid developing a friendship with a family member into a romantic partnership.
+
+masturbation: 0/1
+partner: 0/1
+family: 0/1
+slaves: 0/1
+master: 0/1
 
 rules.speech :
 
diff --git a/src/endWeek/saNanny.js b/src/endWeek/saNanny.js
index bba5fdf8186ac371fea77d244955c0d1f12a98a6..2556a3145b9c50a8b2bcbc7633e30db6a7c0f949 100644
--- a/src/endWeek/saNanny.js
+++ b/src/endWeek/saNanny.js
@@ -26,13 +26,6 @@ window.saNanny = function saNanny(slave) {
 		t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class="yellowgreen">reduces the upkeep</span> of your slaves.`;
 	}
 
-	// TODO:
-	if (slave.rules.release !== "chastity") {
-		const oral = jsRandom(5, 10);
-		slave.counter.oral += oral;
-		V.oralTotal += oral;
-	}
-
 	// TODO:
 	if (slave.relationship === -2) {
 		t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`;
diff --git a/src/endWeek/saRules_old.js b/src/endWeek/saRules_old.js
index 898cd294b8c640dc1fc300a8140056c46f5f8b81..491d9382acfc594875cebe9dbc130b6d591fcdef 100644
--- a/src/endWeek/saRules_old.js
+++ b/src/endWeek/saRules_old.js
@@ -4,8 +4,7 @@
 	const
 		PC = V.PC,
 		energy = V.freeSexualEnergy,
-		averageDick = V.averageDick,
-		slaves = V.slaves;
+		averageDick = V.averageDick;
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
@@ -69,23 +68,38 @@
 							}
 							slave.need = -60;
 						} else {
-							if (release === "restrictive" || release === "chastity") {
-								if (slave.devotion <= 50) {
-									if (slave.devotion <= 20) {
-										if (slave.trust > -20) {
-											r += `refuses to come up to the penthouse for sexual release and is <span class="gold">severely punished</span> for illicit masturbation. `;
+							if (!App.Utils.hasNonassignmentSex(slave) && release.masturbation === 0) {
+								if (release.master === 1) {
+									if (slave.devotion <= 50) {
+										if (slave.devotion <= 20) {
+											if (slave.trust > -20) {
+												r += `refuses to come up to the penthouse for sexual release and is <span class="gold">severely punished</span> for illicit masturbation. `;
+												slave.trust -= 2;
+												slave.need -= 10;
+											} else {
+												r += `occasionally comes to the penthouse to beg for sexual release. `;
+											}
 										} else {
-											r += `occasionally comes to the penthouse to beg for sexual release. `;
+											r += `doesn't mind having to come to the penthouse to beg for sexual release. `;
 										}
+										r += `${playerEnergy(slave)}`;
 									} else {
-										r += `doesn't mind having to come to the penthouse to beg for sexual release. `;
+										r += `willingly comes up to the penthouse and begs you to ${playerFetishPlay(slave)} whenever the urge strikes. ${playerEnergy(slave)}`;
 									}
-									r += `${playerEnergy(slave)}`;
+									r += `${playerDiscoversFetish(slave)} ${playerDrugEffects(slave)}`;
 								} else {
-									r += `willingly comes up to the penthouse and begs you to ${playerFetishPlay(slave)} whenever the urge strikes. ${playerEnergy(slave)}`;
+									if (disobedience(slave) > jsRandom(0, 100)) {
+										r += `is forbidden to masturbate or seek sexual release. In ${his} <span class="mediumorchid">intense frustration</span> ${he} breaks the rules and is <span class="gold">severely punished</span> for illicit masturbation. `;
+										slave.devotion -= 2;
+										slave.trust -= 2;
+										slave.need -= 10;
+									} else {
+										r += `is forbidden to masturbate or seek sexual release, which <span class="mediumorchid">highly frustrates</span> ${him}. `;
+										slave.devotion -= 2;
+									}
+									/* r += `${noReleaseDrugEffects(slave)}`; - port it from saRulesWidgets when we need it */
 								}
-								r += `${playerDiscoversFetish(slave)} ${playerDrugEffects(slave)}`;
-							} else if (release === "masturbation") {
+							} else if (!App.Utils.hasNonassignmentSex(slave) && release.masturbation === 1) {
 								if (slave.devotion <= 20) {
 									if (slave.trust > -20) {
 										r += `takes solace in ${his} permission to masturbate rather than being forced to beg for sex, <span class="mediumaquamarine">reducing ${his} fear</span> of you. `;
@@ -105,8 +119,13 @@
 									slave.trust++;
 									slave.need = 0;
 								} else {
-									r += `<span class="mediumaquamarine">trusts your judgment</span> that only ${he} really knows how to pleasure ${himself}, though ${he} <span class="mediumorchid">often wonders why you don't use ${him}. </span>`;
-									slave.devotion -= 2;
+									r += `<span class="mediumaquamarine">trusts your judgment</span> that only ${he} really knows how to pleasure ${himself}`;
+									if (release.master === 0) {
+										r += `, though ${he} <span class="mediumorchid">often wonders why you don't use ${him}. </span>`;
+										slave.devotion -= 2;
+									} else {
+										r += `.`;
+									}
 									slave.trust++;
 									slave.need = 0;
 								}
@@ -115,26 +134,33 @@
 									r += `When ${he} does play with ${himself}, ${he} ${masturbationFetishPlay(slave)} ${masturbationDiscoversFetish(slave)}`;
 								}
 								r += `${masturbationDrugEffects(slave)}`;
-							} else {
-								if (!V.universalRulesConsent) {
+							} else { // hasNonassignmentSex is true
+								if (!App.Utils.hasFamilySex(slave) && release.slaves === 0) {
+									// no family and no other slaves, so must be his partner
+									r += `finds frequent sexual release with his ${relationshipTerm(slave)} <span class="lightgreen">${getSlave(slave.relationshipTarget).slaveName},</span> which he is <span class="mediumaquamarine">thankful for.</span> `;
+									/* r += `${partnerDrugEffects(slave)}`; - port it from saRulesWidgets when we need it */
+									slave.need -= 20; // TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated
+									slave.trust++;
+								} else if (!V.universalRulesConsent) {
+									const whom = (release.slaves === 1) ? `other slaves` : `${his} family`;
 									if (slave.devotion <= 20) {
 										if (slave.trust > -20) {
-											if (release === "permissive") {
+											if (release.masturbation === 1) {
 												r += `masturbates whenever ${he} can find a private moment to take care of the urges induced by the food, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
 												slave.trust++;
 												slave.need = 0;
 											} else {
-												r += `refuses to ask other slaves for sex, and is <span class="gold">severely punished</span> for illicit masturbation. `;
+												r += `refuses to ask ${whom} for sex, and is <span class="gold">severely punished</span> for illicit masturbation. `;
 												slave.trust -= 2;
 												slave.need -= 10;
 											}
 										} else {
-											if (release === "permissive") {
-												r += `prefers to masturbate rather than demanding sex from other slaves, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
+											if (release.masturbation === 1) {
+												r += `prefers to masturbate rather than demanding sex from ${whom}, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
 												slave.trust++;
 												slave.need = 0;
 											} else {
-												r += `is forced by the urges induced by the food to demand sex from other slaves, and <span class="hotpink">hates ${himself}</span> for it. `;
+												r += `is forced by the urges induced by the food to demand sex from ${whom}, and <span class="hotpink">hates ${himself}</span> for it. `;
 												slave.devotion++;
 												slave.need = 0;
 											}
@@ -151,32 +177,32 @@
 								} else {
 									if (slave.devotion <= 20) {
 										if (slave.trust > -20) {
-											if (release === "permissive") {
-												r += `prefers to masturbate rather than asking other slaves for sex or giving free samples, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
+											if (release.masturbation === 1) {
+												r += `prefers to masturbate rather than asking ${whom} for sex or giving free samples, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
 												slave.trust++;
 												slave.need = 0;
 											} else {
-												r += `refuses to ask other slaves for sex, and is <span class="gold">severely punished</span> for illicit masturbation. `;
+												r += `refuses to ask ${whom} for sex, and is <span class="gold">severely punished</span> for illicit masturbation. `;
 												slave.trust -= 2;
 												slave.need -= 10;
 											}
 										} else {
-											if (release === "permissive") {
-												r += `prefers to masturbate rather than trading sex with other slaves, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
+											if (release.masturbation === 1) {
+												r += `prefers to masturbate rather than trading sex with ${whom}, <span class="mediumaquamarine">slightly reducing ${his} fear</span> of you. `;
 												slave.trust++;
 												slave.need = 0;
 											} else {
-												r += `is forced by the urges induced by the food to swap sex with other slaves, and <span class="hotpink">hates ${himself}</span> for it. `;
+												r += `is forced by the urges induced by the food to swap sex with ${whom}, and <span class="hotpink">hates ${himself}</span> for it. `;
 												slave.devotion++;
 												slave.need *= 0.5;
 											}
 										}
 									} else if (slave.devotion <= 50) {
-										r += `<span class="hotpink">accepts having to ask</span> other slaves for sex, ${consentFetish(slave)} ${consentDiscoversFetish(slave)}`;
+										r += `<span class="hotpink">accepts having to ask</span> ${whom} for sex, ${consentFetish(slave)} ${consentDiscoversFetish(slave)}`;
 										slave.devotion++;
 										slave.need = 0;
 									} else {
-										r += `<span class="mediumaquamarine">relies</span> on your other slaves for mutual satisfaction, ${consentFetish(slave)} ${consentDiscoversFetish(slave)}`;
+										r += `<span class="mediumaquamarine">relies</span> on your ${whom} for mutual satisfaction, ${consentFetish(slave)} ${consentDiscoversFetish(slave)}`;
 										slave.trust++;
 										slave.need = 0;
 									}
@@ -281,7 +307,7 @@
 										r += `Under the rules, ${he} will someday find ${himself} constantly molested by other slaves, but ${he}'s already in such constant terror it that it doesn't cross ${his} mind. `;
 									}
 								}
-							} else if (release !== "restrictive" && release !== "masturbation" && release !== "chastity") {
+							} else if (release.slaves === 1) {
 								if (slave.energy > 95) {
 									if (V.NurseryiIDs.length > 2) {
 										r += `Under the rules, ${he}'s allowed to demand that other slaves get ${him} off, and ${he} <span class="hotpink">adores</span> you for providing plentiful outlets for ${his} nymphomania. `;
@@ -395,7 +421,7 @@
 									r += `${He}'s <span class="hotpink">rewarded</span> with`;
 									if (slave.clitPiercing === 3) {
 										r += `sustained orgasm from ${his} ${slave.dick ? `dick` : `clit`} piercing,`;
-									} else if (slave.rules.release === "sapphic") {
+									} else if (slave.rules.release.slaves === 1) {
 										r += `immediate sex with any nearby slave,`;
 									} else {
 										r += `a quick climax from a vibrator,`;
@@ -1004,16 +1030,17 @@
 
 		let
 			r = ``,
+			who = (slave.rules.release.slaves === 1) ? `other slaves` : `${his} family`, // should be the only two choices if we get here
 			fuckCount;
 
 		if (slave.fetishKnown && slave.fetishStrength >= 60) {
 			switch (slave.fetish) {
 				case "submissive":
-					r += `plead that other slaves fuck ${him}. `;
+					r += `plead that ${who} fuck ${him}. `;
 					if (averageDick > 4) {
 						if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) {
 							if ((slave.anus * 40) - (averageDick * 5) < jsRandom(1, 100)) {
-								r += `<span class="lime">${His} asshole is loosened</span> during sex with other slaves, since most of the cocks ${he} enticed a dominating buttfuck from are `;
+								r += `<span class="lime">${His} asshole is loosened</span> during sex with ${who}, since most of the cocks ${he} enticed a dominating buttfuck from are `;
 								slave.anus++;
 								slave.counter.anal += 3;
 								V.analTotal += 3;
@@ -1034,13 +1061,17 @@
 					SimpleSexAct.Slave(slave, 7);
 					break;
 				case "cumslut":
-					r += `suck or be sucked by any slave ${he} fancies. `;
+					if (slave.rules.release.slaves === 1) {
+						r += `suck or be sucked by any slave ${he} fancies. `;
+					} else {
+						r += `suck or be sucked by any relative ${he} fancies. `;
+					}
 					fuckCount = jsRandom(5, 15);
 					slave.counter.oral += fuckCount;
 					V.oralTotal += fuckCount;
 					break;
 				case "humiliation":
-					r += `demand that other slaves let ${him} fuck them in public. `;
+					r += `demand that ${who} let ${him} fuck them in public. `;
 					if (!slave.rivalry) {
 						let rival = randomRapeRivalryTarget(slave, (s) => { return s.devotion <= 20 && s.trust < -20; });
 						if (jsDef(rival)) {
@@ -1055,6 +1086,11 @@
 								rival.counter.penetrative += fuckCount;
 								V.penetrativeTotal += fuckCount;
 							}
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 4);
@@ -1065,7 +1101,7 @@
 					}
 					break;
 				case "buttslut":
-					r += `demand that other slaves penetrate ${his} anus. `;
+					r += `demand that ${who} penetrate ${his} anus. `;
 					if (averageDick > 4) {
 						if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) {
 							if ((slave.anus * 30) - (averageDick * 5) < jsRandom(1, 100)) {
@@ -1079,7 +1115,7 @@
 					V.analTotal += fuckCount;
 					break;
 				case "boobs":
-					r += `demand that other slaves massage ${his} breasts. `;
+					r += `demand that ${who} massage ${his} breasts. `;
 					if (slave.lactation) {
 						slave.lactationDuration = 2;
 						slave.boobs -= slave.boobsMilk;
@@ -1092,7 +1128,11 @@
 					V.mammaryTotal += fuckCount;
 					break;
 				case "sadist":
-					r += `force the most reluctant slaves to let ${him} fuck them. `;
+					if (slave.rules.release.slaves === 1) {
+						r += `force the most reluctant slaves to let ${him} fuck them. `;
+					} else { // should imply hasFamilySex
+						r += `force ${his} most reluctant family members to let ${him} fuck them. `;
+					}
 					if (!slave.rivalry) {
 						let rival = randomRapeRivalryTarget(slave, (s) => { return s.devotion <= 50 && s.sexualFlaw !== "none"; });
 						if (jsDef(rival)) {
@@ -1126,6 +1166,11 @@
 								rival.counter.penetrative += fuckCount;
 								V.penetrativeTotal += fuckCount;
 							}
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 4);
@@ -1136,7 +1181,7 @@
 					}
 					break;
 				case "masochist":
-					r += `demand that other slaves hurt ${him}. `;
+					r += `demand that ${who} hurt ${him}. `;
 					if (averageDick > 4) {
 						if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) {
 							if ((slave.anus * 30) - (averageDick * 5) < jsRandom(1, 100)) {
@@ -1161,7 +1206,7 @@
 					SimpleSexAct.Slave(slave, 12);
 					break;
 				case "dom":
-					r += `force other slaves to submit to ${him}. `;
+					r += `force ${who} to submit to ${him}. `;
 					if (!slave.rivalry) {
 						let rival = randomRapeRivalryTarget(slave, (s) => { return s.devotion <= 20 && s.trust < -20; });
 						if (jsDef(rival)) {
@@ -1171,6 +1216,11 @@
 							slave.rivalryTarget = rival.ID;
 							rival.rivalryTarget = slave.ID;
 							SimpleSexAct.Slave(rival, 4);
+
+							if (!App.Utils.sexAllowed(slave, rival)) {
+								r += `As the rules do not permit ${slave.slaveName} and ${rival.slaveName} to have sex, ${he} is <span class="yellow">severely punished.</span> `;
+								slave.trust -= 4;
+							}
 						}
 					}
 					SimpleSexAct.Slave(slave, 7);
@@ -1181,7 +1231,7 @@
 					}
 					break;
 				case "pregnancy":
-					r += `demand that other slaves indulge ${his} pregnancy fetish. `;
+					r += `demand that ${who} indulge ${his} pregnancy fetish. `;
 					if (averageDick > 5) {
 						if (!slave.mpreg) {
 							if (slave.vagina > 0 && slave.vagina < 3 && canDoVaginal(slave)) {
@@ -1214,7 +1264,7 @@
 					break;
 				default:
 					if (slave.energy > 95) {
-						r += `demand that your other slaves satisfy ${his} formidable appetites. `;
+						r += `demand that ${who} satisfy ${his} formidable appetites. `;
 						if (averageDick > 4) {
 							if (slave.anus > 0 && slave.anus < 3 && canDoAnal(slave)) {
 								if ((slave.anus * 30) - (averageDick * 5) < jsRandom(1, 100)) {
@@ -1242,7 +1292,7 @@
 							V.penetrativeTotal += fuckCount;
 						}
 					} else {
-						r += `demand that other slaves have sex with ${him}. `;
+						r += `demand that ${who} have sex with ${him}. `;
 						SimpleSexAct.Slave(slave, 7);
 						if (canPenetrate(slave)) {
 							fuckCount = jsRandom(3, 6);
@@ -1253,7 +1303,7 @@
 					break;
 			}
 		} else {
-			r += `demand that other slaves have sex with ${him}. `;
+			r += `demand that ${who} have sex with ${him}. `;
 			SimpleSexAct.Slave(slave, 7);
 			if (canPenetrate(slave)) {
 				fuckCount = jsRandom(3, 6);
diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js
index 94fb23fb83d5872473218c3b4284e9ce77824c64..e1d2ee9da976bd330988da5d899d919df48918ec 100644
--- a/src/endWeek/saServant.js
+++ b/src/endWeek/saServant.js
@@ -87,11 +87,13 @@ window.saServant = function saServant(slave) {
 		r += `.`;
 	}
 
-	if (slave.rules.release !== "chastity") {
-		const _oral = jsRandom(5, 10);
-		slave.counter.oral += _oral;
-		V.oralTotal += _oral;
-	}
+	// TODO: this flat unchecked oral sex is a bit problematic
+	// who is she serving and why aren't they benefiting?
+	// is the current number of servants correct to accomplish this task?
+	// why can't the player prevent this on-assignment sex while still getting the other benefits of having a servant?
+	const _oral = jsRandom(5, 10);
+	slave.counter.oral += _oral;
+	V.oralTotal += _oral;
 
 	if (slave.relationship === -2) {
 		t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`;
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index 403be6e627eec52fda8b2ce3c787548b74266065..e0fb9b588301779b18f263fcb8aed1e412667e25 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -571,7 +571,7 @@ window.saServeThePublic = (function saServeThePublic() {
 	function publicReactions(slave) {
 		let sstp;
 
-		if ((slave.rules.release === "restrictive" || slave.rules.release === "chastity") && slave.rules.reward !== "orgasm") {
+		if ((slave.rules.release.masturbation === 0 && !App.Utils.hasFamilySex(slave) && slave.rules.release.slaves === 0) && slave.rules.reward !== "orgasm") {
 			r += ` ${He}'s a better slut because public service is ${his} main sexual outlet.`;
 		}
 
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index cddbe51476ba97ea1222c469acbd20367dfa3c22..21e6071f05a530ea77067e9eed3f87b0204b8988 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -641,7 +641,7 @@ window.saWhore = (function saWhore() {
 	function publicReactions(slave) {
 		let SWi;
 
-		if ((slave.rules.release === "restrictive" || slave.rules.release === "chastity") && slave.rules.reward !== "orgasm") {
+		if ((slave.rules.release.masturbation === 0 && !App.Utils.hasFamilySex(slave) && slave.rules.release.slaves === 0) && slave.rules.reward !== "orgasm") {
 			r += ` ${He}'s a better whore because prostitution is ${his} main sexual outlet.`;
 		}
 
diff --git a/src/facilities/nursery/childInteract.tw b/src/facilities/nursery/childInteract.tw
index fb07d7e2c4f6d31c68529725ad7d5a29b023acb7..2f0b3b13de85fcb40ceb422bdc84319b2969452d 100644
--- a/src/facilities/nursery/childInteract.tw
+++ b/src/facilities/nursery/childInteract.tw
@@ -1551,24 +1551,39 @@ Typical reward: ''<span id="standardReward">$activeChild.rules.reward</span>.''
 <<link "Drugs">><<set $activeChild.rules.reward = "drugs">><<replace "#standardReward">>$activeChild.rules.reward<</replace>><</link>> |
 <<link "Orgasm">><<set $activeChild.rules.reward = "orgasm">><<replace "#standardReward">>$activeChild.rules.reward<</replace>><</link>> |
 <<link "Situational">><<set $activeChild.rules.reward = "situational">><<replace "#standardReward">>$activeChild.rules.reward<</replace>><</link>>
-<br>Non-assignment orgasm rules: ''<span id="releaseRules">$activeChild.rules.release</span>.''
-<<link "Permit masturbation and interslave sex">><<set $activeChild.rules.release = "permissive">><<replace "#releaseRules">>$activeChild.rules.release<</replace>><</link>> |
-<<link "Let $him get off with other slaves">><<set $activeChild.rules.release = "sapphic">><<replace "#releaseRules">>$activeChild.rules.release<</replace>><</link>> |
-<<if !isAmputee($activeChild) && $activeChild.fuckdoll == 0 && $activeChild.fetish != "mindbroken">>
-	<<link "Restrict $him to masturbation only">><<set $activeChild.rules.release = "masturbation">><<replace "#releaseRules">>$activeChild.rules.release<</replace>><</link>> |
+
+<br><br>Non-assignment orgasm rules:
+<div style="text-indent:2em">
+Masturbation is ''<span id="relMasturbation"><<if $activeSlave.rules.release.masturbation === 1>>allowed<<else>>forbidden<</if>></span>.''
+	<<link "Allow">><<set $activeSlave.rules.release.masturbation = 1>><<replace "#relMasturbation">>allowed<</replace>><</link>> |
+	<<link "Forbid">><<set $activeSlave.rules.release.masturbation = 0>><<replace "#relMasturbation">>forbidden<</replace>><</link>>
+</div>
+<div style="text-indent:2em">
+Sex with romantic partner is ''<span id="relPartner"><<if $activeSlave.rules.release.partner === 1>>allowed<<else>>forbidden<</if>></span>.''
+	<<link "Allow">><<set $activeSlave.rules.release.partner = 1>><<replace "#relPartner">>allowed<</replace>><</link>> |
+	<<link "Forbid">><<set $activeSlave.rules.release.partner = 0>><<replace "#relPartner">>forbidden<</replace>><</link>>
+</div>
+<<if $seeIncest == 1>>
+	<div style="text-indent:2em">
+	Sex with close family is ''<span id="relFamily"><<if $activeSlave.rules.release.family === 1>>allowed<<else>>forbidden<</if>></span>.''
+		<<link "Allow">><<set $activeSlave.rules.release.family = 1>><<replace "#relFamily">>allowed<</replace>><</link>> |
+		<<link "Forbid">><<set $activeSlave.rules.release.family = 0>><<replace "#relFamily">>forbidden<</replace>><</link>>
+	</div>
 <</if>>
-<<link "Only with you">>
-	<<set $activeChild.rules.release = "restrictive">>
-	<<replace "#releaseRules">>$activeChild.rules.release<</replace>>
-<</link>> |
-<<link "Have $him remain chaste">>
-	<<set $activeChild.rules.release = "chastity">>
-	<<replace "#releaseRules">>$activeChild.rules.release<</replace>>
-<</link>>
+<div style="text-indent:2em">
+Sex with other slaves is ''<span id="relSlaves"><<if $activeSlave.rules.release.slaves === 1>>allowed<<else>>forbidden<</if>></span>.''
+	<<link "Allow">><<set $activeSlave.rules.release.slaves = 1>><<replace "#relSlaves">>allowed<</replace>><</link>> |
+	<<link "Forbid">><<set $activeSlave.rules.release.slaves = 0>><<replace "#relSlaves">>forbidden<</replace>><</link>>
+</div>
+<div style="text-indent:2em">
+Routine sex with <<= properMaster()>> is ''<span id="relMaster"><<if $activeSlave.rules.release.master === 1>>granted<<else>>denied<</if>></span>.''
+	<<link "Grant">><<set $activeSlave.rules.release.master = 1>><<replace "#relMaster">>granted<</replace>><</link>> |
+	<<link "Deny">><<set $activeSlave.rules.release.master = 0>><<replace "#relMaster">>denied<</replace>><</link>>
+</div>
 
 /* TODO: will children be able to have clit piercings? */
 <<if $activeChild.clitPiercing == 3>>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;
+	<div>
 	<<if $activeChild.dick < 1>>
 		$His smart clit piercing is set to
 	<<else>>$His smart frenulum piercing is set to
@@ -1639,7 +1654,8 @@ Typical reward: ''<span id="standardReward">$activeChild.rules.reward</span>.''
 	<<link "No sex">>
 		<<set $activeChild.clitSetting = "none">>
 		<<replace "#setting">>$activeChild.clitSetting<</replace>>
-	<</link>> |
+	<</link>>
+	</div>
 <</if>>
 
 <<if $activeChild.voice != 0>>
diff --git a/src/facilities/nursery/nurseryWidgets.js b/src/facilities/nursery/nurseryWidgets.js
index 23d9a02814426e45bada71a2b0050df6a5c35aff..bf917c342120ed6daed379ec381f925ba6dbe743 100644
--- a/src/facilities/nursery/nurseryWidgets.js
+++ b/src/facilities/nursery/nurseryWidgets.js
@@ -2840,23 +2840,7 @@ App.Facilities.Nursery.ChildSummary = function(child) {
 				r += `<strong>Rew:Situ</strong> `;
 				break;
 		}
-		switch (child.rules.release) {
-			case "permissive":
-				r += `<strong>MaR:P</strong> `;
-				break;
-			case "sapphic":
-				r += `<strong>MaR:S</strong> `;
-				break;
-			case "masturbation":
-				r += `<strong>MaR:M</strong> `;
-				break;
-			case "chastity":
-				r += `<strong>MaR:C</strong> `;
-				break;
-			default:
-				r += `<strong>MaR:R</strong> `;
-				break;
-		}
+		r += `<strong>MaR:${App.Utils.releaseSummaryShort(child)}</strong> `;
 	}
 
 	/**
@@ -2870,7 +2854,7 @@ App.Facilities.Nursery.ChildSummary = function(child) {
 		r += `Relationship rules: ${child.rules.relationship}. `;
 		r += `Typical punishment: ${child.rules.punishment}. `;
 		r += `Typical reward: ${child.rules.reward}. `;
-		r += `Release rules: ${child.rules.release}. `;
+		r += `Release rules: ${App.Utils.releaseSummaryLong(child)}. `;
 	}
 
 	/**
@@ -12624,7 +12608,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 				r += tats.vagina(child);
 			}
 
-			if (child.rules.release === "permissive" || child.rules.release === "masturbation") {
+			if (child.rules.release.masturbation === 1) {
 				if ((child.aphrodisiacs > 0 || child.inflationType === "aphrodisiac") && child.drugs !== "priapism agent") {
 					if (child.aphrodisiacs > 1 || (child.inflationType === "aphrodisiac" && child.inflation > 1)) {
 						if (child.dick !== 0 && child.hormoneBalance >= 100 && !hasAnyArms(child)) {
@@ -15052,7 +15036,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 		r += `${He} has a large, liver-colored birthmark, detracting from ${his} beauty. `;
 	}
 	if (child.skin === "sun tanned") {
-		if (child.rules.release !== "restrictive" && child.rules.release !== "masturbation" && child.rules.release !== "chastity") {
+		if (App.Utils.hasNonassignmentSex(child)) {
 			if (child.fetishKnown && child.fetishStrength > 60) {
 				r += `${His} tan is slightly uneven, since ${he} enjoys`;
 				switch (child.fetish) {
@@ -15319,11 +15303,11 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 				r += `aphrodisiacs, but is an amputee, so ${he} cannot touch ${himself}. ${He} writhes with extreme sexual frustration, desperately trying to relieve ${himself}, but only managing to stir up the aphrodisiacs contained in ${his} gut, strengthening their effects even more. `;
 			} else if (child.chastityVagina) {
 				r += `aphrodisiacs, but is wearing a chastity belt and cannot touch ${himself}. ${He} writhes with extreme sexual frustration, desperately trying to relieve ${himself}, but only managing to stir up the aphrodisiacs contained in ${his} gut, strengthening their effects even more. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0 && child.vagina === -1) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0 && child.vagina === -1) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} shaft with one hand while ${he} fingers ${his} anus with the other. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}${His} frantic masturbation forces ${his} distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} shaft and pussy with one hand while ${he} fingers ${his} anus with the other. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}${His} frantic masturbation forces ${his} distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.vagina !== -1) {
+			} else if (child.rules.release.masturbation === 1 && child.vagina !== -1) {
 				r += `aphrodisiacs, has ${V.seeDicks > 0 ? `no penis and ` : ``}no vagina, and is not allowed to masturbate, so as ${he} stands before you ${he} `;
 				if (child.anus === 0) {
 					r += `plays with a nipple with one hand while furiously rubbing ${his} virgin anus and the sensitive perineum beneath it with the other, desperately trying to get ${himself} off. ${His} frantic attempts force ${his} distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. `;
@@ -15338,7 +15322,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 					}
 					r += ` to fuck ${his} own ass. ${His} frantic attempts force ${his} distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in ${his} gut and strengthening their effects even more. `;
 				}
-			} else if (child.rules.release === "permissive" || child.rules.release === "masturbation") {
+			} else if (child.rules.release.masturbation === 1) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} clit with one hand while ${he} fingers ${his} anus with the other. `;
 			} else if (child.dick !== 0) {
 				r += `aphrodisiacs and is not allowed to masturbate, so as ${he} stands before you ${he} desperately presents ${his} open mouth, ${his} breasts, ${his} crotch, and ${his} anus in turn, hoping that something will entice you to give ${him} relief. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}`;
@@ -15353,11 +15337,11 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 				r += `aphrodisiacs, but is an amputee, so ${he} cannot touch ${himself}. ${He} writhes with extreme sexual frustration, desperately trying to relieve ${himself}. `;
 			} else if (child.chastityVagina) {
 				r += `aphrodisiacs, but is wearing a chastity belt and cannot touch ${himself}. ${He} writhes with extreme sexual frustration, desperately trying to relieve ${himself}. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0 && child.vagina === -1) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0 && child.vagina === -1) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} shaft with one hand while ${he} fingers ${his} anus with the other. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}`;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} shaft and pussy with one hand while ${he} fingers ${his} anus with the other. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}`;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.vagina !== -1) {
+			} else if (child.rules.release.masturbation === 1 && child.vagina !== -1) {
 				r += `aphrodisiacs, has ${V.seeDicks > 0 ? `no penis and ` : ``}no vagina, and is not allowed to masturbate, so as ${he} stands before you ${he}`;
 				if (child.anus === 0) {
 					r += `plays with a nipple with one hand while furiously rubbing ${his} virgin anus and the sensitive perineum beneath it with the other, desperately trying to get ${himself} off. `;
@@ -15372,7 +15356,7 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 					}
 					r += ` to fuck ${his} own ass. `;
 				}
-			} else if (child.rules.release === "permissive" || child.rules.release === "masturbation") {
+			} else if (child.rules.release.masturbation === 1) {
 				r += `aphrodisiacs and is allowed to masturbate, so as ${he} stands before you ${he} rubs ${his} clit with one hand while ${he} fingers ${his} anus with the other. `;
 			} else if (child.dick !== 0) {
 				r += `aphrodisiacs and is not allowed to masturbate, so as ${he} stands before you ${he} desperately presents ${his} open mouth, ${his} breasts, ${his} crotch, and ${his} anus in turn, hoping that something will entice you to give ${him} relief. ${canPenetrate(child) ? `${His} cock is painfully erect. ` : ``}`;
@@ -15386,11 +15370,11 @@ App.Facilities.Nursery.LongChildDescription = function(child) {
 				r += `${He}'s on aphrodisiacs, but is an amputee, so ${he} cannot touch ${himself}. ${He} writhes with sexual frustration. `;
 			} else if (child.chastityVagina) {
 				r += `${He}'s on aphrodisiacs, but is wearing a chastity belt and cannot touch ${himself}. ${He} writhes with sexual frustration. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0 && child.vagina === -1) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0 && child.vagina === -1) {
 				r += `${He}'s on aphrodisiacs and is allowed to masturbate, so as ${he} obeys your commands ${he} idly rubs ${his} shaft with one hand while the other pinches a nipple. `;
-			} else if ((child.rules.release === "permissive" || child.rules.release === "masturbation") && child.dick !== 0) {
+			} else if (child.rules.release.masturbation === 1 && child.dick !== 0) {
 				r += `${He}'s on aphrodisiacs and is allowed to masturbate, so as ${he} obeys your commands ${he} idly rubs ${his} shaft and pussy with one hand while the other pinches a nipple. `;
-			} else if (child.rules.release === "permissive" || child.rules.release === "masturbation") {
+			} else if (child.rules.release.masturbation === 1) {
 				r += `${He}'s on aphrodisiacs and is allowed to masturbate, so as ${he} obeys your commands ${he} idly rubs ${his} pussy with one hand while the other pinches a nipple. `;
 			} else if (child.dick !== 0 && canPenetrate(child)) {
 				r += `${He}'s on aphrodisiacs and is not allowed to masturbate, so as ${he} obeys your commands ${he} shifts ${his} weight uncomfortably. ${His} erect dick sways as ${he} does. `;
@@ -15767,7 +15751,7 @@ App.Facilities.Nursery.infantToChild = function infantToChild(child) {
 	child.relationship = 0,
 	child.rules.relationship = "restrictive",	// TODO:
 	child.relationshipTarget = 0,
-	child.rules.release = "restrictive",	// TODO:
+	child.rules.release = new App.Entity.ReleaseRulesState(),	// TODO:
 	child.rivalry = 0,
 	child.rivalryTarget = 0,
 	child.rudeTitle = 0,
@@ -17758,14 +17742,7 @@ App.Facilities.Nursery.ChildState = class ChildState {
 		* * "language lessons"
 		*/
 		this.rules.speech = "restrictive";
-		/**
-		* * "permissive"
-		* * "sapphic"
-		* * "masturbation"
-		* * "restrictive"
-		* * "chastity"
-		*/
-		this.rules.release = "restrictive";
+		this.rules.release = new App.Entity.ReleaseRulesState();
 		/**
 		* * "restrictive"
 		* * "just friends"
diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 851908e4144c1cecdddd569a05dfe0bd9c1d911f..e78e250424f5acbffbc8d39f03b9600be7c4a806 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -87,7 +87,7 @@ window.walkPast = (function() {
 
 		if (V.partner === "rivalry") {
 			output += rivalSlave(activeSlave, seed);
-		} else if (V.partner === "relationship" && activeSlave.relationship >= 3 && activeSlave.rules.release !== "restrictive" && activeSlave.rules.release !== "masturbation" && activeSlave.rules.release !== "chastity") {
+		} else if (V.partner === "relationship" && App.Utils.hasPartnerSex(activeSlave)) {
 			output += loverSlave(activeSlave);
 		} else if (V.partner === "relationship" || V.partner === "relation") {
 			output += relatedSlave(activeSlave);
@@ -217,7 +217,7 @@ window.walkPast = (function() {
 	function primeSlave(activeSlave, seed) {
 		r = "";
 
-		if (V.partner !== "relationship" || activeSlave.relationship === 1 || activeSlave.relationship === 2 || activeSlave.rules.release === "restrictive") {
+		if (V.partner !== "relationship" || !App.Utils.hasPartnerSex(activeSlave)) {
 			r += `${activeSlave.slaveName} `;
 			r += walkPasts(activeSlave, seed);
 			t = "";
@@ -307,7 +307,8 @@ window.walkPast = (function() {
 					fuckSpot = `out in the open in the slave dormitory`;
 				}
 
-				if ((activeSlave.fetish === "dom" || activeSlave.fetish === "sadist") && canPenetrate(activeSlave) && (partnerSlave.fetish === "dom" || partnerSlave.fetish === "sadist") && canPenetrate(partnerSlave)) {
+				const thirdWheelAllowed = (activeSlave.rules.release.slaves === 1) && (partnerSlave.rules.release.slaves === 1);
+				if (thirdWheelAllowed && (activeSlave.fetish === "dom" || activeSlave.fetish === "sadist") && canPenetrate(activeSlave) && (partnerSlave.fetish === "dom" || partnerSlave.fetish === "sadist") && canPenetrate(partnerSlave)) {
 					t += `double penetrating another slave. They're face to face over their sub's shoulders, `;
 					if (canSee(activeSlave) && canSee(partnerSlave)) {
 						t += `looking into each other's eyes `;
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index caee4e4d28c436adf20428f8779593983353a9aa..64eb2e3db4c148c03f9f5f06ff61653071c87a39 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1940,24 +1940,23 @@ window.DefaultRules = (function() {
 	 */
 	function ProcessRelease(slave, rule) {
 		if ((rule.releaseRules !== undefined) && (rule.releaseRules !== null)) {
-			let release = 0;
-			if (rule.releaseRules === "restrictive" &&
-				!(["be a subordinate slave", "be confined in the arcade", "be your Head Girl", "get milked", "please you", "serve in the club", "serve in the master suite", "serve the public", "whore", "work a glory hole", "work as a farmhand", "work in the brothel", "work in the dairy"].contains(slave.assignment))) {
-				release = 1;
-			}
-			if (slave.fetish === "mindbroken") {
-				if (slave.rules.release !== "permissive") {
-					slave.rules.release = "permissive";
-					r += `<br>Since ${slave.slaveName} is mindbroken, ${his} masturbation rules have been set to permissive.`;
-				}
-			} else if (!hasAnyArms(slave) || slave.fuckdoll > 0) {
-				if (slave.rules.release === "masturbation") {
-					slave.rules.release = "restrictive";
-					r += `<br>Since ${slave.slaveName} is unable to masturbate, ${his} masturbation rules have been set to restrictive.`;
-				}
-			} else if ((release !== 1) && (slave.rules.release !== rule.releaseRules)) {
-				slave.rules.release = rule.releaseRules;
-				r += `<br>${slave.slaveName}'s masturbation rules have been set to ${rule.releaseRules}.`;
+			let changed = false;
+			let processReleaseProp = (property) => {
+				if (rule.releaseRules[property] !== undefined && rule.releaseRules[property] !== null) {
+					if (slave.rules.release[property] !== rule.releaseRules[property]) {
+						slave.rules.release[property] = rule.releaseRules[property];
+						return true;
+					}
+				}
+				return false;
+			};
+			changed |= processReleaseProp('masturbation');
+			changed |= processReleaseProp('partner');
+			changed |= processReleaseProp('family');
+			changed |= processReleaseProp('slaves');
+			changed |= processReleaseProp('master');
+			if (changed) {
+				r += `<br>${slave.slaveName}'s release rules have been set to: ${App.Utils.releaseSummaryLong(slave)}.`;
 			}
 		}
 	}
diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 553245f3feb974e1b10628bad5a52fbe26cae02c..f8e7a5bb78a06a56c332cc4e5ace75dcc9949818 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -4,7 +4,27 @@
  */
 
 /**
- * Encapsulates porn performance of a slave. Used inside of the
+ * Encapsulates sexual release rules to be followed by a slave. Used inside of the
+ * App.Entity.Rulestate class.
+ * @ref App.Entity.Rulestate
+ */
+App.Entity.ReleaseRulesState = class ReleaseRulesState {
+	constructor() {
+		/** Can the slave masturbate? */
+		this.masturbation = 0;
+		/** Can the slave fuck her romantic partner (relationship = FWB or higher)? */
+		this.partner = 0;
+		/** Can the slave fuck her close family members (siblings/parents/children)? */
+		this.family = 0;
+		/** Can the slave fuck the general slave population? */
+		this.slaves = 0;
+		/** Will the master allow her to solicit sex from him? */
+		this.master = 1;
+	}
+};
+
+/**
+ * Encapsulates rules to be followed by a slave. Used inside of the
  * App.Entity.SlaveState class.
  * @ref App.Entity.SlaveState
  */
@@ -23,14 +43,8 @@ App.Entity.Rulestate = class Rulestate {
 		 * * "language lessons"
 		 */
 		this.speech = "restrictive";
-		/**
-		 * * "permissive"
-		 * * "sapphic"
-		 * * "masturbation"
-		 * * "restrictive"
-		 * * "chastity"
-		 */
-		this.release = "restrictive";
+		/** release rules */
+		this.release = new App.Entity.ReleaseRulesState();
 		/**
 		 * * "restrictive"
 		 * * "just friends"
@@ -60,6 +74,11 @@ App.Entity.Rulestate = class Rulestate {
 	}
 };
 
+/**
+ * Encapsulates porn performance of a slave. Used inside of the
+ * App.Entity.SlaveState class.
+ * @ref App.Entity.SlaveState
+ */
 App.Entity.SlavePornPerformanceState = class {
 	constructor() {
 		/** is the studio outputting porn of her?
@@ -2516,7 +2535,9 @@ App.Entity.SlaveState = class SlaveState {
 			porn: {
 				fame: {}
 			},
-			rules: {},
+			rules: {
+				release: {}
+			},
 			skill: {},
 			custom: {},
 		};
diff --git a/src/js/datatypeCleanupJS.js b/src/js/datatypeCleanupJS.js
index 64ddfec3964d78f3635111c6cebafd50c4ab6ed8..7593585eb2477f372c8f123a721c7814d75fec45 100644
--- a/src/js/datatypeCleanupJS.js
+++ b/src/js/datatypeCleanupJS.js
@@ -14,6 +14,7 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 	 */
 	function SlaveDataSchemeCleanup(slave) {
 		migrateRules(slave);
+		migrateReleaseRules(slave.rules);
 		migratePorn(slave);
 		migrateSkills(slave);
 		migrateCounters(slave);
@@ -67,6 +68,57 @@ App.Entity.Utils.SlaveDataSchemeCleanup = (function() {
 		}
 	}
 
+	/**
+	 * Must be run AFTER migrateRules
+	 * @param {App.Entity.RuleState} rules
+	 */
+	function migrateReleaseRules(rulestate)
+	{
+		if (typeof rulestate.release === "string") {
+			let newRule = new App.Entity.ReleaseRulesState();
+			switch (rulestate.release) {
+				case "chastity":
+					newRule.masturbation = 0;
+					newRule.partner = 0;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 0;
+					break;
+				case "restrictive":
+					newRule.masturbation = 0;
+					newRule.partner = 1;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 1;
+					break;
+				case "masturbation":
+					newRule.masturbation = 1;
+					newRule.partner = 0;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 1;
+					break;
+				case "sapphic":
+					newRule.masturbation = 0;
+					newRule.partner = 1;
+					newRule.family = 1;
+					newRule.slaves = 1;
+					newRule.master = 1;
+					break;
+				case "permissive":
+					newRule.masturbation = 1;
+					newRule.partner = 1;
+					newRule.family = 1;
+					newRule.slaves = 1;
+					newRule.master = 1;
+					break;
+			}
+			rulestate.release = newRule;
+		} else if (typeof rulestate.release !== "object" || rulestate.release === null) {
+			rulestate.release = new App.Entity.ReleaseRulesState();
+		}
+	}
+
 	/**
 	 * @param {App.Entity.SlaveState} slave
 	 */
@@ -2214,8 +2266,7 @@ App.Entity.Utils.GenePoolRecordCleanup = (function() {
 			"preg", "pregSource", "pregType", "pregAdaptation", "labor",
 			"bellyAccessory",
 			"clitSetting",
-			"rules.living", "rules.speech", "rules.release", "rules.relationship", "rules.lactation",
-			"rules.punishment", "rules.reward",
+			"rules",
 			"useRulesAssistant",
 			"diet", "dietCum", "dietMilk",
 			"tired",
@@ -2383,9 +2434,57 @@ App.Entity.Utils.RARuleDatatypeCleanup = function() {
 		}
 	}
 
+	/**
+	 * @param {App.RA.RuleSetters} set
+	 */
+	function migrateReleaseRules(set) {
+		if (typeof set.releaseRules === 'string') {
+			let newRule = {};
+			switch (set.releaseRules) {
+				case "chastity":
+					newRule.masturbation = 0;
+					newRule.partner = 0;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 0;
+					break;
+				case "restrictive":
+					newRule.masturbation = 0;
+					newRule.partner = 1;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 1;
+					break;
+				case "masturbation":
+					newRule.masturbation = 1;
+					newRule.partner = 0;
+					newRule.family = 0;
+					newRule.slaves = 0;
+					newRule.master = 1;
+					break;
+				case "sapphic":
+					newRule.masturbation = 0;
+					newRule.partner = 1;
+					newRule.family = 1;
+					newRule.slaves = 1;
+					newRule.master = 1;
+					break;
+				case "permissive":
+					newRule.masturbation = 1;
+					newRule.partner = 1;
+					newRule.family = 1;
+					newRule.slaves = 1;
+					newRule.master = 1;
+					break;
+			}
+			set.releaseRules = newRule;
+		}
+	}
+
 	/** @param {App.RA.RuleSetters} set */
 	function cleanupSetters(set) {
 		settersSchemeCleanup(set);
+		migrateReleaseRules(set);
 		replaceDefaultValues(set);
 
 		function transformValues(obj, props, cb) {
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index d6748a44763ae1c575432c5d2022b1018125466b..792083c0306dfc87624eab738247e6a0707221ea 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -1421,7 +1421,7 @@ window.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDemandRef
 
 		// The quality/value of each sexual act
 		s.sexQuality = FResult(s);
-		if ((s.rules.release === "restrictive" || s.rules.release === "chastity") && s.rules.reward !== "orgasm" && s.energy >= 20) {
+		if (!App.Utils.hasNonassignmentSex(s) && s.rules.reward !== "orgasm" && s.energy >= 20) {
 			s.sexQuality += 2;
 		}
 		if (canDoAnal(s) && s.anus === 0) {
@@ -1599,7 +1599,7 @@ window.slaveJobValues = function(lowerClassSexDemandRef, middleClassSexDemandRef
 
 		// The quality/value of each sexual act
 		s.sexQuality = FResult(s);
-		if ((s.releaseRules === "restrictive" || s.releaseRules === "chastity") && s.standardReward !== "orgasm" && s.energy >= 20) {
+		if (!App.Utils.hasNonassignmentSex(s) && s.standardReward !== "orgasm" && s.energy >= 20) {
 			s.sexQuality += 2;
 		}
 		if (canDoAnal(s) && s.anus === 0) {
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 83ac893b6c5676e6b6857478c243dfc742913cb4..c95ad1788aca3186a938d3bcb47b994665748e96 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -18,7 +18,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 							if (eventSlave.energy > 40) {
 								if (canPenetrate(eventSlave)) {
 									if (canSee(eventSlave)) {
-										if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+										if (eventSlave.rules.release.slaves === 1) {
 											State.variables.RETSevent.push("interslave begging");
 										}
 									}
@@ -34,7 +34,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 							if (eventSlave.belly < 100000) {
 								if (eventSlave.lactation > 0) {
 									if (eventSlave.nipples !== "fuckable") {
-										if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+										if (eventSlave.rules.release.family === 1) {
 											if (State.variables.familyTesting === 0) {
 												if (eventSlave.relation === "mother") {
 													State.variables.RETSevent.push("incestuous nursing");
@@ -254,7 +254,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 
 				if (State.variables.REAnalCowgirlSubIDs.length > 1 || (State.variables.REAnalCowgirlSubIDs.length === 1 && eventSlave.ID !== State.variables.REAnalCowgirlSubIDs[0])) {
 					if (eventSlave.devotion > 20) {
-						if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+						if (eventSlave.rules.release.slaves === 1) {
 							if (eventSlave.fetish === "buttslut" || eventSlave.fetish === "sadist" || eventSlave.fetish === "dom") {
 								if ((eventSlave.chastityPenis !== 1) || (eventSlave.dick === 0)) {
 									State.variables.RETSevent.push("anal cowgirl");
@@ -322,7 +322,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 							if (eventSlave.energy > 95 && canDoAnal(eventSlave)) {
 								State.variables.RESSevent.push("devoted nympho");
 							}
-							if (eventSlave.rules.release === "permissive" || eventSlave.rules.release === "masturbation") {
+							if (eventSlave.rules.release.masturbation === 1) {
 								if (hasBothArms(eventSlave)) {
 									if ((eventSlave.chastityPenis !== 1) || (eventSlave.dick === 0)) {
 										State.variables.RESSevent.push("permitted masturbation");
@@ -1162,7 +1162,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 				}
 			}
 
-			if (eventSlave.rules.release === "restrictive" || eventSlave.rules.release === "chastity") {
+			if (eventSlave.rules.release.masturbation === 0 && !App.Utils.hasNonassignmentSex(eventSlave)) {
 				if (eventSlave.need) {
 					if (eventSlave.devotion <= 95) {
 						if (eventSlave.trust >= -20) {
@@ -1179,7 +1179,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 				}
 			}
 
-			if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+			if (App.Utils.hasFamilySex(eventSlave) || eventSlave.rules.release.slaves === 1) {
 				if (canPenetrate(eventSlave)) {
 					State.variables.RESSevent.push("slave dick on slave");
 				}
@@ -1346,7 +1346,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 									State.variables.RESSevent.push("shift sleep");
 								}
 								if (canWalk(eventSlave)) {
-									if (eventSlave.rules.release === "permissive" || eventSlave.rules.release === "masturbation") {
+									if (eventSlave.rules.release.masturbation === 1) {
 										State.variables.RESSevent.push("shift masturbation");
 									}
 								}
@@ -1461,7 +1461,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 			if (eventSlave.fetishKnown === 1) {
 				if (eventSlave.energy > 95) {
 					if (eventSlave.devotion > 20) {
-						if (eventSlave.rules.release === "permissive" || eventSlave.rules.release === "masturbation") {
+						if (eventSlave.rules.release.masturbation === 1) {
 							State.variables.RESSevent.push("nympho with assistant");
 						}
 					}
@@ -1554,18 +1554,18 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 		}
 
 		if (eventSlave.aphrodisiacs > 1 || eventSlave.inflationType === "aphrodisiac") {
-			if (eventSlave.rules.speech === "restrictive" && eventSlave.rules.release !== "permissive") {
+			if (eventSlave.rules.speech === "restrictive" && eventSlave.rules.release.master === 1 && App.Utils.releaseRestricted(eventSlave)) {
 				State.variables.RESSevent.push("extreme aphrodisiacs");
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+		if (App.Utils.hasFamilySex(eventSlave) || eventSlave.rules.release.slaves === 1) {
 			if (eventSlave.clit > 2) {
 				State.variables.RESSevent.push("slave clit on slave");
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "chastity") {
+		if (eventSlave.rules.release.masturbation === 1) {
 			if (eventSlave.dick > 4) {
 				if (hasAllLimbs(eventSlave)) {
 					if (canAchieveErection(eventSlave)) {
@@ -1587,7 +1587,7 @@ window.generateRandomEventPoolStandard = function(eventSlave) {
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "chastity") {
+		if (eventSlave.rules.release.masturbation === 1) {
 			if (eventSlave.belly < 300000) {
 				if (eventSlave.anus > 2) {
 					if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) {
@@ -1843,7 +1843,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 							if (eventSlave.energy > 40) {
 								if (canPenetrate(eventSlave)) {
 									if (canSee(eventSlave)) {
-										if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+										if (eventSlave.rules.release.slaves === 1) {
 											State.variables.RETSevent.push("interslave begging");
 										}
 									}
@@ -1859,7 +1859,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 							if (eventSlave.belly < 100000) {
 								if (eventSlave.lactation > 0) {
 									if (eventSlave.nipples !== "fuckable") {
-										if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+										if (eventSlave.rules.release.family === 1) {
 											if (State.variables.familyTesting === 0) {
 												if (eventSlave.relation === "mother") {
 													State.variables.RETSevent.push("incestuous nursing");
@@ -2521,7 +2521,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 				}
 			}
 
-			if (eventSlave.rules.release === "restrictive" || eventSlave.rules.release === "chastity") {
+			if (eventSlave.rules.release.masturbation === 0) {
 				if (eventSlave.need) {
 					if (eventSlave.devotion <= 95) {
 						if (eventSlave.trust >= -20) {
@@ -2538,7 +2538,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 				}
 			}
 
-			if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+			if (App.Utils.hasFamilySex(eventSlave) || eventSlave.rules.release.slaves === 1) {
 				if (canPenetrate(eventSlave)) {
 					State.variables.RESSevent.push("slave dick on slave");
 				}
@@ -2697,7 +2697,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 			if (eventSlave.fetishKnown === 1) {
 				if (eventSlave.energy > 95) {
 					if (eventSlave.devotion > 20) {
-						if (eventSlave.rules.release === "permissive" || eventSlave.rules.release === "masturbation") {
+						if (eventSlave.rules.release.masturbation === 1) {
 							State.variables.RESSevent.push("nympho with assistant");
 						}
 					}
@@ -2751,18 +2751,18 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 		}
 
 		if (eventSlave.aphrodisiacs > 1 || eventSlave.inflationType === "aphrodisiac") {
-			if (eventSlave.rules.speech === "restrictive" && eventSlave.rules.release !== "permissive") {
+			if (eventSlave.rules.speech === "restrictive" && eventSlave.rules.release.master === 1 && App.Utils.releaseRestricted(eventSlave)) {
 				State.variables.RESSevent.push("extreme aphrodisiacs");
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "masturbation" && eventSlave.rules.release !== "chastity") {
+		if (App.Utils.hasFamilySex(eventSlave) || eventSlave.rules.release.slaves === 1) {
 			if (eventSlave.clit > 2) {
 				State.variables.RESSevent.push("slave clit on slave");
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "chastity") {
+		if (eventSlave.rules.release.masturbation === 1) {
 			if (eventSlave.dick > 4) {
 				if (hasAllLimbs(eventSlave)) {
 					if (canAchieveErection(eventSlave)) {
@@ -2784,7 +2784,7 @@ window.generateRandomEventPoolServant = function(eventSlave) {
 			}
 		}
 
-		if (eventSlave.rules.release !== "restrictive" && eventSlave.rules.release !== "chastity") {
+		if (eventSlave.rules.release.masturbation === 1) {
 			if (eventSlave.belly < 300000) {
 				if (eventSlave.anus > 2) {
 					if (eventSlave.fetish === "buttslut" || eventSlave.energy > 95) {
diff --git a/src/js/releaseRules.js b/src/js/releaseRules.js
new file mode 100644
index 0000000000000000000000000000000000000000..18e55663bbd8b122b7d4337b12de2abc07c2df30
--- /dev/null
+++ b/src/js/releaseRules.js
@@ -0,0 +1,263 @@
+/**
+ * Returns true if two slaves are allowed to have sex according to the rules.
+ * @param {App.Entity.SlaveState} slaveA
+ * @param {App.Entity.SlaveState} slaveB
+ * @returns {boolean}
+ */
+App.Utils.sexAllowed = function sexAllowed(slaveA, slaveB) {
+	/* check most specific to least specific - master, partner, 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 (V.familyTesting === 0 && haveRelationP(slaveA, slaveB)) {
+		return V.seeIncest && (slaveA.rules.release.family === 1) && (slaveB.rules.release.family === 1);
+	} else if (V.familyTesting === 1 && areRelated(slaveA, slaveB)) {
+		return V.seeIncest && (slaveA.rules.release.family === 1) && (slaveB.rules.release.family === 1);
+	} else {
+		return (slaveA.rules.release.slaves === 1) && (slaveB.rules.release.slaves === 1);
+	}
+};
+
+/**
+ * Returns true if a slave has a romantic partner other than the PC who is both willing and allowed to have sex with her.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+App.Utils.hasPartnerSex = function hasPartnerSex(slave) {
+	const hasWillingSlavePartner = (slave.rules.relationship === "permissive") && (slave.relationship >= 3) && (slave.relationshipTarget > 0);
+	return hasWillingSlavePartner && this.sexAllowed(slave, getSlave(slave.relationshipTarget));
+};
+
+/**
+ * Returns true if a slave has a close family member other than the PC who is both willing and allowed to have sex with her.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+App.Utils.hasFamilySex = function hasFamilySex(slave) {
+	if (V.seeIncest === 0 || slave.rules.release.family === 0) {
+		return false;
+	}
+	if (V.familyTesting === 0 && slave.relationTarget > 0) {
+		return this.sexAllowed(slave, getSlave(slave.relationTarget));
+	} else { // familyTesting === 1
+		return jsDef(randomRelatedSlave(slave, (s) => { return this.sexAllowed(slave, s); }));
+	}
+};
+
+/**
+ * Returns true if the slave has any kind of nonassignment sex with someone other than the PC.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+App.Utils.hasNonassignmentSex = function hasNonassignmentSex(slave) {
+	return (slave.rules.release.slaves === 1) || this.hasFamilySex(slave) || this.hasPartnerSex(slave);
+};
+
+/**
+ * Returns true if there is any restriction at all on how a slave may choose to get off.
+ * @param {App.Entity.SlaveState} slave
+ * @returns {boolean}
+ */
+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 a short summary of the slave's release rules
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Utils.releaseSummaryShort = function releaseSummaryShort(slave) {
+	const rel = slave.rules.release;
+	let ret = "";
+	if (rel.masturbation === 1) {
+		ret += "M";
+	}
+	if (rel.partner === 1) {
+		ret += "P";
+	}
+	if (rel.family === 1 && V.seeIncest === 1) {
+		ret += "F";
+	}
+	if (rel.slaves === 1) {
+		ret += "O";
+	}
+	if (rel.master === 1) {
+		ret += "Y";
+	}
+	if (ret === "") {
+		ret = "None";
+	}
+	return ret;
+};
+
+/**
+ * Returns a longer summary of the slave's release rules
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Utils.releaseSummaryLong = function releaseSummaryLong(slave) {
+	const rel = slave.rules.release;
+	const includeFamily = (rel.family === 1) && (V.seeIncest === 1);
+	if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		return "chastity";
+	} else if (rel.masturbation === 1 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		return "masturbation only";
+	} else if (rel.masturbation === 0 && rel.partner === 1 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		return "partner only";
+	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily && rel.slaves === 0 && rel.master === 0) {
+		return "family only";
+	} else if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 1) {
+		return "you only";
+	} else if (rel.slaves === 1) {
+		let ret = "permissive";
+		let exceptions = [];
+		if (rel.partner === 0) {
+			exceptions.push("partner");
+		}
+		if (!includeFamily) {
+			exceptions.push("family");
+		}
+		if (rel.master === 0) {
+			exceptions.push("you");
+		}
+		if (exceptions.length > 0) {
+			ret += " except " + exceptions.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; });
+		}
+		if (rel.masturbation === 0) {
+			ret += ", no masturbation";
+		}
+		return ret;
+	} else {
+		let permissions = [];
+		if (rel.masturbation === 1) {
+			permissions.push("masturbation");
+		}
+		if (rel.partner === 1) {
+			permissions.push("partner");
+		}
+		if (includeFamily) {
+			permissions.push("family");
+		}
+		if (rel.master === 1) {
+			permissions.push("you");
+		}
+		if (permissions.length < 1) { return "unknown"; } // probably means BC didn't get run, but let's not die because of it
+		return permissions.reduce(function(res, ch, i, arr) { return res + (i === arr.length - 1 ? ' and ' : ', ') + ch; });
+	}
+};
+
+/**
+ * Returns a description of the slave's release rules
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string}
+ */
+App.Desc.releaseDesc = function releaseDesc(slave) {
+	const rel = slave.rules.release;
+	const includeFamily = (rel.family === 1) && (V.seeIncest === 1);
+	let r = "and ";
+	let appendFrequency = false;
+	if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		r += "$he is to remain completely chaste.";
+	} else if (rel.masturbation === 1 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		r += "$he is only allowed to masturbate";
+		if (slave.energy > 95) {
+			r += ", which $he is constantly doing.";
+		} else {
+			r += ".";
+		}
+	} else if (rel.masturbation === 0 && rel.partner === 1 && !includeFamily && rel.slaves === 0 && rel.master === 0) {
+		r += "$he is not allowed to masturbate or proposition ";
+		if (slave.rules.relationship === "permissive" && slave.relationship >= 3) {
+			r += `slaves other than $his ${relationshipTerm(slave)}.`;
+		} else {
+			r += "other slaves; $he must find sexual release in $his duties.";
+		}
+	} else if (rel.masturbation === 0 && rel.partner === 0 && includeFamily && rel.slaves === 0 && rel.master === 0) {
+		r += "$he is not allowed to masturbate. $He is only allowed to achieve sexual release with close family members,";
+		appendFrequency = true;
+	} else if (rel.masturbation === 0 && rel.partner === 0 && !includeFamily && rel.slaves === 0 && rel.master === 1) {
+		r += "$he is not allowed to masturbate. $He must find you if $he wants sexual release,";
+		appendFrequency = true;
+	} else if (rel.slaves === 1) {
+		if (rel.masturbation === 0) {
+			r += "$he is not allowed to masturbate, but may ";
+		} else {
+			r += "$he is allowed to masturbate. $He may also ";
+		}
+		if (V.universalRulesConsent === 1) {
+			r += "proposition other slaves to find sexual release,";
+		} else {
+			r += "demand sex from other slaves,";
+		}
+
+		const exceptPartner = (rel.partner === 0) && (slave.rules.relationship === "permissive") && (slave.relationship >= 3);
+		if (exceptPartner && !includeFamily) {
+			r += ` except for $his ${relationshipTerm(slave)} and close family members,`;
+		} else if (exceptPartner) {
+			r += ` except for $his ${relationshipTerm(slave)},`;
+		} else if (!includeFamily) {
+			r += ` except for $his close family members,`;
+		}
+
+		appendFrequency = true;
+	} else {
+		if (rel.masturbation === 0) {
+			r += "$he is not allowed to masturbate, but may ";
+		} else {
+			r += "$he is allowed to masturbate. $He may also ";
+		}
+
+		const showPartner = (rel.partner === 1) && (slave.rules.relationship === "permissive") && (slave.relationship >= 3);
+		if (includeFamily && showPartner) {
+			r += `have sex with $his ${relationshipTerm(slave)} and close family members,`;
+		} else if (showPartner) {
+			r += `fuck $his ${relationshipTerm(slave)} as much as he wants,`;
+		} else if (includeFamily && rel.master === 1) {
+			r += `proposition sex from $his close family members and you,`;
+		} else if (includeFamily) {
+			r += `proposition sex from $his close family members,`;
+		} else { // should mean rel.master === 1
+			r += `find you for sexual relief,`;
+		}
+
+		appendFrequency = true;
+	}
+	if (appendFrequency) {
+		if ((slave.devotion > 50) || (slave.energy > 95)) {
+			r += " which $he is constantly doing.";
+		} else if (slave.devotion > 20) {
+			r += " which $he is often willing to do.";
+		} else {
+			r += " which $he is rarely willing to do.";
+		}
+	}
+	return r;
+};
+
+App.Utils.testAllReleaseText = function testAllReleaseText() {
+	let slave = new App.Entity.SlaveState();
+	slave.rules.relationship = "permissive";
+	slave.relationship = 4;
+	slave.relationshipTarget = -1;
+	let r = "";
+	for (let i = 0; i < Math.pow(2, 5); ++i) {
+		const bits = i.toString(2).padStart(5, "0");
+		let rule = new App.Entity.ReleaseRulesState();
+		rule.masturbation = Number(bits[0]);
+		rule.partner = Number(bits[1]);
+		rule.family = Number(bits[2]);
+		rule.slaves = Number(bits[3]);
+		rule.master = Number(bits[4]);
+		slave.rules.release = rule;
+
+		r += JSON.stringify(rule) + "\n";
+		r += App.Utils.releaseSummaryShort(slave) + "\n";
+		r += App.Utils.releaseSummaryLong(slave) + "\n";
+		r += App.Desc.releaseDesc(slave) + "\n";
+	}
+	return r;
+};
diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js
index 2419b46e23752e9a1c378dc2a04fc1a08698daf4..2e2a2961d33f99c0aae6192e62f45cee724c316e 100644
--- a/src/js/rulesAssistant.js
+++ b/src/js/rulesAssistant.js
@@ -257,7 +257,7 @@ App.RA.newRule = function() {
 	/** @returns {App.RA.RuleSetters} */
 	function emptySetters() {
 		return {
-			releaseRules: null,
+			releaseRules: emptyRelease(),
 			toyHole: null,
 			clitSetting: null,
 			clitSettingXY: null,
@@ -372,6 +372,17 @@ App.RA.newRule = function() {
 		};
 	}
 
+	/** @returns {App.RA.RuleReleaseSetters} */
+	function emptyRelease() {
+		return {
+			masturbation: null,
+			partner: null,
+			family: null,
+			slaves: null,
+			master: null
+		};
+	}
+
 	/** @returns {App.RA.RuleGrowthSetters} */
 	function emptyGrowth() {
 		return {
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index cbd504c6bd4f9c014160384662181975610bf9fe..515740cc6511b39294cb58c48486108fe261f638 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -1606,7 +1606,11 @@ window.rulesAssistantOptions = (function() {
 			this.appendChild(new LivingStandardList());
 			this.appendChild(new PunishmentList());
 			this.appendChild(new RewardList());
-			this.appendChild(new ReleaseList());
+			this.appendChild(new ReleaseMasturbationSwitch());
+			this.appendChild(new ReleasePartnerSwitch());
+			this.appendChild(new ReleaseFamilySwitch());
+			this.appendChild(new ReleaseSlavesSwitch());
+			this.appendChild(new ReleaseMasterSwitch());
 			this.appendChild(new ToyHoleList());
 			this.appendChild(new SmartFetishList());
 			this.appendChild(new SmartXYAttractionList());
@@ -2777,18 +2781,63 @@ window.rulesAssistantOptions = (function() {
 		}
 	}
 
-	class ReleaseList extends ListSelector {
+	class ReleaseMasturbationSwitch extends RadioSelector {
 		constructor() {
 			const pairs = [
-				["permissive"],
-				["sapphic"],
-				["masturbation"],
-				["restrictive"],
-				["chastity"]
+				["Allowed", 1],
+				["Forbidden", 0],
 			];
-			super("Release rules", pairs);
-			this.setValue(current_rule.set.releaseRules);
-			this.onchange = (value) => current_rule.set.releaseRules = value;
+			super("Masturbation", pairs);
+			this.setValue(current_rule.set.releaseRules.masturbation);
+			this.onchange = (value) => current_rule.set.releaseRules.masturbation = value;
+		}
+	}
+
+	class ReleasePartnerSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];
+			super("Sex with partner", pairs);
+			this.setValue(current_rule.set.releaseRules.partner);
+			this.onchange = (value) => current_rule.set.releaseRules.partner = value;
+		}
+	}
+
+	class ReleaseFamilySwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];			
+			super("Sex with family", pairs);
+			this.setValue(current_rule.set.releaseRules.family);
+			this.onchange = (value) => current_rule.set.releaseRules.family = value;
+		}
+	}
+
+	class ReleaseSlavesSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Allowed", 1],
+				["Forbidden", 0],
+			];			
+			super("Sex with other slaves", pairs);
+			this.setValue(current_rule.set.releaseRules.slaves);
+			this.onchange = (value) => current_rule.set.releaseRules.slaves = value;
+		}
+	}
+
+	class ReleaseMasterSwitch extends RadioSelector {
+		constructor() {
+			const pairs = [
+				["Granted", 1],
+				["Denied", 0],
+			];			
+			super(`Routine sex with ${properMaster()}`, pairs);
+			this.setValue(current_rule.set.releaseRules.master);
+			this.onchange = (value) => current_rule.set.releaseRules.master = value;
 		}
 	}
 
diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js
index 76b238c1b8d7dc59a577800aaddb087a41f3f7d1..9bd7ce3e2d1ffbe965920de363cdfc61bdcf367c 100644
--- a/src/js/slaveSummaryWidgets.js
+++ b/src/js/slaveSummaryWidgets.js
@@ -449,23 +449,7 @@ window.SlaveSummaryUncached = (function() {
 				makeSpan(c, "Rew:Situ", styles);
 				break;
 		}
-		switch (slave.rules.release) {
-			case "permissive":
-				makeSpan(c, "MaR:P", styles);
-				break;
-			case "sapphic":
-				makeSpan(c, "MaR:S", styles);
-				break;
-			case "masturbation":
-				makeSpan(c, "MaR:M", styles);
-				break;
-			case "chastity":
-				makeSpan(c, "MaR:C", styles);
-				break;
-			default:
-				makeSpan(c, "MaR:R", styles);
-				break;
-		}
+		makeSpan(c, "MaR:" + App.Utils.releaseSummaryShort(slave), styles);
 	}
 
 	/**
@@ -481,7 +465,7 @@ window.SlaveSummaryUncached = (function() {
 		addText(c, `Relationship rules: ${slave.rules.relationship}. `);
 		addText(c, `Typical punishment: ${slave.rules.punishment}. `);
 		addText(c, `Typical reward: ${slave.rules.reward}. `);
-		addText(c, `Release rules: ${slave.rules.release}. `);
+		addText(c, `Release rules: ${App.Utils.releaseSummaryLong(slave)}. `);
 	}
 
 	/**
diff --git a/src/js/surgery.js b/src/js/surgery.js
index cd8dd7642ffc9968fd05b538a66652a2d219873c..222426f0701b1e9649d856bc02b8aaeaafba89b3 100644
--- a/src/js/surgery.js
+++ b/src/js/surgery.js
@@ -933,7 +933,10 @@ window.beginFuckdoll = function(slave) {
 	}
 	slave.rules.living = "spare";
 	slave.rules.speech = "restrictive";
-	slave.rules.release = "restrictive";
+	slave.rules.release.masturbation = 0;
+	slave.rules.release.partner = 0;
+	slave.rules.release.family = 0;
+	slave.rules.release.slaves = 0;
 	slave.rules.relationship = "restrictive";
 	slave.choosesOwnClothes = 0;
 	slave.clothes = "a Fuckdoll suit";
diff --git a/src/js/utilsFC.js b/src/js/utilsFC.js
index c7aeafe7dab6557f4ba5c1cb826daa41934c60ad..2b8fea7f87eaf7e438210a58f63901468d63e3ac 100644
--- a/src/js/utilsFC.js
+++ b/src/js/utilsFC.js
@@ -2807,14 +2807,18 @@ window.disobedience = function(slave) {
  * @returns {App.Entity.SlaveState | undefined}
  */
 window.randomRapeRivalryTarget = function(slave, predicate) {
+	const willIgnoreRules = disobedience(slave) > jsRandom(0, 100);
+
 	function canBeARapeRival(s) {
 		return (s.devotion <= 95 && s.energy <= 95 && !s.rivalry && !s.fuckdoll && s.fetish !== "mindbroken");
 	}
 
 	function canRape(rapist, rapee) {
 		const opportunity = (assignmentVisible(rapist) && assignmentVisible(rapee)) || rapist.assignment === rapee.assignment;
-		const desire = !(rapist.relationship >= 3 && rapist.relationshipTarget === rapee.id);
-		return opportunity && desire;
+		const taboo = V.seeIncest === 0 && (V.familyTesting === 1 ? areRelated(rapist, rapee) : haveRelationP(rapist, rapee));
+		const desire = !(rapist.relationship >= 3 && rapist.relationshipTarget === rapee.id) && !taboo;
+		const permission = willIgnoreRules || App.Utils.sexAllowed(rapist, rapee);
+		return opportunity && desire && permission;
 	}
 
 	if (typeof predicate !== 'function') {
diff --git a/src/js/vignettes.js b/src/js/vignettes.js
index bc6965eb9bc01dc9256d9f7aa81c1398e8acc516..f3719926ec9e985fc36670c3309fd86ee8fc7d48 100644
--- a/src/js/vignettes.js
+++ b/src/js/vignettes.js
@@ -764,19 +764,20 @@ window.GetVignette = function GetVignette(slave) {
 				});
 			}
 		}
-		if (slave.rules.release === "permissive" || slave.rules.release === "masturbation") {
+		if (slave.rules.release.masturbation === 1) {
 			vignettes.push({
 				text: `a customer asked if ${he} masturbates, and then spent an hour jerking off as ${he} described how,`,
 				type: "cash",
 				effect: 1,
 			});
-		} else if (slave.rules.release === "restrictive") {
+		} else {
 			vignettes.push({
 				text: `a customer asked if ${he} masturbates, and seemed disappointed when ${he} answered honestly,`,
 				type: "cash",
 				effect: 0,
 			});
-		} else {
+		}
+		if (App.Utils.hasNonassignmentSex(slave)) {
 			vignettes.push({
 				text: `a closeted female customer asked about ${his} sex life with other slaves, and was enthralled by ${his} answer,`,
 				type: "rep",
@@ -2732,19 +2733,20 @@ window.GetVignette = function GetVignette(slave) {
 				});
 			}
 		}
-		if (slave.rules.release === "permissive" || slave.rules.release === "masturbation") {
+		if (slave.rules.release.masturbation === 1) {
 			vignettes.push({
 				text: `a citizen asked if ${he} masturbates, and then spent an hour jerking off as ${he} described how,`,
 				type: "rep",
 				effect: 1,
 			});
-		} else if (slave.rules.release === "restrictive") {
+		} else {
 			vignettes.push({
 				text: `a citizen asked if ${he} masturbates, and seemed disappointed when ${he} answered honestly,`,
 				type: "rep",
 				effect: 0,
 			});
-		} else {
+		}
+		if (App.Utils.hasNonassignmentSex(slave)) {
 			vignettes.push({
 				text: `a closeted female citizen asked about ${his} sex life with other slaves, and was enthralled by ${his} answer,`,
 				type: "rep",
@@ -4453,7 +4455,7 @@ window.GetVignette = function GetVignette(slave) {
 				});
 			} else {
 				if (hasAnyArms(slave)) {
-					if (slave.rules.release === "permissive" || slave.rules.release === "masturbation") {
+					if (slave.rules.release.masturbation === 1) {
 						vignettes.push({
 							text: `due to the obvious difficulties in ${his} mobility, ${he} spent a lot of time masturbating in bed,`,
 							type: "health",
@@ -4470,7 +4472,7 @@ window.GetVignette = function GetVignette(slave) {
 			}
 		}
 		if (slave.energy > 80) {
-			if (slave.rules.release === "permissive" || slave.rules.release === "masturbation") {
+			if (slave.rules.release.masturbation === 1) {
 				if (slave.fetish === "boobs") {
 					if (slave.boobs >= 800) {
 						vignettes.push({
diff --git a/src/npc/databases/dSlavesDatabase.tw b/src/npc/databases/dSlavesDatabase.tw
index 4ba697c08010344609504bdfb6076b0ce09dee9d..9e4d448b7f0e993d67470dcabff688184035264e 100644
--- a/src/npc/databases/dSlavesDatabase.tw
+++ b/src/npc/databases/dSlavesDatabase.tw
@@ -497,7 +497,7 @@
 <<set $heroSlaves.push(_HS)>>
 
 <<set _HS = App.Entity.SlaveState.makeSkeleton()>>
-<<set _HS.slaveName = "'Virago' Kissa", _HS.birthName = "", _HS.birthSurname = "", _HS.origin = "In spite of the great demand for $his kind, $he has apparently eluded enslavement until recently.", _HS.career = "a wanderer", _HS.ID = _i++, _HS.prestige = 1, _HS.prestigeDesc = "$He is a natural albino.", _HS.birthWeek = random(0,51), setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.muscles = 50, _HS.height = 190, _HS.nationality = "Ugandan", _HS.race = "black", _HS.hLength = 100, _HS.hStyle = "extremely long and bushy", _HS.pubicHStyle = "bushy", _HS.waist = -55, _HS.boobs = 600, _HS.face = 55, _HS.lips = 35, _HS.vaginaLube = 1, _HS.clitPiercing = 3, _HS.clitSetting = "oral", _HS.ovaries = 1, _HS.anusTat = "bleached", _HS.skill.oral = 100, _HS.skill.whoring =100, _HS.skill.entertainment = 100, _HS.skill.combat = 3, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release = "permissive", _HS.collar = "pretty jewelry", _HS.shoes = "flats", _HS.intelligence = 100, _HS.intelligenceImplant = 30, _HS.attrXY = 40, _HS.fetish = "cumslut", _HS.fetishKnown = 1, _HS.behavioralFlaw = "odd", _HS.geneticQuirks = {albinism: 2}, _HS.albinismOverride = {eyeColor: "pale grey", hColor: "white", skin: "extremely pale"}, _HS.custom.tattoo = "$His entire body is tattooed with a detailed map of $his arteries which, combined with $his albinism, gives $him a quasi-translucent quality.", _HS.custom.desc = "$His eyes are unsettling; though $his irises are a pale grey color, in some lights the whole eye takes on a red cast.">>
+<<set _HS.slaveName = "'Virago' Kissa", _HS.birthName = "", _HS.birthSurname = "", _HS.origin = "In spite of the great demand for $his kind, $he has apparently eluded enslavement until recently.", _HS.career = "a wanderer", _HS.ID = _i++, _HS.prestige = 1, _HS.prestigeDesc = "$He is a natural albino.", _HS.birthWeek = random(0,51), setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.muscles = 50, _HS.height = 190, _HS.nationality = "Ugandan", _HS.race = "black", _HS.hLength = 100, _HS.hStyle = "extremely long and bushy", _HS.pubicHStyle = "bushy", _HS.waist = -55, _HS.boobs = 600, _HS.face = 55, _HS.lips = 35, _HS.vaginaLube = 1, _HS.clitPiercing = 3, _HS.clitSetting = "oral", _HS.ovaries = 1, _HS.anusTat = "bleached", _HS.skill.oral = 100, _HS.skill.whoring =100, _HS.skill.entertainment = 100, _HS.skill.combat = 3, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release.masturbation = 1, _HS.rules.release.partner = 1, _HS.rules.release.family = 1, _HS.rules.release.slaves = 1, _HS.collar = "pretty jewelry", _HS.shoes = "flats", _HS.intelligence = 100, _HS.intelligenceImplant = 30, _HS.attrXY = 40, _HS.fetish = "cumslut", _HS.fetishKnown = 1, _HS.behavioralFlaw = "odd", _HS.geneticQuirks = {albinism: 2}, _HS.albinismOverride = {eyeColor: "pale grey", hColor: "white", skin: "extremely pale"}, _HS.custom.tattoo = "$His entire body is tattooed with a detailed map of $his arteries which, combined with $his albinism, gives $him a quasi-translucent quality.", _HS.custom.desc = "$His eyes are unsettling; though $his irises are a pale grey color, in some lights the whole eye takes on a red cast.">>
 <<set $heroSlaves.push(_HS)>>
 
 <<set _HS = App.Entity.SlaveState.makeSkeleton()>>
@@ -509,11 +509,11 @@
 <<set $heroSlaves.push(_HS)>>
 
 <<set _HS = App.Entity.SlaveState.makeSkeleton()>>
-<<set _HS.slaveName = "'Creamy' Mayu", _HS.birthName = "Mayu", _HS.ID = _i++, _HS.birthWeek = random(0,51), _HS.actualAge = 19, _HS.physicalAge = 19, _HS.visualAge = 19, _HS.ovaryAge = 19, setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.weight = 20, _HS.height = 190, _HS.nationality = "Japanese", _HS.race = "asian", _HS.eye.origColor = "blue", _HS.origHColor = "black", _HS.pubicHColor = "black", _HS.origSkin = "pale", _HS.hStyle = "long", _HS.waist = -55, _HS.boobs = 7500, _HS.nipples = "huge", _HS.areolae = 3, _HS.boobsTat = "bovine patterns", _HS.lactation = 2, _HS.lactationDuration = 2, _HS.butt = 7, _HS.buttTat = "bovine patterns", _HS.face = 15, _HS.faceImplant = 65, _HS.lips = 35, _HS.lipsTat = "bovine patterns", _HS.vagina = 2, _HS.vaginaLube = 1, _HS.vaginaTat = "bovine patterns", _HS.counter.births = 1, _HS.counter.birthsTotal = 1, _HS.anus = 1, _HS.ovaries = 1, _HS.anusTat = "bovine patterns", _HS.earPiercing = 1, _HS.shouldersTat = "bovine patterns", _HS.armsTat = "bovine patterns", _HS.legsTat = "bovine patterns", _HS.stampTat = "bovine patterns", _HS.skill.vaginal = 100, _HS.skill.oral = 100, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release = "permissive", _HS.rules.relationship = "permissive", _HS.clothes = "a nice maid outfit", _HS.collar = "leather with cowbell", _HS.shoes = "flats", _HS.intelligence = 30, _HS.attrXY = 40, _HS.fetish = "boobs", _HS.fetishKnown = 1, _HS.custom.desc = "$He is quite sweaty, often soaking though any clothing $he is wearing.">>
+<<set _HS.slaveName = "'Creamy' Mayu", _HS.birthName = "Mayu", _HS.ID = _i++, _HS.birthWeek = random(0,51), _HS.actualAge = 19, _HS.physicalAge = 19, _HS.visualAge = 19, _HS.ovaryAge = 19, setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.weight = 20, _HS.height = 190, _HS.nationality = "Japanese", _HS.race = "asian", _HS.eye.origColor = "blue", _HS.origHColor = "black", _HS.pubicHColor = "black", _HS.origSkin = "pale", _HS.hStyle = "long", _HS.waist = -55, _HS.boobs = 7500, _HS.nipples = "huge", _HS.areolae = 3, _HS.boobsTat = "bovine patterns", _HS.lactation = 2, _HS.lactationDuration = 2, _HS.butt = 7, _HS.buttTat = "bovine patterns", _HS.face = 15, _HS.faceImplant = 65, _HS.lips = 35, _HS.lipsTat = "bovine patterns", _HS.vagina = 2, _HS.vaginaLube = 1, _HS.vaginaTat = "bovine patterns", _HS.counter.births = 1, _HS.counter.birthsTotal = 1, _HS.anus = 1, _HS.ovaries = 1, _HS.anusTat = "bovine patterns", _HS.earPiercing = 1, _HS.shouldersTat = "bovine patterns", _HS.armsTat = "bovine patterns", _HS.legsTat = "bovine patterns", _HS.stampTat = "bovine patterns", _HS.skill.vaginal = 100, _HS.skill.oral = 100, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release.masturbation = 1, _HS.rules.release.partner = 1, _HS.rules.release.family = 1, _HS.rules.release.slaves = 1, _HS.rules.relationship = "permissive", _HS.clothes = "a nice maid outfit", _HS.collar = "leather with cowbell", _HS.shoes = "flats", _HS.intelligence = 30, _HS.attrXY = 40, _HS.fetish = "boobs", _HS.fetishKnown = 1, _HS.custom.desc = "$He is quite sweaty, often soaking though any clothing $he is wearing.">>
 <<set $heroSlaves.push(_HS)>>
 
 <<set _HS = App.Entity.SlaveState.makeSkeleton()>>
-<<set _HS.slaveName = "'Submissive' Cindy", _HS.birthName = "Cindy", _HS.ID = _i++, _HS.birthWeek = random(0,51), setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.muscles = 20, _HS.height = 175, _HS.nationality = "Indonesian", _HS.race = "asian", _HS.origHColor = "black", _HS.pubicHColor = "black", _HS.origSkin = "pale", _HS.hLength = 0, _HS.hStyle = "shaved bald", _HS.custom.tattoo = "$He has a barcode tattooed on the top of $his head.", _HS.pubicHStyle = "bushy", _HS.boobs = 600, _HS.nipplesPiercing = 1, _HS.boobsTat = "tribal patterns", _HS.butt = 2, _HS.buttTat = "tribal patterns", _HS.face = 55, _HS.faceImplant = 15, _HS.lips = 35, _HS.lipsPiercing = 1, _HS.lipsTat = "tribal patterns", _HS.tonguePiercing = 1, _HS.vaginaLube = 1, _HS.vaginaPiercing = 1, _HS.vaginaTat = "tribal patterns", _HS.preg = -2, _HS.clitPiercing = 3, _HS.clitSetting = "all", _HS.ovaries = 1, _HS.anusPiercing = 1, _HS.anusTat = "bleached", _HS.earPiercing = 1, _HS.nosePiercing = 1, _HS.eyebrowPiercing = 1, _HS.navelPiercing = 1, _HS.shouldersTat = "tribal patterns", _HS.armsTat = "tribal patterns", _HS.legsTat = "tribal patterns", _HS.stampTat = "tribal patterns", _HS.skill.oral = 35, _HS.skill.combat = 1, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release = "permissive", _HS.rules.relationship = "permissive", _HS.clothes = "attractive lingerie", _HS.collar = "pretty jewelry", _HS.shoes = "heels", _HS.intelligence = -70, _HS.intelligenceImplant = 30, _HS.energy = 100, _HS.attrXY = 40, _HS.fetishKnown = 1, _HS.custom.desc = "$His skin is unnaturally perfect, totally without blemishes. $He radiates unnatural health and resilience.">>
+<<set _HS.slaveName = "'Submissive' Cindy", _HS.birthName = "Cindy", _HS.ID = _i++, _HS.birthWeek = random(0,51), setHealth(_HS, 100, 0, 0, 0, 0), _HS.devotion = 100, _HS.muscles = 20, _HS.height = 175, _HS.nationality = "Indonesian", _HS.race = "asian", _HS.origHColor = "black", _HS.pubicHColor = "black", _HS.origSkin = "pale", _HS.hLength = 0, _HS.hStyle = "shaved bald", _HS.custom.tattoo = "$He has a barcode tattooed on the top of $his head.", _HS.pubicHStyle = "bushy", _HS.boobs = 600, _HS.nipplesPiercing = 1, _HS.boobsTat = "tribal patterns", _HS.butt = 2, _HS.buttTat = "tribal patterns", _HS.face = 55, _HS.faceImplant = 15, _HS.lips = 35, _HS.lipsPiercing = 1, _HS.lipsTat = "tribal patterns", _HS.tonguePiercing = 1, _HS.vaginaLube = 1, _HS.vaginaPiercing = 1, _HS.vaginaTat = "tribal patterns", _HS.preg = -2, _HS.clitPiercing = 3, _HS.clitSetting = "all", _HS.ovaries = 1, _HS.anusPiercing = 1, _HS.anusTat = "bleached", _HS.earPiercing = 1, _HS.nosePiercing = 1, _HS.eyebrowPiercing = 1, _HS.navelPiercing = 1, _HS.shouldersTat = "tribal patterns", _HS.armsTat = "tribal patterns", _HS.legsTat = "tribal patterns", _HS.stampTat = "tribal patterns", _HS.skill.oral = 35, _HS.skill.combat = 1, _HS.rules.living = "luxurious", _HS.rules.speech = "permissive", _HS.rules.release.masturbation = 1, _HS.rules.release.partner = 1, _HS.rules.release.family = 1, _HS.rules.release.slaves = 1, _HS.rules.relationship = "permissive", _HS.clothes = "attractive lingerie", _HS.collar = "pretty jewelry", _HS.shoes = "heels", _HS.intelligence = -70, _HS.intelligenceImplant = 30, _HS.energy = 100, _HS.attrXY = 40, _HS.fetishKnown = 1, _HS.custom.desc = "$His skin is unnaturally perfect, totally without blemishes. $He radiates unnatural health and resilience.">>
 <<set $heroSlaves.push(_HS)>>
 
 <<set _HS = App.Entity.SlaveState.makeSkeleton()>>
diff --git a/src/npc/fFeelings.tw b/src/npc/fFeelings.tw
index 4fbe2aec64d9cd5614e0d2a60fa087e35e4abdf0..fd5dd83f8acbf86204290c56f8d60c2a9f1cbc77 100644
--- a/src/npc/fFeelings.tw
+++ b/src/npc/fFeelings.tw
@@ -423,7 +423,7 @@ My favorite part of my body i<<s>>
 			<<set _Amp = "rub mythelf againtht thtuff,">>
 		<</if>>
 	<</if>>
-	<<if ($activeSlave.rules.release == "permissive") || ($activeSlave.rules.release == "masturbation")>>
+	<<if ($activeSlave.rules.release.masturbation == 1)>>
 		Thank you for letting me
 		<<if ($activeSlave.fetishKnown == 1)>>
 			<<if ($activeSlave.energy > 95) && (!canSee($activeSlave))>>
@@ -464,7 +464,7 @@ My favorite part of my body i<<s>>
 		<<else>>
 			_Amp <<Master>>.
 		<</if>>
-	<<elseif ($activeSlave.rules.release == "sapphic")>>
+	<<elseif ($activeSlave.rules.release.slaves == 1)>>
 		Thank you for letting
 		<<if ($activeSlave.fetishKnown == 1)>>
 			<<if ($activeSlave.energy > 95)>>
@@ -498,7 +498,44 @@ My favorite part of my body i<<s>>
 				me get off with the other girl<<s>>,
 			<</if>>
 		<<else>>
-			me _Amp
+			me get off with the other girl<<s>>,
+		<</if>>
+		<<Master>>.
+	<<elseif (App.Utils.hasFamilySex($activeSlave))>>
+		Thank you for letting
+		<<if ($activeSlave.fetishKnown == 1)>>
+			<<if ($activeSlave.energy > 95)>>
+				me fuck my family,
+			<<elseif ($activeSlave.fetish == "humiliation") && ($activeSlave.fetishStrength > 60)>>
+				my family fuck me, I love doing it in the dormitory where everyone can <<s>>ee us.
+			<<elseif ($activeSlave.fetish == "sadist") && ($activeSlave.fetishStrength > 60)>>
+				me abu<<s>>e my family,
+			<<elseif ($activeSlave.fetish == "buttslut") && ($activeSlave.fetishStrength > 60)>>
+				my family fuck my butthole,
+			<<elseif ($activeSlave.fetish == "boobs") && ($activeSlave.fetishStrength > 60)>>
+				my family play with my boob<<s>>,
+			<<elseif ($activeSlave.fetish == "pregnancy") && ($activeSlave.fetishStrength > 60)>>
+				<<if ($activeSlave.bellyPreg >= 5000)>>
+					my family fuck me, being pregnant and getting fucked i<<s>> amazing,
+				<<elseif ($activeSlave.dick > 1) && ($activeSlave.balls > 0)>>
+					me fuck my family, I cum <<s>>o hard whenever I imagine filling them with babie<<s>>,
+				<<else>>
+					my family fuck me, I love imagining how I'd look with a tummy <<s>>wollen with babie<<s>>,
+				<</if>>
+			<<elseif ($activeSlave.fetish == "cumslut") && ($activeSlave.fetishStrength > 60)>>
+				my family u<<s>>e my mouth to cum.
+				<<if ($activeSlave.dick > 0) && ($activeSlave.balls > 0)>>
+					Being able to drink my own cum i<<s>> really fun too,
+				<<elseif $activeSlave.dietCum == 1 || $activeSlave.dietCum == 2 >>
+					I love having cum in my food, and <<s>>ometime<<s>> I get an e<<x>>tra load on top from a relative,
+				<</if>>
+			<<elseif ($activeSlave.attrKnown == 1) && ($activeSlave.attrXX > 80)>>
+				me bone the ladie<<s>> in my family,
+			<<else>>
+				me get off with the other girl<<s>> in my family,
+			<</if>>
+		<<else>>
+			me get off with the other girl<<s>> in my family,
 		<</if>>
 		<<Master>>.
 	<<else>>
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index 09f3446a0071ef3ae385e8e3dab938e6ba6df45c..1b21e8026ec7e63724c1ac1e89720d97091134cd 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -28,6 +28,26 @@ App.Entity.PlayerSkillsState = class {
 	}
 };
 
+/**
+ * Encasulates your sexual preferences. Used inside of the
+ * App.Entity.PlayerState class.
+ * @ref App.Entity.PlayerState
+ */
+App.Entity.PlayerReleaseRulesState = class {
+	constructor() {
+		/** Can you masturbate? */
+		this.masturbation = 1;
+		/** Can you fuck your romantic partner (relationship = FWB or higher)? */
+		this.partner = 1;
+		/** Can you fuck your close family members (siblings/parents/children)? */
+		this.family = 1;
+		/** Can you fuck the general slave population? */
+		this.slaves = 1;
+		/** Just here for compatibility with the slave version of ReleaseRulesState, should always be 1. */
+		this.master = 1;
+	}
+};
+
 /**
  * Encapsulates your preferences. Used inside of the
  * App.Entity.PlayerState class.
@@ -43,7 +63,7 @@ App.Entity.PlayerRulesState = class {
 		 */
 		this.living = "luxurious";
 		this.speech = "permissive";
-		this.release = "permissive";
+		this.release = new App.Entity.PlayerReleaseRulesState();
 		this.relationship = "permissive";
 		/**
 		 * How you are handling your lactation
@@ -406,7 +426,7 @@ App.Entity.PlayerState = class PlayerState {
 			tired: 0,
 			/** your combined health (condition - short - long) */
 			health: 0
-		}
+		};
 		/**
 		 * you have a minor injury ("black eye", "bruise", "split lip")
 		 * @type {number | string}
diff --git a/src/pregmod/widgets/deathWidgets.tw b/src/pregmod/widgets/deathWidgets.tw
index 17e7af9e4fd6b5c9f6a7e3804e0af93ce82b54a0..0697933639997e1be1c285b9b49417c83070a636 100644
--- a/src/pregmod/widgets/deathWidgets.tw
+++ b/src/pregmod/widgets/deathWidgets.tw
@@ -46,7 +46,7 @@
 		<<elseif _deathSeed > 25>>
 			$He is found dead in the showers, having slipped sometime earlier.
 		<<else>>
-			<<if $args[0].rules.release != "restrictive" && $args[0].rules.release != "masturbation" && $args[0].rules.release != "chastity">>
+			<<if App.Utils.hasNonassignmentSex($args[0])>>
 				$He is found dead in the bed of another slave, having died during intercourse. $His lover is not taking it well.
 			<<else>>
 				$He is found dead in the cafeteria, having died during breakfast; $he ruined the day for a number of your slaves.
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 1944c3eb03f4ce00a9587895607617138d819bca..b930100048b9a061a61a61be36bc2457768df52e 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -3845,7 +3845,7 @@ The slutty $desc wants it badly.
 
 <<case "arcade sadist">>
 
-You happen to come across <<EventNameLink>> during one of $his rest periods. $He's lying on a couch in the slave areas, <<if canSee($activeSlave)>>staring at the ceiling above $him<<else>>leaning back<</if>> with a dreamy expression on $his face. $He's <<if $activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation">>touching $himself idly.<<else>>not allowed to touch $himself, but $he's extremely aroused.<</if>> Whatever's on $his mind, it's so absorbing that $he doesn't realize you're there until you're standing over $him.
+You happen to come across <<EventNameLink>> during one of $his rest periods. $He's lying on a couch in the slave areas, <<if canSee($activeSlave)>>staring at the ceiling above $him<<else>>leaning back<</if>> with a dreamy expression on $his face. $He's <<if $activeSlave.rules.release.masturbation == 1>>touching $himself idly.<<else>>not allowed to touch $himself, but $he's extremely aroused.<</if>> Whatever's on $his mind, it's so absorbing that $he doesn't realize you're there until you're standing over $him.
 <br><br>
 "<<S>>orry, <<Master>>," $he <<say>>s apologetically, <<if $activeSlave.belly >= 10000>>struggling<<else>>scrambling<</if>> to $his feet. "I didn't noti<<c>>e you there." <<if canSee($activeSlave)>>Seeing your questioning look<<elseif canHear($activeSlave)>>Hearing your lack of response<<else>>Sensing a request to continue<</if>>, $he explains $himself further. "I was ju<<s>>t thinking about, um, my favorite pla<<c>>e. I can almo<<s>>t get off ju<<s>>t by thinking about it." There's a wild, perverted gleam <<if canSee($activeSlave)>>in $his <<= App.Desc.eyesColor($activeSlave)>><<else>>on $his face<</if>>. $He's a confirmed sadist, so whatever $his favorite mental masturbation is probably quite strong.
 
@@ -19321,7 +19321,7 @@ brought in to you. This time <<EventNameLink>> has been sent to deliver it. $He
 		<<if $activeSlave.belly >= 10000>> You spread your legs as you shift into a more comfortable position, stealthily showing mercy since $he can't possibly keep $his <<if $activeSlave.bellyPreg >= 3000>>full-term belly<<else>>_belly belly<</if>> off you otherwise.<</if>> $He bobs up and down, getting you off without ever touching you<<if $PC.dick != 0>>, other than the contact between your penis and the inside of $his body, of course<</if>>.
 		<<if $activeSlave.energy > 80>>
 			$He has such a powerful sex drive that even this sterile intercourse brings $him to orgasm.
-		<<elseif $activeSlave.rules.release == "restrictive" || $activeSlave.rules.release == "chastity">>
+		<<elseif (!App.Utils.hasNonassignmentSex($activeSlave))>>
 			$He obeys the rules about orgasm and hasn't gotten off as part of $his assignment recently, so $he orgasms despite the sterility of the intercourse.
 		<<else>>
 			$He does not orgasm, serving you properly and showing appropriate disregard for $his own pleasure.
diff --git a/src/uncategorized/RETS.tw b/src/uncategorized/RETS.tw
index 70eeceeefb8d4f3d53447b98898b812c8c33b691..e8eab0b4cc9ba47c6d60c14e8c8e374715061913 100644
--- a/src/uncategorized/RETS.tw
+++ b/src/uncategorized/RETS.tw
@@ -928,7 +928,7 @@ The slaves are about to go to bed; they're naked, and the horny $activeSlave.sla
 <br><br>
 <<run Enunciate($subSlave)>>
 $subSlave.slaveName <<if _lewd>>blushes at the lewd<<else>>smiles at the<</if>> flattery, but after a moment's hesitation _he2 maintains _his2 reluctance.
-<<if $activeSlave.rules.release == "permissive">>
+<<if $activeSlave.rules.release.masturbation == 1>>
 	"Why don't you ju<<s>>t jerk off," _he2 asks dismissively. "<<S>>eriou<<s>>ly, you're allowed to."
 <<else>>
 	"Go find <<s>>omeone el<<s>>e," _he2 <<say>>s dismissively. "<<if _vaginal>>There are plenty of other pu<<ss>>ie<<s>> around for you to play with.<<else>>I'm <<s>>ure you can find <<s>>ome other _girl2 who wouldn't mind late night anal.<</if>>"
@@ -937,7 +937,7 @@ _He2 turns away.
 <br><br>
 <<run Enunciate($activeSlave)>>
 $activeSlave.slaveName is almost in tears.
-<<if $activeSlave.rules.release == "permissive">>
+<<if $activeSlave.rules.release.masturbation == 1>>
 	"I have," $he moans, blue balled. "<<if $activeSlave.aphrodisiacs > 0 || $activeSlave.inflationType == "aphrodisiac">>It'<<s>> the<<s>>e fucking aphrodi<<s>>iac<<s>>. I can't help it. Plea<<s>>e, plea<<s>>e let me try cumming in<<s>>ide you. I won't be able to <<s>>leep.<<else>>It'<<s>> not the <<s>>ame. I need to <<s>>tick my dick in <<s>>omething <<s>>o bad. Plea<<s>>e.<</if>>"
 <<else>>
 	"But I want you," $he moans, blue balled.
diff --git a/src/uncategorized/assistantEvents.tw b/src/uncategorized/assistantEvents.tw
index ef361f7a59abf9b8fded63c997e6820dc75b9969..0ff4bef0ee62c11098fd27c6625804b0d500d354 100644
--- a/src/uncategorized/assistantEvents.tw
+++ b/src/uncategorized/assistantEvents.tw
@@ -24,7 +24,7 @@ One morning, after seeing to an immense pile of business with $assistantName pro
 <<set $assistantOptions = 1>>
 <<set _smartPiercings = 0>>
 <<for $i = 0; $i < $slaves.length; $i++>>
-	<<if ($slaves[$i].rules.release == "permissive") || ($slaves[$i].rules.release == "masturbation")>>
+	<<if ($slaves[$i].rules.release.masturbation == 1)>>
 		<<set $activeSlave = $slaves[$i]>>
 		<<set _smartPiercings = 1>>
 		<<break>>
diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw
index f8479dde9a96ec616ffd7c69d74b851f12e624ef..f2a8c89daa2f541f6f883898fc2f4c8f8b9af2d0 100644
--- a/src/uncategorized/longSlaveDescription.tw
+++ b/src/uncategorized/longSlaveDescription.tw
@@ -253,53 +253,7 @@ is
 		<<else>>
 			$He sleeps in $his own little room,
 		<</if>>
-		<<if $activeSlave.rules.release == "restrictive">>
-			and $he is not allowed to masturbate or proposition
-			<<if ($activeSlave.rules.relationship == "permissive")>>
-				<<if ($activeSlave.relationship == 5)>>
-					slaves other than $his _wife2.
-				<<elseif ($activeSlave.relationship == 4)>>
-					slaves other than $his <<= _girl2>>friend.
-				<<elseif ($activeSlave.relationship == 3)>>
-					slaves other than $his fuckbuddy.
-				<<else>>
-					other slaves; $he must find sexual release in $his duties.
-				<</if>>
-			<<else>>
-				other slaves; $he must find sexual release in $his duties.
-			<</if>>
-		<<elseif $activeSlave.rules.release == "sapphic">>
-			<<if $universalRulesConsent == 1>>
-				and $he is not allowed to masturbate; $he must proposition other slaves to find sexual release,
-				<<if ($activeSlave.devotion > 50) || ($activeSlave.energy > 95)>>
-					which $he is constantly doing.
-				<<elseif ($activeSlave.devotion > 20)>>
-					which $he is often willing to do.
-				<<else>>
-					which $he is rarely willing to do.
-				<</if>>
-			<<else>>
-				and $he is not allowed to masturbate; $he is allowed to demand sex from other slaves,
-				<<if ($activeSlave.devotion > 50) || ($activeSlave.energy > 95)>>
-					an opportunity $he takes shameless advantage of.
-				<<elseif ($activeSlave.devotion > 20)>>
-					which $he is often willing to do.
-				<<else>>
-					which $he is rarely willing to do.
-				<</if>>
-			<</if>>
-		<<elseif $activeSlave.rules.release == "masturbation">>
-			and $he is only allowed to
-			<<if ($activeSlave.energy > 95)>>
-				masturbate, which $he is constantly doing.
-			<<else>>
-				masturbate.
-			<</if>>
-		<<elseif $activeSlave.rules.release == "permissive">>
-			and $he is allowed to masturbate.
-		<<elseif $activeSlave.rules.release == "chastity">>
-			and $he is to remain completely chaste.
-		<</if>>
+		<<= App.Desc.releaseDesc($activeSlave)>>
 	<</if>>
 
 <</if>> /* CLOSES SALE AND EVENT RULES NONDISPLAY */
@@ -2027,7 +1981,7 @@ $He is
 		$He has a large, liver-colored birthmark, detracting from $his beauty.
 	<</if>>
 	<<if ($activeSlave.skin == "sun tanned")>>
-		<<if ($activeSlave.rules.release != "restrictive" && $activeSlave.rules.release != "masturbation" && $activeSlave.rules.release != "chastity")>>
+		<<if (($activeSlave.rules.release.slaves === 1) || App.Utils.hasFamilySex($activeSlave))>>
 			<<if ($activeSlave.fetishStrength > 60) && ($activeSlave.fetishKnown == 1)>>
 				$His tan is slightly uneven, since $he enjoys
 				<<if ($activeSlave.fetish == "buttslut")>>
@@ -2287,18 +2241,18 @@ $He is
 				aphrodisiacs, but is an amputee, so $he cannot touch $himself. $He writhes with extreme sexual frustration, desperately trying to relieve $himself, but only managing to stir up the aphrodisiacs contained in $his gut, strengthening their effects even more.
 			<<elseif ($activeSlave.chastityVagina)>>
 				aphrodisiacs, but is wearing a chastity belt and cannot touch $himself. $He writhes with extreme sexual frustration, desperately trying to relieve $himself, but only managing to stir up the aphrodisiacs contained in $his gut, strengthening their effects even more.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1 && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his shaft with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>> $His frantic masturbation forces $his distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in $his gut and strengthening their effects even more.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.dick != 0)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his shaft and pussy with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>> $His frantic masturbation forces $his distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in $his gut and strengthening their effects even more.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.vagina == -1)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.vagina == -1)>>
 				aphrodisiacs, has<<if $seeDicks > 0>> no penis and<</if>> no vagina, and is not allowed to masturbate, so as $he stands before you $he
 				<<if $activeSlave.anus == 0>>
 					plays with a nipple with one hand while furiously rubbing $his virgin anus and the sensitive perineum beneath it with the other, desperately trying to get $himself off. $His frantic attempts force $his distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in $his gut and strengthening their effects even more.
 				<<else>>
 					uses <<if $activeSlave.anus > 2>>$his entire hand, formed into a beak shape,<<elseif $activeSlave.anus > 1>>two fingers<<else>>a finger<</if>> to fuck $his own ass. $His frantic attempts force $his distended middle to jiggle obscenely, stirring up the aphrodisiacs contained in $his gut and strengthening their effects even more.
 				<</if>>
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation")>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his clit with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.
 			<<elseif ($activeSlave.dick != 0)>>
 				aphrodisiacs and is not allowed to masturbate, so as $he stands before you $he desperately presents $his open mouth, $his breasts, $his crotch, and $his anus in turn, hoping that something will entice you to give $him relief.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>>
@@ -2313,18 +2267,18 @@ $He is
 				aphrodisiacs, but is an amputee, so $he cannot touch $himself. $He writhes with extreme sexual frustration, desperately trying to relieve $himself.
 			<<elseif ($activeSlave.chastityVagina)>>
 				aphrodisiacs, but is wearing a chastity belt and cannot touch $himself. $He writhes with extreme sexual frustration, desperately trying to relieve $himself.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his shaft with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>>
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.dick != 0)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his shaft and pussy with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>>
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.vagina == -1)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.vagina == -1)>>
 				aphrodisiacs, has<<if $seeDicks > 0>> no penis and<</if>> no vagina, and is not allowed to masturbate, so as $he stands before you $he
 				<<if $activeSlave.anus == 0>>
 					plays with a nipple with one hand while furiously rubbing $his virgin anus and the sensitive perineum beneath it with the other, desperately trying to get $himself off.
 				<<else>>
 					uses <<if $activeSlave.anus > 2>>$his entire hand, formed into a beak shape,<<elseif $activeSlave.anus > 1>>two fingers<<else>>a finger<</if>> to fuck $his own ass.
 				<</if>>
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation")>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1)>>
 				aphrodisiacs and is allowed to masturbate, so as $he stands before you $he rubs $his clit with <<if hasBothArms($activeSlave)>>one hand while $he fingers $his anus with the other<<else>>$his hand<</if>>.
 			<<elseif ($activeSlave.dick != 0)>>
 				aphrodisiacs and is not allowed to masturbate, so as $he stands before you $he desperately presents $his open mouth, $his breasts, $his crotch, and $his anus in turn, hoping that something will entice you to give $him relief.<<if canPenetrate($activeSlave)>> $His cock is painfully erect.<</if>>
@@ -2338,11 +2292,11 @@ $He is
 				$He's on aphrodisiacs, but is an amputee, so $he cannot touch $himself. $He writhes with sexual frustration.
 			<<elseif ($activeSlave.chastityVagina)>>
 				$He's on aphrodisiacs, but is wearing a chastity belt and cannot touch $himself. $He writhes with sexual frustration.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.dick != 0) && ($activeSlave.vagina == -1)>>
 				$He's on aphrodisiacs and is allowed to masturbate, so as $he obeys your commands $he idly rubs $his shaft with <<if hasBothArms($activeSlave)>>one hand while the other pinches a nipple<<else>>$his hand<</if>>.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation") && ($activeSlave.dick != 0)>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1) && ($activeSlave.dick != 0)>>
 				$He's on aphrodisiacs and is allowed to masturbate, so as $he obeys your commands $he idly rubs $his shaft and pussy with <<if hasBothArms($activeSlave)>>one hand while the other pinches a nipple<<else>>$his hand<</if>>.
-			<<elseif ($activeSlave.rules.release == "permissive" || $activeSlave.rules.release == "masturbation")>>
+			<<elseif ($activeSlave.rules.release.masturbation == 1)>>
 				$He's on aphrodisiacs and is allowed to masturbate, so as $he obeys your commands $he idly rubs $his pussy with <<if hasBothArms($activeSlave)>>one hand while the other pinches a nipple<<else>>$his hand<</if>>.
 			<<elseif ($activeSlave.dick != 0) && canPenetrate($activeSlave)>>
 				$He's on aphrodisiacs and is not allowed to masturbate, so as $he obeys your commands $he shifts $his weight uncomfortably. $His erect dick sways as $he does.
diff --git a/src/uncategorized/personalAssistantOptions.tw b/src/uncategorized/personalAssistantOptions.tw
index d3d0a9df65997cf6d231479aa30c6aefdce8f3a9..020476d274e77232bd0e108c7dc505c9138d2687 100644
--- a/src/uncategorized/personalAssistantOptions.tw
+++ b/src/uncategorized/personalAssistantOptions.tw
@@ -10,7 +10,7 @@
 Seated at your desk, you glance at the visual representation of $assistantName, down in one corner of your desk's glass top.
 
 <<set $masturbationAllowed = 0>>
-<<set $i = $slaves.findIndex(function(s) { return s.rules.release == "permissive" || s.rules.release == "masturbation"; })>>
+<<set $i = $slaves.findIndex(function(s) { return s.rules.release.masturbation === 1; })>>
 <<if $i != -1>>
 	<<set $masturbationAllowed = 1>>
 <</if>>
diff --git a/src/uncategorized/randomIndividualEvent.tw b/src/uncategorized/randomIndividualEvent.tw
index 80bc6c194dcde041c9fa182c8911fb3f61989091..ba00ec8849a7621e9ca0be6fb914859d7928b71a 100644
--- a/src/uncategorized/randomIndividualEvent.tw
+++ b/src/uncategorized/randomIndividualEvent.tw
@@ -60,7 +60,7 @@
 							<<if $slaves[$i].boobs > 3000>>
 								<<set $REBoobCollisionSubIDs.push($slaves[$i].ID)>>
 							<</if>>
-							<<if $slaves[$i].rules.release != "restrictive" && $slaves[$i].rules.release != "masturbation" && $slaves[$i].rules.release != "chastity">>
+							<<if $slaves[$i].rules.release.slaves === 1>>
 								<<if $slaves[$i].energy > 40>>
 									<<if canDoVaginal($slaves[$i]) || canDoAnal($slaves[$i])>>
 										<<set $REInterslaveBeggingIDs.push($slaves[$i].ID)>>
diff --git a/src/uncategorized/reStandardPunishment.tw b/src/uncategorized/reStandardPunishment.tw
index 55ed23b16134efd2093cf5a2a778d6bfca379545..bc819929f3544d60f5b244377bf3230f8fcd48f1 100644
--- a/src/uncategorized/reStandardPunishment.tw
+++ b/src/uncategorized/reStandardPunishment.tw
@@ -43,7 +43,7 @@
 	<</if>>
 <<else>>
 	<<if $activeSlave.energy > 40>>
-		<<if $activeSlave.rules.release != "restrictive" && $activeSlave.rules.release != "masturbation" && $activeSlave.rules.release != "chastity">>
+		<<if $activeSlave.rules.release.slaves == 1 || App.Utils.hasFamilySex($activeSlave)>>
 			<<set _sins.push("slave molestation")>>
 		<</if>>
 	<</if>>
diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw
index 4ebc7c8ce8ba935712e5ada33a54a1c158297169..c5f9e7258c89e1a6536c10a082d5a2dce4baef45 100644
--- a/src/uncategorized/remoteSurgery.tw
+++ b/src/uncategorized/remoteSurgery.tw
@@ -1873,7 +1873,7 @@
 			<<if _atleastOne>>
 				<<set healthDamage($activeSlave,_atleastOne * 10), cashX(forceNeg($surgeryCost), "slaveSurgery", $activeSlave)>>
 				<<if !hasAnyArms($activeSlave)>>
-					<<set $activeSlave.rules.release = "restrictive">>
+					<<set $activeSlave.rules.release.masturbation = 0>>
 				<</if>>
 				<<set $surgeryType = "amp">>
 				<<goto "Surgery Degradation">>
diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw
index e8de9b282808a234f207759b4ba59094cd00536f..29ef7a347de493c17ecd16aa3ddefd6fc5223fec 100644
--- a/src/uncategorized/saLongTermEffects.tw
+++ b/src/uncategorized/saLongTermEffects.tw
@@ -1233,7 +1233,7 @@
 				<<elseif ($slaves[$i].assignment == "be the Schoolteacher")>>
 					$His paraphilia is satisfied by $his work as the Schoolteacher.
 					<<set _para = 1>>
-				<<elseif canWalk($slaves[$i]) && $slaves[$i].rules.release == "permissive" && $universalRulesConsent == 0>>
+				<<elseif canWalk($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
 					$His paraphilia makes pinning down and raping other slaves very satisfying.
 					<<set _para = 1>>
 				<<else>>
@@ -1264,7 +1264,7 @@
 				<<elseif ($slaves[$i].assignment == "be the Wardeness")>>
 					$His paraphilia is satisfied by $his work as your Wardeness.
 					<<set _para = 1>>
-				<<elseif canWalk($slaves[$i]) && $slaves[$i].rules.release == "permissive" && $universalRulesConsent == 0>>
+				<<elseif canWalk($slaves[$i]) && ($slaves[$i].rules.release.slaves === 1 || App.Utils.hasFamilySex($slaves[$i])) && $universalRulesConsent == 0>>
 					$His paraphilia makes pinning down and brutally raping other slaves very satisfying.
 					<<set _para = 1>>
 				<<else>>
@@ -2680,7 +2680,7 @@
 				<</if>>
 			<</if>>
 
-			<<if ($slaves[$i].rules.release == "permissive") || $slaves[$i].rules.release == "masturbation">>
+			<<if ($slaves[$i].rules.release.masturbation === 1)>>
 				<<if ($slaves[$i].balls > 0)>>
 					<<if $slaves[$i].drugs == "testicle enhancement" || $slaves[$i].drugs == "intensive testicle enhancement" || ($slaves[$i].drugs == "hyper testicle enhancement")>>
 						<<if ($slaves[$i].fetishStrength <= 95)>>
@@ -4442,7 +4442,7 @@
 						<<set _msSlaves = $slaves.filter(function(s) { return s.assignment == "serve in the master suite"; })>>
 						<<set _msSlaves = _msSlaves.shuffle()>>
 						<<for _m = 0; _m < _msSlaves.length; _m++>>
-							<<if canImpreg($slaves[$i], _msSlaves[_m])>>
+							<<if canImpreg($slaves[$i], _msSlaves[_m]) && App.Utils.sexAllowed($slaves[$i], _msSlaves[_m])>>
 								/* catch for self-impregnation */
 								<<if $slaves[$i].ID == _msSlaves[_m].ID>>
 									<<if (_conceptionSeed <= 95)>>
@@ -4480,60 +4480,76 @@
 					<</if>>
 
 				<<default>> /* random impregnation chance on other assignments - consider relationships first */
-					<<if !["chastity", "masturbation"].includes($slaves[$i].rules.release) || $slaves[$i].devotion <= 50>>
+					<<if App.Utils.hasNonassignmentSex($slaves[$i]) || $slaves[$i].devotion <= 50>>
 						<<if (_conceptionSeed > 80) && (($slaves[$i].counter.vaginal > 0) || ($slaves[$i].counter.anal > 0 && $slaves[$i].mpreg > 0))>> /* TODO: compare to previous week totals? */
 							<<if $slaves[$i].relationshipTarget > 0>>
 								<<set _tempLover = getSlave($slaves[$i].relationshipTarget)>>
 								<<if ndef _tempLover>>@@.red;Error, relationshipTarget not found.@@<</if>>
-						<<elseif $slaves[$i].rivalryTarget > 0>>
-							<<set _tempRival = getSlave($slaves[$i].rivalryTarget)>>
-							<<if ndef _tempRival>>@@.red;Error, rivalryTarget not found.@@<</if>>
-						<<elseif $slaves[$i].subTarget > 0>>
-							<<set _tempSub = getSlave($slaves[$i].subTarget)>>
-							<<if ndef _tempSub>>@@.red;Error, subTarget not found.@@<</if>>
-						<</if>>
-						<<if (($slaves[$i].relationship == -3) || ($slaves[$i].relationship == -2)) && canImpreg($slaves[$i], $PC) && !["chastity", "masturbation"].includes($slaves[$i].rules.release)>>
-							<<set $slaves[$i].pregSource = -1>>
-						<<elseif ($slaves[$i].relationship > 2) && canImpreg($slaves[$i], _tempLover)>> /* erection not needed for impregnation via consensual sex play (FWB or better) */
-							<<set $slaves[$i].pregSource = _tempLover.ID>>
-						<<elseif ($slaves[$i].subTarget != 0) && ($slaves[$i].assignment == "be a subordinate slave") && canAchieveErection(_tempSub) && canImpreg($slaves[$i], _tempSub)>> /* subordinate must have erection to impregnate target */
-							<<set $slaves[$i].pregSource = _tempSub.ID>>
-						<<elseif (random(1,100) > 95) && ($slaves[$i].rivalry > 2) && canAchieveErection(_tempRival) && canImpreg($slaves[$i], _tempRival)>> /* 5% chance to be raped and knocked up by bitter rival - erection needed */
-							Driven by the bitter rivalry between them, _tempRival.slaveName successfully manages to overpower $slaves[$i].slaveName and rape $him, cumming deep in $his fertile <<if $slaves[$i].mpreg == 1>>asshole<<else>>pussy<</if>>. By the end of the week, $slaves[$i].slaveName is vowing revenge as $he regains confidence.
-							<<set $slaves[$i].pregSource = _tempRival.ID>>
-						<<elseif (random(1,100) > 60) && canImpreg($slaves[$i], $PC) && !["chastity", "masturbation"].includes($slaves[$i].rules.release)>> /* still 40% chance of impregnation by PC */
-							<<set $slaves[$i].pregSource = -1>>
-						<<elseif (random(1,100) > 95) && ($slaves[$i].eggType == "human") && $slaves[$i].devotion <= 20>> /* 5% chance of impregnation by random citizen - TODO: make this optional for players who want random fathers from among their own slaves only */
-							<<set $slaves[$i].pregSource = -2>>
-						<<else>>
-							/* pick a random starting point in the slave array and iterate (wrapping around) until finding eligible father or coming back to starting point */
-							<<if $slaves.length == 1>>
-								<<if canImpreg($slaves[$i], $slaves[$i]) && _conceptionSeed > 95 && ($slaves[$i].rules.release == "permissive")>>
-									<<set $slaves[$i].pregSource = $slaves[$i].ID>>
+							<<elseif $slaves[$i].rivalryTarget > 0>>
+								<<set _tempRival = getSlave($slaves[$i].rivalryTarget)>>
+								<<if ndef _tempRival>>@@.red;Error, rivalryTarget not found.@@<</if>>
+							<<elseif $slaves[$i].subTarget > 0>>
+								<<set _tempSub = getSlave($slaves[$i].subTarget)>>
+								<<if ndef _tempSub>>@@.red;Error, subTarget not found.@@<</if>>
+							<</if>>
+							<<if (($slaves[$i].relationship == -3) || ($slaves[$i].relationship == -2)) && canImpreg($slaves[$i], $PC) && App.Utils.sexAllowed($slaves[$i], $PC)>>
+								<<set $slaves[$i].pregSource = -1>>
+							<<elseif ($slaves[$i].relationship > 2) && canImpreg($slaves[$i], _tempLover)>> /* erection not needed for impregnation via consensual sex play (FWB or better) */
+								<<if App.Utils.sexAllowed($slaves[$i], _tempLover)>>
+									<<set $slaves[$i].pregSource = _tempLover.ID>>
+								<<elseif disobedience($slaves[$i]) + disobedience(_tempLover) + 5 > random(0, 100)>> /* note higher than normal disobedience chance...telling lovers they can't play is just asking for trouble */
+									Although sexual contact between them is forbidden, $slaves[$i].slaveName and $his <<= relationshipTerm($slaves[$i])>> _tempLover.slaveName took a risk and @@.yellow;flaunted the rules@@.
+									<<set $slaves[$i].trust -= 5, _tempLover.trust -= 5>>
+									<<set $slaves[$i].pregSource = _tempLover.ID>>
+								<</if>>
+							<<elseif ($slaves[$i].subTarget != 0) && ($slaves[$i].assignment == "be a subordinate slave") && canAchieveErection(_tempSub) && canImpreg($slaves[$i], _tempSub)>> /* subordinate must have erection to impregnate target */
+								<<set $slaves[$i].pregSource = _tempSub.ID>>
+							<<elseif (random(1,100) > 95) && ($slaves[$i].rivalry > 2) && canAchieveErection(_tempRival) && canImpreg($slaves[$i], _tempRival)>> /* 5% chance to be raped and knocked up by bitter rival - erection needed */
+								<<if App.Utils.sexAllowed($slaves[$i], _tempRival)>>
+									Driven by the bitter rivalry between them, _tempRival.slaveName successfully manages to overpower $slaves[$i].slaveName and rape $him, cumming deep in $his fertile <<if $slaves[$i].mpreg == 1>>asshole<<else>>pussy<</if>>. By the end of the week, $slaves[$i].slaveName is vowing revenge as $he regains confidence.
+									<<set $slaves[$i].pregSource = _tempRival.ID>>
+								<<elseif disobedience(_tempRival) > random(0,100)>>
+									Driven by the bitter rivalry between them, _tempRival.slaveName @@.yellow;breaks the rules,@@ successfully overpowering $slaves[$i].slaveName and raping $him, cumming deep in $his fertile <<if $slaves[$i].mpreg == 1>>asshole<<else>>pussy<</if>>.
+									<<set $slaves[$i].trust -= 5>>
+									<<set $slaves[$i].pregSource = _tempRival.ID>>
 								<</if>>
-							<<elseif $slaves[$i].rules.release == "permissive" || ($slaves[$i].devotion <= 20 && $slaves[$i].trust > 50) || $universalRulesConsent == 0>>
+							<<elseif (random(1,100) > 60) && canImpreg($slaves[$i], $PC) && App.Utils.sexAllowed($slaves[$i], $PC)>> /* still 40% chance of impregnation by PC */
+								<<set $slaves[$i].pregSource = -1>>
+							<<elseif (random(1,100) > 95) && ($slaves[$i].eggType == "human") && $slaves[$i].devotion <= 20>> /* 5% chance of impregnation by random citizen - TODO: make this optional for players who want random fathers from among their own slaves only */
+								<<set $slaves[$i].pregSource = -2>>
+							<<else>>
+								/* pick a random starting point in the slave array and iterate (wrapping around) until finding eligible father or coming back to starting point */
 								<<set _sourceSeed = random(0,$slaves.length-1)>><<set _tried = 0>>
+								<<set _disobedienceSeed = disobedience($slaves[$i])>>
 								<<for _m = _sourceSeed + 1; _m != _sourceSeed; _m++>>
 									<<if _m == $slaves.length>><<set _m = 0, _tried = 1>><</if>> /* wrap around */
 									<<if _m == _sourceSeed+1 && _tried == 1>><<break>><</if>> /* give up after a full loop */
 									<<if canImpreg($slaves[$i], $slaves[_m])>>
 										/* self-impregnation check */
-										<<if ($slaves[_m].ID == $slaves[$i].ID) && (_conceptionSeed <= 95)>>
-											<<continue>> /* 95% chance not to self-impregnate */
+										<<if ($slaves[_m].ID == $slaves[$i].ID)>>
+											<<if (_conceptionSeed <= 95)>>
+												<<continue>> /* 95% chance not to self-impregnate */
+											<<else>>
+												<<set $slaves[$i].pregSource = $slaves[$i].ID>>
+											<</if>>
+										<<elseif App.Utils.sexAllowed($slaves[$i], $slaves[_m])>>
+											<<set $slaves[$i].pregSource = $slaves[_m].ID>> /* this is an eligible father */
+										<<elseif (_disobedienceSeed > random(0, 100) && ($universalRulesConsent == 0 || disobedience($slaves[_m]) > random(0, 50)))>>
+											Although sexual contact between them is forbidden, $slaves[$i].slaveName @@.yellow;breaks the rules@@ by <<if $universalRulesConsent == 0>>compelling<<else>>convincing<</if>> $slaves[_m] to fuck $him.
+											<<set $slaves[$i].trust -= 5>>
+											<<set $slaves[$i].pregSource = $slaves[_m].ID>>
 										<</if>>
-										<<set $slaves[$i].pregSource = $slaves[_m].ID>> /* passed the checks above, so this is an eligible father */
 										<<break>>
 									<</if>>
 								<</for>>
 							<</if>>
 						<</if>>
-					<</if>>
-					<<if $slaves[$i].pregSource != 0 && $slaves[$i].eggType == "human">>
-						A quick scan after a bout of morning nausea reveals that @@.lime;$he has become pregnant.@@
-						<<set $slaves[$i].preg = 1, $slaves[$i].pregWeek = 1, $slaves[$i].pregKnown = 1>><<set $slaves[$i].pregType = setPregType($slaves[$i])>>
-						<<set WombImpregnate($slaves[$i], $slaves[$i].pregType, $slaves[$i].pregSource, 1)>>
-					<</if>>
-				<</if>> /* closes random chance and non-zero sex acts check */
+						<<if $slaves[$i].pregSource != 0 && $slaves[$i].eggType == "human">>
+							A quick scan after a bout of morning nausea reveals that @@.lime;$he has become pregnant.@@
+							<<set $slaves[$i].preg = 1, $slaves[$i].pregWeek = 1, $slaves[$i].pregKnown = 1>><<set $slaves[$i].pregType = setPregType($slaves[$i])>>
+							<<set WombImpregnate($slaves[$i], $slaves[$i].pregType, $slaves[$i].pregSource, 1)>>
+						<</if>>
+					<</if>> /* closes random chance and non-zero sex acts check */
 			<</switch>> /* closes assignment checks */
 		<</if>> /* closes all impregnation checks */
 
diff --git a/src/uncategorized/saRelationships.tw b/src/uncategorized/saRelationships.tw
index e7927f4a01006d16d254233f4685c150d321ff54..e3cde2f2e00f16d2e5af184f00b52d6ca38f1149 100644
--- a/src/uncategorized/saRelationships.tw
+++ b/src/uncategorized/saRelationships.tw
@@ -200,7 +200,7 @@
 						<</if>>
 					<</if>>
 				<<elseif mutualChildren(_SlaveI, _SlaveJ, $slaves) > 0>>
-					<<if (_SlaveI.rules.release != "restrictive") && _SlaveI.rules.release != "masturbation" && _SlaveI.rules.release != "chastity">>
+					<<if App.Utils.sexAllowed(_SlaveI, _SlaveJ)>>
 						<<if _SlaveJ.rules.relationship == "permissive">>
 							_SlaveI.slaveName and _SlaveJ.slaveName have <<if mutualChildren(_SlaveI, _SlaveJ, $slaves) == 0>>a child<<else>>children<</if>> living in your penthouse, so it's not surprising that their offspring brings them together. They have @@.lightgreen;become friends@@ for their child's sake.
 							<<set _SlaveJ.relationship = 1, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 1, _SlaveI.relationshipTarget = _SlaveJ.ID>>
@@ -211,7 +211,7 @@
 						<</if>>
 					<</if>>
 				<<elseif _SlaveJ.fetish == _SlaveI.fetish>>
-					<<if (_SlaveI.fetish != "none") && (_SlaveI.rules.release != "restrictive") && _SlaveI.rules.release != "masturbation" && _SlaveI.rules.release != "chastity">>
+					<<if (_SlaveI.fetish != "none") && App.Utils.sexAllowed(_SlaveI, _SlaveJ)>>
 						<<if _SlaveJ.rules.relationship == "permissive">>
 							_SlaveI.slaveName and _SlaveJ.slaveName share sexual inclinations, so it's only natural that they @@.lightgreen;become friends with benefits.@@
 							<<set _SlaveJ.relationship = 3, _SlaveJ.relationshipTarget = _SlaveI.ID, _SlaveI.relationship = 3, _SlaveI.relationshipTarget = _SlaveJ.ID>>
@@ -985,7 +985,7 @@
 						<<set _SlaveI.relationship = -2>>
 					<</if>>
 					<<set _SlaveJ.relationship = 0, _SlaveJ.relationshipTarget = 0, _SlaveI.relationshipTarget = 0>>
-				<<elseif $familyTesting == 1 && ( _SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > 80)>>
+				<<elseif $familyTesting == 1 && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > 80)>>
 					They build on their family relationship and become @@.lightgreen;best friends.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > 80)>>
@@ -1033,19 +1033,19 @@
 				<<elseif mutualChildren(_SlaveI, _SlaveJ, $slaves) > 0 && (random(1, 100) < (50+(10*mutualChildren(_SlaveI, _SlaveJ, $slaves))+_seed))>>
 					Having already had kids together, their relationship turns sexual once again and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif $familyTesting == 1 && (_SlaveI.energy > 95) && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (90-_seed))>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.energy > 95) && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (90-_seed))>>
 					Driven by nymphomania to attempt to have sex with everyone, _SlaveI.slaveName successfully seduces _SlaveJ.slaveName and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif (_SlaveI.energy > 95) && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (90 - _seed))>>
+				<<elseif $seeIncest == 1 && (_SlaveI.energy > 95) && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (90 - _seed))>>
 					Driven by nymphomania to attempt to have sex with everyone, _SlaveI.slaveName successfully seduces _SlaveJ.slaveName and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.sexualQuirk == "perverted") && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (80-_seed))>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.sexualQuirk == "perverted") && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (80-_seed))>>
 					Reveling in the taboo nature of $his attraction to _SlaveJ.slaveName, _SlaveI.slaveName successfully seduces _him2 and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif $seeIncest == 1 && (_SlaveI.sexualQuirk == "perverted") && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (80 - _seed))>>
 					Reveling in the taboo nature of $his attraction to _SlaveJ.slaveName, _SlaveI.slaveName successfully seduces _him2 and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.behavioralQuirk == "sinful") && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (80-_seed))>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.behavioralQuirk == "sinful") && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (80-_seed))>>
 					Aroused by the chance to commit the sin of incest, _SlaveI.slaveName successfully seduces _SlaveJ.slaveName and they become @@.lightgreen;friends with benefits.@@
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif $seeIncest == 1 && (_SlaveI.behavioralQuirk == "sinful") && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (80 - _seed))>>
@@ -1064,7 +1064,7 @@
 						_SlaveI.slaveName successfully seduces _SlaveJ.slaveName and they become @@.lightgreen;friends with benefits.@@
 						<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 					<</if>>
-				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0)>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && areRelated(_SlaveI, _SlaveJ)>>
 					<<if random(1,100) > (95-_seed)>>
 						Eventually, they happen to be together and horny, and find themselves fucking without thinking. They have become incestuous @@.lightgreen;friends with benefits.@@
 						<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
@@ -1091,19 +1091,19 @@
 					$His romantic bent drives $him to do $his best to advance $his relationship to an emotional level.
 					<<set _seed = 10>>
 				<</if>>
-				<<if $seeIncest == 1 && $familyTesting == 1 && _SlaveI.energy > 95 && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (90-_seed))>>
+				<<if $seeIncest == 1 && $familyTesting == 1 && _SlaveI.energy > 95 && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (90-_seed))>>
 					$He's such a desperate nympho that constant incest is nothing to $him. $He develops real feelings for _SlaveJ.slaveName as a romantic partner. Their relationship becomes @@.lightgreen;romantically emotional@@ as well as physical and familial.
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif $seeIncest == 1 && (_SlaveI.energy > 95) && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (90 - _seed))>>
 					$He's such a desperate nympho that constant incest is nothing to $him. $He develops real feelings for _SlaveJ.slaveName as a romantic partner. Their relationship becomes @@.lightgreen;romantically emotional@@ as well as physical and familial.
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.sexualQuirk == "perverted") && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (80-_seed))>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.sexualQuirk == "perverted") && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (80-_seed))>>
 					Reveling in the taboo nature of $his sexual relationship with _SlaveJ.slaveName, $he not only enjoys _SlaveJ.slaveName's body, but looks after _his2 pleasure, too. Their relationship becomes @@.lightgreen;romantically emotional@@ as well as physical and familial.
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif $seeIncest == 1 && (_SlaveI.sexualQuirk == "perverted") && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (80 - _seed))>>
 					Reveling in the taboo nature of $his sexual relationship with _SlaveJ.slaveName, $he not only enjoys _SlaveJ.slaveName's body, but looks after _his2 pleasure, too. Their relationship becomes @@.lightgreen;romantically emotional@@ as well as physical and familial.
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
-				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.behavioralQuirk == "sinful") && (_SlaveI.mother == _SlaveJ.ID || _SlaveI.father == _SlaveJ.ID || _SlaveJ.mother == _SlaveI.ID || _SlaveJ.father == _SlaveI.ID || areSisters(_SlaveI, _SlaveJ) > 0) && (random(1,100) > (80-_seed))>>
+				<<elseif $seeIncest == 1 && $familyTesting == 1 && (_SlaveI.behavioralQuirk == "sinful") && areRelated(_SlaveI, _SlaveJ) && (random(1,100) > (80-_seed))>>
 					$He gets deep, perverse satisfaction by constant commission of the sin of incest, which is extreme enough to appease even $his appetite for transgression. $His incestuous relationship becomes @@.lightgreen;romantically emotional@@ as well as physical and familial.
 					<<set _SlaveI.relationship++, _SlaveJ.relationship = _SlaveI.relationship>>
 				<<elseif $seeIncest == 1 && (_SlaveI.behavioralQuirk == "sinful") && (_SlaveI.relation != 0) && (_SlaveI.relationTarget == _SlaveI.relationshipTarget) && (random(1, 100) > (80 - _seed))>>
@@ -1193,23 +1193,8 @@
 				<<set _sr = getSlave(_SlaveI.relationshipTarget)>>
 				<<if def _sr>>
 					<<setLocalPronouns _sr 2>>
-					<<if (_SlaveI.mother == _sr.ID || _SlaveI.father == _sr.ID || _sr.mother == _SlaveI.ID || _sr.father == _SlaveI.ID || areSisters(_SlaveI, _sr) > 0)>>
-						<<if _sr.mother == _SlaveI.ID || _sr.father == _SlaveI.ID>>
-							<<set $relationType = _daughter2>>
-						<<elseif _SlaveI.mother == _sr.ID>>
-							<<set $relationType = "mother">>
-						<<elseif _SlaveI.father == _sr.ID>>
-							<<set $relationType = "father">>
-						<<else>>
-							<<switch areSisters(_SlaveI, _sr)>>
-							<<case 1>>
-								<<set $relationType = "twin">>
-							<<case 2>>
-								<<set $relationType = _sister2>>
-							<<case 3>>
-								<<set $relationType = "half-<<= _sister2>>">>
-							<</switch>>
-						<</if>>
+					<<if areRelated(_SlaveI, _sr)>>
+						<<set $relationType = relativeTerm(_SlaveI, _sr)>>
 						<<set $relation = _sr>>
 					<</if>>
 				<</if>>
@@ -1369,7 +1354,7 @@
 			<</if>>
 		<</if>> /* closes extended family mode */
 
-		<<if _SlaveI.rules.release != "restrictive" && _SlaveI.rules.release != "masturbation" && _SlaveI.rules.release != "chastity">>
+		<<if App.Utils.sexAllowed(_SlaveI, _SlaveJ)>>
 			<<if (_SlaveI.sexualQuirk == "size queen") && (canPenetrate(_SlaveJ))>>
 			<<if _SlaveJ.dick > 5>>
 				$He's @@.hotpink;very happy@@ with $his romantic status, since it means $he regularly gets monster cock.
@@ -1457,6 +1442,21 @@
 					<<set _SlaveI.fetish = "pregnancy", _SlaveI.fetishKnown = 1, _SlaveI.fetishStrength = 65>>
 				<</switch>>
 			<</if>>
+		<<else>>
+			/* lovers not allowed to have sex...that's just mean */
+			$He's @@.mediumorchid;frustrated@@ because $he's not allowed to fuck _SlaveJ.slaveName
+			<<set _SlaveI.devotion-->>
+			<<if disobedience(_SlaveI) + 5 > random(0,100)>>
+				and defies your rules, for which $he is @@.yellow;severely punished.@@
+				<<set _SlaveI.trust -= 3>>
+			<<else>>
+				but @@.aquamarine;trusts@@ that you know best.
+				<<set _SlaveI.trust++>>
+			<</if>>
+			<<if _SlaveI.relationship < 5 && (jsRandom(0, 100) > 90)>>
+				Having been chaste for some time, _SlaveI.slaveName and _SlaveJ.slaveName find themselves less passionate about each other, and have gone back to being just @@.lightgreen;friends.@@  They both @@.mediumorchid;regret@@ the loss of intimacy.
+				<<set _SlaveI.relationship = 1, _SlaveJ.relationship = 1, _SlaveI.devotion--, _SlaveJ.devotion-->>
+			<</if>>
 		<</if>>
 
 		<<if (_SlaveJ.actualAge - _SlaveI.actualAge > 10) && (_SlaveI.relationship >= 4) && (random(1,300) > (_SlaveI.intelligence) + (_SlaveJ.intelligence)) && (_SlaveJ.devotion > 75) && (_SlaveJ.trust > 50) && (_SlaveJ.intelligence+_SlaveJ.intelligenceImplant > 15) && (_SlaveJ.intelligenceImplant >= 15) && ((_SlaveI.devotion > 20) || ((_SlaveI.devotion >= -20) && (_SlaveI.trust < -20)) || (_SlaveI.trust > -10))>>
diff --git a/src/uncategorized/saRivalries.tw b/src/uncategorized/saRivalries.tw
index 4fcf79a5bf85a486a8e1ee04256997440f867d39..223f4e856ad06d7c425503105d4ce6e1340ac9f4 100644
--- a/src/uncategorized/saRivalries.tw
+++ b/src/uncategorized/saRivalries.tw
@@ -158,23 +158,21 @@
 	<<else>>
 		<<if $slaves[$i].need>>
 			<<if $universalRulesConsent == 0>>
-				<<if $slaves[$i].rules.release != "restrictive" && $slaves[$i].rules.release != "masturbation" && $slaves[$i].rules.release != "chastity">>
-					<<if $slaves[_j].rules.release != "restrictive">>
-						<<if $slaves[$i].fetishKnown>>
-							<<if $slaves[$i].fetish == "sadist">>
-								$slaves[$i].slaveName is horny and sadistic, so $he rapes $his rival <<= SlaveFullName($slaves[_j])>> every chance $he gets; this @@.hotpink;thrills@@ $slaves[$i].slaveName, but $slaves[_j].slaveName is @@.golden;frightened@@ that you let it happen.
-								<<set $slaves[$i].need = 0, $slaves[$i].devotion += 3, $slaves[_j].trust -= 3, $slaves[$i].counter.penetrative += 5, $slaves[_j].counter.oral += 5>>
-								<<if $slaves[$i].rivalry < 3>>
-									Of course, this @@.lightsalmon;worsens their rivalry.@@
-									<<set $slaves[_j].rivalry += 1, $slaves[$i].rivalry += 1, _worsenedRivalry = 1>>
-								<</if>>
-							<<elseif $slaves[$i].fetish == "dom">>
-								$slaves[$i].slaveName is horny and dominant, so $he forces $his rival <<= SlaveFullName($slaves[_j])>> to submit to $him whenever $he can; this @@.hotpink;thoroughly satisfies@@ $slaves[$i].slaveName, but $slaves[_j].slaveName is @@.golden;angered@@ that you let it happen.
-								<<set $slaves[$i].need = 0, $slaves[$i].devotion += 3, $slaves[_j].devotion -= 3, $slaves[$i].counter.penetrative += 5, $slaves[_j].counter.oral += 5>>
-								<<if $slaves[$i].rivalry < 3>>
-									Of course, this @@.lightsalmon;worsens their rivalry.@@
-									<<set $slaves[_j].rivalry += 1, $slaves[$i].rivalry += 1, _worsenedRivalry = 1>>
-								<</if>>
+				<<if App.Utils.sexAllowed($slaves[$i], $slaves[_j])>>
+					<<if $slaves[$i].fetishKnown>>
+						<<if $slaves[$i].fetish == "sadist">>
+							$slaves[$i].slaveName is horny and sadistic, so $he rapes $his rival <<= SlaveFullName($slaves[_j])>> every chance $he gets; this @@.hotpink;thrills@@ $slaves[$i].slaveName, but $slaves[_j].slaveName is @@.golden;frightened@@ that you let it happen.
+							<<set $slaves[$i].need = 0, $slaves[$i].devotion += 3, $slaves[_j].trust -= 3, $slaves[$i].counter.penetrative += 5, $slaves[_j].counter.oral += 5>>
+							<<if $slaves[$i].rivalry < 3>>
+								Of course, this @@.lightsalmon;worsens their rivalry.@@
+								<<set $slaves[_j].rivalry += 1, $slaves[$i].rivalry += 1, _worsenedRivalry = 1>>
+							<</if>>
+						<<elseif $slaves[$i].fetish == "dom">>
+							$slaves[$i].slaveName is horny and dominant, so $he forces $his rival <<= SlaveFullName($slaves[_j])>> to submit to $him whenever $he can; this @@.hotpink;thoroughly satisfies@@ $slaves[$i].slaveName, but $slaves[_j].slaveName is @@.mediumorchid;angered@@ that you let it happen.
+							<<set $slaves[$i].need = 0, $slaves[$i].devotion += 3, $slaves[_j].devotion -= 3, $slaves[$i].counter.penetrative += 5, $slaves[_j].counter.oral += 5>>
+							<<if $slaves[$i].rivalry < 3>>
+								Of course, this @@.lightsalmon;worsens their rivalry.@@
+								<<set $slaves[_j].rivalry += 1, $slaves[$i].rivalry += 1, _worsenedRivalry = 1>>
 							<</if>>
 						<</if>>
 					<</if>>
diff --git a/src/uncategorized/saRules.tw b/src/uncategorized/saRules.tw
index 9844d27dbae89aa823d8a6abd54ad2a5a4c1ba47..b1586cb4733706731e3d7d580b41dbdcdec20ff9 100644
--- a/src/uncategorized/saRules.tw
+++ b/src/uncategorized/saRules.tw
@@ -2,8 +2,6 @@
 
 <<set _release = $slaves[$i].rules.release>>
 
-/* TODO: may need updating to detail effects of chastity */
-
 <<if $slaves[$i].fuckdoll == 0>>
 	$He
 	<<if $slaves[$i].fetish == "mindbroken">>
@@ -25,14 +23,14 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
-				<<else>>
+				<<elseif App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
 					gets off at work, so being unable to touch $himself doesn't bother $him.
-					<<set $slaves[$i].need -= 20>>
+				<<else>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
 				wasn't a popular enough hole to sate $his arousal, leaving $him @@.gold;uncomfortably horny@@ despite $his conditions.
 				<<set $slaves[$i].trust -= 3>>
@@ -47,31 +45,43 @@
 		<<case "be the Madam">>
 			<<set $slaves[$i].need -= ($BrothiIDs.length*10)>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
+				<<if App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if (_release.master === 1)>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -79,14 +89,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release must be coming from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -99,7 +114,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $BrothiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his care.
@@ -183,7 +198,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -215,35 +230,40 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden to masturbate doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
+				<<elseif App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need to masturbate frequently.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to the penthouse to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to the penthouse to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly comes up to the penthouse and begs you to
-						<<saRulesPlayerFetishPlay>>
-						every break $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master == 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to the penthouse to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to the penthouse to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly comes up to the penthouse and begs you to
+							<<saRulesPlayerFetishPlay>>
+							every break $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> //* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if $slaves[$i].sexualFlaw == "attention whore">>
 						@@.hotpink;enjoys being allowed to masturbate,@@ especially since it's often to the pleasure of an aroused client.
 						<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
@@ -260,8 +280,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -269,22 +295,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is forced to take additional clients @@.gold;as punishment@@ for illicit masturbation.
+								refuses to use _whom to get off, and is forced to take additional clients @@.gold;as punishment@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to either demand sex from other slaves or attempt to attract additional clients. $He @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to either demand sex from _whom or attempt to attract additional clients. $He @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -300,28 +332,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to either swap sex with other slaves or attempt to attract additional clients. $He @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to either swap sex with _whom or attempt to attract additional clients. $He @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -394,7 +426,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $BrothiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -495,7 +527,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -540,31 +572,43 @@
 			<</if>>
 		<<case "be the DJ">>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
+				<<if App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -572,14 +616,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -592,7 +641,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $ClubiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful, tantalizing, outlets for $his nymphomania under $his care.
@@ -684,7 +733,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -716,35 +765,40 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden to masturbate doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
+				<<elseif App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need to masturbate frequently.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to the penthouse to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to the penthouse to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly comes up to the penthouse and begs you to
-						<<saRulesPlayerFetishPlay>>
-						every break $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come up to the penthouse for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to the penthouse to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to the penthouse to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly comes up to the penthouse and begs you to
+							<<saRulesPlayerFetishPlay>>
+							every break $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if $slaves[$i].sexualFlaw == "attention whore">>
 						@@.hotpink;enjoys being allowed to masturbate,@@ especially since it's often on stage for $clubName's amusement.
 						<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
@@ -761,8 +815,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -770,22 +830,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is forced to spend time with the citizens and their wandering hands @@.gold;as punishment@@ for illicit masturbation.
+								refuses to use _whom to get off, and is forced to spend time with the citizens and their wandering hands @@.gold;as punishment@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to either demand sex from other slaves or offering $himself to patrons. $He @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to either demand sex from _whom or offering $himself to patrons. $He @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -801,28 +867,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex or offering $himself to patrons, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex or offering $himself to patrons, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom or offering $himself up, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to either swap sex with other slaves or attempt to seduce amorous citizens. $He @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to either swap sex with _whom or attempt to seduce amorous citizens. $He @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -867,7 +933,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $ClubiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -968,7 +1034,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing, often on stage during a dance,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -1014,31 +1080,43 @@
 		<<case "be the Nurse">>
 			<<set $slaves[$i].need -= ($CliniciIDs.length*3)>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
+				<<if App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -1046,14 +1124,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -1066,7 +1149,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $slaves.length > 5>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;happily avails@@ $himself to any slaves visiting the patients under $his care.
@@ -1174,11 +1257,14 @@
 			<<else>>
 				<<set _lover = 0>>
 			<</if>>
+			<<if _lover == 0 && $seeIncest == 1 && $familyTesting == 1>>
+				<<set _famVisitor = randomRelatedSlave($slaves[$i], (s) => { return canWalk(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 (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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 (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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.
@@ -1199,6 +1285,10 @@
 				<<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 $Nurse != 0>>
 				is routinely brought to orgasm by $Nurse.slaveName as part of $his duties.
 				<<if canPenetrate($slaves[$i]) && $Nurse.boobs >= 500>>
@@ -1208,7 +1298,7 @@
 					/* possible cumflation code here */
 				<</if>>
 				<<set $slaves[$i].need -= 60>>
-			<<elseif (_release == "masturbation") || (_release == "permissive")>>
+			<<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>>
@@ -1311,7 +1401,7 @@
 					<<else>>
 						Under the rules, $he will find $himself constantly molested by other slaves once $he leaves $clinicName, but $he's already in such constant terror it that it doesn't cross $his mind.
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;eagerly takes the opportunity@@ whenever visiting slaves are present.
 						<<set $slaves[$i].devotion += 1>>
@@ -1393,7 +1483,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -1434,32 +1524,59 @@
 		<<case "be the Wardeness">>
 			<<set $slaves[$i].need -= ($CellBiIDs.length*5)>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
 				gets off at work, so $he doesn't feel the need for release that often.
 				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
-					opts to @@.mediumaquamarine;take advantage of the prisoners@@ to
-					<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
-					<<saRulesRapeFetish>>
-					<<saRulesRapeDiscoversFetish>>
-					<<saRulesPermissiveDrugEffects>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
+					<<if ($slaves[$i].devotion < 80)>>
+						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, especially with her prisoners available to her, but @@.mediumaquamarine;trusts you know what's best for $him.@@
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
+					<<else>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
+					<</if>>
+					<<if $slaves[$i].devotion > 20>>
+						When $he does play with $himself, $he
+						<<saRulesMasturbationFetishPlay>>
+						<<saRulesMasturbationDiscoversFetish>>
+					<</if>>
+					<<saRulesMasturbationDrugEffects>>
 				<<else>>
-					happily @@.mediumaquamarine;avails $himself of the prisoners@@ to
-					<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
-					<<saRulesRapeFetish>>
-					<<saRulesRapeDiscoversFetish>>
-					<<saRulesPermissiveDrugEffects>>
-				<</if>> /* closes releaseRules not restrictive */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>,@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<else>>
+						/* wardeness is not bound by Universal Consent */
+						opts to @@.mediumaquamarine;take advantage of the prisoners@@ to
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
+						<<saRulesRapeFetish>>
+						<<saRulesRapeDiscoversFetish>>
+						<<saRulesPermissiveDrugEffects>>
+					<</if>>
+				<</if>>
 			<</if>>
 
 			$He is @@.hotpink;very happy@@ with $his private room in $cellblockName and @@.mediumaquamarine;trusts@@ you a bit more for placing $him in charge of it.
@@ -1521,7 +1638,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -1691,31 +1808,43 @@
 		<<case "be the Attendant">>
 			<<set $slaves[$i].need -= ($SpaiIDs.length*3)>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off while relieving $his charges, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
+				<<if App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off while relieving $his charges, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						is a little disappointed that $he's limited to $his <<if !hasAnyArms($slaves[$i])>>imagination<<else>>hand<<if hasBothArms($slaves[$i])>>s<</if>><</if>>, creams, and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -1723,14 +1852,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -1743,7 +1877,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $SpaiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for all the warm, moist bodies lounging around $spaName.
@@ -1822,7 +1956,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -1864,26 +1998,31 @@
 				<</if>>
 				<<set $slaves[$i].need -= 60>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come up to the penthouse for sexual release, or to beg to share a bath with you, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to the penthouse to beg for sexual release or for you to join $him in $spaName.
-						<<else>>
-							doesn't mind having to come to the penthouse to beg for sexual release or for you to join $him in $spaName.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly comes up to the penthouse and begs you to
-						<<saRulesPlayerFetishPlay>>
-						whenever the urge strikes.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come up to the penthouse for sexual release, or to beg to share a bath with you, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to the penthouse to beg for sexual release or for you to join $him in $spaName.
+							<<else>>
+								doesn't mind having to come to the penthouse to beg for sexual release or for you to join $him in $spaName.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly comes up to the penthouse and begs you to
+							<<saRulesPlayerFetishPlay>>
+							whenever the urge strikes.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -1897,8 +2036,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -1906,22 +2051,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to demand sex from other slaves, and @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to demand sex from _whom, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -1937,28 +2088,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to swap sex with other slaves, and @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to swap sex with _whom, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -2054,7 +2205,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $SpaiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -2150,7 +2301,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -2196,31 +2347,41 @@
 		<<case "be the Matron">>
 			<<set $slaves[$i].need -= ($NurseryiIDs.length*3)>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<if (_release.masturbation === 0)>>
 					gets off while relieving $his charges, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
 				<<else>>
 					gets off while relieving $his charges, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						is a little disappointed that $he's limited to $his <<if !hasAnyArms($slaves[$i])>>imagination<<else>>hand<<if hasBothArms($slaves[$i])>>s<</if>><</if>>, creams, and toys, but @@.mediumaquamarine;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -2228,14 +2389,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -2248,7 +2414,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $NurseryiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for all the nannies busily scurrying around $nurseryName.
@@ -2327,7 +2493,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -2369,26 +2535,31 @@
 				<</if>>
 				<<set $slaves[$i].need -= 60>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come up to the penthouse for sexual release and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to the penthouse to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to the penthouse to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly comes up to the penthouse and begs you to
-						<<saRulesPlayerFetishPlay>>
-						whenever the urge strikes.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come up to the penthouse for sexual release and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to the penthouse to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to the penthouse to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly comes up to the penthouse and begs you to
+							<<saRulesPlayerFetishPlay>>
+							whenever the urge strikes.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -2402,8 +2573,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -2411,22 +2588,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to demand sex from other slaves, and @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to demand sex from _whom, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -2442,28 +2625,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex or giving free samples, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced by the urges induced by the food to swap sex with other slaves, and @@.hotpink;hates $himself@@ for it.
+								is forced by the urges induced by the food to swap sex with _whom, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -2559,7 +2742,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $NurseryiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -2660,7 +2843,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -2717,31 +2900,41 @@
 			<</if>>
 			<<set $slaves[$i].counter.oral += _sexLessons, $oralTotal += _sexLessons>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<if (_release.masturbation == 0)>>
 					gets off with $his students, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
 				<<else>>
 					gets off with $his students, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					in front of $his class whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						in front of $his class whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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 outside of class, but @@.mediumaquamarine;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you won't make an example out of $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you won't make an example out of $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -2749,14 +2942,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;takes advantage@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -2769,7 +2967,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $SchlRiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for giving $him plentiful teacher's assistants for $his nymphomania.
@@ -2853,7 +3051,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -2918,35 +3116,40 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off during class, so being forbidden to masturbate doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
+				<<elseif App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off during class as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off during class, so being unable to touch $himself doesn't bother $him.
 				<<else>>
 					gets off during class, so $he doesn't feel the need to masturbate frequently.
-					<<set $slaves[$i].need -= 20>>
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to you to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to you to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly begs you to
-						<<saRulesPlayerFetishPlay>>
-						every chance $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to you to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to you to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly begs you to
+							<<saRulesPlayerFetishPlay>>
+							every chance $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -2960,8 +3163,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -2969,22 +3178,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to use _whom to get off, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to demand sex from other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to demand sex from _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -3000,28 +3215,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to swap sex with other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to swap sex with _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -3067,7 +3282,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $SchlRiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -3168,7 +3383,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -3214,10 +3429,10 @@
 		<<case "be the Stewardess">>
 			<<set $slaves[$i].need -= $ServQiIDs.length*10>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<if _release.masturbation === 0>>
 					gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him.
 					<<set $slaves[$i].need -= 20>>
 				<<else>>
@@ -3225,20 +3440,31 @@
 					<<set $slaves[$i].need -= 20>>
 				<</if>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever $he crosses paths with you.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (_!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever $he crosses paths with you.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -3246,14 +3472,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -3266,7 +3497,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $ServQiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge.
@@ -3350,7 +3581,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -3383,35 +3614,40 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
-					gets off at work, so being forbidden to masturbate doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
+				<<elseif App.Utils.hasNonassignmentSex($slaves[$i])>>
+					gets off at work as well as during $his rest time.
+				<<elseif _release.masturbation == 0>>
+					gets off at work, so being unable to touch $himself doesn't bother $him.
 				<<else>>
-					gets off at work, so $he doesn't feel the need to masturbate frequently.
-					<<set $slaves[$i].need -= 20>>
+					gets off at work, so being unable to sate $his urges doesn't affect $him seriously.
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to offer $himself to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally stops by your office to offer $himself to you.
-						<<else>>
-							doesn't mind stopping by your office to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly stops by your office and begs you to
-						<<saRulesPlayerFetishPlay>>
-						every break $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to offer $himself to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally stops by your office to offer $himself to you.
+							<<else>>
+								doesn't mind stopping by your office to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly stops by your office and begs you to
+							<<saRulesPlayerFetishPlay>>
+							every break $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -3425,8 +3661,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -3434,22 +3676,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to use _whom to get off, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to demand sex from other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to demand sex from _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -3465,28 +3713,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to swap sex with other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to swap sex with _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -3588,7 +3836,7 @@
 							Under the rules and $his job, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					Under the rules, $he's allowed to demand that other slaves to get $him off, but only when $he's finished $his shift. $He still @@.hotpink;adores@@ having the option.
 					<<set $slaves[$i].devotion += 1>>
 				<</if>>
@@ -3667,7 +3915,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -3713,31 +3961,41 @@
 		<<case "be the Milkmaid">>
 			<<set $slaves[$i].need -= $DairyiIDs.length*5>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<if (_release.masturbation === 0)>>
 					gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him.
-					<<set $slaves[$i].need -= 20>>
 				<<else>>
 					gets off while performing $his duties, so $he doesn't feel the need for release that often.
-					<<set $slaves[$i].need -= 20>>
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever you inspect $dairyName.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever you inspect $dairyName.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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 when off duty, but @@.mediumaquamarine;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -3745,14 +4003,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -3765,7 +4028,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $DairyiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge.
@@ -3844,7 +4107,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -3880,10 +4143,10 @@
 				<</if>>
 			<<else>>
 				<<if $slaves[$i].devotion < -50>>
-					is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+					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 (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+					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].need < $slaves[$i].needCap*0.5>>
 					<<if ($slaves[$i].devotion <= 20)>>
@@ -3894,7 +4157,7 @@
 							<<set $slaves[$i].trust -= 1>>
 						<</if>>
 						<<set $slaves[$i].need -= 20>>
-					<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+					<<elseif (_release.masturbation === 0)>>
 						gets off from being milked, so being forbidden to masturbate doesn't affect $him seriously.
 						<<set $slaves[$i].need -= 20>>
 					<<else>>
@@ -3902,26 +4165,31 @@
 						<<set $slaves[$i].need -= 20>>
 					<</if>>
 				<<else>>
-					<<if (_release == "restrictive" || _release == "chastity")>>
-						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-							<<set $slaves[$i].trust -= 2>>
-						<<elseif ($slaves[$i].devotion <= 50)>>
-							<<if $slaves[$i].devotion <= 20>>
-								occasionally comes to you to beg for sexual release.
-							<<else>>
-								doesn't mind having to come to you to beg for sexual release.
-							<</if>>
-							<<saRulesPlayerEnergy>>
-						<<else>> /* $slaves[$i].devotion > 50 */
-							willingly begs you to
-							<<saRulesPlayerFetishPlay>>
-							every chance $he gets.
-							<<saRulesPlayerEnergy>>
-						<</if>> /* closes $slaves[$i].devotion > 50 */
-						<<saRulesPlayerDiscoversFetish>>
-						<<saRulesPlayerDrugEffects>>
-					<<elseif (_release == "masturbation")>>
+					<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+						<<if _release.master === 1>>
+							<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+								refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+								<<set $slaves[$i].trust -= 2>>
+							<<elseif ($slaves[$i].devotion <= 50)>>
+								<<if $slaves[$i].devotion <= 20>>
+									occasionally comes to you to beg for sexual release.
+								<<else>>
+									doesn't mind having to come to you to beg for sexual release.
+								<</if>>
+								<<saRulesPlayerEnergy>>
+							<<else>> /* $slaves[$i].devotion > 50 */
+								willingly begs you to
+								<<saRulesPlayerFetishPlay>>
+								every chance $he gets.
+								<<saRulesPlayerEnergy>>
+							<</if>> /* closes $slaves[$i].devotion > 50 */
+							<<saRulesPlayerDiscoversFetish>>
+							<<saRulesPlayerDrugEffects>>
+						<<else>> /* _release.master === 0 */
+							<<saRulesNoRelease>>
+							<<saRulesNoReleaseDrugEffects>>
+						<</if>>
+					<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 							takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 							<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -3935,8 +4203,14 @@
 							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;trusts you know what's best for $him.@@
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<else>>
-							@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-							<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+							@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+							<<if _release.master === 0>>
+								$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+								<<set $slaves[$i].devotion -= 2>>
+							<<else>>
+								$himself.
+							<</if>>
+							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<</if>>
 						<<if $slaves[$i].devotion > 20>>
 							When $he does play with $himself, $he
@@ -3944,22 +4218,28 @@
 							<<saRulesMasturbationDiscoversFetish>>
 						<</if>>
 						<<saRulesMasturbationDrugEffects>>
-					<<else>> /* releaseRules not restrictive */
-						<<if ($universalRulesConsent == 0)>>
+					<<else>> /* hasNonassignmentSex is true */
+						<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+						<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+							/* no family and no other slaves, so release comes from her partner */
+							finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+							<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+							<<saRulesPartnerDrugEffects>>
+						<<elseif ($universalRulesConsent == 0)>>
 							<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-								<<if (_release == "permissive")>>
+								<<if (_release.masturbation === 1)>>
 									masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 									<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 								<<else>>
-									refuses to use other slaves to get off, and is @@.gold;severely punished@@ for illicit masturbation.
+									refuses to use _whom to get off, and is @@.gold;severely punished@@ for illicit masturbation.
 									<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 								<</if>>
 							<<elseif ($slaves[$i].devotion <= 20)>>
-								<<if (_release == "permissive")>>
-									prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+								<<if (_release.masturbation === 1)>>
+									prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 									<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 								<<else>>
-									is forced to demand sex from other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+									is forced to demand sex from _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 									<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 								<</if>>
 							<<elseif ($slaves[$i].devotion <= 50)>>
@@ -3975,28 +4255,28 @@
 							<</if>>
 						<<else>> /* universalRulesConsent is not zero */
 							<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-								<<if (_release == "permissive")>>
-									prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+								<<if (_release.masturbation === 1)>>
+									prefers to masturbate rather than asking _whom for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 									<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 								<<else>>
-									refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+									refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 									<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 								<</if>>
 							<<elseif ($slaves[$i].devotion <= 20)>>
-								<<if (_release == "permissive")>>
-									prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+								<<if (_release.masturbation === 1)>>
+									prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 									<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 								<<else>>
-									is forced to swap sex with other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+									is forced to swap sex with _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 									<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 								<</if>>
 							<<elseif ($slaves[$i].devotion <= 50)>>
-								@@.hotpink;accepts having to ask@@ other slaves for sex,
+								@@.hotpink;accepts having to ask@@ _whom for sex,
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 								<<saRulesConsentFetish>>
 								<<saRulesConsentDiscoversFetish>>
 							<<else>>
-								@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+								@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 								<<saRulesConsentFetish>>
 								<<saRulesConsentDiscoversFetish>>
@@ -4123,7 +4403,7 @@
 									Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 								<</if>>
 							<</if>>
-						<<elseif (_release != "restrictive" && _release != "chastity")>>
+						<<elseif (_release.slaves === 1)>>
 							<<if ($slaves[$i].energy > 95)>>
 								<<if $DairyiIDs.length > 2>>
 									Under the rules, $he's allowed to demand that other slaves to get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -4224,7 +4504,7 @@
 							$He's @@.hotpink;rewarded@@ with
 							<<if $slaves[$i].clitPiercing == 3>>
 								sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-							<<elseif $slaves[$i].rules.release == "sapphic">>
+							<<elseif $slaves[$i].rules.release.slaves == 1>>
 								immediate sex with any nearby slave,
 							<<else>>
 								a quick climax from a vibrator,
@@ -4266,10 +4546,10 @@
 		<<case "be the Farmer">>
 			<<set $slaves[$i].need -= $FarmyardiIDs.length*5>>
 			<<if $slaves[$i].energy <= 20>>
-				is frigid and has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
-				<<if (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<if (_release.masturbation === 0)>>
 					gets off while performing $his duties, so being forbidden from masturbation doesn't really bother $him.
 					<<set $slaves[$i].need -= 20>>
 				<<else>>
@@ -4277,20 +4557,31 @@
 					<<set $slaves[$i].need -= 20>>
 				<</if>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					willingly begs you to
-					<<saRulesPlayerFetishPlay>>
-					whenever you inspect $farmyardName.
-					<<saRulesPlayerEnergy>>
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						willingly begs you to
+						<<saRulesPlayerFetishPlay>>
+						whenever you inspect $farmyardName.
+						<<saRulesPlayerEnergy>>
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion < 80)>>
 						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 when off duty, but @@.mediumaquamarine;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -4298,14 +4589,19 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						happily @@.mediumaquamarine;avails $himself@@ of your permission to
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesRapeFetish>>
 						<<saRulesRapeDiscoversFetish>>
 					<<else>> /* universalRulesConsent is not zero */
-						@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+						@@.mediumaquamarine;relies@@ on <<if _release.slaves === 1>>your other slaves<<else>>$his family<</if>> for mutual satisfaction,
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 						<<saRulesConsentFetish>>
 						<<saRulesConsentDiscoversFetish>>
@@ -4318,7 +4614,7 @@
 			<<set $slaves[$i].devotion += 1, $slaves[$i].trust += 1>>
 
 			<<if ($universalRulesConsent == 0)>>
-				<<if (_release != "restrictive" && _release != "chastity" && _release != "chastity")>>
+				<<if (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $FarmyardiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for leaving plentiful outlets for $his nymphomania under $his charge.
@@ -4402,7 +4698,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -4421,10 +4717,10 @@
 			<</if>>
 		<<case "work as a farmhand">>
 			<<if $slaves[$i].devotion < -50>>
-				is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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 (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
 				<<if ($slaves[$i].devotion <= 20)>>
@@ -4435,7 +4731,7 @@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
 					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<elseif (_release.masturbation === 0)>>
 					gets off from working as a farmhand, so being forbidden to masturbate doesn't affect $him seriously.
 					<<set $slaves[$i].need -= 20>>
 				<<else>>
@@ -4443,26 +4739,31 @@
 					<<set $slaves[$i].need -= 20>>
 				<</if>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to you to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to you to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly begs you to
-						<<saRulesPlayerFetishPlay>>
-						every chance $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to you to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to you to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly begs you to
+							<<saRulesPlayerFetishPlay>>
+							every chance $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -4476,8 +4777,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -4485,22 +4792,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to use _whom to get off, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to demand sex from other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to demand sex from _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -4516,28 +4829,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to swap sex with other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to swap sex with _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -4663,7 +4976,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $FarmyardiIDs.length > 2>>
 							Under the rules, $he's allowed to demand that other slaves to get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -4764,7 +5077,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -4893,7 +5206,7 @@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
 					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<elseif (_release.masturbation === 0)>>
 					gets off regularly, so being forbidden to masturbate doesn't affect $him seriously.
 					<<set $slaves[$i].need -= 20>>
 				<<else>>
@@ -5049,7 +5362,7 @@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
 					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<elseif (_release.masturbation === 0)>>
 					gets off with $HeadGirl.slaveName, so being forbidden to masturbate doesn't affect $him seriously.
 					<<set $slaves[$i].need -= 20>>
 				<<else>>
@@ -5143,7 +5456,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -5188,10 +5501,10 @@
 			<</if>>
 		<<default>>
 			<<if $slaves[$i].devotion < -50>>
-				is so unhappy that $he has little interest in getting off<<if (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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 (_release != "permissive")>>, making the rule restricting $his sexual outlets superfluous<</if>>.
+				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].need < $slaves[$i].needCap*0.5>>
 				<<if ($slaves[$i].devotion <= 20)>>
@@ -5201,35 +5514,38 @@
 						$He hates $himself for climaxing, and knows the mild aphrodisiacs in the food are forcing $his arousal, @@.gold;frightening $him.@@
 						<<set $slaves[$i].trust -= 1>>
 					<</if>>
-					<<set $slaves[$i].need -= 20>>
-				<<elseif (_release != "permissive") && (_release != "masturbation") && (_release != "chastity")>>
+				<<elseif (_release.masturbation === 0)>>
 					gets off at work, so being forbidden to masturbate doesn't affect $him seriously.
-					<<set $slaves[$i].need -= 20>>
 				<<else>>
 					gets off at work, so $he doesn't feel the need to masturbate frequently.
-					<<set $slaves[$i].need -= 20>>
 				<</if>>
+				<<set $slaves[$i].need -= 20>>
 			<<else>>
-				<<if (_release == "restrictive" || _release == "chastity")>>
-					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-						refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
-						<<set $slaves[$i].trust -= 2>>
-					<<elseif ($slaves[$i].devotion <= 50)>>
-						<<if $slaves[$i].devotion <= 20>>
-							occasionally comes to you to beg for sexual release.
-						<<else>>
-							doesn't mind having to come to you to beg for sexual release.
-						<</if>>
-						<<saRulesPlayerEnergy>>
-					<<else>> /* $slaves[$i].devotion > 50 */
-						willingly begs you to
-						<<saRulesPlayerFetishPlay>>
-						every chance $he gets.
-						<<saRulesPlayerEnergy>>
-					<</if>> /* closes $slaves[$i].devotion > 50 */
-					<<saRulesPlayerDiscoversFetish>>
-					<<saRulesPlayerDrugEffects>>
-				<<elseif (_release == "masturbation")>>
+				<<if (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 0)>>
+					<<if _release.master === 1>>
+						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
+							refuses to come to you for sexual release, and is @@.gold;severely punished@@ for illicit masturbation.
+							<<set $slaves[$i].trust -= 2>>
+						<<elseif ($slaves[$i].devotion <= 50)>>
+							<<if $slaves[$i].devotion <= 20>>
+								occasionally comes to you to beg for sexual release.
+							<<else>>
+								doesn't mind having to come to you to beg for sexual release.
+							<</if>>
+							<<saRulesPlayerEnergy>>
+						<<else>> /* $slaves[$i].devotion > 50 */
+							willingly begs you to
+							<<saRulesPlayerFetishPlay>>
+							every chance $he gets.
+							<<saRulesPlayerEnergy>>
+						<</if>> /* closes $slaves[$i].devotion > 50 */
+						<<saRulesPlayerDiscoversFetish>>
+						<<saRulesPlayerDrugEffects>>
+					<<else>> /* _release.master === 0 */
+						<<saRulesNoRelease>>
+						<<saRulesNoReleaseDrugEffects>>
+					<</if>>
+				<<elseif (!App.Utils.hasNonassignmentSex($slaves[$i]) && _release.masturbation === 1)>>
 					<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
 						takes solace in $his permission to masturbate rather than being forced to beg for sex, @@.mediumaquamarine;reducing $his fear@@ of you.
 						<<set $slaves[$i].trust += 2, $slaves[$i].need = 0>>
@@ -5243,8 +5559,14 @@
 						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;trusts you know what's best for $him.@@
 						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<<else>>
-						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure $himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
-						<<set $slaves[$i].trust += 1, $slaves[$i].devotion -= 2, $slaves[$i].need = 0>>
+						@@.mediumaquamarine;trusts your judgment@@ that only $he really knows how to pleasure
+						<<if _release.master === 0>>
+							$himself, though $he @@.mediumorchid;often wonders why you don't use $him.@@
+							<<set $slaves[$i].devotion -= 2>>
+						<<else>>
+							$himself.
+						<</if>>
+						<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 					<</if>>
 					<<if $slaves[$i].devotion > 20>>
 						When $he does play with $himself, $he
@@ -5252,22 +5574,28 @@
 						<<saRulesMasturbationDiscoversFetish>>
 					<</if>>
 					<<saRulesMasturbationDrugEffects>>
-				<<else>> /* releaseRules not restrictive */
-					<<if ($universalRulesConsent == 0)>>
+				<<else>> /* hasNonassignmentSex is true */
+					<<set _whom = (_release.slaves === 1) ? "other slaves" : $his + " family">>
+					<<if (!App.Utils.hasFamilySex($slaves[$i]) && _release.slaves === 0)>>
+						/* no family and no other slaves, so release comes from her partner */
+						finds frequent sexual release with his <<= relationshipTerm($slaves[$i])>> @@.lightgreen;<<= getSlave($slaves[$i].relationshipTarget).slaveName>>@@ which $he is @@.mediumaquamarine;thankful for.@@
+						<<set $slaves[$i].trust++, $slaves[$i].need -= 20>> /* TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slightly frustrated */
+						<<saRulesPartnerDrugEffects>>
+					<<elseif ($universalRulesConsent == 0)>>
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
+							<<if (_release.masturbation === 1)>>
 								masturbates whenever $he can find a private moment to take care of the urges induced by the food, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to use other slaves to get off, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to use _whom to get off, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than demanding sex from other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than demanding sex from _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to demand sex from other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to demand sex from _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
@@ -5283,28 +5611,28 @@
 						<</if>>
 					<<else>> /* universalRulesConsent is not zero */
 						<<if ($slaves[$i].devotion <= 20) && ($slaves[$i].trust >= -20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than asking other slaves for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than asking _whom for sex, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								refuses to ask other slaves for sex, and is @@.gold;severely punished@@ for illicit masturbation.
+								refuses to ask _whom for sex, and is @@.gold;severely punished@@ for illicit masturbation.
 								<<set $slaves[$i].trust -= 2, $slaves[$i].need -= 10>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 20)>>
-							<<if (_release == "permissive")>>
-								prefers to masturbate rather than trading sex with other slaves, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
+							<<if (_release.masturbation === 1)>>
+								prefers to masturbate rather than trading sex with _whom, @@.mediumaquamarine;slightly reducing $his fear@@ of you.
 								<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<else>>
-								is forced to swap sex with other slaves by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
+								is forced to swap sex with _whom by the urges induced by the food, and @@.hotpink;hates $himself@@ for it.
 								<<set $slaves[$i].devotion += 1, $slaves[$i].need *= 0.5>>
 							<</if>>
 						<<elseif ($slaves[$i].devotion <= 50)>>
-							@@.hotpink;accepts having to ask@@ other slaves for sex,
+							@@.hotpink;accepts having to ask@@ _whom for sex,
 							<<set $slaves[$i].devotion += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
 						<<else>>
-							@@.mediumaquamarine;relies@@ on your other slaves for mutual satisfaction,
+							@@.mediumaquamarine;relies@@ on _whom for mutual satisfaction,
 							<<set $slaves[$i].trust += 1, $slaves[$i].need = 0>>
 							<<saRulesConsentFetish>>
 							<<saRulesConsentDiscoversFetish>>
@@ -5428,7 +5756,7 @@
 							Under the rules, $he will someday find $himself constantly molested by other slaves, but $he's already in such constant terror it that it doesn't cross $his mind.
 						<</if>>
 					<</if>>
-				<<elseif (_release != "restrictive" && _release != "chastity")>>
+				<<elseif (_release.slaves === 1)>>
 					<<if ($slaves[$i].energy > 95)>>
 						<<if $slaves.length > 2 || $menials > 0>>
 							Under the rules, $he's allowed to demand that other slaves get $him off, and $he @@.hotpink;adores@@ you for providing plentiful outlets for $his nymphomania.
@@ -5529,7 +5857,7 @@
 					$He's @@.hotpink;rewarded@@ with
 					<<if $slaves[$i].clitPiercing == 3>>
 						sustained orgasm from $his <<if $slaves[$i].dick == 0>>clit<<else>>dick<</if>> piercing,
-					<<elseif $slaves[$i].rules.release == "sapphic">>
+					<<elseif $slaves[$i].rules.release.slaves == 1>>
 						immediate sex with any nearby slave,
 					<<else>>
 						a quick climax from a vibrator,
@@ -5572,7 +5900,7 @@
 					<<set $slaves[$i].trust -= _punishments>>
 				<</switch>>
 			<</if>>
-			<<if $subSlaves > 0 && (_release == "permissive" || $slaves[$i].rules.release == "sapphic") && $slaves[$i].assignment != "serve your other slaves">>
+			<<if $subSlaves > 0 && _release.slaves == 1 && $slaves[$i].assignment != "serve your other slaves">>
 				<<set $slaves[$i].need -= (20*$subSlaves)>> /* make those serve your other slaves do some work for once */
 			<</if>>
 		<</switch>>
diff --git a/src/uncategorized/slaveAssignmentsReport.tw b/src/uncategorized/slaveAssignmentsReport.tw
index 9c36fe0ddf2ca7ff88e9b248fb271002562ca757..46ccdbef08d4b26d2a4b7d05e230241aa72802c6 100644
--- a/src/uncategorized/slaveAssignmentsReport.tw
+++ b/src/uncategorized/slaveAssignmentsReport.tw
@@ -446,7 +446,7 @@ $sexDemandResult.topClass = Math.trunc((($NPCSexSupply.topClass + $slaveJobValue
 	<<set $slaves[$i].skill.oral = 0>>
 <</if>>
 
-<<if ($seeDicks > 0) && (canPenetrate($slaves[$i])) && ($slaves[$i].rules.release != "restrictive") && ($slaves[$i].rules.release != "masturbation") && ($slaves[$i].rules.release != "chastity")>>
+<<if ($seeDicks > 0) && canPenetrate($slaves[$i]) && App.Utils.hasNonassignmentSex($slaves[$i])>>
 	<<set $averageDick += $slaves[$i].dick, $slavesWithWorkingDicks++>>
 <</if>>
 
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index e75dc3fe147125388f09cb4e8aa334a2b90f1524..f0e69a8a240940f621ca2e5c39cc0514212dc392 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -1539,16 +1539,7 @@ Hormones: <strong><span id="hormones">
 	<<link "Drugs">><<set $activeSlave.rules.reward = "drugs">><<replace "#standardReward">>$activeSlave.rules.reward<</replace>><</link>> |
 	<<link "Orgasm">><<set $activeSlave.rules.reward = "orgasm">><<replace "#standardReward">>$activeSlave.rules.reward<</replace>><</link>> |
 	<<link "Situational">><<set $activeSlave.rules.reward = "situational">><<replace "#standardReward">>$activeSlave.rules.reward<</replace>><</link>>
-
-	<br>Non-assignment orgasm rules: ''<span id="releaseRules">$activeSlave.rules.release</span>.''
-	<<link "Permit masturbation and interslave sex">><<set $activeSlave.rules.release = "permissive">><<replace "#releaseRules">>$activeSlave.rules.release<</replace>><</link>> |
-	<<link "Let $him get off with other slaves">><<set $activeSlave.rules.release = "sapphic">><<replace "#releaseRules">>$activeSlave.rules.release<</replace>><</link>> |
-	<<if !isAmputee($activeSlave) && $activeSlave.fuckdoll == 0 && $activeSlave.fetish != "mindbroken">>
-		<<link "Restrict $him to masturbation only">><<set $activeSlave.rules.release = "masturbation">><<replace "#releaseRules">>$activeSlave.rules.release<</replace>><</link>> |
-	<</if>>
-	<<link "Only with you">><<set $activeSlave.rules.release = "restrictive">><<replace "#releaseRules">>$activeSlave.rules.release<</replace>><</link>> |
-	<<link "Have $him remain chaste">><<set $activeSlave.rules.release = "chastity">><<replace "#releaseRules">>$activeSlave.rules.release<</replace>><</link>>
-
+	
 	<<if setup.facilityHeads.includes($activeSlave.assignment)>>
 		<<if $activeSlave.lactation != 2>>
 			<br>Lactation maintenance for facility heads: ''<span id="lactationRules">$activeSlave.rules.lactation</span>.''
@@ -1560,10 +1551,39 @@ Hormones: <strong><span id="hormones">
 			<</if>>
 		<</if>>
 	<</if>>
+
+	<br><br>Non-assignment orgasm rules:
+	<div style="text-indent:2em">
+	Masturbation is ''<span id="relMasturbation"><<if $activeSlave.rules.release.masturbation === 1>>allowed<<else>>forbidden<</if>></span>.''
+		<<link "Allow">><<set $activeSlave.rules.release.masturbation = 1>><<replace "#relMasturbation">>allowed<</replace>><</link>> |
+		<<link "Forbid">><<set $activeSlave.rules.release.masturbation = 0>><<replace "#relMasturbation">>forbidden<</replace>><</link>>
+	</div>
+	<div style="text-indent:2em">
+	Sex with romantic partner is ''<span id="relPartner"><<if $activeSlave.rules.release.partner === 1>>allowed<<else>>forbidden<</if>></span>.''
+		<<link "Allow">><<set $activeSlave.rules.release.partner = 1>><<replace "#relPartner">>allowed<</replace>><</link>> |
+		<<link "Forbid">><<set $activeSlave.rules.release.partner = 0>><<replace "#relPartner">>forbidden<</replace>><</link>>
+	</div>
+	<<if $seeIncest == 1>>
+		<div style="text-indent:2em">
+		Sex with close family is ''<span id="relFamily"><<if $activeSlave.rules.release.family === 1>>allowed<<else>>forbidden<</if>></span>.''
+			<<link "Allow">><<set $activeSlave.rules.release.family = 1>><<replace "#relFamily">>allowed<</replace>><</link>> |
+			<<link "Forbid">><<set $activeSlave.rules.release.family = 0>><<replace "#relFamily">>forbidden<</replace>><</link>>
+		</div>
+	<</if>>
+	<div style="text-indent:2em">
+	Sex with other slaves is ''<span id="relSlaves"><<if $activeSlave.rules.release.slaves === 1>>allowed<<else>>forbidden<</if>></span>.''
+		<<link "Allow">><<set $activeSlave.rules.release.slaves = 1>><<replace "#relSlaves">>allowed<</replace>><</link>> |
+		<<link "Forbid">><<set $activeSlave.rules.release.slaves = 0>><<replace "#relSlaves">>forbidden<</replace>><</link>>
+	</div>
+	<div style="text-indent:2em">
+	Routine sex with <<= properMaster()>> is ''<span id="relMaster"><<if $activeSlave.rules.release.master === 1>>granted<<else>>denied<</if>></span>.''
+		<<link "Grant">><<set $activeSlave.rules.release.master = 1>><<replace "#relMaster">>granted<</replace>><</link>> |
+		<<link "Deny">><<set $activeSlave.rules.release.master = 0>><<replace "#relMaster">>denied<</replace>><</link>>
+	</div>
 <</if>>
 
 <<if $activeSlave.clitPiercing == 3 || $activeSlave.vaginalAccessory == "smart bullet vibrator">>
-	<br>&nbsp;&nbsp;&nbsp;&nbsp;
+	<div>
 	<<if $activeSlave.clitPiercing == 3>>
 		<<if $activeSlave.dick < 1>>
 			$His smart clit piercing <<if $activeSlave.vaginalAccessory == "smart bullet vibrator">>and smart bullet vibrator are<<else>>is<</if>> set to
@@ -1592,6 +1612,7 @@ Hormones: <strong><span id="hormones">
 	| <<link "Anti-women">><<set $activeSlave.clitSetting = "anti-women">><<replace "#setting">>$activeSlave.clitSetting<</replace>><</link>>
 	| <<link "All sex">><<set $activeSlave.clitSetting = "all">><<replace "#setting">>$activeSlave.clitSetting<</replace>><</link>>
 	| <<link "No sex">><<set $activeSlave.clitSetting = "none">><<replace "#setting">>$activeSlave.clitSetting<</replace>><</link>>
+	</div>
 <</if>>
 
 <<if $activeSlave.voice != 0>>
diff --git a/src/utility/descriptionWidgetsFlesh.tw b/src/utility/descriptionWidgetsFlesh.tw
index bb36bbde986cc95b3d30922690ce23240a36a6cd..392327f92861001bbef33e603cdbc74d3c23a0dd 100644
--- a/src/utility/descriptionWidgetsFlesh.tw
+++ b/src/utility/descriptionWidgetsFlesh.tw
@@ -4064,7 +4064,7 @@ $He's got a
 <<= App.Desc.mods($activeSlave, "clit")>>
 
 <<if $activeSlave.fuckdoll == 0>>
-	<<if ($activeSlave.rules.release == "permissive") || $activeSlave.rules.release == "masturbation">>
+	<<if $activeSlave.rules.release.masturbation == 1>>
 		<<if (($activeSlave.aphrodisiacs > 0) || ($activeSlave.inflationType == "aphrodisiac")) && $activeSlave.drugs != "priapism agents">>
 			<<if ($activeSlave.aphrodisiacs > 1) || ($activeSlave.inflationType == "aphrodisiac" && $activeSlave.inflation > 1)>>
 				<<if ($activeSlave.dick != 0) && ($activeSlave.hormoneBalance >= 100) && (!hasAnyArms($activeSlave))>>
diff --git a/src/utility/saRulesWidgets.tw b/src/utility/saRulesWidgets.tw
index 8238b0f8336c2e9269f26b5a6f9a85a7a64c86f2..e2d02816346caf7b2be24ae81600969ac53f1556 100644
--- a/src/utility/saRulesWidgets.tw
+++ b/src/utility/saRulesWidgets.tw
@@ -409,9 +409,10 @@ and
 
 <<widget "saRulesRapeFetish">>
 
+<<set _who = ($slaves[$i].rules.release.slaves === 1) ? "other slaves" : $his + " family">> /* should be the only two choices if we get here */
 <<if ($slaves[$i].fetishKnown == 1) && ($slaves[$i].fetishStrength > 60)>>
 	<<if ($slaves[$i].fetish == "submissive")>>
-		plead that other slaves fuck $him.
+		plead that _who fuck $him.
 		<<if $averageDick > 4>>
 			<<if $slaves[$i].anus > 0 && $slaves[$i].anus < 3 && canDoAnal($slaves[$i])>>
 				<<if ($slaves[$i].anus*40)-($averageDick*5) < random(1,100)>>
@@ -432,11 +433,11 @@ and
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 7)>>
 	<<elseif ($slaves[$i].fetish == "cumslut")>>
-		suck or be sucked by any slave $he fancies.
+		suck or be sucked by any <<if $slaves[$i].rules.release.slaves === 1>>slave<<else>>relative<</if>> $he fancies.
 		<<set _fuckCount = random(5,15)>>
 		<<set $slaves[$i].counter.oral += _fuckCount, $oralTotal += _fuckCount>>
 	<<elseif ($slaves[$i].fetish == "humiliation")>>
-		demand that other slaves let $him fuck them in public.
+		demand that _who let $him fuck them in public.
 		<<if !$slaves[$i].rivalry>>
 			<<set _rival = randomRapeRivalryTarget($slaves[$i], (s) => { return (s.devotion <= 20 && s.trust < -20); })>>
 			<<if def _rival>>
@@ -447,6 +448,10 @@ and
 					<<set _fuckCount = random(1,3)>>
 					<<set _rival.counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 				<</if>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 4)>>
@@ -455,7 +460,7 @@ and
 			<<set $slaves[$i].counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 		<</if>>
 	<<elseif ($slaves[$i].fetish == "buttslut") && canDoAnal($slaves[$i])>>
-		demand that other slaves penetrate $his anus.
+		demand that _who penetrate $his anus.
 		<<if $averageDick > 4>>
 			<<if $slaves[$i].anus > 0 && $slaves[$i].anus < 3 && canDoAnal($slaves[$i])>>
 				<<if ($slaves[$i].anus*30)-($averageDick*5) < random(1,100)>>
@@ -467,7 +472,7 @@ and
 		<<set _fuckCount = random(5,12)>>
 		<<set $slaves[$i].counter.anal += _fuckCount, $analTotal += _fuckCount>>
 	<<elseif ($slaves[$i].fetish == "boobs")>>
-		demand that other slaves massage $his breasts.
+		demand that _who massage $his breasts.
 		<<if $slaves[$i].lactation > 0>>
 			<<set $slaves[$i].lactationDuration = 2>>
 			<<set $slaves[$i].boobs -= $slaves[$i].boobsMilk, $slaves[$i].boobsMilk = 0>>
@@ -477,7 +482,7 @@ and
 		<<set _fuckCount = random(10,25)>>
 		<<set $slaves[$i].counter.mammary += _fuckCount, $mammaryTotal += _fuckCount>>
 	<<elseif ($slaves[$i].fetish == "sadist")>>
-		force the most reluctant slaves to let $him fuck them.
+		force the most reluctant <<if $slaves[$i].rules.release.slaves === 1>>slaves<<else>>members of his family<</if>> to let $him fuck them.
 		<<if !$slaves[$i].rivalry>>
 			<<set _rival = randomRapeRivalryTarget($slaves[$i], (s) => { return (s.devotion <= 50 && s.sexualFlaw !== "none"); })>>
 			<<if def _rival>>
@@ -502,6 +507,10 @@ and
 					<<set _fuckCount = random(1,3)>>
 					<<set _rival.counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 				<</if>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 4)>>
@@ -510,7 +519,7 @@ and
 			<<set $slaves[$i].counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 		<</if>>
 	<<elseif ($slaves[$i].fetish == "masochist")>>
-		demand that other slaves hurt $him.
+		demand that _who hurt $him.
 		<<if $averageDick > 4>>
 			<<if $slaves[$i].anus > 0 && $slaves[$i].anus < 3 && canDoAnal($slaves[$i])>>
 				<<if ($slaves[$i].anus*30)-($averageDick*5) < random(1,100)>>
@@ -531,13 +540,17 @@ and
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 12)>>
 	<<elseif ($slaves[$i].fetish == "dom")>>
-		force other slaves to submit to $him.
+		force _who to submit to $him.
 		<<if !$slaves[$i].rivalry>>
 			<<set _rival = randomRapeRivalryTarget($slaves[$i], (s) => { return (s.devotion <= 20 && s.trust < -20); })>>
 			<<if def _rival>>
 				$He repeatedly rapes a reluctant <<= SlaveFullName(_rival)>>; $he can't seem to keep $his hand<<if (hasBothArms($slaves[$i]) || !hasAnyArms($slaves[$i]))>>s<</if>><<if (!hasAnyArms($slaves[$i]))>> (so to speak)<</if>> off the poor slave, who can't avoid $him. Not surprisingly, _rival.slaveName resents this, and $slaves[$i].slaveName's ongoing sexual abuse @@.lightsalmon;starts a rivalry@@ between them.
 				<<set $slaves[$i].rivalry = 1, _rival.rivalry = 1, $slaves[$i].rivalryTarget = _rival.ID, _rival.rivalryTarget = $slaves[$i].ID>>
 				<<run SimpleSexAct.Slave(_rival, 4)>>
+				<<if !App.Utils.sexAllowed($slaves[$i], _rival)>>
+					As the rules do not permit $slaves[$i].slaveName and _rival.slaveName to have sex, $he is @@.yellow;severely punished.@@
+					<<set $slaves[$i].trust -= 4>>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<run SimpleSexAct.Slave($slaves[$i], 7)>>
@@ -546,7 +559,7 @@ and
 			<<set $slaves[$i].counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 		<</if>>
 	<<elseif ($slaves[$i].fetish == "pregnancy")>>
-		demand that other slaves indulge $his pregnancy fetish.
+		demand that _who indulge $his pregnancy fetish.
 		<<if $averageDick > 5>>
 			<<if $slaves[$i].mpreg == 0>>
 				<<if $slaves[$i].vagina > 0 && $slaves[$i].vagina < 3 && canDoVaginal($slaves[$i])>>
@@ -573,7 +586,7 @@ and
 			<<set $slaves[$i].counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 		<</if>>
 	<<elseif ($slaves[$i].energy > 95)>>
-		demand that your other slaves satisfy $his formidable appetites.
+		demand that _who satisfy $his formidable appetites.
 		<<if $averageDick > 4>>
 			<<if $slaves[$i].anus > 0 && $slaves[$i].anus < 3 && canDoAnal($slaves[$i])>>
 				<<if ($slaves[$i].anus*30)-($averageDick*5) < random(1,100)>>
@@ -598,7 +611,7 @@ and
 			<<set $slaves[$i].counter.penetrative += _fuckCount, $penetrativeTotal += _fuckCount>>
 		<</if>>
 	<<else>>
-		demand that other slaves have sex with $him.
+		demand that _who have sex with $him.
 		<<run SimpleSexAct.Slave($slaves[$i], 7)>>
 		<<if canPenetrate($slaves[$i])>>
 			<<set _fuckCount = random(3,6)>>
@@ -606,7 +619,7 @@ and
 		<</if>>
 	<</if>>
 <<else>>
-	demand that other slaves have sex with $him.
+	demand that _who have sex with $him.
 	<<run SimpleSexAct.Slave($slaves[$i], 7)>>
 	<<if canPenetrate($slaves[$i])>>
 		<<set _fuckCount = random(3,6)>>
@@ -885,6 +898,7 @@ and
 
 <<widget "saRulesPermissiveDrugEffects">>
 
+<<set _who = ($slaves[$i].rules.release.slaves === 1) ? "other slaves" : $his + " family">> /* should be the only two choices if we get here */
 <<if $slaves[$i].balls > 0>>
 	<<if $slaves[$i].drugs == "testicle enhancement" || $slaves[$i].drugs == "intensive testicle enhancement">>
 		<<if ($slaves[$i].devotion > 20) || ($slaves[$i].trust < -20)>>
@@ -895,9 +909,9 @@ and
 				<<else>>
 					$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
 				<</if>>
-				$He is very reliant on your other slaves to help $him, which @@.mediumaquamarine;habituates $him@@ to slave sex.
+				$He is very reliant on _who to help $him, which @@.mediumaquamarine;habituates $him@@ to slave sex.
 			<<else>>
-				$His terribly swollen balls force $him to rely on other slaves for release several times a day, and jetting cum into and onto them @@.mediumaquamarine;habituates $him@@ to slave sex.
+				$His terribly swollen balls force $him to rely on _who for release several times a day, and jetting cum into and onto them @@.mediumaquamarine;habituates $him@@ to slave sex.
 			<</if>>
 			<<set $slaves[$i].trust += 1>>
 		<<else>>
@@ -913,9 +927,9 @@ and
 				<<else>>
 					$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
 				<</if>>
-				$He is completely dependent on your other slaves to help $him, which @@.mediumaquamarine;habituates $him@@ to slave sex.
+				$He is completely dependent on your _who to help $him, which @@.mediumaquamarine;habituates $him@@ to slave sex.
 			<<else>>
-				$His grotesquely swollen balls force $him to rely on other slaves for release throughout times a day, and swelling them with cum @@.mediumaquamarine;habituates $him@@ to slave sex, though you have to take precautions so $he doesn't knock up your entire stock.
+				$His grotesquely swollen balls force $him to rely on _who for release throughout times a day, and swelling them with cum @@.mediumaquamarine;habituates $him@@ to slave sex, though you have to take precautions so $he doesn't knock up your entire stock.
 			<</if>>
 			<<set $slaves[$i].trust += 1>>
 		<<else>>
@@ -925,8 +939,116 @@ and
 	<</if>>
 <</if>>
 <<if $slaves[$i].drugs == "super fertility drugs" && canGetPregnant($slaves[$i])>>
-	$His reproductive system is in overdrive leading $him to seek out any dicked slaves $he can find several times a day. $He @@.mediumaquamarine;desperately longs@@ for the day $his efforts fill $his womb with child.
+	$His reproductive system is in overdrive leading $him to seek out any dicked <<if $slaves[$i].rules.release.slaves === 1>>slaves<<else>>relatives<</if>> $he can find several times a day. $He @@.mediumaquamarine;desperately longs@@ for the day $his efforts fill $his womb with child.
 	<<set $slaves[$i].trust += 1>>
 <</if>>
 
 <</widget>>
+
+<<widget "saRulesNoRelease">>
+
+	<<if (disobedience($slaves[$i]) > random(0, 100))>>
+		is forbidden to masturbate or seek sexual release. In $his @@.mediumorchid;intense frustration@@ $he disobeys and is @@.gold;severely punished@@ for illicit masturbation.
+		<<set $slaves[$i].devotion -= 2, $slaves[$i].trust -= 2>>
+	<<else>>
+		is forbidden to masturbate or seek sexual release, which @@.mediumorchid;highly frustrates@@ $him.
+		<<set $slaves[$i].devotion -= 2>>
+	<</if>>
+	
+<</widget>>
+
+<<widget "saRulesNoReleaseDrugEffects">>
+
+<<if $slaves[$i].balls > 0>>
+	<<if $slaves[$i].drugs == "testicle enhancement" || $slaves[$i].drugs == "intensive testicle enhancement">>
+		<<if $slaves[$i].hormoneBalance >= 100>>
+			$He can't seem to get enough cum out of $his terribly swollen balls in one orgasm to get relieve the pressure:
+			<<if $slaves[$i].dick>>
+				$his poor soft dick produces slow, anemic ejaculations, no matter how backed up $he is.
+			<<else>>
+				$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
+			<</if>>
+			Forbidden to masturbate or seek relief through sex, he @@.mediumorchid;can't find relief@@ and @@.red;the situation harms $his health.@@
+			<<set $slaves[$i].devotion -= 2>>
+		<<else>>
+			$His terribly swollen balls ache, cultivating a need for sex that @@.mediumorchid;$he can't fulfill@@ and @@.red;harming his health.@@
+			<<set $slaves[$i].devotion -= 2>>
+		<</if>>
+		<<run healthDamage($slaves[$i], 3)>>
+	<<elseif $slaves[$i].drugs == "hyper testicle enhancement">>
+		<<if $slaves[$i].hormoneBalance >= 100>>
+			$He can't seem to get enough cum out of $his grotesquely swollen balls in one orgasm to get relieve the pressure:
+			<<if $slaves[$i].dick>>
+				$his poor soft dick produces slow, anemic ejaculations, no matter how backed up $he is.
+			<<else>>
+				$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
+			<</if>>
+			Forbidden to masturbate or seek relief through sex, he @@.mediumorchid;can't find relief@@ and @@.red;the situation harms $his health.@@
+			<<set $slaves[$i].devotion -= 4>>
+		<<else>>
+			$His grotesquely swollen balls ache, cultivating a need for sex that @@.mediumorchid;$he can't fulfill@@ and @@.red;harming his health.@@
+			<<set $slaves[$i].devotion -= 4>>
+		<</if>>
+		<<run healthDamage($slaves[$i], 6)>>
+	<</if>>
+<</if>>
+<<if $slaves[$i].drugs == "super fertility drugs" && canGetPregnant($slaves[$i])>>
+	$His reproductive system is in overdrive,
+	<<if ($slaves[$i].devotion >= -20)>>
+		leaving $him @@.mediumorchid;completely unfulfilled@@ since @@.gold;you won't <<if $PC.dick != 0>>give $him<<else>>let $him find<</if>> the dick $he needs.@@
+		<<set $slaves[$i].devotion -= 3, $slaves[$i].trust -= 2>>
+	<<else>>
+		leaving $him desperate for a thorough seeding @@.mediumorchid;that you've forbidden $him from having.@@
+		<<set $slaves[$i].devotion -= 3>>
+	<</if>>
+<</if>>
+<<if $slaves[$i].energy > 50>>
+	$His enforced chastity @@.red;habituates him to a lack of release.@@
+	<<set $slaves[$i].energy -= 2>>
+<</if>>
+
+<</widget>>
+
+<<widget "saRulesPartnerDrugEffects">>
+
+<<set _sr = getSlave($slaves[$i].relationshipTarget)>>
+<<setLocalPronouns _sr 2>>
+<<if $slaves[$i].balls > 0>>
+	<<if ($slaves[$i].drugs == "testicle enhancement" || $slaves[$i].drugs == "intensive testicle enhancement")>>
+		<<if $slaves[$i].hormoneBalance >= 100>>
+			$He can't seem to get enough cum out of $his terribly swollen balls in one orgasm to relieve the pressure:
+			<<if $slaves[$i].dick>>
+				$his poor soft dick produces slow, anemic ejaculations, no matter how backed up $he is.
+			<<else>>
+				$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
+			<</if>>
+			This forces $him to find $his <<= relationshipTerm($slaves[$i])>> for release many times a day, and $he @@.mediumaquamarine;is desperately reliant@@ on _him2 for relief.
+			<<set $slaves[$i].trust += 2>>
+		<<else>>
+			$His terribly swollen balls force $him to find $his <<= relationshipTerm($slaves[$i])>> for release several times a day, and $he @@.mediumaquamarine;relies@@ on _him2 for relief.
+			<<set $slaves[$i].trust += 1>>
+		<</if>>
+	<<elseif $slaves[$i].drugs == "hyper testicle enhancement">>
+		<<if $slaves[$i].hormoneBalance >= 100>>
+			$He can't seem to get enough cum out of $his grotesquely swollen balls in one orgasm to get relieve the pressure:
+			<<if $slaves[$i].dick>>
+				$his poor soft dick produces slow, anemic ejaculations, no matter how backed up $he is.
+			<<else>>
+				$his cumhole produces slow, anemic ejaculations, no matter how backed up $he is.
+			<</if>>
+			This forces $him to find $his <<= relationshipTerm($slaves[$i])>> for release many times a day, and $he @@.mediumaquamarine;is desperately reliant@@ on _him2 for relief.
+			<<set $slaves[$i].trust += 2>>
+		<<else>>
+			$His grotesquely swollen balls force $him to come to find $his <<= relationshipTerm($slaves[$i])>> for release dozens of times a day, and $he @@.mediumaquamarine;is desperately reliant@@ on _him2 for relief.
+			<<set $slaves[$i].trust += 1>>
+		<</if>>
+	<</if>>
+<</if>> /* close overactive balls block */
+<<if $slaves[$i].drugs == "super fertility drugs" && canImpreg($slaves[$i], _sr)>>
+	<<if ($slaves[$i].devotion > 20) || ($slaves[$i].trust < -20)>>
+		$His reproductive system is in overdrive leading $him to come to find $his <<= relationshipTerm($slaves[$i])>> for insemination several times a day; $he @@.mediumaquamarine;desperately hopes@@ for the day _his2 seed takes root in $his womb.
+		<<set $slaves[$i].trust += 1>>
+	<</if>>
+<</if>>
+
+<</widget>>
\ No newline at end of file