diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js
index 07531193cf1c37f3161d8cd45255d94b663cc9fe..8b2dc789b7002700b16b38a071dc888d22956560 100644
--- a/js/003-data/miscData.js
+++ b/js/003-data/miscData.js
@@ -266,6 +266,8 @@ App.Data.misc = {
 	naturalNippleColors: ["black", "brown", "dark brown", "ebony", "ivory", "light brown", "pale pink", "pink"],
 	eyebrowStyles: new Set(["shaved", "straight", "rounded", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved"]),
 	eyebrowFullness: new Set(["pencil-thin", "thin", "threaded", "natural", "tapered", "thick", "bushy"]),
+	pubicStyles: new Set(["waxed", "in a strip", "neat", "bushy", "bushy in the front and neat in the rear", "very bushy"]),
+	armpitStyles: new Set(["waxed", "shaved", "neat", "bushy"]),
 
 	/* START Custom Nationalities region filter */
 	/* Not currently weighted, but will accept weights */
diff --git a/src/facilities/salon/salon.tw b/src/facilities/salon/salon.tw
index 4a25caef669034cd8cd1104d7514ce4d7b251b9b..7f45daea54c9c041544a9ebe80535e05ee64f246 100644
--- a/src/facilities/salon/salon.tw
+++ b/src/facilities/salon/salon.tw
@@ -17,18 +17,6 @@
 	<<= getSlave($AS).slaveName>> is seated in the auto salon. $He is awaiting your artistic pleasure.
 </span>
 
-/* 000-250-006 */
-<span id="art-frame">
-	<<if $seeImages == 1>>
-		<<if $imageChoice == 1>>
-			<div class="imageRef lrgVector"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
-		<<else>>
-			<div class="imageRef lrgRender"><div class="mask">&nbsp;</div><<= SlaveArt(getSlave($AS), 3, 0)>></div>
-		<</if>>
-	<</if>>
-</span>
-/* 000-250-006 */
-
 /* EYES */
 
 <h3>Eyewear</h3>
diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js
index 67da357ba99433096bfa5b3f5c632b8fa1e6bddf..dc506f4096d49219cf8d075e2f5bbdca7be0c6c9 100644
--- a/src/facilities/salon/salonPassage.js
+++ b/src/facilities/salon/salonPassage.js
@@ -8,11 +8,9 @@ App.UI.salon = function(slave, cheat = false) {
 	container.id = "salon";
 	const {
 		He, His,
-		he, his, him, himself
+		he, his, him
 	} = getPronouns(slave);
 	Enunciate(slave);
-	const _oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength;
-	let _newHLength = 0;
 
 	container.append(createPage());
 	return container;
@@ -21,7 +19,7 @@ App.UI.salon = function(slave, cheat = false) {
 		const el = new DocumentFragment();
 		if (!cheat) {
 			if (V.seeImages > 0) {
-				//App.Events.drawEventArt(el, slave);
+				App.Events.drawEventArt(el, slave);
 			}
 			el.append(intro());
 		}
@@ -150,7 +148,7 @@ App.UI.salon = function(slave, cheat = false) {
 		const el = new DocumentFragment();
 		App.UI.DOM.appendNewElement("h2", el, "Hair");
 
-		el.append(App.Medicine.Salon.hair(slave, { cheat: cheat }));
+		el.append(App.Medicine.Salon.hair(slave, {cheat: cheat}));
 		return el;
 	}
 
@@ -195,7 +193,7 @@ App.UI.salon = function(slave, cheat = false) {
 				}
 			}
 			if (slave.skin !== "spray tanned") {
-				option.addValue("Spray tan", "sun tanned", billMod)
+				option.addValue("Spray tan", "sun tanned", billMod);
 			}
 			option.addComment(comment.join(" "));
 		}
@@ -242,16 +240,11 @@ App.UI.salon = function(slave, cheat = false) {
 		let option;
 		let r = [];
 		App.UI.DOM.appendNewElement("h2", el, "Body hair");
+
+		// Eyebrows
 		if (slave.eyebrowHStyle !== "bald") {
 			// Describe and change color
-			r.push(`${His}`);
-			if (slave.eyebrowFullness !== "natural") {
-				r.push(slave.eyebrowFullness);
-			}
-			if (slave.eyebrowHStyle !== "natural") {
-				r.push(r.pop(), `, ${slave.eyebrowHStyle}`);
-			}
-			r.push(`eyebrows`);
+			r.push(`${His} eyebrows`);
 			if (slave.eyebrowHStyle === "shaved") {
 				r.push(`would be ${slave.eyebrowHColor} if present.`);
 			} else {
@@ -260,7 +253,7 @@ App.UI.salon = function(slave, cheat = false) {
 
 			option = options.addOption(r.join(" "), "eyebrowHColor", slave);
 			if (slave.eyebrowHColor !== slave.hColor) {
-				 option.addValue("Match the hair", slave.hColor);
+				option.addValue("Match the hair", slave.hColor);
 			}
 			option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value)));
 			option.addCallbackToEach(billMod);
@@ -282,6 +275,80 @@ App.UI.salon = function(slave, cheat = false) {
 		} else {
 			options.addComment(`${His} eyebrows are completely hairless.`);
 		}
+
+		// Pubic hair
+		const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY);
+		r = [];
+		const hasPubes = (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1);
+		if (hasPubes) {
+			r.push(`${His}`);
+			if (slave.physicalAge < _pubertyAge) {
+				r.push(`wispy pubic hair, which is just starting to grow in,`);
+			} else if (slave.pubicHStyle === "in a strip") {
+				r.push(`pubic hair, which is shaved into a strip,`);
+			} else {
+				r.push(`${slave.pubicHStyle} pubic hair`);
+			}
+			if (slave.pubicHStyle === "waxed") {
+				r.push(`would be ${slave.pubicHColor} if present.`);
+			} else {
+				r.push(`is ${slave.pubicHColor}.`);
+			}
+		} else {
+			r.push(`${His} groin is completely hairless.`);
+		}
+		option = options.addOption(r.join(" "), "pubicHColor", slave);
+		if (hasPubes) {
+			if (slave.pubicHColor !== slave.hColor) {
+				option.addValue("Match the curtains", slave.pubicHColor);
+			}
+			option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value)))
+				.addCallbackToEach(billMod)
+				.pulldown();
+
+			// Style
+			option = options.addOption(`Style ${his} pubic hair`, "pubicHStyle", slave);
+			for (const fullness of App.Data.misc.pubicStyles) {
+				option.addValue(capFirstChar(fullness), fullness, billMod);
+			}
+			option.pulldown();
+		}
+
+		// Armpit hair
+		r = [];
+		const hasPitHair = (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1);
+		if (hasPitHair) {
+			r.push(`${His}`);
+			if (slave.physicalAge < _pubertyAge) {
+				r.push(`wispy underarm hair`);
+			} else {
+				r.push(`${slave.underArmHStyle} underarm hair`);
+			}
+			if (slave.underArmHStyle === "waxed") {
+				r.push(`would be ${slave.underArmHColor} if present.`);
+			} else {
+				r.push(`is ${slave.underArmHColor}.`);
+			}
+		} else {
+			r.push(`${His} underarms are completely hairless.`);
+		}
+		option = options.addOption(r.join(" "), "underArmHColor", slave);
+		if (hasPitHair) {
+			if (slave.underArmHColor !== slave.hColor) {
+				option.addValue("Match the hair", slave.hColor);
+			}
+			option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value)))
+				.addCallbackToEach(billMod)
+				.pulldown();
+
+			// Style
+			option = options.addOption(`Style ${his} armpit hair`, "underArmHStyle", slave);
+			for (const fullness of App.Data.misc.armpitStyles) {
+				option.addValue(capFirstChar(fullness), fullness, billMod);
+			}
+			option.pulldown();
+		}
+
 		el.append(options.render());
 		return el;
 	}
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 330e60e70df712c8e8e539831c2c0681942d3bdc..c176fb9f72c73a4e7bfe7743e67fad785e29a3ff 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -3121,14 +3121,7 @@ globalThis.rulesAssistantOptions = (function() {
 
 	class PubicHairStyleList extends ListSelector {
 		constructor() {
-			const pairs = [
-				["waxed"],
-				["in a strip"],
-				["neat"],
-				["bushy"],
-				["bushy in the front and neat in the rear"],
-				["very bushy"]
-			];
+			const pairs = Array.from(App.Data.misc.pubicStyles, style => [capFirstChar(style), style]);
 			super("Pubic hairstyle", pairs);
 			this.setValue(current_rule.set.pubicHStyle);
 			this.onchange = (value) => current_rule.set.pubicHStyle = value;
@@ -3146,12 +3139,7 @@ globalThis.rulesAssistantOptions = (function() {
 
 	class ArmpitHairStyleList extends ListSelector {
 		constructor() {
-			const pairs = [
-				["waxed"],
-				["shaved"],
-				["neat"],
-				["bushy"]
-			];
+			const pairs = Array.from(App.Data.misc.armpitStyles, style => [capFirstChar(style), style]);
 			super("Underarm hair style", pairs);
 			this.setValue(current_rule.set.underArmHStyle);
 			this.onchange = (value) => current_rule.set.underArmHStyle = value;