diff --git a/src/events/nonRandom/mercs/pSnatchAndGrab.js b/src/events/nonRandom/mercs/pSnatchAndGrab.js
index dce4165fcad246c2cd2ef243a6c3378273820153..8a894641db1b38edda9fcdc96a9acf4e9ac99999 100644
--- a/src/events/nonRandom/mercs/pSnatchAndGrab.js
+++ b/src/events/nonRandom/mercs/pSnatchAndGrab.js
@@ -1,74 +1,100 @@
-		:: P snatch and grab [nobr]
+App.Events.PSnatchAndGrab = class PSnatchAndGrab extends App.Events.BaseEvent {
+	eventPrerequisites() {
+		return [
+			() => V.mercenaries > 0
+		];
+	}
 
+	execute(node) {
+		let r = [];
 		V.nextButton = "Continue";
-
 		V.eventResults.snatch = 0;
-		<<setAssistantPronouns>>
 
-		V.capFirstChar(V.assistant.name)
-			r.push(`forwards a discreet message from the leader of your mercenaries.`);
-		<br><br>
-		"V.properTitle()
-			r.push(`, I've just become aware of a... business opportunity through some old friends. There's an unregistered lab doing illegal gene therapy work. At least two agencies are onto them, which is how I heard of it. Word is, they're packing up and moving out. I believe me and my people can appropriate that shipment. Catch is, to make this work I need to pay some serious bribes, and I need to pay them today. We'll cut you in as an equal partner for`);
-		V.cashFormat(10000)
-			r.push(`cash, right now. One share should come to one of the lab rats, more or less. Are you in or out?"`);
+		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} forwards a discreet message from the leader of your mercenaries.`]);
+
+		r.push(`"${properTitle()}, I've just become aware of a... business opportunity through some old friends. There's an unregistered lab doing illegal gene therapy work. At least two agencies are onto them, which is how I heard of it. Word is, they're packing up and moving out. I believe me and my people can appropriate that shipment. Catch is, to make this work I need to pay some serious bribes, and I need to pay them today. We'll cut you in as an equal partner for ${cashFormat(10000)} cash, right now. One share should come to one of the lab rats, more or less. Are you in or out?"`);
 		if (V.assistant.personality === 1) {
-			<br><br>
-			r.push(`${V.capFirstChar(V.assistant.name)}'s V.assistant.appearance avatar appears on your desk next to the message.`);
+			const {
+				HeA,
+				heA, hisA, himselfA
+			} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+			App.Events.addParagraph(node, r);
+			r = [];
+			r.push(`${capFirstChar(V.assistant.name)}'s ${V.assistant.appearance} avatar appears on your desk next to the message.`);
 			switch (V.assistant.appearance) {
-			case "monstergirl":
-				"I vote yes. Even though whatever that lab is producing can't possibly be as interesting as me," _heA says haughtily, and twirls a strand of tentacle hair.
-			case "shemale":
-				"I vote yes," _heA says sweetly. "Whatever they're doing, it's probably interesting. I'd love to fuck something interesting."
-			case "amazon":
-				"I vote yes!" _heA shouts. "Whatever they're doing, their girls are probably valuable. And everything's more fun if you loot it instead of buying it."
-			case "businesswoman":
-				"I vote yes," _heA says. "The likelihood that the lab is producing something valuable is overwhelming. The potential profits are," and _heA pauses to fan _himselfA, "exciting."
-			case "fairy" "pregnant fairy":
-				"I vote yes," _heA says. "They could be up to something really cool!"
-			case "goddess":
-				"I vote yes," _heA says. "Whatever is in that lab deserves some loving attention and... more variety is always appreciated."
-			case "hypergoddess":
-				"I vote yes," _heA says. "Whatever is in that lab deserves some loving attention and... more variety is always appreciated."
-			case "loli":
-				"I vote yeah," _heA says. "I wanna see what's inside!"
-			case "preggololi":
-				"I vote yeah," _heA says. "I wanna see what's inside!"
-			case "schoolgirl":
-				"I vote yeah," _heA says. "I just wanna see what that lab is doing. Could be cool!"
-			case "angel":
-				"I vote yes," _heA says. "Whatever is in that lab deserves a better life under your care."
-			case "cherub":
-				"I vote yeah," _heA says. "I'm really curious what could be inside."
-			case "incubus":
-				"I vote yes," _heA says. "I can't wait to get my dick in it!"
-			case "succubus":
-				"I vote no," _heA says. "You're all mine!"
-			case "imp":
-				"I vote yeah," _heA says. "I can't wait to tease and torment whatever's inside!"
-			case "witch":
-				"I vote yes," _heA says. "It can't be worse than some of my fuckups."
-			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
-				_HeA doesn't comment, though a large, toothy grin spreads across the entirety of _hisA head revealing _hisA thoughts on the subject.
-			default:
-				"I would suggest agreement," _heA says. "Even if the prize does not appeal to you personally, it's likely to be quite valuable. Selling it could net you quite a profit."
+				case "monstergirl":
+					r.push(`"I vote yes. Even though whatever that lab is producing can't possibly be as interesting as me," ${heA} says haughtily, and twirls a strand of tentacle hair.`);
+					break;
+				case "shemale":
+					r.push(`"I vote yes," ${heA} says sweetly. "Whatever they're doing, it's probably interesting. I'd love to fuck something interesting."`);
+					break;
+				case "amazon":
+					r.push(`"I vote yes!" ${heA} shouts. "Whatever they're doing, their girls are probably valuable. And everything's more fun if you loot it instead of buying it."`);
+					break;
+				case "businesswoman":
+					r.push(`"I vote yes," ${heA} says. "The likelihood that the lab is producing something valuable is overwhelming. The potential profits are," and ${heA} pauses to fan ${himselfA}, "exciting."`);
+					break;
+				case "fairy":
+				case "pregnant fairy":
+					r.push(`"I vote yes," ${heA} says. "They could be up to something really cool!"`);
+					break;
+				case "goddess":
+					r.push(`"I vote yes," ${heA} says. "Whatever is in that lab deserves some loving attention and... more variety is always appreciated."`);
+					break;
+				case "hypergoddess":
+					r.push(`"I vote yes," ${heA} says. "Whatever is in that lab deserves some loving attention and... more variety is always appreciated."`);
+					break;
+				case "loli":
+					r.push(`"I vote yeah," ${heA} says. "I wanna see what's inside!"`);
+					break;
+				case "preggololi":
+					r.push(`"I vote yeah," ${heA} says. "I wanna see what's inside!"`);
+					break;
+				case "schoolgirl":
+					r.push(`"I vote yeah," ${heA} says. "I just wanna see what that lab is doing. Could be cool!"`);
+					break;
+				case "angel":
+					r.push(`"I vote yes," ${heA} says. "Whatever is in that lab deserves a better life under your care."`);
+					break;
+				case "cherub":
+					r.push(`"I vote yeah," ${heA} says. "I'm really curious what could be inside."`);
+					break;
+				case "incubus":
+					r.push(`"I vote yes," ${heA} says. "I can't wait to get my dick in it!"`);
+					break;
+				case "succubus":
+					r.push(`"I vote no," ${heA} says. "You're all mine!"`);
+					break;
+				case "imp":
+					r.push(`"I vote yeah," ${heA} says. "I can't wait to tease and torment whatever's inside!"`);
+					break;
+				case "witch":
+					r.push(`"I vote yes," ${heA} says. "It can't be worse than some of my fuckups."`);
+					break;
+				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
+					r.push(`${HeA} doesn't comment, though a large, toothy grin spreads across the entirety of ${hisA} head revealing ${hisA} thoughts on the subject.`);
+					break;
+				default:
+					r.push(`"I would suggest agreement," ${heA} says. "Even if the prize does not appeal to you personally, it's likely to be quite valuable. Selling it could net you quite a profit."`);
 			}
 		}
 
-		<br><br>
+		App.Events.addParagraph(node, r);
+
+		const choices = [
+			new App.Events.Result(`Bankroll the snatch and grab`, bankroll),
+			new App.Events.Result(`Politely decline`, decline)
+		];
+		App.Events.addResponses(node, choices);
 
-		<span id="result">
-		<<link "Bankroll the snatch and grab">>
-			<<replace "#result">>
-			r.push(`You receive no response whatsoever. Twenty minutes later, however, a liaison VTOL aircraft that the mercenaries sometimes hire arrives, loads a party of armed men and women, and leaves.`);
+		function bankroll() {
 			cashX(-10000, "slaveTransfer");
 			V.eventResults.snatch = 1;
-			<</replace>>
-		<</link>>
-		<br>
-		<<link "Politely decline">>
-			<<replace "#result">>
-				r.push(`You receive no response whatsoever. That's how it is with professionals: the offer was never made, you never declined, and no further discussion is necessary or desired.`);
-			<</replace>>
-		<</link>>
-		</span>
+			return `You receive no response whatsoever. Twenty minutes later, however, a liaison VTOL aircraft that the mercenaries sometimes hire arrives, loads a party of armed men and women, and leaves.`;
+		}
+
+		function decline() {
+			return `You receive no response whatsoever. That's how it is with professionals: the offer was never made, you never declined, and no further discussion is necessary or desired.`;
+		}
+	}
+};
diff --git a/src/events/timeGatedPlotEvent.js b/src/events/timeGatedPlotEvent.js
index 9d29c023ad8ce1103edcc9b57195126e413578d5..6a6719fd72e9e1a7117acc378816a1526cc7626c 100644
--- a/src/events/timeGatedPlotEvent.js
+++ b/src/events/timeGatedPlotEvent.js
@@ -14,9 +14,7 @@ App.Events.TimeGatedPlotEvent = class TimeGatedPlotEvent extends App.Events.Base
 		this.events[20] = new App.Events.PSlaveFood();
 		this.events[24] = new App.Events.PMilitia();
 		this.events[31] = new App.Events.PMercenaries();
-		this.events[35] = new App.Events.TwineEvent().wrapPassage([
-			() => V.mercenaries > 0
-		], "P snatch and grab");
+		this.events[35] = new App.Events.PSnatchAndGrab();
 		this.events[43] = new App.Events.TwineEvent().wrapPassage([], "P invasion");
 		this.events[46] = new App.Events.PRaidInvitation();
 		this.events[56] = new App.Events.PUndergroundRailroad();