diff --git a/devTools/types/FC.d.ts b/devTools/types/FC.d.ts
index 63d72036c1ed7e13767e754a6eee8c040319d1b7..a3f2b2ca6f01b8d043e483d51c90bd646a488da2 100644
--- a/devTools/types/FC.d.ts
+++ b/devTools/types/FC.d.ts
@@ -121,6 +121,9 @@ declare global {
 
 			class RuleSetters {
 				releaseRules: RuleReleaseSetters;
+				lactationRules: string;
+				mobilityRules: string;
+				restRules: string;
 				toyHole: string;
 				clitSetting: string;
 				clitSettingXY: number;
diff --git a/src/events/reStaffedMorning.js b/src/events/reStaffedMorning.js
index 1327627b4dc1908149ed8bddce9f9d71705b0f4e..9a849d920a566b0761592e9f1c020868f37e6b19 100644
--- a/src/events/reStaffedMorning.js
+++ b/src/events/reStaffedMorning.js
@@ -127,7 +127,7 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 
 		function satisfied() {
 			const frag = document.createDocumentFragment();
-			let sexTarget = 0;
+			let sexTarget = "";
 			t = [];
 
 			if (V.PC.dick !== 0) {
@@ -141,12 +141,12 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					 t.push(`They always spare at least one hand for your cunt, despite your thrusting.`);
 				}
 				t.push(`When you climax, they do, too, one after the other. They quickly switch mouth positions and suck you back to full mast so you can enjoy your shower.`);
-				seX(V.PC, "penetrative", bedSlaves[0], "oral");
-				seX(V.PC, "penetrative", bedSlaves[1], "oral");
+				seX(bedSlaves[0], "oral", V.PC, "penetrative");
+				seX(bedSlaves[1], "oral", V.PC, "penetrative");
 			} else {
 				t.push(`You reach down and run a possessive hand across each slave's scalp, neck, and back, eliciting shivers. Then, you gently hook them under the armpits and pull them up a bit, without breaking their lip locks with your nipples, or forcing them to stop playing with your cunt. Each slave ends curled up, mostly face-down, with their mouths still sucking on your ${V.PC.boobs >= 300 ? "boobs" : "chest"} and their free hands trapped between their legs. They get the message and begin to look after themselves, too; their resultant moaning against your nipples grows when you reach down and start teasing their butts. The three of you climax more or less together, and you bounce up with undiminished arousal to enjoy your shower.`);
-				seX(V.PC, "vaginal", bedSlaves[0], "oral");
-				seX(V.PC, "vaginal", bedSlaves[1], "oral");
+				seX(bedSlaves[0], "oral", V.PC, "vaginal");
+				seX(bedSlaves[1], "oral", V.PC, "vaginal");
 			}
 			App.Events.addParagraph(frag, t);
 
@@ -217,15 +217,15 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					sexTarget = "penetrative";
 					if (V.PC.vagina > 0) {
 						t.push(`hard, slip ${his2} dick into your pussy, and ride ${him3}`);
-						seX(V.PC, "vaginal", bedSlaves[2], "penetrative");
+						seX(bedSlaves[2], "penetrative", V.PC, "vaginal");
 						if (canImpreg(V.PC, bedSlaves[2])) {
-							knockMeUp(V.PC, 5, 0, false);
+							knockMeUp(V.PC, 5, 0, 0);
 						}
 					} else {
 						t.push(`hard, slip ${his2} dick up your ass, and ride ${him3}`);
-						seX(V.PC, "anal", bedSlaves[2], "penetrative");
+						seX(bedSlaves[2], "penetrative", V.PC, "anal");
 						if (canImpreg(V.PC, bedSlaves[2])) {
-							knockMeUp(V.PC, 5, 1, false);
+							knockMeUp(V.PC, 5, 1, 0);
 						}
 					}
 					t.push(`with ${his3} back against the shower`);
@@ -339,7 +339,7 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 				} else {
 					t.push(`dresses your lower half.`);
 				}
-				seX(V.PC, "vaginal", bedSlaves[1], "oral");
+				seX(bedSlaves[1], "oral", V.PC, "vaginal");
 			}
 
 			t.push(`When you finally leave the suite, ${bedSlaves[0].slaveName} and ${bedSlaves[1].slaveName} head into the shower for their turn, while ${bedSlaves[2].slaveName} and ${bedSlaves[3].slaveName} have finished drying each other off so they can`);
@@ -374,10 +374,10 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					t.push(`torment ${his2} flat breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} nipples`);
 				}
 				t.push(`for use as toys, and then gasps as you pinch, squeeze, and twist. You blow your load down ${bedSlaves[0].slaveName}'s throat`);
-				seX(V.PC, "penetrative", bedSlaves[0], "oral");
+				seX(bedSlaves[0], "oral", V.PC, "penetrative");
 			} else {
 				t.push(`You shove ${bedSlaves[0].slaveName} down towards your pussy and grab`);
-				if (bedSlaves[0].hair > 10) {
+				if (bedSlaves[0].hLength > 10) {
 					t.push(`${his} hair.`);
 				} else if (bedSlaves[0].bald === 1) {
 					t.push(`${his} bald head.`);
@@ -392,7 +392,7 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					t.push(`torment ${his2} flat breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} nipples`);
 				}
 				t.push(`for use as toys, and then gasps as you pinch, squeeze, and twist. You climax against ${bedSlaves[0].slaveName}'s face`);
-				seX(V.PC, "vaginal", bedSlaves[0], "oral");
+				seX(bedSlaves[0], "oral", V.PC, "vaginal");
 			}
 			t.push(`and bounce up to fuck bitches in the shower, knocking ${bedSlaves[0].slaveName} aside and sending ${bedSlaves[1].slaveName} sprawling. As you go, you tell them they've got ten minutes to get your clothes laid out and their bodies ready for more. They nod furiously and scramble.`);
 			App.Events.addParagraph(frag, t);
@@ -419,7 +419,7 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					t.push(VCheck.Anal(bedSlaves[2], 1));
 				} else {
 					t.push(`between ${his4} thighs and go to town.`);
-					seX(V.PC, "penetrative", bedSlaves[2], "anal");
+					seX(bedSlaves[2], "anal", V.PC, "penetrative", );
 				}
 				t.push(`${bedSlaves[3].slaveName} does ${his4} best to wash your`);
 				if (V.PC.vagina > -1) {
@@ -436,16 +436,16 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 					t.push(VCheck.Anal(bedSlaves[3], 1));
 				} else {
 					t.push(`between ${his4} legs.`);
-					seX(V.PC, "penetrative", bedSlaves[3], "anal");
+					seX(bedSlaves[3], "anal", V.PC, "penetrative");
 				}
 			} else {
 				t.push(`${He3} does ${his3} best to angle ${his3} hips for you as you`);
 				if (canDoVaginal(bedSlaves[2])) {
 					t.push(`fingerfuck ${him3},`);
-					seX(V.PC, "penetrative", bedSlaves[2], "vaginal");
+					seX(bedSlaves[2], "vaginal", V.PC, "penetrative");
 				} else if (canDoAnal(bedSlaves[2])) {
 					t.push(`fingerfuck ${him3},`);
-					seX(V.PC, "penetrative", bedSlaves[2], "anal");
+					seX(bedSlaves[2], "anal", V.PC, "penetrative");
 				} else {
 					t.push(`molest ${him3},`);
 					noShowerSex++;
@@ -453,10 +453,10 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 				t.push(`forcing complete submission out of the compliant ${girl3}. ${bedSlaves[3].slaveName} does ${his4} best to wash your back, but finds ${himself4} taking ${bedSlaves[2].slaveName}'s place soon enough, smashed into the corner with your fingers`);
 				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
 					t.push(`pistoning in and out of ${his4} holes.`);
-					seX(V.PC, "penetrative", bedSlaves[3], "vaginal");
+					seX(bedSlaves[3], "vaginal", V.PC, "penetrative");
 				} else if (bedSlaves[3].anus > 0 && canDoAnal(bedSlaves[3])) {
 					t.push(`pistoning in and out of ${his4} holes.`);
-					seX(V.PC, "penetrative", bedSlaves[3], "anal");
+					seX(bedSlaves[3], "anal", V.PC, "penetrative");
 				} else {
 					t.push(`running across every ${V.showInches === 2 ? "inch" : "centimeter"} of ${his4} body.`);
 					noShowerSex++;
@@ -473,10 +473,10 @@ App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEven
 				t.push(`and helpfully holds up a strap-on questioningly; you shake your head and point to another, larger one. ${He4} helps you into it, and you ram it up ${his4}`);
 				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
 					t.push(`loosened pussy`);
-					seX(V.PC, "penetrative", bedSlaves[3], "vaginal");
+					seX(bedSlaves[3], "vaginal", V.PC, "penetrative");
 				} else {
 					t.push(`loosened ass`);
-					seX(V.PC, "penetrative", bedSlaves[3], "anal");
+					seX(bedSlaves[3], "anal", V.PC, "penetrative");
 				}
 				t.push(`experimentally, nodding in satisfaction when the big phallus forces a pained gasp out of ${him4}.`);
 			}
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index d815afefa40dbc53070e35444e8e45f9fb825e13..0f0b40753be28fae39ce4cf33abf7cb7e8d79b26 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -104,7 +104,7 @@ globalThis.DefaultRules = (function() {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 * @returns {map}
+	 * @returns {Map}
 	 */
 	function ProcessSlaveRules(slave) {
 		// merge all rules applying on a slave into one big rule
@@ -1942,11 +1942,11 @@ globalThis.DefaultRules = (function() {
 				}
 				return false;
 			};
-			changed |= processReleaseProp('masturbation');
-			changed |= processReleaseProp('partner');
-			changed |= processReleaseProp('family');
-			changed |= processReleaseProp('slaves');
-			changed |= processReleaseProp('master');
+			changed = processReleaseProp('masturbation') || false;
+			changed = processReleaseProp('partner') || false;
+			changed = processReleaseProp('family') || false;
+			changed = processReleaseProp('slaves') || false;
+			changed = processReleaseProp('master') || false;
 			if (changed) {
 				r += `<br>${slave.slaveName}'s release rules have been set to: ${App.Utils.releaseSummaryLong(slave)}.`;
 			}
diff --git a/src/js/pregJS.js b/src/js/pregJS.js
index 6aea68b3cac8c1ed0e5ae2394e3a14021e12b425..f49081b8a30702e4bdaf8cd76b999d850386f372 100644
--- a/src/js/pregJS.js
+++ b/src/js/pregJS.js
@@ -415,7 +415,7 @@ globalThis.setPregType = function(actor) {
 
 /** Attempt to get a slave pregnant
  * Penetrative ability, ability to become pregnant, and canBreed() must be checked outside of this. Designed to assume .eggType === "human".
- * @param {App.Entity.SlaveState} target is the slave to get pregnant. Also accepts the PC.
+ * @param {App.Entity.SlaveState | App.Entity.PlayerState} target is the slave to get pregnant. Also accepts the PC.
  * @param {number} chance is the % chance to conceive.
  * @param {number} hole control's the hole involved (0 - vagina, 1 - ass, 2 - both). .mpreg did this.
  * @param {number} [fatherID] is the ID of her sire or 0 if undefined.
diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js
index fb51221238ea4e33d80418c4393529c8e284554b..8bb727015c2d16c86a35811ad59512f606fa0df8 100644
--- a/src/js/rulesAssistant.js
+++ b/src/js/rulesAssistant.js
@@ -301,6 +301,7 @@ App.RA.newRule = function() {
 			removeLabel: null,
 			skinColor: null,
 			inflationType: null,
+			labelTagsClear: null,
 		};
 	}
 
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index c9fd0f75c18f3817308317d9d7fad3a79c9d44b4..730da4dc67bf0ed0fd240423a4b3c908d20d4cbc 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -66,7 +66,7 @@ globalThis.rulesAssistantOptions = (function() {
 	}
 
 	function rename(container) {
-		let rename = false
+		let rename = false;
 		return () => {
 			if (!rename) {
 				container.appendChild(new RenameField());
@@ -795,15 +795,6 @@ globalThis.rulesAssistantOptions = (function() {
 			const v = this.parse(this.numEditor.value);
 			return v === null ? null : App.RA.makeTarget(this.opSelector.value, v);
 		}
-
-		dataEqual(left, right) {
-			if (left == null && right == null) { return true; }
-			if (left == null || right == null) { return false; }
-			// ignore the operator
-			if(_.isObject(left )) { left = left .val; }
-			if(_.isObject(right)) { right = right.val; }
-			return left === right;
-		}
 	}
 
 	class NumericRangeEditor extends EditorWithShortcuts {
@@ -1345,9 +1336,9 @@ globalThis.rulesAssistantOptions = (function() {
 
 			elem.appendChild(document.createElement("br"));
 
-			const maxlabel = document.createElement("label");
-			maxlabel.innerHTML = "Upper bound: ";
-			elem.appendChild(maxlabel);
+			const maxLabel = document.createElement("label");
+			maxLabel.innerHTML = "Upper bound: ";
+			elem.appendChild(maxLabel);
 
 			const max = document.createElement("input");
 			max.setAttribute("type", "text");
@@ -1357,9 +1348,9 @@ globalThis.rulesAssistantOptions = (function() {
 			this.max = max;
 			elem.appendChild(max);
 
-			const infobar = document.createElement("div");
-			infobar.innerHTML = this.info(data.attribute);
-			elem.appendChild(infobar);
+			const infoBar = document.createElement("div");
+			infoBar.innerHTML = this.info(data.attribute);
+			elem.appendChild(infoBar);
 
 			return elem;
 		}
@@ -1417,9 +1408,9 @@ globalThis.rulesAssistantOptions = (function() {
 			this.input = input;
 			elem.appendChild(input);
 
-			const infobar = document.createElement("div");
-			infobar.innerHTML = this.info(data.attribute);
-			elem.appendChild(infobar);
+			const infoBar = document.createElement("div");
+			infoBar.innerHTML = this.info(data.attribute);
+			elem.appendChild(infoBar);
 
 			return elem;
 		}
@@ -1617,7 +1608,7 @@ globalThis.rulesAssistantOptions = (function() {
 			}
 			this.appendChild(new IntensiveGrowthSwitch());
 			this.appendChild(new GrowthList());
-			this.appendChild(new CurrativesList());
+			this.appendChild(new CurativesList());
 			this.appendChild(new AphrodisiacList());
 			this.appendChild(new ContraceptiveList());
 			this.appendChild(new AbortionList());
@@ -1648,7 +1639,7 @@ globalThis.rulesAssistantOptions = (function() {
 			super("behavior", "Behavior", tabButtons);
 			this.appendChild(new AutomaticAssignmentList());
 			if (V.pit === 1) {
-			this.appendChild(new PitAssignmentList());
+				this.appendChild(new PitAssignmentList());
 			}
 			this.appendChild(new LivingStandardList());
 			this.appendChild(new RestList());
@@ -1793,14 +1784,14 @@ globalThis.rulesAssistantOptions = (function() {
 			];
 			super("Clothes", items);
 
-			const nclothes = isItemAccessible.array(App.Data.slaveWear.niceClothes);
-			nclothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
-			this._nice = new ListSubSection(this, "Nice", nclothes);
+			const nClothes = isItemAccessible.array(App.Data.slaveWear.niceClothes);
+			nClothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
+			this._nice = new ListSubSection(this, "Nice", nClothes);
 
-			const hclothes = isItemAccessible.array(App.Data.slaveWear.harshClothes);
-			hclothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
+			const hClothes = isItemAccessible.array(App.Data.slaveWear.harshClothes);
+			hClothes.sort(function(a, b) { if (a[0] < b[0]) { return -1; } if (a[0] > b[0]) { return 1; } return 0; });
 
-			this._harsh = new ListSubSection(this, "Harsh", hclothes);
+			this._harsh = new ListSubSection(this, "Harsh", hClothes);
 
 			this.setValue(current_rule.set.clothes);
 			this.onchange = (value) => current_rule.set.clothes = value;
@@ -2206,7 +2197,7 @@ globalThis.rulesAssistantOptions = (function() {
 		}
 	}
 
-	class CurrativesList extends ListSelector {
+	class CurativesList extends ListSelector {
 		constructor() {
 			const pairs = [
 				["none", 0],
@@ -3951,7 +3942,7 @@ globalThis.rulesAssistantOptions = (function() {
 		constructor() {
 			const items = [
 				["normal ears", 1],
-				["small eflin ears", 2],
+				["small elfin ears", 2],
 				["long elfin ears", 3],
 				["bovine ears", 4],
 			];