diff --git a/game/03-JavaScript/UI.js b/game/03-JavaScript/UI.js
index 2ebf80dec0f4ec7dc5caa98f97791ff2a5fdd29b..7155d022789bc4363c39afa87cb9ae65b74d1bd5 100644
--- a/game/03-JavaScript/UI.js
+++ b/game/03-JavaScript/UI.js
@@ -429,50 +429,33 @@ window.settingsNamedNpcBreastSize = function (id, persist) {
 	});
 }
 
-window.settingsNamedNpcGenderUpdate = function () {
-	let updateButtonsActive = () => {
-		jQuery('[id*=radiobutton-npcname-npcidpenissize]').prop("disabled", V.NPCName[T.npcId].gender == "f");
-	};
-
-	jQuery(document).ready(() => {
-		updateButtonsActive();
-		jQuery('[id*=radiobutton-npcname-npcidgender]').on('change', function (e) { updateButtonsActive(); });
-	});
-}
-
-window.settingsPersistentNpcGenderUpdate = function () {
-	let updateButtonsActive = () => {
-		jQuery('[id*=radiobutton-' + Util.slugify('$per_npc[_pNPCId].penissize') + ']').prop("disabled", V.per_npc[T.pNPCId].gender == "f");
-		jQuery('[id*=radiobutton-' + Util.slugify('$per_npc[_pNPCId].pronoun') + ']').prop("disabled", V.per_npc[T.pNPCId].pronoun == "i");
-	};
-
-	jQuery(document).ready(() => {
-		updateButtonsActive();
-		jQuery('[id*=radiobutton-' + Util.slugify('$per_npc[_pNPCId].gender') + ']').on('change', function (e) { updateButtonsActive(); });
-	});
-}
-
-window.settingsPCGenderUpdate = function () {
-	let updateButtonsActive = () => {
-		jQuery('[id*=radiobutton-penissize]').prop("disabled", V.player.gender == "f");
-		jQuery('[id*=radiobutton-playerballsexist]').prop("disabled", V.player.gender !== "h");
-		jQuery('[id*=radiobutton-background-8]').prop("disabled", V.player.gender == "h");
-	};
-
-	jQuery(document).ready(() => {
-		updateButtonsActive();
-		jQuery('.playergender [id*=radiobutton-playergender]').on('change', function (e) { updateButtonsActive(); });
-	});
-}
-
-window.settingsDoubleAnalToggleGreyOut = function() {
-	let updateButtonsActive = () => {
-		jQuery('[id*=checkbox-analdoubledisable]').prop("disabled", V.analdisable == "t");
-	};
-
-	jQuery(document).ready(() => {
-		updateButtonsActive();
-		jQuery('[id*=checkbox-analdisable]').on('change', function (e) { updateButtonsActive(); });
+// Checks current settings page for data attributes
+// Run only when settings tab is changed (probably in "displaySettings" widget)
+//data-target is the target element that needs to be clicked for the value to be updated
+//data-disabledif is the conditional statement (e.g. data-disabledif="V.per_npc[T.pNPCId].gender==='f'")
+//Conditional statement uses V and T instead of $ and _
+
+window.settingsDisableElement = function() {
+	$(document).ready(() => {
+		$("[data-target]").each(function(){
+			let updateButtonsActive = () => {
+				$(document).ready(() => {
+					try{
+						let cond = eval(disabledif);
+						let style = cond ? "var(--500)" : "";
+						orig.css("color", style).children().css("color", style);
+						orig.find("input").prop("disabled", cond);
+					}
+					catch(e){ console.log(e); }
+				});
+			};
+			let orig = $(this);
+			let disabledif = orig.data("disabledif");
+			if(orig.data("target") && disabledif){
+				updateButtonsActive();
+				$(document).on("click.evt", "[name*='" + Util.slugify(orig.data("target")) + "']", function(){ updateButtonsActive(); });
+			}
+		});
 	});
 }
 
diff --git a/game/base-system/settings.twee b/game/base-system/settings.twee
index e665e5636788d85c6d8ad00f0c8cfa9b667a5c1c..dc158d56fc041a70da5c2aa577c5025bb0376b7e 100644
--- a/game/base-system/settings.twee
+++ b/game/base-system/settings.twee
@@ -137,6 +137,7 @@
 <<if $currentSettings isnot "importConfirmDetails">>
 	<<unset $importString>>
 <</if>>
+<<run settingsDisableElement()>>
 <</widget>>
 
 <<widget "displaySubsection">>
@@ -439,7 +440,6 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<label>Hermaphrodite <<radiobutton "$player.gender" "h" autocheck>></label>
 	<br><br>
 	</div>
-	<<run settingsPCGenderUpdate()>>
 
 	<span class="gold">Natural features</span>
 	<br>
@@ -456,12 +456,12 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 		<br><br>
 	<</if>>
 
-	<span class="gold">Penis size</span> - if applicable
-	<br>
+	<span data-target="player.gender" data-disabledif="V.player.gender==='f'">
+	<span class="gold">Penis size</span> - if applicable<br>
 	<label>Tiny <<radiobutton "$player.penissize" 0 autocheck>></label> |
 	<label>Small <<radiobutton "$player.penissize" 1 autocheck>></label> |
 	<label>Normal <<radiobutton "$player.penissize" 2 autocheck>></label>
-	<br><br>
+	</span><br><br>
 
 	<span class="gold">Breast size</span>
 	<br>
@@ -480,11 +480,11 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<label>Cushioned <<radiobutton "$player.bottomsize" 3 autocheck>></label>
 	<br><br>
 
-	<span class="gold">Testes</span> - applicable only if hermaphrodite
-	<br>
+	<span data-target="player.gender" data-disabledif="V.player.gender!=='h'">
+	<span class="gold">Testes</span> - applicable only if hermaphrodite<br>
 	<label>Yes <<radiobutton "$player.ballsExist" true autocheck>></label> |
 	<label>No <<radiobutton "$player.ballsExist" false autocheck>></label> |
-	<br><br>
+	</span><br><br>
 
 	<span class="gold">Chest sensitivity</span>
 	<br>
@@ -621,7 +621,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<br>
 	<label><span class="lewd">Beautiful</span> <<radiobutton "$background" "beautiful" autocheck>> - You turn heads. <i>Not recommended for beginners.</i></label>
 	<br>
-	<label><span class="lewd">Crossdresser</span> <<radiobutton "$background" "crossdresser" autocheck>> - You've taken a liking to the clothing of the opposite sex. Does nothing for hermaphrodites.</label>
+	<label data-target="player.gender" data-disabledif="V.player.gender==='h'"><span class="lewd">Crossdresser</span> <<radiobutton "$background" "crossdresser" autocheck>> - You've taken a liking to the clothing of the opposite sex. Does nothing for hermaphrodites.</label>
 	<br>
 	<label><span class="lewd">Lustful</span> <<radiobutton "$background" "lustful" autocheck>> - Arousal increases over time, and needs to be managed.</label>
 	/*<br>
@@ -758,7 +758,6 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<label><div class="settingsToggle">
 	<<checkbox "$analdisable" "t" "f" autocheck>> Enable anal
 	</div></label>
-	<<run settingsDoubleAnalToggleGreyOut()>>
 	<div class="settingsToggle" role="group" aria-labelledby="settingsAnalingusHead">
 	<span id="settingsAnalingusHead">Analingus:</span>
 	<label>
@@ -773,7 +772,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<label>
 		<<checkbox "$vaginaldoubledisable" "t" "f" autocheck>> Vaginal
 	</label>
-	<label>
+	<label data-target="analdisable" data-disabledif="V.analdisable==='t'">
 		<<checkbox "$analdoubledisable" "t" "f" autocheck>> Anal
 	</label>
 	<mouse class="tooltip linkBlue">(?)<span>Note that double anal requires anal to be enabled.
@@ -1576,7 +1575,6 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 		<label><<radiobutton "$NPCName[_npcId].gender" "f" autocheck>> Vagina</label> |
 		<label><<radiobutton "$NPCName[_npcId].gender" "m" autocheck>> Penis</label>
 		<<if $debug is 1>>| <label><<radiobutton "$NPCName[_npcId].gender" "h" autocheck>> Both</label><</if>>
-		<<run settingsNamedNpcGenderUpdate()>>
 	<<else>>
 		Unable to change the npc genitals due to their pregnancy.
 	<</if>>
@@ -1584,6 +1582,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	Penis size - if applicable:
 	<br>
 	<<set _penisNames to ["", "Tiny", "Average", "Thick", "Huge"]>> /* the empty first element is necessary because _j starts at 1 */
+	<span data-target="npcname-npcidgender" data-disabledif="V.NPCName[T.npcId].gender==='f'">
 	<<for _j to 1; _j lt _penisNames.length; _j++>>
 		<label>
 			<<radiobutton "$NPCName[_npcId].penissize" _j autocheck>>
@@ -1591,6 +1590,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 		</label>
 		<<if _j isnot _penisNames.length -1>>|<</if>>
 	<</for>>
+	</span>
 	<br><br>
 
 	<div class="settingsToggle" style="display: inline-flex;">
@@ -1637,6 +1637,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 		<</for>>
 		<br><br>
 	<</if>>
+<<run settingsDisableElement()>>
 <</widget>>
 
 <<widget "perNPCSettingsMenu">>
@@ -1695,16 +1696,18 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 			<</link>>
 		<</if>>
 		<br>
+		<span data-disabledif="V.per_npc[T.pNPCId].pronoun==='i'">
 		<label><<radiobutton "$per_npc[_pNPCId].pronoun" "f" autocheck>> Female</label> |
 		<label><<radiobutton "$per_npc[_pNPCId].pronoun" "m" autocheck>> Male</label>
+		</span>
 		<br>
 		<label><<radiobutton "$per_npc[_pNPCId].gender" "f" autocheck>> Vagina</label> |
 		<label><<radiobutton "$per_npc[_pNPCId].gender" "m" autocheck>> Penis</label>
-		<<run settingsPersistentNpcGenderUpdate()>>
 		<br><br>
 		Penis size - if applicable:
 		<br>
 		<<set _penisNames to ["", "Tiny", "Average", "Thick", "Huge"]>> /* the empty first element is necessary because _j starts at 1 */
+		<span data-target="pernpc-npcidgender" data-disabledif="V.per_npc[T.pNPCId].gender==='f'">
 		<<for _j to 1; _j lt _penisNames.length; _j++>>
 			<label>
 				<<radiobutton "$per_npc[_pNPCId].penissize" _j autocheck>>
@@ -1712,6 +1715,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 			</label>
 			<<if _j isnot _penisNames.length -1>>|<</if>>
 		<</for>>
+		</span>
 		<br><br>
 		<div class="settingsToggle" style="display: inline-flex;">
 			Breast size
@@ -1722,6 +1726,7 @@ Values above 5 can lead to errors when creating new saves! Make sure you know wh
 	<div style="clear:both;">
 		/*Keep at end of toggles*/
 	</div>
+<<run settingsDisableElement()>>
 <</widget>>