diff --git a/src/endWeek/saRules_old.js b/src/endWeek/saRules_old.js
index ca6e16c82953dd1698151adc5388c9ca7f988aab..38c77865929ecbf4e191dee2921fe691d3fc6a75 100644
--- a/src/endWeek/saRules_old.js
+++ b/src/endWeek/saRules_old.js
@@ -69,23 +69,37 @@
 							}
 							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 += `${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,32 @@
 									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>. `;
+									slave.need -= 20; // TODO: probably should be based on BOTH slaves' need, leaving the less needy partner slighly 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 +176,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 +306,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. `;
@@ -1004,16 +1029,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;
@@ -1040,7 +1066,7 @@
 					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 (assignmentVisible(slave)) {
 						if (!slave.rivalry) {
 							SlaveSort.IDs(V.RapeableIDs);
@@ -1077,7 +1103,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)) {
@@ -1091,7 +1117,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;
@@ -1104,7 +1130,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 (assignmentVisible(slave)) {
 						if (!slave.rivalry) {
 							SlaveSort.IDs(V.RapeableIDs);
@@ -1171,7 +1201,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)) {
@@ -1196,7 +1226,7 @@
 					SimpleSexAct.Slave(slave, 12);
 					break;
 				case "dom":
-					r += `force other slaves to submit to ${him}. `;
+					r += `force ${who} to submit to ${him}. `;
 					if (assignmentVisible(slave)) {
 						if (!slave.rivalry) {
 							SlaveSort.IDs(V.RapeableIDs);
@@ -1228,7 +1258,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)) {
@@ -1261,7 +1291,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)) {
@@ -1289,7 +1319,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);
@@ -1300,7 +1330,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);