diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 2e751af48116be9ccbe112d963c86a23788acd3a..02549edcb462cd9411f44e556153722acf5b51d7 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -584,9 +584,6 @@ App.Data.resetOnNGPlus = {
 	independenceDay: 0,
 	invasionVictory: 0,
 	daughtersVictory: 0,
-	startingGirlCopied: 0,
-	startingGirlRelation: 0,
-	createRelatedSlave: 0,
 
 	dormitory: 20,
 	dormitoryPopulation: 0,
diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 443245cab40d35fdf0d9db577e6925db32b0b014..ec236ea84d327d62b8f4d99a82eb739caf2df4b6 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -1826,6 +1826,28 @@ window.retirementReady = function RetirementReady(slave) {
 	return false;
 };
 
+/** advances the age of a slave by one year, incurring all aging side effects
+ * @param {App.Entity.SlaveState} slave
+ * @param {bool} [forceDevelopment=false]
+ */
+window.ageSlave = function ageSlave(slave, forceDevelopment=false) {
+	slave.physicalAge++;
+	slave.actualAge++;
+	if (slave.geneMods.NCS === 0) {
+		slave.visualAge++;
+		slave.ovaryAge += either(0.8, 0.9, 0.9, 1.0, 1.0, 1.0, 1.1);
+	} else {
+		/* Induced NCS completely takes over visual aging. Additionally, because of the neoteny aspects of NCS, ovaries don't age quite as fast. */
+		slave.ovaryAge += either(0.5, 0.6, 0.7, 0.7, 0.8, 0.9, 1.0);
+	}
+	if (slave.broodmother === 1) {
+		slave.ovaryAge += 0.2;
+	}
+	if (slave.physicalAge <= 18 && (forceDevelopment || V.loliGrow > 0)) {
+		physicalDevelopment(slave);
+	}
+};
+
 /** Is the slave a shelter slave?
  * @param {App.Entity.SlaveState} slave
  * @returns {boolean}
diff --git a/src/js/extendedFamilyModeJS.js b/src/js/extendedFamilyModeJS.js
index c1d74f93f296a65948fd88d7ada1dfe96665b38c..0bb9465f9196e20c1d94b2338e4fee3242190450 100644
--- a/src/js/extendedFamilyModeJS.js
+++ b/src/js/extendedFamilyModeJS.js
@@ -510,3 +510,21 @@ window.resetFamilyCounters = function() {
 		}
 	}
 };
+
+/** Set any missing parents to a known ID for the given slave (usually so that a sibling can be safely generated)
+ * @param {App.Entity.SlaveState} slave
+ */
+window.setMissingParents = function(slave) {
+	function untraceableParentID(ID) { return ID === 0 || (ID < -1 && ID >= -20 && ID !== -3); }
+
+	if (V.familyTesting === 1) {
+		if (untraceableParentID(slave.mother)) {
+			slave.mother = V.missingParentID;
+			V.missingParentID--;
+		}
+		if (untraceableParentID(slave.father)) {
+			slave.father = V.missingParentID;
+			V.missingParentID--;
+		}
+	}
+};
diff --git a/src/js/generateRelatedSlave.js b/src/js/generateRelatedSlave.js
index fef0c3948699998b04530dbd8351a919d7fa6253..fb4a6077896d2cbf18bd176f4b302e5cfb481e83 100644
--- a/src/js/generateRelatedSlave.js
+++ b/src/js/generateRelatedSlave.js
@@ -3,8 +3,8 @@ window.generateRelatedSlave = (function() {
 
 	/**
 	 * Generate a very similar relative for an existing slave (for use in Household Liquidators, for example).
-	 * @param {App.Entity.SlaveState} slave - the source relative
-	 * @param {string} relationship - the relationship that the new relative has with the source. Currently supports "daughter", "sibling", "twin".
+	 * @param {App.Entity.SlaveState} slave - the source relative. Note: this slave is NOT changed, calling code is responsible for setting up the source end of the relationship!
+	 * @param {string} relationship - the relationship that the new relative has with the source. Currently supports "parent", "child", "older sibling", "younger sibling", "twin".
 	 * @param {bool} oppositeSex - set to true if the new relative should be the opposite sex of the old one (otherwise it will be the same sex).
 	 * @returns {SlaveState} - new relative
 	 */
@@ -12,10 +12,14 @@ window.generateRelatedSlave = (function() {
 		let relative = prepareClone(slave);
 		if (relationship === "twin") {
 			makeTwin(relative);
-		} else if (relationship === "daughter") {
-			makeDaughter(relative);
-		} else if (relationship === "sibling") {
-			makeSibling(relative);
+		} else if (relationship === "child") {
+			makeChild(relative);
+		} else if (relationship === "parent") {
+			makeParent(relative);
+		} else if (relationship === "younger sibling") {
+			makeYoungerSibling(relative);
+		} else if (relationship === "older sibling") {
+			makeOlderSibling(relative);
 		}
 		if (oppositeSex) {
 			if (slave.genes === "XX") {
@@ -26,9 +30,12 @@ window.generateRelatedSlave = (function() {
 				// we'll assume futa are their own opposites and don't need tweaking
 			}
 		}
-		if (relative.actualAge < slave.actualAge || oppositeSex) { // not used for same-sex twins
+		// perform age-related adjustment for all relatives *except* same-sex twins (preserve identicality)
+		if (relative.actualAge !== slave.actualAge || oppositeSex) {
 			ageFixup(relative);
 		}
+		setHealth(slave, slave.health.condition);
+
 		return relative;
 	}
 
@@ -85,7 +92,7 @@ window.generateRelatedSlave = (function() {
 	 * Finish configuring a sibling
 	 * @param {App.Entity.SlaveState} slave - the new sibling
 	 */
-	function makeSibling(slave) {
+	function makeYoungerSibling(slave) {
 		if (!V.familyTesting) {
 			slave.relation = "sister";
 			slave.relationTarget = sourceID;
@@ -99,22 +106,37 @@ window.generateRelatedSlave = (function() {
 		slave.ovaryAge = slave.actualAge;
 		slave.birthWeek = random(0, 51);
 
-		// fuzz boobs/butt
-		if (slave.boobs > 200) {
-			slave.boobs += either(-100, 0, 100);
-		}
-		if (slave.butt > 1) {
-			slave.butt += random(-1, 1);
+		fuzzPhysicalTraits(slave);
+
+		randomiseFetishFlaws(slave);
+	}
+
+	/**
+	 * Finish configuring a sibling
+	 * @param {App.Entity.SlaveState} slave - the new sibling
+	 */
+	function makeOlderSibling(slave) {
+		if (!V.familyTesting) {
+			slave.relation = "sister";
+			slave.relationTarget = sourceID;
 		}
 
+		// increase age
+		const maxDifference = (V.retirementAge - 1) - slave.actualAge;
+		const ageDifference = Math.min(random(2, 6), maxDifference);
+		fastForward(slave, ageDifference);
+		slave.birthWeek = random(0, 51);
+
+		fuzzPhysicalTraits(slave);
+
 		randomiseFetishFlaws(slave);
 	}
 
 	/**
-	 * Finish configuring a daughter
-	 * @param {App.Entity.SlaveState} slave - the new daughter
+	 * Finish configuring a child
+	 * @param {App.Entity.SlaveState} slave - the new child
 	 */
-	function makeDaughter(slave) {
+	function makeChild(slave) {
 		if (!V.familyTesting) {
 			slave.relation = "daughter";
 			slave.relationTarget = sourceID;
@@ -144,13 +166,7 @@ window.generateRelatedSlave = (function() {
 		slave.boobs -= 100;
 		slave.butt -= 1;
 
-		// fuzz boobs/butt
-		if (slave.boobs > 200) {
-			slave.boobs += either(-100, 100);
-		}
-		if (slave.butt > 1) {
-			slave.butt += random(-1, 1);
-		}
+		fuzzPhysicalTraits(slave);
 
 		// daughter has never had children and is likely a virgin
 		slave.vagina = either(0, 0, 0, 1);
@@ -159,6 +175,67 @@ window.generateRelatedSlave = (function() {
 		randomiseFetishFlaws(slave);
 	}
 
+	/**
+	 * Finish configuring a parent
+	 * @param {App.Entity.SlaveState} slave - the new parent
+	 */
+	function makeParent(slave) {
+		if (!V.familyTesting) {
+			slave.relation = "mother"; // no fathers without family testing
+			slave.relationTarget = sourceID;
+		} else {
+			slave.mother = 0;
+			slave.father = 0;
+		}
+
+		// select age
+		const childAge = slave.actualAge;
+		let minAge = childAge + Math.max(11, V.minimumSlaveAge - 2);
+		let maxAge = Math.min(V.retirementAge - 1, childAge + 42);
+		if (maxAge < minAge) {
+			throw "Cannot generate parent (slave too old)";
+		}
+		slave.actualAge = random(minAge, maxAge);
+		slave.visualAge = slave.actualAge;
+		slave.physicalAge = slave.actualAge;
+		slave.ovaryAge = slave.actualAge;
+		slave.birthWeek = random(0, 51);
+
+		// parent always has less devotion/trust
+		slave.devotion -= 10;
+		slave.trust -= 10;
+
+		// mother always has more boobs/butt
+		if (slave.genes === "XX") {
+			slave.boobs += 100;
+			slave.butt += 1;
+		}
+
+		fuzzPhysicalTraits(slave);
+
+		// mother has had one child (at least)
+		if (slave.genes === "XX") {
+			slave.vagina = Math.max(slave.vagina, 1);
+			slave.counter.birthsTotal = 1;
+		}
+
+		randomiseFetishFlaws(slave);
+	}
+
+	/**
+	 * Fuzz some physical traits so we don't start out identical
+	 * @param {App.Entity.SlaveState} slave
+	 */
+	function fuzzPhysicalTraits(slave) {
+		// fuzz boobs/butt
+		if (slave.boobs > 200) {
+			slave.boobs += either(-100, 0, 100);
+		}
+		if (slave.butt > 1) {
+			slave.butt += random(-1, 0, 1);
+		}
+	}
+
 	/**
 	 * Randomize fetish and flaws
 	 * @param {App.Entity.SlaveState} slave
@@ -198,9 +275,6 @@ window.generateRelatedSlave = (function() {
 			}
 		}
 		SetBellySize(slave);
-
-		// reset health
-		setHealth(slave, slave.health.condition);
 	}
 
 	/**
@@ -306,6 +380,12 @@ window.generateRelatedSlave = (function() {
 		generatePuberty(slave);
 	}
 
+	function fastForward(slave, years) {
+		for (let i = 0; i < years; ++i) {
+			ageSlave(slave, true);
+		}
+	}
+
 	/**
 	 * Give a slave a realistic chance to activate a sexlinked genetic quirk which her opposite-sex relative was only a carrier for.
 	 * @param {App.Entity.SlaveState} slave - the slave to adjust
diff --git a/src/js/wombJS.js b/src/js/wombJS.js
index 8e36eddced977b7255e6993b1c9d6adf713b2de9..e37ab2f3262d1008bf287dbc41da587307f3b8ff 100644
--- a/src/js/wombJS.js
+++ b/src/js/wombJS.js
@@ -140,15 +140,8 @@ window.WombImpregnateClone = function(actor, fCount, mother, motherOriginal, age
 		tf.genetics = generateGenetics(mother, mother.ID, i + 1); // Stored genetic information.
 		tf.ID = generateNewID();
 
-		// Welcome to having to set up common relatives for the slave and her clone
-		if (mother.father === 0 || (mother.father < -1 && mother.father >= -20 && mother.father !== -3)) {
-			mother.father = State.variables.missingParentID;
-			State.variables.missingParentID--;
-		}
-		if (mother.mother === 0 || (mother.mother < -1 && mother.mother >= -20 && mother.mother !== -3)) {
-			mother.mother = State.variables.missingParentID;
-			State.variables.missingParentID--;
-		}
+		// set up common relatives for the slave and her clone
+		setMissingParents(mother);
 
 		// gene corrections
 		tf.fatherID = -7;
diff --git a/src/npc/acquisition.tw b/src/npc/acquisition.tw
index 472cd6b1a2e12f78cfe22a8226a10c0a34f76cf1..f2a91d8ee0aa8e11d916d026d630520a93aea28e 100644
--- a/src/npc/acquisition.tw
+++ b/src/npc/acquisition.tw
@@ -1,7 +1,5 @@
 :: Acquisition [nobr]
 
-<<unset $startingGirlCopied, $startingGirlRelation>>
-
 <<set $showEncyclopedia = 0>>
 
 <<if $saveImported == 1>><<set _valueOwed = 5000>><<else>><<set _valueOwed = 50000>><</if>>
@@ -133,23 +131,23 @@
 	<</if>>
 	<<if _pcMomFound == 0 && $PC.mother > 0>>
 		<<set _lostMom = $PC.mother>>
-		<<set $PC.mother = $missingParentId>>
+		<<set $PC.mother = $missingParentID>>
 		<<for _i = 0; _i < $slaves.length; _i++>>
 			<<if $slaves[_i].mother == _lostMom>>
-				<<set $slaves[_i].mother = $missingParentId>>
+				<<set $slaves[_i].mother = $missingParentID>>
 			<</if>>
 		<</for>>
-		<<set $missingParentId-->>
+		<<set $missingParentID-->>
 	<</if>>
 	<<if _pcDadFound == 0 && $PC.father > 0>>
 		<<set _lostDad = $PC.father>>
-		<<set $PC.father = $missingParentId>>
+		<<set $PC.father = $missingParentID>>
 		<<for _i = 0; _i < $slaves.length; _i++>>
 			<<if $slaves[_i].father == _lostDad>>
-				<<set $slaves[_i].father = $missingParentId>>
+				<<set $slaves[_i].father = $missingParentID>>
 			<</if>>
 		<</for>>
-		<<set $missingParentId-->>
+		<<set $missingParentID-->>
 	<</if>>
 	<<for _i = 0; _i < $slaves.length; _i++>>
 		<<set _slaveMomFound = 0, _slaveDadFound = 0>>
diff --git a/src/npc/startingGirls/commitStartingGirl.tw b/src/npc/startingGirls/commitStartingGirl.tw
index 4e832f3fc4c3ebfcd6c405db36c51760bf4a28ba..122e48bb76e38a00e55f2ab071a27431d2fe1d07 100644
--- a/src/npc/startingGirls/commitStartingGirl.tw
+++ b/src/npc/startingGirls/commitStartingGirl.tw
@@ -19,43 +19,138 @@
 		<<set $activeSlave = generateStartingSlave()>>
 		<<goto "Starting Girls">>
 	<</link>>
-	<<if $familyTesting == 1>>
-		<br>[[Add another slave, based on the previous slave|Starting Girls][$startingGirlCopied = 1, $activeSlave.mother = 0, $activeSlave.father = 0]]
-	<<else>>
-		<br>[[Add another slave, based on the previous slave|Starting Girls][$activeSlave.relation = 0, $activeSlave.relationTarget = 0, $startingGirlCopied = 1]]
-	<</if>>
-	<<if $createRelatedSlave == 1>>
-		<br>
-		//Add another slave, related to the previous slave://
-		<br>&nbsp;&nbsp;&nbsp;&nbsp;
+	<br>
+	<<link "Add another slave, based on the previous slave">>
+		<<set $activeSlave = clone($activeSlave)>>
+		<<set $activeSlave.ID = generateSlaveID()>>
+		<<run nationalityToName($activeSlave), randomizeUnknowns($activeSlave)>>
 		<<if $familyTesting == 1>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;//Use "based on the previous slave" and the available .father and .mother controls to create your family//
+			<<set $activeSlave.mother = 0, $activeSlave.father = 0>>
 		<<else>>
-			<br>&nbsp;&nbsp;&nbsp;&nbsp;
-			<<if $activeSlave.actualAge <= 8 && ($PC.career == "servant" || $PC.career == "escort") && ($PC.vagina != -1)>>
-			<<else>>
-				<<if $activeSlave.actualAge >= ($fertilityAge + $minimumSlaveAge)>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;
-					[[Daughter|RG AS Dump][$returnTo = "Starting Girls", $activeSlave.relation = "mother", $startingGirlRelation = "mother", $activeSlave.counter.birthsTotal += 1, $activeSlave.relationTarget = $activeSlave.ID+1, $startingGirlCopied = 1]]
-				<</if>>
-				<<if $activeSlave.actualAge <= 24>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;
-					[[Mother|RG AS Dump][$returnTo = "Starting Girls", $activeSlave.relation = "daughter", $startingGirlRelation = "daughter", $activeSlave.relationTarget = $activeSlave.ID+1, $startingGirlCopied = 1]]
-				<</if>>
-				<<if $activeSlave.actualAge < 44>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;
-					[[Older Sister|RG AS Dump][$returnTo = "Starting Girls", $activeSlave.relation = "sister", $startingGirlRelation = "older sister", $activeSlave.relationTarget = $activeSlave.ID+1, $startingGirlCopied = 1]]
-				<</if>>
-				<br>&nbsp;&nbsp;&nbsp;&nbsp;
-				[[Twin|RG AS Dump][$returnTo = "Starting Girls", $activeSlave.relation = "twin", $startingGirlRelation = "twin", $activeSlave.relationTarget = $activeSlave.ID+1, $startingGirlCopied = 1]]
-				<<if $activeSlave.actualAge > $minimumSlaveAge+1>>
-					<br>&nbsp;&nbsp;&nbsp;&nbsp;
-					[[Younger Sister|RG AS Dump][$returnTo = "Starting Girls", $activeSlave.relation = "sister", $startingGirlRelation = "younger sister", $activeSlave.relationTarget = $activeSlave.ID+1, $startingGirlCopied = 1]]
-				<</if>>
+			<<set $activeSlave.relation = 0, $activeSlave.relationTarget = 0>>
+		<</if>>
+		<<goto "Starting Girls">>
+	<</link>>
+	<<if ($familyTesting === 1) || ($activeSlave.relation === 0)>>
+		<<set _srcID = $activeSlave.ID>>
+		<br>
+		//Add another slave, related to the previous slave://
+		<div class="indent">
+		<<link "Twin">>
+			<<if $familyTesting == 1>>
+				<<run setMissingParents(getSlave(_srcID))>>
+			<</if>>
+			<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "twin")>>
+			<<run randomizeUnknowns($activeSlave)>>
+			<<if $familyTesting != 1>>
+				<<set getSlave(_srcID).relation = "twin", getSlave(_srcID).relationTarget = $activeSlave.ID>>
+			<</if>>
+			<<goto "Starting Girls">>
+		<</link>>
+		</div>
+		<<if $activeSlave.actualAge + $minimumSlaveAge < $retirementAge - 1>>
+			<<if $seeDicks !== 100 && ($familyTesting === 0 || $activeSlave.mother === 0)>>
+				<div class="indent">
+				<<link "Mother">>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "parent", getSlave(_srcID).genes === "XY")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<if $familyTesting === 1>>
+						<<set getSlave(_srcID).mother = $activeSlave.ID>>
+					<<else>>
+						<<set getSlave(_srcID).relation = "daughter", getSlave(_srcID).relationTarget = $activeSlave.ID>>
+					<</if>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+			<<if $familyTesting === 1 && $seeDicks !== 0 && $activeSlave.father === 0>>
+				<div class="indent">
+				<<link "Father">>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "parent", getSlave(_srcID).genes === "XX")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<set getSlave(_srcID).father = $activeSlave.ID>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+		<</if>>
+		<<if $activeSlave.actualAge < $retirementAge - 2>>
+			<<if $seeDicks !== 100>>
+				<div class="indent">
+				<<link "Older Sister">>
+					<<if $familyTesting == 1>>
+						<<run setMissingParents(getSlave(_srcID))>>
+					<</if>>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "older sibling", getSlave(_srcID).genes === "XY")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<if $familyTesting != 1>>
+						<<set getSlave(_srcID).relation = "sister", getSlave(_srcID).relationTarget = $activeSlave.ID>>
+					<</if>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+			<<if $familyTesting === 1 && $seeDicks !== 0>>
+				<div class="indent">
+				<<link "Older Brother">>
+					<<run setMissingParents(getSlave(_srcID))>>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "older sibling", getSlave(_srcID).genes === "XX")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+		<</if>>
+		<<if $activeSlave.actualAge > $minimumSlaveAge + 2>>
+			<<if $seeDicks !== 100>>
+				<div class="indent">
+				<<link "Younger Sister">>
+					<<if $familyTesting == 1>>
+						<<run setMissingParents(getSlave(_srcID))>>
+					<</if>>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "younger sibling", getSlave(_srcID).genes === "XY")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<if $familyTesting != 1>>
+						<<set getSlave(_srcID).relation = "sister", getSlave(_srcID).relationTarget = $activeSlave.ID>>
+					<</if>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+			<<if $familyTesting === 1 && $seeDicks !== 0>>
+				<div class="indent">
+				<<link "Younger Brother">>
+					<<run setMissingParents(getSlave(_srcID))>>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "younger sibling", getSlave(_srcID).genes === "XX")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+		<</if>>
+		<<if $activeSlave.actualAge > $minimumSlaveAge + 11>>
+			<<if $seeDicks !== 100>>
+				<div class="indent">
+				<<link "Daughter">>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "child", getSlave(_srcID).genes === "XY")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<if $familyTesting != 1>>
+						<<set getSlave(_srcID).relation = "mother", getSlave(_srcID).relationTarget = $activeSlave.ID>>
+					<</if>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
+			<</if>>
+			<<if $familyTesting === 1 && $seeDicks !== 0>>
+				<div class="indent">
+				<<link "Son">>
+					<<set $activeSlave = generateRelatedSlave(getSlave(_srcID), "child", getSlave(_srcID).genes === "XX")>>
+					<<run randomizeUnknowns($activeSlave)>>
+					<<goto "Starting Girls">>
+				<</link>>
+				</div>
 			<</if>>
 		<</if>>
-	<<elseif $activeSlave.relation == 0>>
-		<br>[[Add another slave, related to the previous slave|Commit Starting Girl][$createRelatedSlave = 1]]
 	<</if>>
 <</if>>
 <br>[[Stop adding slaves and take control of the arcology|Acquisition]]
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 66eaa43144f5962a6c98eaa8e32750286f7fc66e..c39e95063bc1bc038ce0604138eda3b78c3fa21f 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -1,7 +1,6 @@
 /* Generate a new slave for the starting girls passage */
 window.generateStartingSlave = function(params) {
 	let slave = GenerateNewSlave(null, params);
-	V.startingGirlCopied = 0;
 	setHealth(slave, 0);
 	slave.devotion = 0;
 	slave.trust = 0;
@@ -164,3 +163,16 @@ window.applyCareerBonus = function(slave) {
 		}
 	}
 };
+
+/* randomize things the player doesn't know about the slave */
+window.randomizeUnknowns = function(slave) {
+	if (slave.attrKnown === 0) {
+		slave.attrXX = random(0, 100);
+		slave.attrXY = random(0, 100);
+		slave.energy = random(1, 90);
+	}
+	if (slave.fetish !== "mindbroken" && slave.fetishKnown === 0) {
+		slave.fetishStrength = random(0, 90);
+		slave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "pregnancy", "sadist", "submissive");
+	}
+};
diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw
index 8aac5be30eb4189ff203aa5b46bd43226ae5150f..a1d9780a3482b0ab9275367cdc1324126be8cacc 100644
--- a/src/npc/startingGirls/startingGirls.tw
+++ b/src/npc/startingGirls/startingGirls.tw
@@ -53,50 +53,6 @@
 	<<set $activeSlave = generateStartingSlave()>>
 <</if>>
 
-<<if $startingGirlCopied>>
-	<<set _tempSlave = clone($activeSlave)>>
-	<<set $activeSlave.ID = generateSlaveID()>>
-	<<if $startingGirlRelation>>
-		<<if $familyTesting == 1>>
-		<<else>>
-			<<switch $startingGirlRelation>>
-			<<case "mother">>
-				<<set $activeSlave.relation = "daughter", $activeSlave.actualAge -= random(16,24)>>
-			<<case "daughter">>
-				<<set $activeSlave.relation = "mother", $activeSlave.actualAge += random(16,24)>>
-				<<if $activeSlave.vagina == 0>><<set $activeSlave.vagina++>><</if>>
-			<<case "older sister">>
-				<<set $activeSlave.relation = "sister", $activeSlave.actualAge += random(2,4)>>
-			<<case "younger sister">>
-				<<set $activeSlave.relation = "sister", $activeSlave.actualAge -= random(2,4)>>
-			<<default>>
-				<<set $activeSlave.relation = "twin">>
-			<</switch>>
-			<<set $activeSlave.relationTarget = _tempSlave.ID>>
-		<</if>>
-		<<if $startingGirlRelation != "twin">><<set $activeSlave.birthWeek = random(0,51)>><</if>>
-		<<if $activeSlave.slaveSurname>><<set _familyName = $activeSlave.slaveSurname>><</if>>
-		<<if $activeSlave.birthSurname>><<set _familyBirthSurname = $activeSlave.birthSurname>><</if>>
-	<</if>>
-	<<set $activeSlave.visualAge = $activeSlave.actualAge>>
-	<<set $activeSlave.physicalAge = $activeSlave.actualAge>>
-	<<set $activeSlave.ovaryAge = $activeSlave.actualAge>>
-	<<run nationalityToName($activeSlave)>>
-	<<if _familyName>><<set $activeSlave.slaveSurname = _familyName>><</if>>
-	<<if _familyBirthSurname>><<set $activeSlave.birthSurname = _familyBirthSurname>><</if>>
-	<<set $activeSlave.slaveName = $activeSlave.birthName>>
-	<<if $activeSlave.attrKnown == 0>>
-		<<set $activeSlave.attrXX = random(0,100)>>
-		<<set $activeSlave.attrXY = random(0,100)>>
-		<<set $activeSlave.energy = random(1,90)>>
-	<</if>>
-	<<if $activeSlave.fetish != "mindbroken" && $activeSlave.fetishKnown == 0>>
-		<<set $activeSlave.fetishStrength = random(0,90)>>
-		<<set $activeSlave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "pregnancy", "sadist", "submissive")>>
-	<</if>>
-	<<set $startingGirlCopied = 0, $startingGirlRelation = 0>>
-<</if>>
-
 <<run startingGirlCleanup($activeSlave)>>
 <<set _slaveCost = startingSlaveCost($activeSlave)>>
 <<set $saleDescription = 1>>
@@ -1599,7 +1555,7 @@
 		<<if $PC.career != "engineer">>
 			<div class="indent">
 				<<link "Add this slave">>
-					<<set $returnTo = "Commit Starting Girl", $createRelatedSlave = 0, $applyCareerBonus = 1>>
+					<<set $returnTo = "Commit Starting Girl", $applyCareerBonus = 1>>
 					<<goto "RG AS Dump">>
 				<</link>>
 				<span class="note">
@@ -1633,7 +1589,7 @@
 		<<set _text = $PC.career != "engineer" ? "Add this slave without career bonus" : "Add this slave">>
 		<div class="indent">
 			<<link _text>>
-				<<set $returnTo = "Commit Starting Girl", $createRelatedSlave = 0, $applyCareerBonus = 0>>
+				<<set $returnTo = "Commit Starting Girl", $applyCareerBonus = 0>>
 				<<goto "RG AS Dump">>
 			<</link>>
 		</div>
diff --git a/src/uncategorized/householdLiquidator.tw b/src/uncategorized/householdLiquidator.tw
index 23e5fb99a49328b1d0aa17c6872041c6e29d56c4..8b9dcdc86242c09de94316ee9e53301b4ac51c2a 100644
--- a/src/uncategorized/householdLiquidator.tw
+++ b/src/uncategorized/householdLiquidator.tw
@@ -24,7 +24,7 @@
 The household liquidator is offering a set of siblings for sale. As usual, you will only be permitted to inspect the older, but there is a guarantee that the younger will be similar.
 <br><br>
 
-<<set _relativeSlave = generateRelatedSlave($activeSlave, "sibling")>>
+<<set _relativeSlave = generateRelatedSlave($activeSlave, "younger sibling")>>
 <<if $familyTesting != 1>>
 	<<set $activeSlave.relation = "sister">>
 	<<set $activeSlave.relationTarget = _relativeSlave.ID>>
@@ -62,7 +62,7 @@ The household liquidator is offering a set of siblings for sale. As usual, you w
 The household liquidator is offering a mother and $his daughter for sale. As usual, you will only be permitted to inspect the mother, but there is a guarantee that the daughter will be similar.
 <br><br>
 
-<<set _relativeSlave = generateRelatedSlave($activeSlave, "daughter")>>
+<<set _relativeSlave = generateRelatedSlave($activeSlave, "child")>>
 <<if $familyTesting != 1>>
 	<<set $activeSlave.relation = "mother">>
 	<<set $activeSlave.relationTarget = _relativeSlave.ID>>
diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw
index 112ea69338e931615e0359497a9357b0b3256bfc..9f4727009d04da0c447ebf128d82b5d034406936 100644
--- a/src/uncategorized/nextWeek.tw
+++ b/src/uncategorized/nextWeek.tw
@@ -116,23 +116,7 @@
 		<<set $slaves[_i].birthWeek++>>
 		<<if $slaves[_i].birthWeek >= 52>>
 			<<set $slaves[_i].birthWeek = 0>>
-			<<if $seeAge == 1>>
-				<<set $slaves[_i].physicalAge += 1, $slaves[_i].actualAge += 1>>
-				/* Note Induced NCS completely takes over visual aging, so the increment from pre-existing code simply is trapped behind a !NCS test. Additionally, because of the neoteny aspects of NCS, ovaries don't age quite as fast. */
-				<<if $slaves[_i].geneMods.NCS == 0>>
-					<<set $slaves[_i].visualAge += 1>>
-					/* (prev comment) Hopefully this works. It is intended, over a slave's lifetime, to cause her menopause to shift. */
-					<<set $slaves[_i].ovaryAge += either(.8, .9, .9, 1, 1, 1, 1.1)>>
-				<<else>>
-					<<set $slaves[_i].ovaryAge += either(.5, .6, .7, .7, .8, .9, 1)>>
-				<</if>>
-				<<if $slaves[_i].broodmother == 1>>
-					<<set $slaves[_i].ovaryAge += .2>>
-				<</if>>
-				<<if $slaves[_i].physicalAge <= 18 && $loliGrow > 0>>
-					<<run physicalDevelopment($slaves[_i])>>
-				<</if>>
-			<</if>>
+			<<run ageSlave($slaves[_i])>>
 		<</if>>
 	<</if>>
 	<<if $slaves[_i].indenture > 0>>
diff --git a/src/uncategorized/pCoupAttempt.tw b/src/uncategorized/pCoupAttempt.tw
index 71db6f8479e6d6325f3584fbbf72dcde0b764169..a60504571cfbb4ee8ec48ab24e2e26ccb9322fbe 100644
--- a/src/uncategorized/pCoupAttempt.tw
+++ b/src/uncategorized/pCoupAttempt.tw
@@ -26,13 +26,7 @@
 			<<set $traitor.birthWeek++>>
 			<<if $traitor.birthWeek >= 52>>
 				<<set $traitor.birthWeek = 0>>
-				<<if $seeAge == 1>>
-					<<set $traitor.physicalAge += 1, $traitor.actualAge += 1, $traitor.visualAge += 1>>
-					<<set $traitor.ovaryAge += either(.8, .9, .9, 1, 1, 1, 1.1)>>
-					<<if $traitor.physicalAge <= 18 && $loliGrow > 0>>
-						<<run physicalDevelopment($traitor)>>
-					<</if>>
-				<</if>>
+				<<run ageSlave($traitor)>>
 			<</if>>
 			<<set _weeks-->>
 		<</for>>
diff --git a/src/uncategorized/pCoupBetrayal.tw b/src/uncategorized/pCoupBetrayal.tw
index 4cc634a8be6630fa0320cb474089d57e050f71e4..1258d68f7fce9d36552a3d6cdac1a874c74059dd 100644
--- a/src/uncategorized/pCoupBetrayal.tw
+++ b/src/uncategorized/pCoupBetrayal.tw
@@ -25,13 +25,7 @@
 		<<set $traitor.birthWeek++>>
 		<<if $traitor.birthWeek >= 52>>
 			<<set $traitor.birthWeek = 0>>
-			<<if $seeAge == 1>>
-				<<set $traitor.physicalAge += 1, $traitor.actualAge += 1, $traitor.visualAge += 1>>
-				<<set $traitor.ovaryAge += either(.8, .9, .9, 1, 1, 1, 1.1)>>
-				<<if $traitor.physicalAge <= 18 && $loliGrow > 0>>
-					<<run physicalDevelopment($traitor)>>
-				<</if>>
-			<</if>>
+			<<run ageSlave($traitor)>>
 		<</if>>
 		<<set _weeks-->>
 	<</for>>
diff --git a/src/uncategorized/pTraitorMessage.tw b/src/uncategorized/pTraitorMessage.tw
index 3ba720727e70dd85f108657612b1a7c321abd571..e3bbedb530dcf3e7b0fcc3a2292171f438945483 100644
--- a/src/uncategorized/pTraitorMessage.tw
+++ b/src/uncategorized/pTraitorMessage.tw
@@ -49,13 +49,7 @@
 		<<set $traitor.birthWeek++>>
 		<<if $traitor.birthWeek >= 52>>
 			<<set $traitor.birthWeek = 0>>
-			<<if $seeAge == 1>>
-				<<set $traitor.physicalAge += 1, $traitor.actualAge += 1, $traitor.visualAge += 1>>
-				<<set $traitor.ovaryAge += either(.8, .9, .9, 1, 1, 1, 1.1)>>
-				<<if $traitor.physicalAge <= 18 && $loliGrow > 0>>
-					<<run physicalDevelopment($traitor)>>
-				<</if>>
-			<</if>>
+			<<run ageSlave($traitor)>>
 		<</if>>
 		<<set _weeks-->>
 	<</for>>
diff --git a/src/uncategorized/reBoomerang.tw b/src/uncategorized/reBoomerang.tw
index e19a7b4ecd666551d517c096db639b7a84fa4480..a8c1d886d6889311062195e4380dbed240c57d51 100644
--- a/src/uncategorized/reBoomerang.tw
+++ b/src/uncategorized/reBoomerang.tw
@@ -51,13 +51,7 @@ brings up the relevant feeds. There's a naked body crumpled pathetically against
 		<<set $activeSlave.birthWeek++>>
 		<<if $activeSlave.birthWeek >= 52>>
 			<<set $activeSlave.birthWeek = 0>>
-			<<if $seeAge == 1>>
-				<<set $activeSlave.physicalAge += 1, $activeSlave.actualAge += 1, $activeSlave.visualAge += 1>>
-				<<set $activeSlave.ovaryAge += either(.8, .9, .9, 1, 1, 1, 1.1)>>
-				<<if $activeSlave.physicalAge <= 18 && $loliGrow > 0>>
-					<<run physicalDevelopment($activeSlave)>>
-				<</if>>
-			<</if>>
+			<<run ageSlave($activeSlave)>>
 		<</if>>
 		<<set _weeks-->>
 	<</for>>
diff --git a/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw b/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw
index 45405d5a43fbedff34f11ca0b79b6226938400db..68e1c672f553cd45f43d806e8e712df1c76a4daf 100644
--- a/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw
+++ b/src/uncategorized/reFSEgyptianRevivalistAcquisition.tw
@@ -25,7 +25,7 @@
 <<if ($activeSlave.dick > 0) && ($activeSlave.balls == 0)>><<set $activeSlave.balls = random(1,5)>><</if>>
 
 <<set _oppositeSex = $seeDicks > 0 && $seeDicks < 100 && (random(1, 4) <= 3)>>
-<<set _secondSlave = generateRelatedSlave($activeSlave, "sibling", _oppositeSex)>>
+<<set _secondSlave = generateRelatedSlave($activeSlave, "younger sibling", _oppositeSex)>>
 
 <<set _secondSlave.relationship = 4>>
 <<set _secondSlave.relationshipTarget = $activeSlave.ID>>