diff --git a/src/js/slaveInteract.js b/src/js/slaveInteract.js
index e305dc8789e65df09c8aecc4690c8f47f50dcda2..15146905c2bffe141bf895f22bee09c2c8adebc7 100644
--- a/src/js/slaveInteract.js
+++ b/src/js/slaveInteract.js
@@ -1,45 +1,104 @@
-App.UI.SlaveInteract = {
-	fucktoyPref: function() {
-		let res = "";
-		/** @type {App.Entity.SlaveState} */
-		const slave = State.variables.activeSlave;
-		const {his} = getPronouns(slave);
-		if ((slave.assignment === "please you") || (slave.assignment === "serve in the master suite") || (slave.assignment === "be your Concubine")) {
-			res += `<span class="story-label">Fucktoy use preference:</span> <span id = "hole" style="font-weight:bold">${slave.toyHole}.</span> `;
-			/** @type {string[]} */
-			let links = [];
-			links.push('<<link "Mouth">><<set $activeSlave.toyHole = "mouth">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>');
-			links.push('<<link "Tits">><<set $activeSlave.toyHole = "boobs">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>');
-			if ((slave.vagina > 0) && canDoVaginal(slave)) {
-				links.push('<<link "Pussy">><<set $activeSlave.toyHole = "pussy">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>');
-			} else if (slave.vagina === 0) {
-				links.push(App.UI.disabledLink("Pussy",
-					[`Take ${his} virginity before giving ${his} pussy special attention`]));
+App.UI.SlaveInteract = {};
+
+App.UI.SlaveInteract.fucktoyPref = function(slave) {
+	/** @type {App.Entity.SlaveState} */
+	const {his} = getPronouns(slave);
+	let el = document.createElement('div');
+	let links = [];
+
+	if ((slave.assignment === "please you") || (slave.assignment === "serve in the master suite") || (slave.assignment === "be your Concubine")) {
+		let storyLabel  = document.createElement('span');
+		storyLabel.className = "story-label";
+		storyLabel.textContent = `Fucktoy use preference:`;
+		el.appendChild(storyLabel);
+
+		el.append(` `);
+
+		let hole  = document.createElement('span');
+		hole.style.fontWeight = "bold";
+		hole.textContent = `${slave.toyHole}. `;
+		el.appendChild(hole);
+
+		/** @type {object} */
+
+		links.push({text: `Mouth`, toyHole: `mouth`});
+		links.push({text: `Tits`, toyHole: `boobs`});
+		if ((slave.vagina > 0) && canDoVaginal(slave)) {
+			links.push({text: `Pussy`, toyHole: `pussy`});
+		} else if (slave.vagina === 0) {
+			links.push({text: `Pussy`, disabled: `Take ${his} virginity before giving ${his} pussy special attention`});
+		}
+		if ((slave.anus > 0) && canDoAnal(slave)) {
+			links.push({text: `Ass`, toyHole: `ass`});
+		} else {
+			links.push({text: `Ass`, disabled: `Take ${his} anal virginity before giving ${his} ass special attention`});
+		}
+		if ((slave.dick > 0) && canPenetrate(slave)) {
+			links.push({text: `Dick`, toyHole: `dick`});
+		}
+		links.push({text: `No Preference`, toyHole: `all ${his} holes`});
+	}
+	el.appendChild(generateRows(links));
+
+	function generateRows(toyHoleArray) {
+		let row = document.createDocumentFragment();
+		for (let i = 0; i < toyHoleArray.length; i++) {
+			let link;
+			const separator  = document.createTextNode(` | `);
+			const keys = Object.keys(toyHoleArray[i]);
+
+			// Test to see if there was a problem with the key
+			for (let j = 0; j < keys.length; j++) {
+				if (["text", "toyHole", "disabled"].includes(keys[j])) {
+					continue;
+				} else {
+					toyHoleArray[i].text += " ERROR, THIS SCENE WAS NOT ENTERED CORRECTLY";
+					console.log("Trash found while generateRows() was running: " + keys[j] + ": " + toyHoleArray[i][keys[j]]);
+					break;
+				}
 			}
-			if ((slave.anus > 0) && canDoAnal(slave)) {
-				links.push('<<link "Ass">><<set $activeSlave.toyHole = "ass">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>');
+			// is it just text?
+			if (toyHoleArray[i].disabled) {
+				link = App.UI.DOM.disabledLink(toyHoleArray[i].text, [toyHoleArray[i].disabled]);
+			// Are they already on this toyHole?
+			} else if (toyHoleArray[i].toyHole === slave.toyHole) {
+				link = document.createTextNode(toyHoleArray[i].text);
+			// Set up the link
 			} else {
-				links.push(App.UI.disabledLink("Ass",
-					[`Take ${his} anal virginity before giving ${his} ass special attention`]));
+				link = App.UI.DOM.link(
+					toyHoleArray[i].text,
+					() => {
+						slave.toyHole = toyHoleArray[i].toyHole,
+						App.UI.SlaveInteract.fucktoyPref(slave);
+					},
+				);
+
+				// add a note node if required
+				if (toyHoleArray[i].note) {
+					let note  = document.createTextNode(toyHoleArray[i].note);
+					note.className = "note";
+					link.appendChild(note);
+				}
 			}
-			if ((slave.dick > 0) && canPenetrate(slave)) {
-				links.push('<<link "Dick">><<set $activeSlave.toyHole = "dick">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>');
+			row.appendChild(link);
+			if (i < toyHoleArray.length-1) {
+				row.appendChild(separator);
 			}
-			links.push(`<<link "No Preference">><<set $activeSlave.toyHole = "all ${his} holes">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>`);
-			res += links.join('&thinsp;|&thinsp;') + '<br>';
 		}
-		App.UI.replace('#fucktoypref', res);
-	},
 
-	assignmentBlock: function(blockId) {
-		let res = App.UI.jobLinks.assignments(-1, undefined, () => {
-			return `<<replace "#assign">>$activeSlave.assignment<</replace>><<replace "#${blockId}">><<= App.UI.SlaveInteract.assignmentBlock("${blockId}")>><<= App.UI.SlaveInteract.fucktoyPref()>><</replace>>`;
-		});
-		if (State.variables.activeSlave.assignment !== "choose her own job") {
-			res += '&thinsp;|&thinsp; <<link "Stay on this assignment for another month">><<set $activeSlave.sentence += 4>><<replace "#assign">>$activeSlave.assignment($activeSlave.sentence weeks)<</replace>><</link>>';
-		}
-		return res;
+		return row;
+	}
+	return jQuery('#fucktoypref').empty().append(el);
+};
+
+App.UI.SlaveInteract.assignmentBlock = function(blockId) {
+	let res = App.UI.jobLinks.assignments(-1, undefined, () => {
+		return `<<replace "#assign">>$activeSlave.assignment<</replace>><<replace "#${blockId}">><<= App.UI.SlaveInteract.assignmentBlock("${blockId}")>><<= App.UI.SlaveInteract.fucktoyPref()>><</replace>>`;
+	});
+	if (State.variables.activeSlave.assignment !== "choose her own job") {
+		res += '&thinsp;|&thinsp; <<link "Stay on this assignment for another month">><<set $activeSlave.sentence += 4>><<replace "#assign">>$activeSlave.assignment($activeSlave.sentence weeks)<</replace>><</link>>';
 	}
+	return res;
 };
 
 App.UI.SlaveInteract.drugs = function(slave) {
@@ -82,76 +141,80 @@ App.UI.SlaveInteract.drugs = function(slave) {
 		}
 		if (slave.intelligence > -100 && slave.indentureRestrictions < 1) {
 			drugOptions.push({text: `Psychosuppressants`, drug: `psychosuppressants`});
+		} else if (slave.intelligence > -100) {
+			drugOptions.push({text: `Psychosuppressants`, disabled: `Cannot suppress indentured slave`});
+		} else if (slave.indentureRestrictions < 1) {
+			drugOptions.push({text: `Psychosuppressants`, disabled: `Too stupid to supress`});
 		} else {
-			drugOptions.push({text: `Psychosuppressants`});
+			drugOptions.push({text: `Psychosuppressants`, disabled: `Too stupid and indentured to supress`});
 		}
 		if (V.arcologies[0].FSSlaveProfessionalismResearch === 1) {
 			if (canImproveIntelligence(slave)) {
 				drugOptions.push({text: `Psychostimulants`, drug: `psychostimulants`});
 			} else {
-				drugOptions.push({text: `Psychostimulants`});
+				drugOptions.push({text: `Psychostimulants`, disabled: `Cannot improve intelligence`});
 			}
 		}
 		if (slave.boobs < 48000) {
 			drugOptions.push({text: `Breasts`, drug: `breast injections`});
 		} else {
-			drugOptions.push({text: `Breasts`});
+			drugOptions.push({text: `Breasts`, disabled: `Boobs are too large`});
 		}
 		if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
 			if (slave.boobs < 25000) {
 				drugOptions.push({text: `Hyper-Breasts`, drug: `hyper breast injections`});
 			} else {
-				drugOptions.push({text: `Hyper Breasts`});
+				drugOptions.push({text: `Hyper Breasts`, disabled: `Boobs are too large`});
 			}
 		}
 		if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
 			if ((slave.boobs - slave.boobsImplant - slave.boobsMilk) > 100) {
 				drugOptions.push({text: `Breast reducers`, drug: `breast redistributors`});
 			} else {
-				drugOptions.push({text: `Breast reducers`});
+				drugOptions.push({text: `Breast reducers`, disabled: `Boobs are too small`});
 			}
 			if (slave.nipples === "huge" || slave.nipples === "puffy" || slave.nipples === "cute") {
 				drugOptions.push({text: `Nipple reducers`, drug: `nipple atrophiers`});
 			} else {
-				drugOptions.push({text: `Nipple reducers`});
+				drugOptions.push({text: `Nipple reducers`, disabled: `Nipples are ${slave.nipples}`});
 			}
 		}
 		if (slave.butt < 9) {
 			drugOptions.push({text: `Buttocks`, drug: `butt injections`});
 		} else {
-			drugOptions.push({text: `Buttocks`});
+			drugOptions.push({text: `Buttocks`, disabled: `Butt is too large`});
 		}
 		if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
 			if (slave.butt < 20) {
 				drugOptions.push({text: `Hyper-Buttocks`, drug: `hyper butt injections`});
 			} else {
-				drugOptions.push({text: `Hyper Buttocks`});
+				drugOptions.push({text: `Hyper Buttocks`, disabled: `Butt is too large`});
 			}
 		}
 		if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
 			if (slave.butt - slave.buttImplant > 0) {
 				drugOptions.push({text: `Butt reducers`, drug: `butt redistributors`});
 			} else {
-				drugOptions.push({text: `Butt reducers`});
+				drugOptions.push({text: `Butt reducers`, disabled: `Butt is too small`});
 			}
 		}
 		if (slave.lips <= 95 || (slave.lips <= 85 && V.seeExtreme !== 1)) {
 			drugOptions.push({text: `Lips`, drug: `lip injections`});
 		} else {
-			drugOptions.push({text: `Lips`});
+			drugOptions.push({text: `Lips`, disabled: `Lips are too large`});
 		}
 		if (V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
 			if (slave.lips-slave.lipsImplant > 0) {
 				drugOptions.push({text: `Lip reducers`, drug: `lip atrophiers`});
 			} else {
-				drugOptions.push({text: `Lip reducers`});
+				drugOptions.push({text: `Lip reducers`, disabled: `Lips are too small`});
 			}
 		}
 		if (V.growthStim === 1) {
 			if (canImproveHeight(slave)) {
 				drugOptions.push({text: `Growth Stimulants`, drug: `growth stimulants`});
 			} else {
-				drugOptions.push({text: `Growth Stimulants`});
+				drugOptions.push({text: `Growth Stimulants`, disabled: `Cannot increase height further`});
 			}
 		}
 		drugOptions.push({text: `Fertility`, drug: `fertility drugs`});
@@ -162,13 +225,13 @@ App.UI.SlaveInteract.drugs = function(slave) {
 			if (slave.dick < 10) {
 				drugOptions.push({text: `Penis enhancement`, drug: `penis enhancement`});
 			} else {
-				drugOptions.push({text: `Penis enhancement`});
+				drugOptions.push({text: `Penis enhancement`, disabled: `Dick is too large`});
 			}
 		} else {
 			if (slave.clit < 5) {
 				drugOptions.push({text: `Clitoris enhancement`, drug: `penis enhancement`});
 			} else {
-				drugOptions.push({text: `Clitoris enhancement`});
+				drugOptions.push({text: `Clitoris enhancement`, disabled: `Clit is too large`});
 			}
 		}
 		if (V.arcologies[0].FSAssetExpansionistResearch === 1) {
@@ -176,13 +239,13 @@ App.UI.SlaveInteract.drugs = function(slave) {
 				if (slave.dick < 31) {
 					drugOptions.push({text: `Hyper penis enhancement`, drug: `hyper penis enhancement`});
 				} else {
-					drugOptions.push({text: `Hyper penis enhancement`});
+					drugOptions.push({text: `Hyper penis enhancement`, disabled: `Dick is too large`});
 				}
 			} else {
 				if (slave.clit < 5) {
 					drugOptions.push({text: `Hyper clitoris enhancement`, drug: `penis enhancement`});
 				} else {
-					drugOptions.push({text: `Hyper clitoris enhancement`});
+					drugOptions.push({text: `Hyper clitoris enhancement`, disabled: `Clit is too large`});
 				}
 			}
 		}
@@ -190,7 +253,7 @@ App.UI.SlaveInteract.drugs = function(slave) {
 			if (slave.dick > 1) {
 				drugOptions.push({text: `Penis reducers`, drug: `penis atrophiers`});
 			} else if (slave.dick === 1) {
-				drugOptions.push({text: `Penis reducers`});
+				drugOptions.push({text: `Penis reducers`, disabled: `Dick is already at minimum size`});
 			}
 		}
 		if (slave.dick > 0 && slave.dick < 11 && !canAchieveErection(slave) && slave.chastityPenis !== 1) {
@@ -206,7 +269,7 @@ App.UI.SlaveInteract.drugs = function(slave) {
 			if (slave.balls > 1) {
 				drugOptions.push({text: `Testicle reducers`, drug: `testicle atrophiers`});
 			} else if (slave.balls === 1) {
-				drugOptions.push({text: `Testicle reducers`});
+				drugOptions.push({text: `Testicle reducers`, disabled: `Balls are already at minimum size`});
 			}
 			if (slave.clit > 0) {
 				drugOptions.push({text: `Clitoris reducers`, drug: `clitoris atrophiers`});
@@ -219,7 +282,7 @@ App.UI.SlaveInteract.drugs = function(slave) {
 			if (slave.visualAge > 18) {
 				drugOptions.push({text: `Anti-aging cream`, drug: `anti-aging cream`});
 			} else {
-				drugOptions.push({text: `Anti-aging cream`});
+				drugOptions.push({text: `Anti-aging cream`, disabled: `Slave already looks young enough`});
 			}
 		}
 		drugOptions.push({text: `Steroids`, drug: `steroids`});
@@ -227,7 +290,7 @@ App.UI.SlaveInteract.drugs = function(slave) {
 			if (slave.weight > -95) {
 				drugOptions.push({text: `Weight loss pills`, drug: `appetite suppressors`});
 			} else {
-				drugOptions.push({text: `Weight loss pills`});
+				drugOptions.push({text: `Weight loss pills`, disabled: `Slave is already at low weight`});
 			}
 		}
 		if (V.precociousPuberty === 1 && V.pubertyHormones === 1 && (slave.breedingMark !== 1 || V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) {
@@ -268,7 +331,7 @@ App.UI.SlaveInteract.drugs = function(slave) {
 
 			// Test to see if there was a problem with the key
 			for (let j = 0; j < keys.length; j++) {
-				if (["text", "drug"].includes(keys[j])) {
+				if (["text", "drug", "disabled"].includes(keys[j])) {
 					continue;
 				} else {
 					drugArray[i].text += " ERROR, THIS SCENE WAS NOT ENTERED CORRECTLY";
@@ -276,18 +339,12 @@ App.UI.SlaveInteract.drugs = function(slave) {
 					break;
 				}
 			}
-
 			// is it just text?
-			if (keys.length === 1) {
-				if (drugArray[i].text) {
-					link = document.createTextNode(drugArray[i].text);
-				} else {
-					console.log(`expected 'text' only, got: ${drugArray[i]}`);
-					link = document.createTextNode("error, text not found");
-				}
+			if (drugArray[i].disabled) {
+				link = App.UI.DOM.disabledLink(drugArray[i].text, [drugArray[i].disabled]);
 			// Are they already on this drug?
 			} else if (drugArray[i].drug === slave.drugs) {
-				link = document.createTextNode(drugArray[i].text);
+				link = App.UI.DOM.disabledLink(drugArray[i].text, [`${He} is already on this drug`]);
 			// Set up the link
 			} else {
 				link = App.UI.DOM.link(
@@ -361,7 +418,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 					sexOptions.push({text: `Fuck ${him} in your goo pool`, scene: `FPoolSex`});
 				}
 			} else {
-				sexOptions.push({text: `Remove ${his} chastity belt if you wish to fuck ${him}`});
+				sexOptions.push({text: `Fuck ${him}`, disabled: `Remove ${his} chastity belt if you wish to fuck ${him}`});
 			}
 		}
 		if (slave.bellyPreg >= 300000) {
@@ -378,7 +435,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 		if (canDoAnal(slave)) {
 			sexOptions.push({text: `Fuck ${his} ass`, scene: `FAnus`});
 		} else {
-			sexOptions.push({text: `Remove ${his} chastity belt if you wish to fuck ${his} ass`});
+			sexOptions.push({text: `Fuck ${his} ass`, disabled: `Remove ${his} chastity belt if you wish to fuck ${his} ass`});
 		}
 		sexOptions.push({text: `Use ${his} mouth`, scene: `FLips`});
 		sexOptions.push({text: `Kiss ${him}`, scene: `FKiss`});
@@ -423,7 +480,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 					}
 				}
 			} else {
-				sexOptions.push({text: `Remove ${his} dick chastity belt if you wish to play with ${his} cock`});
+				sexOptions.push({text: `Use ${his} dick`, disabled: `Remove ${his} dick chastity belt if you wish to play with ${his} cock`});
 			}
 		}
 
@@ -450,7 +507,8 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 						}
 					}
 				} else {
-					sexOptions.push({text: `${V.dairyNameCaps} is not producing enough milk to pump through the pipes`});
+					fillAssOptions.push({text: `Milk`, disabled: `${V.dairyNameCaps} is not producing enough milk to pump through the pipes`});
+					fillFaceOptions.push({text: `Milk`, disabled: `${V.dairyNameCaps} is not producing enough milk to pump through the pipes`});
 				}
 				if ((V.cumPipeline > 88 && V.cumPipeline !== 0) || V.arcologies[0].FSPastoralistLaw === 1) {
 					if ((slave.inflation < 3 && slave.pregKnown === 0 && slave.bellyImplant < 1500) || slave.inflation < 1) {
@@ -460,7 +518,8 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 						}
 					}
 				} else {
-					sexOptions.push({text: `${V.dairyNameCaps} is not producing enough cum to pump through the pipes`});
+					fillAssOptions.push({text: `Cum`, disabled: `${V.dairyNameCaps} is not producing enough cum to pump through the pipes`});
+					fillFaceOptions.push({text: `Cum`, disabled: `${V.dairyNameCaps} is not producing enough cum to pump through the pipes`});
 				}
 			} /* dairyPiping === 1 */
 			if (V.enema === 1) {
@@ -539,9 +598,9 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 				if (slave.daughters > 0) {
 					if (availRelatives.daughters === 0) {
 						if (slave.daughters === 1) {
-							sexOptions.push({text: `${His} ${availRelatives.oneDaughterRel} is unavailable`});
+							sexOptions.push({text: `Fuck ${him} with ${his} daughter`, disabled: `${His} ${availRelatives.oneDaughterRel} is unavailable`});
 						} else {
-							sexOptions.push({text: `${His} daughters are unavailable`});
+							sexOptions.push({text: `Fuck ${him} with one of ${his} daughters`, disabled: `${His} daughters are unavailable`});
 						}
 					} else {
 						if (slave.daughters === 1) {
@@ -559,9 +618,9 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 				if (slave.sisters > 0) {
 					if (availRelatives.sisters === 0) {
 						if (slave.sisters === 1) {
-							sexOptions.push({text: `${His} ${availRelatives.oneSisterRel} is unavailable`});
+							sexOptions.push({text: `Fuck ${him} with ${his} sister`, disabled: `${His} ${availRelatives.oneSisterRel} is unavailable`});
 						} else {
-							sexOptions.push({text: `${His} sisters are unavailable`});
+							sexOptions.push({text: `Fuck ${him} with one of ${his} sisters`, disabled: `${His} sisters are unavailable`});
 						}
 					} else {
 						if (slave.sisters === 1) {
@@ -594,7 +653,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 							sexOptions.push({text: `Fuck ${him} with ${his} twin`, scene: `FRelation`, update: {partner: "relation"}});
 						}
 					} else {
-						sexOptions.push({text: `${assayedSlave.slaveName} is unavailable`});
+						sexOptions.push({text: `Fuck ${him} with ${his} sibling`, disabled: `${assayedSlave.slaveName} is unavailable`});
 					}
 				}
 			}
@@ -633,16 +692,16 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 		let ML = V.marrying.length;
 		if ((V.MixedMarriage === 1 || V.cheatMode === 1) && slave.relationship !== 5 && slave.relationship !== -3) {
 			if (V.marrying.includes(slave.ID)) {
-				sexOptions.push({text: `You are already marrying ${him} this weekend`});
+				sexOptions.push({text: `Marry ${him}`, disabled: `You are already marrying ${him} this weekend`});
 			} else {
 				if (ML < 2) {
 					if (V.cheatMode === 1 || ML === 0) {
 						sexOptions.push({text: `Marry ${him}`, goto: "FMarry"});
 					} else {
-						sexOptions.push({text: `You already have a wedding planned for this weekend`});
+						sexOptions.push({text: `Marry ${him}`, disabled: `You already have a wedding planned for this weekend`});
 					}
 				} else {
-					sexOptions.push({text: `You can only marry up to two slaves per week`});
+					sexOptions.push({text: `Marry ${him}`, disabled: `You can only marry up to two slaves per week`});
 				}
 			}
 		}
@@ -693,7 +752,7 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 
 			// Test to see if there was a problem with the key
 			for (let j = 0; j < keys.length; j++) {
-				if (["text", "scene", "goto", "updateSlave", "update", "note"].includes(keys[j])) {
+				if (["text", "scene", "goto", "updateSlave", "update", "note", "disabled"].includes(keys[j])) {
 					continue;
 				} else {
 					sexArray[i].text += " ERROR, THIS SCENE WAS NOT ENTERED CORRECTLY";
@@ -702,13 +761,8 @@ App.UI.SlaveInteract.useSlaveDisplay = function(slave) {
 				}
 			}
 			// is it just text?
-			if (keys.length === 1) {
-				if (sexArray[i].text) {
-					link = document.createTextNode(sexArray[i].text);
-				} else {
-					console.log(`expected 'text' only, got: ${sexArray[i]}`);
-					link = document.createTextNode("error, text not found");
-				}
+			if (sexArray[i].disabled) {
+				link = App.UI.DOM.disabledLink(sexArray[i].text, [sexArray[i].disabled]);
 			} else {
 				let passage = "";
 				if (sexArray[i].goto) {
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 001f3e386bad83eb528f46562448a4d32b1c5ec7..dae1caf6d5d5fcbc1126156a8823a2d255cd024d 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -120,34 +120,6 @@
 
 <br>
 
-<span id="fucktoypref">
-	<<if ($activeSlave.assignment == "please you") || ($activeSlave.assignment == "serve in the master suite") || ($activeSlave.assignment == "be your Concubine")>>
-		Fucktoy use preference: <span id="hole" style="font-weight:bold">$activeSlave.toyHole.</span>
-		<<link "Mouth">><<set $activeSlave.toyHole = "mouth">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		| <<link "Tits">><<set $activeSlave.toyHole = "boobs">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		<<if ($activeSlave.vagina > 0) && canDoVaginal($activeSlave)>>
-			| <<link "Pussy">><<set $activeSlave.toyHole = "pussy">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		<<elseif ($activeSlave.vagina > 0)>>
-			| //$His pussy is not available while in chastity//
-		<<elseif ($activeSlave.vagina == 0)>>
-			| //Take $his virginity before giving $his pussy special attention//
-		<</if>>
-		<<if ($activeSlave.anus > 0) && canDoAnal($activeSlave)>>
-			| <<link "Ass">><<set $activeSlave.toyHole = "ass">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		<<elseif ($activeSlave.anus > 0)>>
-			| //$His ass is not available while in chastity//
-		<<elseif ($activeSlave.anus == 0)>>
-			| //Take $his anal virginity before giving $his ass special attention//
-		<</if>>
-		/*check*/
-		<<if ($activeSlave.dick > 0) && canPenetrate($activeSlave)>>
-			| <<link "Dick">><<set $activeSlave.toyHole = "dick">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		<</if>>
-		| <<link "No Preference">><<set $activeSlave.toyHole = "all her holes">><<replace "#hole">>$activeSlave.toyHole<</replace>><</link>>
-		<br>
-	<</if>>
-</span>
-
 <<switch $activeSlave.assignment>>
 	<<case "recover from surgery">>
 		//$He is recovering from surgery this week//
@@ -183,6 +155,9 @@
 
 	/* CAN BE REASSIGNED */
 
+	<div id="fucktoypref"></div>
+	<script>App.UI.SlaveInteract.fucktoyPref(V.activeSlave)</script>
+
 	Assignment:
 	<span id="assign" font-weight="bold">
 		<<if $activeSlave.sentence>>
@@ -194,6 +169,7 @@
 	<<if $assignmentRecords[$activeSlave.ID] && $assignmentRecords[$activeSlave.ID] != $activeSlave.assignment>>
 		Previously: <<print $assignmentRecords[$activeSlave.ID]>>
 	<</if>>
+	
 	<span id="assignmentLinks"><<= App.UI.SlaveInteract.assignmentBlock("assignmentLinks")>></span>
 
 	<<set _numFacilities = $brothel+$club+$dairy+$farmyard+$servantsQuarters+$masterSuite+$spa+$nursery+$clinic+$schoolroom+$cellblock+$arcade+$HGSuite>>