diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 3530725741f8a5765677dc1ff51345e16efd2a4e..33876d8ad0612ac3794a939259b443a8d58ced06 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -22,7 +22,7 @@ globalThis.walkPast = (function() {
 	/** generate a walkPast vignette
 	 * @param {App.Entity.SlaveState} activeSlave
 	 * @param {string} [fixedTarget] - if set, force target to this value
-	 * @returns {string} - vignette text (SC markup)
+	 * @returns {DocumentFragment} - vignette
 	 */
 	function walkPast(activeSlave, fixedTarget) {
 		output = "";
@@ -121,40 +121,57 @@ globalThis.walkPast = (function() {
 			him, his, He
 		} = getPronouns(activeSlave);
 
+		let links = [];
+		const executeWalkpast = (passage) => {
+			V.activeSlave = activeSlave; // TODO: remove me once all the F* passages don't need activeSlave anymore
+			$(`#walkpast-${activeSlave.ID}`).empty().append(App.UI.DOM.renderPassage(passage));
+		};
 		if (activeSlave.fuckdoll === 0) {
 			if (target === "FButt" && activeSlave.chastityAnus) {
 				output += ` If you wish to have anal intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`;
-				output += ` <span id="walkpast"><<link "Grope ${his} rear instead">><<replace "#walk">><<include "FondleButt">><</replace>><</link>></span>`;
+				links.push(App.UI.DOM.link(`Grope ${his} rear instead`, executeWalkpast, "FondleButt"));
 			} else if (target === "FVagina" && activeSlave.chastityVagina) {
 				output += ` If you wish to have vanilla intercourse with ${him} you must order ${him} to remove ${his} chastity belt.`;
 			} else if (flag > 100) {
-				const setter = (flag === 110) ? `<<set $partner="${V.partner}", $relation=${V.relation}>>` : `<<set $partner="${V.partner}">>`;
-				output += ` <span id="walkpast"><<link "Summon them both">>${setter}<<replace "#walk">><<include "${target}">><</replace>><</link>></span>`;
+				links.push(App.UI.DOM.link(`Summon them both`, (partner, relation, target) => {
+					V.partner = partner;
+					V.relation = relation; // TODO: remove these once FRelation/FRival don't need them anymore
+					executeWalkpast(target);
+				}, [V.partner, flag === 110 ? V.relation : null, target]));
 			} else if (activeSlave.assignment === Job.CONFINEMENT) {
-				output += ` <span id="walkpast"><<link "Have ${him} brought out of ${his} cell">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`;
+				links.push(App.UI.DOM.link(`Have ${him} brought out of ${his} cell`, executeWalkpast, target));
 			} else if (activeSlave.assignment === Job.DAIRY && V.dairyRestraintsSetting > 1) {
 				output += ` ${He} is strapped into a milking machine and cannot leave ${V.dairyName}.`;
 			} else {
 				if ([Job.ARCADE, Job.CELLBLOCK, Job.ATTENDANT, Job.DJ, Job.MADAM, Job.MILKMAID, Job.TEACHER, Job.STEWARD, Job.WARDEN, Job.AGENT, Job.CONCUBINE, Job.AGENTPARTNER, Job.HEADGIRLSUITE, Job.CLUB, Job.MASTERSUITE, Job.CONFINEMENT, Job.GLORYHOLE, Job.QUARTER, Job.BROTHEL, Job.DAIRY].includes(activeSlave.assignment)) {
-					output += ` <span id="walkpast"><<link "Have ${him} take a break and come up">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`;
+					links.push(App.UI.DOM.link(`Have ${him} take a break and come up`, executeWalkpast, target));
 				} else {
-					output += ` <span id="walkpast"><<link "Call ${him} over">><<replace "#walk">><<include "${target}">><</replace>><</link>></span>`;
+					links.push(App.UI.DOM.link(`Call ${him} over`, executeWalkpast, target));
 				}
 			}
 		} else {
 			switch (target) {
 				case "FVagina":
-					output += ` <span id="walkpast"><<link "Fuck ${him}">><<replace "#walk">><<include "FFuckdollVaginal">><</replace>><</link>></span>`;
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollVaginal"));
 					break;
 				case "FButt":
 				case "FAnus":
-					output += ` <span id="walkpast"><<link "Fuck ${him}">><<replace "#walk">><<include "FFuckdollAnal">><</replace>><</link>></span>`;
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollAnal"));
 					break;
 				default:
-					output += ` <span id="walkpast"><<link "Fuck ${him}">><<replace "#walk">><<include "FFuckdollOral">><</replace>><</link>></span>`;
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollOral"));
 			}
 		}
-		return output;
+
+		if (V.debugMode && passage() !== "Walk Past List") {
+			links.push(App.UI.DOM.passageLink("Show all walk past scenes", "Walk Past List"));
+		}
+
+		const frag = document.createDocumentFragment();
+		$(frag).append(output);
+		const span = App.UI.DOM.appendNewElement("span", frag, App.UI.DOM.generateLinksStrip(links));
+		span.id = `walkpast-${activeSlave.ID}`;
+		return frag;
 	}
 
 	function primeSlave(activeSlave, seed) {
@@ -9201,11 +9218,10 @@ globalThis.walkPast = (function() {
 
 /** generate the specified walkPast vignette for all slaves (for debugging purposes)
  * @param {string} fixedTarget
- * @returns {string}
+ * @returns {DocumentFragment}
  */
 globalThis.walkPastAll = function(fixedTarget) {
-	return V.slaves.map((s) => {
-		const wp = walkPast(s, fixedTarget);
-		return wp ? `<p>${wp}</p>` : ``;
-	}).join('');
+	return App.UI.DOM.combineNodes(...V.slaves.map(
+		(s) => App.UI.DOM.makeElement("div", walkPast(s, fixedTarget))
+	));
 };
diff --git a/src/js/main.js b/src/js/main.js
index 0a96871e591df887d8f751d5387f8df04d550723..af842e9b7c07bad7b3ac4bb266e7e42695f8f51b 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -212,6 +212,17 @@ App.MainView.useGuard = function() {
 	return outerDiv;
 };
 
+App.MainView.walkPast = function() {
+	const outerDiv = document.createElement("div");
+
+	const slave = V.slaves.filter(s => ![Job.BODYGUARD, Job.FUCKTOY].includes(s.assignment)).random();
+	if (slave) {
+		App.UI.DOM.appendNewElement("span", outerDiv, walkPast(slave), "scene-intro");
+	}
+
+	return outerDiv;
+};
+
 App.MainView.full = function() {
 	function mainMenu() {
 		const div = document.createElement("div");
@@ -283,6 +294,7 @@ App.MainView.full = function() {
 	if (V.useSlaveSummaryOverviewTab === 0) {
 		fragment.append(App.MainView.useGuard());
 	}
+	fragment.append(App.MainView.walkPast());
 
 	return fragment;
 };
diff --git a/src/uncategorized/main.tw b/src/uncategorized/main.tw
index 7eb8508310d8c183d695d4fdd17a5eabb8d22833..c8f7fb34b21dab882b08c299c00c52a5eae39ca1 100644
--- a/src/uncategorized/main.tw
+++ b/src/uncategorized/main.tw
@@ -31,12 +31,4 @@
 
 <<includeDOM App.MainView.full()>>
 
-<<set $activeSlave = $slaves.random()>>
-<<if $activeSlave && ($activeSlave.assignment != "please you") && ($activeSlave.assignment != "guard you")>>
-	<br>//<span id="walk"><<= walkPast($activeSlave)>></span>//
-<</if>>
-<<if ($debugMode == 1)>>
-	//| [[Show all walk past scenes|Walk Past List]]//
-<</if>>
-
 <<run App.UI.SlaveList.ScrollPosition.restore()>>
diff --git a/src/uncategorized/walkPastList.tw b/src/uncategorized/walkPastList.tw
index adc79014a67ec6b5ddc9f7e80dec35453b435af3..fece903eb53124d7c02d9829ea386e98ab0d45f3 100644
--- a/src/uncategorized/walkPastList.tw
+++ b/src/uncategorized/walkPastList.tw
@@ -10,42 +10,42 @@
 <h2>Choose target</h2>
 <<link "Lips">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FLips")>>
+	<<includeDOM walkPastAll("FLips")>>
 	<</replace>>
 <</link>><br>
 <<link "Boobs">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FBoobs")>>
+	<<includeDOM walkPastAll("FBoobs")>>
 	<</replace>>
 <</link>><br>
 <<link "Butt">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FButt")>>
+	<<includeDOM walkPastAll("FButt")>>
 	<</replace>>
 <</link>> |
 <<link "Anus">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FAnus")>>
+	<<includeDOM walkPastAll("FAnus")>>
 	<</replace>>
 <</link>> |
 <<link "Vagina">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FVagina")>>
+	<<includeDOM walkPastAll("FVagina")>>
 	<</replace>>
 <</link>> //or ass if they lack one//<br>
 <<link "Dick">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FDick")>>
+	<<includeDOM walkPastAll("FDick")>>
 	<</replace>>
 <</link>><br>
 <<link "Rival">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FRival")>>
+	<<includeDOM walkPastAll("FRival")>>
 	<</replace>>
 <</link>><br>
 <<link "Relation">>
 	<<replace "#wplist">>
-	<<print walkPastAll("FRelation")>>
+	<<includeDOM walkPastAll("FRelation")>>
 	<</replace>>
 <</link>>