diff --git a/devTools/types/SugarCubeExtensions.d.ts b/devTools/types/SugarCubeExtensions.d.ts
index e8709b836aec7898ad34082c2a5df7c74d817d19..571c21cc390dc5a4c454f388b7114b043b622cbb 100644
--- a/devTools/types/SugarCubeExtensions.d.ts
+++ b/devTools/types/SugarCubeExtensions.d.ts
@@ -24,8 +24,6 @@ declare module "twine-sugarcube" {
 		filterRaces: string[];
 		filterRacesLowercase: FC.Race[];
 		filterRegions: string[];
-		heightBoostingShoes: string[];
-		highHeels: string[];
 
 		pregData: Record<string, FC.PregnancyData>;
 
diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js
index 9f94290f117c770af3d5afa313808f67eea25958..115fde838b2bcd7d4644101628380081f33d1681 100644
--- a/js/003-data/miscData.js
+++ b/js/003-data/miscData.js
@@ -1564,9 +1564,6 @@ App.Data.misc = {
 	fakeBellies: ["a huge empathy belly", "a large empathy belly", "a medium empathy belly", "a small empathy belly"],
 	/* lets fake bellies be separated from other .bellyAccessory */
 
-	highHeels: ["boots", "extreme heels", "extreme platform heels", "heels", "platform heels"],
-	heightBoostingShoes: ["extreme heels", "extreme platform heels", "heels", "platform heels", "platform shoes", "pumps"],
-
 	paraphiliaList: ["abusive", "anal addict", "attention whore", "breast growth", "breeder", "cum addict", "malicious", "neglectful", "self hating"],
 
 	baseNationalities: ["Afghan", "Albanian", "Algerian", "American", "Andorran", "Angolan", "Antiguan", "Argentinian", "Armenian", "Aruban", "Australian", "Austrian", "Azerbaijani", "Bahamian", "Bahraini", "Bangladeshi", "Barbadian", "Belarusian", "Belgian", "Belizean", "Beninese", "Bermudian", "Bhutanese", "Bissau-Guinean", "Bolivian", "Bosnian", "Brazilian", "British", "Bruneian", "Bulgarian", "Burkinabé", "Burmese", "Burundian", "Cambodian", "Cameroonian", "Canadian", "Cape Verdean", "Catalan", "Central African", "Chadian", "Chilean", "Chinese", "Colombian", "Comorian", "Congolese", "a Cook Islander", "Costa Rican", "Croatian", "Cuban", "Curaçaoan", "Cypriot", "Czech", "Danish", "Djiboutian", "Dominican", "Dominiquais", "Dutch", "East Timorese", "Ecuadorian", "Egyptian", "Emirati", "Equatoguinean", "Eritrean", "Estonian", "Ethiopian", "Fijian", "Filipina", "Finnish", "French", "French Guianan", "French Polynesian", "Gabonese", "Gambian", "Georgian", "German", "Ghanan", "Greek", "Greenlandic", "Grenadian", "Guamanian", "Guatemalan", "Guinean", "Guyanese", "Haitian", "Honduran", "Hungarian", "I-Kiribati", "Icelandic", "Indian", "Indonesian", "Iranian", "Iraqi", "Irish", "Israeli", "Italian", "Ivorian", "Jamaican", "Japanese", "Jordanian", "Kazakh", "Kenyan", "Kittitian", "Korean", "Kosovan", "Kurdish", "Kuwaiti", "Kyrgyz", "Laotian", "Latvian", "Lebanese", "Liberian", "Libyan", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Macedonian", "Malagasy", "Malawian", "Malaysian", "Maldivian", "Malian", "Maltese", "Marshallese", "Mauritanian", "Mauritian", "Mexican", "Micronesian", "Moldovan", "Monégasque", "Mongolian", "Montenegrin", "Moroccan", "Mosotho", "Motswana", "Mozambican", "Namibian", "Nauruan", "Nepalese", "New Caledonian", "a New Zealander", "Ni-Vanuatu", "Nicaraguan", "Nigerian", "Nigerien", "Niuean", "Norwegian", "Omani", "Pakistani", "Palauan", "Palestinian", "Panamanian", "Papua New Guinean", "Paraguayan", "Peruvian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Rwandan", "Sahrawi", "Saint Lucian", "Salvadoran", "Sammarinese", "Samoan", "São Toméan", "Saudi", "Scottish", "Senegalese", "Serbian", "Seychellois", "Sierra Leonean", "Singaporean", "Slovak", "Slovene", "a Solomon Islander", "Somali", "South African", "South Sudanese", "Spanish", "Sri Lankan", "Sudanese", "Surinamese", "Swazi", "Swedish", "Swiss", "Syrian", "Taiwanese", "Tajik", "Tanzanian", "Thai", "Tibetan", "Togolese", "Tongan", "Trinidadian", "Tunisian", "Turkish", "Turkmen", "Tuvaluan", "Ugandan", "Ukrainian", "Uruguayan", "Uzbek", "Vatican", "Venezuelan", "Vietnamese", "Vincentian", "Yemeni", "Zairian", "Zambian", "Zimbabwean"],
diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js
index 03ad7172883e89977867e3647bce011dc18f92c4..b9681730add67c3985bb75a6587d6c06b233d919 100644
--- a/js/003-data/slaveWearData.js
+++ b/js/003-data/slaveWearData.js
@@ -940,42 +940,6 @@ App.Data.slaveWear = {
 		],
 	]),
 
-	shoes: new Map([
-		["none", {name: "Barefoot"}],
-		["flats", {name: "Flats"}],
-		["heels", {name: "Heels"}],
-		["pumps", {name: "Pumps"}],
-		["boots", {name: "Thigh boots"}],
-		["extreme heels", {name: "Painfully extreme heels"}],
-		["platform shoes",
-			{
-				name: "Platforms",
-				fs: "FSStatuesqueGlorification",
-				get requirements() {
-					return (V.boughtItem.shoes.heels === 1);
-				}
-			}
-		],
-		["platform heels",
-			{
-				name: "Platform heels",
-				fs: "FSStatuesqueGlorification",
-				get requirements() {
-					return (V.boughtItem.shoes.heels === 1);
-				}
-			}
-		],
-		["extreme platform heels",
-			{
-				name: "Painfully extreme platform heels",
-				fs: "FSStatuesqueGlorification",
-				get requirements() {
-					return (V.boughtItem.shoes.heels === 1);
-				}
-			}
-		],
-	]),
-
 	bellyAccessories: new Map([
 		["none", {name: "None"}],
 		["a corset", {name: "Tight corset"}],
@@ -1166,6 +1130,97 @@ App.Data.slaveWear = {
 		]
 	]),
 };
+/**
+ * @typedef {object} slaveShoes
+ * @property {string} name
+ * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS.
+ * @property {boolean} [requirements]
+ * @property {boolean} [harsh]
+ * @property {number} heelHeight height in cm.  Over 4cm they may totter.  21cm and over (8 inch heels) will be painful/extreme
+ * @property {number} platformHeight height in cm.  Adds to heel height.
+ */
+
+/**
+ * @type {Map<string, slaveShoes>} slaveShoesCategory
+ */
+App.Data.shoes = new Map([ // TODO: add lift property
+	["none",
+		{
+			name: "Barefoot",
+			heelHeight: 0,
+			platformHeight: 0
+		}
+	],
+	["flats",
+		{
+			name: "Flats",
+			heelHeight: 0,
+			platformHeight: 0
+		}
+	],
+	["pumps",
+		{
+			name: "Pumps",
+			heelHeight: 5, // 2 inch heels
+			platformHeight: 0
+		}
+	],
+	["heels",
+		{
+			name: "Heels",
+			heelHeight: 13, // 5 inch heels
+			platformHeight: 0
+		}
+	],
+	["boots",
+		{
+			name: "Thigh boots",
+			heelHeight: 13, // 5 inch heels
+			platformHeight: 0
+		}
+	],
+	["extreme heels",
+		{
+			name: "Painfully extreme heels",
+			heelHeight: 21, // 8 inch heels
+			platformHeight: 0
+		}
+	],
+	["platform shoes",
+		{
+			name: "Platforms",
+			fs: "FSStatuesqueGlorification",
+			get requirements() {
+				return (V.boughtItem.shoes.heels === 1);
+			},
+			heelHeight: 0,
+			platformHeight: 8 // 3 inch platform, no heels
+		}
+	],
+	["platform heels",
+		{
+			name: "Platform heels",
+			fs: "FSStatuesqueGlorification",
+			get requirements() {
+				return (V.boughtItem.shoes.heels === 1);
+			},
+			heelHeight: 13, // 8 inches, but not painful like extremes (3 inch platforms)
+			platformHeight: 8
+		}
+	],
+	["extreme platform heels",
+		{
+			name: "Painfully extreme platform heels",
+			fs: "FSStatuesqueGlorification",
+			get requirements() {
+				return (V.boughtItem.shoes.heels === 1);
+			},
+			heelHeight: 21, // 12 inches! 8 inch heel, 4 inch platform
+			platformHeight: 10
+		}
+	],
+]);
+
 /**
  * @typedef {object} slaveWearChastity
  * @property {string} name
diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js
index 82ae98860059f5fcbddb59fba3e515f5098f6fff..ef0b21b94079e76f3a3a5bde86457534c72fa49a 100644
--- a/src/endWeek/saLongTermMentalEffects.js
+++ b/src/endWeek/saLongTermMentalEffects.js
@@ -1861,7 +1861,7 @@ App.SlaveAssignment.longTermMentalEffects = (function() {
 			}
 		}
 		if (slave.heels === 1) {
-			if (!["boots", "extreme heels", "heels", "pumps"].includes(slave.shoes)) {
+			if (shoeHeelCategory(slave) === 0) {
 				if (slave.fetish !== "submissive") {
 					if (slave.career === "a dairy cow" || slave.career === "a breeding bull") {
 						r.push(`${He} sees ${himself} as an animal, and as such, is perfectly content`);
diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js
index e17fd0dc15aa2ce4dcb0cb2c9d9d58275b6397ed..65fbc8197b8a59efaa794ceebb7afed0630a30a6 100644
--- a/src/endWeek/saLongTermPhysicalEffects.js
+++ b/src/endWeek/saLongTermPhysicalEffects.js
@@ -1527,7 +1527,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 						} else {
 							r.push(`or would be if ${he} had both legs,`);
 						}
-					} else if (slave.heels === 1 && !setup.highHeels.includes(slave.shoes)) {
+					} else if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 						if (hindrances.length > 1) {
 							r.push(`but ultimately ${his} heels having been clipped,`);
 						} else {
@@ -1546,7 +1546,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() {
 						r.push(`leglessness renders`);
 					} else if ((!hasBothLegs(slave))) {
 						r.push(`missing leg renders`);
-					} else if (slave.heels === 1 && !["boots", "extreme heels", "heels"].includes(slave.shoes)) {
+					} else if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 						r.push(`clipped heels render`);
 					}
 				}
diff --git a/src/events/RESS/muscles.js b/src/events/RESS/muscles.js
index 0010a7e02f1e24539ed8173437463cc0d63a9e78..f63755302d141bd5f7f830fd2523fe2debe755b8 100644
--- a/src/events/RESS/muscles.js
+++ b/src/events/RESS/muscles.js
@@ -31,7 +31,7 @@ App.Events.RESSMuscles = class RESSMuscles extends App.Events.BaseEvent {
 		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
 		if (!canWalk(eventSlave)) {
 			t.push(`crawls`);
-		} else if ((eventSlave.shoes === "heels") || (eventSlave.shoes === "pumps") || (eventSlave.shoes === "boots") || (eventSlave.shoes === "extreme heels")) {
+		} else if (shoeHeelCategory(eventSlave) > 1) {
 			t.push(`totters`);
 		} else if (eventSlave.belly >= 10000) {
 			t.push(`waddles`);
diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js
index 0d1388a2c7884c96ef1758240b5f14ff0cce6907..5d4f914ce1e79c5ad93b0351728babbfc360dd92 100644
--- a/src/interaction/siWardrobe.js
+++ b/src/interaction/siWardrobe.js
@@ -359,7 +359,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 
 		let optionsArray = [];
 
-		for (const [key, object] of App.Data.slaveWear.shoes) {
+		for (const [key, object] of App.Data.shoes) {
 			const reshapedItem = {
 				text: object.name,
 				updateSlave: {shoes: key},
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index 1332f6d618a9d23090dda7c7798f9e786a27c4d0..e0b021eb6f29e31095bf7d1e109be37aaa024a7e 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -170,7 +170,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false} = {})
 		if (slave.balls >= 6) {
 			suddenBirth += 1;
 		}
-		if (slave.shoes === "extreme heels") {
+		if (shoeHeelCategory(slave) > 2) {
 			suddenBirth += 2;
 		}
 		if (slave.geneticQuirks.uterineHypersensitivity === 2) {
diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js
index f6a9abd490498eabc960372571b19a4c0fc837ef..69d25cc39e3de80951bf931d8a0367b404dfd774 100644
--- a/src/js/eventSelectionJS.js
+++ b/src/js/eventSelectionJS.js
@@ -429,7 +429,7 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) {
 				if (V.slaves.length > 2) {
 					if (eventSlave.devotion >= -20) {
 						if (eventSlave.heels === 1) {
-							if (eventSlave.shoes === "heels" || eventSlave.shoes === "boots" || eventSlave.shoes === "extreme heels") {
+							if (shoeHeelCategory(eventSlave) > 0) {
 								V.RESSevent.push("tendon fall");
 							}
 						}
@@ -1657,7 +1657,7 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) {
 				if (V.slaves.length > 2) {
 					if (eventSlave.devotion >= -20) {
 						if (eventSlave.heels === 1) {
-							if (eventSlave.shoes === "heels" || eventSlave.shoes === "boots" || eventSlave.shoes === "extreme heels") {
+							if (shoeHeelCategory(eventSlave) > 0) {
 								V.RESSevent.push("tendon fall");
 							}
 						}
diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js
index 09efe371b3f21fd8ba9e6e0c423ee6810b0ac332..c5a1940e32584378eb2bb81ff924d7196a2c7afa 100644
--- a/src/js/itemAvailability.js
+++ b/src/js/itemAvailability.js
@@ -43,7 +43,7 @@ globalThis.isItemAccessible = (function() {
 				selectedDB = App.Data.slaveWear.dickAccessories;
 				break;
 			case "shoes":
-				selectedDB = App.Data.slaveWear.shoes;
+				selectedDB = App.Data.shoes;
 				break;
 			case "chastity":
 				selectedDB = App.Data.slaveWear.chastityDevices;
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index c084389ccd93fe2e570bc7cf0c1f91e6cddd3a37..7bf0077d52297b8434d0519b6134dcc5d3360f2b 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -1874,7 +1874,7 @@ App.RA.options = (function() {
 	}
 	class ShoeList extends ListSelector {
 		constructor() {
-			super("Shoes", isItemAccessible.array(App.Data.slaveWear.shoes));
+			super("Shoes", isItemAccessible.array(App.Data.shoes));
 			this.setValue(current_rule.set.shoes);
 			this.onchange = (value) => current_rule.set.shoes = value;
 		}
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index 8f0f33ba1c9b91c8ed3d32105cfd8b8cbaa803c1..67e8f38d135faeca1d6c1fc45c3c555df2a17b0a 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -1175,7 +1175,7 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function long_shoes(slave, c) {
-			if (["boots", "extreme heels", "extreme platform heels", "flats", "heels", "platform heels", "platform shoes", "pumps"].includes(slave.shoes)) {
+			if (shoeHeelCategory(slave) > 0) {
 				makeSpan(c, slave.shoes, undefined, true);
 			} else if (slave.heels === 1) {
 				makeSpan(c, "Crawling.", "yellow");
diff --git a/src/js/statsChecker/statsChecker.js b/src/js/statsChecker/statsChecker.js
index d014fb2dbe227b8135604bbc4ef58fbe75cd13bf..7ccefb86d1c29b1a7a26620321351ad59ab72dac 100644
--- a/src/js/statsChecker/statsChecker.js
+++ b/src/js/statsChecker/statsChecker.js
@@ -356,11 +356,11 @@ globalThis.heightPass = function(slave) {
 		}
 	} else if (arcology.FSStatuesqueGlorification !== "unset") {
 		if (arcology.FSStatuesqueGlorificationLaw2 === 1) {
-			if (slave.height + heelLength(slave) > Height.mean(slave) + 5) {
+			if (slave.height + shoeHeight(slave) > Height.mean(slave) + 5) {
 				return true;
 			}
 		} else {
-			if (slave.height + heelLength(slave) >= 170) {
+			if (slave.height + shoeHeight(slave) >= 170) {
 				return true;
 			}
 		}
@@ -368,35 +368,6 @@ globalThis.heightPass = function(slave) {
 	return false;
 };
 
-/**
- * Returns the height, in cm, of a slave's heels
- * @param {App.Entity.SlaveState} slave
- * @returns {number}
- */
-globalThis.heelLength = function(slave) {
-	switch (slave.shoes) {
-		case "pumps":
-			// 2 inch heels
-			return 5;
-		case "platform shoes":
-			// 3 inch platform, no heels
-			return 8;
-		case "heels":
-			// 5 inch heels
-			return 13;
-		case "extreme heels":
-			// 8 inch heels
-			return 21;
-		case "platform heels":
-			// 8 inches, but not painful like extremes (3 inch platforms)
-			return 21;
-		case "extreme platform heels":
-			// 12 inches! 8 inch heel, 4 inch platform
-			return 30;
-	}
-	return 0;
-};
-
 /**
  * Returns slave bimbo body degree (FSIntellectualDependencyLawBeauty).
  * @param {App.Entity.SlaveState} slave
@@ -466,9 +437,7 @@ globalThis.bimboScore = function(slave) {
 	if (modScore.tat > 3) {
 		degree++;
 	}
-	if (setup.highHeels.includes(slave.shoes)) {
-		degree++;
-	}
+	degree += shoeHeelCategory(slave);
 	if (slave.skin === "sun tanned" || slave.skin === "spray tanned") {
 		degree++;
 	}
@@ -817,7 +786,7 @@ globalThis.canWalk = function(slave) {
 		return false;
 	} else if (tooBigBelly(slave)) {
 		return false;
-	} else if (slave.heels === 1 && !setup.highHeels.includes(slave.shoes)) {
+	} else if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 		return false;
 	}
 	return true;
@@ -834,7 +803,7 @@ globalThis.canStand = function(slave) {
 		return false;
 	} else if (!hasAnyLegs(slave)) {
 		return false;
-	} else if (slave.heels === 1 && !setup.highHeels.includes(slave.shoes) && (slave.shoes !== "pumps")) {
+	} else if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 		return false;
 	} else if (tooFatSlave(slave)) {
 		return false;
diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js
index f42e0ad0677b34ed9d951769daf66905feea0e47..7120c7da44d566ce1e591c7c552b8416b2a09ee5 100644
--- a/src/js/utilsAssessSlave.js
+++ b/src/js/utilsAssessSlave.js
@@ -241,3 +241,31 @@ globalThis.canMoveToRoom = function(slave) {
 	const partnerHasRoom = partner && assignmentVisible(partner) && partner.rules.living === "luxurious";
 	return partnerHasRoom || V.rooms - V.roomsPopulation >= 1;
 };
+
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {0|1|2|3} 0: No heel boost at all.  1: Pumps, slight boost.  2: High heels.  3: Painfully/extreme high heels
+ */
+globalThis.shoeHeelCategory = function(slave) {
+	const height = App.Data.shoes.get(slave.shoes) ? App.Data.shoes.get(slave.shoes).heelHeight : 0;  // Height is in cm
+	if (height > 20) {
+		return 3;
+	} else if (height > 5) {
+		return 2;
+	} else if (height > 0) {
+		return 1;
+	} else {
+		return 0;
+	}
+};
+
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {number} shoe height in cm (heel + platform height)
+ */
+globalThis.shoeHeight = function(slave) {
+	const heelHeight = App.Data.shoes.get(slave.shoes) ? App.Data.shoes.get(slave.shoes).heelHeight : 0;
+	const platformHeight = App.Data.shoes.get(slave.shoes) ? App.Data.shoes.get(slave.shoes).platformHeight : 0;
+	return heelHeight + platformHeight;
+};
+
diff --git a/src/js/vignettes.js b/src/js/vignettes.js
index 3254aa300aa9131da33d769abaca8470b5daa858..19d378fcf5ea2b02adac30a3bb662bdccc2dc7ca 100644
--- a/src/js/vignettes.js
+++ b/src/js/vignettes.js
@@ -1263,7 +1263,7 @@ globalThis.GetVignette = function(slave) {
 				effect: -1,
 			});
 		}
-		if (slave.heels === 1 && !(["boots", "extreme heels", "heels", "pumps"].includes(slave.shoes))) {
+		if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 			vignettes.push({
 				text: `${he} enticed a new customer who had never really considered buttsex before they saw ${him} crawling along with ${his} asshole vulnerable,`,
 				type: "cash",
@@ -3255,7 +3255,7 @@ globalThis.GetVignette = function(slave) {
 				effect: -1,
 			});
 		}
-		if (slave.heels === 1 && !(["boots", "extreme heels", "heels", "pumps"].includes(slave.shoes))) {
+		if (slave.heels === 1 && shoeHeelCategory(slave) === 0) {
 			vignettes.push({
 				text: `${he} enticed a new patron who had never really considered buttsex before they saw ${him} crawling along with ${his} asshole vulnerable,`,
 				type: "rep",
diff --git a/src/npc/descriptions/dimensions.js b/src/npc/descriptions/dimensions.js
index b2b60f27e5a550922efec74fec79da65aaa7366b..36c9ceda7f1252c50d158d0a29b2594267270aa8 100644
--- a/src/npc/descriptions/dimensions.js
+++ b/src/npc/descriptions/dimensions.js
@@ -121,16 +121,17 @@ App.Desc.dimensions = function(slave) {
 		const r = [];
 
 		if (V.arcologies[0].FSStatuesqueGlorification !== "unset") {
+			const shoesHeight = shoeHeight(slave);
 			if (heightPass(slave)) {
 				r.push(`${He} is tall enough`);
-				if (setup.heightBoostingShoes.includes(slave.shoes)) {
-					r.push(`in ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`);
+				if (shoesHeight > 0) {
+					r.push(`in ${his} ${heightToEitherUnit(shoesHeight)} ${slave.shoes}`);
 				}
 				r.push(`to measure up to society's strict tastes.`);
 			} else {
 				r.push(`${He} fails to measure up to society's strict`);
-				if (setup.heightBoostingShoes.includes(slave.shoes)) {
-					r.push(`tastes even with ${his} ${heightToEitherUnit(heelLength(slave))} ${slave.shoes}`);
+				if (shoesHeight > 0) {
+					r.push(`tastes even with ${his} ${heightToEitherUnit(shoesHeight)} ${slave.shoes}`);
 				} else {
 					r.push(`tastes.`);
 				}
diff --git a/src/npc/descriptions/heels.js b/src/npc/descriptions/heels.js
index 23b1a47a5c6a5ccbb667899ab89314fab81b77a2..d9df2769aa8a2b3f56af944837f1dbc817f0ce0d 100644
--- a/src/npc/descriptions/heels.js
+++ b/src/npc/descriptions/heels.js
@@ -19,7 +19,7 @@ App.Desc.heels = function(slave, {market, eventDescription} = {}) {
 		}
 		r.push(`so that ${he} must wear heels in order to walk.`);
 		if (V.showClothing === 1 && !market) {
-			if (slave.shoes !== "none" && slave.shoes !== "flats") {
+			if (shoeHeelCategory(slave) > 0) {
 				r.push(`${He} is, so ${he} can walk reasonably well.`);
 			} else {
 				r.push(`Since ${he} is without them, ${he}'s crawling on`);
diff --git a/src/npc/interaction/fAnus.tw b/src/npc/interaction/fAnus.tw
index cc63e3393747b4056993092817bd5fc997556e73..3de75aa27983ccb36fabbbfe349609679164cdd6 100644
--- a/src/npc/interaction/fAnus.tw
+++ b/src/npc/interaction/fAnus.tw
@@ -31,7 +31,7 @@ You call $him over so you can
 <</if>>
 
 <<if (getSlave($AS).heels == 1)>>
-	<<if !["flats", "flats with long stockings", "flats with short stockings", "none"].includes(getSlave($AS).shoes)>>
+	<<if shoeHeelCategory($activeSlave) > 0>>
 		As $he went past your desk, $his high heels and surgically altered legs enforced a gait that presented $his butt enticingly.
 	<<else>>
 		As $he crawls along on <<if hasAllLimbs(getSlave($AS))>>all fours<<else>>the ground<</if>>, $his anus is readily available.
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 09a3e01e4c6e38bbc5804698c73fc6ee4e7f7862..77fd8147b730719c6e0f0bdf4ed8b176c55c8187 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -743,7 +743,17 @@ The source of the many-voiced personal assistant becomes clear: probably on the
 
 <<case "sore ass">>
 
-One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if (!hasAnyLegs($activeSlave))>>scooting $himself from side to side uncomfortably<<elseif ($activeSlave.heels == 1) && ($activeSlave.shoes != "heels") && ($activeSlave.shoes != "pumps") && ($activeSlave.shoes != "boots") && ($activeSlave.shoes != "extreme heels")>>crawling gingerly<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>tottering along painfully<<else>>walking a little funny<</if>>, as though $he has a sore butt. You call $him over to inspect $his backdoor to see if $he needs care, <<if (!hasAnyLegs($activeSlave))>>and set $his helpless body down, spreading $his buttocks to examine $his anus.<<else>>and order $him to spread $his buttocks for you so you can examine $his anus.<</if>> $His asshole is fine, just a little sore from hard buttfucks. $He complies with you, but as you probe $him gently with a finger,
+One night, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>>
+<<if (!hasAnyLegs($activeSlave))>>
+	scooting $himself from side to side uncomfortably,
+<<elseif ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0))>>
+	crawling gingerly,
+<<elseif (shoeHeelCategory($activeSlave) > 1))>>
+	tottering along painfully,
+<<else>>
+	walking a little funny,
+<</if>>
+as though $he has a sore butt. You call $him over to inspect $his backdoor to see if $he needs care, <<if (!hasAnyLegs($activeSlave))>>and set $his helpless body down, spreading $his buttocks to examine $his anus.<<else>>and order $him to spread $his buttocks for you so you can examine $his anus.<</if>> $His asshole is fine, just a little sore from hard buttfucks. $He complies with you, but as you probe $him gently with a finger,
 <<if !canTalk($activeSlave) && (!hasAnyArms($activeSlave))>>
 	$he wriggles desperately and turns to mouth "it hurts <<Master>> please don't assrape me" at you.
 <<elseif !canTalk($activeSlave)>>
@@ -761,10 +771,10 @@ You're at your desk as $he arrives; $his predecessor passes $him on the way out.
 	heels click against
 <<elseif $activeSlave.shoes == "extreme heels">>
 	ridiculous heels click against
-<<elseif $activeSlave.shoes == "flats">>
-	flats come up against
-<<else>>
+<<elseif $activeSlave.shoes == "none">>
 	bare feet come up against
+<<else>>
+	<<print $activeSlave.shoes>> come up against
 <</if>>
 the door frame to either side of $him. $He reaches out to press $his palms against the door frame to either side of $his body, and runs them slowly up the frame, gradually stretching out $his
 <<set _averageHeight = Height.mean($activeSlave)>>
@@ -958,7 +968,15 @@ $He sets $his jaw and <<if canSee($activeSlave)>>manages to meet your eyes witho
 
 <<case "bondage gear">>
 
-One day, you catch sight of <<= App.UI.slaveDescriptionDialog($activeSlave)>> <<if ($activeSlave.heels == 1) && ($activeSlave.shoes != "heels") && ($activeSlave.shoes != "pumps") && ($activeSlave.shoes != "boots") && ($activeSlave.shoes != "extreme heels")>>crawling<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>tottering<<else>>walking<</if>> around stark naked. This is unacceptable, as $he has been ordered to wear humiliating and uncomfortable bondage gear. When confronted,
+One day, you catch sight of <<= App.UI.slaveDescriptionDialog($activeSlave)>>
+<<if ($activeSlave.heels == 1 && shoeHeelCategory($activeSlave) == 0)>>
+	crawling
+<<elseif shoeHeelCategory($activeSlave) > 1>>
+	tottering
+<<else>>
+	walking
+<</if>>
+around stark naked. This is unacceptable, as $he has been ordered to wear humiliating and uncomfortable bondage gear. When confronted,
 <<if !canTalk($activeSlave)>>
 	<<if !hasAnyArms($activeSlave)>>
 		$he tries to communicate $his reluctance to wear the clothing as best as $he can with various head movements and facial expressions<<if $activeSlave.bellyPreg >= 5000>>, including several nods towards $his rounded middle<</if>>.
@@ -1220,7 +1238,7 @@ $he is. You've been busy and haven't used $him for a while, and since $he's acce
 One morning, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>>
 <<if !canWalk($activeSlave)>>
 	crawl
-<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>
+<<elseif shoeHeelCategory($activeSlave) > 1>>
 	totter
 <<elseif $activeSlave.belly >= 10000>>
 	waddle
@@ -1457,14 +1475,22 @@ It's time for $his routine inspection, and $he's standing before you, nude. $He
 As you are retiring for the night, <<= App.UI.slaveDescriptionDialog($activeSlave)>>
 <<if !canWalk($activeSlave)>>
 	crawls
-<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>
+<<elseif shoeHeelCategory($activeSlave) > 1>>
 	totters
 <<elseif $activeSlave.belly >= 10000>>
 	waddles
 <<else>>
 	walks
 <</if>>
-into your bedroom. Since $he is not allowed to ask questions, $he says nothing, but $his reason for being here is obvious enough. $He's on a medically reckless dosage of aphrodisiacs, and $he's panting as $he <<if ($activeSlave.heels == 1) && ($activeSlave.shoes != "heels") && ($activeSlave.shoes != "pumps") && ($activeSlave.shoes != "boots") && ($activeSlave.shoes != "extreme heels")>>kneels<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>teeters<<else>>stands<</if>> there. $His nipples are <<if $activeSlave.nipples != "fuckable">>hard<<else>>swollen shut<</if>>, and there's visible moisture on $his <<if $seeRace == 1>>$activeSlave.race <</if>><<if $activeSlave.vagina != -1>>pussylips<<else>><<if $activeSlave.dick != 0>>dickhead<<else>>tiny little front hole<</if>><</if>>. It's also against the rules for $him to masturbate, so $he clearly decided to come to you rather than break the rules. There's no way $he'll be able to sleep like this.
+into your bedroom. Since $he is not allowed to ask questions, $he says nothing, but $his reason for being here is obvious enough. $He's on a medically reckless dosage of aphrodisiacs, and $he's panting as $he
+<<if ($activeSlave.heels == 1 shoeHeelCategory($activeSlave) == 0)>>
+	kneels
+<<elseif (shoeHeelCategory($activeSlave) > 1)>>
+	teeters
+<<else>>
+	stands
+<</if>>
+there. $His nipples are <<if $activeSlave.nipples != "fuckable">>hard<<else>>swollen shut<</if>>, and there's visible moisture on $his <<if $seeRace == 1>>$activeSlave.race <</if>><<if $activeSlave.vagina != -1>>pussylips<<else>><<if $activeSlave.dick != 0>>dickhead<<else>>tiny little front hole<</if>><</if>>. It's also against the rules for $him to masturbate, so $he clearly decided to come to you rather than break the rules. There's no way $he'll be able to sleep like this.
 
 <<case "shaped areolae">>
 
@@ -1507,7 +1533,7 @@ Going about your day, you see <<= App.UI.slaveDescriptionDialog($activeSlave)>>
 As you are retiring for the night, <<= App.UI.slaveDescriptionDialog($activeSlave)>>
 <<if !canWalk($activeSlave)>>
 	crawls
-<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>
+<<elseif shoeHeelCategory($activeSlave) > 1>>
 	totters
 <<elseif $activeSlave.belly >= 10000>>
 	waddles
@@ -1742,7 +1768,7 @@ This is the result of not getting off for several days while on the slave diet p
 $He constantly passes by your desk as you work, going back and forth between the milkers and $his other tasks. Even if you didn't know which was which, it would be easy to tell which way $he was going. One way, $he
 <<if !canWalk($activeSlave)>>
 	crawls
-<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "pumps") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>
+<<elseif shoeHeelCategory($activeSlave) > 1>>
 	totters
 <<elseif $activeSlave.belly >= 10000>>
 	waddles
@@ -8829,7 +8855,18 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 <</link>>
 <br><<link "See how rough you can be and still get $him to cum">>
 	<<replace "#result">>
-		The aphrodisiac dosage $he's on will let $him orgasm to almost anything. You spend a few minutes playing with $his nipples, skillfully edging $him away from climax, and $he's almost vibrating with discomfort. $He's so desperate that $he sobs with relief when you order $him to <<if ($activeSlave.heels == 1) && ($activeSlave.shoes != "heels")>>kneel<<elseif ($activeSlave.shoes == "heels")>>totter up<<else>>stand<</if>> <<if $activeSlave.belly >= 5000>>_belly belly <</if>>against a wall and spread $his buttocks. A little saliva and<<if $PC.vagina != -1>> a bit of your own pussyjuice, transferred by a couple of fingers, and<</if>> <<if $PC.dick == 0>>your vibrating strap-on<<else>>your dick<</if>> is up $his willing ass. The position is uncomfortable for $him, and you are not gentle, but $he comes anyway. By the end of the night $his butthole is so sore that $he <<if $activeSlave.belly >= 5000>>lies on $his side<<else>>lies on $his stomach<</if>> every chance $he gets. $His submissiveness @@.hotpink;has increased.@@
+		The aphrodisiac dosage $he's on will let $him orgasm to almost anything. You spend a few minutes playing with $his nipples, skillfully edging $him away from climax, and $he's almost vibrating with discomfort. $He's so desperate that $he sobs with relief when you order $him to
+		<<if ($activeSlave.heels == 1) && shoeHeelCategory($activeSlave) == 0>>
+			kneel
+		<<elseif shoeHeelCategory($activeSlave) > 1>>
+			totter up
+		<<else>>
+			stand
+		<</if>>
+		<<if $activeSlave.belly >= 5000>>
+			_belly belly
+		<</if>>
+		against a wall and spread $his buttocks. A little saliva and<<if $PC.vagina != -1>> a bit of your own pussyjuice, transferred by a couple of fingers, and<</if>> <<if $PC.dick == 0>>your vibrating strap-on<<else>>your dick<</if>> is up $his willing ass. The position is uncomfortable for $him, and you are not gentle, but $he comes anyway. By the end of the night $his butthole is so sore that $he <<if $activeSlave.belly >= 5000>>lies on $his side<<else>>lies on $his stomach<</if>> every chance $he gets. $His submissiveness @@.hotpink;has increased.@@
 		<<set $activeSlave.devotion += 4>>
 	<</replace>>
 <</link>>
@@ -12973,9 +13010,9 @@ brought in to you. This time <<= App.UI.slaveDescriptionDialog($activeSlave)>> h
 	<br>&nbsp;&nbsp;&nbsp;&nbsp;<<link "while in pain">>
 		<<replace "#result">>
 			You order $him to
-			<<if ($activeSlave.heels == 1) && ($activeSlave.shoes != "heels") && ($activeSlave.shoes != "boots") && ($activeSlave.shoes != "extreme heels")>>
+			<<if ($activeSlave.heels == 1) && shoeHeelCategory($activeSlave) == 0>>
 				kneel
-			<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "boots") || ($activeSlave.shoes == "extreme heels")>>
+			<<elseif shoeHeelCategory($activeSlave) > 1>>
 				teeter
 			<<else>>
 				stand
diff --git a/src/uncategorized/reStandardPunishment.tw b/src/uncategorized/reStandardPunishment.tw
index a78564babdb0afbff0d40f2072158af08421f322..c74aaac4f0d5ab3a953f02b04110714cffe01ca8 100644
--- a/src/uncategorized/reStandardPunishment.tw
+++ b/src/uncategorized/reStandardPunishment.tw
@@ -269,10 +269,10 @@
 <<link "Make $him run">>
 	<<replace "#result">>
 	You tell $him that $he clearly needs practice being prompt. Your tone is conversational, but $he doesn't mistake it for kindness. It's the tone you use with slaves when imparting guidance which is to be accepted and followed on pain of terrible punishment. You make $him explain where $he was and what $he was doing previously, and require $him to walk you there. $He does, <<if $activeSlave.trust > 20>>trustingly<<elseif $activeSlave.trust >= -20>>rather fearfully<<else>>shaking with fear<</if>>, and when you get there you tell $him to run to $his next task. $He hesitates for an instant, until you <<if $PC.title == 1>>bellow<<else>>shriek<</if>> at $him to run! $He takes off,
-	<<if $activeSlave.shoes == "extreme heels">>
+	<<if shoeHeelCategory($activeSlave) == 3>>
 		tottering agonizingly along in $his extreme heels. $He isn't running, not really, but $his slutty shoes are so ridiculous that $he can't. $He's going as fast as $he possibly can.
-	<<elseif ($activeSlave.shoes == "heels") || ($activeSlave.shoes == "boots")>>
-		running awkwardly in $his <<if $activeSlave.shoes == "heels">>heels<<else>>heeled boots<</if>>.
+	<<elseif shoeHeelCategory($activeSlave) > 1>>
+		running awkwardly in $his $activeSlave.shoes.
 	<<else>>
 		running as fast as $his legs can carry $him.
 	<</if>>