diff --git a/src/events/RESS/devotedVirgin.js b/src/events/RESS/devotedVirgin.js
new file mode 100644
index 0000000000000000000000000000000000000000..45b910b4c5190535779f2af75ccd3520bdf1169e
--- /dev/null
+++ b/src/events/RESS/devotedVirgin.js
@@ -0,0 +1,136 @@
+App.Events.RESSDevotedVirgin = class RESSDevotedVirgin extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [];
+	}
+
+	actorPrerequisites() {
+		return [
+			[ // single event slave
+				s => s.fetish !== "mindbroken",
+				hasAnyArms,
+				canWalk,
+				s => s.vagina === 0,
+				s => s.trust > 20,
+				s => s.devotion > 50,
+				s => s.rules.speech !== "restrictive"
+			]
+		];
+	}
+
+	execute(node) {
+		/** @type {Array<App.Entity.SlaveState>} */
+		let [eventSlave] = this.actors.map(a => getSlave(a));
+		const {
+			He, he, his, him
+		} = getPronouns(eventSlave);
+		const {S, s, ss, say, title: Master} = getEnunciation(eventSlave);
+
+		/** @type {App.Entity.PlayerState} */
+		let PC = V.PC;
+
+		V.nextLink = "Next Week";
+
+		App.Events.drawEventArt(node, eventSlave);
+
+		let t = [];
+
+		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
+		t.push(`comes into your office and politely waits until you indicate ${he} can have your attention.`);
+		if (canTalk(eventSlave)) {
+			t.push(`${He} ${say}s, "${capFirstChar(Master)}, I want to know what it'${s} like to have a cock in my virgin pu${ss}y.`);
+			if (canSee(eventSlave)) {
+				t.push(`${S}eeing ${s}o many of the other ${s}lave${s} getting fucked make${s} it look like ${s}o much fun.`);
+			} else if (canHear(eventSlave)) {
+				t.push(`Hearing ${s}o many of the other ${s}lave${s} getting fucked make${s} it ${s}ound like ${s}o much fun.`);
+			} else {
+				t.push(`Learning about ${s}o many of the other ${s}lave${s} getting fucked make${s} it ${s}eem like ${s}o much fun.`);
+			}
+			t.push(`I'm ${s}o turned on by it. I can't be a proper ${s}e<<x>> ${s}lave without u${s}ing my pu<<ss>>y. Plea${s}e take my virginity, ${Master}."`);
+		} else {
+			t.push(`${He} points to ${his} pussy and comically pantomimes having sex, and then uses gestures to ask if ${he} can serve you with ${his} pussy.`);
+		}
+		t.push(`${He} spreads ${his} legs ${eventSlave.belly >= 10000 ? `carefully and cocks ${his} hips` : `and cocks ${his} hips suggestively`} at you.`);
+		App.Events.addParagraph(node, t);
+		t = [];
+
+		App.Events.addResponses(node, [
+			new App.Events.Result(`No, reassure ${him} that ${he} doesn't need to be a slut`, reassure),
+			new App.Events.Result(`Make sure ${his} first time is enjoyable`, enjoy),
+			new App.Events.Result(`Make sure ${his} first fuck puts ${him} in ${his} place`, rape)
+		]);
+
+		function reassure() {
+			t = [];
+
+			t.push(`You kindly explain that you've decided to save ${his} virginity — for now. ${He} looks slightly down-hearted and tries to smile nonetheless, but finds ${him}self swept off ${his}`);
+			if (!hasAnyLegs(eventSlave)) {
+				t.push("stumps");
+			} else if (!hasBothLegs(eventSlave)) {
+				t.push("foot");
+			} else {
+				t.push("feet");
+			}
+			t.push(`and ${eventSlave.bellyPreg >= 5000 ? "gently" : ""} deposited on the couch. ${He} gasps with surprise when ${he} finds ${him}self being teased, fondled, and massaged rather than outright used. In no time at all ${he}'s pressing ${his} whole`);
+			if (eventSlave.belly >= 5000) {
+				t.push(`${eventSlave.bellyPreg >= 3000 ? "gravid" : "rounded"}`);
+			}
+			t.push(`body against you and shivering with delight. ${He} shudders, almost uncontrollably, when you grind your ${PC.dick === 0 ? "clitoris" : "dick"} against ${his} moistened, wet pussy between ${his} thighs, taking extra care not to penetrate the willing slave. ${He} leaves your office feeling <span class="hotpink">very close to ${his} ${WrittenMaster()} indeed,</span> and seems to have forgotten ${his} unfucked vagina, for now.`);
+
+			eventSlave.devotion += 4;
+			return t;
+		}
+
+		function enjoy() {
+			t = [];
+
+			t.push(`You bring ${him} over to the couch, ${!canDoVaginal(eventSlave) ? `unfasten ${his} chastity,` : ""} set ${him} on your lap, and teasingly play with ${his}`);
+			if (eventSlave.belly >= 5000) {
+				t.push(`${eventSlave.bellyPreg >= 3000 ? "gravid" : "rounded"}`);
+			}
+			t.push(`body for a long time. Every so often you move your hands over ${his} pussylips, making ${him} shiver and press ${him}self against you, but you only make it the center of attention once the poor over-aroused slave`);
+			if (canTalk(eventSlave)) {
+				t.push(`begs, "I can't take it any more, ${Master}! Fuck me, plea${s}e. Plea${s}e!"`);
+			} else {
+				t.push(`begins to reach for your ${PC.dick === 0 ? "strap-on" : "cock"} to pull it towards ${him}self.`);
+			}
+			t.push(`Finally, you lubricate your hand. Then you slowly and gently push a finger into ${his} invitingly tight virgin pussy. ${He}'s already on the edge of orgasm, and you patiently inch your ${PC.dick === 0 ? "strap-on" : "cock"} into ${his} pussy without making ${him} climax. You then start pumping and ${he} starts to moan and breathing more and more heavily. You continue pumping until ${he} finally starts to orgasm, ${PC.dick === 0 ? `${his} climactic shudders` : `the walls of ${his} tightening vagina`} send you over as well. ${He}'s left in a haze of <span class="hotpink">sexual satisfaction</span> that radiates outward from ${his} <span class="lime">newly initiated pussy,</span> and ${he} <span class="mediumaquamarine">trusts you</span> a lot more, now.`);
+			if ((eventSlave.fetishKnown !== 1 || eventSlave.fetish !== "pregnancy") && fetishChangeChance(eventSlave) > jsRandom(1,100)) {
+				t.push(`${He}'s back again before the week is over, eager for <span class="lightcoral">another dick in ${his} fuckhole.</span>`);
+
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "pregnancy";
+			}
+
+			eventSlave.devotion += 3;
+			eventSlave.trust += 3;
+			eventSlave.vagina = 1;
+			seX(eventSlave, "vaginal", PC, "penetrative");
+			if (PC.dick !== 0 && eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+				knockMeUp(eventSlave, 15, 0, -1);
+			}
+			return t;
+		}
+
+		function rape() {
+			t = [];
+
+			t.push(`You throw ${him} onto the couch beside your desk; ${he} fails to stop ${him}self from losing balance with ${his} flailing ${isAmputee(eventSlave) ? "stumps" : "limbs"}. ${He} looks around doubtfully; ${he}'s already started to wonder whether this was a mistake. In a few moments ${he} knows it for sure as ${he} feels ${!canDoVaginal(eventSlave) ? `${his} vaginal chastity ripped off and` : ""} the burning sensation of a lubricated ${PC.dick === 0 ? "strap-on" : "dickhead"} forcing ${his} virgin pussy wide. You have ${his} face shoved deep between the leather cushions and you ignore the muffled sounds coming from ${him}. ${He} limply tries to relax for ${his} beloved master, but the painful sensation coming from ${his} crotch causes ${him} to start to writhe uncontrollably. ${He} pushes against the couch, trying to endure the pounding. When you finish, the poor slave is left lying on the couch with a ${PC.dick !== 0 ? `thin dribble of ejaculate escaping from ${his}` : ""} <span class="lime">newly fucked vagina,</span> a stream of drying tears running down each side of ${his} face, ${eventSlave.dick > 0 ? `a single drop of precum at the tip of ${his} totally flaccid dick,` : ""} and a new understanding of <span class="gold">${his} place in life.</span>`);
+			if ((eventSlave.fetishKnown !== 1 || eventSlave.fetish !== "submissive") && fetishChangeChance(eventSlave) > jsRandom(1,100)) {
+				t.push(`Before the end of the week it's clear that ${he}'s taken the rape to heart, and now sees ${his} body as something <span class="lightcoral">for others to use and abuse.</span>`);
+
+				eventSlave.fetishKnown = 1;
+				eventSlave.fetishStrength = 65;
+				eventSlave.fetish = "submissive";
+			}
+
+			eventSlave.trust -= 5;
+			eventSlave.vagina = 1;
+			seX(eventSlave, "vaginal", PC, "penetrative");
+			if (PC.dick !== 0 && eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
+				knockMeUp(eventSlave, 15, 0, -1);
+			}
+			return t;
+		}
+	}
+};
diff --git a/src/events/randomEvent.js b/src/events/randomEvent.js
index bb7b0ef448f0ed70b542c30cada9bf6c2d4378a7..6b0cf71069180693415dd812d50c352bd52c3046 100644
--- a/src/events/randomEvent.js
+++ b/src/events/randomEvent.js
@@ -12,6 +12,7 @@ App.Events.getIndividualEvents = function() {
 		// example: new App.Events.TestEvent(),
 		new App.Events.RESSAssFitting(),
 		new App.Events.RESSCockFeederResistance(),
+		new App.Events.RESSDevotedVirgin(),
 		new App.Events.RESSEscapee(),
 		new App.Events.RESSHotPC(),
 		new App.Events.RESSLazyEvening(),
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index 20ab7a595daa5f1337ccb9d78e66653b4460a035..0c36db05888f19b96817fc3564dd87ee51af69a1 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -1325,16 +1325,6 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 		}
 
 		if (canWalk(eventSlave) && hasAnyArms(eventSlave)) {
-			if (eventSlave.vagina === 0) {
-				if (eventSlave.devotion > 50) {
-					if (eventSlave.trust > 20) {
-						if (eventSlave.rules.speech !== "restrictive") {
-							V.RESSevent.push("devoted virgin");
-						}
-					}
-				}
-			}
-
 			if (eventSlave.anus === 0) {
 				if (eventSlave.devotion > 50) {
 					if (eventSlave.trust > 20) {
@@ -2452,16 +2442,6 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) {
 		}
 
 		if (canWalk(eventSlave) && hasAnyArms(eventSlave)) {
-			if (eventSlave.vagina === 0) {
-				if (eventSlave.devotion > 50) {
-					if (eventSlave.trust > 20) {
-						if (eventSlave.rules.speech !== "restrictive") {
-							V.RESSevent.push("devoted virgin");
-						}
-					}
-				}
-			}
-
 			if (eventSlave.anus === 0) {
 				if (eventSlave.devotion > 50) {
 					if (eventSlave.trust > 20) {
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 2540ab75119fb679f0dccf5fb9416a9df55364fa..7082f68f825b76107a9ba1cb8136d0aeb70c94cd 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -1491,16 +1491,6 @@ There is a horrible crash from the shower. You rush in to see <<= App.UI.slaveDe
 <</if>>
 "Help me, <<Master>>!"
 
-<<case "devoted virgin">>
-
-<<= App.UI.slaveDescriptionDialog($activeSlave)>> comes into your office and politely waits until you indicate $he can have your attention.
-<<if !canTalk($activeSlave)>>
-	$He points to $his pussy and comically pantomimes having sex, and then uses gestures to ask if $he can serve you with $his pussy.
-<<else>>
-	$He <<say>>s, "<<= capFirstChar($enunciate.title)>>, I want to know what it'<<s>> like to have a cock in my virgin pu<<ss>>y. <<if canSee($activeSlave)>><<S>>eeing<<elseif canHear($activeSlave)>>Hearing<<else>>Learning about<</if>> <<s>>o many of the other <<s>>lave<<s>> getting fucked make<<s>> it <<if canSee($activeSlave)>>look<<elseif canHear($activeSlave)>><<s>>ound<<else>><<s>>eem<</if>> like <<s>>o much fun. I'm <<s>>o turned on by it. I can't be a proper <<s>>e<<x>> <<s>>lave without u<<s>>ing my pu<<ss>>y. Plea<<s>>e take my virginity, <<Master>>."
-<</if>>
-$He spreads $his legs <<if $activeSlave.belly >= 10000>>carefully and cocks $his hips<<else>>and cocks $his hips suggestively<</if>> at you.
-
 <<case "devoted anal virgin">>
 
 <<= App.UI.slaveDescriptionDialog($activeSlave)>> comes into your office and politely waits until you indicate $he can have your attention.
@@ -9249,49 +9239,6 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<</replace>>
 <</link>>
 
-<<case "devoted virgin">>
-
-<<link "No, reassure $him that $he doesn't need to be a slut">>
-	<<replace "#result">>
-		You kindly explain that you've decided to save $his virginity — for now. $He looks slightly down-hearted and tries to smile nonetheless, but finds $himself swept off $his <<if !hasAnyLegs($activeSlave)>>stumps<<elseif !hasBothLegs($activeSlave)>>foot<<else>>feet<</if>> and<<if $activeSlave.bellyPreg >= 5000>> gently<</if>> deposited on the couch. $He gasps with surprise when $he finds $himself being teased, fondled, and massaged rather than outright used. In no time at all $he's pressing $his whole<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>><</if>> body against you and shivering with delight. $He shudders, almost uncontrollably, when you grind your <<if $PC.dick == 0>>clitoris<<else>>dick<</if>> against $his moistened, wet pussy between $his thighs, taking extra care not to penetrate the willing slave. $He leaves your office feeling @@.hotpink;very close to $his <<= WrittenMaster()>> indeed,@@ and seems to have forgotten $his unfucked vagina, for now.
-		<<set $activeSlave.devotion += 4>>
-	<</replace>>
-<</link>>
-<br><<link "Make sure $his first time is enjoyable">>
-	<<replace "#result">>
-		You bring $him over to the couch<<if !canDoVaginal($activeSlave)>>, unfasten $his chastity<</if>>, set $him on your lap, and teasingly play with $his<<if $activeSlave.belly >= 5000>> <<if $activeSlave.bellyPreg >= 3000>>gravid<<else>>rounded<</if>><</if>> body for a long time. Every so often you move your hands over $his pussylips, making $him shiver and press $himself against you, but you only make it the center of attention once the poor over-aroused slave
-		<<if !canTalk($activeSlave)>>
-			begins to reach for your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> to pull it towards $himself.
-		<<else>>
-			begs, "I can't take it any more, <<Master>>! Fuck me, plea<<s>>e. Plea<<s>>e!"
-		<</if>>
-		Finally, you lubricate your hand. Then you slowly and gently push a finger into $his invitingly tight virgin pussy. $He's already on the edge of orgasm, and you patiently inch your <<if $PC.dick == 0>>strap-on<<else>>cock<</if>> into $his pussy without making $him climax. You then start pumping and $he starts to moan and breathing more and more heavily. You continue pumping until $he finally starts to orgasm, <<if $PC.dick == 0>>$his climactic shudders<<else>>the walls of $his tightening vagina<</if>> send you over as well. $He's left in a haze of @@.hotpink;sexual satisfaction@@ that radiates outward from $his @@.lime;newly initiated pussy,@@ and $he @@.mediumaquamarine;trusts you@@ a lot more, now.
-		<<if ($activeSlave.fetishKnown != 1) || ($activeSlave.fetish != "pregnancy")>>
-			$He's back again before the week is over, eager for @@.lightcoral;another dick in $his fuckhole.@@
-			<<set $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65, $activeSlave.fetish = "pregnancy">>
-		<</if>>
-		<<set $activeSlave.devotion += 3, $activeSlave.trust += 3, $activeSlave.vagina = 1>>
-		<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-		<<if $PC.dick != 0 && $activeSlave.eggType == "human" && canGetPregnant($activeSlave)>>
-			<<= knockMeUp($activeSlave, 15, 0, -1)>>
-		<</if>>
-	<</replace>>
-<</link>>
-<br><<link "Make sure $his first fuck puts $him in $his place">>
-	<<replace "#result">>
-		You throw $him onto the couch beside your desk; $he fails to stop $himself from losing balance with $his flailing <<if isAmputee($activeSlave)>>stumps<<else>>limbs<</if>>. $He looks around doubtfully; $he's already started to wonder whether this was a mistake. In a few moments $he knows it for sure as $he feels<<if !canDoVaginal($activeSlave)>> $his vaginal chastity ripped off and<</if>> the burning sensation of a lubricated <<if $PC.dick == 0>>strap-on<<else>>dickhead<</if>> forcing $his virgin pussy wide. You have $his face shoved deep between the leather cushions and you ignore the muffled sounds coming from $him. $He limply tries to relax for $his beloved master, but the painful sensation coming from $his crotch causes $him to start to writhe uncontrollably. $He pushes against the couch, trying to endure the pounding. When you finish, the poor slave is left lying on the couch with <<if $PC.dick == 0>>a<<else>>a thin dribble of ejaculate escaping from $his<</if>> @@.lime;newly fucked vagina,@@ a stream of drying tears running down each side of $his face,<<if $activeSlave.dick > 0>> a single drop of precum at the tip of $his totally flaccid dick,<</if>> and a new understanding of @@.gold;$his place in life.@@
-		<<if ($activeSlave.fetishKnown != 1) || ($activeSlave.fetish != "submissive")>>
-			Before the end of the week it's clear that $he's taken the rape to heart, and now sees $his body as something @@.lightcoral;for others to use and abuse.@@
-			<<set $activeSlave.fetishKnown = 1, $activeSlave.fetishStrength = 65, $activeSlave.fetish = "submissive">>
-		<</if>>
-		<<set $activeSlave.trust -= 5, $activeSlave.vagina = 1>>
-		<<run seX($activeSlave, "vaginal", $PC, "penetrative")>>
-		<<if $PC.dick != 0 && $activeSlave.eggType == "human" && isFertile($activeSlave) && $activeSlave.preg == 0>>
-			<<= knockMeUp($activeSlave, 25, 0, -1)>>
-		<</if>>
-	<</replace>>
-<</link>>
-
 <<case "devoted anal virgin">>
 
 <<link "No, reassure $him that $he doesn't need to be an anal slut">>