diff --git a/src/endWeek/saChoosesOwnClothes.js b/src/endWeek/saChoosesOwnClothes.js
index 169954d1deb64cc6713f7cd8d660202718c1ecf1..6107a7d7e63d1f592c07e0a7dffddd3b7bcdae28 100644
--- a/src/endWeek/saChoosesOwnClothes.js
+++ b/src/endWeek/saChoosesOwnClothes.js
@@ -618,8 +618,10 @@ App.SlaveAssignment.choosesOwnClothes = function saChoosesOwnClothes(slave) {
 					wardrobeFS.push({text: `and wears spats and a tank top to look younger and more energetic.`, clothes: "spats and a tank top"});
 				}
 				if (V.arcologies[0].FSPhysicalIdealist > 0) {
-					wardrobeFS.push({text: `and coats ${himself} in body oil to show off how ${he}'s part of your physical idealism.`, clothes: "body oil"});
-					wardrobeFS.push({text: `and goes totally nude to show off how ${he}'s part of your physical idealism.`, clothes: "no clothing"});
+					if (slave.sexualFlaw !== "shamefast") {
+						wardrobeFS.push({text: `and coats ${himself} in body oil to show off how ${he}'s part of your physical idealism.`, clothes: "body oil"});
+						wardrobeFS.push({text: `and goes totally nude to show off how ${he}'s part of your physical idealism.`, clothes: "no clothing"});
+					}
 					wardrobeFS.push({text: `and slips into a leotard for ${his} next workout.`, clothes: "a leotard"});
 					wardrobeFS.push({text: `and slips into some spats for ${his} next workout.`, clothes: "spats and a tank top"});
 				} else if (V.arcologies[0].FSHedonisticDecadence > 0) {
@@ -642,15 +644,19 @@ App.SlaveAssignment.choosesOwnClothes = function saChoosesOwnClothes(slave) {
 				}
 				if (V.arcologies[0].FSBodyPurist > 0) {
 					wardrobeFS.push({text: `and wears a leotard to show off the purity of ${his} body.`, clothes: "a leotard"});
-					wardrobeFS.push({text: `but decides ${his} body is too nice to hide with clothing.`, clothes: "no clothing"});
-					if (isItemAccessible.entry("body oil") === true) {
-						wardrobeFS.push({text: `and coats ${his} pure body in oil to make it stand out.`, clothes: "body oil"});
+					if (slave.sexualFlaw !== "shamefast") {
+						wardrobeFS.push({text: `but decides ${his} body is too nice to hide with clothing.`, clothes: "no clothing"});
+						if (isItemAccessible.entry("body oil") === true) {
+							wardrobeFS.push({text: `and coats ${his} pure body in oil to make it stand out.`, clothes: "body oil"});
+						}
 					}
 				} else if (V.arcologies[0].FSTransformationFetishist > 0) {
 					wardrobeFS.push({text: `and decides squeezing into a latex suit will only complement ${his} unnatural appearance.`, clothes: "restrictive latex"});
-					wardrobeFS.push({text: `and decides to go nude, ensuring everyone sees ${his} assets.`, clothes: "no clothing"});
-					if (isItemAccessible.entry("body oil") === true) {
-						wardrobeFS.push({text: `and coats ${his} assets in body oil to give them some extra shine.`, clothes: "body oil"});
+					if (slave.sexualFlaw !== "shamefast") {
+						wardrobeFS.push({text: `and decides to go nude, ensuring everyone sees ${his} assets.`, clothes: "no clothing"});
+						if (isItemAccessible.entry("body oil") === true) {
+							wardrobeFS.push({text: `and coats ${his} assets in body oil to give them some extra shine.`, clothes: "body oil"});
+						}
 					}
 				}
 				if (V.arcologies[0].FSAssetExpansionist > 0) {
@@ -701,7 +707,7 @@ App.SlaveAssignment.choosesOwnClothes = function saChoosesOwnClothes(slave) {
 					}
 				}
 				if (V.arcologies[0].FSChattelReligionist > 0) {
-					if (V.arcologies[0].FSChattelReligionistLaw2 === 1) {
+					if (V.arcologies[0].FSChattelReligionistLaw2 === 1 && slave.sexualFlaw !== "shamefast") {
 						wardrobeFS.push({text: `but chooses to stay nude to promote Holy Nudism.`, clothes: "no clothing"});
 						if (isItemAccessible.entry("body oil") === true) {
 							wardrobeFS.push({text: `and coats ${his} body in oil to highlight what God has given ${him}.`, clothes: "body oil"});
diff --git a/src/endWeek/saChoosesOwnJob.js b/src/endWeek/saChoosesOwnJob.js
index 5c08029c433a542726925fa79861848b096a455f..ae1fdab11dfc9f0764c6e7f91d0ff74f9babff42 100644
--- a/src/endWeek/saChoosesOwnJob.js
+++ b/src/endWeek/saChoosesOwnJob.js
@@ -2,7 +2,6 @@
  * This function is the old "first pass", which actually picks the job.
  * The slaves' reasoning is saved in saVars for later use.
  * @param {App.Entity.SlaveState} slave
- * @returns {string}
  */
 App.SlaveAssignment.choosesOwnJob = function saChoosesOwnJob(slave) {
 	/** @type {string[]} */
@@ -156,8 +155,8 @@ App.SlaveAssignment.choosesOwnJob = function saChoosesOwnJob(slave) {
 				choice.push(`is obedient but not devoted, so ${he} <span class="job change">decides to work as a servant</span> since it's the least sexually demanding job available.`);
 				choice.push(assignJob(slave, "be a servant"));
 			}
-		} else if (V.universalRulesAssignsSelfFacility === 1 && slave.devotion > 50 && canWalk(slave) && canSee(slave) && V.nursery > nurseryL && (V.cribs.findIndex((c) => (c.mother === slave.ID || c.father === slave.ID)))) {
-			if (V.cribs.findIndex((c) => (c.mother === slave.ID || c.father === slave.ID))) {
+		} else if (V.universalRulesAssignsSelfFacility === 1 && slave.devotion > 50 && canWalk(slave) && canSee(slave) && V.nursery > nurseryL && (V.cribs.find((c) => (c.mother === slave.ID || c.father === slave.ID)))) {
+			if (V.cribs.find((c) => (c.mother === slave.ID || c.father === slave.ID))) {
 				choice.push(`wants to look after ${his} child, so ${he} <span class="job change">decides to work in ${V.nurseryName}.</span>`);
 				choice.push(assignJob(slave, "work as a nanny"));
 			} else { // motherly sexualQuirk
diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js
index 5269ecd65078d6b51489a23ea20fb1c74c028afe..dd3f6677b956d0327e228368269276630a0f8be2 100644
--- a/src/endWeek/saClothes.js
+++ b/src/endWeek/saClothes.js
@@ -315,6 +315,19 @@ App.SlaveAssignment.clothes = function saClothes(slave) {
 							slave.trust += 1;
 						}
 						break;
+					case "body oil":
+						if (slave.sexualFlaw === "shamefast") {
+							r.push(`${He} is <span class="mediumorchid">mortified</span> that ${he} has nothing but oil to cover up ${his} body, and is incapable of taking pleasure in getting all oiled up.`);
+							slave.devotion -= 3;
+						} else if (slave.devotion < -20) {
+							r.push(`${He} is <span class="mediumorchid">inappropriately pleased</span> by the sensual process of oiling up ${his} body.`);
+							slave.devotion -= 3;
+						} else {
+							r.push(`${His} <span class="mediumaquamarine">confidence</span> and <span class="hotpink">devotion</span> are reinforced by the sensual process of oiling up ${his} body every morning.`);
+							slave.devotion += 1;
+							slave.trust += 1;
+						}
+						break;
 					default:
 						if (slave.devotion <= 20) {
 							if (App.Data.clothes.get(slave.clothes).exposure === 0) {
diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js
index 531cd4e961fc6ab51d09859a97a92ef93ba99338..24a0d9491e23802bb2450ddc3a1380283c717032 100644
--- a/src/events/intro/pcAppearance.js
+++ b/src/events/intro/pcAppearance.js
@@ -318,10 +318,7 @@ App.UI.Player.appearance = function(options, summary = false) {
 			options.addOption("Your clit is", "clit", V.PC)
 				.addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]]);
 			options.addOption("It is", "foreskin", V.PC)
-				.addValueList([
-					["Exposed by a circumcision", 0]
-					["Covered by a hood", 1],
-				])
+				.addValueList([["Exposed by a circumcision", 0],["Covered by a hood", 1]]);
 		}
 		if (V.PC.physicalAge <= 18) {
 			options.addOption("You are", "vagina", V.PC)
diff --git a/src/events/recFS/recfsYouthPreferentialist.js b/src/events/recFS/recfsYouthPreferentialist.js
index 7b22a5752ff95eb136489c0799d587b5169dab4c..edbc2a43132299bfabf538de63c4431f45096dfe 100644
--- a/src/events/recFS/recfsYouthPreferentialist.js
+++ b/src/events/recFS/recfsYouthPreferentialist.js
@@ -21,12 +21,7 @@ App.Events.recFSYouthPreferentialist = class recFSYouthPreferentialist extends A
 		setHealth(slave, jsRandom(-40, 30), undefined, undefined, 0, 70);
 		slave.devotion = random(10, 15);
 		slave.trust = random(-55, -75);
-		/*
-		slave.anus = random(2,3);
-		slave.weight = random(-80,-20);
-		slave.boobs -= 50*random(1,2);
-		slave.butt -= random(0,1);
-		*/
+		slave.birthWeek = 0; // turns {age} this week
 		slave.behavioralFlaw = either("anorexic", "devout", "gluttonous", "hates men", "hates women", "odd");
 		slave.sexualFlaw = either("apathetic", "hates anal", "hates oral", "repressed", "shamefast");
 
diff --git a/src/events/scheduled/sePCBirthday.desc.js b/src/events/scheduled/sePCBirthday.desc.js
index 3a5c9624c13660f76ad938974899f4ac46f174b7..a609c995ac881fae83656c3baf03d36616bbae31 100644
--- a/src/events/scheduled/sePCBirthday.desc.js
+++ b/src/events/scheduled/sePCBirthday.desc.js
@@ -188,7 +188,7 @@ App.Events.pcBirthday.Desc = (function(bday) {
 					When you look back down at your screen, you find a trio of beautiful, curvaceous slaves, fumbling over each other in a hedonistic pile. "...Maybe," you
 					hear ${data.assistPN.her} clarify.
 				</p>
-				${this.renderChoice_Business_AssistantVideo()}
+				${this.renderChoice_Business_AssistantVideo(data)}
 				<p>
 					You look over at ${V.assistant.name} again. "Happy birthday, ${properTitle()}. I spent all week rendering it. Now let's make some money!"
 				</p>`;
@@ -212,8 +212,9 @@ App.Events.pcBirthday.Desc = (function(bday) {
 		},
 		/**
 		 * Helper function for a mini-scene.
+		 * @param {App.Events.pcBirthday.EventData} data
 		 */
-		renderChoice_Business_AssistantVideo: function() {
+		renderChoice_Business_AssistantVideo: function(data) {
 			let slaveDescSing = "woman";
 			let slaveDescPlural = "women";
 
diff --git a/src/events/scheduled/sePCBirthday.js b/src/events/scheduled/sePCBirthday.js
index 98d37d7e3c051ca0caddc11f2ae84d660ca7da61..51274ce8de135086247e1e56dad6a5943cc94778 100644
--- a/src/events/scheduled/sePCBirthday.js
+++ b/src/events/scheduled/sePCBirthday.js
@@ -30,6 +30,7 @@ App.Events.SEpcBirthday = class SEpcBirthday extends App.Events.BaseEvent {
  * @property {?App.Events.pcBirthday.PlannerData} planner The possible party planner and their role; may be `null` if none is found. See `determinePlanner()`.
  * The scene doesn't *have* to use the planner, even if one is found.
  * @property {App.Utils.Pronouns} assistPN Pronouns for the player's assistant.
+ * @property {App.Utils.Pronouns} marketPN Pronouns for the market assistant.
  * @property {string} attire Records the dress type chosen by the player in some branches.
  */
 
diff --git a/src/facilities/incubator/inspectTankSettings.js b/src/facilities/incubator/inspectTankSettings.js
index d18fb381a9f8eca633c1e63f18a0fc057dc7efb0..8dc3c1492679e5502daacc308b3cf4a694b20879 100644
--- a/src/facilities/incubator/inspectTankSettings.js
+++ b/src/facilities/incubator/inspectTankSettings.js
@@ -1,7 +1,4 @@
 App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
-
-	// V.nextLink = "Incubator";
-	// V.storedLink = "Incubator";
 	let tankSetting;
 	let child;
 	let fetus;
@@ -41,7 +38,7 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 
 		/* Age */
 		if (isFetus) {
-			let target = Math.round(tankSetting.targetAge);		//This is fine because it will only be displayed when growTime has not been depeleted
+			let target = Math.round(tankSetting.targetAge);		// This is fine because it will only be displayed when growTime has not been depleted
 			let r = [];
 			r.push("Target age for release:");
 			r.push(
@@ -84,7 +81,7 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 					() => {
 						target = V.potencyAge;
 						tankSetting.targetAge = target;
-						jQuery(container).empty().append(content());					
+						jQuery(container).empty().append(content());
 					}
 				)
 			);
@@ -94,7 +91,7 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 					() => {
 						target = 18;
 						tankSetting.targetAge = target;
-						jQuery(container).empty().append(content());					
+						jQuery(container).empty().append(content());
 					}
 				)
 			);
@@ -106,7 +103,7 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 			if (isFetus) {
 				section.append(`Target age for release: ${tankSetting.targetAge}`);
 			} else {
-				section.append(`Target age for release: ${child.physicalAge}`);		//This is already set, apparently
+				section.append(`Target age for release: ${child.physicalAge}`);		// This is already set, apparently
 			}
 			section.append(App.UI.DOM.makeElement("div", `Cannot be changed on tanks in use`));
 			node.append(section);
@@ -284,10 +281,9 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 			if (isFetus) {
 				section.append(" ", App.UI.DOM.generateLinksStrip(linkArray));
 			}
+		}
 
-		} 
-
-		if ( V.incubator.upgrade.reproduction === 1 && V.incubator.upgrade.pregAdaptation === 1 && !isFetus) {
+		if (V.incubator.upgrade.reproduction === 1 && V.incubator.upgrade.pregAdaptation === 1 && !isFetus) {
 			section.append(App.UI.DOM.makeElement("div", `Due to the high complexity and steep risks of the procedure, these settings cannot be changed on tanks in use.`));
 		}
 		node.append(section);
@@ -414,4 +410,4 @@ App.UI.inspectTankSettings = function(isFetus, isPCMother = false) {
 			}
 		);
 	}
-}
\ No newline at end of file
+};
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 4f366fbe24667e6e2d84759a3566a44352fdca8e..f1d7677bc16c7c6d5e472a7c5377d480c83c34da 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -2483,7 +2483,10 @@ globalThis.getSlaveStatisticData = function(s, facility) {
 			rep: 0,
 			food: 0,
 			cost: getSlaveCost(s),
-			customers: 0 // brothel, club, ...
+			customers: 0, // brothel, club, ...
+			milk: 0,
+			cum: 0,
+			fluid: 0, // diary
 		};
 	}
 
@@ -2504,7 +2507,10 @@ globalThis.getSlaveStatisticData = function(s, facility) {
 		rep: 0,
 		food: 0,
 		cost: getSlaveCost(s),
-		customers: 0 /* brothel, club, ... */
+		customers: 0, /* brothel, club, ... */
+		milk: 0,
+		cum: 0,
+		fluid: 0, // diary
 	};
 	facility.income.set(s.ID, data);
 	return data;
diff --git a/src/npc/interaction/fDick.js b/src/npc/interaction/fDick.js
index 0b2e6e17e9923573f472278714cfe9972bc81154..ca1feda9145223c2f9b1b0af151862146b9e5b3d 100644
--- a/src/npc/interaction/fDick.js
+++ b/src/npc/interaction/fDick.js
@@ -12,7 +12,7 @@ App.Interact.fDick = function(slave) {
 
 	// TODO: .pregMood and more amp variants
 
-	seX(slave, "penetrative", V.PC);
+	seX(slave, "penetrative", V.PC, V.PC.vagina !== -1 ? "vaginal" : "anal");
 
 	const cunt = V.PC.vagina !== -1 ? "cunt" : "rectal"; // TODO: probably ought to be able to *choose* vaginal or anal sex if they're both valid
 	const belly = bellyAdjective(slave);