diff --git a/src/Mods/SecExp/buildings/secBarracks.tw b/src/Mods/SecExp/buildings/secBarracks.tw
index 6d17d6903ad45bf7681209abb1d2e5d9c21bd693..a1c43ac213130d53f86511329ca29a311a5f5cde 100644
--- a/src/Mods/SecExp/buildings/secBarracks.tw
+++ b/src/Mods/SecExp/buildings/secBarracks.tw
@@ -243,17 +243,7 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 				<<if $SecExp.units.slaves.squads[_i].troops < $SecExp.units.slaves.squads[_i].maxTroops && $menials > 0>>
 					|
 					<<link "Replenish unit" "secBarracks">>
-						<<if $menials >= $SecExp.units.slaves.squads[_i].maxTroops - $SecExp.units.slaves.squads[_i].troops>>
-							<<set $menials -= $SecExp.units.slaves.squads[_i].maxTroops - $SecExp.units.slaves.squads[_i].troops>>
-							<<set _expLoss = ($SecExp.units.slaves.squads[_i].maxTroops - $SecExp.units.slaves.squads[_i].troops) / $SecExp.units.slaves.squads[_i].troops>>
-							<<set $SecExp.units.slaves.squads[_i].training -= $SecExp.units.slaves.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.slaves.squads[_i].troops = $SecExp.units.slaves.squads[_i].maxTroops>>
-						<<else>>
-							<<set _expLoss = $menials / $SecExp.units.slaves.squads[_i].troops>>
-							<<set $SecExp.units.slaves.squads[_i].training -= $SecExp.units.slaves.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.slaves.squads[_i].troops += $menials>>
-							<<set $menials = 0>>
-						<</if>>
+						<<run App.SecExp.unit.replenish($SecExp.units.slaves.squads[_i], "slaves")>>
 					<</link>>
 				<</if>>
 			<<else>>
@@ -315,17 +305,7 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 				<<if $SecExp.units.militia.squads[_i].troops < $SecExp.units.militia.squads[_i].maxTroops && $SecExp.units.militia.free > 0>>
 					|
 					<<link "Replenish unit" "secBarracks">>
-						<<if $SecExp.units.militia.free >= $SecExp.units.militia.squads[_i].maxTroops - $SecExp.units.militia.squads[_i].troops>>
-							<<set $SecExp.units.militia.free -= $SecExp.units.militia.squads[_i].maxTroops - $SecExp.units.militia.squads[_i].troops>>
-							<<set _expLoss = ($SecExp.units.militia.squads[_i].maxTroops - $SecExp.units.militia.squads[_i].troops) / $SecExp.units.militia.squads[_i].troops>>
-							<<set $SecExp.units.militia.squads[_i].training -= $SecExp.units.militia.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.militia.squads[_i].troops = $SecExp.units.militia.squads[_i].maxTroops>>
-						<<else>>
-							<<set _expLoss = $SecExp.units.militia.free / $SecExp.units.militia.squads[_i].troops>>
-							<<set $SecExp.units.militia.squads[_i].training -= $SecExp.units.militia.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.militia.squads[_i].troops += $SecExp.units.militia.free>>
-							<<set $SecExp.units.militia.free = 0>>
-						<</if>>
+						<<run App.SecExp.unit.replenish($SecExp.units.militia.squads[_i], "militia")>>
 					<</link>>
 				<</if>>
 			<<else>>
@@ -378,17 +358,7 @@ Your current maximum number of units is <<print App.SecExp.battle.maxUnits()>> (
 				<<if $SecExp.units.mercs.squads[_i].troops < $SecExp.units.mercs.squads[_i].maxTroops && $SecExp.units.mercs.free > 0>>
 					|
 					<<link "Replenish unit" "secBarracks">>
-						<<if $SecExp.units.mercs.free >= $SecExp.units.mercs.squads[_i].maxTroops - $SecExp.units.mercs.squads[_i].troops>>
-							<<set $SecExp.units.mercs.free -= $SecExp.units.mercs.squads[_i].maxTroops - $SecExp.units.mercs.squads[_i].troops>>
-							<<set _expLoss = ($SecExp.units.mercs.squads[_i].maxTroops - $SecExp.units.mercs.squads[_i].troops) / $SecExp.units.mercs.squads[_i].troops>>
-							<<set $SecExp.units.mercs.squads[_i].training -= $SecExp.units.mercs.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.mercs.squads[_i].troops = $SecExp.units.mercs.squads[_i].maxTroops>>
-						<<else>>
-							<<set _expLoss = $SecExp.units.mercs.free / $SecExp.units.mercs.squads[_i].troops>>
-							<<set $SecExp.units.mercs.squads[_i].training -= $SecExp.units.mercs.squads[_i].training * _expLoss>>
-							<<set $SecExp.units.mercs.squads[_i].troops += $SecExp.units.mercs.free>>
-							<<set $SecExp.units.mercs.free = 0>>
-						<</if>>
+						<<run App.SecExp.unit.replenish($SecExp.units.mercs.squads[_i], "mercs")>>
 					<</link>>
 				<</if>>
 			<<else>>
diff --git a/src/Mods/SecExp/js/Unit.js b/src/Mods/SecExp/js/Unit.js
index 2c472db10e8596803435a1efd5a9714a3b463245..a31b8c57023a2397112e4a111b1a24e91c4d31af 100644
--- a/src/Mods/SecExp/js/Unit.js
+++ b/src/Mods/SecExp/js/Unit.js
@@ -8,10 +8,39 @@ App.SecExp.unit = (function() {
 		deployMenu,
 		humanUpgradeList,
 		genID,
+		replenish,
 		replenishAll,
 		isDeployed,
 		humanSquads
 	};
+	
+	function base(string, operation = 'print', value = 0) {
+		let target, x = string.toLowerCase();
+		
+		if (x === "slaves") {
+			target = V.menials;
+		} else if (x === "militia") {
+			target = V.SecExp.units.militia.free;
+		} else if (x === "mercs") {
+			target = V.SecExp.units.mercs.free;
+		}
+
+		if (operation === 'print') {
+			return target;
+		} else if (operation === 'add') {
+			target += value;
+		} else if (operation === 'remove') {
+			target -= value;
+		} else if (operation === 'set') {
+			target = value;
+		} else if (operation === 'can upgrade') {
+			if (string === 'bots') {
+				return V.cash >= 500;
+			} else {
+				return target > 0;
+			}
+		}
+	}
 
 	/** Lists all potential military units as an array.
 	 *
@@ -367,18 +396,41 @@ App.SecExp.unit = (function() {
 			App.SecExp.unit.humanSquads().map(u => u.ID).reduce((acc, cur) => Math.max(acc, cur), 0)
 		) + 1;
 	}
+	
+	function replenish(squad, type) {
+		let expLoss;
+		
+		if (base(type) >= squad.maxTroops - squad.troops) {
+			if (type === "slaves") {
+				V.menials -= (squad.maxTroops - squad.troops);
+			} else if (type === "militia") {
+				V.SecExp.units.militia.free -= (squad.maxTroops - squad.troops);
+			} else if (type === "mercs") {
+				V.SecExp.units.mercs.free -= (squad.maxTroops - squad.troops);
+			}
+			expLoss = (squad.maxTroops - squad.troops) / squad.troops;
+			squad.troops = squad.maxTroops;
+		} else {
+			if (type === "slaves") {
+				expLoss = V.menials / squad.troops;
+				squad.troops += V.menials;
+				V.menials = 0;
+			} else if (type === "militia") {
+				expLoss = V.SecExp.units.militia.free / squad.troops;
+				squad.troops += V.SecExp.units.militia.free;
+				V.SecExp.units.militia.free = 0;
+			} else if (type === "mercs") {
+				expLoss = V.SecExp.units.mercs.free / squad.troops;
+				squad.troops += V.SecExp.units.mercs.free;
+				V.SecExp.units.mercs.free = 0;
+			}
+		}
+		squad.training -= squad.training * expLoss;
+	}
 
 	function replenishAll() {
 		let el = document.createElement("div");
-		let woundedUnit = [], expLoss;
-
-		function unitsFree(x) {
-			if (x === 'slaves') {
-				return V.menials;
-			} else {
-				return V.SecExp.units[x].free;
-			}
-		}
+		let woundedUnit = [];
 
 		if (V.SecExp.units.bots.troops < V.SecExp.units.bots.maxTroops && V.cash >= 500) {
 			woundedUnit.push('bots');
@@ -386,7 +438,7 @@ App.SecExp.unit = (function() {
 
 		for (const unit of list().slice(1)) {
 			for (const squad of V.SecExp.units[unit].squads) {
-				if (!woundedUnit.contains(unit) && squad.troops < squad.maxTroops && unitsFree(unit) > 0) {
+				if (!woundedUnit.contains(unit) && squad.troops < squad.maxTroops && base(unit, 'can upgrade')) {
 					woundedUnit.push(unit);
 				}
 			}
@@ -399,20 +451,8 @@ App.SecExp.unit = (function() {
 						cashX(-((V.SecExp.units.bots.maxTroops - V.SecExp.units.bots.troops) * 500), "securityExpansion");
 						V.SecExp.units.bots.troops = V.SecExp.units.bots.maxTroops;
 					} else {
-						let freeUnits = unitsFree(unit);
 						for (const squad of V.SecExp.units[unit].squads) {
-							if (squad.troops < squad.maxTroops && freeUnits > 0) {
-								if (freeUnits >= squad.maxTroops - squad.troops) {
-									freeUnits -= squad.maxTroops - squad.troops;
-									expLoss = (squad.maxTroops - squad.troops) / squad.troops;
-									squad.troops = squad.maxTroops;
-								} else {
-									expLoss = freeUnits / squad.troops;
-									squad.troops += freeUnits;
-									freeUnits = 0;
-								}
-								squad.training -= squad.training * expLoss;
-							}
+							replenish(squad, unit);
 						}
 					}
 				}
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index 23992d4263c48e67f549689fdcb2ae178ebd8f6a..c363e0f632f46d7ffadd7fce5f4ba50646be4035 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -160,6 +160,10 @@ App.SecExp.generator = (function() {
 					equip = sfActive ? either(3, 4) : either(2, 3, 4);
 				}
 			}
+			
+			if (V.SecExp.settings.difficulty > 1) {
+				troops *= V.SecExp.settings.difficulty;
+			}
 
 			shared();
 			V.SecExp.war.attacker.troops = troops;