diff --git a/src/js/DefaultRules.tw b/src/js/DefaultRules.tw
index e79c9e1e81d8c89518b62d22a616455ac12bb487..a0d2a03356e63cf3a0c6f746ee34abc206e0b79e 100644
--- a/src/js/DefaultRules.tw
+++ b/src/js/DefaultRules.tw
@@ -1207,6 +1207,7 @@ window.DefaultRules = (function() {
 			} else if ((slave.boobs >= 1600) && (slave.muscles > 5) && (slave.diet == "muscle building") && ((rule.muscles == "no default setting") || (rule.muscles === 0))) {
 			*/
 			if (rule.diet === "healthy" && slave.diet !== "healthy") {
+				slave.diet = "healthy";
 				r += `<br>${slave.slaveName} has been assigned to a healthy diet.`;
 			} else if ((slave.boobs >= 1600) && (slave.muscles > 5) && (slave.diet == "muscle building") && ((rule.muscles == "no default setting") || (rule.muscles === 0))) {
 				slave.diet = "healthy";
@@ -1218,7 +1219,7 @@ window.DefaultRules = (function() {
 				}
 			} else {
 				if (!(isNaN(rule.diet))) {
-					if ((slave.weight > rule.diet)) {
+					if ((slave.weight - rule.diet) > 5) {
 						if ((slave.diet !== "restricted")) {
 							slave.diet = "restricted";
 							r += `<br>${slave.slaveName} is too fat so her diet has been set to restricted.`;
@@ -1227,7 +1228,7 @@ window.DefaultRules = (function() {
 							slave.drugs = "appetite suppressors";
 							r += `<br>${slave.slaveName} is too fat so she will be given weight loss pills.`;
 						}
-					} else if ((slave.weight < rule.diet)) {
+					} else if ((slave.weight - rule.diet) < -5) {
 						if ((slave.diet !== "fattening")) {
 							slave.diet = "fattening";
 							r += `<br>${slave.slaveName} is too skinny so her diet has been set to fattening.`;
diff --git a/src/js/rulesAssistant.tw b/src/js/rulesAssistant.tw
index 9dd70b1a0393c4129f9b76c4c2940d8b05d6b352..b0682e7bf23b78a38e23589e55bd12f7750e6135 100644
--- a/src/js/rulesAssistant.tw
+++ b/src/js/rulesAssistant.tw
@@ -60,7 +60,7 @@ window.CheckAutoRulesActivate = function CheckAutoRulesActivate(slave) {
 		if (applies) {
 			if (!ruleApplied(slave, rule)) {
 				slave.currentRules.push(rule.ID);
-				r += `<br><span class="tan">Rule ${rule.ID} (${rule.name}) now applies to ${slave.slaveName}, who is assigned to ${slave.assignment}</span>\n`;
+				r += `<br><span class="tan">Rule "${rule.name}" now applies to ${slave.slaveName}, who is assigned to ${slave.assignment}.</span>\n`;
 			}
 		} else if (ruleApplied(slave, rule))
 			r += RARemoveRule(slave, rule);
@@ -306,6 +306,7 @@ window.emptyDefaultRule = function emptyDefaultRule() {
 			surgery_holes: "no default setting",
 			surgery_hair: "no default setting",
 			surgery_bodyhair: "no default setting",
+			surgery_vasectomy: "no default setting",
 			underArmHColor: "no default setting",
 			underArmHStyle: "no default setting",
 			drug: "no default setting",
@@ -317,3 +318,14 @@ window.emptyDefaultRule = function emptyDefaultRule() {
 	};
 	return rule;
 };
+
+
+// Saves the slave, silently fires the RA, saves the slave's after-RA state, and then reverts the slave.
+// Call and then check potential change against $slaveAfterRA to see if the RA would revert it.
+window.RulesDeconfliction = function RulesDeconfliction(slave) {
+	const before = clone(slave);
+	CheckAutoRulesActivate(slave);
+	DefaultRules(slave);
+	V.slaveAfterRA = clone(slave);
+	slave = before;
+}
diff --git a/src/js/rulesAssistantOptions.tw b/src/js/rulesAssistantOptions.tw
index a0b75c265a26c668903f41ebf4ffad41869b4a39..942c29a9281383fda36daedd28c5222ee13520f2 100644
--- a/src/js/rulesAssistantOptions.tw
+++ b/src/js/rulesAssistantOptions.tw
@@ -369,7 +369,10 @@ window.rulesAssistantOptions = (function() {
 		}
 
 		render() {
+			let element = document.getElementById("importfield");
+			if (element !== null) { return element; }
 			const container = document.createElement("div");
+			container.id = "importfield";
 			const textarea = document.createElement("textarea");
 			textarea.placeholder = "Paste your rule here";
 			container.appendChild(textarea);
@@ -386,8 +389,10 @@ window.rulesAssistantOptions = (function() {
 			const text = this.textarea.value;
 			try {
 				const rule = JSON.parse(text);
-				if (!rule.ID) rule.ID = generateNewID();
-				V.defaultRules.push(rule);
+				if (rule instanceof Array)
+					rule.forEach(r => V.defaultRules.push(r))
+				else
+					V.defaultRules.push(rule);
 				reload(this.root);
 			} catch (e) {
 				alert("Couldn't import that rule:\n" + e.message);
@@ -456,7 +461,7 @@ window.rulesAssistantOptions = (function() {
 			this.appendChild(new OptionsItem("Rename", () => this.appendChild(new RenameField(root))));
 			this.appendChild(new OptionsItem("Export this rule", () => this.appendChild(new ExportField(current_rule))));
 			this.appendChild(new OptionsItem("Export all rules", () => this.appendChild(new ExportField(...V.defaultRules))));
-			this.appendChild(new OptionsItem("Import a rule", () => this.appendChild(new NewRuleField(root))));
+			this.appendChild(new OptionsItem("Import rule(s)", () => this.appendChild(new NewRuleField(root))));
 		}
 	}
 
@@ -487,10 +492,10 @@ window.rulesAssistantOptions = (function() {
 		render(...args) {
 			let element = document.getElementById("exportfield");
 			if (element === null) {
-				element = document.getElementById("exportfield") || document.createElement("textarea");
+				element = document.createElement("textarea");
 				element.id = "exportfield";
 			}
-			element.value = args.map(i => JSON.stringify(i, null, 2)).join("\n\n");
+			element.value = JSON.stringify(args, null, 2);
 			return element;
 		}
 	}
@@ -530,6 +535,8 @@ window.rulesAssistantOptions = (function() {
 				["Education", "intelligenceImplant"],
 				["Intelligence", "intelligence"],
 				["Fetish", "fetish"],
+				["Accent", "accent"],
+				["Waist", "waist"],
 			];
 			this.fnlist = new List("Activation function", items);
 			this.fnlist.setValue(current_rule.condition.function === "between" ? current_rule.condition.data.attribute : current_rule.condition.function);
@@ -571,6 +578,8 @@ window.rulesAssistantOptions = (function() {
 				"belly",
 				"intelligenceImplant",
 				"intelligence",
+				"accent",
+				"waist",
 			].includes(attribute);
 		}
 
@@ -708,6 +717,8 @@ window.rulesAssistantOptions = (function() {
 				"belly": "Volume in CCs, any source",
 				"intelligenceImplant": "Education level. 0: uneducated, 1: educated, (0, 1): incomplete education.",
 				"intelligence": "From moronic to brilliant: [-3, 3]",
+				"accent": "No accent: 0, Nice accent: 1, Bad accent: 2, Can't speak language: 3 and above",
+				"waist": "Masculine waist: (95, ∞), Ugly waist: (40, 95], Unattractive waist: (10, 40], Average waist: [-10, 10], Feminine waist: [-40, -10), Wasp waist: [-95, 40), Absurdly narrow: (-∞, -95)",
 			}[attribute] || " ");
 		}
 	}
@@ -998,8 +1009,10 @@ window.rulesAssistantOptions = (function() {
 			super("Autosurgery Settings", true);
 			this.appendChild(new VisionSurgeryList());
 			this.appendChild(new LactationSurgeryList());
-			if (V.seeDicks || V.makeDicks)
+			if (V.seeDicks || V.makeDicks) {
 				this.appendChild(new SemenSurgeryList());
+				this.appendChild(new VasectomyList());
+			}
 			this.appendChild(new CosmeticSurgeryList());
 			this.appendChild(new LipSurgeryList());
 			this.appendChild(new ButtSurgeryList());
@@ -2895,6 +2908,19 @@ window.rulesAssistantOptions = (function() {
 		}
 	}
 
+	class VasectomyList extends List {
+		constructor() {
+			const items = [
+				["no default setting"],
+				["apply vasectomy", true],
+				["undo vasectomy", false],
+			];
+			super("Apply or undo vasectomy for slaves with testicles", items);
+			this.setValue(current_rule.set.surgery_vasectomy);
+			this.onchange = (value) => current_rule.set.surgery_vasectomy = value;
+		}
+	}
+
 	class CosmeticSurgeryList extends List {
 		constructor() {
 			const items = [
diff --git a/src/js/rulesAutosurgery.tw b/src/js/rulesAutosurgery.tw
index 3a8833145229fd9640e04e7748b436ee849e6744..6a3d7c68e769f60223f4a9db0393aa05110a6bb4 100644
--- a/src/js/rulesAutosurgery.tw
+++ b/src/js/rulesAutosurgery.tw
@@ -512,6 +512,24 @@ window.rulesAutosurgery = (function() {
 			slave.preg = 0;
 			slave.bellyImplant = -1;
 			V.cash -= V.surgeryCost;
+		} else if (slave.balls > 0 && slave.vasectomy === 0 && thisSurgery.vasectomy === true) {
+			surgeries.push("vasectomy");
+			V.surgeryType = "vasectomy";
+			if (V.PC.medicine >= 100)
+				slave.health -= 5;
+			else
+				slave.health -= 10;
+			slave.vasectomy = 1
+			V.cash -= V.surgeryCost;
+		} else if (slave.balls > 0 && slave.vasectomy === 1 && thisSurgery.vasectomy === false) {
+			surgery.push("undo vasectomy");
+			V.surgeryType = "vasectomy undo";
+			if (V.PC.medicine >= 100)
+				slave.health -=5;
+			else
+				slave.health -= 10;
+			slave.vasectomy = 0;
+			V.cash -= V.surgeryCost;
 		}
 	}
 
diff --git a/src/uncategorized/hgApplication.tw b/src/uncategorized/hgApplication.tw
index eff80d115733fe4046dc67f3fa71300c3ee01381..b0a26d1ff6f84ff4f4ea3d11a3c028e07661948c 100644
--- a/src/uncategorized/hgApplication.tw
+++ b/src/uncategorized/hgApplication.tw
@@ -324,7 +324,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $
 	<<for _i = 0; _i < 1; _i++>>
 		<<if $activeSlave.earPiercing == 0>>
 			<<set $activeSlave.earPiercing = 1>>
-			<<RulesDeconfliction $activeSlave>>
+			<<run RulesDeconfliction($activeSlave)>>
 			<<if $activeSlave.earPiercing != $slaveAfterRA.earPiercing>>
 				<<set _piercingForbidden = 1, $activeSlave.earPiercing = 0>>
 			<<else>>
@@ -335,7 +335,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $
 		<</if>>
 		<<if $activeSlave.nosePiercing == 0>>
 			<<set $activeSlave.nosePiercing = 1>>
-			<<RulesDeconfliction $activeSlave>>
+			<<run RulesDeconfliction($activeSlave)>>
 			<<if $activeSlave.nosePiercing != $slaveAfterRA.nosePiercing>>
 				<<set _piercingForbidden = 1, $activeSlave.nosePiercing = 0>>
 			<<else>>
@@ -346,7 +346,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $
 		<</if>>
 		<<if $activeSlave.eyebrowPiercing == 0>>
 			<<set $activeSlave.eyebrowPiercing = 1>>
-			<<RulesDeconfliction $activeSlave>>
+			<<run RulesDeconfliction($activeSlave)>>
 			<<if $activeSlave.eyebrowPiercing != $slaveAfterRA.eyebrowPiercing>>
 				<<set _piercingForbidden = 1, $activeSlave.eyebrowPiercing = 0>>
 			<<else>>
@@ -357,7 +357,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $
 		<</if>>
 		<<if $activeSlave.lipsPiercing == 0>>
 			<<set $activeSlave.lipsPiercing = 1>>
-			<<RulesDeconfliction $activeSlave>>
+			<<run RulesDeconfliction($activeSlave)>>
 			<<if $activeSlave.lipsPiercing != $slaveAfterRA.lipsPiercing>>
 				<<set _piercingForbidden = 1, $activeSlave.lipsPiercing = 0>>
 			<<else>>
@@ -368,7 +368,7 @@ In spare moments she teaches $activeSlave.slaveName how to prostitute herself. $
 		<</if>>
 		<<if $activeSlave.navelPiercing == 0>>
 			<<set $activeSlave.navelPiercing = 1>>
-			<<RulesDeconfliction $activeSlave>>
+			<<run RulesDeconfliction($activeSlave)>>
 			<<if $activeSlave.navelPiercing != $slaveAfterRA.navelPiercing>>
 				<<set _piercingForbidden = 1, $activeSlave.navelPiercing = 0>>
 			<<else>>