diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js
index 7345fbb910f9c52e0eeacb2df004de7f6d08d2dc..ace71088316d4e3dba0128fb0bf89806d3e05299 100644
--- a/js/003-data/slaveWearData.js
+++ b/js/003-data/slaveWearData.js
@@ -1156,7 +1156,8 @@ App.Data.slaveWear = {
 				name: "Vibrating attachment",
 				get requirements() {
 					return V.boughtItem.toys.vaginalAttachments === 1;
-				}
+				},
+				vibrates: 1
 			}
 		],
 		["smart vibrator",
@@ -1164,7 +1165,8 @@ App.Data.slaveWear = {
 				name: "Smart vibrating attachment",
 				get requirements() {
 					return V.boughtItem.toys.smartVaginalAttachments === 1;
-				}
+				},
+				vibrates: 2
 			}
 		]
 	]),
diff --git a/src/005-passages/managePassages.js b/src/005-passages/managePassages.js
index 5591493ec449406469094da681bff190e4c83464..3911b98eb13bdaf45da03ef99aa20dc77439f8b2 100644
--- a/src/005-passages/managePassages.js
+++ b/src/005-passages/managePassages.js
@@ -13,7 +13,7 @@ new App.DomPassage("Future Society", () => { return App.UI.fsPassage(); }, ["jum
 new App.DomPassage("Manage Penthouse",
 	() => {
 		V.nextButton = "Back";
-		V.nextLink = "Manage Penthouse";
+		V.nextLink = "Main";
 		V.encyclopedia = "What the Upgrades Do";
 		return App.UI.managePenthouse();
 	}, ["jump-to-safe", "jump-from-safe"]
diff --git a/src/facilities/surgery/surgeryPasageFaceAndHair.js b/src/facilities/surgery/surgeryPasageFaceAndHair.js
index d689bb8b280e1f8b350eb853e3aada92a42db36a..ea66d7452149a4a5cf4d0179fb99d42a1cea7c68 100644
--- a/src/facilities/surgery/surgeryPasageFaceAndHair.js
+++ b/src/facilities/surgery/surgeryPasageFaceAndHair.js
@@ -926,20 +926,22 @@ App.UI.surgeryPassageHairAndFace = function(slave, cheat = false) {
 				r.push(`${His} crooked teeth are in braces.`);
 				linkArray.push(makeLink(
 					"Remove braces",
-					"teeth",
+					"oral",
 					() => {
 						slave.teeth = "crooked";
-					}
+					},
+					0
 				));
 				break;
 			case "cosmetic braces":
 				r.push(`${He} has braces on ${his} straight teeth.`);
 				linkArray.push(makeLink(
 					"Remove braces",
-					"teeth",
+					"oral",
 					() => {
 						slave.teeth = "normal";
-					}
+					},
+					0
 				));
 				break;
 			case "removable":
@@ -1030,7 +1032,7 @@ App.UI.surgeryPassageHairAndFace = function(slave, cheat = false) {
 				r.push(`${He} has normal, healthy teeth.`);
 				linkArray.push(makeLink(
 					"Unnecessary braces",
-					"teeth",
+					"braces",
 					() => {
 						slave.teeth = "cosmetic braces";
 					}
diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js
index 67e3cd0eb84aab04244d6ebcf282a2640ff4688b..34a8c0bb79aa34619d45164287e90e27ba2060ed 100644
--- a/src/interaction/siWardrobe.js
+++ b/src/interaction/siWardrobe.js
@@ -637,6 +637,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) {
 	function vaginalAttachment() {
 		let el = document.createElement('div');
 		if (dildoWidth(slave) === 0) {
+			slave.vaginalAttachment = "none";
 			return el;
 		}
 
diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js
index eb84a673e9283ba12d04584d2a8fcef2d62b9e02..4798dc8339a132a3a3d9c05083684bae76509886 100644
--- a/src/js/utilsAssessSlave.js
+++ b/src/js/utilsAssessSlave.js
@@ -310,10 +310,17 @@ globalThis.dildoLength = function(slave) {
 };
 
 /**
+ * Returns the best vibe mode available between the dildo itself, and any attachment that may be present.
  * @param {App.Entity.SlaveState} slave
- * @returns {number}
+ * @returns {0|1|2}
  */
 globalThis.dildoVibeLevel = function(slave) {
+	// Vaginal accessory/dildo
 	const dildo = App.Data.vaginalAccessory.get(slave.vaginalAccessory) || V.customItem.vaginalAccessory.get(slave.vaginalAccessory);
-	return dildo.vibrates || 0;
+	const dildoVibrationLevel = ((dildo) ? dildo.vibrates : 0) || 0;
+
+	// Attachment, if present
+	const vaginalAttachment = App.Data.slaveWear.vaginalAttachment.get(slave.vaginalAttachment) || 0;
+	const vaginalAttachmentVibrationLevel = ((vaginalAttachment) ? vaginalAttachment.vibrates : 0) || 0;
+	return Math.max(dildoVibrationLevel, vaginalAttachmentVibrationLevel);
 };
diff --git a/src/npc/descriptions/crotch/vaginalAccessory.js b/src/npc/descriptions/crotch/vaginalAccessory.js
index cc054a389f1aee05d5af0676be1c2c0e025fb3be..f86f846aa52dbcc4953bc2c2fcde68210e9f66c3 100644
--- a/src/npc/descriptions/crotch/vaginalAccessory.js
+++ b/src/npc/descriptions/crotch/vaginalAccessory.js
@@ -105,7 +105,7 @@ App.Desc.vaginalAttachment = function(slave) {
 	switch (dildoVibeLevel(slave)) {
 		case 2:
 			// TODO: not sure about this description
-			r.push(`${His} dildo buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`);
+			r.push(`${His} ${slave.vaginalAccessory} buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`);
 			if (slave.chastityVagina) {
 				r.push(`The chastity belt locking it in place means there is no escape.`);
 			}
@@ -113,7 +113,7 @@ App.Desc.vaginalAttachment = function(slave) {
 			break;
 		case 1:
 			// TODO: not sure about this description
-			r.push(`${He} looks distinctly uncomfortable as ${his} dildo buzzes every so often.`);
+			r.push(`${He} looks distinctly uncomfortable as ${his} ${slave.vaginalAccessory} buzzes every so often.`);
 			if (slave.chastityVagina) {
 				r.push(`The chastity belt locking it in place means there is no escape.`);
 			}