diff --git a/player variables documentation - Pregmod.txt b/player variables documentation - Pregmod.txt
index 1eddbc1385ad5c208599a727f86fa3316b49d45d..d8fd24f46feb390f6093293bbf6c92c4cb7be7fb 100644
--- a/player variables documentation - Pregmod.txt	
+++ b/player variables documentation - Pregmod.txt	
@@ -541,6 +541,21 @@ face:
 
 100
 
+lips:
+
+lip size (0-100)
+0  - 10 - thin
+11 - 20 - normal
+21 - 40 - pretty
+41 - 70 - plush
+71 - 95 - huge (lisps)
+96 - 100- facepussy (mute)
+
+lipsImplant:
+
+how large her lip implants are
+See .lips
+
 reservedChildren:
 
 how many of your children will be added to the incubator
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index b51ecbc0720c5ee7275a26f60f3eb99044fc3f69..ec1c17f77c9ea2f2e831a2043d796bf77ae2d667 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -1,6 +1,6 @@
 App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
-	pmod: "3.9.6",
+	pmod: "4.A.0",
 	commitHash: null,
-	release: 1129 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1130 // When getting close to 2000,  please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js
index 5136031fa2696a20ae8f38fbe6e05f9f6f057b39..d1b201b38fa65a75671c694152c8ce1d447ad94e 100644
--- a/src/events/intro/introSummary.js
+++ b/src/events/intro/introSummary.js
@@ -374,18 +374,27 @@ App.Intro.summary = function() {
 						}
 						// I hope this works
 						PCDatatypeCleanup(V.PC);
-					}
 
-					if (V.PC.dick >= 3) {
-						V.PC.geneticQuirks.wellHung = 2;
-					}
-					if (V.PC.title === 0) {
-						V.PC.hLength = 15;
-						V.PC.waist = -20;
-						V.PC.voice = 2;
-					}
-					if (V.PC.eye.right.vision === 1 || V.PC.eye.left.vision === 1) {
-						V.PC.eyewear = "corrective glasses";
+						if (V.PC.dick >= 3) {
+							V.PC.geneticQuirks.wellHung = 2;
+						}
+						if (V.PC.title === 0) {
+							V.PC.hLength = 15;
+							V.PC.waist = -20;
+							V.PC.voice = 2;
+						}
+						if (V.PC.eye.right.vision === 1 || V.PC.eye.left.vision === 1) {
+							V.PC.eyewear = "corrective glasses";
+						}
+						if (V.PC.pubertyXX === 0 && V.PC.pubertyXY === 0) {
+							if (V.PC.age < 11) {
+								V.PC.energy = 20;
+							} else if (V.PC.age < 12) {
+								V.PC.energy = 30;
+							} else if (V.PC.age < 13) {
+								V.PC.energy = 40;
+							}
+						}
 					}
 
 					V.PC.birthName = V.PC.slaveName;
diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js
index 98c8be487e19d4c75cfe55369bdebbc1ad00f660..40c3d32f0bc150d14309019406f64af19ed59ed0 100644
--- a/src/events/intro/pcAppearance.js
+++ b/src/events/intro/pcAppearance.js
@@ -1,6 +1,6 @@
 App.UI.Player = {};
 
-App.UI.Player.appearance = function(options) {
+App.UI.Player.appearance = function(options, summary = false) {
 	let option;
 
 	options.addOption("Your nationality is", "nationality", V.PC).showTextBox()
@@ -15,6 +15,9 @@ App.UI.Player.appearance = function(options) {
 			.addValueList(Array.from(App.Data.misc.filterRaces, (k => [k[1], k[0]])));
 	}
 
+	options.addOption("You are genetically", "genes", V.PC)
+		.addValue("XY").addValue("XX");
+
 	options.addOption(`You are`, "height", V.PC).showTextBox({unit: "cm"})
 		.addRange(145, 150, "<", "Petite")
 		.addRange(155, 160, "<", "Short")
@@ -49,7 +52,17 @@ App.UI.Player.appearance = function(options) {
 		.addValueList(makeAList(App.Medicine.Modification.eyeColor.map(color => color.value)));
 
 	options.addOption("You", "vision", V.PC.eye.right)
-		.addValueList([["Need glasses to see properly", 1, () => { V.PC.eye.right = 1; V.PC.eye.left = 1;}], ["have normal vision", 2, () => { V.PC.eye.right = 2; V.PC.eye.left = 2;}]]);
+		.addValueList([["Need glasses to see properly", 1, () => { V.PC.eye.right = 1; V.PC.eye.left = 1; }], ["have normal vision", 2, () => { V.PC.eye.right = 2; V.PC.eye.left = 2; }]]);
+
+	options.addOption("Your face is", "faceShape", V.PC)
+		.addValueList([
+			["Normal", "normal"],
+			["Androgynous", "androgynous"],
+			["Masculine", "masculine"],
+			["Cute", "cute"],
+			["Sensual", "sensual"],
+			["Exotic", "exotic"]
+		]);
 
 	options.addOption("Your body", "markings", V.PC)
 		.addValueList([["Is clear of blemishes", "none"], ["Has light freckling", "freckles"], ["Has heavy freckling", "heavily freckled"]]);
@@ -85,7 +98,7 @@ App.UI.Player.appearance = function(options) {
 		option.addValue("Very broad", 2);
 	}
 
-	if (V.PC.boobs >= 200) {
+	if (V.PC.boobs >= 200 || summary) {
 		if (V.PC.title === 1 && V.PC.boobs <= 200) {
 			option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 200, () => { V.PC.boobsImplant = 0; V.PC.boobsImplantType = "none"; });
 		} else {
@@ -95,7 +108,7 @@ App.UI.Player.appearance = function(options) {
 			["A-cups", 300],
 			["B-cups", 400],
 			["C-cups", 500],
-			]);
+		]);
 		if (V.PC.physicalAge <= 13) {
 			option.addValueList([
 				["hefty D-cups", 650],
@@ -115,7 +128,7 @@ App.UI.Player.appearance = function(options) {
 				.addValueList([
 					["All natural", 0, () => { V.PC.boobsImplant = 0; V.PC.boobsImplantType = "none"; }],
 					["Fake", V.PC.boobs / 2, () => V.PC.boobsImplantType = "normal"]
-				])
+				]);
 		}
 		if (V.PC.boobsImplant > 0) {
 			option = options.addOption("You have", "boobsImplantType", V.PC).addValue("Regular implants", "normal");
@@ -158,7 +171,7 @@ App.UI.Player.appearance = function(options) {
 		["Small", 1],
 		["Plump", 2],
 		["Big", 3],
-		]);
+	]);
 	if (V.PC.physicalAge > 13) {
 		option.addValue("Huge", 4);
 	}
@@ -173,7 +186,7 @@ App.UI.Player.appearance = function(options) {
 			.addValueList([
 				["All natural", 0, () => V.PC.buttImplantType = "none"],
 				["Fake", Math.round(V.PC.butt / 2), () => V.PC.buttImplantType = "normal"]
-			])
+			]);
 	}
 	if (V.PC.buttImplant > 0) {
 		option = options.addOption("You have", "buttImplantType", V.PC).addValue("Regular implants", "normal");
@@ -189,7 +202,7 @@ App.UI.Player.appearance = function(options) {
 			["Small", 2, () => V.PC.foreskin = 3],
 			["Average", 3, () => V.PC.foreskin = 3],
 			["Big", 4, () => V.PC.foreskin = 4],
-			]);
+		]);
 		if (V.PC.physicalAge > 13) {
 			option.addValue("Huge", 5, () => V.PC.foreskin = 5);
 		}
@@ -210,7 +223,7 @@ App.UI.Player.appearance = function(options) {
 		option.addValueList([
 			["Average", 3, () => V.PC.scrotum = 4],
 			["Large", 4, () => V.PC.scrotum = 5],
-			]);
+		]);
 		if (V.PC.physicalAge > 13) {
 			option.addValue("Massive", 5, () => V.PC.scrotum = 5);
 		}
@@ -229,7 +242,7 @@ App.UI.Player.appearance = function(options) {
 		}
 		if (V.PC.physicalAge < 14) {
 			options.addOption("You are", "pubertyXY", V.PC)
-			.addValueList([["Not producing potent sperm yet", 0], ["Producing potent sperm", 1]]);
+				.addValueList([["Not producing potent sperm yet", 0], ["Producing potent sperm", 1]]);
 		}
 	}
 
@@ -241,9 +254,9 @@ App.UI.Player.appearance = function(options) {
 		if (V.PC.physicalAge <= 18) {
 			options.addOption("You are", "vagina", V.PC)
 				.addValueList([["A virgin", 0], ["Not a virgin", 1]]);
-			if (V.PC.physicalAge < 14) {
+			if (V.PC.physicalAge < 14 && V.PC.preg <= 0) {
 				options.addOption("You have", "pubertyXX", V.PC)
-				.addValueList([["Not had your first period", 0], ["Had your first period", 1]]);
+					.addValueList([["Not had your first period", 0], ["Had your first period", 1]]);
 			}
 		}
 	}
@@ -271,7 +284,9 @@ App.UI.Player.syncAgeBasedParameters = function() {
 			if (V.PC.vagina !== -1) {
 				V.PC.vagina = 0;
 				V.PC.vaginaLube = 0;
-				V.PC.pubertyXX = 0;
+				if (V.PC.preg <= 0) {
+					V.PC.pubertyXX = 0;
+				}
 			}
 			V.PC.pregAdaptation = 10;
 			if (V.PC.dick !== 0) {
@@ -327,7 +342,9 @@ App.UI.Player.syncAgeBasedParameters = function() {
 			if (V.PC.vagina !== -1) {
 				V.PC.vagina = 0;
 				V.PC.vaginaLube = 0;
-				V.PC.pubertyXX = 0;
+				if (V.PC.preg <= 0) {
+					V.PC.pubertyXX = 0;
+				}
 			}
 			V.PC.pregAdaptation = 30;
 			if (V.PC.dick !== 0) {
@@ -534,6 +551,12 @@ App.UI.Player.design = function() {
 				.addRange(55, 65, "<", "Well into middle age").addRange(70, 65, ">=", "Old");
 
 			options.addOption(`Your birthday was <strong>${V.PC.birthWeek}</strong> weeks ago.`, "birthWeek", V.PC).showTextBox();
+			option = options.addCustomOption()
+				.addButton(
+					"Adjust body to match age",
+					() => App.UI.Player.syncAgeBasedParameters(),
+					""
+				);
 		}
 	} else {
 		r = [];
@@ -545,7 +568,7 @@ App.UI.Player.design = function() {
 		}
 		r.push(`and everyone that matters calls you	${PlayerName()}.`);
 
-		r.push(`You are ${V.PC.actualAge} years old which is`);
+		r.push(`You are ${V.PC.actualAge} years old, which is`);
 		if (V.PC.actualAge >= 65) {
 			r.push(`<strong>old</strong>.`);
 		} else if (V.PC.actualAge >= 50) {
@@ -587,21 +610,51 @@ App.UI.Player.design = function() {
 
 	// Appearance
 	if (allowEdits) {
-		App.UI.Player.appearance(options);
+		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+			State.temporary.vaginaPenis = 2;
+		} else if (V.PC.vagina !== -1) {
+			State.temporary.vaginaPenis = 1;
+		} else {
+			State.temporary.vaginaPenis = 0;
+		}
 
-		options.addOption("Your face is", "faceShape", V.PC)
-			.addValueList([
-				["Normal", "normal"],
-				["Androgynous", "androgynous"],
-				["Masculine", "masculine"],
-				["Cute", "cute"],
-				["Sensual", "sensual"],
-				["Exotic", "exotic"]
-			]);
+		option = options.addOption("You have a", "vaginaPenis", State.temporary)
+			.addValue("Penis", 0, () => {
+				V.PC.preg = 0;
+				V.PC.pregType = 0;
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = -1;
+				V.PC.ovaries = 0;
+			}).addValue("Vagina", 1, () => {
+				V.PC.dick = 0;
+				V.PC.balls = 0;
+				V.PC.scrotum = 0;
+				V.PC.prostate = 0;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			}).addValue("Penis and Vagina", 2, () => {
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			});
+		if (State.temporary.vaginaPenis === 0) {
+			option.addComment("Standard sex scenes; easiest reputation maintenance.");
+		} else if (State.temporary.vaginaPenis === 1) {
+			option.addComment("Sex scene variations; most difficult reputation maintenance.");
+		} else {
+			option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
+		}
+		App.UI.Player.appearance(options, true);
 	} else {
 		r = [];
 
-		r.push(`You are a ${V.PC.nationality} ${V.PC.race} with`);
+		r.push(`You are a ${heightToEitherUnit(V.PC)} tall ${V.PC.nationality} ${V.PC.race} with`);
 		if (V.PC.markings === "heavily freckled") {
 			r.push(`heavily freckled`);
 		} else if (V.PC.markings === "freckles") {
@@ -609,7 +662,18 @@ App.UI.Player.design = function() {
 		} else {
 			r.push(`clear`);
 		}
-		r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape} face.`);
+		r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape}`);
+		if (V.PC.lips > 95) {
+			r.push(`face with way too much lip; you can't shut your mouth properly anymore.`);
+		} else if (V.PC.lips > 70) {
+			r.push(`face with truly massive lips.`);
+		} else if (V.PC.lips > 40) {
+			r.push(`face with plump lips.`);
+		} else if (V.PC.lips > 20) {
+			r.push(`face with full lips.`);
+		} else {
+			r.push(`face.`);
+		}
 		App.Events.addNode(el, r, "p");
 	}
 
@@ -635,40 +699,35 @@ App.UI.Player.design = function() {
 				["Servant", "servant"],
 				["Gang leader", "gang"]]
 			);
+			option = options.addCustomOption()
+				.addButton(
+					"Adjust career for age",
+					() => V.PC.career = App.UI.Player.assignCareerByAge(V.PC.career),
+					""
+				);
 			if (V.secExpEnabled > 0) {
-				switch (V.PC.career) {
-					case "capitalist":
-						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-						break;
-					case "mercenary":
-						option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "slaver":
-						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "engineer":
-						option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
-						break;
-					case "medicine":
-						option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
-						break;
-					case "celebrity":
-						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-						break;
-					case "escort":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					case "servant":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					case "gang":
-						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-						break;
-					case "BlackHat":
-						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-						break;
-					default:
-						option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
+				if (isPCCareerInCategory("capitalist")) {
+					option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("mercenary")) {
+					option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("slaver")) {
+					option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("engineer")) {
+					option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("medicine")) {
+					option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("celebrity")) {
+					option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("escort")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else if (isPCCareerInCategory("servant")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else if (isPCCareerInCategory("gang")) {
+					option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+				} else if (isPCCareerInCategory("BlackHat")) {
+					option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+				} else {
+					option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
 				}
 			}
 		}
@@ -687,39 +746,81 @@ App.UI.Player.design = function() {
 		r = [];
 		switch (V.PC.career) {
 			case "wealth":
+			case "trust fund":
+			case "rich kid":
 				r.push(`Prior to being an arcology owner, you were a member of the idle wealthy.`);
 				break;
 			case "capitalist":
 				r.push(`Prior to being an arcology owner, you were a business leader.`);
 				break;
+			case "entrepreneur":
+			case "business kid":
+				r.push(`Prior to being an arcology owner, you were a cunning entrepreneur.`);
+				break;
 			case "mercenary":
+			case "recruit":
 				r.push(`Prior to being an arcology owner, you were a mercenary.`);
 				break;
+			case "child soldier":
+				r.push(`Prior to being an arcology owner, you were a disposable conscript.`);
+				break;
 			case "slaver":
+			case "slave overseer":
 				r.push(`Prior to being an arcology owner, you were a slaver.`);
 				break;
+			case "slave tender":
+				r.push(`Prior to being an arcology owner, you were a slaver tasked with looking after fresh captures.`);
+				break;
 			case "engineer":
 				r.push(`Prior to being an arcology owner, you were an engineer.`);
 				break;
+			case "construction":
+			case "worksite helper":
+				r.push(`Prior to being an arcology owner, you built buildings.`);
+				break;
 			case "medicine":
 				r.push(`Prior to being an arcology owner, you were a surgeon.`);
 				break;
+			case "medical assistant":
+				r.push(`Prior to being an arcology owner, you assisted with surgeries.`);
+				break;
+			case "nurse":
+				r.push(`Prior to being an arcology owner, you were a nurse.`);
+				break;
 			case "celebrity":
 				r.push(`Prior to being an arcology owner, you were a minor celebrity.`);
 				break;
+			case "rising star":
+				r.push(`Prior to being an arcology owner, you were an up-and-coming star.`);
+				break;
+			case "child star":
+				r.push(`Prior to being an arcology owner, you were a child actor.`);
+				break;
 			case "BlackHat":
+			case "hacker":
+			case "script kiddy":
 				r.push(`Prior to being an arcology owner, you specialized in cracking databases and making mockeries of cyber security.`);
 				break;
 			case "arcology owner":
 				r.push(`Being an arcology owner defines your life now.`);
 				break;
 			case "escort":
+			case "prostitute":
 				r.push(`Prior to being an arcology owner, you knew how to survive off your looks and body.`);
 				break;
+			case "child prostitute":
+				r.push(`Prior to being an arcology owner, you had no choice but to sell your body to survive.`);
+				break;
 			case "servant":
+			case "handmaiden":
+			case "child servant":
 				r.push(`Prior to being an arcology owner, you served a well-off`);
-				if (V.PC.counter.birthMaster >= 2) {
+				if (V.PC.counter.birthMaster >= 8) {
+					r.push(`master as his breeder.`);
+				} else if (V.PC.counter.birthMaster >= 2) {
 					r.push(`master and bore him several children.`);
+				} else if (V.PC.counter.birthMaster >= 1) {
+					r.push(`master and bore him a child.`);
 				} else {
 					r.push(`master.`);
 				}
@@ -727,6 +828,12 @@ App.UI.Player.design = function() {
 			case "gang":
 				r.push(`Prior to being an arcology owner, you were the leader of a ruthless gang.`);
 				break;
+			case "hoodlum":
+				r.push(`Prior to being an arcology owner, you were a troublemaker in a gang.`);
+				break;
+			case "street urchin":
+				r.push(`Prior to being an arcology owner, you lived a hard life on the streets.`);
+				break;
 		}
 
 		r.push(`Word in the arcology is you acquired it through`);
@@ -756,47 +863,7 @@ App.UI.Player.design = function() {
 	if (allowEdits) {
 		options = new App.UI.OptionsGroup();
 
-		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-			State.temporary.vaginaPenis = 2;
-		} else if (V.PC.vagina !== -1) {
-			State.temporary.vaginaPenis = 1;
-		} else {
-			State.temporary.vaginaPenis = 0;
-		}
-
-		option = options.addOption("You have a", "vaginaPenis", State.temporary)
-			.addValue("Penis", 0, () => {
-				V.PC.preg = 0;
-				V.PC.pregType = 0;
-				V.PC.dick = 4;
-				V.PC.balls = 3;
-				V.PC.scrotum = 3;
-				V.PC.prostate = 1;
-				V.PC.vagina = -1;
-				V.PC.ovaries = 0;
-			}).addValue("Vagina", 1, () => {
-				V.PC.dick = 0;
-				V.PC.balls = 0;
-				V.PC.scrotum = 0;
-				V.PC.prostate = 0;
-				V.PC.vagina = 1;
-				V.PC.ovaries = 1;
-			}).addValue("Penis and Vagina", 2, () => {
-				V.PC.dick = 4;
-				V.PC.balls = 3;
-				V.PC.scrotum = 3;
-				V.PC.prostate = 1;
-				V.PC.vagina = 1;
-				V.PC.ovaries = 1;
-			});
-		if (State.temporary.vaginaPenis === 0) {
-			option.addComment("Standard sex scenes; easiest reputation maintenance.");
-		} else if (State.temporary.vaginaPenis === 1) {
-			option.addComment("Sex scene variations; most difficult reputation maintenance.");
-		} else {
-			option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
-		}
-
+		// obsolete?
 		if (V.cheatMode) {
 			options.addOption("Vagina", "vagina", V.PC).showTextBox();
 			options.addOption("New vagina", "newVag", V.PC).showTextBox();
@@ -811,7 +878,7 @@ App.UI.Player.design = function() {
 			options.addOption("Balls implant", "ballsImplant", V.PC).showTextBox();
 		}
 
-		if (V.PC.vagina !== -1) {
+		if (V.PC.vagina !== -1 && V.PC.pubertyXX === 1) {
 			option = options.addOption("You are", "preg", V.PC)
 				.addValue("Taking contraceptives", -1, () => { V.PC.pregType = 0; V.PC.labor = 0; })
 				.addValue("Not taking contraceptives", 0, () => { V.PC.pregType = 0; V.PC.labor = 0; })
@@ -864,83 +931,201 @@ App.UI.Player.design = function() {
 			}
 		}
 
-		if (V.PC.title === 1 && V.PC.boobs <= 100) {
-			option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 100, () => V.PC.boobsImplant = 0);
+		el.append(options.render());
+	} else {
+		r = [];
+
+		if (V.PC.boobs >= 300) {
+			r.push(`You have a`);
+			if (V.PC.title > 0) {
+				r.push(`masculine`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`body with`);
+			if (V.PC.shoulders > 1) {
+				r.push(`very broad shoulders`);
+			} else if (V.PC.shoulders > 0) {
+				r.push(`broad shoulders`);
+			} else if (V.PC.shoulders < -1) {
+				r.push(`very narrow shoulders`);
+			} else if (V.PC.shoulders < 0) {
+				r.push(`narrow shoulders`);
+			}
+			if (V.PC.shoulders !== 0) {
+				r.push(`and`);
+			}
+			let breastShapeDesc;
+			if (V.PC.boobShape === "saggy") {
+				breastShapeDesc = ` that sag a bit`;
+			} else if (V.PC.boobShape === "spherical") {
+				breastShapeDesc = ` that might just be a little too much implant now.`;
+			}
+			if (V.PC.boobs >= 1400) {
+				r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 1200) {
+				r.push(`huge`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 1000) {
+				r.push(`big`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 800) {
+				r.push(`noticeable breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 650) {
+				r.push(`unremarkable breasts${breastShapeDesc}.`);
+			} else if (V.PC.boobs >= 500) {
+				r.push(`average breasts${breastShapeDesc}.`);
+			} else {
+				r.push(`small breasts${breastShapeDesc}.`);
+			}
 		} else {
-			option = options.addOption("Your breasts are", "boobs", V.PC).addValue("Flat", 100, () => V.PC.boobsImplant = 0);
+			if (V.PC.title > 0) {
+				r.push(`You have a manly chest.`);
+			} else {
+				r.push(`You are flat as a board.`);
+			}
 		}
-		option.addValueList([
-			["C-cups", 500],
-			["DD-cups", 900],
-			["F-cups", 1100],
-			["G-cups", 1300]
-		]);
-		option.showTextBox("CCs");
-
-		if (V.PC.boobs >= 500) {
-			options.addOption("Your breasts are", "boobsImplant", V.PC)
-				.addValueList([
-					["All natural", 0],
-					["Fake", 400]
-				])
-				.showTextBox("CCs");
+		r.push(`Around back, you have`);
+		if (V.PC.butt > 10) {
+			r.push(`a disproportionate swelling of flesh`);
+		} else if (V.PC.butt > 7) {
+			r.push(`an absurdly large butt`);
+		} else if (V.PC.butt > 6) {
+			r.push(`a ridiculous ass`);
+		} else if (V.PC.butt > 5) {
+			r.push(`a gigantic ass`);
+		} else if (V.PC.butt > 4) {
+			r.push(`an enormous ass`);
+		} else if (V.PC.butt > 3) {
+			r.push(`a huge ass`);
+		} else if (V.PC.butt > 2) {
+			r.push(`a big butt`);
+		} else if (V.PC.butt > 1) {
+			r.push(`a shapely rear`);
+		} else if (V.PC.butt > 0) {
+			r.push(`a trim rear`);
+		} else {
+			r.push(`a flat ass`);
 		}
-
-		if (V.cheatMode) {
-			if (V.PC.boobs >= 500) {
-				options.addOption("Your breasts are", "lactation", V.PC)
-					.addValueList([
-						["Lactating", 1],
-						["Not Lactating", 0]
-					]);
-			}
+		r.push(`attached to a pair of`);
+		if (V.PC.hips > 2) {
+			r.push(`inhumanly wide hips.`);
+		} else if (V.PC.hips > 1) {
+			r.push(`very wide hips.`);
+		} else if (V.PC.hips > 0) {
+			r.push(`wide hips.`);
+		} else if (V.PC.hips > -1) {
+			r.push(`average hips.`);
+		} else if (V.PC.hips > -2) {
+			r.push(`narrow hips.`);
+		} else {
+			r.push(`very narrow hips.`);
 		}
 
-		options.addOption("Your butt size", "butt", V.PC)
-			.addValueList([
-				["Normal", 2],
-				["Big", 3],
-				["Huge", 4],
-				["Enormous", 5],
-			])
-			.showTextBox();
-
-		options.addOption("Your butt is", "buttImplant", V.PC)
-			.addValueList([
-				["All natural", 0],
-				["Fake", 1]
-			])
-			.showTextBox("CCs");
-
-
-		options.addOption("You are genetically", "genes", V.PC)
-			.addValue("XY").addValue("XX");
-
-		el.append(options.render());
-	} else {
-		r = [];
-		r.push(`You have a`);
-		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-			r.push(`penis and vagina`);
-		} else if (V.PC.dick !== 0) {
-			r.push(`penis.`);
-		} else if (V.PC.vagina !== -1) {
-			r.push(`vagina`);
+		r.push(`Between your legs, you have`);
+		if (V.PC.dick !== 0) {
+			if (V.PC.dick === 1) {
+				r.push(`a tiny, humilating`);
+			} else if (V.PC.dick === 2) {
+				r.push(`a small`);
+			} else if (V.PC.dick === 3) {
+				r.push(`an average`);
+			} else if (V.PC.dick === 4) {
+				r.push(`a big`);
+			} else if (V.PC.dick === 5) {
+				r.push(`a huge`);
+			} else if (V.PC.dick === 6) {
+				r.push(`a pussy wrecking`);
+			} else if (V.PC.dick === 7) {
+				r.push(`a massive, unusable`);
+			} else if (V.PC.dick === 8) {
+				r.push(`an imposing, if unusable,`);
+			} else if (V.PC.dick === 9) {
+				r.push(`a monster of a`);
+			} else if (V.PC.dick === 10) {
+				r.push(`an inhuman`);
+			} else {
+				r.push(`an unusable slab of sensetive flesh you call a`);
+			}
+			r.push(`dick`);
+			if (V.PC.balls !== 0) {
+				r.push(r.pop() + ",");
+			}
+			if (V.PC.balls === 1) {
+				if (V.PC.scrotum === 0) {
+					r.push(`a tiny pair of internal balls`);
+				} else {
+					r.push(`vestigial testicles`);
+				}
+			} else if (V.PC.balls === 2) {
+				if (V.PC.scrotum === 0) {
+					r.push(`a pair of internal balls`);
+				} else {
+					r.push(`a pair of small testicles`);
+				}
+			} else if (V.PC.balls === 3) {
+				r.push(`a pair of average testicles`);
+			} else if (V.PC.balls === 4) {
+				r.push(`a dangling pair of large balls`);
+			} else if (V.PC.balls === 5) {
+				r.push(`a dangling pair of heavy testicles`);
+			} else if (V.PC.balls === 6) {
+				r.push(`a heavy pair of huge balls`);
+			} else if (V.PC.balls === 7) {
+				r.push(`a ponderous set of giant testicles`);
+			} else if (V.PC.balls === 8) {
+				r.push(`a ponderous set of enormous testicles`);
+			} else if (V.PC.balls === 9) {
+				r.push(`a monstrous pair of testicles`);
+			} else {
+				r.push(`an inhuman pair of testicles`);
+			}
+			if (V.PC.vagina !== -1) {
+				r.push(`and`);
+			} else {
+				r.push(r.pop() + ".");
+			}
 		}
 		if (V.PC.vagina !== -1) {
-			r.push(`and are`);
+			if (V.PC.vagina === 0) {
+				r.push(`an unsullied`);
+			} else if (V.PC.vagina === 1 || V.PC.newVag === 1) {
+				// nothing
+			} else if (V.PC.vagina === 2) {
+				r.push(`an experienced`);
+			} else if (V.PC.vagina === 3) {
+				r.push(`a loose`);
+			} else if (V.PC.vagina === 4) {
+				r.push(`a very well-traveled`);
+			} else {
+				r.push(`a ruined`);
+			}
+			r.push(`vagina.`);
+		}
+		if (V.PC.vagina !== -1 && V.PC.mpreg !== 0) {
+			r.push(`You are`);
 			if (V.PC.pregWeek < 0) {
-				r.push(`recovering from your last pregnancy.`);
+				r.push(`currently recovering from your last pregnancy.`);
 			} else if (V.PC.preg === -2) {
-				r.push(`infertile.`);
+				r.push(`infertile and can't get pregnant.`);
 			} else if (V.PC.preg === -1) {
-				r.push(`taking contraceptives.`);
+				r.push(`taking contraceptives to avoid potential pregnancy.`);
 			} else if (V.PC.preg === 0) {
-				r.push(`fertile.`);
+				if (V.PC.pubertyXX === 0) {
+					r.push(`not yet fertile.`);
+				} else {
+					r.push(`fertile and capable of becoming pregnant.`);
+				}
 			} else if (V.PC.preg > 37) {
-				r.push(`extremely pregnant.`);
+				r.push(`extremely pregnant and likely to give birth soon.`);
 			} else if (V.PC.preg > 0) {
-				r.push(`pregnant.`);
+				r.push(`currently pregnant.`);
 			}
 
 			linkArray = [];
@@ -974,44 +1159,6 @@ App.UI.Player.design = function() {
 			}
 		}
 
-		if (V.PC.boobs >= 300) {
-			r.push(`You have a`);
-			if (V.PC.title > 0) {
-				r.push(`masculine`);
-			} else {
-				r.push(`feminine`);
-			}
-			r.push(`body with`);
-			if (V.PC.boobs >= 1400) {
-				r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits.`);
-			} else if (V.PC.boobs >= 1200) {
-				r.push(`huge`);
-				if (V.PC.boobsImplant !== 0) {
-					r.push(`fake`);
-				}
-				r.push(`breasts.`);
-			} else if (V.PC.boobs >= 1000) {
-				r.push(`big`);
-				if (V.PC.boobsImplant !== 0) {
-					r.push(`fake`);
-				}
-				r.push(`breasts.`);
-			} else if (V.PC.boobs >= 800) {
-				r.push(`noticeable breasts.`);
-			} else if (V.PC.boobs >= 650) {
-				r.push(`unremarkable breasts.`);
-			} else if (V.PC.boobs >= 500) {
-				r.push(`average breasts.`);
-			} else {
-				r.push(`small breasts.`);
-			}
-		} else {
-			if (V.PC.title > 0) {
-				r.push(`You have a manly chest.`);
-			} else {
-				r.push(`You are flat as a board.`);
-			}
-		}
 		App.Events.addNode(el, r, "p");
 	}
 
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index 42daf74d95270ba38c0e854d584be8049d7a49d4..dd4173e855497fa45df1def71a10920719d7c37c 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -609,7 +609,7 @@ App.Entity.PlayerState = class PlayerState {
 		 * * 70000-89999 - door-crowding
 		 * * 90000-100000 - door-jamming
 		 */
-		this.boobs = 100;
+		this.boobs = 200;
 		/** breast engorgement from unmilked tits */
 		this.boobsMilk = 0;
 		/**