diff --git a/src/005-passages/interactPassages.js b/src/005-passages/interactPassages.js
index 96a797b5b1d1dff2ac02747d0d20545f80d1a6fd..70eadbd4824d506ed94f06e39785c4d38edf62a6 100644
--- a/src/005-passages/interactPassages.js
+++ b/src/005-passages/interactPassages.js
@@ -54,3 +54,12 @@ new App.DomPassage(
 		return huskSwapSelection(getSlave(V.AS));
 	}
 );
+
+new App.DomPassage(
+	"Agent Company",
+	() => {
+		V.nextButton = "Continue";
+		V.nextLink = "Neighbor Interact";
+		return App.UI.SlaveInteract.agentCompany(getSlave(V.AS));
+	}, ["jump-from-safe"]
+);
diff --git a/src/npc/agent/agentCompany.js b/src/npc/agent/agentCompany.js
new file mode 100644
index 0000000000000000000000000000000000000000..5d4d65093c590c53cd745ed16a6a21ca6856255c
--- /dev/null
+++ b/src/npc/agent/agentCompany.js
@@ -0,0 +1,81 @@
+/** Reassign your agent's lover to the arcology run by your agent
+ * @param {App.Entity.SlaveState} lover
+ * @returns {DocumentFragment}
+ */
+App.UI.SlaveInteract.agentCompany = function(lover) {
+	const frag = document.createDocumentFragment();
+
+	const agent = getSlave(lover.relationshipTarget);
+	const neighborArcology = V.arcologies.find((a) => agent.ID === a.leaderID);
+	const {he, him, his, himself} = getPronouns(lover);
+	const {He2, His2, he2, him2, his2, wife2} = getPronouns(agent).appendSuffix('2');
+	const {say} = getEnunciation(lover);
+	const {say: say2} = getEnunciation(agent);
+
+	// make the assignment
+	assignJob(lover, Job.AGENTPARTNER);
+
+	// clear rivalry if applicable
+	const rival = getSlave(lover.rivalryTarget);
+	if (rival) {
+		rival.rivalry = 0;
+		rival.rivalryTarget = 0;
+	}
+	lover.rivalry = 0;
+	lover.rivalryTarget = 0;
+
+	// output text
+	let r = [];
+	r.push(`Working in ${neighborArcology.name}'s penthouse office, ${agent.slaveName} gets a video call from you. Naturally, ${his2} personal assistant program has been instructed to give these the highest priority, and your face appears in front of ${him2} immediately. ${He2} greets you properly, and asks you what ${he2} can do to serve you. You tell ${him2} you're planning to send one of your slaves over to ${his2} arcology to assist ${him2}. Exchanges of this kind are neither unusual nor particularly interesting, so a slight look of perplexity clouds ${agent.slaveName}'s face as ${he2} wonders why this merits a personal call. Normally, ${S.HeadGirl ? S.HeadGirl.slaveName : V.assistant.name} would handle it with ${him2} directly.`);
+	App.Events.addParagraph(frag, r);
+
+	r = [];
+	r.push(`${His2} question is answered when you bring ${contextualIntro(agent, lover)} in close, putting ${him} in ${agent.slaveName}'s view. ${agent.slaveName}'s ${App.Desc.eyesColor(agent)} fly open with pleased surprise, but before ${he2} can speak, ${lover.slaveName} goes first.`);
+
+	if (!canTalk(lover)) {
+		r.push(`Unable to speak ${himself}, ${he} simply makes a heart shape with ${his} ${hasBothArms(lover) ? "hands" : "hand"} in view of the video call, and blows ${his} ${lover.relationship === 4 ? "lover" : wife2} a kiss.`);
+	} else {
+		r.push(Spoken(lover, `"Hi ${lover.relationship === 4 ? 'lover' : 'sweetheart'},"`));
+		r.push(`${he} ${say}s in a syrupy tone.`);
+		r.push(Spoken(lover, `"Miss me?"`));
+	}
+	App.Events.addParagraph(frag, r);
+
+	r = [];
+	r.push(`${agent.slaveName} smiles back at ${him}, glowing with pleasure, and responds with exaggerated arousal.`);
+	switch (agent.fetish) {
+		case "submissive":
+			r.push(Spoken(agent, `"Looking forward to sleeping in your arms, babe,"`), `the submissive`);
+			break;
+		case "cumslut":
+			r.push(Spoken(agent, `"Can't wait to kiss you, babe,"`), `the orally fixated`);
+			break;
+		case "humiliation":
+			r.push(Spoken(agent, `"Can't wait to take you right in the middle of the plaza here,"`), `the exhibitionist`);
+			break;
+		case "buttslut":
+			r.push(Spoken(agent, `"I can't wait to fuck you in your hot little ass,"`), `the anally fixated`);
+			break;
+		case "boobs":
+			r.push(Spoken(agent, `"Looking forward to feeling your breasts again,"`), `the boob-loving`);
+			break;
+		case "pregnancy":
+			r.push(Spoken(agent, `"Can't wait to share all the pregnant girls here with you,"`), `the impregnation fetishist`);
+			break;
+		case "dom":
+			r.push(Spoken(agent, `"Looking forward to shoving you facedown, bitch,"`), `the dominant`);
+			break;
+		case "sadist":
+			r.push(Spoken(agent, `"Looking forward to making you bite the pillow again, bitch,"`), `the sadistic`);
+			break;
+		case "masochist":
+			r.push(Spoken(agent, `"Can't wait to feel you hurt me again, babe,"`), `the masochistic`);
+			break;
+		default:
+			r.push(Spoken(agent, `"Babe, I can't wait to ${hasAnyArms(agent) ? "give you a hug and" : ""} tell you about ${neighborArcology.name},"`), `the loving`);
+	}
+	r.push(`leader of an entire arcology ${say2}s.`);
+	App.Events.addParagraph(frag, r);
+
+	return frag;
+};
diff --git a/src/npc/agent/agentCompany.tw b/src/npc/agent/agentCompany.tw
deleted file mode 100644
index c8ea98825ad766a54c166e5918e623e39c211404..0000000000000000000000000000000000000000
--- a/src/npc/agent/agentCompany.tw
+++ /dev/null
@@ -1,61 +0,0 @@
-:: Agent Company [nobr]
-
-<<set $nextButton = "Continue", $nextLink = "AS Dump", $returnTo = "Neighbor Interact">>
-
-<<= assignJob(getSlave($AS), "live with your agent")>>
-
-<<if getSlave($AS).rivalry > 0>>
-	<<set _i = $slaveIndices[getSlave($AS).rivalryTarget]>>
-	<<if def _i>>
-		<<set $slaves[_i].rivalry = 0, $slaves[_i].rivalryTarget = 0>>
-	<<else>>
-		@@.red;Error, slave rival not found.@@
-	<</if>>
-	<<set getSlave($AS).rivalry = 0, getSlave($AS).rivalryTarget = 0>>
-<</if>>
-
-<<set _neighborArcology = $arcologies.find(function(s) { return $subSlave.ID == s.leaderID; })>>
-
-<<setLocalPronouns $subSlave 2>>
-
-Working in _neighborArcology.name's penthouse office, $subSlave.slaveName gets a video call from you. Naturally, _his2 personal assistant program has been instructed to give these the highest priority, and your face appears in front of _him2 immediately. _He2 greets you properly, and asks you what _he2 can do to serve you. You tell _him2 you're planning to send one of your slaves over to _his2 arcology to assist _him2. Exchanges of this kind are neither unusual nor particularly interesting, so a slight look of perplexity clouds $subSlave.slaveName's face as _he2 wonders why this merits a personal call. Normally, <<if $HeadGirlID>>_S.HeadGirl.slaveName<<else>>$assistant.name<</if>> would handle it with _him2 directly.
-
-<br><br>
-
-_His2 question is answered when you bring <<= contextualIntro($subSlave, getSlave($AS))>> in close, putting $him in $subSlave.slaveName's view. $subSlave.slaveName's <<= App.Desc.eyesColor($subSlave)>> fly open with pleased surprise, but before _he2 can speak, <<= getSlave($AS).slaveName>> goes first.
-<<if !canTalk(getSlave($AS))>>
-	Unable to speak $himself, $he simply makes a heart shape with $his hand<<if hasBothArms(getSlave($AS))>>s<</if>> in view of the video call, and blows $his <<if getSlave($AS).relationship == 4>>lover<<else>>_wife2<</if>> a kiss.
-<<else>>
-	<<run Enunciate(getSlave($AS))>>
-	"Hi <<if getSlave($AS).relationship == 4>>lover<<else>><<s>>weetheart<</if>>," $he <<say>>s in a syrupy tone. "Mi<<ss>> me?"
-<</if>>
-
-<br><br>
-
-$subSlave.slaveName smiles back at $him, glowing with pleasure, and responds with exaggerated arousal.
-
-<<run Enunciate($subSlave)>>
-
-<<switch $subSlave.fetish>>
-<<case "submissive">>
-	"Looking forward to <<s>>leeping in your arm<<s>>, babe," the submissive
-<<case "cumslut">>
-	"Can't wait to ki<<ss>> you, babe," the orally fixated
-<<case "humiliation">>
-	"Can't wait to take you right in the middle of the pla<<z>>a here," the exhibitionist
-<<case "buttslut">>
-	"I can't wait to fuck you in your hot little a<<ss>>," the anally fixated
-<<case "boobs">>
-	"Looking forward to feeling your brea<<s>>t<<s>> again," the boob-loving
-<<case "pregnancy">>
-	"Can't wait to <<sh>>are all the pregnant girl<<s>> here with you," the impregnation fetishist
-<<case "dom">>
-	"Looking forward to <<sh>>oving you fa<<c>>edown, bitch," the dominant
-<<case "sadist">>
-	"Looking forward to making you bite the pillow again, bitch," the sadistic
-<<case "masochist">>
-	"Can't wait to feel you hurt me again, babe," the masochistic
-<<default>>
-	"Babe, I can't wait to <<if hasAnyArms($subSlave)>>give you a hug and <</if>>tell you about _neighborArcology.name," the loving
-<</switch>>
-leader of an entire arcology <<say>>s.