diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index 5abaac8fa431b68ea620571a259d3ac4b842808f..2e263adb01972875320282a0c9d1b0d0119d49e2 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -516,10 +516,6 @@ App.Data.resetOnNGPlus = {
 	expectedEquip: 0,
 	estimatedMen: 0,
 	SFIntervention: 0,
-	carriableSoldiers: 0,
-	SFatk: 0,
-	SFdef: 0,
-	SFhp: 0,
 	rebellingID: [],
 	saveValid: 0,
 	lastSelection: [],
diff --git a/src/Mods/SecExp/SecExpBackwardCompatibility.tw b/src/Mods/SecExp/SecExpBackwardCompatibility.tw
index 9629e43a9c7a95b6ad6f85a9859d2f632331cf8f..08918c7a8bec79259e5e71a9c9ec1b16ebfa7543 100644
--- a/src/Mods/SecExp/SecExpBackwardCompatibility.tw
+++ b/src/Mods/SecExp/SecExpBackwardCompatibility.tw
@@ -590,18 +590,6 @@
 <<if ndef $SFIntervention>>
 	<<set $SFIntervention = 0>>
 <</if>>
-<<if ndef $carriableSoldiers>>
-	<<set $carriableSoldiers = 0>>
-<</if>>
-<<if ndef $SFatk>>
-	<<set $SFatk = 0>>
-<</if>>
-<<if ndef $SFdef>>
-	<<set $SFdef = 0>>
-<</if>>
-<<if ndef $SFhp>>
-	<<set $SFhp = 0>>
-<</if>>
 <<if ndef $rebellingID>>
 	<<set $rebellingID = []>>
 <</if>>
diff --git a/src/Mods/SecExp/attackHandler.tw b/src/Mods/SecExp/attackHandler.tw
index 10c846cb6b6d27b611d65ca7a78766ff5e444a4e..3b5a7102d831bd231a10048a928fb7b82fc74ea6 100644
--- a/src/Mods/SecExp/attackHandler.tw
+++ b/src/Mods/SecExp/attackHandler.tw
@@ -903,13 +903,10 @@
 	<</for>>
 
 	<<if $SF.Toggle && $SF.Active >= 1 && $SFIntervention>>
-		<<set $SFatk = 0>>
-		<<set $SFdef = 0>>
-		<<set $SFhp = 0>>
-		<<run calcSFStatistics()>>
-		<<set _attack += $SFatk>>
-		<<set _defense += $SFdef>>
-		<<set _hp += $SFhp>>
+		<<set _unit = App.SecExp.getUnit("SF")>>
+		<<set _attack += _unit.attack>>
+		<<set _defense += _unit.defense>>
+		<<set _hp += _unit.hp>>
 	<</if>>
 
 	/* morale and baseHp calculation */
diff --git a/src/Mods/SecExp/attackReport.tw b/src/Mods/SecExp/attackReport.tw
index af5af2564a51488ed24bec6bc1949665d83eeb0d..b89024af6704e1034bb32e937ffed3c24539aac3 100644
--- a/src/Mods/SecExp/attackReport.tw
+++ b/src/Mods/SecExp/attackReport.tw
@@ -14,65 +14,38 @@
 <<set _loot = 0>>
 
 /* result */
+<<set $battlesCount++>>
 <<if $majorBattle == 0>>
-	<<set $battlesCount++>>
 	<<set _majorBattleMod = 1>>
-	<<if $battleResult == 3>>
-		<strong>Victory!</strong>
-		<<set $PClossStreak = 0>>
-		<<set $PCvictoryStreak += 1>>
-		<<set $PCvictories++>>
-	<<elseif $battleResult == -3>>
-		<strong>Defeat!</strong>
-		<<set $PClossStreak += 1>>
-		<<set $PCvictoryStreak = 0>>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 2>>
-		<strong>Partial victory!</strong>
-		<<set $PCvictories++>>
-	<<elseif $battleResult == -2>>
-		<strong>Partial defeat!</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == -1>>
-		<strong>We surrendered</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 0>>
-		<strong>Failed bribery!</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 1>>
-		<strong>Successful bribery!</strong>
-		<<set $PCvictories++>>
-	<</if>>
 <<else>>
 	<<set _majorBattleMod = 2>>
-	<<set $battlesCount++>>
 	<<set $majorBattlesCount++>>
-	<<if $battleResult == 3>>
-		<strong>Major victory!</strong>
-		<<set $PClossStreak = 0>>
-		<<set $PCvictoryStreak += 1>>
-		<<set $PCvictories++>>
-	<<elseif $battleResult == -3>>
-		<strong>Major Defeat!</strong>
-		<<set $PClossStreak += 1>>
-		<<set $PCvictoryStreak = 0>>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 2>>
-		<strong>Partial victory!</strong>
-		<<set $PCvictories++>>
-	<<elseif $battleResult == -2>>
-		<strong>Partial defeat!</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == -1>>
-		<strong>We surrendered</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 0>>
-		<strong>Failed bribery!</strong>
-		<<set $PClosses++>>
-	<<elseif $battleResult == 1>>
-		<strong>Successful bribery!</strong>
-		<<set $PCvictories++>>
-	<</if>>
+<</if>>
+<<if $battleResult == 3>>
+	<strong>Victory!</strong>
+	<<set $PClossStreak = 0>>
+	<<set $PCvictoryStreak += 1>>
+	<<set $PCvictories++>>
+<<elseif $battleResult == -3>>
+	<strong>Defeat!</strong>
+	<<set $PClossStreak += 1>>
+	<<set $PCvictoryStreak = 0>>
+	<<set $PClosses++>>
+<<elseif $battleResult == 2>>
+	<strong>Partial victory!</strong>
+	<<set $PCvictories++>>
+<<elseif $battleResult == -2>>
+	<strong>Partial defeat!</strong>
+	<<set $PClosses++>>
+<<elseif $battleResult == -1>>
+	<strong>We surrendered</strong>
+	<<set $PClosses++>>
+<<elseif $battleResult == 0>>
+	<strong>Failed bribery!</strong>
+	<<set $PClosses++>>
+<<elseif $battleResult == 1>>
+	<strong>Successful bribery!</strong>
+	<<set $PCvictories++>>
 <</if>>
 <hr>
 
diff --git a/src/Mods/SecExp/js/Unit.js b/src/Mods/SecExp/js/Unit.js
index cd6bdfa02dc88a5f712005ff65046108295eee0e..db2a025f91ae807fd2866e8c0530c9a38bba5dab 100644
--- a/src/Mods/SecExp/js/Unit.js
+++ b/src/Mods/SecExp/js/Unit.js
@@ -10,13 +10,15 @@ App.SecExp.generateUnitID = function() {
 };
 
 /** Player unit factory - get a unit based on its type and index
- * @param {string} type - "Bots", "Militia", "Slaves", or "Mercs"
+ * @param {string} type - "Bots", "Militia", "Slaves", "Mercs", or "SF"
  * @param {number} [index] - must be supplied if type is not "Bots"
  * @returns {App.SecExp.Unit}
  */
 App.SecExp.getUnit = function(type, index) {
 	if (type === "Bots") {
 		return new App.SecExp.DroneUnit(V.secBots, App.SecExp.BaseDroneUnit);
+	} else if (type === "SF") {
+		return new App.SecExp.SFUnit();
 	} else if (typeof index !== "number") {
 		throw `Bad index for unit type ${type}: ${index}`;
 	}
@@ -467,6 +469,40 @@ App.SecExp.HumanUnit = class SecExpHumanUnit extends App.SecExp.Unit {
 	}
 };
 
+App.SecExp.troopsFromSF = function() {
+	if (V.slaveRebellion !== 1 || V.citizenRebellion !== 1) {
+		// attack: how many troops can we actually carry?
+		const transportMax = Math.trunc(125 * (V.SF.Squad.GunS + ((V.SF.Squad.AV + V.SF.Squad.TV)/2)));
+		return Math.min(transportMax, V.SF.ArmySize);
+	} else {
+		// rebellion: transport capabilities are irrelevant
+		return V.SF.ArmySize;
+	}
+};
+
+App.SecExp.SFUnit = class SFUnit extends App.SecExp.Unit {
+	constructor() {
+		super(null, App.SecExp.BaseSpecialForcesUnit);
+		this._distancePenalty = (V.slaveRebellion !== 1 || V.citizenRebellion !== 1) ? 0.10 : 0.0;
+	}
+
+	get attack() {
+		// ignores base attack? weird.
+		const attackUpgrades = V.SF.Squad.Armoury + V.SF.Squad.Drugs + V.SF.Squad.AA + V.SF.Squad.AV;
+		return (0.75 - this._distancePenalty) * attackUpgrades;
+	}
+
+	get defense() {
+		// ignores base defense? weird.
+		const defenseUpgrades = V.SF.Squad.Armoury + V.SF.Squad.Drugs + (V.SF.Squad.AA + V.SF.Squad.TA) / 2 + (V.SF.Squad.AV + V.SF.Squad.TV) / 2;
+		return (0.5 - this._distancePenalty) * defenseUpgrades;
+	}
+
+	get hp() {
+		return this._baseUnit.hp * App.SecExp.troopsFromSF();
+	}
+};
+
 App.SecExp.EnemyUnit = class SecExpEnemyUnit extends App.SecExp.Unit {
 	/** @param {FC.SecExp.UnitData} data
 	 * @param {BaseUnit} baseUnit
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index 9469924406dcf9161a58a4093ec47c2ccea450ff..25d6d41a695de4b12e5fe4bfc81335f08d3999ae 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -211,7 +211,7 @@ App.SecExp.conflict = (function() {
 			}
 			countHumanTroops((u) => u.isDeployed === 1);
 			if (V.SF.Toggle && V.SF.Active >= 1 && V.SFIntervention) {
-				troops += V.carriableSoldiers;
+				troops += App.SecExp.troopsFromSF();
 			}
 		} else {
 			if (V.irregulars > 0) {
@@ -222,7 +222,7 @@ App.SecExp.conflict = (function() {
 			}
 			countHumanTroops((u) => u.active === 1 && V.loyalID.includes(u.ID));
 			if (V.SF.Toggle && V.SF.Active >= 1) {
-				troops += V.carriableSoldiers;
+				troops += App.SecExp.troopsFromSF();
 			}
 		}
 		return troops;
diff --git a/src/Mods/SecExp/rebellionGenerator.tw b/src/Mods/SecExp/rebellionGenerator.tw
index 715923a49dc7494746df9b45beb29d16df31b670..cb17b7b64985b00b84490a19aa7287f10395511f 100644
--- a/src/Mods/SecExp/rebellionGenerator.tw
+++ b/src/Mods/SecExp/rebellionGenerator.tw
@@ -306,8 +306,8 @@
 	<<set _repFactor = Math.clamp($rep / 20000,0.4,0.6)>>
 	<<set _rebelPercent = 0.3 * _authFactor>>
 	<<set _irregularPercent = 0.2 * _repFactor>>
-	<<set $attackTroops = Math.clamp(Math.trunc($ASlaves * _rebelPercent + random(-100,100)) * _weekMod,50,$ASlaves)>>
-	<<set $irregulars = Math.clamp(Math.trunc($ACitizens * _irregularPercent + random(-100,100)) * _weekMod,50,$ACitizens)>>
+	<<set $attackTroops = Math.clamp(Math.trunc($ASlaves * _rebelPercent * _weekMod) + random(-100,100),50,$ASlaves)>>
+	<<set $irregulars = Math.clamp(Math.trunc($ACitizens * _irregularPercent * _weekMod) + random(-100,100),50,$ACitizens)>>
 	/* calc if units rebel */
 	<<for _i = 0; _i < $slaveUnits.length; _i++>>
 		<<if $slaveUnits[_i].loyalty < 10>>
@@ -376,8 +376,8 @@
 	<<set _repFactor = Math.clamp($rep / 20000,0.4,0.6)>>
 	<<set _rebelPercent = 0.3 * _authFactor>>
 	<<set _irregularPercent = 0.2 * _repFactor>>
-	<<set $attackTroops = Math.clamp(Math.trunc($ACitizens * _rebelPercent + random(-100,100)) * _weekMod,50,$ACitizens)>>
-	<<set $irregulars = Math.clamp(Math.trunc($ACitizens * _irregularPercent + random(-100,100)) * _weekMod,50,$ACitizens)>>
+	<<set $attackTroops = Math.clamp(Math.trunc($ACitizens * _rebelPercent * _weekMod) + random(-100,100),50,$ACitizens)>>
+	<<set $irregulars = Math.clamp(Math.trunc($ACitizens * _irregularPercent * _weekMod) + random(-100,100),50,$ACitizens)>>
 	/* calc if units rebel */
 	<<for _i = 0; _i < $militiaUnits.length; _i++>>
 		<<if $militiaUnits[_i].loyalty < 10>>
diff --git a/src/Mods/SecExp/rebellionHandler.tw b/src/Mods/SecExp/rebellionHandler.tw
index 20e41d978aa6933661fa1c69426dd96b900bbc83..18e30661da325da76bc71c4ee6792c18b3266a90 100644
--- a/src/Mods/SecExp/rebellionHandler.tw
+++ b/src/Mods/SecExp/rebellionHandler.tw
@@ -84,13 +84,10 @@
 <</for>>
 
 <<if $SF.Toggle && $SF.Active >= 1>>
-	<<set $SFatk = 0>>
-	<<set $SFdef = 0>>
-	<<set $SFhp = 0>>
-	<<run calcSFStatistics()>>
-	<<set _attack += $SFatk>>
-	<<set _defense += $SFdef>>
-	<<set _hp += $SFhp>>
+	<<set _unit = App.SecExp.getUnit("SF")>>
+	<<set _attack += _unit.attack>>
+	<<set _defense += _unit.defense>>
+	<<set _hp += _unit.hp>>
 <</if>>
 
 <<set _attack *= _engageMod>>
diff --git a/src/Mods/SecExp/unitsRebellionReport.tw b/src/Mods/SecExp/unitsRebellionReport.tw
index 4611aabeacb2a5a904ffb8e5baa808866fa27a30..0b897d8b3418b3def6d2825d614c6c78ee59dfad 100644
--- a/src/Mods/SecExp/unitsRebellionReport.tw
+++ b/src/Mods/SecExp/unitsRebellionReport.tw
@@ -46,200 +46,6 @@
 		<</for>>
 		participated in the battle without taking any casualties. They remained loyal until the end.
 	<</if>>
-	<<if $rebellingID.length > 0 && $battleResult != -1>>
-		<br>
-		<br>
-		/* militia */
-		<<set _militiaRebelledID = []>>
-		<<set _militiaManpower = 0>>
-		<<for _j = 0; _j < $militiaUnits.length; _j++>>
-			<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
-				$militiaUnits[_j].platoonName,
-				<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
-				<<set _militiaManpower += Math.clamp($militiaUnits[_j].troops - random(_averageLosses),0,$militiaUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _militiaRebelledID.length > 0>>
-			had the gall to betray you and join your enemies.
-			<span id="militiaResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<set $militiaFreeManpower += _militiaManpower>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $militiaUnits[_i].active == 1>>
-							<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#militiaResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<set $militiaFreeManpower += _militiaManpower * 0.5>>
-					<<replace "#militiaResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $militiaUnits[_i].active == 1>>
-							<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#militiaResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
-		<</if>>
-
-		/* slaves */
-		<<set _slaveRebelledID = []>>
-		<<set _slaveManpower = 0>>
-		<br><br>
-		<<for _j = 0; _j < $slaveUnits.length; _j++>>
-			<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
-				$slaveUnits[_j].platoonName,
-				<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
-				<<set _slaveManpower += Math.clamp($slaveUnits[_j].troops - random(_averageLosses),0,$slaveUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _slaveRebelledID.length > 0>>
-			decided in their blind arrogance to betray you.
-			<span id="slaveResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<set $menials += _slaveManpower>>
-					<<for _i = 0; _i < $slaveUnits.length; _i++>>
-						<<if $slaveUnits[_i].active == 1>>
-							<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#slaveResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<set $menials += _slaveManpower * 0.5>>
-					<<replace "#slaveResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<for _i = 0; _i < $slaveUnits.length; _i++>>
-						<<if $slaveUnits[_i].active == 1>>
-							<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#slaveResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
-		<</if>>
-
-		/* mercs */
-		<<set _mercRebelledID = []>>
-		<<set _mercManpower = 0>>
-		<br><br>
-		<<for _j = 0; _j < $mercUnits.length; _j++>>
-			<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
-				$mercUnits[_j].platoonName,
-				<<set _mercRebelledID.push($mercUnits[_j].ID)>>
-				<<set _mercManpower += Math.clamp($mercUnits[_j].troops - random(_averageLosses),0,$mercUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _mercRebelledID.length > 0>>
-			made the grave mistake of betraying you.
-			<span id="mercResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<set $mercFreeManpower += _mercManpower>>
-					<<for _i = 0; _i < $mercUnits.length; _i++>>
-						<<if $mercUnits[_i].active == 1>>
-							<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#mercResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<set $mercFreeManpower += _mercManpower * 0.5>>
-					<<replace "#mercResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<for _i = 0; _i < $mercUnits.length; _i++>>
-						<<if $mercUnits[_i].active == 1>>
-							<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#mercResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
-		<</if>>
-	<<elseif $rebellingID.length > 0>>
-		<<set _militiaRebelledID = []>>
-		<<for _j = 0; _j < $militiaUnits.length; _j++>>
-			<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
-				<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
-				$militiaUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _militiaRebelledID.length > 0>>
-			had the gall to betray you and join your enemies. They participated in the looting following the rebellion, then vanished in the wastes.
-		<</if>>
-		<<run cashX(forceNeg(1000 * _militiaRebelledID.length), "war")>>
-		<br>
-		<<run removeUnits(_militiaRebelledID)>>
-		<<set _slaveRebelledID = []>>
-		<<for _j = 0; _j < $slaveUnits.length; _j++>>
-			<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
-				<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
-				$slaveUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _slaveRebelledID.length > 0>>
-			decided in their blind arrogance to betray you. They participated in the looting following the rebellion, then vanished in the wastes.
-		<</if>>
-		<<run cashX(forceNeg(1000 * _slaveRebelledID.length), "war")>>
-		<<run removeUnits(_slaveRebelledID)>>
-		<br>
-		<<set _mercRebelledID = []>>
-		<<set _count = 0>>
-		<<for _j = 0; _j < $mercUnits.length; _j++>>
-			<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
-				<<set _mercRebelledID.push($mercUnits[_j].ID)>>
-				<<set _count++>>
-				$mercUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _mercRebelledID.length > 0>>
-			made the grave mistake of betraying you. They participated in the looting following the rebellion, then vanished in the wastes.
-		<</if>>
-		<<run cashX(forceNeg(1000 * _mercRebelledID.length), "war")>>
-		<<run removeUnits(_mercRebelledID)>>
-	<</if>>
-
 <<elseif $losses > 0>>
 	/* if the losses are more than zero */
 	/* generates a list of randomized losses, from which each unit picks one at random */
@@ -493,201 +299,202 @@
 			<</if>>
 		<</for>>
 	<</if>>
+<<else>>
+	<br>@@.red;Error: losses are a negative number or NaN@@
+<</if>>
+
+<<if $rebellingID.length > 0 && $battleResult >= 2>>
+	/* rebellion win */
 	<br><br>
-	<<if $rebellingID.length > 0 && $battleResult >= 2>>
-		/* win */
-		/* militia */
-		<<set _militiaRebelledID = []>>
-		<<set _militiaManpower = 0>>
-		<<for _j = 0; _j < $militiaUnits.length; _j++>>
-			<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
-				$militiaUnits[_j].platoonName,
-				<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
-				<<set _militiaManpower += Math.clamp($militiaUnits[_j].troops - random(_averageLosses),0,$militiaUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _militiaRebelledID.length > 0>>
-			had the gall to betray you and join your enemies.
-			<span id="militiaResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<set $militiaFreeManpower += _militiaManpower>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $militiaUnits[_i].active == 1>>
-							<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#militiaResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<set $militiaFreeManpower += _militiaManpower * 0.5>>
-					<<replace "#militiaResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_militiaRebelledID)>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $militiaUnits[_i].active == 1>>
-							<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#militiaResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
+	/* militia */
+	<<set _militiaRebelledID = []>>
+	<<set _militiaManpower = 0>>
+	<<for _j = 0; _j < $militiaUnits.length; _j++>>
+		<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
+			$militiaUnits[_j].platoonName,
+			<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
+			<<set _militiaManpower += Math.clamp($militiaUnits[_j].troops - random(_averageLosses),0,$militiaUnits[_j].troops)>>
 		<</if>>
+	<</for>>
+	<<if _militiaRebelledID.length > 0>>
+		had the gall to betray you and join your enemies.
+		<span id="militiaResult">
+			<br><<link "Dissolve the units">>
+				<<run $militiaUnits.deleteWith((u) => _militiaRebelledID.includes(u.ID))>>
+				<<set $militiaFreeManpower += _militiaManpower>>
+				<<for _i = 0; _i < $militiaUnits.length; _i++>>
+					<<if $militiaUnits[_i].active == 1>>
+						<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty - random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#militiaResult">>
+					<br>Units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
+			<br><<link "Purge the dissidents and dissolve the units">>
+				<<run $militiaUnits.deleteWith((u) => _militiaRebelledID.includes(u.ID))>>
+				<<set $militiaFreeManpower += _militiaManpower * 0.5>>
+				<<replace "#militiaResult">>
+					<br>Dissidents purged and units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
+			<br><<link "Execute them all">>
+				<<run $militiaUnits.deleteWith((u) => _militiaRebelledID.includes(u.ID))>>
+				<<for _i = 0; _i < $militiaUnits.length; _i++>>
+					<<if $militiaUnits[_i].active == 1>>
+						<<set $militiaUnits[_i].loyalty = Math.clamp($militiaUnits[_i].loyalty + random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#militiaResult">>
+					<br>Units executed. Dissent will not be tolerated.
+				<</replace>>
+			<</link>>
+			<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
+		</span>
+	<</if>>
 
-		/* slaves */
-		<<set _slaveRebelledID = []>>
-		<<set _slaveManpower = 0>>
-		<br>
-		<<for _j = 0; _j < $slaveUnits.length; _j++>>
-			<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
-				$slaveUnits[_j].platoonName,
-				<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
-				<<set _slaveManpower += Math.clamp($slaveUnits[_j].troops - random(_averageLosses),0,$slaveUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _slaveRebelledID.length > 0>>
-			decided in their blind arrogance to betray you.
-			<span id="slaveResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<set $menials += _slaveManpower>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $slaveUnits[_i].active == 1>>
-							<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#slaveResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<set $menials += _slaveManpower * 0.5>>
-					<<replace "#slaveResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_slaveRebelledID)>>
-					<<for _i = 0; _i < $slaveUnits.length; _i++>>
-						<<if $slaveUnits[_i].active == 1>>
-							<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#slaveResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
+	/* slaves */
+	<<set _slaveRebelledID = []>>
+	<<set _slaveManpower = 0>>
+	<br>
+	<<for _j = 0; _j < $slaveUnits.length; _j++>>
+		<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
+			$slaveUnits[_j].platoonName,
+			<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
+			<<set _slaveManpower += Math.clamp($slaveUnits[_j].troops - random(_averageLosses),0,$slaveUnits[_j].troops)>>
 		<</if>>
+	<</for>>
+	<<if _slaveRebelledID.length > 0>>
+		decided in their blind arrogance to betray you.
+		<span id="slaveResult">
+			<br><<link "Dissolve the units">>
+				<<run $slaveUnits.deleteWith((u) => _slaveRebelledID.includes(u.ID))>>
+				<<set $menials += _slaveManpower>>
+				<<for _i = 0; _i < $militiaUnits.length; _i++>>
+					<<if $slaveUnits[_i].active == 1>>
+						<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty - random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#slaveResult">>
+					<br>Units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
+			<br><<link "Purge the dissidents and dissolve the units">>
+				<<run $slaveUnits.deleteWith((u) => _slaveRebelledID.includes(u.ID))>>
+				<<set $menials += _slaveManpower * 0.5>>
+				<<replace "#slaveResult">>
+					<br>Dissidents purged and units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
+			<br><<link "Execute them all">>
+				<<run $slaveUnits.deleteWith((u) => _slaveRebelledID.includes(u.ID))>>
+				<<for _i = 0; _i < $slaveUnits.length; _i++>>
+					<<if $slaveUnits[_i].active == 1>>
+						<<set $slaveUnits[_i].loyalty = Math.clamp($slaveUnits[_i].loyalty + random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#slaveResult">>
+					<br>Units executed. Dissent will not be tolerated.
+				<</replace>>
+			<</link>>
+			<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
+		</span>
+	<</if>>
 
-		/* mercs */
-		<<set _mercRebelledID = []>>
-		<<set _mercManpower = 0>>
-		<br>
-		<<for _j = 0; _j < $mercUnits.length; _j++>>
-			<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
-				$mercUnits[_j].platoonName,
-				<<set _mercRebelledID.push($mercUnits[_j].ID)>>
-				<<set _mercManpower += Math.clamp($mercUnits[_j].troops - random(_averageLosses),0,$mercUnits[_j].troops)>>
-			<</if>>
-		<</for>>
-		<<if _mercRebelledID.length > 0>>
-			made the grave mistake of betraying you.
-			<span id="mercResult">
-				<br><<link "Dissolve the units">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<set $mercFreeManpower += _mercManpower>>
-					<<for _i = 0; _i < $militiaUnits.length; _i++>>
-						<<if $mercUnits[_i].active == 1>>
-							<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty - random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#mercResult">>
-						<br>Units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
-				<br><<link "Purge the dissidents and dissolve the units">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<set $mercFreeManpower += _mercManpower * 0.5>>
-					<<replace "#mercResult">>
-						<br>Dissidents purged and units dissolved.
-					<</replace>>
-				<</link>>
-				<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
-				<br><<link "Execute them all">>
-					<<run removeUnits(_mercRebelledID)>>
-					<<for _i = 0; _i < $mercUnits.length; _i++>>
-						<<if $mercUnits[_i].active == 1>>
-							<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty + random(10,40),0,100)>>
-						<</if>>
-					<</for>>
-					<<replace "#mercResult">>
-						<br>Units executed. Dissent will not be tolerated.
-					<</replace>>
-				<</link>>
-				<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
-			</span>
+	/* mercs */
+	<<set _mercRebelledID = []>>
+	<<set _mercManpower = 0>>
+	<br>
+	<<for _j = 0; _j < $mercUnits.length; _j++>>
+		<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
+			$mercUnits[_j].platoonName,
+			<<set _mercRebelledID.push($mercUnits[_j].ID)>>
+			<<set _mercManpower += Math.clamp($mercUnits[_j].troops - random(_averageLosses),0,$mercUnits[_j].troops)>>
 		<</if>>
-
-	/* loss */
-	<<elseif $rebellingID.length > 0>>
-		<<set _militiaRebelledID = []>>
-		<<for _j = 0; _j < $militiaUnits.length; _j++>>
-			<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
-				<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
-				$militiaUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _militiaRebelledID.length > 0>>
-			had the gall to betray you and join your enemies. They participated in the looting following the battle, then vanished in the wastes.
+	<</for>>
+	<<if _mercRebelledID.length > 0>>
+		made the grave mistake of betraying you.
+		<span id="mercResult">
+			<br><<link "Dissolve the units">>
+				<<run $mercUnits.deleteWith((u) => _mercRebelledID.includes(u.ID))>>
+				<<set $mercFreeManpower += _mercManpower>>
+				<<for _i = 0; _i < $militiaUnits.length; _i++>>
+					<<if $mercUnits[_i].active == 1>>
+						<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty - random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#mercResult">>
+					<br>Units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Manpower will be refunded, but will negatively influence the loyalty of the other units//
+			<br><<link "Purge the dissidents and dissolve the units">>
+				<<run $mercUnits.deleteWith((u) => _mercRebelledID.includes(u.ID))>>
+				<<set $mercFreeManpower += _mercManpower * 0.5>>
+				<<replace "#mercResult">>
+					<br>Dissidents purged and units dissolved.
+				<</replace>>
+			<</link>>
+			<br>//Will not influence the loyalty of the other units, but only half the manpower will be refunded.//
+			<br><<link "Execute them all">>
+				<<run $mercUnits.deleteWith((u) => _mercRebelledID.includes(u.ID))>>
+				<<for _i = 0; _i < $mercUnits.length; _i++>>
+					<<if $mercUnits[_i].active == 1>>
+						<<set $mercUnits[_i].loyalty = Math.clamp($mercUnits[_i].loyalty + random(10,40),0,100)>>
+					<</if>>
+				<</for>>
+				<<replace "#mercResult">>
+					<br>Units executed. Dissent will not be tolerated.
+				<</replace>>
+			<</link>>
+			<br>//Will positively influence the loyalty of the other units, but no manpower will be refunded.//
+		</span>
+	<</if>>
+<<elseif $rebellingID.length > 0>>
+	/* rebellion loss */
+	<br><br>
+	<<set _militiaRebelledID = []>>
+	<<for _j = 0; _j < $militiaUnits.length; _j++>>
+		<<if $militiaUnits[_j].active == 1 && $rebellingID.includes($militiaUnits[_j].ID)>>
+			<<set _militiaRebelledID.push($militiaUnits[_j].ID)>>
+			$militiaUnits[_j].platoonName,
 		<</if>>
-		<<run cashX(forceNeg(1000 * _militiaRebelledID.length), "war")>>
-		<br>
-		<<run removeUnits(_militiaRebelledID)>>
-		<<set _slaveRebelledID = []>>
-		<<for _j = 0; _j < $slaveUnits.length; _j++>>
-			<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
-				<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
-				$slaveUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _slaveRebelledID.length > 0>>
-			decided in their blind arrogance to betray you. They participated in the looting following the battle, then vanished in the wastes.
+	<</for>>
+	<<if _militiaRebelledID.length > 0>>
+		had the gall to betray you and join your enemies. They participated in the looting following the battle, then vanished in the wastes.
+	<</if>>
+	<<run cashX(forceNeg(1000 * _militiaRebelledID.length), "war")>>
+	<<run $militiaUnits.deleteWith((u) => _militiaRebelledID.includes(u.ID))>>
+	<br>
+	<<set _slaveRebelledID = []>>
+	<<for _j = 0; _j < $slaveUnits.length; _j++>>
+		<<if $slaveUnits[_j].active == 1 && $rebellingID.includes($slaveUnits[_j].ID)>>
+			<<set _slaveRebelledID.push($slaveUnits[_j].ID)>>
+			$slaveUnits[_j].platoonName,
 		<</if>>
-		<<run cashX(forceNeg(1000 * _slaveRebelledID.length), "war")>>
-		<<run removeUnits(_slaveRebelledID)>>
-		<br>
-		<<set _mercRebelledID = []>>
-		<<set _count = 0>>
-		<<for _j = 0; _j < $mercUnits.length; _j++>>
-			<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
-				<<set _mercRebelledID.push($mercUnits[_j].ID)>>
-				<<set _count++>>
-				$mercUnits[_j].platoonName,
-			<</if>>
-		<</for>>
-		<<if _mercRebelledID.length > 0>>
-			made the grave mistake of betraying you. They participated in the looting following the battle, then vanished in the wastes.
+	<</for>>
+	<<if _slaveRebelledID.length > 0>>
+		decided in their blind arrogance to betray you. They participated in the looting following the battle, then vanished in the wastes.
+	<</if>>
+	<<run cashX(forceNeg(1000 * _slaveRebelledID.length), "war")>>
+	<<run $slaveUnits.deleteWith((u) => _slaveRebelledID.includes(u.ID))>>
+	<br>
+	<<set _mercRebelledID = []>>
+	<<set _count = 0>>
+	<<for _j = 0; _j < $mercUnits.length; _j++>>
+		<<if $mercUnits[_j].active == 1 && $rebellingID.includes($mercUnits[_j].ID)>>
+			<<set _mercRebelledID.push($mercUnits[_j].ID)>>
+			<<set _count++>>
+			$mercUnits[_j].platoonName,
 		<</if>>
-		<<run cashX(forceNeg(1000 * _mercRebelledID.length), "war")>>
-		<<run removeUnits(_mercRebelledID)>>
+	<</for>>
+	<<if _mercRebelledID.length > 0>>
+		made the grave mistake of betraying you. They participated in the looting following the battle, then vanished in the wastes.
 	<</if>>
-<<else>>
-	<br>@@.red;Error: losses are a negative number or NaN@@
+	<<run cashX(forceNeg(1000 * _mercRebelledID.length), "war")>>
+	<<run $mercUnits.deleteWith((u) => _mercRebelledID.includes(u.ID))>>
 <</if>>
diff --git a/src/Mods/SecExp/widgets/battleWidgets.js b/src/Mods/SecExp/widgets/battleWidgets.js
deleted file mode 100644
index 22789549aab0d7dccf8a7f340393877d15cfb71a..0000000000000000000000000000000000000000
--- a/src/Mods/SecExp/widgets/battleWidgets.js
+++ /dev/null
@@ -1,38 +0,0 @@
-globalThis.calcSFStatistics = function() {
-	let upgradesSum = V.SF.Squad.Armoury + V.SF.Squad.Drugs + (V.SF.Squad.AA+V.SF.Squad.TA < 1) + (V.SF.Squad.AV+V.SF.Squad.TV);
-	if (!Number.isInteger(upgradesSum)) {
-		upgradesSum = jsRandom(10, 15);
-	}
-
-	if (V.slaveRebellion !== 1 || V.citizenRebellion !== 1) {
-		/* atk, def */
-		V.SFatk = Math.trunc(0.65 * upgradesSum);
-		V.SFdef = Math.trunc(0.40 * upgradesSum);
-		/* hp */
-		V.carriableSoldiers = 125 * (V.SF.Squad.GunS + ((V.SF.Squad.AV + V.SF.Squad.TV)/2));
-		if (!Number.isInteger(V.carriableSoldiers)) {
-			V.carriableSoldiers = V.SF.ArmySize / 10;
-		}
-		if (V.SF.ArmySize > V.carriableSoldiers) {
-			V.SFhp = V.carriableSoldiers * App.SecExp.BaseSpecialForcesUnit.hp;
-		} else {
-			V.carriableSoldiers = V.SF.ArmySize;
-			V.SFhp = V.carriableSoldiers * App.SecExp.BaseSpecialForcesUnit.hp;
-		}
-	} else {
-		/* atk, def */
-		V.SFatk = Math.trunc(0.75 * upgradesSum);
-		V.SFdef = Math.trunc(0.50 * upgradesSum);
-		/* hp */
-		V.SFhp = V.SF.ArmySize * App.SecExp.BaseSpecialForcesUnit.hp;
-	}
-};
-
-/**
- * @param {Array<number>} rebellionIDs Array of unit IDs to be removed.
- */
-globalThis.removeUnits = function(rebellionIDs) {
-	V.militiaUnits = V.militiaUnits.filter(unit => !rebellionIDs.includes(unit.ID));
-	V.slaveUnits = V.slaveUnits.filter(unit => !rebellionIDs.includes(unit.ID));
-	V.mercUnits = V.mercUnits.filter(unit => !rebellionIDs.includes(unit.ID));
-};