diff --git a/src/005-passages/introPassages.js b/src/005-passages/introPassages.js
index cb38ab30ea9430b1124f2e67be38358cc16c5a8a..ea227a96396adf44ce73ea99752c7aad000eaa21 100644
--- a/src/005-passages/introPassages.js
+++ b/src/005-passages/introPassages.js
@@ -10,3 +10,5 @@ new App.DomPassage("Acquisition",
 );
 
 new App.DomPassage("Customize Slave Trade", () => { return App.Intro.CustomSlaveTrade(); });
+
+new App.DomPassage("Starting Girls", () => { return App.StartingGirls.passage(); });
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 1b93fc855b7b075448993a2e79efe51e45fb492a..b5b72936050afb2210d024184b77f366763953f7 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -54,7 +54,7 @@ App.StartingGirls.generate = function(params) {
  * @param {App.Entity.SlaveState} slave
  */
 App.StartingGirls.cleanup = function(slave) {
-	slave.actualAge = Math.clamp(slave.actualAge, V.minimumSlaveAge, V.retirementAge-1) || 18;
+	slave.actualAge = Math.clamp(slave.actualAge, V.minimumSlaveAge, V.retirementAge - 1) || 18;
 	slave.physicalAge = slave.actualAge;
 	slave.visualAge = slave.actualAge;
 	slave.ovaryAge = slave.actualAge;
@@ -67,7 +67,7 @@ App.StartingGirls.cleanup = function(slave) {
 	}
 
 	slave.height = Math.clamp(slave.height, 85, 274) || 140;
-	slave.boobs = Math.clamp(Math.trunc(slave.boobs/50)*50, 0, 50000) || 200;
+	slave.boobs = Math.clamp(Math.trunc(slave.boobs / 50) * 50, 0, 50000) || 200;
 	slave.hLength = Math.clamp(slave.hLength, 0, 500) || 40;
 
 	resetEyeColor(slave, "both");
@@ -104,7 +104,7 @@ App.StartingGirls.cleanup = function(slave) {
 		if (slave.pubertyXX < 1) {
 			slave.counter.birthsTotal = 0;
 		}
-		slave.counter.birthsTotal = Math.clamp(slave.counter.birthsTotal, 0, ((slave.actualAge-slave.pubertyAgeXX)*50));
+		slave.counter.birthsTotal = Math.clamp(slave.counter.birthsTotal, 0, ((slave.actualAge - slave.pubertyAgeXX) * 50));
 	}
 	if (slave.slaveName === "") {
 		slave.slaveName = "Nameless";
@@ -150,7 +150,7 @@ App.StartingGirls.applyCareerBonus = function(slave) {
 	}
 
 	if (V.applyCareerBonus) {
-		switch(V.PC.career) {
+		switch (V.PC.career) {
 			case "capitalist":
 			case "entrepreneur":
 			case "business kid":
@@ -879,7 +879,7 @@ App.StartingGirls.physical = function(slave) {
 			slave.bellyPreg = 0;
 			slave.pubertyXX = 0;
 			slave.pubertyAgeXX = V.fertilityAge;
-			slave.ovaries= 0;
+			slave.ovaries = 0;
 		})
 		.addValue("Virgin", 0, () => {
 			slave.preg = -1;
@@ -1437,3 +1437,72 @@ App.StartingGirls.skills = function(slave) {
 
 	return options.render();
 };
+
+/**
+ * @param {App.Entity.SlaveState}slave
+ * @returns {DocumentFragment}
+ */
+App.StartingGirls.finalize = function(slave) {
+	const el = new DocumentFragment();
+	const {him} = getPronouns(slave);
+	const cost = startingSlaveCost(slave);
+	if (V.cash >= cost) {
+		let r = [];
+		if (V.PC.career !== "engineer" && V.PC.career !== "construction" && V.PC.career !== "worksite helper") {
+			r.push(
+				App.UI.DOM.link(
+					"Add this slave",
+					() => {
+						V.applyCareerBonus = 1;
+					},
+					[],
+					"Commit Starting Girl"
+				)
+			);
+
+			r.push(`This will apply your <span class="springgreen">career bonus</span> to ${him}:`);
+			if (V.PC.career === "capitalist" || V.PC.career === "entrepreneur" || V.PC.career === "business kid") {
+				r.push(`one free level of <span class="cyan">prostitution skill.</span>`);
+			} else if (V.PC.career === "mercenary" || V.PC.career === "recruit" || V.PC.career === "child soldier") {
+				if (slave.devotion > 20) {
+					r.push(`<span class="mediumaquamarine">+10 trust.</span>`);
+				} else {
+					r.push(`<span class="gold">+10 fear.</span>`);
+				}
+			} else if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+				r.push(`<span class="hotpink">+10 devotion.</span>`);
+			} else if (V.PC.career === "medicine" || V.PC.career === "medical assistant" || V.PC.career === "nurse") {
+				r.push(`free <span class="lime">basic implants.</span>`);
+			} else if (V.PC.career === "celebrity" || V.PC.career === "rising star" || V.PC.career === "child star") {
+				r.push(`one free level of <span class="cyan">entertainment skill.</span>`);
+			} else if (V.PC.career === "escort" || V.PC.career === "prostitute" || V.PC.career === "child prostitute") {
+				r.push(`two free levels of <span class="cyan">sex skills,</span> one free level of <span class="cyan">prostitution skill,</span> and one free level of <span class="cyan">entertainment skill.</span>`);
+			} else if (V.PC.career === "servant" || V.PC.career === "handmaiden" || V.PC.career === "child servant") {
+				r.push(`<span class="mediumaquamarine">+10 trust</span> and <span class="hotpink">+10 devotion.</span>`);
+			} else if (V.PC.career === "gang" || V.PC.career === "hoodlum" || V.PC.career === "street urchin") {
+				r.push(`<span class="green">+5 health</span> and one free level of <span class="cyan">combat skill.</span>`);
+			} else if (V.PC.career === "wealth" || V.PC.career === "trust fund" || V.PC.career === "rich kid") {
+				r.push(`two free levels of <span class="cyan">sex skills.</span>`);
+			} else if (V.PC.career === "BlackHat" || V.PC.career === "hacker" || V.PC.career === "script kiddy") {
+				r.push(`one free level of <span class="cyan">intelligence.</span>`);
+			} else {
+				r.push(`<span class="hotpink">+10 devotion,</span> one free level of <span class="cyan">prostitution skill</span> and <span class="cyan">entertainment skill,</span> and two free levels of <span class="cyan">sex skills.</span>`);
+			}
+			App.Events.addNode(el, r, "div", "indent");
+		}
+		App.UI.DOM.appendNewElement("div", el,
+			App.UI.DOM.link(
+				(V.PC.career !== "engineer" && V.PC.career !== "construction" && V.PC.career !== "worksite helper") ? "Add this slave without career bonus" : "Add this slave",
+				() => {
+					V.applyCareerBonus = 0;
+				},
+				[],
+				"Commit Starting Girl"
+			),
+			"indent"
+		);
+	} else {
+		App.UI.DOM.appendNewElement("p", el, `Cannot afford the cost of ${cashFormat(cost)}`, "red");
+	}
+	return el;
+};
diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw
deleted file mode 100644
index 2e8f5704c14d297f37b4421f5da994398d8793d6..0000000000000000000000000000000000000000
--- a/src/npc/startingGirls/startingGirls.tw
+++ /dev/null
@@ -1,313 +0,0 @@
-:: Starting Girls [nobr]
-
-/* Lots of long lists here that will benefit from conversion to switch statements when turned to JS. */
-
-<style>
-.active {
-	background-color: grey;
-}
-</style>
-
-<p>
-	<<if $slaves.length == 0>>
-		You're no stranger to the Free Cities, which means you're no stranger to slavery. If you wish, you can bring slaves from your past life with you to your arcology. You can spend your cash reserves on slaves here, or bring it with you to start the game. Slaves created here will be much cheaper than if they were purchased on the market.
-		<<if ($PC.dick != 0) && ($PC.vagina != -1) && ($seeDicks != 0 || $makeDicks == 1)>>
-			Since you have both a penis and a vagina yourself, you've obviously had access to a source of advanced surgery and organ farming. @@.springgreen;Slaves get a smaller cost increase here for having both penises and vaginas, and for having both testicles and ovaries.@@
-		<</if>>
-		<<if $PC.career == "slaver" || $PC.career == "slave overseer" || $PC.career == "slave tender">>
-			Since you
-			<<if $PC.career == "slaver">>
-				personally saw to the capture, breaking and or training of
-			<<elseif $PC.career == "slave overseer">>
-				managed the slave pits that processed
-			<<elseif $PC.career == "slave tender">>
-				helped train
-			<</if>>
-			these slaves, @@.springgreen;they cost half of what they normally would have here.@@
-		<</if>>
-	<</if>>
-	<br>Current cash reserves can be found on the far left sidebar.
-	<<if $slaves.length == 1>>
-		<br>One slave is already committed.
-	<<elseif $slaves.length > 1>>
-		<br>$slaves.length slaves already committed.
-	<</if>>
-</p>
-
-<p>
-	<span id="headerLinks">
-		<span class="major-link">
-			<<link "Refresh" "Starting Girls">>	<</link>>
-		</span>
-
-		| <<link "Randomize career" "Starting Girls">>
-			<<set $activeSlave.career = randomCareer($activeSlave)>>
-		<</link>>
-
-		| <<link "Randomize name" "Starting Girls">>
-			<<run nationalityToName($activeSlave)>>
-			<<set $activeSlave.slaveName = $activeSlave.birthName>>
-		<</link>>
-
-		| <<link "Start over with a random slave" "Starting Girls">>
-			<<set $activeSlave = App.StartingGirls.generate()>>
-		<</link>>
-
-		| <<link "Start over by selecting an archetype">>
-			<<replace "#headerLinks">>
-				<div class="note">
-					Convenient combinations of slave attributes
-				</div>
-				<div class="indent">
-					<<link "Irish Rose" "Starting Girls">>
-						<<set $activeSlave = App.StartingGirls.generate({ nationality: "Irish", race: "white" })>>
-						<<set $activeSlave.eye.origColor = "green", $activeSlave.origSkin = "fair", $activeSlave.origHColor = "red", $activeSlave.markings = "heavily freckled">>
-					<</link>>
-					<span class="note">
-						A beautiful flower from the Emerald Isle
-					</span>
-				</div>
-
-				<div class="indent">
-					<<link "Cali Girl" "Starting Girls">>
-						<<set $activeSlave = App.StartingGirls.generate({ nationality: "American" })>>
-						<<set $activeSlave.eye.origColor = "blue", $activeSlave.skin = "sun tanned", $activeSlave.override_Skin = 1, $activeSlave.origHColor = "blonde", $activeSlave.markings = "none", $activeSlave.face = 95, $activeSlave.muscles = 20, $activeSlave.weight = -20, $activeSlave.height = Math.round(Height.forAge(190, $activeSlave))>>
-					<</link>>
-					<span class="note">
-						Tall, taut, and tan
-					</span>
-				</div>
-
-				<div class="indent">
-					<<link "Novice" "Starting Girls">>
-						<<set $activeSlave = App.StartingGirls.generate()>>
-						<<set $activeSlave.skill.anal = 0, $activeSlave.skill.oral = 0, $activeSlave.skill.vaginal = 0, $activeSlave.skill.whoring = 0, $activeSlave.skill.entertainment = 0, $activeSlave.skill.combat = 0, $activeSlave.actualAge = 18, $activeSlave.visualAge = 18, $activeSlave.physicalAge = 18, $activeSlave.fetishKnown = 0, $activeSlave.attrKnown = 0>>
-					<</link>>
-					<span class="note">
-						Train your own and save
-					</span>
-				</div>
-
-				<div class="indent">
-					<<link "Head Girl Prospect" "Starting Girls">>
-						<<set $activeSlave = App.StartingGirls.generate({ minAge: 36, maxAge: 44 })>>
-						<<set $activeSlave.career = App.Data.Careers.Leader.HG.random(), $activeSlave.intelligence = 70, $activeSlave.intelligenceImplant = 0>>
-					<</link>>
-					<span class="note">
-						Inexpensive potential to become a great right hand woman
-					</span>
-				</div>
-
-				<<if $seeExtreme != 0>>
-					<div class="indent">
-						<<link "Wellspring" "Starting Girls">>
-							<<set $activeSlave = App.StartingGirls.generate({ minAge: 18, maxAge: 18 })>>
-							<<set $activeSlave.skill.anal = 0, $activeSlave.skill.oral = 0, $activeSlave.skill.vaginal = 0, $activeSlave.skill.whoring = 0, $activeSlave.skill.entertainment = 0, $activeSlave.skill.combat = 0, $activeSlave.fetishKnown = 0, $activeSlave.attrKnown = 0, $activeSlave.health.condition = 10, $activeSlave.intelligence = -100, $activeSlave.intelligenceImplant = 0, $activeSlave.vagina = 3, $activeSlave.anus = 3, $activeSlave.ovaries = 1, $activeSlave.dick = 5, $activeSlave.balls = 5, $activeSlave.prostate = 1, $activeSlave.lactation = 2, $activeSlave.lactationDuration = 2, $activeSlave.nipples = "huge", $activeSlave.boobs = 10000>>
-						<</link>>
-						<span class="note">
-							Capable of producing all kinds of useful fluids
-						</span>
-					</div>
-
-					<div class="indent">
-						<<link "Onahole" "Starting Girls">>
-							<<set $activeSlave = App.StartingGirls.generate()>>
-							<<set $activeSlave.skill.anal = 0, $activeSlave.skill.oral = 0, $activeSlave.skill.vaginal = 0, $activeSlave.skill.whoring = 0, $activeSlave.skill.entertainment = 0, $activeSlave.skill.combat = 0, $activeSlave.fetish = "mindbroken", $activeSlave.voice = 0, $activeSlave.hears = 0>>
-							<<run removeLimbs($activeSlave, "all"), eyeSurgery($activeSlave, "both", "normal")>>
-						<</link>>
-						<span class="note">
-							A living cocksleeve
-						</span>
-					</div>
-				<</if>>
-
-				<div class="indent">
-					<<link "Back" "Starting Girls">>	<</link>>
-				</div>
-			<</replace>>
-		<</link>>
-
-		<<if !$showSGNationalities>>
-			| <<link "Start over by selecting a nationality" "Starting Girls">>
-				<<set $showSGNationalities = 1>>
-			<</link>>
-		<</if>>
-
-		| <<link "Take control of your arcology" "Acquisition">>
-			<<unset $showSGNationalities>>
-		<</link>>
-	</span>
-	<hr>
-</p>
-
-<<if $showSGNationalities>>
-	<p>
-		<h3>Start over by selecting a nationality:</h3>
-		<div>
-			<<for _sg = 0; _sg < setup.baseNationalities.length; _sg++>>
-				<<set _nation = setup.baseNationalities[_sg]>>
-				<<capture _nation>>
-				<<link _nation "Starting Girls">>
-					<<set $activeSlave = App.StartingGirls.generate({ nationality: _nation })>>
-				<</link>>
-				<</capture>>
-				<<if _sg < setup.baseNationalities.length-1>>
-					|
-				<</if>>
-			<</for>>
-		</div>
-		<div>
-			<<link "Hide" "Starting Girls">><<set $showSGNationalities = 0>><</link>>
-		</div>
-		<hr>
-	</p>
-<</if>>
-
-<<run App.UI.tabBar.handlePreSelectedTab($tabChoice.StartingGirls)>>
-
-<<if !$activeSlave>>
-	<<set $activeSlave = App.StartingGirls.generate()>>
-<</if>>
-
-<<run App.StartingGirls.cleanup($activeSlave)>>
-<<set _slaveCost = startingSlaveCost($activeSlave)>>
-
-<<if $activeSlave.father == -1>>
-	<<if $PC.dick == 0>>
-		<<set $activeSlave.father = 0>>
-	<<elseif ($PC.actualAge - $activeSlave.actualAge) < $minimumSlaveAge || (($PC.actualAge - $activeSlave.actualAge) < $potencyAge)>>
-		<<set $activeSlave.father = 0>>
-	<</if>>
-	<<if $saveImported == 1>>
-		<<set $activeSlave.father = 0>>
-	<</if>>
-<</if>>
-<<if $activeSlave.mother == -1>>
-	<<if $PC.vagina == -1>>
-		<<set $activeSlave.mother = 0>>
-	<<elseif (($PC.actualAge - $activeSlave.actualAge) < $minimumSlaveAge) || (($PC.actualAge - $activeSlave.actualAge) < $fertilityAge)>>
-		<<set $activeSlave.mother = 0>>
-	<</if>>
-	<<if $saveImported == 1>>
-		<<set $activeSlave.mother = 0>>
-	<</if>>
-<</if>>
-/* this block makes starting girls actually apply the slave origins, mostly since it just hates you and everything you do */
-<<if $originOverride != 1>>
-	<<run App.StartingGirls.applyPlayerOrigin($activeSlave)>>
-<</if>>
-
-<h2>You are customizing this slave:</h2> <<includeDOM App.Desc.longSlave(V.activeSlave, {market: "generic"})>>
-
-<div class="tab-bar">
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'profile')" id="tab profile">Profile</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Physical')" id="tab Physical">Physical</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Mental')" id="tab Mental">Mental</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Skills')" id="tab Skills">Skills</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Family', App.StartingGirls.uncommittedFamilyTree(V.activeSlave))" id="tab Family">Family</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'body-mods')" id="tab body-mods">Body Mods</button>
-	<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'salon')" id="tab salon">Salon</button>
-	<<if $cash >= _slaveCost>>
-		<button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'assignRemove')" id="tab assignRemove">Finalize</button>
-	<<else>>
-		<button class="tab-links, show-warning" onclick="App.UI.tabBar.openTab(event, 'assignRemove')" id="tab assignRemove">Finalize</button>
-	<</if>>
-</div>
-
-<<run App.Utils.setLocalPronouns($activeSlave)>>
-
-<div id="profile" class="tab-content">
-	<div class="content">
-		<<includeDOM App.StartingGirls.profile($activeSlave)>>
-	</div>
-</div>
-
-<div id="Physical" class="tab-content">
-	<div class="content">
-		<<includeDOM App.StartingGirls.physical($activeSlave)>>
-	</div>
-</div>
-
-<div id="Mental" class="tab-content">
-	<div class="content">
-		<<includeDOM App.StartingGirls.mental($activeSlave)>>
-	</div>
-</div>
-
-<div id="Skills" class="tab-content">
-	<div class="content">
-		<<includeDOM App.StartingGirls.skills($activeSlave)>>
-	</div>
-</div>
-
-<div id="Family" class="tab-content">
-	<div class="content">
-		<<includeDOM App.Intro.editFamily($activeSlave)>>
-	</div>
-</div>
-
-<div id="body-mods" class="tab-content">
-	<div class="content">
-		<<includeDOM App.UI.bodyModification($activeSlave, true)>>
-	</div>
-</div>
-
-<div id="salon" class="tab-content">
-	<div class="content">
-		<<includeDOM App.UI.salon($activeSlave, true)>>
-	</div>
-</div>
-
-<div id="assignRemove" class="tab-content">
-	<div class="content">
-
-	<<if $cash >= _slaveCost>>
-		<<if $PC.career != "engineer" && $PC.career != "construction" && $PC.career != "worksite helper">>
-			<div class="indent">
-				<<link "Add this slave">>
-					<<set $applyCareerBonus = 1>>
-					<<goto "Commit Starting Girl">>
-				<</link>>
-				<span class="note">
-					This will apply your @@.springgreen;career bonus@@ to $him:
-					<<if $PC.career == "capitalist" || $PC.career == "entrepreneur" || $PC.career == "business kid">>
-						one free level of @@.cyan;prostitution skill.@@
-					<<elseif $PC.career == "mercenary" || $PC.career == "recruit" || $PC.career == "child soldier">>
-						<<if $activeSlave.devotion > 20>>
-							@@.mediumaquamarine;+10 trust.@@
-						<<else>>
-							@@.gold;+10 fear.@@
-						<</if>>
-					<<elseif $PC.career == "slaver" || $PC.career == "slave overseer" || $PC.career == "slave tender">>
-						@@.hotpink;+10 devotion.@@
-					<<elseif $PC.career == "medicine" || $PC.career == "medical assistant" || $PC.career == "nurse">>
-						free @@.lime;basic implants.@@
-					<<elseif $PC.career == "celebrity" || $PC.career == "rising star" || $PC.career == "child star">>
-						one free level of @@.cyan;entertainment skill.@@
-					<<elseif $PC.career == "escort" || $PC.career == "prostitute" || $PC.career == "child prostitute">>
-						two free levels of @@.cyan;sex skills,@@ one free level of @@.cyan;prostitution skill,@@ and one free level of @@.cyan;entertainment skill.@@
-					<<elseif $PC.career == "servant" || $PC.career == "handmaiden" || $PC.career == "child servant">>
-						@@.mediumaquamarine;+10 trust@@ and @@.hotpink;+10 devotion.@@
-					<<elseif $PC.career == "gang" || $PC.career == "hoodlum" || $PC.career == "street urchin">>
-						@@.green;+5 health@@ and one free level of @@.cyan;combat skill.@@
-					<<elseif $PC.career == "wealth" || $PC.career == "trust fund" || $PC.career == "rich kid">>
-						two free levels of @@.cyan;sex skills.@@
-					<<elseif $PC.career == "BlackHat" || $PC.career == "hacker" || $PC.career == "script kiddy">>
-						one free level of @@.cyan;intelligence.@@
-					<<else>>
-						@@.hotpink;+10 devotion,@@ one free level of @@.cyan;prostitution skill@@ and @@.cyan;entertainment skill,@@ and two free levels of @@.cyan;sex skills.@@
-					<</if>>
-				</span>
-			</div>
-		<</if>>
-		<<set _text = ($PC.career != "engineer" && $PC.career != "construction" && $PC.career != "worksite helper") ? "Add this slave without career bonus" : "Add this slave">>
-		<div class="indent">
-			<<link _text>>
-				<<set $applyCareerBonus = 0>>
-				<<goto "Commit Starting Girl">>
-			<</link>>
-		</div>
-	<</if>>
-
-	</div>
-</div>
diff --git a/src/npc/startingGirls/startingGirlsPassage.js b/src/npc/startingGirls/startingGirlsPassage.js
new file mode 100644
index 0000000000000000000000000000000000000000..f7116d7c87eec5de24a95fe619c4d813479df25d
--- /dev/null
+++ b/src/npc/startingGirls/startingGirlsPassage.js
@@ -0,0 +1,319 @@
+App.StartingGirls.passage = function() {
+	if (!V.activeSlave) {
+		V.activeSlave = App.StartingGirls.generate();
+	}
+	const el = new DocumentFragment();
+	let r = [];
+	let linkArray = [];
+	if (V.slaves.length === 0) {
+		r.push(`You're no stranger to the Free Cities, which means you're no stranger to slavery. If you wish, you can bring slaves from your past life with you to your arcology. You can spend your cash reserves on slaves here, or bring it with you to start the game. Slaves created here will be much cheaper than if they were purchased on the market.`);
+		if (V.PC.dick !== 0 && V.PC.vagina !== -1 && (V.seeDicks !== 0 || V.makeDicks === 1)) {
+			r.push(`Since you have both a penis and a vagina yourself, you've obviously had access to a source of advanced surgery and organ farming. <span class="springgreen">Slaves get a smaller cost increase here for having both penises and vaginas, and for having both testicles and ovaries.</span>`);
+		}
+		if (V.PC.career === "slaver" || V.PC.career === "slave overseer" || V.PC.career === "slave tender") {
+			r.push(`Since you`);
+			if (V.PC.career === "slaver") {
+				r.push(`personally saw to the capture, breaking and or training of`);
+			} else if (V.PC.career === "slave overseer") {
+				r.push(`managed the slave pits that processed`);
+			} else if (V.PC.career === "slave tender") {
+				r.push(`helped train`);
+			}
+			r.push(`these slaves, <span class="springgreen">they cost half of what they normally would have here.</span>`);
+		}
+	}
+	App.UI.DOM.makeElement("div", "Current cash reserves can be found on the far left sidebar.");
+	if (V.slaves.length === 1) {
+		App.UI.DOM.makeElement("div", "One slave is already committed.");
+	} else if (V.slaves.length > 1) {
+		App.UI.DOM.makeElement("div", `${V.slaves.length} slaves already committed.`);
+	}
+	App.Events.addNode(el, r, "p");
+
+	const headerLinks = App.UI.DOM.appendNewElement("div", el);
+	linkArray.push(
+		App.UI.DOM.makeElement(
+			"span",
+			App.UI.DOM.passageLink("Refresh", "Starting Girls"),
+			"major-link"
+		)
+	);
+	linkArray.push(
+		App.UI.DOM.link(
+			"Randomize career",
+			() => {
+				V.activeSlave.career = randomCareer(V.activeSlave);
+			},
+			[],
+			"Starting Girls"
+		)
+	);
+
+	linkArray.push(
+		App.UI.DOM.link(
+			"Randomize name",
+			() => {
+				nationalityToName(V.activeSlave);
+				V.activeSlave.slaveName = V.activeSlave.birthName;
+			},
+			[],
+			"Starting Girls"
+		)
+	);
+
+	linkArray.push(
+		App.UI.DOM.link(
+			"Start over with a random slave",
+			() => {
+				V.activeSlave = App.StartingGirls.generate();
+			},
+			[],
+			"Starting Girls"
+		)
+	);
+
+	linkArray.push(
+		App.UI.DOM.link(
+			"Start over by selecting an archetype",
+			() => {
+				const el = new DocumentFragment();
+				App.UI.DOM.appendNewElement("div", el, "Convenient combinations of slave attributes", "note");
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+					"Irish Rose",
+					() => {
+						V.activeSlave = App.StartingGirls.generate({nationality: "Irish", race: "white"});
+						V.activeSlave.eye.origColor = "green";
+						V.activeSlave.origSkin = "fair";
+						V.activeSlave.origHColor = "red";
+						V.activeSlave.markings = "heavily freckled";
+					},
+					[],
+					"Starting Girls"
+				), "indent")
+					.append(App.UI.DOM.makeElement("span", " A beautiful flower from the Emerald Isle", "note"));
+
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+					"Cali Girl",
+					() => {
+						V.activeSlave = App.StartingGirls.generate({nationality: "American"});
+						V.activeSlave.eye.origColor = "blue";
+						V.activeSlave.skin = "sun tanned";
+						V.activeSlave.override_Skin = 1;
+						V.activeSlave.origHColor = "blonde";
+						V.activeSlave.markings = "none";
+						V.activeSlave.face = 95;
+						V.activeSlave.muscles = 20;
+						V.activeSlave.weight = -20;
+						V.activeSlave.height = Math.round(Height.forAge(190, V.activeSlave));
+					},
+					[],
+					"Starting Girls"
+				), "indent")
+					.append(App.UI.DOM.makeElement("span", " Tall, taut, and tan", "note"));
+
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+					"Novice",
+					() => {
+						V.activeSlave = App.StartingGirls.generate();
+						V.activeSlave.skill.anal = 0;
+						V.activeSlave.skill.oral = 0;
+						V.activeSlave.skill.vaginal = 0;
+						V.activeSlave.skill.whoring = 0;
+						V.activeSlave.skill.entertainment = 0;
+						V.activeSlave.skill.combat = 0;
+						V.activeSlave.actualAge = 18;
+						V.activeSlave.visualAge = 18;
+						V.activeSlave.physicalAge = 18;
+						V.activeSlave.fetishKnown = 0;
+						V.activeSlave.attrKnown = 0;
+					},
+					[],
+					"Starting Girls"
+				), "indent")
+					.append(App.UI.DOM.makeElement("span", " Train your own and save", "note"));
+
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+					"Head Girl Prospect",
+					() => {
+						V.activeSlave = App.StartingGirls.generate({minAge: 36, maxAge: 44});
+						V.activeSlave.career = App.Data.Careers.Leader.HG.random();
+						V.activeSlave.intelligence = 70;
+						V.activeSlave.intelligenceImplant = 0;
+					},
+					[],
+					"Starting Girls"
+				), "indent")
+					.append(App.UI.DOM.makeElement("span", " Inexpensive potential to become a great right hand woman", "note"));
+
+
+				if (V.seeExtreme !== 0) {
+					App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+						"Wellspring",
+						() => {
+							V.activeSlave = App.StartingGirls.generate({minAge: 18, maxAge: 18});
+							V.activeSlave.skill.anal = 0;
+							V.activeSlave.skill.oral = 0;
+							V.activeSlave.skill.vaginal = 0;
+							V.activeSlave.skill.whoring = 0;
+							V.activeSlave.skill.entertainment = 0;
+							V.activeSlave.skill.combat = 0;
+							V.activeSlave.fetishKnown = 0;
+							V.activeSlave.attrKnown = 0;
+							V.activeSlave.health.condition = 10;
+							V.activeSlave.intelligence = -100;
+							V.activeSlave.intelligenceImplant = 0;
+							V.activeSlave.vagina = 3;
+							V.activeSlave.anus = 3;
+							V.activeSlave.ovaries = 1;
+							V.activeSlave.dick = 5;
+							V.activeSlave.balls = 5;
+							V.activeSlave.prostate = 1;
+							V.activeSlave.lactation = 2;
+							V.activeSlave.lactationDuration = 2;
+							V.activeSlave.nipples = "huge";
+							V.activeSlave.boobs = 10000;
+						},
+						[],
+						"Starting Girls"
+					), "indent")
+						.append(App.UI.DOM.makeElement("span", " Capable of producing all kinds of useful fluids", "note"));
+
+					App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link(
+						"Onahole",
+						() => {
+							V.activeSlave = App.StartingGirls.generate();
+							V.activeSlave.skill.anal = 0;
+							V.activeSlave.skill.oral = 0;
+							V.activeSlave.skill.vaginal = 0;
+							V.activeSlave.skill.whoring = 0;
+							V.activeSlave.skill.entertainment = 0;
+							V.activeSlave.skill.combat = 0;
+							V.activeSlave.fetish = "mindbroken";
+							V.activeSlave.voice = 0;
+							V.activeSlave.hears = 0;
+							removeLimbs(V.activeSlave, "all");
+							eyeSurgery(V.activeSlave, "both", "normal");
+						},
+						[],
+						"Starting Girls"
+					), "indent")
+						.append(App.UI.DOM.makeElement("span", " A living cocksleeve", "note"));
+				}
+
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.passageLink("Back", "Starting Girls"), "indent");
+				jQuery(headerLinks).empty().append(el);
+			}
+		)
+	);
+
+	linkArray.push(
+		App.UI.DOM.link(
+			"Start over by selecting a nationality",
+			() => {
+				const el = new DocumentFragment();
+				const linkArray = [];
+				App.UI.DOM.appendNewElement("h3", el, "Start over by selecting a nationality:");
+				for (const nation of App.Data.misc.baseNationalities) {
+					linkArray.push(
+						App.UI.DOM.link(
+							nation,
+							() => {
+								V.activeSlave = App.StartingGirls.generate({nationality: nation});
+							},
+							[],
+							"Starting Girls"
+						)
+					);
+				}
+				el.append(App.UI.DOM.generateLinksStrip(linkArray));
+				App.UI.DOM.appendNewElement("div", el, App.UI.DOM.passageLink("Back", "Starting Girls"));
+				jQuery(headerLinks).empty().append(el);
+			}
+		)
+	);
+
+	linkArray.push(App.UI.DOM.passageLink("Take control of your arcology", "Acquisition"));
+	headerLinks.append(App.UI.DOM.generateLinksStrip(linkArray));
+	el.append(headerLinks);
+	App.UI.DOM.appendNewElement("hr", el);
+
+	App.UI.tabBar.handlePreSelectedTab(V.tabChoice.StartingGirls);
+
+	App.StartingGirls.cleanup(V.activeSlave);
+
+	if (V.activeSlave.father === -1) {
+		if (V.PC.dick === 0) {
+			V.activeSlave.father = 0;
+		} else if ((V.PC.actualAge - V.activeSlave.actualAge) < V.minimumSlaveAge || ((V.PC.actualAge - V.activeSlave.actualAge) < V.potencyAge)) {
+			V.activeSlave.father = 0;
+		}
+		if (V.saveImported === 1) {
+			V.activeSlave.father = 0;
+		}
+	}
+	if (V.activeSlave.mother === -1) {
+		if (V.PC.vagina === -1) {
+			V.activeSlave.mother = 0;
+		} else if (((V.PC.actualAge - V.activeSlave.actualAge) < V.minimumSlaveAge) || ((V.PC.actualAge - V.activeSlave.actualAge) < V.fertilityAge)) {
+			V.activeSlave.mother = 0;
+		}
+		if (V.saveImported === 1) {
+			V.activeSlave.mother = 0;
+		}
+	}
+	/* this block makes starting girls actually apply the slave origins, mostly since it just hates you and everything you do */
+	if (V.originOverride !== 1) {
+		App.StartingGirls.applyPlayerOrigin(V.activeSlave);
+	}
+
+	App.UI.DOM.appendNewElement("h2", el, "You are customizing this slave:");
+	el.append(App.Desc.longSlave(V.activeSlave, {market: "generic"}));
+
+	// TODO: move me
+	/**
+	 *
+	 * @param {string} id
+	 * @param {Node} element
+	 * @returns {HTMLSpanElement}
+	 */
+	function makeSpanIded(id, element) {
+		const span = document.createElement("span");
+		span.id = id;
+		span.append(element);
+		return span;
+	}
+
+	const tabCaptions = {
+		"profile": 'Profile',
+		"physical": 'Physical',
+		"mental": 'Mental',
+		"skills": 'Skills',
+		"family": 'Family',
+		"bodyMods": 'Body Mods',
+		"salon": 'Salon',
+		"finalize": 'Finalize',
+	};
+
+	const tabBar = App.UI.DOM.appendNewElement("div", el, '', "tab-bar");
+	tabBar.append(
+		App.UI.tabBar.tabButton('profile', tabCaptions.profile),
+		App.UI.tabBar.tabButton('physical', tabCaptions.physical),
+		App.UI.tabBar.tabButton('mental', tabCaptions.mental),
+		App.UI.tabBar.tabButton('skills', tabCaptions.skills),
+		App.UI.tabBar.tabButton('family', tabCaptions.family),
+		App.UI.tabBar.tabButton('body-mods', tabCaptions.bodyMods),
+		App.UI.tabBar.tabButton('salon', tabCaptions.salon),
+		App.UI.tabBar.tabButton('finalize', tabCaptions.finalize),
+	);
+
+	el.append(App.UI.tabBar.makeTab('profile', makeSpanIded("content-profile", App.StartingGirls.profile(V.activeSlave))));
+	el.append(App.UI.tabBar.makeTab('physical', makeSpanIded("content-physical", App.StartingGirls.physical(V.activeSlave))));
+	el.append(App.UI.tabBar.makeTab('mental', makeSpanIded("content-mental", App.StartingGirls.mental(V.activeSlave))));
+	el.append(App.UI.tabBar.makeTab('skills', makeSpanIded("content-skills", App.StartingGirls.skills(V.activeSlave))));
+	el.append(App.UI.tabBar.makeTab('family', makeSpanIded("content-family", App.Intro.editFamily(V.activeSlave))));
+	el.append(App.UI.tabBar.makeTab('body-mods', makeSpanIded("content-body-mods", App.UI.bodyModification(V.activeSlave, true))));
+	el.append(App.UI.tabBar.makeTab('salon', makeSpanIded("content-salon", App.UI.salon(V.activeSlave, true))));
+	el.append(App.UI.tabBar.makeTab('finalize', makeSpanIded("content-finalize", App.StartingGirls.finalize(V.activeSlave))));
+
+	return el;
+};