diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index b859b9718de84ccb55cad8f0f9e0a02895929dcc..7b45451a8bb3bbd501f4193486c1e8036a6a16c5 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -1000,6 +1000,7 @@ App.Data.resetOnNGPlus = {
 	animalTesticles: 0, /* {pigTestes: 0, dogTestes: 0, horseTestes: 0, cowTestes: 0} currently unused*/
 	animalMpreg: 0, /* {pigMpreg: 0, dogMpreg: 0, horseMpreg: 0, cowMpreg: 0} currently unused*/
 	geneticMappingUpgrade: 0,
+	toyShop: false,
 	pregnancyMonitoringUpgrade: 0,
 	cloningSystem: 0,
 	geneticFlawLibrary: 0,
diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js
index ee5f17b6f40c2bd78e4fb0360f5554ebc3d9450c..736da4e63839b320e70aa4fac9a7e6316fba3d67 100644
--- a/js/003-data/slaveWearData.js
+++ b/js/003-data/slaveWearData.js
@@ -1195,9 +1195,8 @@ App.Data.shoes = new Map([ // TODO: add lift property
  * @property {string} name
  * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS.
  * @property {boolean} [requirements]
- * @property {boolean} [harsh]
- * @property {0|1|2|3} width height in cm.  Adds to heel height.
- * @property {0|1|2} length height in cm.  Over 4cm they may totter.  21cm and over (8 inch heels) will be painful/extreme
+ * @property {0|1|2|3} width
+ * @property {0|1|2} length
  */
 
 /**
diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js
index 0a372a4f922ae23e0d70ba36c8b93d31a79ab590..0b437d54950e0a01a73dcaeef80c449bdd55162b 100644
--- a/src/005-passages/facilitiesPassages.js
+++ b/src/005-passages/facilitiesPassages.js
@@ -68,3 +68,12 @@ new App.DomPassage("Rules Assistant",
 		return div;
 	}, ["jump-to-safe", "jump-from-safe"]
 );
+
+new App.DomPassage("Toy Shop",
+	() => {
+		V.nextButton = "Back";
+		V.nextLink = "Manage Penthouse";
+
+		return App.UI.toyShop();
+	},
+);
diff --git a/src/facilities/toyShop/toyShop.js b/src/facilities/toyShop/toyShop.js
new file mode 100644
index 0000000000000000000000000000000000000000..dcd1aa054d5b8916750c9549b826c125e679bd60
--- /dev/null
+++ b/src/facilities/toyShop/toyShop.js
@@ -0,0 +1,112 @@
+/**
+ * UI for the Body Modification system/studio.  Refreshes without refreshing the passage.
+ */
+App.UI.toyShop = function() {
+	const container = document.createElement("span");
+	let buttPlugName = "";
+	let buttPlugData = {
+		name: "",
+		width: 0,
+		length: 0
+	};
+
+	container.append(createPage());
+	return container;
+
+	function createPage() {
+		const el = new DocumentFragment();
+		el.append(intro());
+		el.append(buttPlugs());
+		return el;
+	}
+
+	function intro() {
+		const el = new DocumentFragment();
+		App.UI.DOM.appendNewElement("h1", el, "Toy Shop");
+		App.UI.DOM.appendNewElement("div", el, `The room is filled with the smell of rubber, latex, and various synthetic materials and solvents.  A series of screens allows you to design toys of various shapes and sizes, and then produce them at scale.  A bin of defects sits in the corner, glistening a bit under a layer of lubrication.`, "scene-intro");
+		return el;
+	}
+
+
+	function buttPlugs() {
+		const el = new DocumentFragment();
+		let linkArray;
+		App.UI.DOM.appendNewElement("h2", el, "Buttplugs");
+
+		const value = App.UI.DOM.appendNewElement("div", el, `enter value here, "a butt plug"`);
+		value.append(App.UI.DOM.makeTextBox(
+			buttPlugName,
+			v => {
+				buttPlugName = v;
+				refresh();
+			}
+		));
+
+		const title = App.UI.DOM.appendNewElement("div", el, `enter value here, "Butt plug"`);
+		title.append(App.UI.DOM.makeTextBox(
+			buttPlugData.name,
+			v => {
+				buttPlugData.name = capFirstChar(v);
+				refresh();
+			}
+		));
+
+
+		const widthOptions = new Map([
+			["standard", 1],
+			["large", 2],
+			["huge", 3],
+		]);
+		const width = App.UI.DOM.appendNewElement("div", el, `Select width`);
+		linkArray = [];
+		for (const [key, value] of widthOptions) {
+			linkArray.push(
+				App.UI.DOM.link(
+					key,
+					() => {
+						buttPlugData.width = value;
+						refresh();
+					}
+				)
+			);
+		}
+		width.append(App.UI.DOM.generateLinksStrip(linkArray));
+
+		// width
+
+		// length
+		const lengthOptions = new Map([
+			["standard", 1],
+			["long", 2],
+		]);
+		const length = App.UI.DOM.appendNewElement("div", el, `Select width`);
+		linkArray = [];
+		for (const [key, value] of lengthOptions) {
+			linkArray.push(
+				App.UI.DOM.link(
+					key,
+					() => {
+						buttPlugData.length = value;
+						refresh();
+					}
+				)
+			);
+		}
+		length.append(App.UI.DOM.generateLinksStrip(linkArray));
+
+		return el;
+
+		function buildPlug() {
+
+		}
+
+		function deletePlug() {
+
+		}
+	}
+
+
+	function refresh() {
+		jQuery(container).empty().append(createPage());
+	}
+};
diff --git a/src/gui/quicklinks.js b/src/gui/quicklinks.js
index c7a5dbb9347e69d586d7466daa550ebb0a43e461..f993e46a2038ab8f40f373312f0e156ea1212795 100644
--- a/src/gui/quicklinks.js
+++ b/src/gui/quicklinks.js
@@ -65,6 +65,7 @@ App.UI.quickMenu = (function() {
 			"Implant Manufactory": true,
 			"Prosthetic Lab": true,
 			"Wardrobe": true,
+			"Toy Shop": true,
 			"The Black Market": true,
 		},
 		Tools: {
@@ -96,6 +97,7 @@ App.UI.quickMenu = (function() {
 		"Firebase": () => !V.SF.Toggle || V.SF.Toggle < 1 || V.SF.Active < 1,
 		"Future Society": () => !V.FSAnnounced,
 		"Gene Lab": () => !V.geneticMappingUpgrade,
+		"Toy Shop": () => !V.toyShop,
 		"Head Girl Suite": () => !V.HGSuite,
 		"Implant Manufactory": () => !V.ImplantProductionUpgrade,
 		"Incubator": () => !V.incubator,
diff --git a/src/uncategorized/managePenthouse.tw b/src/uncategorized/managePenthouse.tw
index 34163138a6feb591ba32f7e89e4aeb2102fea304..7133d8f82669f540bda3db6de7e871ff67bd9d65 100644
--- a/src/uncategorized/managePenthouse.tw
+++ b/src/uncategorized/managePenthouse.tw
@@ -279,6 +279,15 @@
 		</div>
 	<</if>>
 
+	<div>
+		<<if !$toyShop>>
+			[[Install a workshop for making custom toys|Manage Penthouse][cashX(-10000, "capEx"), $toyShop = true, $PC.skill.engineering += .1]]
+			<span class="detail">Costs <<print cashFormat(10000)>></span>
+		<<else>>
+			There is a [[workshop|Toy Shop]] for making custom toys.
+		<</if>>
+	</div>
+
 	<div>
 	<<if $studio == 0>>
 		[[Install a media hub to convert slave video feeds into pornography|Manage Penthouse][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx"), $studio = 1, $PC.skill.engineering += 1]]