diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
index f95bbd354db05c02ced5649b44b673f26d1b2e74..6141ced53d9bf02b955a9cb84d686eb01cbfaffc 100644
--- a/js/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -49,6 +49,7 @@ App.Interact = {};
 App.Intro = {};
 App.Neighbor = {};
 App.MainView = {};
+App.Markets = {};
 App.Medicine = {};
 App.Medicine.Modification = {};
 App.Medicine.Modification.Brands = {};
diff --git a/src/facilities/nursery/utils/nurseryUtils.js b/src/facilities/nursery/utils/nurseryUtils.js
index 349b826e1e01327db973f64aaf4d54df83b2f170..ad6acc9873ad10128595d225fc92b653529313d8 100644
--- a/src/facilities/nursery/utils/nurseryUtils.js
+++ b/src/facilities/nursery/utils/nurseryUtils.js
@@ -51,7 +51,7 @@ App.Facilities.Nursery.childList = function childList() {
 				list.appendChild(document.createElement("br"));
 
 				r.push(`${He} is ready to leave ${V.nurseryName} and ${child.targetLocation === "slavery" ? `join your ménage` : `become a free citizen`}. `);
-				$(list).append(App.UI.DOM.passageLink(targetText, "Nursery Retrieval Workaround", V.readySlave = child));
+				$(list).append(App.UI.DOM.passageLink(targetText, "Nursery Retrieval Workaround", () => { V.readySlave = child; }));
 			} else {
 				list.appendChild(document.createElement("br"));
 
diff --git a/src/markets/specialSlave.js b/src/markets/specialSlave.js
new file mode 100644
index 0000000000000000000000000000000000000000..6122f265c5f36c7cf80b4aa8cf0137db77510821
--- /dev/null
+++ b/src/markets/specialSlave.js
@@ -0,0 +1,115 @@
+/**
+ * Displays the UI for special/hero slave market, slaves that are from the /d/ databases.
+ * @returns {Node}
+ */
+App.Markets.specialSlave = function() {
+	const el = document.createElement("p");
+	let p;
+	const heroSlaves = App.Utils.buildHeroArray();
+	let slave;
+	let slaveCost;
+	let selectedID;
+
+	// Element to show the entire catalog when selected, or a blurb for a random slave
+	p = document.createElement("p");
+	p.id = "complete-catalog";
+	p.append(getRandomSlave());
+	p.append(
+		App.UI.DOM.link(
+			`Pay to access complete catalog of slaves`,
+			() => {
+				cashX(-1000, "personalBusiness");
+				jQuery("#complete-catalog").empty().append(catalog());
+			}
+		)
+	);
+	App.UI.DOM.appendNewElement("span", p, ` Costs ${cashFormat(1000)}`, "note");
+	el.append(p);
+
+	// The slave chosen, randomly or otherwise
+	p = document.createElement("p");
+	p.id = "show-slave";
+	if (heroSlaves.length !== 0) {
+		p.append(showSlave());
+	}
+	el.append(p);
+
+	// Credits at the end
+	App.UI.DOM.appendNewElement("span", el, `Best regards to /d/, whose fine denizens came up with most of the slaves in the "previously owned" database.`, "note");
+	return el;
+
+	function getRandomSlave() {
+		const el = new DocumentFragment();
+		if (heroSlaves.length === 0) {
+			App.UI.DOM.appendNewElement("p", el, `Unfortunately, the catalog is empty.`);
+		} else {
+			slave = heroSlaves.random();
+			selectedID = slave.ID;
+			slave = App.Utils.getHeroSlave(slave);
+			const {his} = getPronouns(slave);
+			App.UI.DOM.appendNewElement("p", el, `You review a piece of merchandise via video call, making a few lewd demands to gauge ${his} obedience. The background of the video feed is luxurious and plush; somewhere offscreen someone is moaning rapturously.`, `scene-intro`);
+		}
+		return el;
+	}
+
+	function catalog() {
+		const el = new DocumentFragment();
+		const linkArray = [];
+		App.UI.DOM.appendNewElement("p", el, `This is the complete catalog of slaves that you can acquire from other slaveowners. Most of these slaves are not for sale, so persuading their owners to part with them will be extremely expensive.`, "scene-intro");
+
+		for (const hero of heroSlaves) {
+			if (hero.ID === selectedID) {
+				linkArray.push(
+					App.UI.DOM.disabledLink(hero.slaveName, ["You are currently examining this slave"])
+				);
+			} else {
+				linkArray.push(
+					App.UI.DOM.link(
+						hero.slaveName,
+						() => {
+							slave = App.Utils.getHeroSlave(hero);
+							selectedID = hero.ID;
+							refresh();
+						})
+				);
+			}
+		}
+		App.UI.DOM.appendNewElement("p", el, App.UI.DOM.generateLinksStrip(linkArray));
+
+		return el;
+
+		function refresh() {
+			jQuery("#complete-catalog").empty().append(catalog());
+			jQuery("#show-slave").empty().append(showSlave());
+		}
+	}
+
+	function showSlave() {
+		const el = new DocumentFragment();
+		let p;
+		const {his} = getPronouns(slave);
+		slaveCost = heroSlaveCost(slave, 20000);
+		App.UI.DOM.appendNewElement("p", el, App.Desc.longSlave(slave, {market: "generic"}));
+
+		p = document.createElement("p");
+		p.append(`The offered price is ${cashFormat(slaveCost)}. `);
+		p.append(
+			App.UI.DOM.link(
+				`Buy ${his} slave contract`,
+				() => {
+					slave.weekAcquired = V.week;
+					V.nextButton = "Continue";
+					V.nextLink = "AS Dump";
+					V.returnTo = "Main";
+					V.specialSlave = 1;
+					cashX(forceNeg(slaveCost), "slaveTransfer", slave);
+					V.activeSlave = slave;
+				},
+				[],
+				"New Slave Intro"
+			)
+		);
+		el.append(p);
+		return el;
+	}
+};
diff --git a/src/markets/specialSlave.tw b/src/markets/specialSlave.tw
new file mode 100644
index 0000000000000000000000000000000000000000..e0edf91dd3b5e90af440b0eb7a58d1d5e4710885
--- /dev/null
+++ b/src/markets/specialSlave.tw
@@ -0,0 +1,5 @@
+:: Special Slave [nobr]
+
+<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $encyclopedia = "Direct Sales">>
+
+<<includeDOM App.Markets.specialSlave()>>
diff --git a/src/npc/descriptions/name.js b/src/npc/descriptions/name.js
index 81e195237231ec0bf4b9129ef2dbc5812f0cc0d7..7afd2ff13395d1d0d587c903580ff9bd711a245a 100644
--- a/src/npc/descriptions/name.js
+++ b/src/npc/descriptions/name.js
@@ -65,8 +65,7 @@ App.Desc.name = function(slave) {
 				} else if (slave.slaveSurname !== slave.birthSurname) {
 					r.push(`${slave.birthSurname}.`);
 				}
-			}
-			if (slave.slaveSurname === 0) {
+			} if (slave.slaveSurname === 0) {
 				r.push(`${He} has no surname as a slave, which ${he}`);
 				if (slave.devotion > 95) {
 					r.push(`loves.`);
diff --git a/src/npc/generate/heroCreator.js b/src/npc/generate/heroCreator.js
index b1df47a7b588812bbdd3daf9c9ee1a7dee88695d..0da21a4a1f8171fac4ac74e3f9108496a26859d4 100644
--- a/src/npc/generate/heroCreator.js
+++ b/src/npc/generate/heroCreator.js
@@ -101,11 +101,6 @@ App.Utils.getHeroSlave = function(heroSlave) {
 	// WombInit(heroSlave);
 	const newSlave = BaseSlave();
 	deepAssign(newSlave, heroSlave);
-
-	// Fix names, prevent "undefined" from being overwritten by 0
-	newSlave.slaveName = heroSlave.slaveName;
-	newSlave.slaveSurname = heroSlave.slaveSurname;
-
 	V.heroSlaveID = heroSlave.ID;
 	newSlave.ID = generateSlaveID();
 	repairLimbs(newSlave);
diff --git a/src/uncategorized/completeCatalog.js b/src/uncategorized/completeCatalog.js
deleted file mode 100644
index d6b03269a1721b5193de62a734cc07325e11a646..0000000000000000000000000000000000000000
--- a/src/uncategorized/completeCatalog.js
+++ /dev/null
@@ -1,65 +0,0 @@
-App.UI.completeCatalog = function() {
-	const p = document.createElement("p");
-	let slave = V.activeSlave;
-	let selectedID = slave.ID;
-	p.id = "complete-catalog";
-	p.append(buildCatalog());
-	return p;
-
-	function buildCatalog() {
-		const frag = new DocumentFragment();
-		const heroSlaves = App.Utils.buildHeroArray();
-		const slaveCost = heroSlaveCost(slave, 40000);
-		const linkArray = [];
-		let p;
-		const {his} = getPronouns(slave);
-
-		App.UI.DOM.appendNewElement("p", frag, `This is the complete catalog of slaves that you can acquire from other slaveowners. Most of these slaves are not for sale, so persuading their owners to part with them will be extremely expensive.`, "scene-intro");
-
-		for (const hero of heroSlaves) {
-			if (hero.ID === selectedID) {
-				linkArray.push(
-					App.UI.DOM.disabledLink(hero.slaveName, ["You are currently examining this slave"])
-				);
-			} else {
-				linkArray.push(
-					App.UI.DOM.link(
-						hero.slaveName,
-						() => {
-							slave = App.Utils.getHeroSlave(hero);
-							selectedID = hero.ID;
-							refresh();
-						})
-				);
-			}
-		}
-		App.UI.DOM.appendNewElement("p", frag, App.UI.DOM.generateLinksStrip(linkArray));
-
-		App.UI.DOM.appendNewElement("p", frag, App.Desc.longSlave(slave, {market: "generic"}));
-
-		p = document.createElement("p");
-		p.append(`The offered price is ${cashFormat(slaveCost)}. `);
-		p.append(
-			App.UI.DOM.link(
-				`Buy ${his} slave contract`,
-				() =>{
-					slave.weekAcquired = V.week;
-					V.nextButton = "Continue";
-					V.nextLink = "AS Dump";
-					V.returnTo = "Main";
-					V.specialSlave = 1;
-					cashX(forceNeg(slaveCost), "slaveTransfer", slave);
-					V.activeSlave = slave;
-				},
-				[],
-				"New Slave Intro"
-			)
-		);
-		frag.append(p);
-		return frag;
-	}
-
-	function refresh() {
-		jQuery("#complete-catalog").empty().append(buildCatalog());
-	}
-};
diff --git a/src/uncategorized/completeCatalog.tw b/src/uncategorized/completeCatalog.tw
deleted file mode 100644
index e33196d1cb44c951456e08a7b1bac650792aa4b2..0000000000000000000000000000000000000000
--- a/src/uncategorized/completeCatalog.tw
+++ /dev/null
@@ -1,5 +0,0 @@
-:: Complete Catalog [nobr]
-
-<<set $nextButton = "Back to Main", $nextLink = "Main", $returnTo = "Main">>
-
-<<includeDOM App.UI.completeCatalog()>>
diff --git a/src/uncategorized/specialSlave.tw b/src/uncategorized/specialSlave.tw
deleted file mode 100644
index 5ba1d97e47eaa0207214d3a0975b7bb4c1b0018a..0000000000000000000000000000000000000000
--- a/src/uncategorized/specialSlave.tw
+++ /dev/null
@@ -1,36 +0,0 @@
-:: Special Slave [nobr]
-
-<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $encyclopedia = "Direct Sales">>
-
-<<set _heroSlaves = App.Utils.buildHeroArray()>>
-
-<<if _heroSlaves.length == 0>>
-	Unfortunately, the catalog is empty.
-<<else>>
-
-	<<run slaveSortMinor(_heroSlaves)>>
-	<<set $activeSlave = App.Utils.getHeroSlave(_heroSlaves.random())>>
-	<<set _slaveCost = heroSlaveCost($activeSlave, 20000)>>
-	<<setLocalPronouns $activeSlave>>
-
-	You review a piece of merchandise via video call, making a few lewd demands to gauge $his obedience. The background of the video feed is luxurious and plush; somewhere offscreen someone is moaning rapturously.
-
-	<br><br>
-
-	The offered price is <<print cashFormat(_slaveCost)>>.
-
-	[["Buy " + $his + " slave contract"|New Slave Intro][cashX(forceNeg(_slaveCost), "slaveTransfer", $activeSlave),$nextButton = "Continue",$nextLink = "AS Dump",$returnTo = "Main",$specialSlave = 1]]
-
-	<br><br>
-
-	[[Pay to access complete catalog of slaves|Complete Catalog][cashX(-1000, "personalBusiness")]] //Costs <<print cashFormat(1000)>>.//
-
-	<br><br>
-
-	//Best regards to /d/, whose fine denizens came up with most of the slaves in the "previously owned" database.//
-
-	<br><br>
-
-	<<includeDOM App.Desc.longSlave(V.activeSlave, {market: "generic"})>>
-
-<</if>>