diff --git a/src/Mods/SecExp/attackOptions.tw b/src/Mods/SecExp/attackOptions.tw
index a35834ca22790f257d0161370af7b44cc53019b9..926c27574dd64f5cd042bf3eb57fa9590884ee1e 100644
--- a/src/Mods/SecExp/attackOptions.tw
+++ b/src/Mods/SecExp/attackOptions.tw
@@ -8,7 +8,7 @@
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("Unit descriptions are", "unitDescriptions", $SecExp.settings)
 .addValueList([["Abbreviated", 1], ["Summarized", 0]])>>
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 <br>
 
@@ -402,7 +402,7 @@ __Battle Plan__:
 	<<run _options.addOption("The incoming attack's scale warrants deploying the special force.", "SFIntervention")
 	.addValue("Green light", 1).on().addValue("Red light", 0).off()
 	.addComment("Some upgrades will be able to support your troops even if the special force is not deployed in the fight.")>>
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 <</if>>
 
 <<if $lastSelection.length > 0>> <br>
diff --git a/src/Mods/SecExp/buildings/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw
index 2e922fded69bea8b8489e4ad1353a68572b810b8..92cbb8d39760eefc67aecdfc07ab69de407de8e2 100644
--- a/src/Mods/SecExp/buildings/secBarracks.tw
+++ b/src/Mods/SecExp/buildings/secBarracks.tw
@@ -130,7 +130,7 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("Unit descriptions are", "unitDescriptions", $SecExp.settings)
 .addValue("Abbreviated", 1).on().addValue("Summarized", 0).off()>>
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 <<if App.SecExp.battle.activeUnits() >= App.SecExp.battle.maxUnits()>>
 	<br>You have reached the maximum number of units. You'll have to disband one or enlarge the barracks before forming a new unit.
 <</if>>
diff --git a/src/arcologyBuilding/cell.tw b/src/arcologyBuilding/cell.tw
index 87d3126b7b743cc49fe39a136c976434407f0f25..aa51dc8caa38271c94c3047b48bde840b61307fe 100644
--- a/src/arcologyBuilding/cell.tw
+++ b/src/arcologyBuilding/cell.tw
@@ -2,4 +2,4 @@
 
 <<set $nextButton = "Back", $nextLink = "Main">>
 
-<<print App.UI.DOM.includeDOM(V.building.renderCell(V.cellPath))>>
+<<includeDOM V.building.renderCell(V.cellPath)>>
diff --git a/src/events/intro/introSummary.tw b/src/events/intro/introSummary.tw
index 2140ef648506768ff44e43fc0e0389daa1706434..9abbd5f387e163e784c06cf93865c4f3289be991 100644
--- a/src/events/intro/introSummary.tw
+++ b/src/events/intro/introSummary.tw
@@ -119,7 +119,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("Economic Tabs on weekly reports are", "useTabs")
 	.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 	
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<h2>Images</h2>
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -127,7 +127,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("Images are", "seeImages")
 	.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 	
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<<if $seeImages > 0>>
 		<div class="imageRef" style="width:200px;height:200px;margin-left:50px;">
@@ -177,7 +177,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 		<<run _options.addOption("Slave images in the weekly report are", "seeReportImages")
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 		
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 	<</if>>
 	</div>
 </div>
@@ -259,7 +259,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	.addValue("Enable non-erotic events", 1).on().customDescription("Game mode: ''two-handed''. Includes non-erotic events concerning the changing world.")
 	.addValue("Disable non-erotic events", 0).off().customDescription("Game mode: ''one-handed''. No non-erotic events concerning the changing world.")>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<h2>The Free City</h2>
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -302,7 +302,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("The Free City could develop as many as ''$FSCreditCount'' future societies.", "FSCreditCount")
 	.showTextBox().addComment("5 is default, 4 behaves the same as pre-patch 0.9.9.0, max is 7. This option cannot be changed during the game.")>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<h2>Content</h2>
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -355,7 +355,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 	<</if>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<h2>Mods</h2>
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -373,7 +373,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("The Security Expansion Mod is", "secExpEnabled").addComment("This mod introduces security and crime in the arcology, as well as attacks and battles.")
 	.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
@@ -425,7 +425,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("Slaves with fat lips or heavy oral piercings may lisp", "disableLisping")
 	.addValue("Yes", 0).on().addValue("No", 1).off()>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 
 	<h2>Age</h2>
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -461,7 +461,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 	<<run _options.addOption("Children growing as they age is", "loliGrow")
 	.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
@@ -591,7 +591,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 			["Blind luck", "luck"]]
 		)>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Sexuality</h2>
 		<<set _options = new App.UI.OptionsGroup()>>
@@ -673,7 +673,7 @@ You may review your settings before clicking "Continue" to begin.<br>
 			.addValueList([["All natural", 0], ["Fake", 400]])>>
 		<</if>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 	<<else>>
 
 		You are a
@@ -695,17 +695,10 @@ You may review your settings before clicking "Continue" to begin.<br>
 			''surprisingly young''.
 		<</if>>
 
-		<<options $playerAging>>
-			Your birthday will be in $PC.birthWeek weeks
-			<<option 2 "Enable aging">>
-				and you ''age naturally''.
-			<<option 1 "Semi aging">>
-				and you ''will'' celebrate birthdays, but ''not age''.
-			<<option 0 "Disable aging">>
-				and you will ''not age,'' nor experience birthdays.
-			<<comment>>
-			This option cannot be changed during the game
-		<</options>>
+		<<run _options.addOption("Player aging is", "playerAging")
+		.addValue("Enabled", 2).on().addValue("Celebrate birthdays, but don't age.", 1).neutral().addValue("Disabled", 0).off()
+		.addComment("This option cannot be changed during the game.")>>
+
 		<p>
 			Your custom title is ''<<textbox2 "$PC.customTitle" $PC.customTitle "Intro Summary">>''
 			and when lisped it is ''<<textbox2 "$PC.customTitleLisp" $PC.customTitleLisp "Intro Summary">>''.
diff --git a/src/events/intro/takeoverTarget.tw b/src/events/intro/takeoverTarget.tw
index 231ec44ca006e908742433560d40932fbc75bb2b..4d59a6556e32ed32da633ac89e56231fca753d54 100644
--- a/src/events/intro/takeoverTarget.tw
+++ b/src/events/intro/takeoverTarget.tw
@@ -43,4 +43,4 @@
 </div>
 </div>
 
-<<print App.UI.DOM.includeDOM(App.Intro.generateEstablishedArcologies(), "list")>>
+<<includeDOM App.Intro.generateEstablishedArcologies()>>
diff --git a/src/gui/Encyclopedia/encyclopedia.tw b/src/gui/Encyclopedia/encyclopedia.tw
index 5c6fa56fe2b4d6f191fd54d647f4d19128220dd4..5cda07d18f50466b78df9dea16db9fd58a509a86 100644
--- a/src/gui/Encyclopedia/encyclopedia.tw
+++ b/src/gui/Encyclopedia/encyclopedia.tw
@@ -867,56 +867,56 @@ SLAVE ASSIGNMENTS:
 SLAVE ASSIGNMENTS (COMMON):
 **********/
 <<case "Attending Classes">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.attendingClasses(), "encyclasses")>>
+	<<includeDOM App.Encyclopedia.Entries.attendingClasses()>>
 	//Associated facility: [[Schoolroom|Encyclopedia][$encyclopedia = "Schoolroom"]]//
 
 
 <<case "Confinement">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.confinement(), "encyconfine")>>
+	<<includeDOM App.Encyclopedia.Entries.confinement()>>
 	//Associated facility: [[Cellblock|Encyclopedia][$encyclopedia = "Cellblock"]]//
 
 
 <<case "Fucktoy">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.fucktoy(), "encyfucktoy")>>
+	<<includeDOM App.Encyclopedia.Entries.fucktoy()>>
 	//Associated facility: [[Master Suite|Encyclopedia][$encyclopedia = "Master Suite"]]//
 
 
 <<case "Glory Hole">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.gloryHole(), "encyglory")>>
+	<<includeDOM App.Encyclopedia.Entries.gloryHole()>>
 	//Associated facility: [[Arcade|Encyclopedia][$encyclopedia = "Arcade"]]//
 
 
 <<case "Milking">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.milking(), "encymilk")>>
+	<<includeDOM App.Encyclopedia.Entries.milking()>>
 	//Associated facility: [[Dairy|Encyclopedia][$encyclopedia = "Dairy"]]//
 
 
 <<case "Farming">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.farming(), "encyfarm")>>
+	<<includeDOM App.Encyclopedia.Entries.farming()>>
 	//Associated facility: [[Farmyard|Encyclopedia][$encyclopedia = "Farmyard"]]//
 
 
 <<case "Public Service">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.publicService(), "encypublic")>>
+	<<includeDOM App.Encyclopedia.Entries.publicService()>>
 	//Associated facility: [[Club|Encyclopedia][$encyclopedia = "Club"]]//
 
 
 <<case "Rest">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.rest(), "encyrest")>>
+	<<includeDOM App.Encyclopedia.Entries.rest()>>
 	//Associated facilities: [[Spa|Encyclopedia][$encyclopedia = "Spa"]], [[Clinic|Encyclopedia][$encyclopedia = "Clinic"]]//
 
 
 <<case "Sexual Servitude">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.sexualServitude(), "encysexServ")>>
+	<<includeDOM App.Encyclopedia.Entries.sexualServitude()>>
 
 
 <<case "Servitude">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.servitude(), "encyserve")>>
+	<<includeDOM App.Encyclopedia.Entries.servitude()>>
 	//Associated facility: [[Servants' Quarters|Encyclopedia][$encyclopedia = "Servants' Quarters"]]//
 
 
 <<case "Whoring">>
-	<<print App.UI.DOM.includeDOM(App.Encyclopedia.Entries.whoring(), "encywhore")>>
+	<<includeDOM App.Encyclopedia.Entries.whoring()>>
 	//Associated facility: [[Brothel|Encyclopedia][$encyclopedia = "Brothel"]]//
 
 /**********
diff --git a/src/gui/options.js b/src/gui/options.js
index 4c1996f159f8250a0ff6888bfb3ee36067a16bc0..01035bf3f3342bfd95fb9c6002981691b3b0d3f5 100644
--- a/src/gui/options.js
+++ b/src/gui/options.js
@@ -1,293 +1,306 @@
 App.UI.OptionsGroup = (function() {
+	/**
+	 * @typedef value
+	 * @property {*} value
+	 * @property {string} [name]
+	 * @property {string} mode
+	 * @property {number} [compareValue]
+	 * @property {string} [descAppend] can be SC markup
+	 * @property {boolean} [on]
+	 * @property {boolean} [off]
+	 * @property {boolean} [neutral]
+	 * @property {Function} [callback]
+	 */
+
+	const Option = class {
 		/**
-		 * @typedef value
-		 * @property {*} value
-		 * @property {string} [name]
-		 * @property {string} mode
-		 * @property {number} [compareValue]
-		 * @property {string} [descAppend] can be SC markup
-		 * @property {boolean} [on]
-		 * @property {boolean} [off]
-		 * @property {boolean} [neutral]
-		 * @property {Function} [callback]
+		 * @param {string} description can be SC markup
+		 * @param {string} property
+		 * @param {object} [object=V]
 		 */
-
-		const Option = class {
+		constructor(description, property, object = V) {
+			this.description = description;
+			this.property = property;
+			this.object = object;
 			/**
-			 * @param {string} description can be SC markup
-			 * @param {string} property
-			 * @param {object} [object=V]
+			 * @type {Array<value>}
 			 */
-			constructor(description, property, object = V) {
-				this.description = description;
-				this.property = property;
-				this.object = object;
-				/**
-				 * @type {Array<value>}
-				 */
-				this.valuePairs = [];
-			}
+			this.valuePairs = [];
+		}
 
-			/**
-			 * @param {*} name
-			 * @param {*} [value=name]
-			 * @param {Function} [callback]
-			 * @returns {Option}
-			 */
-			addValue(name, value = name, callback = undefined) {
-				this.valuePairs.push({name: name, value: value, mode: "=", callback: callback});
-				return this;
-			}
+		/**
+		 * @param {*} name
+		 * @param {*} [value=name]
+		 * @param {Function} [callback]
+		 * @returns {Option}
+		 */
+		addValue(name, value = name, callback = undefined) {
+			this.valuePairs.push({
+				name: name, value: value, mode: "=", callback: callback
+			});
+			return this;
+		}
 
-			/**
-			 * @param {Array<*|Array>} values
-			 * @returns {Option}
-			 */
-			addValueList(values) {
-				for (const value of values) {
-					if (Array.isArray(value)) {
-						this.addValue(value[0], value[1]);
-					} else {
-						this.addValue(value);
-					}
+		/**
+		 * @param {Array<*|Array>} values
+		 * @returns {Option}
+		 */
+		addValueList(values) {
+			for (const value of values) {
+				if (Array.isArray(value)) {
+					this.addValue(value[0], value[1]);
+				} else {
+					this.addValue(value);
 				}
-				return this;
 			}
+			return this;
+		}
 
-			/**
-			 * @param {*} value
-			 * @param {number} compareValue
-			 * @param {string} mode on of: "<", "<=", ">", ">="
-			 * @param {string} [name=value]
-			 */
-			addRange(value, compareValue, mode, name = value) {
-				this.valuePairs.push({
-					name: name, value: value, mode: mode, compareValue: compareValue
-				});
-				return this;
-			}
+		/**
+		 * @param {*} value
+		 * @param {number} compareValue
+		 * @param {string} mode on of: "<", "<=", ">", ">="
+		 * @param {string} [name=value]
+		 */
+		addRange(value, compareValue, mode, name = value) {
+			this.valuePairs.push({
+				name: name, value: value, mode: mode, compareValue: compareValue
+			});
+			return this;
+		}
 
-			/**
-			 * @returns {Option}
-			 */
-			showTextBox() {
-				this.textbox = true;
-				return this;
+		/**
+		 * @param {string} [unit]
+		 * @returns {Option}
+		 */
+		showTextBox(unit) {
+			this.textbox = true;
+			if (unit) {
+				this.unit = unit;
 			}
+			return this;
+		}
 
-			/**
-			 * @param {string} comment can be SC markup
-			 * @returns {Option}
-			 */
-			addComment(comment) {
-				this.comment = comment;
-				return this;
-			}
+		/**
+		 * @param {string} comment can be SC markup
+		 * @returns {Option}
+		 */
+		addComment(comment) {
+			this.comment = comment;
+			return this;
+		}
 
-			/**
-			 * Adds a button that executes the callback when clicked AND reloads the passage
-			 *
-			 * @param {string} name
-			 * @param {Function} callback
-			 * @param {string} passage
-			 */
-			customButton(name, callback, passage) {
-				this.valuePairs.push({
-					name: name, value: passage, callback: callback, mode: "custom"
-				});
-				return this;
-			}
+		/**
+		 * Adds a button that executes the callback when clicked AND reloads the passage
+		 *
+		 * @param {string} name
+		 * @param {Function} callback
+		 * @param {string} passage
+		 */
+		customButton(name, callback, passage) {
+			this.valuePairs.push({
+				name: name, value: passage, callback: callback, mode: "custom"
+			});
+			return this;
+		}
 
-			/**
-			 * @param {string} element can be SC markup
-			 * @returns {Option}
-			 */
-			addCustomElement(element) {
-				this.valuePairs.push({value: element, mode: "plain"});
-				return this;
-			}
+		/**
+		 * @param {string} element can be SC markup
+		 * @returns {Option}
+		 */
+		addCustomElement(element) {
+			this.valuePairs.push({
+				value: element, mode: "plain"
+			});
+			return this;
+		}
 
-			/* modify last added option */
+		/* modify last added option */
 
-			/**
-			 * Added to the description if last added value is selected.
-			 * example use: addValue(...).customDescription(...).addValue(...).customDescription(...)
-			 * @param {string} description can be SC markup
-			 */
-			customDescription(description) {
-				this.valuePairs.last().descAppend = description;
-				return this;
-			}
+		/**
+		 * Added to the description if last added value is selected.
+		 * example use: addValue(...).customDescription(...).addValue(...).customDescription(...)
+		 * @param {string} description can be SC markup
+		 */
+		customDescription(description) {
+			this.valuePairs.last().descAppend = description;
+			return this;
+		}
 
-			/**
-			 * @param {Function} callback gets executed on every button click. Selected value is given as argument.
-			 */
-			addCallback(callback) {
-				this.valuePairs.last().callback = callback;
-				return this;
-			}
+		/**
+		 * @param {Function} callback gets executed on every button click. Selected value is given as argument.
+		 */
+		addCallback(callback) {
+			this.valuePairs.last().callback = callback;
+			return this;
+		}
 
-			/**
-			 * Mark option as on to style differently.
-			 * @returns {Option}
-			 */
-			on() {
-				this.valuePairs.last().on = true;
-				return this;
-			}
+		/**
+		 * Mark option as on to style differently.
+		 * @returns {Option}
+		 */
+		on() {
+			this.valuePairs.last().on = true;
+			return this;
+		}
 
-			/**
-			 * Mark option as off to style differently.
-			 * @returns {Option}
-			 */
-			off() {
-				this.valuePairs.last().off = true;
-				return this;
-			}
+		/**
+		 * Mark option as off to style differently.
+		 * @returns {Option}
+		 */
+		off() {
+			this.valuePairs.last().off = true;
+			return this;
+		}
 
+		/**
+		 * Mark option as neutral to style differently.
+		 * @returns {Option}
+		 */
+		neutral() {
+			this.valuePairs.last().neutral = true;
+			return this;
+		}
+	};
+
+	return class {
+		constructor() {
 			/**
-			 * Mark option as neutral to style differently.
-			 * @returns {Option}
+			 * @type {Array<Option>}
 			 */
-			neutral() {
-				this.valuePairs.last().neutral = true;
-				return this;
-			}
-		};
+			this.options = [];
+		}
 
-		return class {
-			constructor() {
-				/**
-				 * @type {Array<Option>}
-				 */
-				this.options = [];
-			}
+		/**
+		 * @returns {App.UI.OptionsGroup}
+		 */
+		enableDoubleColumn() {
+			this.doubleColumn = true;
+			return this;
+		}
 
-			/**
-			 * @returns {App.UI.OptionsGroup}
-			 */
-			enableDoubleColumn() {
-				this.doubleColumn = true;
-				return this;
-			}
+		addOption(name, property, object = V) {
+			const option = new Option(name, property, object);
+			this.options.push(option);
+			return option;
+		}
 
-			addOption(name, property, object = V) {
-				const option = new Option(name, property, object);
-				this.options.push(option);
-				return option;
+		render() {
+			const container = document.createElement("div");
+			container.className = "options-group";
+			if (this.doubleColumn) {
+				container.classList.add("double");
 			}
+			for (/** @type {Option} */ const option of this.options) {
+				/* left side */
+				const desc = document.createElement("div");
+				desc.className = "description";
+				$(desc).wiki(option.description);
+				container.append(desc);
 
-			render() {
-				const container = document.createElement("div");
-				container.className = "options-group";
-				if (this.doubleColumn) {
-					container.classList.add("double");
-				}
-				for (/** @type {Option} */ const option of this.options) {
-					/* left side */
-					const desc = document.createElement("div");
-					desc.className = "description";
-					$(desc).wiki(option.description);
-					container.append(desc);
+				/* right side */
+				const currentValue = option.object[option.property];
+				let anySelected = false;
 
-					/* right side */
-					const currentValue = option.object[option.property];
-					let anySelected = false;
-
-					const buttonGroup = document.createElement("div");
-					buttonGroup.classList.add("button-group");
-					for (const value of option.valuePairs) {
-						if (value.mode === "plain") {
-							/* insert custom SC markup and go to next element */
-							$(buttonGroup).wiki(value.value);
-							continue;
-						}
-						const button = document.createElement("button");
-						button.append(value.name);
-						if (value.on) {
-							button.classList.add("on");
-						} else if (value.off) {
-							button.classList.add("off");
-						} else if (value.neutral) {
-							button.classList.add("neutral");
+				const buttonGroup = document.createElement("div");
+				buttonGroup.classList.add("button-group");
+				for (const value of option.valuePairs) {
+					if (value.mode === "plain") {
+						/* insert custom SC markup and go to next element */
+						$(buttonGroup).wiki(value.value);
+						continue;
+					}
+					const button = document.createElement("button");
+					button.append(value.name);
+					if (value.on) {
+						button.classList.add("on");
+					} else if (value.off) {
+						button.classList.add("off");
+					} else if (value.neutral) {
+						button.classList.add("neutral");
+					}
+					if (value.mode === "custom") {
+						button.onclick = () => {
+							value.callback();
+							if (value.value) {
+								Engine.play(value.value);
+							} else {
+								reload();
+							}
+						};
+					} else {
+						if (value.mode === "=" && currentValue === value.value) {
+							button.classList.add("selected", "disabled");
+							anySelected = true;
+							if (value.descAppend !== undefined) {
+								desc.append(" ");
+								$(desc).wiki(value.descAppend);
+							}
+						} else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) {
+							button.classList.add("selected");
+							// disable the button if clicking it won't change the variable value
+							if (currentValue === value.value) {
+								button.classList.add("disabled");
+							}
+							anySelected = true;
+							if (value.descAppend !== undefined) {
+								desc.append(" ");
+								$(desc).wiki(value.descAppend);
+							}
 						}
-						if (value.mode === "custom") {
-							button.onclick = () => {
+						button.onclick = () => {
+							option.object[option.property] = value.value;
+							if (value.callback) {
 								value.callback();
-								if (value.value) {
-									Engine.play(value.value);
-								} else {
-									reload();
-								}
-							};
-						} else {
-							if (value.mode === "=" && currentValue === value.value) {
-								button.classList.add("selected", "disabled");
-								anySelected = true;
-								if (value.descAppend !== undefined) {
-									desc.append(" ");
-									$(desc).wiki(value.descAppend);
-								}
-							} else if (!anySelected && inRange(value.mode, value.compareValue, currentValue)) {
-								button.classList.add("selected");
-								anySelected = true;
-								if (value.descAppend !== undefined) {
-									desc.append(" ");
-									$(desc).wiki(value.descAppend);
-								}
 							}
-							button.onclick = () => {
-								option.object[option.property] = value.value;
-								if (value.callback) {
-									value.callback();
-								}
-								reload();
-							};
-						}
-						buttonGroup.append(button);
-					}
-					if (option.textbox) {
-						const isNumber = typeof currentValue === "number";
-						const textbox = App.UI.DOM.makeTextBox(currentValue, input => {
-							option.object[option.property] = input;
 							reload();
-						}, isNumber);
-						if (isNumber) {
-							textbox.classList.add("number");
-						}
-						buttonGroup.append(textbox);
+						};
 					}
-					if (option.comment) {
-						const comment = document.createElement("span");
-						comment.classList.add("comment");
-						$(comment).wiki(option.comment);
-						buttonGroup.append(comment);
+					buttonGroup.append(button);
+				}
+				if (option.textbox) {
+					const isNumber = typeof currentValue === "number";
+					const textbox = App.UI.DOM.makeTextBox(currentValue, input => {
+						option.object[option.property] = input;
+						reload();
+					}, isNumber);
+					if (isNumber) {
+						textbox.classList.add("number");
+					}
+					buttonGroup.append(textbox);
+					if (option.unit) {
+						buttonGroup.append(" ", option.unit);
 					}
-					container.append(buttonGroup);
-
 				}
+				if (option.comment) {
+					const comment = document.createElement("span");
+					comment.classList.add("comment");
+					$(comment).wiki(option.comment);
+					buttonGroup.append(comment);
+				}
+				container.append(buttonGroup);
+			}
 
-				return container;
+			return container;
 
-				function reload() {
-					const position = window.pageYOffset;
-					Engine.play(passage());
-					window.scrollTo(0, position);
-				}
+			function reload() {
+				const position = window.pageYOffset;
+				Engine.play(passage());
+				window.scrollTo(0, position);
+			}
 
-				function inRange(mode, compareValue, value) {
-					if (mode === "<") {
-						return value < compareValue;
-					} else if (mode === "<=") {
-						return value <= compareValue;
-					} else if (mode === ">") {
-						return value > compareValue;
-					} else if (mode === ">=") {
-						return value >= compareValue;
-					}
-					return false;
+			function inRange(mode, compareValue, value) {
+				if (mode === "<") {
+					return value < compareValue;
+				} else if (mode === "<=") {
+					return value <= compareValue;
+				} else if (mode === ">") {
+					return value > compareValue;
+				} else if (mode === ">=") {
+					return value >= compareValue;
 				}
+				return false;
 			}
-		};
-	}
-)();
+		}
+	};
+})();
diff --git a/src/js/optionsMacro.js b/src/js/optionsMacro.js
deleted file mode 100644
index 6fa1158c0c32ceda31d577b9ec68814017c99321..0000000000000000000000000000000000000000
--- a/src/js/optionsMacro.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/* eslint-disable camelcase */
-/* eslint-disable no-empty */
-/* Use like:
-	<<options $varname "New Passage (defaults to current passage)">>
-	  A title
-	  <<option "value_to_set_varname_to" "English text to show user" "additional variables to set when clicked" "Extra English text to show, but not as a link">>
-		 Text to show if $varname matches this option
-	  <<option ....>>
-	  <<comment>>
-		Some comment to add at the end
-	<</option>>
-
-	optionlt and optionslte lets you also specify a 'less than' or 'less than or
-	equal' value, to show an option as selected if it is less than this amount
-	(and not selected by a previous option)
-
-	<<optionlt "less than value" "value_to_set_varname_to" "English text to show user" "additional variables to set when clicked" "Extra English text to show, but not as a link">>
-  */
-Macro.add('options', {
-	skipArgs : false,
-	tags	 : ['option', 'comment', 'optionlt', 'optionlte', 'optiongt', 'optiongte',
-				'optiondefault', 'optionif'],
-	handler : function() {
-		try {
-			let currentOption = this.payload[0].args[0];
-			let currentOptionIsNumber = typeof currentOption === "number";
-			let variable = null;
-			let title = this.payload[0].contents || '';
-			let passageName = this.payload[0].args[1] || passage();
-			let found = false;
-			let found_index = 0;
-			let comment = null;
-			let hasMultipleOptionsWithSameValue = false;
-			let description = "";
-			let hasCurrentOption = this.payload[0].args.full &&
-				this.payload[0].args.full !== '""' && this.payload[0].args.full !== "''";
-
-			// Check if we have a first argument - if we do, it should be a variable like $foo
-			if (hasCurrentOption) {
-				if (currentOption === undefined) {
-					currentOption = false;
-				}
-				if (this.payload[0].args.full.startsWith("State.temporary.")) {
-					variable = "_" + this.payload[0].args.full.split(' ', 1)[0].substring("State.temporary.".length);
-				} else if (this.payload[0].args.full.startsWith("State.variables.")) {
-					variable = "$" + this.payload[0].args.full.split(' ', 1)[0].substring("State.variables.".length);
-				} else {
-					// eslint-disable-next-line no-console
-					console.log(this.payload[0].args.full);
-					throw new Error("First parameter to 'options' must be a variable");
-				}
-
-				/* First print out the string for the current value */
-				for (let i = 1, len = this.payload.length; i < len; ++i) {
-					if (this.payload[i].name === 'option') {
-						if (this.payload[i].args[0] === currentOption) {
-							if (found) {
-								hasMultipleOptionsWithSameValue = true;
-							} else {
-								description = this.payload[i].contents;
-								found_index = i;
-								found = true;
-							}
-						}
-					} else if (this.payload[i].name === 'optionlt') {
-						if (!found && this.payload[i].args[0] > currentOption) {
-							description = this.payload[i].contents;
-							found = true;
-							found_index = i;
-						}
-					} else if (this.payload[i].name === 'optionlte') {
-						if (!found && this.payload[i].args[0] >= currentOption) {
-							description = this.payload[i].contents;
-							found = true;
-							found_index = i;
-						}
-					} else if (this.payload[i].name === 'optiongt') {
-						if (!found && this.payload[i].args[0] < currentOption) {
-							description = this.payload[i].contents;
-							found = true;
-							found_index = i;
-						}
-					} else if (this.payload[i].name === 'optiongte') {
-						if (!found && this.payload[i].args[0] <= currentOption) {
-							description = this.payload[i].contents;
-							found = true;
-							found_index = i;
-						}
-					} else if (this.payload[i].name === 'optiondefault') {
-						if (!found) {
-							description = this.payload[i].contents;
-							found = true;
-							found_index = i;
-						}
-					} else if (this.payload[i].name === 'comment') {
-					} else if (this.payload[i].name === 'optionif') {
-					} else {
-						throw new Error("Only valid tag is 'option' inside 'options'");
-					}
-				}
-			} else {
-				// No variable was passed to <<options>>
-				// This is valid, but then we only allow an empty <<option>> or <<comment>>
-				// inside
-				for (let i = 1, len = this.payload.length; i < len; ++i) {
-					if (this.payload[i].name === 'option' && this.payload[i].args.length === 0) {
-						// This is valid for an empty <<options>>
-					} else if (this.payload[i].name === "comment") {
-						// This is valid for an empty <<options>>
-					} else {
-						throw new Error("Missing variable to <<options>>");
-					}
-				}
-			}
-
-			let showSelectedOption = true; // this.payload.length !== 3 || !description;
-			/* Now print out the list of options */
-			let output = "";
-			let optionIfIsFalse = false;
-			for (let i = 1, len = this.payload.length; i < len; ++i) {
-				if (this.payload[i].name === "optionif") {
-					if (this.payload[i].args.length === 0) {
-						optionIfIsFalse = false; /* No options means to turn off optionif */
-					} else if (this.payload[i].args.length === 1) {
-						// Evaluate it and see if is false
-						if (typeof (this.payload[i].args[0]) !== 'boolean') {
-							throw new Error("optionif requires true or false for the first (and only) parameter");
-						}
-						optionIfIsFalse = !this.payload[i].args[0];
-					} else {
-						throw new Error("Only one argument expected to 'optionif'");
-					}
-					continue;
-				}
-				if (optionIfIsFalse) {
-					continue;
-				} else if (this.payload[i].name.startsWith('option')) {
-					let args = this.payload[i].args;
-					let hasComparitor = this.payload[i].name !== "option" && this.payload[i].name !== "optiondefault";
-					let argText = args[hasComparitor ? 2 : 1] || "";
-					if (args.length === 0) {
-						output += this.payload[i].contents.trim();
-					} else {
-						let extraComment = args[hasComparitor ? 4 : 3];
-						extraComment = extraComment ? ' ' + extraComment : '';
-						// We use a very crude heuristic for styling 'Enable'
-						// and 'Disable' buttons differently.
-						const isEnableOption = argText && (argText.startsWith("Enable") || argText === "Yes" || argText.startsWith("Allow"));
-						const isDisableOption = argText && (argText.startsWith("Disable") || argText === "No" || argText.startsWith("Deny"));
-						let className = "optionMacroOption ";
-						if (isEnableOption) {
-							className += "optionMacroEnable";
-						} else if (isDisableOption) {
-							className += "optionMacroDisable";
-						}
-						if (found_index !== i || hasMultipleOptionsWithSameValue) {
-							let onClickChange = args[hasComparitor ? 3 : 2];
-							onClickChange = onClickChange ? ', ' + onClickChange : '';
-							output += `<span class="${className}">[[${argText}${extraComment}|${passageName}][${variable}=${JSON.stringify(args[hasComparitor ? 1 : 0])}${onClickChange}]]</span>`;
-						} else if (showSelectedOption) {
-							output += `<span class="optionMacroSelected ${className}">${argText}${extraComment}</span>`;
-						}
-					}
-				} else if (this.payload[i].name === 'comment') {
-					comment = this.payload[i].contents;
-				}
-			}
-			jQuery(this.output).wiki(
-				'<span class="optionMacro ' + (currentOptionIsNumber ? 'optionMacroNumber' : '') + '">' +
-					'<span class="optionDescription">' + title + ' ' + description +
-						(comment ? '<span class="optionComment"><span class="detail"><br>' + comment + "</span></span>" : '') +
-					"</span>" +
-					'<span class="optionValue">' + output + "</span>" +
-				'</span>'
-				);
-		} catch (ex) {
-			return this.error('bad options expression: ' + ex.message);
-		}
-	}
-});
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index 967c6d1587eed64bae8b3024c483c67074d25cd0..2a87caf769ae3f6bae018ff770c4e2981cb33567 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -356,3 +356,15 @@ App.UI.DOM.generateLinksStrip = function(links) {
 	}, strip);
 	return strip;
 };
+
+/*
+	<<includeDOM element>>
+	Simply inserts a given DOM element.
+ */
+Macro.add("includeDOM", {
+	handler() {
+		// When given a function that expects a specific context (eg, called like "foo.bar()"), SC will screw it up and
+		// execute it in a different context. Putting the expanded argument through eval retains the context.
+		this.output.append(eval(this.args.full));
+	}
+});
diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw
index 8c9aca49dbc9c6ad9415b9335dbfcc7dccf430e2..0223876a610a6bd247c5c2f1e8eae1d8786470a7 100644
--- a/src/npc/startingGirls/startingGirls.tw
+++ b/src/npc/startingGirls/startingGirls.tw
@@ -384,1145 +384,667 @@
 <div id="Overview" class="tabcontent">
 	<div class="content">
 
-	<<options $activeSlave.devotion>>
-	''Devotion:''
-	<<optionlt -95 -100 "Utterly hateful">>
-		@@.darkviolet;Utterly hateful.@@
-	<<optionlt -50 -70 "Hateful">>
-		@@.darkviolet;Hateful.@@
-	<<optionlt -20 -35 "Resistant">>
-		@@.mediumorchid;Resistant.@@
-	<<optionlte 20 0 "Ambivalent">>
-		@@.yellow;Ambivalent.@@
-	<<optionlte 50 35 "Accepting">>
-		@@.hotpink;Accepting.@@
-	<<optionlte 95 70 "Devoted">>
-		@@.deeppink;Devoted.@@
-	<<optiondefault 100 "Worshipful">>
-		@@.magenta;Worshipful.@@
-	<<option>>
-		<<textbox2 "$activeSlave.devotion" $activeSlave.devotion "Starting Girls">>
-	<<comment>>
-		<<if $activeSlave.devotion > 20>>
-			<span class="red" style="font-style: italic">
-				Starting slaves incur
-				<<if $activeSlave.devotion > 50>>
-					a severe cost penalty at very high
-				<<else>>
-					an additional cost penalty at high
-				<</if>>
-				levels of devotion. This slave's
-				<<if $activeSlave.actualAge >= 25>>
-					<<if $activeSlave.actualAge > 35>>advanced	<</if>>
-					age decreases the penalty.
-				<<else>>
-					young age requires paying the full penalty.
-				<</if>>
-			</span>
+	<<set _options = new App.UI.OptionsGroup()>>
+	
+	<<set _option = _options.addOption("Devotion", "devotion", $activeSlave).showTextBox()
+	.addRange(-100, -95, "<", "Utterly hateful")
+	.addRange(-70, -50, "<", "Hateful")
+	.addRange(-35, -20, "<", "Resistant")
+	.addRange(0, 20, "<", "Ambivalent")
+	.addRange(35, 50, "<", "Accepting")
+	.addRange(70, 95, "<", "Devoted")
+	.addRange(100, 95, ">=", "Worshipful")>>
+	<<if $activeSlave.devotion > 20>>
+		<<set _comment = "Starting slaves incur">>
+		<<if $activeSlave.devotion > 50>>
+			<<run _comment += " severe cost penalty at very high">>
+		<<else>>
+			<<run _comment += " an additional cost penalty at high">>
 		<</if>>
-	<</options>>
-
-	<<options $activeSlave.trust>>
-		''Trust:''
-		<<optionlt -95 -100 "Abjectly terrified">>
-			@@.goldenrod;Abjectly terrified.@@
-		<<optionlt -50 -70 "Terrified">>
-			@@.goldenrod;Terrified.@@
-		<<optionlt -20 -35 "Frightened">>
-			@@.gold;Frightened.@@
-		<<optionlte 20 0 "Fearful">>
-			@@.yellow;Fearful.@@
-		<<optionlte 50 35 "Careful">>
-			@@.mediumaquamarine;Careful.@@
-		<<optionlte 95 70 "Trusting">>
-			@@.mediumseagreen;Trusting.@@
-		<<optiondefault 100 "Absolute trust">>
-			@@.seagreen;Absolute trust.@@
-		<<option>>
-			<<textbox2 "$activeSlave.trust" $activeSlave.trust "Starting Girls">>
-	<</options>>
-
-	<<if $activeSlave.indenture == -1>>
-		<<options $activeSlave.indenture>>
-			''Legal status:''
-			<<option -1 "Slave" "$activeSlave.indentureRestrictions = 0">>
-				Slave.
-			<<optiondefault 52 "Indentured Servant" "$activeSlave.indentureRestrictions = 0">>
-		<</options>>
-	<<else>>
-		<<options $activeSlave.indenture>>
-			''Legal status:'' Indentured servant
-			<<option -1 "Slave" "$activeSlave.indentureRestrictions = 0">>
-			<<optiondefault 52 "Indentured Servant" "$activeSlave.indentureRestrictions = 0">>
-			<<option>>
-				&nbsp;with <<textbox2 "$activeSlave.indenture" $activeSlave.indenture "Starting Girls">> weeks remaining.
-		<</options>>
-
-		<<options $activeSlave.indentureRestrictions>>
-			''Indenture restrictions:''
-			<<option 0 "None">>
-				None.
-			<<option 1 "Protective">>
-				Protective.
-			<<option 2 "Restrictive">>
-				Restrictive.
-		<</options>>
+		<<run _comment += " levels of devotion. This slave's">>
+		<<if $activeSlave.actualAge >= 25>>
+			<<if $activeSlave.actualAge > 35>>advanced	<</if>>
+			<<run _comment += " age decreases the penalty.">>
+		<<else>>
+			<<run _comment += " young age requires paying the full penalty.">>
+		<</if>>
+		<<run _option.addComment(`<span class=warning>${_comment}</span>`)>>
 	<</if>>
 
-	<<options $activeSlave.actualAge>>
-		''Age:''
-		<<option>>
-			<<textbox2 "$activeSlave.actualAge" $activeSlave.actualAge "Starting Girls" "SlaveDatatypeCleanup($activeSlave)">>
-		<<option>>&nbsp;&nbsp;
-			[[Resync characteristics to age|Starting Girls][resyncSlaveToAge($activeSlave)]]	 &nbsp;|&nbsp;
-			[[Resync only height to age|Starting Girls][$activeSlave.height = Height.random($activeSlave)]]
-		<<comment>>
-			(It is recommended to resync if you change age significantly)
-	<</options>>
-
-	<<options $activeSlave.birthWeek>>
-		''Birth week:''
-		<<option>>
-			<<textbox2 "$activeSlave.birthWeek" $activeSlave.birthWeek "Starting Girls">>
-	<</options>>
-
-	<<options $activeSlave.genes>>
-		''Genes:''
-		<<option "XX" "XX" "$activeSlave.dick = 0, $activeSlave.balls = 0, $activeSlave.clit = 0, $activeSlave.pubertyXY = 0, $activeSlave.pubertyAgeXY = $potencyAge, $activeSlave.pubertyXX = ($activeSlave.pubertyAgeXX < $activeSlave.actualAge ? 1 : 0), $activeSlave.vagina = Math.max(0, $activeSlave.vagina), $activeSlave.boobs = Math.max(500, $activeSlave.boobs), $activeSlave.balls = 0, $activeSlave.scrotum = 0, $activeSlave.prostate = 0, $activeSlave.shoulders = either(-2,-1,0), $activeSlave.hips = either(-2,-1,0)">>
-			@@.yellow;XX@@ (Female)
-		<<option "XY" "XY" "$activeSlave.dick = 3, $activeSlave.vagina = -1, WombFlush($activeSlave), $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.pubertyXY = ($activeSlave.pubertyAgeXY < $activeSlave.actualAge ? 1 : 0), $activeSlave.pubertyXX = 0, $activeSlave.pubertyAgeXX = $fertilityAge, $activeSlave.ovaries = 0, $activeSlave.boobs = 0, $activeSlave.balls = 3, $activeSlave.scrotum = 3, $activeSlave.prostate = 1, $activeSlave.shoulders = either(0,1,2), $activeSlave.hips = either(0,1,2)">>
-			@@.yellow;XY@@ (Male)
-	<</options>>
-
-	<<options $activeSlave.health.condition>>
-		''Condition:''
-		<<optionlt -20 -40 "Unhealthy">>
-			@@.red;Unhealthy.@@
-		<<optionlt 20 0 "Healthy">>
-			@@.yellow;Healthy.@@
-		<<optionlt 60 40 "Very healthy">>
-			@@.green;Very healthy.@@
-		<<optiondefault 80 "Extremely healthy">>
-			@@.green;Extremely healthy.@@
-	<</options>>
-
-	<<options $activeSlave.prestige>>
-		''Prestige:''
-		<<option 0 "None">>
-			None.
-		<<option 1 "Locally known">>
-			@@.green;Locally known.@@
-		<<option 2 "Regionally famous">>
-			@@.green;Regionally famous.@@
-		<<option 3 "World renowned">>
-			@@.green;World renowned.@@
-		<<comment>>
-			<<if $activeSlave.prestige>>
-				<span class="red" style="font-style: italic">
-					Starting slaves incur an extreme cost penalty for prestige. This slave's
-					<<if $activeSlave.actualAge >= 25>>
-						<<if $activeSlave.actualAge > 35>>advanced	<</if>>
-						age decreases the penalty.
-					<<else>>
-						young age requires paying the full penalty.
-					<</if>>
-				</span>
+	<<run _options.addOption("Trust", "trust", $activeSlave).showTextBox()
+	.addRange(-100, -95, "<", "Abjectly terrified")
+	.addRange(-70, -50, "<", "Terrified")
+	.addRange(-35, -20, "<", "Frightened")
+	.addRange(0, 20, "<", "Fearful")
+	.addRange(35, 50, "<", "Careful")
+	.addRange(70, 95, "<", "Trusting")
+	.addRange(100, 95, ">=", "Absolute trust")>>
+
+	<<run _options.addOption("Legal status", "indenture", $activeSlave)
+	.addValue("Slave", -1, () => V.activeSlave.indentureRestrictions = 0)
+	.addRange(52, 0, ">=", "Indentured Servant")>>
+	<<if $activeSlave.indenture > -1>>
+		<<run _options.addOption("Remaining weeeks", "indenture", $activeSlave).showTextBox()>>
+		
+		<<run _options.addOption("Indenture restrictions", "indentureRestrictions", $activeSlave)
+		.addValueList([["None", 0], ["Protective", 1], ["Restrictive", 2]])>>
+	<</if>>
+
+	<<run _options.addOption("Age", "actualAge", $activeSlave).showTextBox()
+	.customButton("Resync characteristics to age", () => resyncSlaveToAge(V.activeSlave))
+	.customButton("Resync only height to age", () => V.activeSlave.height = Height.random(V.activeSlave))
+	.addComment("It is recommended to resync if you change age significantly")>>
+
+	<<run _options.addOption("Birth week", "birthWeek", $activeSlave).showTextBox()>>
+
+	<<run _options.addOption("Genes", "genes", $activeSlave)
+	.addValue("XX (Female)", "XX", () => {
+		V.activeSlave.dick = 0;
+		V.activeSlave.balls = 0;
+		V.activeSlave.clit = 0;
+		V.activeSlave.pubertyXY = 0;
+		V.activeSlave.pubertyAgeXY = V.potencyAge;
+		V.activeSlave.pubertyXX = (V.activeSlave.pubertyAgeXX < V.activeSlave.actualAge ? 1 : 0);
+		V.activeSlave.vagina = Math.max(0, V.activeSlave.vagina);
+		V.activeSlave.boobs = Math.max(500, V.activeSlave.boobs);
+		V.activeSlave.balls = 0;
+		V.activeSlave.scrotum = 0;
+		V.activeSlave.prostate = 0;
+		V.activeSlave.shoulders = either(-2,-1,0);
+		V.activeSlave.hips = either(-2,-1,0);
+	}).addValue("XY (Male)", "XY", () => {
+		V.activeSlave.dick = 3;
+		V.activeSlave.vagina = -1;
+		WombFlush(V.activeSlave);
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.pubertyXY = (V.activeSlave.pubertyAgeXY < V.activeSlave.actualAge ? 1 : 0);
+		V.activeSlave.pubertyXX = 0;
+		V.activeSlave.pubertyAgeXX = V.fertilityAge;
+		V.activeSlave.ovaries = 0;
+		V.activeSlave.boobs = 0;
+		V.activeSlave.balls = 3;
+		V.activeSlave.scrotum = 3;
+		V.activeSlave.prostate = 1;
+		V.activeSlave.shoulders = either(0,1,2);
+		V.activeSlave.hips = either(0,1,2);
+	})>>
+
+	<<run _options.addOption("Condition", "condition", $activeSlave.health)
+	.addValueList([["Unhealthy", -40], ["Healthy", 0], ["Very healthy", 40], ["Extremely healthy", 80]])>>
+
+	<<set _option = _options.addOption("Prestige", "prestige", $activeSlave)
+	.addValueList([["None", 0], ["Locally known", 1], ["Regionally famous", 2], ["World renowned", 3]])>>
+	<<if $activeSlave.prestige > 0>>
+		<<set _comment = "Starting slaves incur an extreme cost penalty for prestige. This slave's">>
+		<<if $activeSlave.actualAge >= 25>>
+			<<if $activeSlave.actualAge > 35>>
+				<<set _comment += " advanced">>
 			<</if>>
-	<</options>>
+			<<set _comment += " age decreases the penalty.">>
+		<<else>>
+			<<set _comment += " young age requires paying the full penalty.">>
+		<</if>>
+		<<run _option.addComment(`<span class=warning>${_comment}</span>`)>>
+	<</if>>
+	
+	<<run _options.addOption("$His nationality is", "nationality", $activeSlave).showTextBox()>>
 
-	<<options>>
-		$His nationality is $activeSlave.nationality.
-		<<option>>
-			<<textbox2 "$activeSlave.nationality" $activeSlave.nationality "Starting Girls">>
-	<</options>>
 	<<if $seeRace == 1>>
-		<<options $activeSlave.race>>
-			''Ethnicity:'' $activeSlave.race
-			<<option "white"             "White">>
-			<<option "black"             "Black">>
-			<<option "latina"            "Latina">>
-			<<option "asian"             "Asian">>
-			<<option "middle eastern"    "Middle Eastern">>
-			<<option "amerindian"        "Amerindian">>
-			<<option "southern european" "Southern European">>
-			<<option "semitic"           "Semitic">>
-			<<option "malay"             "Malay">>
-			<<option "indo-aryan"        "Indo-Aryan">>
-			<<option "pacific islander"  "Pacific Islander">>
-			<<option "mixed race"        "Mixed Race">>
-			<<option>>
-				<<textbox2 "$activeSlave.race" $activeSlave.race "Starting Girls">>
-		<</options>>
+		<<run _options.addOption("$His ethnicity is", "nationality", $activeSlave).showTextBox()
+		.addValueList([["White", "white"], ["Asian", "asian"], ["Latina", "latina"], ["Middle Eastern", "middle eastern"],
+			["Black", "black"], ["Semetic", "semetic"], ["Southern European", "southern european"], ["Indo-Aryan", "indo-aryan"],
+			["Amerindian", "amerindian"], ["Pacific Islander", "pacific islander"], ["Malay", "malay"], ["Mixed Race", "mixed race"]])>>
 	<</if>>
 
-	<<options $activeSlave.origSkin>>
-		''Skin color:'' $activeSlave.origSkin
-		<<option "pure white"  "Pure White">>
-		<<option "ivory"   "Ivory">>
-		<<option "white"   "White">>
-		<<option "extremely pale" "Extremely Pale">>
-		<<option "very pale"  "Very Pale">>
-		<<option "pale"    "Pale">>
-		<<option "extremely fair" "Extremely Fair">>
-		<<option "very fair"  "Very Fair">>
-		<<option "fair"    "Fair">>
-		<<option "light"   "Light">>
-		<<option "light olive"  "Light Olive">>
-		<<option "tan"    "Tan">>
-		<<option "olive"   "Olive">>
-		<<option "bronze"   "Bronze">>
-		<<option "dark olive"  "Dark Olive">>
-		<<option "dark"    "Dark">>
-		<<option "light beige"  "Light Beige">>
-		<<option "beige"   "Beige" >>
-		<<option "dark beige"  "Dark Beige">>
-		<<option "light brown"  "Light Brown">>
-		<<option "brown"   "Brown">>
-		<<option "dark brown"  "Dark Brown">>
-		<<option "black"   "Black">>
-		<<option "ebony"   "Ebony">>
-		<<option "pure black"  "Pure Black">>
-		<<option>>
-			<<textbox2 "$activeSlave.origSkin" $activeSlave.origSkin "Starting Girls">>
-	<</options>>
-
-	<<options $activeSlave.intelligence>>
-		''Intelligence:''
-		<<optionlt -95 -100 "Moronic">>@@.orangered;Moronic.@@
-		<<optionlt -50 -60  "Very stupid">>@@.orangered;Very stupid.@@
-		<<optionlt -15 -30  "Stupid">>@@.orangered;Stupid.@@
-		<<optionlt  15  0   "Average">>Average.
-		<<optionlte 50  30  "Smart">>@@.deepskyblue;Smart.@@
-		<<optionlte 95  60  "Very smart">>@@.deepskyblue;Very smart.@@
-		<<optiondefault 100 "Brilliant">>@@.deepskyblue;Brilliant.@@
-	<</options>>
-
-	<<options $activeSlave.intelligenceImplant>>
-		''Education:''
-		<<optionlt 15 0 "Uneducated">> Uneducated.
-		<<optionlt 30 15 "Educated">> @@.deepskyblue;Educated.@@
-		<<optiondefault 30 "Well educated">> @@.deepskyblue;Well educated.@@
-	<</options>>
+	<<run _options.addOption("$His skin color is", "origSkin", $activeSlave).showTextBox()
+	.addValueList([["Pure White", "pure white"], ["Ivory", "ivory"], ["White", "white"], ["Extremely Pale", "extremely pale"],
+			["Very Pale", "very pale"], ["Pale", "pale"], ["Extremely Fair", "extremely fair"], ["Very Fair", "very fair"],
+			["Fair", "fair"], ["Light", "light"], ["Light Olive", "light olive"], ["Tan", "tan"], ["Olive", "olive"], ["Bronze", "bronze"],
+			["Dark Olive", "dark olive"], ["Dark", "dark"], ["Light Beige", "light beige"], ["Beige", "beige"],
+			["Dark Beige", "dark beige"], ["Light Brown", "light brown"], ["Brown", "brown"], ["Dark Brown", "dark brown"],
+			["Black", "black"], ["Ebony", "ebony"], ["Pure Black", "pure black"]])>>
+
+	<<run _options.addOption("Intelligence", "intelligence", $activeSlave)
+	.addValueList([["Moronic", -100], ["Very stupid", -60], ["Stupid", -30], ["Average", 0], ["Smart", 30], ["Very smart", 60], ["Brilliant", 100]])>>
+
+	<<run _options.addOption("Education", "intelligenceImplant", $activeSlave)
+	.addValueList([["Uneducated", 0], ["Educated", 15], ["Well educated", 30]])>>
 
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
 <div id="Physical" class="tabcontent">
 	<div class="content">
 
-	<<options $activeSlave.height>>
-		''Height:'' <<= heightToEitherUnit($activeSlave.height)>>
-		<<optionlt 150 145 "Petite">>
-			Petite.
-		<<optionlt 160 155 "Short">>
-			Short.
-		<<optionlt 170 165 "Average">>
-			Average.
-		<<optionlt 185 180 "Tall">>
-			Tall.
-		<<optiondefault 190 "Very tall">>
-			Very tall.
-		<<option>>
-			<<textbox2 "$activeSlave.height" $activeSlave.height "Starting Girls">>cm
-		<<comment>>
-			<<link `"Average height for a " + $activeSlave.actualAge + " year old is " + Math.round(Height.mean($activeSlave)) + "cm. Apply."`>>
-				<<= resyncSlaveHight($activeSlave)>> <<goto "Starting Girls">>
-			<</link>>
-			<<if $cheatMode == 1>>	 &nbsp;|&nbsp;	[[Make dwarf|Starting Girls][$activeSlave.height = Height.random($activeSlave, {limitMult:	[-4, -1], spread: 0.15})]]	<</if>>
-			<<if $cheatMode == 1>>	 &nbsp;|&nbsp;	[[Make giant|Starting Girls][$activeSlave.height = Height.random($activeSlave, {limitMult:	[3, 10], spread: 0.15})]]	<</if>>
-	<</options>>
-
-	<<options $activeSlave.weight>>
-		''Weight:''
-		<<optionlt -95 -100 "Emaciated">>
-			@@.red;Emaciated.@@
-		<<optionlt -30 -50 "Skinny">>
-			@@.red;Skinny.@@
-		<<optionlt -10 -20 "Thin">>
-			Thin.
-		<<optionlte 10 0 "Average">>
-			Average.
-		<<optionlte 30 20 "Plush">>
-			Plush.
-		<<optionlte 95 50 "Chubby">>
-			@@.red;Chubby.@@
-		<<optionlte 130 100 "Fat">>
-			@@.red;Fat.@@
-		<<optionlte 160 140 "Obese">>
-			@@.red;Obese.@@
-		<<optionlte 190 180 "Super obese">>
-			@@.red;Super obese.@@
-		<<optiondefault 200 "Dangerously obese">>
-			@@.red;Dangerously obese.@@
-	<</options>>
-
-	<<options $activeSlave.muscles>>
-		''Muscles:''
-		<<optionlt -96 -100 "Frail">>
-			Frail.
-		<<optionlt -51 -66 "Very weak">>
-			Very weak.
-		<<optionlt -6 -41 "Weak">>
-			Weak.
-		<<optionlt 5 0 "Normal">>
-			Normal.
-		<<optionlt 30 20 "Toned">>
-			Toned.
-		<<optionlt 50 40 "Well built">>
-			Well built.
-		<<optionlt 95 65 "Quite muscular">>
-			Quite muscular.
-		<<optiondefault 100 "Ripped">>
-			Ripped.
-	<</options>>
-
-	<<options $activeSlave.waist>>
-		''Waist:''
-		<<optionlt -95 -100 "Absurd">>
-			Absurd.
-		<<optionlt -40 -55 "Hourglass">>
-			Hourglass.
-		<<optionlt -15 -25 "Feminine">>
-			Feminine.
-		<<optionlte 10 0 "Average">>
-			Average.
-		<<optionlte 40 15 "Unattractive">>
-			Unattractive.
-		<<optionlte 95 55 "Ugly">>
-			Ugly.
-		<<optiondefault 100 "Masculine">>
-			Masculine.
-	<</options>>
-
-	<<if $seeDicks != 0>>
-		<<options $activeSlave.faceShape>>
-			''Facial appearance:'' $activeSlave.faceShape
-			<<option "normal" "Normal">>
-			<<option "masculine" "Masculine">>
-			<<option "androgynous" "Androgynous">>
-			<<option "cute" "Cute">>
-			<<option "sensual" "Sensual">>
-			<<option "exotic" "Exotic">>
-		<</options>>
-	<<else>>
-		<<options $activeSlave.faceShape>>
-			''Facial appearance:'' $activeSlave.faceShape
-			<<option "normal" "Normal">>
-			<<option "androgynous" "Androgynous">>
-			<<option "cute" "Cute">>
-			<<option "sensual" "Sensual">>
-			<<option "exotic" "Exotic">>
-		<</options>>
+	<<set _options = new App.UI.OptionsGroup()>>
+
+	<<run _options.addOption("Height: <<= heightToEitherUnit($activeSlave.height)>>", "height", $activeSlave).showTextBox("cm")
+	.addRange(145, 150, "<", "Petite")
+	.addRange(155, 160, "<", "Short")
+	.addRange(165, 170, "<", "Average")
+	.addRange(180, 185, "<", "Tall")
+	.addRange(190, 185, ">=", "Very tall")>>
+	<<set _option = _options.addOption(`Average height for a ${$activeSlave.actualAge} year old """is ${heightToEitherUnit(Math.round(Height.mean(V.activeSlave)))}"""`)
+	.customButton("Make average", () => resyncSlaveHight($activeSlave))>>
+	<<if $cheatMode === 1>>
+		<<run _option.customButton("Make dwarf", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult:	[-4, -1], spread: 0.15}))
+		.customButton("Make giant", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult:	[3, 10], spread: 0.15}))>>
 	<</if>>
 
-	<<options $activeSlave.face>>
-		''Facial attractiveness:''
-	<<optionlt -95 -100 "Very ugly">> Very ugly.
-	<<optionlt -40 -55 "Ugly">> Ugly.
-	<<optionlt -10 -15 "Unattractive">> Unattractive.
-	<<optionlte 10 0 "Average">> Average.
-	<<optionlte 40 15 "Attractive">> Attractive.
-	<<optionlte 95 55 "Beautiful">> Beautiful.
-	<<optiondefault 100 "Very beautiful">> Very beautiful.
-	<</options>>
-
+	<<run _options.addOption("Weight", "weight", $activeSlave)
+	.addRange(-100, -95, "<", "Emaciated")
+	.addRange(-50, -30, "<", "Skinny")
+	.addRange(-20, -10, "<", "Thin")
+	.addRange(0, 10, "<", "Average")
+	.addRange(20, 30, "<", "Plush")
+	.addRange(50, 95, "<", "Chubby")
+	.addRange(100, 130, "<", "Fat")
+	.addRange(140, 160, "<", "Obese")
+	.addRange(180, 190, "<", "Super obese")
+	.addRange(200, 190, ">=", "Dangerously obese")>>
+
+	<<run _options.addOption("Muscles", "muscles", $activeSlave)
+	.addRange(-100, -96, "<", "Frail")
+	.addRange(-66, -51, "<", "Very weak")
+	.addRange(-41, -6, "<", "Weak")
+	.addRange(0, 5, "<", "Normal")
+	.addRange(20, 30, "<", "Toned")
+	.addRange(40, 50, "<", "Well built")
+	.addRange(65, 95, "<", "Quite muscular")
+	.addRange(100, 95, ">=", "Ripped")>>
+
+	<<run _options.addOption("Waist", "waist", $activeSlave)
+	.addRange(-100, -95, "<", "	Absurd")
+	.addRange(-55, -40, "<", "Hourglass")
+	.addRange(-25, -15, "<", "Feminine")
+	.addRange(0, 10, "<", "Average")
+	.addRange(15, 40, "<", "Unattractive")
+	.addRange(55, 95, "<", "Ugly")
+	.addRange(100, 10, ">=", "Masculine")>>
+
+	<<set _option = _options.addOption("Facial appearance", "faceShape", $activeSlave)
+	.addValue("Normal", "normal")>>
+	<<if $seeDicks !== 0>>
+		<<run _option.addValue("Masculine", "masculine")>>
+	<</if>>
+	<<run _option.addValueList([["Androgynous", "androgynous"], ["Cute", "cute"], ["Sensual", "sensual"], ["Exotic", "exotic"]])>>
+
+	<<run _options.addOption("Facial attractiveness", "face", $activeSlave)
+	.addRange(-100, -95, "<", "Very ugly")
+	.addRange(-55, -40, "<", "Ugly")
+	.addRange(-15, -10, "<", "Unattractive")
+	.addRange(0, 10, "<", "Average")
+	.addRange(15, 40, "<", "Attractive")
+	.addRange(55, 95, "<", "Beautiful")
+	.addRange(100, 95, ">=", "Very beautiful")>>
+
+	<<set _option = _options.addOption("Lips", "lips", $activeSlave)
+	.addRange(5, 10, "<", "Thin")
+	.addRange(15, 20, "<", "Normal")
+	.addRange(25, 40, "<", "Pretty")
+	.addRange(55, 70, "<", "Plush")>>
 	<<if $seeExtreme == 1>>
-		<<options $activeSlave.lips>>
-			''Lips:''
-			<<optionlte 10 5 "Thin">> Thin.
-			<<optionlte 20 15 "Normal">> Normal.
-			<<optionlte 40 25 "Pretty">> Pretty.
-			<<optionlte 70 55 "Plush">> Plush.
-			<<optionlte 95 85 "Huge">> Huge.
-			<<optiondefault 100 "Facepussy">> Facepussy.
-		<</options>>
+		<<run _option.addRange(85, 95, "<", "Huge")
+			.addRange(100, 95, ">=", "Facepussy")>>
 	<<else>>
-		<<options $activeSlave.lips>>
-			''Lips:''
-			<<optionlte 10 5 "Thin">> Thin.
-			<<optionlte 20 15 "Normal">> Normal.
-			<<optionlte 40 25 "Pretty">> Pretty.
-			<<optionlte 70 55 "Plush">> Plush.
-			<<optionlte 95 85 "Huge">> Huge.
-		<</options>>
+		<<run _option.addRange(85, 70, ">=", "Huge")>>
 	<</if>>
 
-	<<options $activeSlave.voice>>
-		''Voice:''
-		<<option 0 "Mute">>
-			Mute.
-		<<option 1 "Deep">>
-			Deep.
-		<<option 2 "Normal">>
-			Normal.
-		<<option 3 "High">>
-			High.
-	<</options>>
-
-	<<if $activeSlave.voice != 0>>
-		<<options $activeSlave.accent>>
-			''$language:''
-			<<option 0 "Unaccented">>
-				Unaccented.
-			<<option 1 `"Pretty " + aNational($activeSlave.nationality) + " accent"`>>
-				Pretty <<print aNational($activeSlave.nationality)>> accent.
-			<<option 2 `"Thick " + aNational($activeSlave.nationality) + " accent"`>>
-				Thick <<print aNational($activeSlave.nationality)>> accent.
-			<<optiondefault 3 "Not fluent">>
-				Not fluent.
-		<</options>>
+	<<run _options.addOption("Voice", "voice", $activeSlave)
+	.addValueList([["Mute", 0], ["Deep", 1], ["Normal", 2], ["High", 3]])>>
+
+	<<if $activeSlave.voice !== 0>>
+		<<run _options.addOption("$language", "accent", $activeSlave)
+		.addValueList([["Unaccented", 0], [`Pretty ${aNational($activeSlave.nationality)} accent`, 1],
+		[`Thick ${aNational($activeSlave.nationality)} accent`, 2], ["Not fluent", 3]])>>
 	<</if>>
 
+	<<set _option = _options.addOption("Teeth", "teeth", $activeSlave)
+	.addValueList([["Croooked", "crooked"], ["Gapped", "gapped"], ["Braces", "straightening braces"]])>>
 	<<if $activeSlave.physicalAge >= 12>>
 		<<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "mixed">>
 			<<set $activeSlave.teeth = "normal">>
 		<</if>>
-		<<options $activeSlave.teeth>>
-			''Teeth:'' $activeSlave.teeth
-			<<option "crooked" "Crooked">>
-			<<option "gapped" "Gapped">>
-			<<option "straightening braces" "Braces">>
-			<<optiondefault "normal" "Straight">>
-		<</options>>
+		<<run _option.addValue("Straight", "normal")>>
 	<<elseif $activeSlave.physicalAge >= 6>>
 		<<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">>
 			<<set $activeSlave.teeth = "mixed">>
 		<</if>>
-		<<options $activeSlave.teeth>>
-			''Teeth:'' $activeSlave.teeth
-			<<option "crooked" "Crooked">>
-			<<option "gapped" "Gapped">>
-			<<option "straightening braces" "Braces">>
-			<<option "mixed" "Mixed adult & child">>
-		<</options>>
+		<<run _option.addValue("Mixed adult & child", "mixed")>>
 	<<else>>
 		<<if $activeSlave.teeth == "mixed" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">>
 			<<set $activeSlave.teeth = "mixed">>
 		<</if>>
-		<<options $activeSlave.teeth>>
-			''Teeth:'' $activeSlave.teeth
-			<<option "crooked" "Crooked">>
-			<<option "gapped" "Gapped">>
-			<<option "straightening braces" "Braces">>
-			<<option "baby" "Baby">>
-		<</options>>
+		<<run _option.addValue("Baby", "baby")>>
 	<</if>>
 
-	<<options $activeSlave.boobs>>
-		''Breasts:''
-		<<optionlte 200 200 "Flat">> Flat (AA-cup).
-		<<optionlte 300 300 "Small">> Small (A-cup).
-		<<optionlte 400 400 "Medium">> Medium (B-cup).
-		<<optionlte 500 500 "Healthy">> Healthy (C-cup).
-		<<optionlte 800 800 "Large">> Large (DD-cup).
-		<<optionlte 1200 1200 "Very Large">> Very Large (G-cup).
-		<<optionlte 2050 2050 "Huge">> Huge (K-cup).
-		<<optionlte 3950 3950 "Massive">> Massive (Q-cup).
-		<<optionlte 6000 6000 "Monstrous">> Monstrous.
-		<<optiondefault 8000 "Science experiment">> Science Experiment.
-		<<option>>
-			<<textbox2 "$activeSlave.boobs" $activeSlave.boobs "Starting Girls">> CCs
-	<</options>>
-
-	<<options $activeSlave.lactation>>
-		''Lactation:''
-		<<option 2 "Artificial" "$activeSlave.lactationDuration = 2">> Artificial.
-		<<option 1 "Natural" "$activeSlave.lactationDuration = 2">> Natural.
-		<<option 0 "None" "$activeSlave.lactationDuration = 0">> None.
-	<</options>>
-
-	<<options $activeSlave.nipples>>
-		''Nipples:'' $activeSlave.nipples
-		<<option "tiny"     "Tiny">>
-		<<option "cute"     "Cute">>
-		<<option "puffy"    "Puffy">>
-		<<option "inverted" "Inverted">>
-		<<option "huge"     "Huge">>
-	<</options>>
-
-	<<options $activeSlave.areolae>>
-		''Areolae:''
-		<<option 0 "Normal">> Normal.
-		<<option 1 "Large">> Large.
-		<<option 2 "Wide">> Wide.
-		<<option 3 "Huge">> Huge.
-		<<option 4 "Massive">> Massive.
-	<</options>>
-
-	<<options $activeSlave.shoulders>>
-		''Shoulders:''
-		<<option -2 "Very narrow">> Very narrow.
-		<<option -1 "Narrow">> Narrow.
-		<<option 0 "Feminine">> Feminine.
-		<<option 1 "Broad">> Broad.
-		<<option 2 "Very broad">> Very broad.
-	<</options>>
-
-	<<options $activeSlave.hips>>
-		''Hips:''
-		<<option -2 "Very narrow">> Very narrow.
-		<<option -1 "Narrow">> Narrow.
-		<<option 0 "Normal">> Normal.
-		<<option 1 "Broad">> Broad.
-		<<option 2 "Very broad">> Very broad.
-	<</options>>
-
-	<<options $activeSlave.butt>>
-		''Butt:''
-		<<option 0 "Flat">> Flat.
-		<<option 1 "Small">> Small.
-		<<option 2 "Plump">> Plump.
-		<<option 3 "Big">> Big.
-		<<option 4 "Huge">> Huge.
-		<<option 5 "Enormous">> Enormous.
-		<<option 6 "Gigantic">> Gigantic.
-		<<optiondefault 7 "Massive">> Massive.
-	<</options>>
-
-	<<options $activeSlave.anus>>
-		''Anus:''
-		<<option 0 "Virgin">> @@.lime;Virgin.@@
-		<<option 1 "Normal">> Normal.
-		<<option 2 "Veteran">> Veteran.
-		<<optiondefault 3 "Gaping">> Gaping.
-	<</options>>
-
-	<<options $activeSlave.vagina>>
-		''Vagina:''
-		<<option -1 "No vagina" "$activeSlave.preg = 0, WombFlush($activeSlave), $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.pubertyXX = 0,$activeSlave.pubertyAgeXX = $fertilityAge, $activeSlave.ovaries = 0">> //No vagina//.
-		<<option 0 "Virgin" "$activeSlave.preg = -1, $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.ovaries = 1">> @@.lime;Virgin.@@
-		<<option 1 "Normal" "$activeSlave.preg = -1, $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.ovaries = 1">> Normal.
-		<<option 2 "Veteran" "$activeSlave.preg = -1, $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.ovaries = 1">> Veteran.
-		<<optiondefault 3 "Gaping" "$activeSlave.preg = -1, $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, $activeSlave.ovaries = 1">> Gaping.
-	<</options>>
-
+	<<run _options.addOption("Breasts", "boobs", $activeSlave).showTextBox("CCs")
+	.addRange(200, 200, "<=", "Flat (AA-cup)")
+	.addRange(300, 300, "<=", "Small (A-cup)")
+	.addRange(400, 400, "<=", "Medium (B-cup)")
+	.addRange(500, 500, "<=", "Healthy (C-cup)")
+	.addRange(800, 800, "<=", "Large (DD-cup)")
+	.addRange(1200, 1200, "<=", "Very Large (G-cup)")
+	.addRange(2050, 2050, "<=", "Huge (K-cup)")
+	.addRange(3950, 3950, "<=", "Massive (Q-cup)")
+	.addRange(6000, 6000, "<=", "Monstrous")
+	.addRange(8000, 6000, ">", "Science Experiment")>>
+
+	<<run _options.addOption("Lactation", "lactation", $activeSlave)
+	.addValue("Artificial", 2, () => V.activeSlave.lactationDuration = 2)
+	.addValue("Natural", 1, () => V.activeSlave.lactationDuration = 2)
+	.addValue("None", 0)>>
+
+	<<run _options.addOption("Nipples", "nipples", $activeSlave)
+	.addValueList([["Tiny", "tiny"], ["Cute", "cute"], ["Puffy", "puffy"], ["Inverted", "inverted"], ["Huge", "huge"]])>>
+
+	<<run _options.addOption("Areolae", "areolae", $activeSlave)
+	.addValueList([["Normal", 0], ["Large", 1], ["Wide", 2], ["Huge", 3], ["Massive", 4]])>>
+
+	<<run _options.addOption("Shoulders", "shoulders", $activeSlave)
+	.addValueList([["Very narrow", -2], ["Narrow", -1], ["Feminine", 0], ["Broad", 1], ["Very broad", 2]])>>
+
+	<<run _options.addOption("Hips", "hips", $activeSlave)
+	.addValueList([["Very narrow", -2], ["Narrow", -1], ["Normal", 0], ["Broad", 1], ["Very broad", 2]])>>
+
+	<<run _options.addOption("Butt", "butt", $activeSlave)
+	.addValueList([["Flat", 0], ["Small", 1], ["Plumb", 2], ["Big", 3], ["Huge", 4], ["Enormous", 5], ["Gigantic", 6], ["Massive", 7]])>>
+
+	<<run _options.addOption("Anus", "anus", $activeSlave)
+	.addValueList([["Virgin", 0], ["Normal", 1], ["Veteran", 2], ["Gaping", 3]])>>
+
+	<<run _options.addOption("Vagina", "vagina", $activeSlave)
+	.addValue("No vagina", -1, () => {
+		V.activeSlave.preg = 0;
+		WombFlush(V.activeSlave);
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.pubertyXX = 0;
+		V.activeSlave.pubertyAgeXX = V.fertilityAge;
+		V.activeSlave.ovaries = 0;
+	}).addValue("Virgin", 0, () => {
+		V.activeSlave.preg = -1;
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.ovaries = 1
+	}).addValue("Normal", 1, () => {
+		V.activeSlave.preg = -1;
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.ovaries = 1
+	}).addValue("Veteran", 2, () => {
+		V.activeSlave.preg = -1;
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.ovaries = 1
+	}).addValue("Gaping", 3, () => {
+		V.activeSlave.preg = -1;
+		V.activeSlave.belly = 0;
+		V.activeSlave.bellyPreg = 0;
+		V.activeSlave.ovaries = 1
+	})>>
+	
 	<<if $activeSlave.vagina > -1>>
-		<<if $activeSlave.dick == 0>>
-			<<options $activeSlave.clit>>
-				''Clit:''
-				<<option 0 "Normal">> Normal.
-				<<option 1 "Large">> Large.
-				<<optiondefault 2 "Huge">> Huge.
-			<</options>>
+		<<if $activeSlave.dick === 0>>
+			<<run _options.addOption("Clit", "clit", $activeSlave)
+			.addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]])>>
 		<</if>>
-		<<options $activeSlave.labia>>
-			''Labia:''
-			<<option 0 "Normal">> Normal.
-			<<option 1 "Large">> Large.
-			<<optiondefault 2 "Huge">> Huge.
-		<</options>>
-		<<options $activeSlave.vaginaLube>>
-			''Vaginal wetness:''
-			<<option 0 "Dry">> Dry.
-			<<option 1 "Normal">> Normal.
-			<<optiondefault 2 "Excessive">> Excessive.
-		<</options>>
-
-		<<if $seePreg != 0>>
+
+		<<run _options.addOption("Labia", "labia", $activeSlave)
+		.addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]])>>
+
+		<<run _options.addOption("Vaginal wetness", "vaginaLube", $activeSlave)
+		.addValueList([["Dry", 0], ["Normal", 1], ["Excessive", 2]])>>
+
+		<<if $seePreg !== 0>>
 			/* This is only shown if slave has vagina */
-			<<options $activeSlave.pubertyXX>>
-				''Puberty:''
-				<<option 0 "Prepubescent" "$activeSlave.pubertyAgeXX = $fertilityAge, $activeSlave.belly = 0, $activeSlave.bellyPreg = 0, WombFlush($activeSlave)">> Prepubescent.
-				<<option 1 "Postpubescent">> Postpubescent.
-			<</options>>
-
-			<<options $activeSlave.pubertyAgeXX>>
-				''Age of puberty:''
-				<<option>>
-					<<textbox2 "$activeSlave.pubertyAgeXX" $activeSlave.pubertyAgeXX "Starting Girls">>
-			<</options>>
-
-			<<if $seeHyperPreg == 1 && $cheatMode == 1 && $activeSlave.pubertyXX == 1>>
-				<<options $activeSlave.preg>>
-					''Pregnancy:''
-					<<option 43 "Bursting at the seams" "$activeSlave.pregType = 150,$activeSlave.pregWeek = 43,$activeSlave.pregKnown = 1,$activeSlave.belly = 2700000,$activeSlave.bellyPreg = 2700000,$activeSlave.pubertyXX = 1">>Bursting at the seams
-					(Extreme hyper pregnancy!).
-					<<optiongt 40 42 "Completely Filled" "$activeSlave.pregType = 8,$activeSlave.pregWeek = 42,$activeSlave.pregKnown = 1,$activeSlave.belly = 120000,$activeSlave.bellyPreg = 120000,$activeSlave.pubertyXX = 1">> Completely Filled.
-					<<optiongt 39 40 "Ready to drop" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 40,$activeSlave.pregKnown = 1,$activeSlave.belly = 15000,$activeSlave.bellyPreg = 15000,$activeSlave.pubertyXX = 1">> Ready to drop.
-					<<optiongt 30 34 "Advanced" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 34,$activeSlave.pregKnown = 1,$activeSlave.belly = 10000,$activeSlave.bellyPreg = 10000,$activeSlave.pubertyXX = 1">> Advanced.
-					<<optiongt 20 27 "Showing" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 27,$activeSlave.pregKnown = 1,$activeSlave.belly = 5000,$activeSlave.bellyPreg = 5000,$activeSlave.pubertyXX = 1">> Showing.
-					<<optiongt 10 12 "Early" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 12,$activeSlave.pregKnown = 1,$activeSlave.belly = 100,$activeSlave.bellyPreg = 100,$activeSlave.pubertyXX = 1">> Early.
-					<<optiongt -2 0 "None" "$activeSlave.pregType = 0,$activeSlave.belly = 0,$activeSlave.bellyPreg = 0,$activeSlave.pregSource = 0,$activeSlave.pregWeek = 0,$activeSlave.pregKnown = 0">> None.
-					<<optiondefault -2 "Barren" "$activeSlave.pregType = 0,$activeSlave.belly = 0,$activeSlave.bellyPreg = 0,$activeSlave.pregSource = 0,$activeSlave.pregWeek = 0,$activeSlave.pregKnown = 0">>Barren.
-				<</options>>
-			<<elseif $activeSlave.pubertyXX == 1>>
-				<<options $activeSlave.preg>>
-					''Pregnancy:''
-					<<optiongt 40 42 "Completely Filled" "$activeSlave.pregType = 8,$activeSlave.pregWeek = 42,$activeSlave.pregKnown = 1,$activeSlave.belly = 120000,$activeSlave.bellyPreg = 120000,$activeSlave.pubertyXX = 1">> Completely Filled.
-					<<optiongt 39 40 "Ready to drop" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 40,$activeSlave.pregKnown = 1,$activeSlave.belly = 15000,$activeSlave.bellyPreg = 15000,$activeSlave.pubertyXX = 1">> Ready to drop.
-					<<optiongt 30 34 "Advanced" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 34,$activeSlave.pregKnown = 1,$activeSlave.belly = 10000,$activeSlave.bellyPreg = 10000,$activeSlave.pubertyXX = 1">> Advanced.
-					<<optiongt 20 27 "Showing" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 27,$activeSlave.pregKnown = 1,$activeSlave.belly = 5000,$activeSlave.bellyPreg = 5000,$activeSlave.pubertyXX = 1">> Showing.
-					<<optiongt 10 12 "Early" "$activeSlave.pregType = 1,$activeSlave.pregWeek = 12,$activeSlave.pregKnown = 1,$activeSlave.belly = 100,$activeSlave.bellyPreg = 100,$activeSlave.pubertyXX = 1">> Early.
-					<<optiongt -2 0 "None" "$activeSlave.pregType = 0,$activeSlave.belly = 0,$activeSlave.bellyPreg = 0,$activeSlave.pregSource = 0,$activeSlave.pregWeek = 0,$activeSlave.pregKnown = 0">> None.
-					<<optiondefault -2 "Barren" "$activeSlave.pregType = 0,$activeSlave.belly = 0,$activeSlave.bellyPreg = 0,$activeSlave.pregSource = 0,$activeSlave.pregWeek = 0,$activeSlave.pregKnown = 0">>Barren.
-				<</options>>
+			<<run _options.addOption("Puberty", "pubertyXX", $activeSlave)
+			.addValue("Prepubescent", 0, () => {
+				V.activeSlave.pubertyAgeXX = V.fertilityAge;
+				V.activeSlave.belly = 0;
+				V.activeSlave.bellyPreg = 0;
+				WombFlush(V.activeSlave)
+			}).addValue("Postpubescent", 1)>>
+
+			<<run _options.addOption("Age of puberty", "pubertyAgeXX", $activeSlave).showTextBox()>>
+
+			<<if $activeSlave.pubertyXX === 1>>
+				<<set _option = _options.addOption("Age of puberty", "preg", $activeSlave)>>
+				<<if $seeHyperPreg === 1 && $cheatMode === 1>>
+					<<run _option.addValue("Bursting at the seams", 43, () => {
+						V.activeSlave.pregType = 150;
+						V.activeSlave.pregWeek = 43;
+						V.activeSlave.pregKnown = 1;
+						V.activeSlave.belly = 2700000;
+						V.activeSlave.bellyPreg = 2700000;
+						V.activeSlave.pubertyXX = 1;
+					})>>
+					<<if $activeSlave.preg === 43>>
+						<<run _option.addComment("Extreme hyper pregnancy!")>>
+					<</if>>
+				<</if>>
+				<<run _option.addValue("Completely Filled", 42, () => {
+					V.activeSlave.pregType = 8;
+					V.activeSlave.pregWeek = 42;
+					V.activeSlave.pregKnown = 1;
+					V.activeSlave.belly = 120000;
+					V.activeSlave.bellyPreg = 120000;
+					V.activeSlave.pubertyXX = 1;
+				}).addValue("Ready to drop", 40, () => {
+					V.activeSlave.pregType = 1;
+					V.activeSlave.pregWeek = 40;
+					V.activeSlave.pregKnown = 1;
+					V.activeSlave.belly = 15000;
+					V.activeSlave.bellyPreg = 15000;
+					V.activeSlave.pubertyXX = 1;
+				}).addValue("Advanced", 34, () => {
+					V.activeSlave.pregType = 1;
+					V.activeSlave.pregWeek = 34;
+					V.activeSlave.pregKnown = 1;
+					V.activeSlave.belly = 10000;
+					V.activeSlave.bellyPreg = 10000;
+					V.activeSlave.pubertyXX = 1;
+				}).addValue("Showing", 27, () => {
+					V.activeSlave.pregType = 1;
+					V.activeSlave.pregWeek = 27;
+					V.activeSlave.pregKnown = 1;
+					V.activeSlave.belly = 5000;
+					V.activeSlave.bellyPreg = 5000;
+					V.activeSlave.pubertyXX = 1;
+				}).addValue("Early", 12, () => {
+					V.activeSlave.pregType = 1;
+					V.activeSlave.pregWeek = 12;
+					V.activeSlave.pregKnown = 1;
+					V.activeSlave.belly = 100;
+					V.activeSlave.bellyPreg = 100;
+					V.activeSlave.pubertyXX = 1;
+				}).addValue("None", 0, () => {
+					V.activeSlave.pregType = 0;
+					V.activeSlave.belly = 0;
+					V.activeSlave.bellyPreg = 0;
+					V.activeSlave.pregSource = 0;
+					V.activeSlave.pregWeek = 0;
+					V.activeSlave.pregKnown = 0;
+				}).addValue("Barren", -2, () => {
+					V.activeSlave.pregType = 0;
+					V.activeSlave.belly = 0;
+					V.activeSlave.bellyPreg = 0;
+					V.activeSlave.pregSource = 0;
+					V.activeSlave.pregWeek = 0;
+					V.activeSlave.pregKnown = 0;
+				})>>
 			<</if>>
+
 			<<if $PC.dick > 0 && $activeSlave.preg > 0>>
-				<<options $activeSlave.pregSource>>
-					''Father of child:''
-					<<option -1 "My child">> Carrying my child.
-					<<option 0 "Other">> Not me.
-				<</options>>
+				<<run _options.addOption("Father of child", "pregSource", $activeSlave)
+				.addValueList([["My child", -1], ["Not me", 0]])>>
 			<</if>>
 		<</if>>
 	<</if>>
 
-	<<if $seeDicks != 0	|| $makeDicks == 1>>
-		<<options $activeSlave.dick>>
-			''Penis:''
-			<<option 0 "None" "$activeSlave.balls = 0,$activeSlave.clit = 0,$activeSlave.pubertyXY = 0,$activeSlave.pubertyAgeXY = $potencyAge">> None.
-			<<option 1 "Tiny" "$activeSlave.clit = 0">> Tiny.
-			<<option 2 "Small" "$activeSlave.clit = 0">> Small.
-			<<option 3 "Normal" "$activeSlave.clit = 0">> Normal.
-			<<option 4 "Large" "$activeSlave.clit = 0">> Large.
-			<<optiondefault 5 "Massive" "$activeSlave.clit = 0">> Massive.
-		<</options>>
+	<<if $seeDicks !== 0 || $makeDicks === 1>>
+		<<run _options.addOption("Penis", "dick", $activeSlave)
+		.addValue("None", 0, () => {
+			V.activeSlave.balls = 0;
+			V.activeSlave.pubertyXY = 0;
+			V.activeSlave.pubertyAgeXY = V.potencyAge;
+		}).addValue("Tiny", 1, () => {V.activeSlave.clit = 0})
+		.addValue("Small", 2, () => {V.activeSlave.clit = 0})
+		.addValue("Normal", 3, () => {V.activeSlave.clit = 0})
+		.addValue("Large", 4, () => {V.activeSlave.clit = 0})
+		.addValue("Massive", 5, () => {V.activeSlave.clit = 0})>>
 
 		<<if $activeSlave.dick > 0>>
-			<<if $seeCircumcision == 1>>
-				<<options $activeSlave.foreskin>>
-					''Foreskin:''
-					<<option 0 "Circumcised">> Circumcised.
-					<<option 1 "Tiny">> Tiny.
-					<<option 2 "Small">> Small.
-					<<option 3 "Normal">> Normal.
-					<<option 4 "Large">> Large.
-					<<optiondefault 5 "Massive">> Massive.
-				<</options>>
-			<<else>>
-				<<if $activeSlave.foreskin == 0>><<set $activeSlave.foreskin = 3>><</if>>
-				<<options $activeSlave.foreskin>>
-					''Foreskin:''
-					<<option 1 "Tiny">> Tiny.
-					<<option 2 "Small">> Small.
-					<<option 3 "Normal">> Normal.
-					<<option 4 "Large">> Large.
-					<<optiondefault 5 "Massive">> Massive.
-				<</options>>
+			<<set _option = _options.addOption("Foreskin", "foreskin", $activeSlave)>>
+			<<if $seeCircumcision === 1>>
+				<<run _option.addValue("Circumcised", 0)>>
+			<<elseif $activeSlave.foreskin === 0>>
+				<<set $activeSlave.foreskin = 3>>
 			<</if>>
+			<<run _option.addValueList([["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>>
 		<</if>>
 
-		<<options $activeSlave.balls>>
-			''Testicles:''
-			<<option 0 "None" "$activeSlave.pubertyXY = 0,$activeSlave.pubertyAgeXY = $potencyAge, $activeSlave.scrotum=0">> No testicles.
-			<<option 1 "Vestigial">> Vestigial.
-			<<option 2 "Small">> Small.
-			<<option 3 "Normal">> Normal.
-			<<option 4 "Large">> Large.
-			<<optiondefault 5 "Massive">> Massive.
-		<</options>>
-
-		<<options $activeSlave.pubertyAgeXY>>
-			''Age of Male Puberty:''
-			<<option>>
-				<<textbox2 "$activeSlave.pubertyAgeXY" $activeSlave.pubertyAgeXY "Starting Girls">>
-		<</options>>
+		<<run _options.addOption("Testicles", "balls", $activeSlave)
+		.addValue("None", 0, () => {
+			V.activeSlave.pubertyXY = 0;
+			V.activeSlave.pubertyAgeXY = V.potencyAge;
+			V.activeSlave.scrotum = 0;
+		}).addValueList([["Vestigial", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>>
+
+		<<run _options.addOption("Age of Male Puberty", "pubertyAgeXY", $activeSlave).showTextBox()>>
+		
 		<<if $activeSlave.balls > 0>>
-			<<options $activeSlave.scrotum>>
-				''Ballsack:''
-				<<option 0 "None">> None.
-				<<option 1 "Tiny">> Tiny.
-				<<option 2 "Small">> Small.
-				<<option 3 "Normal">> Normal.
-				<<option 4 "Large">> Large.
-				<<optiondefault 5 "Massive">> Massive.
-			<</options>>
-
-			<<options $activeSlave.pubertyXY>>
-				''Male Puberty:''
-				<<option 0 "Prepubescent" "$activeSlave.pubertyAgeXY = $potencyAge">> Prepubescent.
-				<<option 1 "Postpubescent">> Postpubescent.
-			<</options>>
+			<<run _options.addOption("Ballsack", "scrotum", $activeSlave)
+			.addValueList([["None", 0], ["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>>
+
+			<<run _options.addOption("Male Puberty", "pubertyXY", $activeSlave)
+			.addValue("Prepubescent", 0, () => {V.activeSlave.pubertyAgeXY = V.potencyAge})
+			.addValue("Postpubescent", 1)>>
 		<</if>>
 	<</if>>
 
-	<<options $activeSlave.prostate>>
-		''Prostate:''
-		<<option 0 "No prostate">> No prostate.
-		<<option 1 "Has a prostate">> Has a prostate.
-	<</options>>
+	<<run _options.addOption("Prostate", "prostate", $activeSlave)
+	.addValueList([["No prostate", 0], ["Has a prostate", 1]])>>
 
-	<<if $seeExtreme == 1>>
-		<<options $activeSlave.eye.left.vision>>
-			''Left eye:''
-			<<option 0 "Blind">> Blind
-			<<option 1 "Nearsighted">> Nearsighted
-			<<optiondefault 2 "Normal">> Normal
-		<</options>>
-		<<options $activeSlave.eye.right.vision>>
-			''Right eye:''
-			<<option 0 "Blind">> Blind
-			<<option 1 "Nearsighted">> Nearsighted
-			<<optiondefault 2 "Normal">> Normal
-		<</options>>
+	<<set _optionLeft = _options.addOption("Left eye", "vision", $activeSlave.eye.left)>>
+	<<set _optionRight = _options.addOption("Right eye", "vision", $activeSlave.eye.right)>>
+	<<if $seeExtreme === 1>>
+		<<run _optionLeft.addValue("Blind", 0),  _optionRight.addValue("Blind", 0)>>
 	<<else>>
-		<<options $activeSlave.eye.left.vision>>
-			''Left eye:''
-			<<option 1 "Nearsighted">> Nearsighted
-			<<optiondefault 2 "Normal">> Normal
-		<</options>>
-		<<options $activeSlave.eye.right.vision>>
-			''Right eye:''
-			<<option 1 "Nearsighted">> Nearsighted
-			<<optiondefault 2 "Normal">> Normal
-		<</options>>
+		<<if $activeSlave.eye.left.vision === 0>>
+			<<set $activeSlave.eye.left.vision = 2>>
+		<</if>>
+		<<if $activeSlave.eye.right.vision === 0>>
+			<<set $activeSlave.eye.right.vision = 2>>
+		<</if>>
 	<</if>>
+	<<run _optionLeft.addValueList([["Nearsighted", 1], ["Normal", 2]]), _optionRight.addValueList([["Nearsighted", 1], ["Normal", 2]])>>
 
+	<<set _option = _options.addOption("Hearing", "hears", $activeSlave)>>
 	<<if $seeExtreme == 1>>
-		<<options $activeSlave.hears>>
-			''Hearing:''
-			<<option -2 "Deaf">> Deaf
-			<<option -1 "Hard of hearing">> Hard of hearing
-			<<optiondefault 0 "Normal">> Normal
-		<</options>>
-	<<else>>
-		<<options $activeSlave.hears>>
-			''Hearing:''
-			<<option -1 "Hard of hearing">> Hard of hearing
-			<<optiondefault 0 "Normal">> Normal
-		<</options>>
+		<<run _option.addValue("Deaf", -2)>>
+	<<elseif $activeSlave.hears === 0>>
+		<<set $activeSlave.hears = 2>>
 	<</if>>
+	<<run _option.addValueList([["Hard of hearing", -1], ["Normal", 0]])>>
 
 	<<if $seeExtreme == 1>>
-		<<options $activeSlave.smells>>
-			''Smell ability:''
-			<<option 0 "Normal">> Normal
-			<<option -1 "None">> Unable to smell
-		<</options>>
-
-		<<options $activeSlave.tastes>>
-			''Taste ability:''
-			<<option 0 "Normal">> Normal
-			<<option -1 "None">> Unable to taste
-		<</options>>
-	<</if>>
-
-	<<if $seeExtreme == 1>>
-		/* TODO rewrite this so it looks like the rest (if possible expand options macro) */
-		<p style="text-align: center;">
-			<div>
-				Left arm:
-				<span id = "ampLA">
-					<<if hasLeftArm($activeSlave)>>Yes
-					<<else>>No
-					<</if>>
-				</span>
-				<<link "Remove">>
-					<<set $activeSlave.arm.left = null>>
-					<<replace #ampLA>>
-						No
-					<</replace>>
-				<</link>>
-				<<link "Add">>
-					<<set $activeSlave.arm.left = new App.Entity.LimbState()>>
-					<<replace #ampLA>>
-						Yes
-					<</replace>>
-				<</link>>
-			</div>
-
-			<div>
-				Right arm:
-				<span id = "ampRA">
-					<<if hasRightArm($activeSlave)>>Yes
-					<<else>>No
-					<</if>>
-				</span>
-				<<link "Remove">>
-					<<set $activeSlave.arm.right = null>>
-					<<replace #ampRA>>
-						No
-					<</replace>>
-				<</link>>
-				<<link "Add">>
-					<<set $activeSlave.arm.right = new App.Entity.LimbState()>>
-					<<replace #ampRA>>
-						Yes
-					<</replace>>
-				<</link>>
-			</div>
-
-			<div>
-				Left leg:
-				<span id = "ampLL">
-					<<if hasLeftLeg($activeSlave)>>Yes
-					<<else>>No
-					<</if>>
-				</span>
-				<<link "Remove">>
-					<<set $activeSlave.leg.left = null>>
-					<<replace #ampLL>>
-						No
-					<</replace>>
-				<</link>>
-				<<link "Add">>
-					<<set $activeSlave.leg.left = new App.Entity.LimbState()>>
-					<<replace #ampLL>>
-						Yes
-					<</replace>>
-				<</link>>
-			</div>
-
-			<div>
-				Right leg:
-				<span id = "ampRL">
-					<<if hasRightLeg($activeSlave)>>Yes
-					<<else>>No
-					<</if>>
-				</span>
-				<<link "Remove">>
-					<<set $activeSlave.leg.right = null>>
-					<<replace #ampRL>>
-						No
-					<</replace>>
-				<</link>>
-				<<link "Add">>
-					<<set $activeSlave.leg.right = new App.Entity.LimbState()>>
-					<<replace #ampRL>>
-						Yes
-					<</replace>>
-				<</link>>
-			</div>
-		</p>
+		<<run _options.addOption("Smell ability", "smells", $activeSlave)
+		.addValueList([["Normal", 0], ["None", -1]])>>
+
+		<<run _options.addOption("Taste ability", "tastes", $activeSlave)
+		.addValueList([["Normal", 0], ["None", -1]])>>
+
+		<<set _LA = hasLeftArm($activeSlave)>>
+		<<run _options.addOption("Left arm", "LA", State.temporary)
+		.addValue("Healthy", true, () => V.activeSlave.arm.left = new App.Entity.LimbState())
+		.addValue("Amputated", false, () => V.activeSlave.arm.left = null)>>
+
+		<<set _RA = hasRightArm($activeSlave)>>
+		<<run _options.addOption("Right arm", "RA", State.temporary)
+		.addValue("Healthy", true, () => V.activeSlave.arm.right = new App.Entity.LimbState())
+		.addValue("Amputated", false, () => V.activeSlave.arm.right = null)>>
+
+		<<set _LL = hasLeftLeg($activeSlave)>>
+		<<run _options.addOption("Left leg", "LL", State.temporary)
+		.addValue("Healthy", true, () => V.activeSlave.leg.left = new App.Entity.LimbState())
+		.addValue("Amputated", false, () => V.activeSlave.leg.left = null)>>
+
+		<<set _RL = hasRightLeg($activeSlave)>>
+		<<run _options.addOption("Right leg", "RL", State.temporary)
+		.addValue("Healthy", true, () => V.activeSlave.leg.right = new App.Entity.LimbState())
+		.addValue("Amputated", false, () => V.activeSlave.leg.right = null)>>
 	<</if>>
 
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
 <div id="Mental" class="tabcontent">
-
 	<div class="content">
-	<<if $activeSlave.fetishKnown == 0>>
-		<<options $activeSlave.fetishKnown>>
-			''Fetish:''
-			<<option 0 "Unknown">>
-				//Not known.//
-			<<option 1 "Known">>
-		<</options>>
+	
+	<<set _options = new App.UI.OptionsGroup()>>
+	<<if $activeSlave.fetishKnown === 0>>
+		<<run _options.addOption("Fetish", "fetishKnown", $activeSlave)
+		.addValueList([["Unknown", 0], ["Known", 1]])>>
 	<<else>>
-		<<if $seeExtreme != 1>>
-			<<options $activeSlave.fetish>>
-				''Fetish:''
-					<<if $activeSlave.fetish == "none">>
-						@@.pink;$activeSlave.fetish.@@
-					<<else>>
-						@@.lightcoral;$activeSlave.fetish.@@
-					<</if>>
-				<<option ""            "Unknown" "$activeSlave.fetish=either('boobs', 'buttslut', 'cumslut', 'dom', 'humiliation', 'masochist', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'pregnancy', 'sadist', 'submissive'),$activeSlave.fetishKnown=0">>
-				<<option "none"        "None">>
-				<<option "submissive"  "Sub">>
-				<<option "dom"         "Dom">>
-				<<option "cumslut"     "Cumslut">>
-				<<option "humiliation" "Humiliation">>
-				<<option "buttslut"    "Buttslut">>
-				<<option "boobs"       "Breasts">>
-				<<option "pregnancy"   "Pregnancy">>
-				<<option "sadist"      "Sadism">>
-				<<option "masochist"   "Masochism">>
-			<</options>>
-		<<else>>
-			<<options $activeSlave.fetish>>
-				''Fetish:''
-					<<if $activeSlave.fetish == "none">>
-						@@.pink;$activeSlave.fetish.@@
-					<<else>>
-						@@.lightcoral;$activeSlave.fetish.@@
-					<</if>>
-				<<option ""            "Unknown" "$activeSlave.fetish=either('boobs', 'buttslut', 'cumslut', 'dom', 'humiliation', 'masochist', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'none', 'pregnancy', 'sadist', 'submissive'),$activeSlave.fetishKnown=0">>
-				<<option "none"        "None">>
-				<<option "submissive"  "Sub">>
-				<<option "dom"         "Dom">>
-				<<option "cumslut"     "Cumslut">>
-				<<option "humiliation" "Humiliation">>
-				<<option "buttslut"    "Buttslut">>
-				<<option "boobs"       "Breasts">>
-				<<option "pregnancy"   "Pregnancy">>
-				<<option "sadist"      "Sadism">>
-				<<option "masochist"   "Masochism">>
-				<<option "mindbroken"  "Mindbroken" "$activeSlave.sexualFlaw = 'none', $activeSlave.behavioralFlaw = 'none', $activeSlave.sexualQuirk = 'none', $activeSlave.sexualFlaw = 'none'">>
-			<</options>>
+		<<set _option = _options.addOption("Fetish", "fetish", $activeSlave)
+		.addValue("Unknown", "", () => {
+			V.activeSlave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist",
+				"submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none");
+			V.activeSlave.fetishKnown = 0
+		}).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humilation", "humilation"],
+		["Buttslut", "buttslut"], ["Breasts", "breasts"], ["Pregnancy", "pregnancy"], ["Sadism", "sadism"], ["Masochism", "masochism"]])>>
+		<<if $seeExtreme === 1>>
+			<<run _option.addValue("Mindbroken", "mindbroken", () => {
+				V.activeSlave.fetishStrength = 10;
+				V.activeSlave.sexualFlaw = "none";
+				V.activeSlave.sexualQuirk = "none";
+				V.activeSlave.behavioralFlaw = "none";
+				V.activeSlave.behavioralQuirk = "none";
+			})>>
+		<</if>>
+
+		<<if $activeSlave.fetish !== "none" && $activeSlave.fetish !== "mindbroken">>
+			<<run _options.addOption("Fetish strength", "fetishStrength", $activeSlave)
+			.addRange(15, 30, "<=", "Very Low")
+			.addRange(45, 60, "<=", "Low")
+			.addRange(75, 85, "<=", "Normal")
+			.addRange(90, 95, "<=", "High")
+			.addRange(100, 95, ">", "Extremely High")>>
 		<</if>>
-		/* fetish is known */
-		<<if $activeSlave.fetish != "none">>
-			<<options $activeSlave.fetishStrength>>
-				''Fetish strength:'' $activeSlave.fetishStrength
-				<<if $activeSlave.fetishStrength > 95>>
-					@@.lightcoral;Extremely High.@@
-				<<elseif $activeSlave.fetishStrength > 85>>
-					@@.lightcoral;High.@@
-				<<elseif $activeSlave.fetishStrength > 60>>
-					@@.hotpink;Normal.@@
-				<<elseif $activeSlave.fetishStrength > 30>>
-					@@.pink;Low.@@
-				<<else>>
-					@@.pink;Very Low.@@
-				<</if>>
-				<<option>>
-					<<if $activeSlave.fetishStrength >= 5>>
-						[[Decrease|Starting Girls][$activeSlave.fetishStrength -= 5]]
-						<<if $activeSlave.fetishStrength <= 95>>
-							&nbsp;|&nbsp;
-						<</if>>
-					<</if>>
-				<<option>>
-					<<if $activeSlave.fetishStrength <= 95>>
-						[[Increase|Starting Girls][$activeSlave.fetishStrength += 5]]
-					<</if>>
-			<</options>>
-		<</if>> /* Fetish != "none" */
-	<</if>> /* fetishKnown */
-
-	<<if $activeSlave.attrKnown == 0>>
-		<<options $activeSlave.attrKnown>>
-			''Sexuality:''
-			<<option 0 "Unknown">>
-				//Not known.//
-			<<option 1 "Known">>
-		<</options>>
-	<<else>>
-		<<options $activeSlave.attrXY>>
-			''Sexuality:''
-				<<if $activeSlave.attrXY <= 5>>
-					@@.red;Disgusted by men,@@
-				<<elseif $activeSlave.attrXY <= 15>>
-					@@.red;Turned off by men,@@
-				<<elseif $activeSlave.attrXY <= 35>>
-					@@.red;Not attracted to men,@@
-				<<elseif $activeSlave.attrXY <= 65>>
-					Indifferent to men,
-				<<elseif $activeSlave.attrXY <= 85>>
-					@@.green;Attracted to men,@@
-				<<elseif $activeSlave.attrXY <= 95>>
-					@@.green;Aroused by men,@@
-				<<else>>
-					@@.green;Passionate about men,@@
-				<</if>>
-				<<if $activeSlave.attrXX <= 5>>
-					@@.red;disgusted by women.@@
-				<<elseif $activeSlave.attrXX <= 15>>
-					@@.red;turned off by women.@@
-				<<elseif $activeSlave.attrXX <= 35>>
-					@@.red;not attracted to women.@@
-				<<elseif $activeSlave.attrXX <= 65>>
-					indifferent to women.
-				<<elseif $activeSlave.attrXX <= 85>>
-					@@.green;attracted to women.@@
-				<<elseif $activeSlave.attrXX <= 95>>
-					@@.green;aroused by women.@@
-				<<else>>
-					@@.green;passionate about women.@@
-				<</if>>
-			<<option "" "Unknown" "$activeSlave.attrXX = random(0,100), $activeSlave.attrXY = random(0,100), $activeSlave.energy = random(1,90), $activeSlave.attrKnown = 0">>
-			<<option>>&nbsp;&nbsp;
-				XY (male) attraction:&nbsp;
-				<<if $activeSlave.attrXY > 0>>
-					[[Decrease|Starting Girls][$activeSlave.attrXY = Math.clamp($activeSlave.attrXY-10, 0, 100)]]
-					<<if $activeSlave.attrXY < 100>>
-						&nbsp;|&nbsp;
-					<</if>>
-				<</if>>
-			<<option>>
-				<<if $activeSlave.attrXY < 100>>
-					[[Increase|Starting Girls][$activeSlave.attrXY = Math.clamp($activeSlave.attrXY+10, 0, 100)]]
-				<</if>>
-			<<option>>&nbsp;&nbsp;
-				XX (female) attraction:&nbsp;
-				<<if $activeSlave.attrXX > 0>>
-					[[Decrease|Starting Girls][$activeSlave.attrXX = Math.clamp($activeSlave.attrXX-10, 0, 100)]]
-					<<if $activeSlave.attrXX < 100>>
-						&nbsp;|&nbsp;
-					<</if>>
-				<</if>>
-			<<option>>
-				<<if $activeSlave.attrXX < 100>>
-					[[Increase|Starting Girls][$activeSlave.attrXX = Math.clamp($activeSlave.attrXX+10, 0, 100)]]
-				<</if>>
-		<</options>>
-
-		<<options $activeSlave.energy>>
-			''Sex drive:''
-			<<optionlte 20 5 "Frigid">>@@.red;Frigid.@@
-			<<optionlte 40 25 "Poor">>@@.red;Poor@@
-			<<optionlte 60 45 "Average">>@@.yellow;Average@@
-			<<optionlte 80 65 "Powerful">>@@.green;Powerful@@
-			<<optionlte 99 85 "Sex addict">>@@.green;Sex addict@@
-			<<optiondefault 100 "Nympho">>@@.green;Nympho!@@
-		<</options>>
 	<</if>>
 
-	<<options $activeSlave.behavioralFlaw>>
-		''Behavioral Flaw:''
-			<<if $activeSlave.behavioralFlaw == "none">>
-				//$activeSlave.behavioralFlaw.//
-			<<else>>
-				@@.red;$activeSlave.behavioralFlaw.@@
-			<</if>>
-		<<option "none"        "None">>
-		<<option "arrogant"    "Arrogant">>
-		<<option "bitchy"      "Bitchy">>
-		<<option "odd"         "Odd">>
-		<<option "hates men"   "Men">>
-		<<option "hates women" "Women">>
-		<<option "anorexic"    "Anorexic">>
-		<<option "gluttonous"  "Gluttonous">>
-		<<option "devout"      "Devout">>
-		<<option "liberated"   "Liberated">>
-	<</options>>
-
-	<<options $activeSlave.behavioralQuirk>>
-		''Behavioral Quirk:''
-			<<if $activeSlave.behavioralQuirk == "none">>
-				//$activeSlave.behavioralQuirk.//
-			<<else>>
-				@@.green;$activeSlave.behavioralQuirk.@@
-			<</if>>
-		<<option "none"         "None" >>
-		<<option "confident"    "Confident" >>
-		<<option "cutting"      "Cutting" >>
-		<<option "funny"        "Funny" >>
-		<<option "adores men"   "Men" >>
-		<<option "adores women" "Women" >>
-		<<option "insecure"     "Insecure" >>
-		<<option "fitness"      "Fitness" >>
-		<<option "sinful"       "Sinful" >>
-		<<option "advocate"     "Advocate" >>
-	<</options>>
-
-	<<options $activeSlave.sexualFlaw>>
-		''Sexual Flaw:''
-			<<if $activeSlave.sexualFlaw == "none">>
-				//$activeSlave.sexualFlaw.//
-			<<else>>
-				@@.red;$activeSlave.sexualFlaw.@@
-			<</if>>
-		<<option "none" "None">>
-		<<option "hates oral" "Oral">>
-		<<option "hates anal" "Anal">>
-		<<option "hates penetration" "Penetration">>
-		<<option "repressed" "Repressed">>
-		<<option "shamefast" "Shamefast">>
-		<<option "apathetic" "Apathetic">>
-		<<option "crude" "Crude">>
-		<<option "judgemental" "Judgemental">>
-		<<option "idealistic" "Sexually idealistic">>
-	<</options>>
-
-	<<options $activeSlave.sexualQuirk>>
-		''Sexual Quirk:''
-			<<if $activeSlave.sexualQuirk == "none">>
-				//$activeSlave.sexualQuirk.//
-			<<else>>
-				@@.green;$activeSlave.sexualQuirk.@@
-			<</if>>
-		<<option "none" "None">>
-		<<option "gagfuck queen" "Oral">>
-		<<option "painal queen" "Anal">>
-		<<option "strugglefuck queen" "Penetration">>
-		<<option "perverted" "Perverted">>
-		<<option "tease" "Tease">>
-		<<option "caring" "Caring">>
-		<<option "unflinching" "Unflinching">>
-		<<option "size queen" "Size queen">>
-		<<option "romantic" "Romantic">>
-	<</options>>
+	<<run _options.addOption("Sexuality", "attrKnown", $activeSlave)
+	.addValue("Unknown", 0).addValue("Known", 1, () => {
+		V.activeSlave.attrXX = random(0, 100);
+		V.activeSlave.attrXY = random(0, 100);
+		V.activeSlave.energy = random(1, 90);
+	})>>
+	<<if $activeSlave.attrKnown === 1>>
+		<<run _options.addOption("Attraction to men", "attrXY", $activeSlave)
+		.addRange(0, 5, "<=", "Disgusted").off()
+		.addRange(10, 15, "<=", "Turned off").off()
+		.addRange(25, 35, "<=", "Not attracted").off()
+		.addRange(50, 65, "<=", "Indifferent").neutral()
+		.addRange(75, 85, "<=", "Attracted").on()
+		.addRange(90, 95, "<=", "Aroused").on()
+		.addRange(100, 95, ">", "Passionate").on()>>
+		<<run _options.addOption("Attraction to women", "attrXX", $activeSlave)
+		.addRange(0, 5, "<=", "Disgusted").off()
+		.addRange(10, 15, "<=", "Turned off").off()
+		.addRange(25, 35, "<=", "Not attracted").off()
+		.addRange(50, 65, "<=", "Indifferent").neutral()
+		.addRange(75, 85, "<=", "Attracted").on()
+		.addRange(90, 95, "<=", "Aroused").on()
+		.addRange(100, 95, ">", "Passionate").on()>>
+
+		<<run _options.addOption("Sex drive", "energy", $activeSlave)
+		.addRange(5, 10, "<=", "Frigid").off()
+		.addRange(25, 40, "<=", "Poor").off()
+		.addRange(45, 60, "<=", "Average").neutral()
+		.addRange(65, 80, "<=", "Powerful").on()
+		.addRange(85, 99, "<=", "Sex addict").on()
+		.addRange(100, 99, ">", "Nympho").on()>>
+	<</if>>
 
+	<<if $activeSlave.fetish !== "mindbroken">>
+		<<run _options.addOption("Behavioral Flaw", "behavioralFlaw", $activeSlave)
+		.addValueList([["None", "none"], ["Arrogant", "arrogant"], ["Bitchy", "bitchy"], ["Odd", "odd"], ["Hates Men", "hates men"],
+		["Hates Women", "hates women"], ["Anorexic", "anorexic"], ["Gluttonous", "gluttonous"], ["Devout", "devout"],
+		["Liberated", "liberated"]])>>
+
+		<<run _options.addOption("Behavioral Quirk", "behavioralQuirk", $activeSlave)
+		.addValueList([["None", "none"], ["Confident", "confident"], ["Cutting", "cutting"], ["Funny", "funny"],
+		["Adores Men", "adores men"], ["Adores Women", "adores women"], ["Insecure", "insecure"], ["Fitness", "fitness"],
+		["Sinful", "sinful"], ["Advocate", "advocate"]])>>
+
+		<<run _options.addOption("Sexual Flaw", "sexualFlaw", $activeSlave)
+		.addValueList([["None", "none"], ["Hates Oral", "hates oral"], ["Hates Anal", "hates anal"],
+		["Hates Penetration", "hates penetration"], ["Repressed", "repressed"], ["Shamefast", "shamefast"], ["Apathetic", "apathetic"],
+		["Crude", "crude"], ["Judgemental", "judgemental"], ["Sexually idealistic", "idealistic"]])>>
+
+		<<run _options.addOption("Sexual Quirk", "sexualQuirk", $activeSlave)
+		.addValueList([["None", "none"], ["Oral", "gagfuck queen"], ["Anal", "painal queen"], ["Penetration", "strugglefuck queen"],
+		["Perverted", "perverted"], ["Tease", "tease"], ["Caring", "caring"], ["Unflinching", "unflinching"], ["Size queen", "size queen"],
+		["Romantic", "romantic"]])>>
+	<</if>>
+
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
 <div id="Skills" class="tabcontent">
 	<div class="content">
+	<<set _options = new App.UI.OptionsGroup()>>
+
+	<<run _options.addOption("Oral sex", "oral", $activeSlave.skill)
+	.addRange(0, 10, "<=", "Unskilled")
+	.addRange(15, 30, "<=", "Basic")
+	.addRange(35, 60, "<=", "Skilled")
+	.addRange(65, 60, ">", "Expert")>>
 
-	<<options $activeSlave.skill.oral>>
-		''Oral sex:''
-		<<optionlte 10 0 "Unskilled">> Unskilled.
-		<<optionlte 30 15 "Basic">> @@.cyan;Basic.@@
-		<<optionlte 60 35 "Skilled">> @@.cyan;Skilled.@@
-		<<optiondefault 65 "Expert">> @@.cyan;Expert.@@
-	<</options>>
-
-	<<if $activeSlave.anus == 0>>
-		<<options>>
-			''Anal sex:''
-			<<option>>
-				//Anal virgins cannot be given anal skills//
-		<</options>>
+	<<set _option = _options.addOption("Anal sex", "anal", $activeSlave.skill)>>
+	<<if $activeSlave.anus === 0>>
+		<<run _option.addComment("Anal virgins cannot be given anal skills.")>>
 	<<else>>
-		<<options $activeSlave.skill.anal>>
-			''Anal sex:''
-			<<optionlte 10 0 "Unskilled">> Unskilled.
-			<<optionlte 30 15 "Basic">> @@.cyan;Basic.@@
-			<<optionlte 60 35 "Skilled">> @@.cyan;Skilled.@@
-			<<optiondefault 65 "Expert">> @@.cyan;Expert.@@
-		<</options>>
+		<<run _option.addRange(0, 10, "<=", "Unskilled")
+		.addRange(15, 30, "<=", "Basic")
+		.addRange(35, 60, "<=", "Skilled")
+		.addRange(65, 60, ">", "Expert")>>
 	<</if>>
 
-	<<if $activeSlave.vagina == 0>>
-		<<options>>
-			''Vaginal sex:''
-			<<option>>
-				//Virgins cannot be given vaginal skills//
-		<</options>>
-	<<elseif $activeSlave.vagina == -1>>
-		<<options>>
-			''Vaginal sex:''
-			<<option>>
-				//Must have a vagina to have vaginal skills//
-		<</options>>
+	<<set _option = _options.addOption("Vaginal sex", "vaginal", $activeSlave.skill)>>
+	<<if $activeSlave.vagina === 0>>
+		<<run _option.addComment("Virgins cannot be given anal skills.")>>
+	<<elseif $activeSlave.vagina === -1>>
+		<<run _option.addComment("Must have a vagina to have vaginal skills.")>>
 	<<else>>
-		<<options $activeSlave.skill.vaginal>>
-			''Vaginal sex:''
-			<<optionlte 10 0  "Unskilled">> Unskilled.
-			<<optionlte 30 15 "Basic">> @@.cyan;Basic.@@
-			<<optionlte 60 35 "Skilled">> @@.cyan;Skilled.@@
-			<<optiondefault 65 "Expert">> @@.cyan;Expert.@@
-		<</options>>
+		<<run _option.addRange(0, 10, "<=", "Unskilled")
+		.addRange(15, 30, "<=", "Basic")
+		.addRange(35, 60, "<=", "Skilled")
+		.addRange(65, 60, ">", "Expert")>>
 	<</if>>
 
-	<<options $activeSlave.skill.whoring>>
-		''Prostitution:''
-		<<optionlte 10 0 "Unskilled">> Unskilled.
-		<<optionlte 30 15 "Basic">> @@.cyan;Basic.@@
-		<<optionlte 60 35 "Skilled">> @@.cyan;Skilled.@@
-		<<optiondefault 65 "Expert">> @@.cyan;Expert.@@
-	<</options>>
-
-	<<options $activeSlave.skill.entertainment>>
-		''Entertainment:''
-		<<optionlte 10 0 "Unskilled">> Unskilled.
-		<<optionlte 30 15 "Basic">> @@.cyan;Basic.@@
-		<<optionlte 60 35 "Skilled">> @@.cyan;Skilled.@@
-		<<optiondefault 65 "Expert">> @@.cyan;Expert.@@
-	<</options>>
-
-	<<options $activeSlave.skill.combat>>
-		''Combat:''
-		<<option 0 "Unskilled">> Unskilled
-		<<option 1 "Skilled">> @@.cyan;Skilled.@@
-	<</options>>
-
-	<<if $activeSlave.skill.whoring+$activeSlave.skill.entertainment+$activeSlave.skill.vaginal+$activeSlave.skill.anal+$activeSlave.skill.oral+($activeSlave.skill.combat*100) > 200>>
-		<<options>>
-			<<option>>
-				<span class="red" style="font-style: italic">
-					Starting slaves incur
-					<<if $activeSlave.skill.whoring+$activeSlave.skill.entertainment+$activeSlave.skill.vaginal+$activeSlave.skill.anal+$activeSlave.skill.oral+($activeSlave.skill.combat*100) > 400>>
-							a severe cost penalty at for being highly
-					<<else>>
-							an additional cost penalty for being
-					<</if>>
-					skilled. This slave's
-					<<if $activeSlave.actualAge >= 25>>
-						<<if $activeSlave.actualAge > 35>>
-							advanced
-						<</if>>
-						age decreases the penalty
-					<<else>>
-						young age requires paying the full penalty
-					<</if>>.
-				</span>
-		<</options>>
+	<<run _options.addOption("Prostitution", "whoring", $activeSlave.skill)
+	.addRange(0, 10, "<=", "Unskilled")
+	.addRange(15, 30, "<=", "Basic")
+	.addRange(35, 60, "<=", "Skilled")
+	.addRange(65, 60, ">", "Expert")>>
+
+	<<run _options.addOption("Entertainment", "entertainment", $activeSlave.skill)
+	.addRange(0, 10, "<=", "Unskilled")
+	.addRange(15, 30, "<=", "Basic")
+	.addRange(35, 60, "<=", "Skilled")
+	.addRange(65, 60, ">", "Expert")>>
+
+	<<run _options.addOption("Combat", "combat", $activeSlave.skill)
+	.addValueList([["Unskilled", 0], ["Skilled", 1]])>>
+
+	<<set _totalSkill = $activeSlave.skill.whoring + $activeSlave.skill.entertainment + $activeSlave.skill.vaginal
+		+ $activeSlave.skill.anal + $activeSlave.skill.oral + ($activeSlave.skill.combat * 100)>>
+	<<if _totalSkill > 200>>
+		<<set _comment = "Starting slaves incur">>
+		<<if _totalSkill > 400>>
+			<<set _comment += " a severe cost penalty for being highly">>
+		<<else>>
+			<<set _comment += " an additional cost penalty for being">>
+		<</if>>
+		<<set _comment += " skilled. This slave's">>
+		<<if $activeSlave.actualAge >= 25>>
+			<<if $activeSlave.actualAge > 35>>
+				<<set _comment += " advanced">>
+			<</if>>
+			<<set _comment += " age decreases the penalty.">>
+		<<else>>
+			<<set _comment += " young age requires paying the full penalty.">>
+		<</if>>
+		<<run _options.addOption("").addComment(`<span class="warning">${_comment}</span>`)>>
 	<</if>>
 
+	<<includeDOM _options.render()>>
 	</div>
 </div>
 
diff --git a/src/uncategorized/costsBudget.tw b/src/uncategorized/costsBudget.tw
index 2ac4ee73c508d2a9c206dd70dc4b47f1da4e94e3..2f019b3ac1c4f4ed7ca4ce9bda2640ef77e66aa9 100644
--- a/src/uncategorized/costsBudget.tw
+++ b/src/uncategorized/costsBudget.tw
@@ -80,7 +80,7 @@
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("", "costsBudget", $showAllEntries)
 .addValue("Normal", 0).on().addValue("Show Empty Entries", 1).neutral()>>
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 <p>
 /* Table of Totals */
diff --git a/src/uncategorized/descriptionOptions.tw b/src/uncategorized/descriptionOptions.tw
index d25696f3231deec4812514faaf6c37b67aa79e8b..19a45f677ea6c8c8a17fb6598eba5c45b02fe581 100644
--- a/src/uncategorized/descriptionOptions.tw
+++ b/src/uncategorized/descriptionOptions.tw
@@ -71,4 +71,4 @@
 	.addValue("Default (20)", 20).showTextBox()>>
 <</if>>
 
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
diff --git a/src/uncategorized/manageArcology.tw b/src/uncategorized/manageArcology.tw
index d8fd49b3dedfe970039a2f64c92251440e0ae294..1cbbde4aad1ddc3255a8f8967c6979523a90111a 100644
--- a/src/uncategorized/manageArcology.tw
+++ b/src/uncategorized/manageArcology.tw
@@ -79,7 +79,7 @@
 		<span class="note">
 			The arcology's public areas are fully upgraded.
 		</span>
-		<<= App.UI.DOM.includeDOM(App.Arcology.upgrades($building))>>
+		<<includeDOM App.Arcology.upgrades($building)>>
 	<</if>>
 	</div>
 
diff --git a/src/uncategorized/options.tw b/src/uncategorized/options.tw
index e090317a168eba740a48021ff8c23f9484c9b2eb..31bd7df827b52193c407a96771ec598f557e126e 100644
--- a/src/uncategorized/options.tw
+++ b/src/uncategorized/options.tw
@@ -29,7 +29,7 @@
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("End of week autosaving is currently", "autosave")
 .addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 <br>
 This save was created using FC version $ver build $releaseID.
@@ -113,7 +113,7 @@ This save was created using FC version $ver build $releaseID.
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
 		.addComment("This will comma-format numbers in some areas.")>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>General</h2>
 
@@ -161,7 +161,7 @@ This save was created using FC version $ver build $releaseID.
 		<<run _options.addOption("Line separations are", "lineSeparations")
 		.addValue("Shown", 1).on().addValue("Hidden", 0).off()>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Sidebar</h2>
 
@@ -204,7 +204,7 @@ This save was created using FC version $ver build $releaseID.
 			.addValue("Shown", 1).on().addValue("Hidden", 0).off()>>
 		<</if>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Images</h2>
 
@@ -213,7 +213,7 @@ This save was created using FC version $ver build $releaseID.
 		<<run _options.addOption("Images are", "seeImages")
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 		
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<<if $seeImages > 0>>
 			<div class="imageRef" style="width:200px;height:200px;margin-left:50px;">
@@ -263,7 +263,7 @@ This save was created using FC version $ver build $releaseID.
 			<<run _options.addOption("Slave images in the weekly report are", "seeReportImages")
 			.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 			
-			<<print App.UI.DOM.includeDOM(_options.render())>>
+			<<includeDOM _options.render()>>
 		<</if>>
 	</div>
 </div>
@@ -341,7 +341,7 @@ This save was created using FC version $ver build $releaseID.
 		<<run _options.addOption("Missing slave names are currently", "showMissingSlaves")
 		.addValue("Enabled", true).on().addValue("Disabled", false).off()>>
 		
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Intersecting mechanics</h2>
 
@@ -355,7 +355,7 @@ This save was created using FC version $ver build $releaseID.
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
 		.addComment("If enabled, curatives have a chance to give slaves harmful side effects.")>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Flavour</h2>
 
@@ -386,7 +386,7 @@ This save was created using FC version $ver build $releaseID.
 		<<run _options.addOption("Distant relatives such as aunts, nieces and cousins are", "showDistantRelatives")
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 	</div>
 </div>
 
@@ -412,7 +412,7 @@ This save was created using FC version $ver build $releaseID.
 		.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div>
 			<div>''If you are enabling the mod mid game for the first time, run the either the main or mod specific BC option listed near the top.''</div>")>>
 		
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<<if $secExpEnabled > 0>>
 			<h2>Security Expansion mod options</h2>
@@ -491,7 +491,7 @@ This save was created using FC version $ver build $releaseID.
 				.addValue("Yes", 1).on().addValue("No", 0).off()>>
 			<</if>>
 
-			<<print App.UI.DOM.includeDOM(_options.render())>>
+			<<includeDOM _options.render()>>
 
 			<div class="subHeading">
 			<<if $debugMode || $cheatMode || $cheatModeM>>
@@ -656,7 +656,7 @@ This save was created using FC version $ver build $releaseID.
 		.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
 		.addComment("Outputs performance data at the bottom of every passage.")>>
 
-		<<print App.UI.DOM.includeDOM(_options.render())>>
+		<<includeDOM _options.render()>>
 
 		<h2>Cheating</h2>
 
@@ -667,7 +667,7 @@ This save was created using FC version $ver build $releaseID.
 		.addComment("This will allow manual selection of events and unlock some options that would usually be restricted by progress.")>>
 
 		<<if $cheatMode === 0>>
-			<<print App.UI.DOM.includeDOM(_options.render())>>
+			<<includeDOM _options.render()>>
 		<<else>>
 			<<run _options.addOption("Sidebar Cheats are currently", "cheatModeM")
 			.addValue("Shown", 1).on().addValue("Hidden", 0).off()>>
@@ -675,7 +675,7 @@ This save was created using FC version $ver build $releaseID.
 			<<run _options.addOption("Slave aging", "seeAge")
 			.addValue("Enabled", 1).on().addValue("Celebrate birthdays, but don't age.", 2).neutral().addValue("Disabled", 0).off()>>
 
-			<<print App.UI.DOM.includeDOM(_options.render())>>
+			<<includeDOM _options.render()>>
 
 			<div class="scLink2">
 			[[Add 100000 money|Options][$cheater = 1, cashX(100000, "cheating")]] | [[Add 10000 rep|Options][$cheater = 1, repX(10000, "cheating")]] //Cheating will be flagged in your save//
@@ -736,7 +736,7 @@ This save was created using FC version $ver build $releaseID.
 
 	<p>
 		UI theme selector. Allows to select a single CSS file to be loaded. <span class="red">The file has to be located in the same directory as the HTML file otherwise it will simply not load at all.</span>
-		<<print App.UI.DOM.includeDOM(App.UI.Theme.selector(), "themeSelector")>>
+		<<includeDOM App.UI.Theme.selector(), "themeSelector">>
 	</p>
 
 	<<set _options = new App.UI.OptionsGroup()>>
@@ -763,5 +763,5 @@ This save was created using FC version $ver build $releaseID.
 		.addComment("This will enable a controversial but very broken event. Warning: Snuff, cannibalism.")>>
 	<</if>>
 	
-	<<print App.UI.DOM.includeDOM(_options.render())>>
+	<<includeDOM _options.render()>>
 </div>
diff --git a/src/uncategorized/repBudget.tw b/src/uncategorized/repBudget.tw
index 7e5cbc4f78e8c0c7dff98be055ff067bc7501b8b..ce03bf981b20c0ae38437923aa281ed3d04e36ae 100644
--- a/src/uncategorized/repBudget.tw
+++ b/src/uncategorized/repBudget.tw
@@ -24,7 +24,7 @@
 <<set _options = new App.UI.OptionsGroup()>>
 <<run _options.addOption("", "repBudget", $showAllEntries)
 .addValue("Normal", 0).on().addValue("Show Empty Entries", 1).neutral()>>
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 /* Table of Totals */
 <<if ndef $lastWeeksRepIncome>>
diff --git a/src/uncategorized/summaryOptions.tw b/src/uncategorized/summaryOptions.tw
index 33378dbd662ebfa67d0e5b7be99835dfee53dc9b..4999d533ca7683a578afd6ba0dce66ce2b074a02 100644
--- a/src/uncategorized/summaryOptions.tw
+++ b/src/uncategorized/summaryOptions.tw
@@ -39,7 +39,7 @@
 	["How old they look", "visualAge"], ["Age of their body", "physicalAge"], ["Assignment", "assignment"], ["Weekly Income", "weeklyIncome"]])>>
 <</if>>
 
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 <h2>Individual panels</h2>
 Sample summary:
@@ -67,7 +67,7 @@ Sample summary:
 	.addValue("Shown", true).on().addValue("Hidden", false).off()>>
 <</if>>
 
-<<print App.UI.DOM.includeDOM(_options.render())>>
+<<includeDOM _options.render()>>
 
 <p style="font-style:italic">
 	[[FC Dev's preferred options|Summary Options ][$seeDesk = 0, $seeFCNN = 0, $sortSlavesBy = "devotion",$sortSlavesOrder = "descending",$sortSlavesMain = 0,$rulesAssistantMain = 1, $UI.slaveSummary.abbreviation = {devotion: 1, mental: 1, rules: 1, clothes: 2, health: 1, diet: 1, drugs: 1, hormoneBalance: 1, race: 1, genitalia: 1, physicals: 1, skills: 1, nationality: 1, rulesets: 1, clothes: 0, origins: 0} ,$abbreviateSidebar = 1]]