diff --git a/src/events/RESS/forbiddenMasturbation.js b/src/events/RESS/forbiddenMasturbation.js
index 15b7846225639c71b6c3a453e18c3f4135dbaf62..01b1eb45bb8ab2266f250f702ea4c70cb73bc704 100644
--- a/src/events/RESS/forbiddenMasturbation.js
+++ b/src/events/RESS/forbiddenMasturbation.js
@@ -14,7 +14,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				s => s.trust >= -20,
 				s => (s.chastityPenis !== 1 || s.dick === 0),
 				hasAnyArms,
-				hasAnyLegs
+				hasAnyLegs,
 			]
 		];
 	}
@@ -28,6 +28,9 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 		const {title: Master} = getEnunciation(eventSlave);
 		const {hisA, himselfA, HisA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
 		const bellyAdj = bellyAdjective(eventSlave);
+		const knees = hasBothLegs(eventSlave) ? "knees" : "knee";
+
+		let offHand = "nothing";
 
 		V.nextLink = "Next Week";
 
@@ -94,22 +97,79 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			r.push(`There is a gentle alert from ${V.assistant.name}: "${properMaster()},`, contextualIntro(V.PC, eventSlave, "DOM"), `is masturbating in violation of the rules."`);
 		}
 		r.push(`A video feed appears.`);
-		if (eventSlave.chastityVagina) {
-			r.push(`In ${his} chastity belt, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`);
-		} else if ((eventSlave.chastityPenis === 1)) {
-			r.push(`In ${his} chastity cage, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"} and some furtive fingering of ${his} asshole.`);
-		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
-			r.push(`Since ${he}'s impotent from hormone treatment, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
-		} else if ((eventSlave.dick > 0) && (eventSlave.balls > 0) && (eventSlave.ballType === "sterile")) {
-			r.push(`Since ${he}'s impotent due to ${his} useless balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
-		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
-			r.push(`Since ${he}'s impotent due to ${his} lack of balls, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
-		} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) {
+		if (eventSlave.chastityVagina && eventSlave.chastityPenis === 1) {
+			r.push(`In ${his} combination chastity, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`);
+			if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`and some furtive fingering of ${his} asshole`);
+				offHand = "anal";
+			}
+			r.push(r.pop() + `.`);
+		} else if (eventSlave.chastityVagina && eventSlave.dick === 0) {
+			r.push(`In ${his} chastity belt, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`);
+			if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`and some furtive fingering of ${his} asshole`);
+				offHand = "anal";
+			}
+			r.push(r.pop() + `.`);
+		} else if (eventSlave.chastityPenis === 1 && eventSlave.vagina === -1) {
+			r.push(`In ${his} chastity cage, all ${he} can manage is furious nipple-${eventSlave.nipples !== "fuckable" ? "rubbing" : "fisting"}`);
+			if (hasBothArms(eventSlave) && canDoAnal(eventSlave)) {
+				r.push(`and some furtive fingering of ${his} asshole`);
+				offHand = "anal";
+			}
+			r.push(r.pop() + `.`);
+		} else if (eventSlave.dick > 0 && ((eventSlave.hormoneBalance >= 100) || (eventSlave.balls > 0 && eventSlave.ballType === "sterile") || (eventSlave.balls === 0))) {
+			r.push(`Since ${he}'s impotent`);
+			if (eventSlave.balls === 0) {
+				r.push(`due to ${his} lack of balls,`);
+			} else if (eventSlave.ballType === "sterile") {
+				r.push(`due to ${his} useless balls,`);
+			} else {
+				r.push(`from hormone treatment,`);
+			}
+			r.push(`all ${he} can manage is rubbing ${his} soft dick`);
+			if (hasBothArms(eventSlave)) {
+				if (canDoVaginal(eventSlave)) {
+					r.push(`and some furtive fingering of ${his} pussy.`);
+					offHand = "pussy";
+				} else if (canDoAnal(eventSlave)) {
+					r.push(`and some furtive fingering of ${his} asshole.`);
+					offHand = "anal";
+				} else {
+					r.push(`and some ${eventSlave.nipples !== "fuckable" ? `furious tweaking of ${his} nipples` : `furtive fingering of ${his} nipplecunts`}`);
+					offHand = "nipples";
+				}
+			}
+			r.push(r.pop() + `.`);
+		} else if (!canAchieveErection(eventSlave) && eventSlave.dick > 6) {
 			r.push(`Since ${his} dick requires far too much blood to get erect, ${he}'s furiously massaging the semi-engorged monster.`);
-		} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 0)) {
-			r.push(`Since ${he}'s can't get it up, all ${he} can manage is rubbing ${his} soft dick and some furtive fingering of ${his} asshole.`);
-		} else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) {
-			r.push(`${He}'s rubbing ${his} perineum desperately with one hand, and ${his} anus with the other, since ${he} lacks external genitalia.`);
+		} else if (!canAchieveErection(eventSlave) && eventSlave.dick > 0) {
+			r.push(`Since ${he}'s can't get it up, all ${he} can manage is rubbing ${his} soft dick`);
+			if (hasBothArms(eventSlave)) {
+				if (canDoVaginal(eventSlave)) {
+					r.push(`and some furtive fingering of ${his} pussy.`);
+					offHand = "pussy";
+				} else if (canDoAnal(eventSlave)) {
+					r.push(`and some furtive fingering of ${his} asshole.`);
+					offHand = "anal";
+				} else {
+					r.push(`and some ${eventSlave.nipples !== "fuckable" ? `furious tweaking of ${his} nipples` : `furtive fingering of ${his} nipplecunts`}`);
+					offHand = "nipples";
+				}
+			}
+			r.push(r.pop() + `.`);
+		} else if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
+			r.push(`${He}'s rubbing ${his} perineum desperately`);
+			if (hasBothArms(eventSlave)) {
+				if (canDoAnal(eventSlave)) {
+					r.push(`with one hand, and ${his} anus with the other,`);
+					offHand = "anal";
+				} else {
+					r.push(`with one hand, and a nipple with the other,`);
+					offHand = "nipples";
+				}
+			}
+			r.push(`since ${he} lacks external genitalia.`);
 		} else if (eventSlave.vagina === -1) {
 			r.push(`${He}'s furiously jacking off.`);
 		} else if (eventSlave.clit >= 3) {
@@ -171,7 +231,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			if (eventSlave.belly >= 300000) {
 				r.push(`leans over ${his} ${bellyAdj} belly`);
 			} else {
-				r.push(`gets on ${his} knees`);
+				r.push(`gets on ${his} ${knees}`);
 			}
 			r.push(`and sucks you off. ${He} does a decent job, playing with ${himself} all the while. ${He}'s learned that ${he} can get away with infractions if ${he}'s willing to suck dick afterward. ${His} resistance to your will <span class="devotion dec">has increased.</span>`);
 			eventSlave.devotion -= 5;
@@ -229,7 +289,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			} else {
 				r.push(`suck your cock.`);
 			}
-			r.push(`When you pretend indifference, ${he} abjectly begs. Soon, ${he}'s down on ${his} knees, crying a little with shame as ${he} masturbates furiously.`);
+			r.push(`When you pretend indifference, ${he} abjectly begs. Soon, ${he}'s down on ${his} ${knees}, crying a little with shame as ${he} masturbates furiously.`);
 			seX(eventSlave, "oral", V.PC, "penetrative", 5);
 			if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
@@ -240,6 +300,15 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 					r.push(`sucking cock`);
 				}
 				r.push(`has increased.</span>`);
+			} else if (eventSlave.fetish === "cumslut") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of`);
+				if (V.PC.dick === 0) {
+					r.push(`giving head`);
+				} else {
+					r.push(`sucking cock`);
+				}
+				r.push(`is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "cumslut";
 				eventSlave.fetishKnown = 1;
@@ -293,9 +362,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			}
 			r.push(`${He} writhes and sobs at the orgasm denial, since the nipple play is just barely enough to keep ${him} at a high level of arousal without giving relief. You switch back and forth until ${he} finally goes over into muscle-spasming climax during nipple stimulation alone.`);
 			seX(eventSlave, "mammary", V.PC, "penetrative");
-			if ((eventSlave.fetish === "boobs") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "boobs" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
 				r.push(`<span class="fetish inc">${His} enjoyment of breast play has increased.</span>`);
+			} else if (eventSlave.fetish === "boobs") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of breast play is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "boobs";
 				eventSlave.fetishKnown = 1;
@@ -324,9 +396,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				r.push(`popped`);
 			}
 			r.push(`navel as ${he} comes down from ${his} masturbation session.`);
-			if ((eventSlave.fetish === "pregnancy") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
-				r.push(`<span class="lightcoral">${His} enjoyment of pregnancy has increased.</span>`);
+				r.push(`<span class="fetish inc">${His} enjoyment of pregnancy has increased.</span>`);
+			} else if (eventSlave.fetish === "pregnancy") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of pregnancy is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "pregnancy";
 				eventSlave.fetishKnown = 1;
@@ -337,7 +412,7 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				} else {
 					r.push(`the very thought of being pregnant`);
 				}
-				r.push(`.</span>`);
+				r.push(r.pop() + `.</span>`);
 			}
 			return r;
 		}
@@ -393,9 +468,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			}
 			r.push(`up ${his} butt. Soon, ${he}'s down on all fours, crying a little with mixed shame and anal pain as ${he} masturbates furiously.`);
 			r.push(VCheck.Anal(eventSlave, 5));
-			if ((eventSlave.fetish === "buttslut") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
 				r.push(`<span class="fetish inc">${His} enjoyment of anal has increased.</span>`);
+			} else if (eventSlave.fetish === "buttslut") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of anal is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "buttslut";
 				eventSlave.fetishKnown = 1;
@@ -414,9 +492,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				r.push(`onto the street`);
 			}
 			r.push(`and secure ${him} upright with a set of vibrators attached to all of ${his} erogenous zones. There's a lot of them, and they're extremely powerful; when you test the setup, ${he} wriggles with the intensity of the stimulation, and is about to climax when you shut it down. Without telling ${him}, you slave the vibrators to a program originally designed for VIP security details. It uses the cameras scattered through the area to detect when passersby are looking at ${him}. The more eyes on ${him}, the stronger the vibrations.`);
-			if ((eventSlave.fetish === "humiliation") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "humiliation" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
 				r.push(`<span class="fetish inc">${His} enjoyment of humiliation has increased.</span>`);
+			} else if (eventSlave.fetish === "humiliation") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of humiliation is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "humiliation";
 				eventSlave.fetishKnown = 1;
@@ -435,9 +516,12 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				r.push(`and a shriek of agony.`);
 			}
 			r.push(`${He} masturbates furiously, but you're an accomplished spanker, and you repeatedly cause ${him} just enough pain to prevent climax. Eventually ${he} gets off in part because of, rather than in spite of, the lengthy beating.`);
-			if ((eventSlave.fetish === "submissive") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "submissive" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
 				r.push(`<span class="fetish inc">${His} enjoyment of submission has increased.</span>`);
+			} else if (eventSlave.fetish === "submissive") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of submission is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "submissive";
 				eventSlave.fetishKnown = 1;
@@ -450,9 +534,9 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 		function pain() {
 			r = [];
 			r.push(`You order ${him} to`);
-			if ((eventSlave.heels === 1) && shoeHeelCategory(eventSlave) === 0) {
+			if ((eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) || !canStand(eventSlave)) {
 				r.push(`kneel`);
-			} else if (shoeHeelCategory(eventSlave) > 1) {
+			} else if (shoeHeelCategory(eventSlave) > 1 || canMove(eventSlave)) {
 				r.push(`teeter`);
 			} else {
 				r.push(`stand`);
@@ -468,14 +552,30 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 				r.push(`over ${his} head and ${his} leg bent,`);
 			}
 			r.push(`and tell ${him} that if ${he} moves or resists, ${his} punishment will begin again from the start.`);
-			if ((eventSlave.chastityVagina) || (eventSlave.chastityPenis === 1)) {
-				r.push(`${He} was touching ${his} nipples and ass, so you flick and torture ${his} nipples and give ${him} a severe spanking.`);
-			} else if (!canAchieveErection(eventSlave) && (eventSlave.dick > 6)) {
+			if ((eventSlave.chastityVagina || eventSlave.chastityPenis === 1)) {
+				if (offHand === "anal") {
+					r.push(`${He} was touching ${his} nipples and ass, so you flick and torture ${his} nipples and give ${him} a severe spanking.`);
+				} else {
+					r.push(`${He} was playing with ${his} nipples, so you flick and torture them, enjoying ${his} agony.`);
+				}
+			} else if (!canAchieveErection(eventSlave) && eventSlave.dick > 6) {
 				r.push(`${He} was playing with ${his} oversized cock, so you kick and swat at the swollen monster, enjoying the way it spasms.`);
-			} else if ((eventSlave.dick > 0) && !canAchieveErection(eventSlave)) {
-				r.push(`${He} was touching ${his} limp dick and ass, so you slap and torture ${his} offending dick and give ${him} a severe spanking.`);
-			} else if ((eventSlave.vagina === -1) && (eventSlave.dick === 0)) {
-				r.push(`${He} was desperately rubbing ${his} perineum and anus, the most sensitive parts ${he} has left, so you slap that part of ${him} repeatedly, enjoying the way it spasms.`);
+			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
+				if (offHand === "anal") {
+					r.push(`${He} was touching ${his} limp dick and ass, so you slap and torture ${his} offending dick and give ${him} a severe spanking.`);
+				} else if (offHand === "pussy") {
+					r.push(`${He} was touching ${his} limp dick and pussy, so you slap and torture ${his} offending dick and labia.`);
+				} else if (offHand === "nipples") {
+					r.push(`${He} was playing with ${his} limp dick and nipples, so you slap and torture ${his} offending dick while pinching and twisting nipples.`);
+				} else {
+					r.push(`${He} was playing with ${his} limp dick, so you slap and torture ${his} worthless cock, enjoying ${his} agony.`);
+				}
+			} else if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
+				if (offHand === "anal") {
+					r.push(`${He} was desperately rubbing ${his} perineum and anus, the most sensitive parts ${he} has left, so you slap that part of ${him} repeatedly, enjoying the way it spasms.`);
+				} else if (offHand === "nipples") {
+					r.push(`${He} was desperately rubbing ${his} perineum and nipples, the most sensitive parts ${he} has left, so you slap those parts of ${him} repeatedly, enjoying the way they spasm.`);
+				}
 			} else if (eventSlave.vagina === -1 || eventSlave.clit >= 3) {
 				r.push(`${He} was jacking it, so you force ${him} to get ${himself} hard for punishment and then deliver a series of agonizing slaps and flicks to ${his} offending member.`);
 			} else if (eventSlave.labia > 1) {
@@ -483,11 +583,14 @@ App.Events.RESSForbiddenMasturbation = class RESSForbiddenMasturbation extends A
 			} else {
 				r.push(`You deliver a series of agonizing slaps to ${his} mons.`);
 			}
-			r.push(`You have to start over twice. By the end, ${he}'s managed to orgasm to all the stimulation, but ${he}'s crying and desperately promising never to touch ${himself} again without your permission. ${His} submission to you <span class="hotpink">has increased.</span>`);
+			r.push(`You have to start over twice. By the end, ${he}'s managed to orgasm to all the stimulation, but ${he}'s crying and desperately promising never to touch ${himself} again without your permission. ${His} submission to you <span class="devotion inc">has increased.</span>`);
 			eventSlave.devotion += 4;
-			if ((eventSlave.fetish === "masochist") && (eventSlave.fetishKnown === 1)) {
+			if (eventSlave.fetish === "masochist" && eventSlave.fetishKnown === 1) {
 				eventSlave.fetishStrength += 4;
 				r.push(`<span class="fetish inc">${His} enjoyment of pain has increased.</span>`);
+			} else if (eventSlave.fetish === "masochist") {
+				eventSlave.fetishKnown = 1;
+				r.push(`<span class="fetish gain">${His} enjoyment of pain is now clear to you.</span>`);
 			} else if (random(1, 100) > 50) {
 				eventSlave.fetish = "masochist";
 				eventSlave.fetishKnown = 1;