diff --git a/devTools/types/FC/gameState.d.ts b/devTools/types/FC/gameState.d.ts
index 748bce5e5d823197620ee8a2d6a21eae3fea1dad..7226eeb1442ceba8177858fd7c32d68225308b7f 100644
--- a/devTools/types/FC/gameState.d.ts
+++ b/devTools/types/FC/gameState.d.ts
@@ -34,7 +34,7 @@ declare namespace FC {
 		ID?: number;
 		FS: {
 			name: string;
-			race?: FC.Race; 
+			race?: FC.Race;
 			adopted?: number;
 		}
 		/**
@@ -103,7 +103,6 @@ declare namespace FC {
 	interface TemporaryVariablesInTheGameState {
 		gameover?: string;
 		sortQuickList?: string;
-		slaveAfterRA?: SlaveState;
 		/** @deprecated */
 		returnTo: string;
 
diff --git a/js/rulesAssistant/conditionEvaluation.js b/js/rulesAssistant/conditionEvaluation.js
index 3b4e493d3be02e445383bb638640abe472965337..c2c2afca4d6ece627ba74ed9480857c2667875c4 100644
--- a/js/rulesAssistant/conditionEvaluation.js
+++ b/js/rulesAssistant/conditionEvaluation.js
@@ -257,7 +257,7 @@ App.RA.Activation.populateGetters = function() {
 	});
 	gm.addBoolean("isunmodded", {
 		name: "Is Unmodded?", description: "If the slave is (relatively) unmodded.",
-		val: c => SlaveStatsChecker.isModded(c.slave)
+		val: c => SlaveStatsChecker.isUnmodded(c.slave)
 	});
 	gm.addBoolean("canmove", {
 		name: "Can Move?", description: "Can the slave move at all?",
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index d661272f9ebc9389193d576fd44f3db9c3b56848..8daf86d9e8cf24d7956123b175692927de7cb00d 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -141,7 +141,7 @@ App.Update.globalVariables = function(node) {
 	if (V.hostageAnnounced && !V.slaves.find(s => s.origin.includes("You were acquainted with $him before you were an arcology owner") && s.newGamePlus === 0)) {
 		V.rival.hostageState = 1;
 	}
-	V.rival.hostageState = V.rival.hostageState || 0;	
+	V.rival.hostageState = V.rival.hostageState || 0;
 
 	V.rival.state = V.rival.state || 0;
 	V.rival.prosperity = V.rival.prosperity || 0;
@@ -1459,7 +1459,6 @@ App.Update.slaveIndices = function(node) {
 App.Update.slaveRecords = function(node) {
 	const detachedSlaves = [
 		V.hostage,
-		V.slaveAfterRA,
 		V.boomerangSlave,
 		V.traitor,
 		V.shelterSlave
diff --git a/src/endWeek/reports/penthouseReport.js b/src/endWeek/reports/penthouseReport.js
index f2dc91c5624554929312c3bf835cb573c66e2dd7..33a654b76494797f3f4f1b537c3019f1387c3d0d 100644
--- a/src/endWeek/reports/penthouseReport.js
+++ b/src/endWeek/reports/penthouseReport.js
@@ -518,6 +518,19 @@ App.EndWeek.penthouseReport = function() {
 		App.Events.addNode(el, r, "div", "indent");
 		return el;
 
+		/**
+		 * Gives a back a clone with RA applied to it. The original is not modified.
+		 * Call and then check potential change against it to see if the RA would revert it.
+		 *
+		 * @param {FC.SlaveState} slave
+		 * @returns {FC.SlaveState}
+		 */
+		function slaveAfterRA(slave) {
+			const after = clone(slave);
+			DefaultRules(after);
+			return after;
+		}
+
 		function piercingCheck() {
 			let piercingForbidden = 0;
 			if (slave.piercing.ear.weight === 0 && slave.earShape !== "none") {
@@ -526,8 +539,7 @@ App.EndWeek.penthouseReport = function() {
 				} else {
 					slave.piercing.ear.weight = 1;
 				}
-				RulesDeconfliction(slave);
-				if (slave.piercing.ear.weight !== V.slaveAfterRA.piercing.ear.weight) {
+				if (slave.piercing.ear.weight !== slaveAfterRA(slave).piercing.ear.weight) {
 					piercingForbidden = 1;
 					slave.piercing.ear.weight = 0;
 				} else {
@@ -546,8 +558,7 @@ App.EndWeek.penthouseReport = function() {
 				} else {
 					slave.piercing.nose.weight = 1;
 				}
-				RulesDeconfliction(slave);
-				if (slave.piercing.nose.weight !== V.slaveAfterRA.piercing.nose.weight) {
+				if (slave.piercing.nose.weight !== slaveAfterRA(slave).piercing.nose.weight) {
 					piercingForbidden = 1;
 					slave.piercing.nose.weight = 0;
 				} else {
@@ -566,8 +577,7 @@ App.EndWeek.penthouseReport = function() {
 				} else {
 					slave.piercing.eyebrow.weight = 1;
 				}
-				RulesDeconfliction(slave);
-				if (slave.piercing.eyebrow.weight !== V.slaveAfterRA.piercing.eyebrow.weight) {
+				if (slave.piercing.eyebrow.weight !== slaveAfterRA(slave).piercing.eyebrow.weight) {
 					piercingForbidden = 1;
 					slave.piercing.eyebrow.weight = 0;
 				} else {
@@ -586,8 +596,7 @@ App.EndWeek.penthouseReport = function() {
 				} else {
 					slave.piercing.lips.weight = 1;
 				}
-				RulesDeconfliction(slave);
-				if (slave.piercing.lips.weight !== V.slaveAfterRA.piercing.lips.weight) {
+				if (slave.piercing.lips.weight !== slaveAfterRA(slave).piercing.lips.weight) {
 					piercingForbidden = 1;
 					slave.piercing.lips.weight = 0;
 				} else {
@@ -606,8 +615,7 @@ App.EndWeek.penthouseReport = function() {
 				} else {
 					slave.piercing.navel.weight = 1;
 				}
-				RulesDeconfliction(slave);
-				if (slave.piercing.navel.weight !== V.slaveAfterRA.piercing.navel.weight) {
+				if (slave.piercing.navel.weight !== slaveAfterRA(slave).piercing.navel.weight) {
 					piercingForbidden = 1;
 					slave.piercing.navel.weight = 0;
 				} else {
diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js
index edaca0092b6e0e7f584412eddd16181b1f7389d5..1a1c9d315334dad028f42102343a933c030f3235 100644
--- a/src/endWeek/saClothes.js
+++ b/src/endWeek/saClothes.js
@@ -670,7 +670,7 @@ App.SlaveAssignment.clothes = function saClothes(slave) {
 			} else if (slave.bellyPreg >= 1500) {
 				r.push(`The tight corseting has <span class="orange">caused ${him} to miscarry,</span> which <span class="health dec">damages ${his} health.</span>`);
 				healthDamage(slave, 20);
-				if (lastPregRule(slave, V.defaultRules)) {
+				if (rulesDemandContraceptives(slave, V.defaultRules)) {
 					slave.preg = -1;
 				} else {
 					slave.preg = 0;
@@ -1105,7 +1105,7 @@ App.SlaveAssignment.clothes = function saClothes(slave) {
 					if (jsRandom(1, 100) > 50) {
 						r.push(`The dildo penetrating ${his} womb <span class="orange">caused ${him} to miscarry,</span> which <span class="health dec">damages ${his} health.</span>`);
 						healthDamage(slave, 20);
-						if (lastPregRule(slave, V.defaultRules)) {
+						if (rulesDemandContraceptives(slave, V.defaultRules)) {
 							slave.preg = -1;
 						} else {
 							slave.preg = 0;
diff --git a/src/endWeek/saDrugs.js b/src/endWeek/saDrugs.js
index 4d318157ab68b5454414d7fafca66d7f7fa3d7be..6ff47053c6fd702764fbeed5c88a5fc7879ec440 100644
--- a/src/endWeek/saDrugs.js
+++ b/src/endWeek/saDrugs.js
@@ -1572,7 +1572,7 @@ App.SlaveAssignment.drugs = function saDrugs(slave) {
 					healthDamage(slave, (slave.preg + slave.pregType - slave.bellySag));
 					if (slave.health.condition < -90) {
 						r += ` ${His} critically poor health <span class="orange">caused ${him} to miscarry.</span>`;
-						if (lastPregRule(slave, V.defaultRules)) {
+						if (rulesDemandContraceptives(slave, V.defaultRules)) {
 							slave.preg = -1;
 						} else {
 							slave.preg = 0;
diff --git a/src/endWeek/saLongTermEffects.js b/src/endWeek/saLongTermEffects.js
index 4887fe53fe2b55f68fa093d19e8f82724c6b7211..04b70afe184d7369f03873bc0bcf9eb52ac21b0a 100644
--- a/src/endWeek/saLongTermEffects.js
+++ b/src/endWeek/saLongTermEffects.js
@@ -2368,7 +2368,7 @@ App.SlaveAssignment.longTermEffects = function saLongTermEffects(slave) {
 						miscarriage = 1;
 					} else {
 						r.push(`${His} overwhelmed body has <span class="miscarriage">forced ${him} to miscarry,</span> possibly saving ${his} life.`);
-						slave.preg = (lastPregRule(slave, V.defaultRules)) ? -1 : 0;
+						slave.preg = rulesDemandContraceptives(slave, V.defaultRules) ? -1 : 0;
 						if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken") {
 							if (slave.sexualFlaw === "breeder") {
 								r.push(`${He} is <span class="devotion dec">filled with violent, all-consuming hatred</span> at ${himself} for failing to carry to term and you for allowing this to happen.`);
diff --git a/src/facilities/surgery/remoteSurgery.js b/src/facilities/surgery/remoteSurgery.js
index a6b6cde22d1fcb3eb289ec9468022a0d7ee39656..eff295b49c18c09f910cd3111e6f1ecb9905cf6d 100644
--- a/src/facilities/surgery/remoteSurgery.js
+++ b/src/facilities/surgery/remoteSurgery.js
@@ -29,20 +29,9 @@ App.UI.SlaveInteract.remoteSurgery = function(slave) {
 		App.UI.DOM.appendNewElement("p", el, `${His} indenture forbids elective surgery`, ["yellow", "note"]);
 	}
 
-	const tabBar = new App.UI.Tabs.TabBar("RemoteSurgery");
-	const f = new DocumentFragment();
-	App.Events.drawEventArt(f, slave);
-	tabBar.customNode = f;
-
-	tabBar.addTab("Hair and Face", "hairAndFace", App.UI.surgeryPassageHairAndFace(slave, refresh));
-	tabBar.addTab("Upper", "upper", App.UI.surgeryPassageUpper(slave, refresh));
-	tabBar.addTab("Lower", "lower", App.UI.surgeryPassageLower(slave, refresh));
-	tabBar.addTab("Structural", "structural", App.UI.surgeryPassageStructural(slave, refresh));
-	tabBar.addTab("Exotic", "exotic", App.UI.surgeryPassageExotic(slave, refresh));
-	if (V.seeExtreme) {
-		tabBar.addTab("Extreme", "extreme", App.UI.surgeryPassageExtreme(slave, refresh));
-	}
-	el.append(tabBar.render());
+	const tabsDiv = document.createElement("div");
+	tabsDiv.append(renderTabs());
+	el.append(tabsDiv);
 
 	return el;
 
@@ -69,8 +58,29 @@ App.UI.SlaveInteract.remoteSurgery = function(slave) {
 		return r;
 	}
 
+	/**
+	 * @returns {DocumentFragment}
+	 */
+	function renderTabs() {
+		const tabBar = new App.UI.Tabs.TabBar("RemoteSurgery");
+		const f = new DocumentFragment();
+		App.Events.drawEventArt(f, slave);
+		tabBar.customNode = f;
+
+		tabBar.addTab("Hair and Face", "hairAndFace", App.UI.surgeryPassageHairAndFace(slave, refresh));
+		tabBar.addTab("Upper", "upper", App.UI.surgeryPassageUpper(slave, refresh));
+		tabBar.addTab("Lower", "lower", App.UI.surgeryPassageLower(slave, refresh));
+		tabBar.addTab("Structural", "structural", App.UI.surgeryPassageStructural(slave, refresh));
+		tabBar.addTab("Exotic", "exotic", App.UI.surgeryPassageExotic(slave, refresh));
+		if (V.seeExtreme) {
+			tabBar.addTab("Extreme", "extreme", App.UI.surgeryPassageExtreme(slave, refresh));
+		}
+		return tabBar.render();
+	}
+
 	function refresh() {
 		$(introP).empty();
 		App.Events.addNode(introP, intro());
+		App.UI.DOM.replace(tabsDiv, renderTabs());
 	}
 };
diff --git a/src/facilities/surgery/surgeryPassageExotic.js b/src/facilities/surgery/surgeryPassageExotic.js
index 2d4f38eb683fbbbf7f46992cf66d3884366401f5..a2f853ad513d1ee847d05fc7f5f68477edcc51f7 100644
--- a/src/facilities/surgery/surgeryPassageExotic.js
+++ b/src/facilities/surgery/surgeryPassageExotic.js
@@ -1,12 +1,12 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {()=>void} refreshParent
+ * @param {()=>void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
 
-App.UI.surgeryPassageExotic = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageExotic = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -253,11 +253,5 @@ App.UI.surgeryPassageExotic = function(slave, refreshParent, cheat = false) {
 			App.UI.DOM.appendNewElement("div", el, App.UI.DOM.generateLinksStrip(linkArray), "choices");
 			return el;
 		}
-
-		function refresh() {
-			jQuery(container).empty().append(content());
-			App.Events.refreshEventArt(slave);
-			refreshParent();
-		}
 	}
 };
diff --git a/src/facilities/surgery/surgeryPassageExtreme.js b/src/facilities/surgery/surgeryPassageExtreme.js
index 899c19869bf118d3c0f9ded6b0c4e74da6c53a79..fbee2aeb4083f48b16ebe8a500d5ef91f1d117e9 100644
--- a/src/facilities/surgery/surgeryPassageExtreme.js
+++ b/src/facilities/surgery/surgeryPassageExtreme.js
@@ -1,11 +1,11 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {()=>void} refreshParent
+ * @param {()=>void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
-App.UI.surgeryPassageExtreme = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageExtreme = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -66,10 +66,4 @@ App.UI.surgeryPassageExtreme = function(slave, refreshParent, cheat = false) {
 			return el;
 		}
 	}
-
-	function refresh() {
-		jQuery(container).empty().append(content());
-		App.Events.refreshEventArt(slave);
-		refreshParent();
-	}
 };
diff --git a/src/facilities/surgery/surgeryPassageFaceAndHair.js b/src/facilities/surgery/surgeryPassageFaceAndHair.js
index ffe425dfae92be8ac31495c5557e25616daad15c..b5cd4822cb6808f556e277446c6b2fee1187f64e 100644
--- a/src/facilities/surgery/surgeryPassageFaceAndHair.js
+++ b/src/facilities/surgery/surgeryPassageFaceAndHair.js
@@ -1,12 +1,12 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {function():void} refreshParent
+ * @param {function():void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
 
-App.UI.surgeryPassageHairAndFace = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageHairAndFace = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -846,10 +846,4 @@ App.UI.surgeryPassageHairAndFace = function(slave, refreshParent, cheat = false)
 			return el;
 		}
 	}
-
-	function refresh() {
-		jQuery(container).empty().append(content());
-		App.Events.refreshEventArt(slave);
-		refreshParent();
-	}
 };
diff --git a/src/facilities/surgery/surgeryPassageLower.js b/src/facilities/surgery/surgeryPassageLower.js
index 84266906226a03e80093651930429f702a7c710e..7250ecafaa210c6fc98b8588c94d753ecce2ad48 100644
--- a/src/facilities/surgery/surgeryPassageLower.js
+++ b/src/facilities/surgery/surgeryPassageLower.js
@@ -1,11 +1,11 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {()=>void} refreshParent
+ * @param {()=>void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
-App.UI.surgeryPassageLower = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageLower = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -664,10 +664,4 @@ App.UI.surgeryPassageLower = function(slave, refreshParent, cheat = false) {
 			return el;
 		}
 	}
-
-	function refresh() {
-		jQuery(container).empty().append(content());
-		App.Events.refreshEventArt(slave);
-		refreshParent();
-	}
 };
diff --git a/src/facilities/surgery/surgeryPassageStructural.js b/src/facilities/surgery/surgeryPassageStructural.js
index 9abd966edd24f1441a85d66d0b0f660077a5f52b..18e97fdfbe237501650fc9af8b93623112ae049c 100644
--- a/src/facilities/surgery/surgeryPassageStructural.js
+++ b/src/facilities/surgery/surgeryPassageStructural.js
@@ -1,12 +1,12 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {function():void} refreshParent
+ * @param {function():void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
 
-App.UI.surgeryPassageStructural = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageStructural = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -422,10 +422,4 @@ App.UI.surgeryPassageStructural = function(slave, refreshParent, cheat = false)
 			return el;
 		}
 	}
-
-	function refresh() {
-		jQuery(container).empty().append(content());
-		App.Events.refreshEventArt(slave);
-		refreshParent();
-	}
 };
diff --git a/src/facilities/surgery/surgeryPassageUpper.js b/src/facilities/surgery/surgeryPassageUpper.js
index 6f8bbec972dc53a5e821306d247661d8c6177033..811c0249da2e76a40fab53a3ada312314ba23a07 100644
--- a/src/facilities/surgery/surgeryPassageUpper.js
+++ b/src/facilities/surgery/surgeryPassageUpper.js
@@ -1,11 +1,11 @@
 /**
  * UI for performing surgery. Refreshes without refreshing the passage.
  * @param {App.Entity.SlaveState} slave
- * @param {()=>void} refreshParent
+ * @param {()=>void} refresh
  * @param {boolean} [cheat=false]
  * @returns {HTMLElement}
  */
-App.UI.surgeryPassageUpper = function(slave, refreshParent, cheat = false) {
+App.UI.surgeryPassageUpper = function(slave, refresh, cheat = false) {
 	const container = document.createElement("span");
 	container.append(content());
 	return container;
@@ -564,10 +564,4 @@ App.UI.surgeryPassageUpper = function(slave, refreshParent, cheat = false) {
 			return el;
 		}
 	}
-
-	function refresh() {
-		jQuery(container).empty().append(content());
-		App.Events.refreshEventArt(slave);
-		refreshParent();
-	}
 };
diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js
index 92f422a9a0f3d135a5e5ba67d946e034d70d5f80..5a6583e19a1b76a369589b2597495138eea550f9 100644
--- a/src/js/DefaultRules.js
+++ b/src/js/DefaultRules.js
@@ -1137,7 +1137,7 @@ globalThis.DefaultRules = (function() {
 						}
 					}
 
-					if (lastPregRule(slave, V.defaultRules)) {
+					if (rulesDemandContraceptives(slave, V.defaultRules)) {
 						slave.preg = -1;
 					} else {
 						slave.preg = 0;
@@ -1510,7 +1510,7 @@ globalThis.DefaultRules = (function() {
 					break;
 
 				case "appetite suppressors":
-					if (V.arcologies[0].FSSlimnessEnthusiastResearch !== 1 || slave.weight > -95) {
+					if (V.arcologies[0].FSSlimnessEnthusiastResearch !== 1 || slave.weight <= -95) {
 						flag = false;
 					}
 					break;
@@ -1621,6 +1621,7 @@ globalThis.DefaultRules = (function() {
 					}
 				} else if (["restricted", "fattening"].includes(slave.diet)) {
 					r += `<br>${slave.slaveName} is at the target weight, so ${his} diet has been normalized.`;
+					slave.diet = "healthy";
 					dietPills(slave);
 					muscleRule(slave, rule);
 				} else {
@@ -1641,6 +1642,7 @@ globalThis.DefaultRules = (function() {
 					}
 				} else if (["restricted", "fattening"].includes(slave.diet)) {
 					r += `<br>${slave.slaveName} is at the target weight, so ${his} diet has been normalized.`;
+					slave.diet = "healthy";
 					dietPills(slave);
 					muscleRule(slave, rule);
 				} else {
@@ -1760,7 +1762,7 @@ globalThis.DefaultRules = (function() {
 				r += `<br>${slave.slaveName} no longer needs to lose weight, so ${he}'s no longer being given appetite suppressors.`;
 			} else if (slave.diet === "restricted" && V.arcologies[0].FSSlimnessEnthusiastResearch === 1 && slave.drugs === "no drugs") {
 				slave.drugs = "appetite suppressors";
-				r += `<br>${slave.slaveName} needs to lose weight so ${he} will be given weight loss pills.`;
+				r += `<br>${slave.slaveName} needs to lose weight, so ${he} will be given weight loss pills.`;
 			}
 		}
 	}
diff --git a/src/js/birth/birth.js b/src/js/birth/birth.js
index 2843267c2dd1ebbe454c10ba895d2ee5ae2c8178..a72cb6f6c69ab1757c1505142ac97f65d3818bd4 100644
--- a/src/js/birth/birth.js
+++ b/src/js/birth/birth.js
@@ -941,7 +941,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 				}
 				healthDamage(slave, 80);
 			} else {
-				if (lastPregRule(slave, V.defaultRules)) {
+				if (rulesDemandContraceptives(slave, V.defaultRules)) {
 					slave.preg = -1;
 				} else {
 					slave.preg = 0;
@@ -2056,8 +2056,7 @@ globalThis.birth = function(slave, {birthStorm = false, cSection = false, artRen
 			slave.preg = WombMaxPreg(slave); // now we use most advanced remained fetus as base.
 			slave.pregSource = slave.womb[0].fatherID; // in such case it's good chance that there is different father also.
 		} else {
-			const tmp = lastPregRule(slave, V.defaultRules);
-			if ((!assignmentVisible(slave)) && (tmp !== null)) {
+			if (!assignmentVisible(slave) && rulesDemandContraceptives(slave, V.defaultRules)) {
 				slave.preg = -1;
 			} else {
 				slave.preg = 0;
diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js
index 8c41de45b58d4b562c664f84536b179cd08893d6..66be45512f37b12852935668bed9da7d7b17b256 100644
--- a/src/js/rulesAssistant.js
+++ b/src/js/rulesAssistant.js
@@ -47,14 +47,21 @@ globalThis.hasEyeColorRule = function(slave, rules) {
 };
 
 /**
- * return if a rule is applied on a slave
+ * True, if the slave should be on contraceptives based on applied rules.
+ *
  * @param {App.Entity.SlaveState} slave
  * @param {FC.RA.Rule[]} rules
  * @returns {boolean}
  */
-globalThis.lastPregRule = function(slave, rules) {
-	return rules.some(rule =>
-		ruleApplied(slave, rule) && rule.set.preg === -1);
+globalThis.rulesDemandContraceptives = function(slave, rules) {
+	// iterate over rules backwards, as the last rule has the highest priority
+	for (let i = 0; i < rules.length; i++) {
+		const rule = rules[rules.length - i - 1];
+		if (ruleApplied(slave, rule) && rule.set.preg != null) {
+			return rule.set.preg;
+		}
+	}
+	return false;
 };
 
 /**
@@ -98,6 +105,7 @@ globalThis.RAFacilityRemove = function(slave, rule) {
 		r += `<br>${slave.slaveName} has been removed from ${facilityName} and has been assigned to ${rule.removalAssignment}.`;
 		assignJob(slave, rule.removalAssignment);
 	}
+	return r;
 };
 
 /**
@@ -162,7 +170,6 @@ App.RA.newRule = function() {
 			ID: id,
 			name: `Rule ${id}`,
 			condition: emptyConditions(),
-			// TODO: rename properties in snake_case to camelCase?
 			set: emptySetters()
 		};
 	}
@@ -262,6 +269,7 @@ App.RA.newRule = function() {
 			preg: null,
 			abortion: null,
 			growth: emptyGrowth(),
+			// TODO: rename snake_case to camelCase?
 			// eslint-disable-next-line camelcase
 			hyper_drugs: 0,
 			aphrodisiacs: null,
@@ -357,21 +365,10 @@ App.RA.newRule = function() {
  */
 globalThis.emptyDefaultRule = App.RA.newRule.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 V.slaveAfterRA to see if the RA would revert it.
- * @param {App.Entity.SlaveState} slave
- */
-globalThis.RulesDeconfliction = function(slave) {
-	const before = clone(slave);
-	DefaultRules(slave);
-	V.slaveAfterRA = clone(slave);
-	slave = before;
-};
 
 /**
  * Creates RA target object used in rules for body properties
- * @param {string} condition comparison condition. One of '==', '>=', '<=', '>', '<'
+ * @param {"=="|">="|"<="|">"|"<"} condition comparison condition.
  * @param {number} val target value
  * @returns {FC.RA.NumericTarget}
  */
diff --git a/src/npc/interaction/passage/abort.js b/src/npc/interaction/passage/abort.js
index 9e47f9de3650530fa297ce3d4973e1bd1668c961..11727043ce376ba38594f95d3ae0c05eabc6d211 100644
--- a/src/npc/interaction/passage/abort.js
+++ b/src/npc/interaction/passage/abort.js
@@ -55,7 +55,7 @@ App.Interact.abort = function(slave) {
 		cashX(forceNeg(V.modCost), "slaveMod", slave);
 	}
 
-	slave.preg = (lastPregRule(slave, V.defaultRules)) ? -1 : 0;
+	slave.preg = rulesDemandContraceptives(slave, V.defaultRules) ? -1 : 0;
 
 	TerminatePregnancy(slave);
 	actX(slave, "abortions");