diff --git a/src/Corporation/manageCorporation.js b/src/Corporation/manageCorporation.js
index 4b41033a20d1291e7873f7b636cadcd706904932..7a4bc3ec943ec2b52f20625c9ea4042cab38e685 100644
--- a/src/Corporation/manageCorporation.js
+++ b/src/Corporation/manageCorporation.js
@@ -1052,7 +1052,7 @@ App.Corporate.manage = function() {
 				p.append(div);
 			}
 
-			if (V.corp.SpecGender !== undefined) {
+			if (V.corp.SpecGender) {
 				const r = [];
 				r.push("The corporation trains slaves with");
 				if (V.corp.SpecGender === 1) {
@@ -1149,7 +1149,7 @@ App.Corporate.manage = function() {
 				p.append(div);
 			}
 
-			if (V.corp.SpecTrust !== undefined) {
+			if (V.corp.SpecTrust) {
 				const r = [];
 				const links = [];
 				r.push("The corporation is breaking slaves with");
@@ -1211,7 +1211,7 @@ App.Corporate.manage = function() {
 				App.Events.addNode(p, r, "div");
 			}
 
-			if (V.corp.SpecWeight !== undefined) {
+			if (V.corp.SpecWeight) {
 				const r = [];
 				const links = [];
 				r.push("The corporation");
@@ -1293,7 +1293,7 @@ App.Corporate.manage = function() {
 				App.Events.addNode(p, r, "div");
 			}
 
-			if (V.corp.SpecMuscle !== undefined) {
+			if (V.corp.SpecMuscle) {
 				const r = [];
 				r.push("The corporation");
 				const links = [];
@@ -1378,7 +1378,7 @@ App.Corporate.manage = function() {
 				App.Events.addNode(p, r, "div");
 			}
 
-			if (V.corp.SpecDevotion !== undefined) {
+			if (V.corp.SpecDevotion) {
 				const r = [];
 				const links = [];
 				let tokenGain = 1;
@@ -1454,7 +1454,7 @@ App.Corporate.manage = function() {
 				p.append(div);
 			}
 
-			if (V.corp.SpecAge !== undefined) {
+			if (V.corp.SpecAge) {
 				let div = document.createElement("div");
 				if (V.corp.SpecAge === 1) {
 					div.append(`The corporation focuses on young slaves.`);
@@ -1770,7 +1770,7 @@ App.Corporate.manage = function() {
 				}
 			}
 
-			if (V.corp.SpecInjection !== undefined) {
+			if (V.corp.SpecInjection) {
 				const r = [];
 				const links = [];
 				let tokenGain = 1;
@@ -1880,7 +1880,7 @@ App.Corporate.manage = function() {
 				App.Events.addNode(p, r, "div");
 			}
 
-			if (V.corp.SpecHormones !== undefined) {
+			if (V.corp.SpecHormones) {
 				const r = [];
 				const links = [];
 				if (V.corp.SpecHormones === 1) {
@@ -1927,7 +1927,7 @@ App.Corporate.manage = function() {
 				p.append(div);
 			}
 
-			if (V.corp.SpecMilk !== undefined) {
+			if (V.corp.SpecMilk) {
 				const r = [];
 				const links = [];
 				if (V.corp.SpecMilk === 1) {
diff --git a/src/Mods/SecExp/events/attackOptions.js b/src/Mods/SecExp/events/attackOptions.js
index 02487d4adcee211b76912029e17e8196db75d984..5dba892c3bb86be316b2f83c608c8188d88f440e 100644
--- a/src/Mods/SecExp/events/attackOptions.js
+++ b/src/Mods/SecExp/events/attackOptions.js
@@ -10,6 +10,7 @@ App.Events.attackOptions = class attackOptions extends App.Events.BaseEvent {
 	execute(node) {
 		/** Display's the deploy menu for the unit.
 		 * @param {FC.SecExp.PlayerHumanUnitData} [input] the unit to be checked.
+		 * @param {string} [type] the class of unit to be checked.
 		 * @returns {HTMLDivElement}
 		 */
 		const deployMenu = function(input, type) {
diff --git a/src/Mods/SecExp/events/attackReport.js b/src/Mods/SecExp/events/attackReport.js
index baa42b40e22da087c7904e813c33b2db471edcc3..eb580efad45a678de070225e81cc14d784321ad2 100644
--- a/src/Mods/SecExp/events/attackReport.js
+++ b/src/Mods/SecExp/events/attackReport.js
@@ -882,13 +882,7 @@ App.Events.attackReport = function() {
 		let candidates = 0;
 		r.push(`During the battle ${captives} attackers were captured.`);
 		if (random(1, 100) <= 25) {
-			candidates = 1;
-			const roll = random(1, 100);
-			if (captives >= 3 && roll <= 33) {
-				candidates = 3;
-			} else if (captives >= 2 && roll <= 66) {
-				candidates = 2;
-			}
+			candidates = Math.min(captives, random(1, 3));
 			r.push(`${capFirstChar(num(candidates, true))} of them have the potential to be sex slaves.`);
 		}
 
@@ -910,12 +904,12 @@ App.Events.attackReport = function() {
 				slave.origin = `${He} is an enslaved ${V.SecExp.war.attacker.type} soldier captured during a battle.`;
 				newSlave(slave); // skip New Slave Intro
 			}
-			return `All captives added as slaves.`;
+			return `Captives primarily added as menial slaves.`;
 		};
 
 		App.Events.addResponses(node, [
 			new App.Events.Result(`sell them all immediately`, sell),
-			new App.Events.Result(`keep them as slaves`, keep),
+			new App.Events.Result(`keep them as primarily menial slaves`, keep),
 		]);
 	}
 
diff --git a/src/Mods/SecExp/events/rebellionHandler.tw b/src/Mods/SecExp/events/rebellionHandler.tw
index ca49a456cc986022c618e9d9f426a9118d9a49ef..4d6531b7e8e706798e8de0cb892f3d89b7b00c18 100644
--- a/src/Mods/SecExp/events/rebellionHandler.tw
+++ b/src/Mods/SecExp/events/rebellionHandler.tw
@@ -41,7 +41,7 @@
 <</if>>
 <<if $SecExp.war.irregulars > 0>>
 	<<set _irregularMod = Math.trunc(_irregularMod)>>
-	<<set _unit = App.SecExp.getIrregularUnit("Militia", $SecExp.war.irregulars, $SecExp.war.attacker.equip)>>
+	<<set _unit = App.SecExp.getIrregularUnit("militia", $SecExp.war.irregulars, $SecExp.war.attacker.equip)>>
 	<<set _attack += _unit.attack * _irregularMod * 0.80>>
 	<<set _defense += _unit.defense * _irregularMod * 0.80>>
 	<<set _hp += _unit.hp>>
@@ -136,10 +136,10 @@
 <<set _rebellingSlaves = 0, _rebellingMilitia = 0, _rebellingMercs = 0>>
 <<if $SecExp.war.type.includes("Slave")>>
 	<<set _rebellingSlaves = 1>>
-	<<set _unit = App.SecExp.getIrregularUnit("Slaves", $SecExp.war.attacker.troops, $SecExp.war.attacker.equip)>>
+	<<set _unit = App.SecExp.getIrregularUnit("slaves", $SecExp.war.attacker.troops, $SecExp.war.attacker.equip)>>
 <<else>>
 	<<set _rebellingMilitia = 1>>
-	<<set _unit = App.SecExp.getIrregularUnit("Militia", $SecExp.war.attacker.troops, $SecExp.war.attacker.equip)>>
+	<<set _unit = App.SecExp.getIrregularUnit("militia", $SecExp.war.attacker.troops, $SecExp.war.attacker.equip)>>
 <</if>>
 <<set _enemyAttack += _unit.attack * _armyMod>>
 <<set _enemyDefense += _unit.defense * _armyMod>>
diff --git a/src/Mods/SecExp/js/reportingRelatedFunctions.js b/src/Mods/SecExp/js/reportingRelatedFunctions.js
index 2fac243ffa602958b7fa05afc9739e760cf42e07..26f3d9ec92d9940f162e9a1ade8b1e709a6ddbb5 100644
--- a/src/Mods/SecExp/js/reportingRelatedFunctions.js
+++ b/src/Mods/SecExp/js/reportingRelatedFunctions.js
@@ -1074,9 +1074,7 @@ App.SecExp.humanLoyaltyChanges = function(input, type) {
 	}
 	input.loyalty = Math.clamp(input.loyalty + loyaltyChange, 0, 100);
 	if (input.training < 100 && V.SecExp.buildings && V.SecExp.buildings.barracks.training >= 1) {
-		let options = document.createElement("div");
-		options.append("The unit is able to make use of the training facilities to better prepare its soldiers, slowly increasing their experience level. ");
-		el.append(options);
+		App.UI.DOM.appendNewElement("div", el, "The unit is able to make use of the training facilities to better prepare its soldiers, slowly increasing their experience level. ");
 		input.training += random(2, 4) * 1.5 * V.SecExp.buildings.barracks.training;
 	}
 
diff --git a/src/Mods/SecExp/js/securityReport.js b/src/Mods/SecExp/js/securityReport.js
index 7d3f5f63f3cf61b6252f8f51858bc3f7e5de896c..732116d1b0fa17e0822cfba74e1fb2fb79329f7d 100644
--- a/src/Mods/SecExp/js/securityReport.js
+++ b/src/Mods/SecExp/js/securityReport.js
@@ -446,8 +446,10 @@ App.SecExp.securityReport = function() {
 		}
 
 		if (activeUnits > 0) { // loyalty and training
-			for (const squad of App.SecExp.unit.humanSquads()) {
-				r.push(App.SecExp.humanLoyaltyChanges(squad));
+			for (const unit of App.SecExp.unit.list().slice(1)) {
+				for (const squad of V.SecExp.units[unit].squads) {
+					r.push(App.SecExp.humanLoyaltyChanges(squad, unit));
+				}
 			}
 		}
 	}
diff --git a/src/cheats/cheatEditSlave.js b/src/cheats/cheatEditSlave.js
index a720f97b116bb6e36f72009296666f77d19ce753..947078459efa500de28a2e6d6aeee60b10459093 100644
--- a/src/cheats/cheatEditSlave.js
+++ b/src/cheats/cheatEditSlave.js
@@ -15,7 +15,7 @@ App.UI.SlaveInteract.cheatEditSlave = function(slave) {
 	tabBar.addTab("Upper", "upper", App.StartingGirls.upper(V.tempSlave, true));
 	tabBar.addTab("Lower", "lower", App.StartingGirls.lower(V.tempSlave, true));
 	if (V.tempSlave.womb.length > 0) {
-		tabBar.addTab("Womb", "womb", analyzePregnancies(V.tempSlave, true));
+		tabBar.addTab(`Fetus${V.tempSlave.womb.length > 1 ? 'es' : ''}`, "fetuses", analyzePregnancies(V.tempSlave, true));
 	}
 	tabBar.addTab("Genes", "genes", genes());
 	tabBar.addTab("Mental", "mental", App.StartingGirls.mental(V.tempSlave, true));
diff --git a/src/events/RE/reArcologyInspection.js b/src/events/RE/reArcologyInspection.js
index e7a4da784de79631d72466dcdefe87dacef519c1..1f87c964457e116861b58602e399e15c086dc878 100644
--- a/src/events/RE/reArcologyInspection.js
+++ b/src/events/RE/reArcologyInspection.js
@@ -460,7 +460,7 @@ App.Events.REArcologyInspection = class REArcologyInspection extends App.Events.
 			t = [];
 			t.push(`Every arcology has its share of dissidents; it's one of the inevitable results of the semi-anarchic nature of the Free Cities. You have an opportunity to build your own <span class="reputation inc">reputation</span> and also help secure ${agent ? `${agent.slaveName}'s` : `your indirect`} <span class="darkviolet">authority</span> over ${arcology.name}, and it would be a shame to let it pass unheeded. You spend the rest of the day helping pass judgement, and even administer a few whippings and assfuckings yourself, just for good measure.`);
 			repX(100, "event");
-			if (V.SecExp) {
+			if (V.secExpEnabled) {
 				V.SecExp.core.authority += 250;
 			}
 			return t;
diff --git a/src/interaction/siPhysicalRegimen.js b/src/interaction/siPhysicalRegimen.js
index 526b3db0d687b33a7d9910d6582c3e747aaf6c53..6792d0d8d4b525c9d9993fe77c5de96b022b8d34 100644
--- a/src/interaction/siPhysicalRegimen.js
+++ b/src/interaction/siPhysicalRegimen.js
@@ -749,7 +749,7 @@ App.UI.SlaveInteract.physicalRegimen = function(slave, refresh) {
 	function breederEligibility() {
 		const el = document.createElement("div");
 		if (V.propOutcome === 1 && V.arcologies[0].FSRestart !== "unset") {
-			if (slave.breedingMark === 0 && slave.fuckdoll === 0 && slave.eggType === "human" && isFertile(slave) && slave.preg === 0) {
+			if (slave.breedingMark === 0 && slave.fuckdoll === 0 && slave.eggType === "human" && isFertile(slave) && slave.preg <= 0) {
 				el.classList.add("choices");
 				el.append(
 					App.UI.DOM.passageLink(
diff --git a/src/npc/interaction/passage/fSlaveSlaveDick.js b/src/npc/interaction/passage/fSlaveSlaveDick.js
index e2506bc63e1b2978c0976635a516e3aa1c80f7d9..adb9470aae116b009dbdb09f87b274a4e2496133 100644
--- a/src/npc/interaction/passage/fSlaveSlaveDick.js
+++ b/src/npc/interaction/passage/fSlaveSlaveDick.js
@@ -845,10 +845,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			r.push(`${He2} begins playing with ${him} immediately, slapping, pinching and licking ${his} boobs while bouncing on the meaty shaft. Occasionally ${he2} stops, denying ${slave.slaveName} release by painfully squeezing and smacking the sensitive shaft. By the end of the session ${slave.slaveName}'s abused, pent-up penis has shot several massive and painful loads into the blissfully satisfied ${rapist.slaveName}, leaving ${him} lying on the bed, shaking in horror and <span class="health dec">utter exhaustion,</span> while ${rapist.slaveName} reaps the opportunity to continue painfully tormenting ${him}.`);
 
 			healthDamage(slave, 10);
-			slave.counter.penetrative += 3;
-			V.penetrativeTotal += 3;
-			rapist.counter.vaginal += 3;
-			V.vaginalTotal += 3;
+			seX(slave, "penetrative", 3, rapist, "vaginal", 3);
 		} else if (slave.devotion < -20) {
 			r.push(`Since your dick slave is restrained, you order ${rapist.slaveName} to kneel on the bed on top of ${slave.slaveName}, and then maneuver ${his2} pussy into place. ${slave.slaveName} is uncooperative, so you prod and slap ${him} until ${he} starts to thrust ${his} cock into ${rapist.slaveName} with urgency.`);
 			if (rapist.vagina === 0) { /* losing virginity */
@@ -954,7 +951,6 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			if (rapist.vagina === 0) { /* losing virginity */
 				if (rapist.devotion > 20) {
 					r.push(`${rapist.slaveName} accepts your orders without comment and lowers ${his2} virgin pussy on ${slave.slaveName}'s ready`);
-
 					if (slave.clit >= 4) {
 						r.push(`massive clit.`);
 					} else {
@@ -965,7 +961,6 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 					rapist.devotion += 10;
 				} else if (rapist.devotion >= -20) {
 					r.push(`${rapist.slaveName} is clearly unhappy at the idea of losing ${his2} pearl of great price to ${slave.slaveName}; this probably isn't what ${he2} imagined ${his2} first real sex would be like. ${He2} fears ${he2} might get pregnant. Nevertheless, <span class="devotion inc">${he} is further broken to slavery</span> by this application of ${his2} body, which naturally <span class="lime">breaks in ${his2} pussy.</span>`);
-
 					rapist.vagina = 1;
 					rapist.devotion += 4;
 				} else {
@@ -1017,10 +1012,7 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 			}/* closes losing virginity */
 
 			r.push(`${He2} rides the helpless ${slave.slaveName} through several ejaculating orgasms. In the short breaks between them, ${he2} teases ${his} pussy. By the end of the session ${rapist.slaveName}'s cunt is dripping cum, to ${his2} obvious satiation and bliss. ${slave.slaveName} is lying next to ${him2} on the bed in a state of fatigue, the entire experience having thoroughly exhausted ${him}.`);
-			slave.counter.penetrative += 3;
-			V.penetrativeTotal += 3;
-			rapist.counter.vaginal += 3;
-			V.vaginalTotal += 3;
+			seX(slave, "penetrative", 3, rapist, "vaginal", 3);
 		} else if (slave.devotion <= 20 || rapist.devotion <= 20) {
 			r.push(`You toss ${slave.slaveName} onto the bed and tell ${rapist.slaveName} to get on with it.`);
 			if (rapist.vagina === 0) { /* losing virginity */
@@ -1226,9 +1218,8 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				} else {
 					r.push(`strap-on.`);
 				}
-				r.push(`With the extra stimulus of double penetration, ${he2} comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh.`);
-				rapist.counter.anal++;
-				V.analTotal++;
+				r.push(`With the extra stimulus of double penetration, ${he} comes indecently hard. The two of them collapse into an exhausted, satisfied pile of slave flesh.`);
+				seX(rapist, "anal", 1, V.PC, "penetrative", 1);
 				if (canImpreg(rapist, V.PC)) {
 					knockMeUp(rapist, 5, 1, -1);
 				}
@@ -1252,20 +1243,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 				r.push(VCheck.Anal(slave, 1));
 			} else {
 				r.push(`pull ${his2} face to your crotch. All this penetration has got you horny and there are no free holes to fuck, so a little oral will have to do. It doesn't take long for all three of you to collapse into an exhausted, satisfied pile of flesh.`);
-				rapist.counter.oral++;
-				V.oralTotal++;
+				seX(rapist, "oral", 1, V.PC, "penetrative", 1);
 			}
 		}
 
-		App.Events.addParagraph(el, r);
-		r = [];
-
-		slave.counter.penetrative += 1;
-		V.penetrativeTotal += 1;
-		rapist.counter.vaginal += 1;
-		V.vaginalTotal += 1;
-		addPartner(slave, rapist);
-
 		/* Friendship/lust? */
 		if (([2].includes(slave.relationship) && slave.relationshipTarget === rapist.ID) && ([2].includes(rapist.relationship) && rapist.relationshipTarget === slave.ID)) {
 			r.push(`You keep ${slave.slaveName}'s dick intimate with ${rapist.slaveName}'s pussy for awhile, something the two friends haven't been sharing with each other. In the end, you are certain they got closer, becoming <span class="lightgreen">friends with benefits.</span>`);
@@ -1279,7 +1260,10 @@ App.Interact.fSlaveSlaveDick = function(slave) {
 		}
 
 		/* save changes */
-		V.slaves[V.slaveIndices[rapist.ID]] = rapist;
+		seX(slave, "penetrative", 1, rapist, "vaginal", 1);
+		getSlave(rapist.ID) = rapist;
+
+		App.Events.addParagraph(el, r);
 
 		return el;
 	}