diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index e76fe673db4cf9b2c559a805cbd37000e8f0dd80..a9fb197bc1f674f40e0a7cde80b7302313689a3d 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "3.5.3",
 	commitHash: null,
-	release: 1073
+	release: 1074
 };
diff --git a/src/Mods/SecExp/attackHandler.tw b/src/Mods/SecExp/attackHandler.tw
index 21134caec5f9fcd3225674bd20f1628b5d1295bc..11ee23f4ac78843b3b83180baea117a2aeb30e55 100644
--- a/src/Mods/SecExp/attackHandler.tw
+++ b/src/Mods/SecExp/attackHandler.tw
@@ -84,8 +84,8 @@
 			<<if $SF.Squad.GunS >= 1>>
 				<<set _defMod += $SF.Squad.GunS * 0.05>>
 			<</if>>
-			<<if $SF.Squad.Satellite.lv >= 5 && $SF.Squad.Satellite.InOrbit > 0>>
-				<<set _atkMod += ($SF.Squad.Satellite.lv - 5) * 0.05>>
+			<<if $SF.Squad.Satellite >= 5 && $SF.SatLaunched > 0>>
+				<<set _atkMod += ($SF.Squad.Satellite - 5) * 0.05>>
 			<</if>>
 			<<if $SF.Squad.GiantRobot >= 6>>
 				<<set _defMod += ($SF.Squad.GiantRobot - 5) * 0.05>>
diff --git a/src/Mods/SecExp/attackReport.tw b/src/Mods/SecExp/attackReport.tw
index 65d8d802a2d4f0c708f50762fa4c6a281439adf2..e73de6208a3b6a89bfacdd5c89995bdd80a8f086 100644
--- a/src/Mods/SecExp/attackReport.tw
+++ b/src/Mods/SecExp/attackReport.tw
@@ -1443,7 +1443,7 @@
 	<br>
 	<<include "unitsBattleReport">>
 
-	<<if $SF.Toggle && $SF.Active >= 1 && ($SF.Squad.Firebase >= 7 || $SF.Squad.GunS >= 1 || $SF.Squad.Satellite.lv >= 5 || $SF.Squad.GiantRobot >= 6 || $SF.Squad.MissileSilo >= 1)>>
+	<<if $SF.Toggle && $SF.Active >= 1 && ($SF.Squad.Firebase >= 7 || $SF.Squad.GunS >= 1 || $SF.Squad.Satellite >= 5 || $SF.Squad.GiantRobot >= 6 || $SF.Squad.MissileSilo >= 1)>>
 		/* SF upgrades effects */ <br><br>
 		<<if $SF.Squad.Firebase >= 7>>
 			The artillery pieces installed around $SF.Lower's firebase provided vital fire support to the troops in the field.
@@ -1451,7 +1451,7 @@
 		<<if $SF.Squad.GunS >= 1>>
 			The gunship gave our troops an undeniable advantage in recon capabilities, air superiority and fire support.
 		<</if>>
-		<<if $SF.Squad.Satellite.lv >= 5 && $SF.Squad.Satellite.InOrbit > 0>>
+		<<if $SF.Squad.Satellite >= 5 && $SF.SatLaunched > 0>>
 			The devastating power of $SF.Lower's satellite was employed with great efficiency against the enemy.
 		<</if>>
 		<<if $SF.Squad.GiantRobot >= 6>>
diff --git a/src/Mods/SecExp/authorityReport.tw b/src/Mods/SecExp/authorityReport.tw
index 2a243fa2ac115f8a2fff2ca8fc13730bdae55a97..dffcf96963e69d4c96e81183c3ef9937ac835be7 100644
--- a/src/Mods/SecExp/authorityReport.tw
+++ b/src/Mods/SecExp/authorityReport.tw
@@ -106,9 +106,10 @@ Your authority is
 	<<set _authGrowth += (12 * App.SecExp.battle.activeUnits())>>
 <</if>>
 
-<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>>
+<<set _size = App.SF.upgrades.total()>>
+<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>>
 	Having a powerful special force increases your authority.
-	<<set _authGrowth += ($SF.Size/10)>>
+	<<set _authGrowth += (_size/10)>>
 <</if>>
 
 <<if $arcologies[0].FSChattelReligionist >= 90>>
diff --git a/src/Mods/SecExp/buildings/riotControlCenter.tw b/src/Mods/SecExp/buildings/riotControlCenter.tw
index 1f4074f665c266e021bfba72e670b4606285c6fe..0a911347ae58092e021f3e32097594c68ca76d02 100644
--- a/src/Mods/SecExp/buildings/riotControlCenter.tw
+++ b/src/Mods/SecExp/buildings/riotControlCenter.tw
@@ -203,7 +203,7 @@ The riot control center opens its guarded doors to you. The great chamber inside
 <</if>>
 
 <<if $SF.Toggle && $SF.Active >= 1>>
-	<<if $SFSupportLevel >= 4 && !$SFGear && $SF.Squad.Armoury >= 8>> <<= App.SF.Count()>>
+	<<if $SFSupportLevel >= 4 && !$SFGear && $SF.Squad.Armoury >= 8>> <<set _Env = App.SF.env()>>
 		<br> <<link "Give the riot unit access to the combat armor suits of $SF.Lower.""riotControlCenter">> <<set $SFGear = 1,cashX(forceNeg(Math.ceil(500000*_Env*(1.15+($SF.Squad.Armoury/10)))), "capEx")>> <</link>>
 		//Costs <<print cashFormat(Math.ceil(500000*_Env*(1.15+($SF.Squad.Armoury/10))))>>
 	<<else>>
diff --git a/src/Mods/SecExp/securityReport.tw b/src/Mods/SecExp/securityReport.tw
index e0b14ca2d2db91ce2618025e25639d9c8bc24b37..5b3783426b744e2a6a6a3ae2f096301f60d91484 100644
--- a/src/Mods/SecExp/securityReport.tw
+++ b/src/Mods/SecExp/securityReport.tw
@@ -352,11 +352,11 @@ Due to the deterioration of the old world countries, organized crime focuses mor
 <<set $SecExp.core.crimeLow = Math.clamp(_newCrime,0,100)>>
 
 <<if $militiaFounded == 1 || App.SecExp.battle.activeUnits() >= 1>>
-	<br><br>
+	<br><br> <<set _size = App.SF.upgrades.total()>>
 	<strong> Military</strong>: /* militia */
-	<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>>
+	<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>>
 		Having a powerful special force attracts a lot of citizens, hopeful that they may be able to fight along side it.
-	<<set _recruitsMultiplier *= 1 + (random(1, (Math.round($SF.Size / 10))) / 20)>> /* not sure how high $SF.Size goes, so I hope this makes sense */
+	<<set _recruitsMultiplier *= 1 + (random(1, (Math.round(_size / 10))) / 20)>> /* not sure how high _size goes, so I hope this makes sense */
 	<</if>>
 	<<if $SecExp.buildings.propHub.active > 0>>
 		<<if $SecExp.buildings.propHub.campaign >= 1 && $SecExp.buildings.propHub.focus == "recruitment">>
@@ -503,9 +503,9 @@ Due to the deterioration of the old world countries, organized crime focuses mor
 			The powerful crime organizations that nested themselves in the arcology have an unending need for cheap guns for hire, many mercenaries flock to your free city in search of employment.
 			<<set _newMercs += random(1,2)>>
 		<</if>>
-		<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>>
+		<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>>
 			Having a powerful special force attracts a lot of mercenaries, hopeful that they may be able to fight along side it.
-			<<set _newMercs += random(1,Math.round($SF.Size/10))>>
+			<<set _newMercs += random(1,Math.round(_size/10))>>
 		<</if>>
 		<<if $discountMercenaries > 0>>
 			More mercenaries are attracted to your arcology as a result of the reduced rent.
diff --git a/src/Mods/SecExp/tradeReport.tw b/src/Mods/SecExp/tradeReport.tw
index edb838a44ea94b67e5c18371ce571a078f697f86..d27deed58f3ad89f9816723319a9dd079ac1730a 100644
--- a/src/Mods/SecExp/tradeReport.tw
+++ b/src/Mods/SecExp/tradeReport.tw
@@ -123,9 +123,10 @@
 	<</if>>
 <</if>>
 
-<<if $SF.Toggle && $SF.Active >= 1 && $SF.Size > 10>>
+<<set _size = App.SF.upgrades.total()>>
+<<if $SF.Toggle && $SF.Active >= 1 && _size > 10>>
 	Having a powerful special force increases trade security.
-	<<set _tradeChange += $SF.Size/10>>
+	<<set _tradeChange += _size/10>>
 <</if>>
 
 <<if _tradeChange > 0>>
diff --git a/src/Mods/SpecialForce/CheatEdit.tw b/src/Mods/SpecialForce/CheatEdit.tw
deleted file mode 100644
index f715f7231c124b3e9e3b25d8c9e0c300a4f6ffad..0000000000000000000000000000000000000000
--- a/src/Mods/SpecialForce/CheatEdit.tw
+++ /dev/null
@@ -1,44 +0,0 @@
-:: CheatEdit [nobr]
-
-<<set $nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", $returnTo = "Firebase">>
-<<= App.SF.Count()>>__Upgrades__: $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)>>%)
-<br><br>''Firebase:'' <<textbox "$SF.Squad.Firebase" $SF.Squad.Firebase "CheatEdit">>/_FU
-<br>''Armory:'' <<textbox "$SF.Squad.Armoury" $SF.Squad.Armoury "CheatEdit">>/_AU
-<br>''Drug Lab:'' <<textbox "$SF.Squad.Drugs" $SF.Squad.Drugs "CheatEdit">>/_DrugsU
-<<if $SF.Squad.Firebase >= 2>>
-	<br>''Drone Bay:'' <<textbox "$SF.Squad.Drones" $SF.Squad.Drones "CheatEdit">>/_DU
-<</if>>
-
-<<if $SF.Squad.Firebase >= 1 && $terrain != "oceanic">> <br><br>''Garage:''
-	<br>&nbsp;''Vehicles:''
-	<br>&nbsp;&nbsp;''Attack:'' <<textbox "$SF.Squad.AV" $SF.Squad.AV "CheatEdit">>/_AVU
-	<br>&nbsp;&nbsp;''Transport:'' <<textbox "$SF.Squad.TV" $SF.Squad.TV "CheatEdit">>/_TVU
-	<<if _T1>>
-		<br>&nbsp;''Prototype Goliath Tank:'' <<textbox "$SF.Squad.PGT" $SF.Squad.PGT "CheatEdit">>/_PGTU
-	<</if>>
-<</if>>
-
-<<if $SF.Squad.Firebase >= 4>> <br><br>''Hangar:''
-	<br>&nbsp;''Aircraft:''
-	<br>&nbsp;&nbsp;''Attack:'' <<textbox "$SF.Squad.AA" $SF.Squad.AA "CheatEdit">>/_AAU
-	<br>&nbsp;&nbsp;''Transport:'' <<textbox "$SF.Squad.TA" $SF.Squad.TA "CheatEdit">>/_TAU
-	<<if _T1>>
-		<br>&nbsp;''Spaceplane'': <<textbox "$SF.Squad.SpacePlane" $SF.Squad.SpacePlane "CheatEdit">>/_SPU
-		<br>&nbsp;''Gunship:'' <<textbox "$SF.Squad.GunS" $SF.Squad.GunS "CheatEdit">>/_GunSU
-		<br><br>''Launch Bay:''
-		<br>&nbsp;''Satellite:'' <<textbox "$SF.Squad.Satellite.lv" $SF.Squad.Satellite.lv "CheatEdit">>/_SatU
-		<<if $terrain != "oceanic">>
-			<br>&nbsp;''Giant Robot:'' <<textbox "$SF.Squad.GiantRobot" $SF.Squad.GiantRobot "CheatEdit">>/_GRU
-		<</if>>
-		<br>&nbsp;''Cruise Missile:'' <<textbox "$SF.Squad.MissileSilo" $SF.Squad.MissileSilo "CheatEdit">>/_MSU
-		<<if $terrain == "oceanic" || $terrain == "marine">> <br><br>''Naval Yard:''
-			<br>&nbsp;''Aircraft Carrier:'' <<textbox "$SF.Squad.AircraftCarrier" $SF.Squad.AircraftCarrier "CheatEdit">>/_ACU
-			<br>&nbsp;''Submarine:'' <<textbox "$SF.Squad.Sub" $SF.Squad.Sub "CheatEdit">>/_SubU
-			<br>&nbsp;''Amphibious Transport:'' <<textbox "$SF.Squad.HAT" $SF.Squad.HAT "CheatEdit">>/_HATU
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $SF.FS.Tension !== -1>>
-	<br><br>The Colonel's current Tension: <<textbox "$SF.FS.Tension" $SF.FS.Tension "CheatEdit">>
-<</if>>
diff --git a/src/Mods/SpecialForce/Firebase.tw b/src/Mods/SpecialForce/Firebase.tw
index 05013775d056916af542219e2f2fd2fd8a31d3e2..9e5a96b6d74d621d862326690d9a411187c23bdc 100644
--- a/src/Mods/SpecialForce/Firebase.tw
+++ b/src/Mods/SpecialForce/Firebase.tw
@@ -1,19 +1,12 @@
 :: Firebase [nobr jump-to-safe jump-from-safe]
 
-<<= App.SF.Count()>>
+<<set _max = App.SF.upgrades.max(), _Env = App.SF.env(), _size = App.SF.upgrades.total()>>
+
 <<if $SF.FS.Tension > 100>> <<= App.SF.fsIntegration('BadOutcome')>>
 <<else>>
-	<<switch _Env>> <<case 4>>
-			<<set _EnvCash2 = 450,_EnvCash3 = 200,_EnvCash4 = 100,_EnvProsp = 3>>
-		<<case 3>>
-			<<set _EnvCash2 = 500,_EnvCash3 = 250,_EnvCash4 = 150,_EnvProsp = 5>>
-		<<case 2>>
-			<<set _EnvCash2 = 550,_EnvCash3 = 300,_EnvCash4 = 200,_EnvProsp = 7>>
-	<</switch>>
-
 	<<set $nextButton = "Back", $nextLink = "Main">>
 
-	<<if $cheatMode > 0>> [[Cheat edit|CheatEdit][]] <br> <</if>>
+	<<if $cheatMode > 0 || $debugMode > 0>> [[Edit|editSF][]] <br> <</if>>
 	The firebase of $arcologies[0].name's <<textbox "$SF.Lower" $SF.Lower "Firebase">> is located in the lower levels, occupying unneeded warehouse space. It is not accessible to the general citizenry, but your personal elevator has express service to it. As you step off, two soldiers in combat armor manning the entry checkpoint tense before recognizing their Marshal and stepping aside with a sharp salute.<br>
 
 	You make your way to the operations center. The Colonel is
@@ -29,16 +22,14 @@
 
 	<br> <<link "Tour the firebase" "FirebaseTour">> <</link>> <br>
 
-	<<if $SF.Size === _max>>
-		<br>There are no more upgrades available.
-	<</if>>
-	<<if $SF.FS.Tension !== -1>>
-		The Colonel's current Tension: $SF.FS.Tension
+	<<if _size === _max>>
+		<br>There are no more upgrades available. <<run delete $SF.Upgrade>>
 	<</if>>
+	<<if $SF.FS.Tension !== -1>> The Colonel's current Tension: $SF.FS.Tension<</if>>
 
 	<<run App.UI.tabbar.handlePreSelectedTab($tabChoice.Firebase)>>
 	<div class="tabbar">
-		<<if $SF.Size !== _max>>
+		<<if _size !== _max>>
 			<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Upgrades')" id="tab Upgrades">Upgrades</button>
 		<</if>>
 		<button class="tablinks" onclick="App.UI.tabbar.openTab(event, 'Actions')" id="tab Actions">Actions</button>
@@ -47,7 +38,15 @@
 
 	<div id="Upgrades" class="tabcontent">
 		<div class="content">
-			<<include "Upgrades">>
+			<<set _T1 = App.SF.unlocked.secondTier()>>
+			Total upgrade progress: <<print App.SF.progress(_size,_max)>> _size/_max(<<print (_size/_max).toFixed(2)*100>>%) <<if _size < 30>> <br>//<<print (30-_size)>> more upgrades is needed until the next tier unlocks.// <</if>>
+
+			<<if $SF.Upgrade > 0>>
+				<<set _cost = Math.ceil(Math.abs($cash*.05 * (1.25 + (_size/1000))))>>
+				<br>[[Re-unlock upgrading.|Firebase][$SF.Upgrade = 0,cashX(-(_cost), "specialForces")]] @@.red;<<print cashFormat(_cost)>>@@
+			<<elseif _size < 30 || _size !== _max>>
+				<<include "Upgrades">>
+			<</if>>
 		</div>
 	</div>
 
@@ -97,18 +96,16 @@
 			<</if>>
 
 			<<if $SF.Squad.Firebase > 5 && $secExpEnabled > 0 && $SFSupportLevel >= 4 && App.SecExp.battle.maxUnits() === 18 && App.SecExp.battle.deploySpeed() <= 10>>
-				<br><br>[[Provide the security force with their own section.|Firebase][$sectionInFirebase = 1, cashX(forceNeg(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env)), "capEx")]]
-				@@.red;<<print cashFormat(Math.ceil((750000*(1.15+($SF.Size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@
+				<br><br>[[Provide the security force with their own section.|Firebase][$sectionInFirebase = 1, cashX(forceNeg(Math.ceil((750000*(1.15+(_size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env)), "capEx")]]
+				@@.red;<<print cashFormat(Math.ceil((750000*(1.15+(_size/1000))*(1.15+($SF.Squad.Firebase/10)))*_Env))>>@@
 			<</if>>
 
-			<<print App.SF.Interactions()>>
+			<<= App.SF.Interactions()>>
 			<<include "WC">>
 		</div>
 	</div>
 
 	<div id="FS" class="tabcontent">
-		<div class="content">
-			<<= App.SF.fsIntegration()>>
-		</div>
+		<div class="content"> <<= App.SF.fsIntegration()>> </div>
 	</div>
-<</if>>
+<</if>>
\ No newline at end of file
diff --git a/src/Mods/SpecialForce/FirebaseTour.tw b/src/Mods/SpecialForce/FirebaseTour.tw
index e4b7ecb70ca2616c1fa5455a5aec450848a1a281..82125801272756a23aac444b4d1387fd78b6da3b 100644
--- a/src/Mods/SpecialForce/FirebaseTour.tw
+++ b/src/Mods/SpecialForce/FirebaseTour.tw
@@ -96,16 +96,16 @@ As you approach, The Colonel
 <<= App.SF.UnitText('drugs')>> <<= App.SF.fsIntegration('OptionsFlavourText',45)>>
 <<= App.SF.UnitText('UAV')>> <<= App.SF.fsIntegration('OptionsFlavourText',55)>>
 
-	<<if _G > 0 && $SF.Squad.Firebase >= 1>> <br><br>''Garage:''
-		<<if $SF.Squad.AV+$SF.Squad.TV > 0>> <br>&nbsp;''Vehicles:''
-			<<= App.SF.UnitText('AV')>> <<= App.SF.UnitText('TV')>>
-		<</if>>
-		<<= App.SF.UnitText('PGT')>>
-		<<= App.SF.fsIntegration('OptionsFlavourText',60)>>
-		<<= App.SF.fsIntegration('OptionsFlavourText',65)>>
+<<if App.SF.unlocked.garage()>> <br><br>''Garage:''
+	<<if $SF.Squad.AV+$SF.Squad.TV > 0>> <br>&nbsp;''Vehicles:''
+		<<= App.SF.UnitText('AV')>> <<= App.SF.UnitText('TV')>>
+	<</if>>
+	<<= App.SF.UnitText('PGT')>>
+	<<= App.SF.fsIntegration('OptionsFlavourText',60)>>
+	<<= App.SF.fsIntegration('OptionsFlavourText',65)>>
 <</if>>
 
-<<if $SF.Squad.Firebase >= 4>>
+<<if App.SF.unlocked.hangar()>>
 	<<if _H > 0>> <br><br>''Hangar:''
 		<<if $SF.Squad.AA+$SF.Squad.TA > 0>> <br>&nbsp;''Airforce:''
 			<<= App.SF.UnitText('AA')>> <<= App.SF.UnitText('TA')>>
@@ -115,16 +115,16 @@ As you approach, The Colonel
 	<<= App.SF.fsIntegration('OptionsFlavourText',70)>>
 	<<= App.SF.fsIntegration('OptionsFlavourText',75)>>
 <</if>>
-<<if _T1 && _LB> 0>> <br><br>''Launch Bay:''
-	<<if $SF.Squad.Satellite.lv > 0>> <<= App.SF.UnitText('sat')>>
-		<<if $SF.Squad.Satellite.InOrbit < 1>>
-			<br>&nbsp;&nbsp;&nbsp;[[Launch it into geostationary orbit.|FirebaseTour][$SF.Squad.Satellite.InOrbit = 1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.//
+<<if App.SF.unlocked.launchBay()>> <br><br>''Launch Bay:''
+	<<if $SF.Squad.Satellite > 0>> <<= App.SF.UnitText('sat')>>
+		<<if $SF.SatLaunched < 1>>
+			<br>&nbsp;&nbsp;&nbsp;[[Launch it into geostationary orbit.|FirebaseTour][$SF.SatLaunched = 1]] //You <span class='red'>cannot</span> upgrade the satellite once it has been launched.//
 		<<else>>
-			<br>&nbsp;&nbsp;&nbsp;[[Recall the satellite.|FirebaseTour][$SF.Squad.Satellite.InOrbit = 0]]
+			<br>&nbsp;&nbsp;&nbsp;[[Recall the satellite.|FirebaseTour][$SF.SatLaunched = 0]]
 		<</if>>
 	<</if>>
 	<<= App.SF.UnitText('GR')>> <<= App.SF.UnitText('ms')>>
 <</if>>
-<<if _NY > 0>> <br><br>''Naval Yard:''
+<<if App.SF.unlocked.navalYard()>> <br><br>''Naval Yard:''
 	<<= App.SF.UnitText('AC')>> <<= App.SF.UnitText('Sub')>> <<= App.SF.UnitText('HAT')>>
 <</if>>
\ No newline at end of file
diff --git a/src/Mods/SpecialForce/NamingColonel.tw b/src/Mods/SpecialForce/NamingColonel.tw
index fe68dc0628e0b16390e6e5454fa9c5a05ef08f6a..b8a735058e6c385ac542daabd4f82c70add2edcc 100644
--- a/src/Mods/SpecialForce/NamingColonel.tw
+++ b/src/Mods/SpecialForce/NamingColonel.tw
@@ -1,7 +1,7 @@
 :: Security Force Naming-Colonel [nobr]
 
 <<set $nextButton = " ">>
-<<if $SF.IntroProgress < 0>>
+<<if $SF.IntroProgress === -1>>
 	<<setNonlocalPronouns $seeDicks>>
 	You instruct $assistant.name to announce to the arcology's citizenry that you will be making an important announcement in the near future regarding the security situation. Given the damage still present from the Daughters' attack, everyone will be tuning in. You also instruct your assistant to begin quietly investigating potential leadership figures for the force itself.
 	It's been a short while since you told your citizens that you were going to talk to them about their security, and by all accounts, they've turned out in force to watch your address over the arcology's internal communications system. You wake up early, relieve your frustrations on a few slaves woken out of deep sleep, and take position behind your desk. You also call over a slave and push _himU under your desk. The unspoken instruction is clear, and _heU begins enthusiastically
@@ -23,7 +23,7 @@
 	You close the link to the communication system and read a message from your assistant that appeared during the last moments of your address. In consultation with major figures in the mercenary community, a suitable candidate for day-to-day command of the new unit has been found. Your instructions were to keep you in the dark about them so as to avoid prejudgment. They are waiting outside your office.
 	<br><br>
 	[[Invite them inside|Security Force Naming-Colonel][$SF.IntroProgress = 1]]
-<<elseif $SF.IntroProgress < 2>>
+<<elseif $SF.IntroProgress === 1>>
 	The figure that enters is not what you were expecting, given your previous experiences with the mercenary groups that work with the arcology owners of the Free Cities. Most mercenaries you've worked with have been grizzled stout men, veterans of the old world militaries that finally had too much and went private. Instead, a woman walks in.
 	<<if $SF.Colonel.Core === "">>
 		She strikes you as someone who is likely to be:
@@ -133,7 +133,10 @@
 		<br><br>
 		[[Let her leave|Security Force Naming-Colonel][$SF.IntroProgress = 2]]
 	<</if>>
-<<elseif $SF.IntroProgress < 3>> <<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">>
+<<elseif $SF.IntroProgress === 2>>
+	<<set $nextLink = "RIE Eligibility Check",$nextButton = "Continue">>
+	<<run delete $SF.IntroProgress>>
+
 	She turns and leaves, and you chase the slave out after her. A few minutes later, a soft chime announces the arrival of a message. It's from The Colonel.
 	<br><br>
 	//Hey boss, just wanted to mention something else. In your speech you said that you were going to be paying for $SF.Lower. In my mind that means it's yours, no matter what anyone else here might think. I do what you tell me to do. I make sure the troops behave as you want them to behave. I've worked for some 'nice guys' in the past, and I can do that job if you want. It's boring, but sustainable, and I'll have $SF.Lower turning a profit and supporting the arcology in good order. But if you let me <<if $SF.Colonel.Core === "cruel">>off the leash<<else>>do what I do<</if>> and throw any old world complaints in the trash where they belong, I promise you'll have money pouring into your coffers, even accounting for the good amounts me and my boys will pocket along the way. You'll have an empire in short order.
@@ -144,4 +147,4 @@
 	Oh, one last thing. I know you've got some kind of grand social experiment going on up there like all the other arc owners, and that's your own deal, but I'd appreciate it if you could keep that stuff out of the new barracks. I'll have a hard time approaching potential recruits and telling them they should come live in a Roman apartment, an Egyptian temple, a goddamn Japanese teahouse, or some of the other crazy shit I've seen in the past. They're hard, nasty people, and trust me, I can tell you from experience that changing that is just not going to happen. Like I said, though, I can hold them back a bit if you like.
 	<br><br>
 	Talk to you later, boss.//
-<</if>>
+<</if>>
\ No newline at end of file
diff --git a/src/Mods/SpecialForce/Proposal.tw b/src/Mods/SpecialForce/Proposal.tw
index 934a91b28a292aa6b896a76623d2ac8a927c04b0..b3646d3defd73184a43103477e559824fcf705c9 100644
--- a/src/Mods/SpecialForce/Proposal.tw
+++ b/src/Mods/SpecialForce/Proposal.tw
@@ -18,4 +18,4 @@ Such a force would solve many problems. More soldiers would mean more control, w
 <</if>>
 <br>[[Prepare for an announcement.|Security Force Naming-Colonel][$SF.Active = 1, $SF.IntroProgress = -1, App.SF.Init(), cashX(forceNeg(_price), "specialForces")]]
 <br>&nbsp;//Initial costs are @@.yellowgreen;<<print cashFormat(_price)>>@@ and upon establishment the force will have significant support costs until it is self-sufficient.//
-<br>[[The current measures are enough|RIE Eligibility Check][$SF.Active = 0]]
\ No newline at end of file
+<br>[[The current measures are enough|RIE Eligibility Check][$SF.Active = 0, delete $SF.IntroProgress]]
\ No newline at end of file
diff --git a/src/Mods/SpecialForce/SpecialForce.js b/src/Mods/SpecialForce/SpecialForce.js
index 47848580fdb58f9128b59ed9746e71bdd5b740cb..6e9631705647a088540b809c864746b29475c89f 100644
--- a/src/Mods/SpecialForce/SpecialForce.js
+++ b/src/Mods/SpecialForce/SpecialForce.js
@@ -3,6 +3,160 @@ App.SF.Caps = function() {
 	return capFirstChar(V.SF.Lower || "the special force");
 };
 
+App.SF.weeklyGift = function(input) {
+	V.SF.Gift = input;
+	let value,
+		EnvProsp;
+	const env = App.SF.env(),
+		size = App.SF.upgrades.total();
+
+	switch(input) {
+		case 1:
+			value = Math.ceil(25000 * (size/10) * env);
+			value = (value > 5000 ? value : 5000);
+			break;
+		case 2:
+			value = 50 * (Math.ceil(size * 0.03 * env));
+			value = (Number(value) ? value : 500);
+			break;
+		case 3:
+			switch(env) {
+				case 4: EnvProsp = 3;
+				case 3: EnvProsp = 5;
+				case 2: EnvProsp = 7;
+			}
+			value = EnvProsp + (Math.ceil(size/100 * env));
+			break;
+	}
+	return value;
+}
+
+App.SF.unlocked = (function() {
+	return {
+		secondTier: secondTier,
+		garage: garage,
+		hangar: hangar,
+		launchBay: launchBay,
+		navalYard: navalYard
+	};
+
+	function secondTier() {
+		return V.SF.Squad.Firebase + V.SF.Squad.Armoury + V.SF.Squad.Drugs + V.SF.Squad.Drones
+		+ V.SF.Squad.AV + V.SF.Squad.TV + V.SF.Squad.AA + V.SF.Squad.TA >= 30;
+	}
+
+	function garage(mode = 'standard') {
+		if (V.SF.Squad.Firebase >= 1 && V.terrain !== "oceanic") {
+			if (V.SF.Squad.AV + V.SF.Squad.TV + V.SF.Squad.PGT > 0 || mode === 'cheat') {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	function hangar(mode = 'standard') {
+		if (V.SF.Squad.Firebase >= 4) {
+			if (V.SF.Squad.AA + V.SF.Squad.TA + V.SF.Squad.SpacePlane + V.SF.Squad.GunS > 0 || mode === 'cheat') {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	function launchBay(mode = 'standard') {
+		if (secondTier()) {
+			if (V.SF.Squad.Satellite + V.SF.Squad.GiantRobot + V.SF.Squad.MissileSilo > 0 || mode === 'cheat') {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	function navalYard(mode = 'standard') {
+		if (secondTier() && (V.terrain === "oceanic" || V.terrain === "marine")) {
+			if (V.SF.Squad.AircraftCarrier + V.SF.Squad.Sub + V.SF.Squad.HAT > 0 || mode === 'cheat') {
+				return true;
+			}
+		}
+		return false;
+	}
+})();
+
+App.SF.upgrades = (function() {
+	return {
+		total: total,
+		list: list,
+		max: max,
+		currentUnitMax: currentUnitMax,
+	};
+
+	function total() {
+		return Object.values(V.SF.Squad).reduce((a,b) => a+b);
+	}
+
+	function list(completeView = '') {
+		let array = ['Armoury', 'Firebase', 'Drugs'];
+		const T1 = App.SF.unlocked.secondTier();
+
+		if (V.SF.Squad.Firebase >= 2 || completeView === 'all') {
+			array.push('Drones');
+		}
+
+		if (V.terrain !== "oceanic" && (V.SF.Squad.Firebase >= 1 || completeView === 'all')) { // Garage
+			array.push('AV', 'TV');
+			if (completeView === 'all' || T1) {
+				array.push('PGT');
+			}
+		}
+
+		if (V.SF.Squad.Firebase >= 4 || completeView === 'all') { // Hangar
+			array.push('AA', 'TA');
+			if (completeView === 'all' || T1) {
+				array.push('SpacePlane', 'GunS');
+			}
+		}
+
+		if (completeView === 'all' || T1) { // Launch Bay
+			array.push('Satellite');
+			if (V.terrain !== "oceanic" && V.terrain !== "marine") {
+				array.push('GiantRobot', 'MissileSilo');
+			} else if (V.terrain === "oceanic" || V.terrain === "marine") { // Naval Yard
+				array.push('AircraftCarrier', 'Sub', 'HAT');
+			}
+		}
+
+		return array;
+	}
+
+	function max() {
+		return list('all').length * 10;
+	}
+
+	function currentUnitMax(input) {
+		const T1 = App.SF.unlocked.secondTier();
+
+		if (T1 === false) {
+			if (['Armoury', 'Firebase', 'Drugs', 'Drones', 'AV', 'TV', 'AA', 'TA'].includes(input)) {
+				return 5;
+			} else {
+				return 0;
+			}
+		} else if (T1 === true) {
+			if (!['SpacePlane', 'GunS', 'Satellite', 'GiantRobot', 'MissileSilo', 'AircraftCarrier', 'Sub', 'HAT'].includes(input)) {
+				return 10;
+			} else {
+				if (V.PC.skill.warfare >= 75) {
+					return 10;
+				} else if (V.PC.skill.warfare >= 50) {
+					return 9;
+				} else {
+					return 8;
+				}
+			}
+		}
+	}
+})();
+
 App.SF.Init = function() {
 	if (passage() === "init" || passage() === "New Game Plus") {
 		V.SF = {Active: -1, Toggle: 0};
@@ -12,62 +166,54 @@ App.SF.Init = function() {
 
 	if (V.SF.Toggle && V.SF.Active >= 1) {
 		Object.assign(V.SF, {
-		UC: {Assign: 0, lock: 0},
-		Depravity: 0,
-		Size: 0,
-		Upgrade: 0,
-		Gift: 0,
-		ROE: "hold",
-		Target: "recruit",
-		Regs: "strict",
-		Lower: "the special force",
-		ArmySize: 40,
-		Squad: {
-			Armoury: 0,
-			Firebase: 0,
-			AV: 0,
-			TV: 0,
-			Drones: 0,
-			Drugs: 0,
-			PGT: 0,
-			AA: 0,
-			TA: 0,
-			SpacePlane: 0,
-			GunS: 0,
-			Satellite: {
-				lv: 0,
-				InOrbit: 0
+			UC: {Assign: 0, lock: 0},
+			Depravity: 0,
+			Size: 0,
+			Upgrade: 0,
+			Gift: 0,
+			ROE: "hold",
+			Target: "recruit",
+			Regs: "strict",
+			Lower: "the special force",
+			ArmySize: 40,
+			SatLaunched: 0,
+			Squad: {},
+			Colonel: {
+				Core: "",
+				Talk: 0,
+				Fun: 0,
+				Status: 0
 			},
-			GiantRobot: 0,
-			MissileSilo: 0,
-			AircraftCarrier: 0,
-			Sub: 0,
-			HAT: 0
-		},
-		Colonel: {
-			Core: "",
-			Talk: 0,
-			Fun: 0,
-			Status: 0
-		},
-		MercCon: {
-			History: 0,
-			CanAttend: 0,
-			Income: 0,
-			Revenue: 0,
-			Mercs: 0,
-			Menials: 0,
-			TotalMenials: 0,
-			TotalMercs: 0
-		}
+			MercCon: {
+				History: 0,
+				CanAttend: 0,
+				Income: 0,
+				Revenue: 0,
+				Mercs: 0,
+				Menials: 0,
+				TotalMenials: 0,
+				TotalMercs: 0
+			}
 		});
+
+		for (let i = 0; i < App.SF.upgrades.list('all').length; i++) {
+			V.SF.Squad[App.SF.upgrades.list('all')[i]] = 0;
+		}
+
+		const Revivalisms = ['Roman_Revivalism', 'Aztec_Revivalism', 'Egyptian_Revivalism', 'Edo_Revivalism', 'Arabian_Revivalism', 'Chinese_Revivalism', 'Multiculturalism'];
+		let FS_OPTIONS = ['Repopulation', 'Eugenics', 'Gender_radicalism', 'Gender_traditionalism', 'Paternalism', 'Degradationism', 'Body_Purism', 'Transformation_Fetishism', 'Youth_Preferentialism', 'Maturity_Preferentialism', 'Slimness_Enthusiasm', 'Asset_Expansionism', 'Slave_Pastoralism', 'Physical_Idealism', 'Hedonistic_Decadence', 'Chattel_Religionism'];
+		FS_OPTIONS = FS_OPTIONS.concat(Revivalisms);
+		for (let i = 0; i < FS_OPTIONS.length; i++) {
+			if (V.SF.FS[FS_OPTIONS[i]] === undefined) {
+				V.SF.FS[FS_OPTIONS[i]] = {lv: 0, vaildOption: 1, gift: 0};
+			}
+		}
 	}
 	// V.arcologies[0].SFRaid = 1; V.arcologies[0].SFRaidTarget = -1;
 };
 
 /* no-usedOnce */
 App.SF.BC = function() {
-
 	function InitClean() {
 		delete V.SFMODToggle;
 		delete V.securityForceActive;
@@ -149,7 +295,6 @@ App.SF.BC = function() {
 		if (V.SF.Active >= 1) {
 			Object.assign(V.SF, {
 				Depravity: V.securityForceDepravity,
-				Size: V.SFAO,
 				Upgrade: V.securityForceUpgradeToken,
 				Gift: V.securityForceGiftToken,
 				UC: {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock},
@@ -234,6 +379,8 @@ App.SF.BC = function() {
 
 			V.SF.ArmySize = V.securityForcePersonnel;
 
+			V.SF.SatLaunched = 0;
+
 			V.SF.Squad = {
 				Armoury: V.securityForceInfantryPower,
 				Firebase: V.securityForceArcologyUpgrades,
@@ -246,7 +393,7 @@ App.SF.BC = function() {
 				TA: V.securityForceAircraftPower,
 				SpacePlane: V.securityForceSpacePlanePower,
 				GunS: V.securityForceAC130,
-				Satellite: {lv: V.securityForceSatellitePower, InOrbit: 0},
+				Satellite: V.securityForceSatellitePower,
 				GiantRobot: V.securityForceGiantRobot,
 				MissileSilo: V.securityForceMissileSilo,
 				AircraftCarrier: V.securityForceAircraftCarrier,
@@ -258,10 +405,12 @@ App.SF.BC = function() {
 			App.SF.Init();
 		}
 	} else if (typeof V.SF === "object") {
+		V.SF.FS = V.SF.FS || {};
+		V.SF.FS.Tension = V.SF.FS.Tension || -1;
+
 		if (V.SF.Toggle && V.SF.Active >= 1) {
 			V.SF.UC = V.SF.UC || {};
 			V.SF.Depravity = V.SF.Depravity || 0;
-			V.SF.Size = V.SF.Size || 0;
 			V.SF.Upgrade = V.SF.Upgrade || 0;
 			V.SF.Gift = V.SF.Gift || 0;
 			V.SF.UC.Assign = V.SF.UC.Assign || 0;
@@ -274,26 +423,11 @@ App.SF.BC = function() {
 			V.SF.ArmySize = V.SF.ArmySize || 40;
 
 			V.SF.Squad = V.SF.Squad || {};
-			V.SF.Squad.Armoury = V.SF.Squad.Armoury || 0;
-			V.SF.Squad.Firebase = V.SF.Squad.Firebase || 0;
-			V.SF.Squad.AV = V.SF.Squad.AV || 0;
-			V.SF.Squad.TV = V.SF.Squad.TV || 0;
-			V.SF.Squad.Drones = V.SF.Squad.Drones || 0;
-			V.SF.Squad.Drugs = V.SF.Squad.Drugs || 0;
-			V.SF.Squad.PGT = V.SF.Squad.PGT || 0;
-			V.SF.Squad.AA = V.SF.Squad.AA || 0;
-			V.SF.Squad.TA = V.SF.Squad.TA || 0;
-			V.SF.Squad.SpacePlane = V.SF.Squad.SpacePlane || 0;
-			V.SF.Squad.GunS = V.SF.Squad.GunS || 0;
-
-			V.SF.Squad.Satellite = V.SF.Squad.Satellite || {};
-			V.SF.Squad.Satellite.lv = V.SF.Squad.Satellite.lv || 0;
-			V.SF.Squad.Satellite.InOrbit = V.SF.Squad.Satellite.InOrbit || 0;
-			V.SF.Squad.GiantRobot = V.SF.Squad.GiantRobot || 0;
-			V.SF.Squad.MissileSilo = V.SF.Squad.MissileSilo || 0;
-			V.SF.Squad.AircraftCarrier = V.SF.Squad.AircraftCarrier || 0;
-			V.SF.Squad.Sub = V.SF.Squad.Sub || 0;
-			V.SF.Squad.HAT = V.SF.Squad.HAT || 0;
+			for (let i = 0; i < App.SF.upgrades.list('all').length; i++) {
+				V.SF.Squad[App.SF.upgrades.list('all')[i]] = V.SF.Squad[App.SF.upgrades.list('all')[i]] || 0;
+			}
+
+			V.SF.SatLaunched = V.SF.SatLaunched || 0;
 
 			V.SF.Colonel = V.SF.Colonel || {};
 			V.SF.Colonel.Core = V.SF.Colonel.Core || "";
@@ -313,98 +447,120 @@ App.SF.BC = function() {
 			V.SF.MercCon.Menials = V.SF.MercCon.Menials || 0;
 			V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalMenials || 0;
 			V.SF.MercCon.TotalMercs = V.SF.MercCon.TotalMercs || 0;
-		}
-	}
 
-	delete V.SF.tour; delete V.SF.Caps;
-	if (_.get(V.SF, 'FS.upgrade')) {
-		delete V.SF.FS.upgrade;
-	}
+			if (typeof V.SF.Squad.Satellite === "object") {
+				if (V.SF.Squad.Satellite.InOrbit > 0) {
+					V.SF.SatLaunched = V.SF.Squad.Satellite.InOrbit; delete V.SF.Squad.Satellite.InOrbit;
+				}
+				V.SF.Squad.Satellite = V.SF.Squad.Satellite.lv;
+			}
 
-	if (jsDef(V.SF.Squad) && jsDef(V.SF.Squad.Troops)) {
-		V.SF.ArmySize = V.SF.Squad.Troops;
-		delete V.SF.Squad.Troops;
-	}
+			delete V.SF.FS.upgrade; delete V.SF.UC.num;
 
-	if (V.SF.MercCon !== undefined) {
-		if( V.SF.MercCon.View !== undefined) {
-			delete V.SF.MercCon.View;
-		}
-		if (V.SF.MercCon.Helots !== undefined) {
-			V.SF.MercCon.Menials = V.SF.MercCon.Helots;
-			delete V.SF.MercCon.Helots;
-		}
-		if (V.SF.MercCon.TotalHelots !== undefined) {
-			V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots;
-			delete V.SF.MercCon.TotalHelots;
-		}
-	}
+			if (jsDef(V.choice)) {
+				V.SF.Gift = V.choice;
+			}
 
-	if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) {
-		V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock};
-	}
-	delete V.SF.SpecOps;
-	delete V.SF.SpecOpsLock;
-	if (V.SFUC !== undefined) {
-		V.SF.UC.num = V.SFUC || 0;
+			if (V.Tour !== undefined) {
+				V.SF.tour = V.Tour || 0;
+			}
+
+			if (V.SF.Squad.Troops) {
+				V.SF.ArmySize = V.SF.Squad.Troops;
+				delete V.SF.Squad.Troops;
+			}
+
+			if (V.SF.MercCon !== undefined) {
+				if( V.SF.MercCon.View !== undefined) {
+					delete V.SF.MercCon.View;
+				}
+				if (V.SF.MercCon.Helots !== undefined) {
+					V.SF.MercCon.Menials = V.SF.MercCon.Helots;
+					delete V.SF.MercCon.Helots;
+				}
+				if (V.SF.MercCon.TotalHelots !== undefined) {
+					V.SF.MercCon.TotalMenials = V.SF.MercCon.TotalHelots;
+					delete V.SF.MercCon.TotalHelots;
+				}
+			}
+
+			if (V.SF.SpecOps !== undefined && V.SF.SpecOpsLock !== undefined) {
+				V.SF.UC = {Assign: V.SF.SpecOps, Lock: V.SF.SpecOpsLock};
+			}
+
+			if (V.SFUC !== undefined) {
+				V.SF.UC.num = V.SFUC || 0;
+			}
+
+			if (V.SpecOpsLock !== undefined) {
+				V.SF.SpecOpsLock = V.SpecOpsLock;
+			}
+
+			if (V.SF.U !== undefined) {
+				V.SF.Upgrade = V.SF.U || 0;
+			}
+
+			if (V.SF.WG !== undefined) {
+				V.SF.Gift = V.SF.WG || 0;
+			}
+
+			if (V.SF.Depravity < 0) {
+				V.SF.Depravity = 0;
+			}
+
+			if (V.SFUnit !== undefined) {
+				if (V.SFUnit.AT !== undefined) {
+					V.SFUnitTA = 0;
+				}
+				if (V.SFTradeShow !== undefined) {
+					V.SF.MercCon = V.SFTradeShow;
+				}
+				delete V.SFTradeShow;
+				if (V.SFColonel !== undefined) {
+					V.SF.Colonel = V.SFColonel;
+				}
+
+				if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) {
+					V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched};
+					V.SF.Squad.Satellite = V.SF.Squad.Sat;
+					delete V.SF.Squad.Sat;
+					delete V.SatLaunched;
+				}
+			}
+		} // closes: V.SF.Toggle && V.SF.Active >= 1
 	}
-	delete V.SFUC;
 
-	if (V.SF.MWU !== undefined) {
-		delete V.SF.MWU;
+	delete V.Tour; delete V.SFColonel; delete V.SFUnit;
+	delete V.SF.tour; delete V.SF.Caps; delete V.SF.Size; delete V.choice;
+	delete V.SF.Units; delete V.SpecOpsLock; delete V.SF.U; delete V.SF.WG;
+	delete V.SF.Subsidy; delete V.SF.SpecOps; delete V.SF.SpecOpsLock; delete V.SFUC;
+
+	if (V.SF.BadOutcome !== undefined) {
+		delete V.SF.BadOutcome;
 	}
-	if (V.SpecOpsLock !== undefined) {
-		V.SF.SpecOpsLock = V.SpecOpsLock;
+	if (V.arcologies[0].SFRaid !== undefined) {
+		delete V.arcologies[0].SFRaid;
 	}
-	delete V.SpecOpsLock;
-	if (V.SF.U !== undefined) {
-		V.SF.Upgrade = V.SF.U || 0;
+	if (V.arcologies[0].SFRaidTarget !== undefined) {
+		delete V.arcologies[0].SFRaidTarget;
 	}
-	delete V.SF.U;
-	if (V.SF.WG !== undefined) {
-		V.SF.Gift = V.SF.WG || 0;
+	if (V.SF.Facility !== undefined) {
+		delete V.SF.Facility;
 	}
-	delete V.SF.WG;
 
+	if (V.SF.MWU !== undefined) {
+		delete V.SF.MWU;
+	}
 	if (V.SF.Bonus !== undefined) {
 		delete V.SF.Bonus;
 	}
-	if (V.SF.Depravity < 0) {
-		V.SF.Depravity = 0;
-	}
-	if (V.SF.Units !== undefined) {
-		V.SF.Size = V.SF.Units;
-	}
-	delete V.SF.Units;
-	if (V.SFUnit !== undefined) {
-		if (V.SFUnit.AT !== undefined) {
-			V.SFUnitTA = 0;
-		}
-		if (V.SFTradeShow !== undefined) {
-			V.SF.MercCon = V.SFTradeShow;
-		}
-		delete V.SFTradeShow;
-		if (V.SFColonel !== undefined) {
-			V.SF.Colonel = V.SFColonel;
-		}
-		delete V.SFColonel;
-		if (V.SF.Squad !== undefined && V.SF.Squad.Satellite !== undefined && V.SatLaunched !== undefined) {
-			V.SF.Squad.Sat = {lv: V.SF.Squad.Satellite, InOrbit: V.SatLaunched};
-			V.SF.Squad.Satellite = V.SF.Squad.Sat;
-			delete V.SF.Squad.Sat;
-			delete V.SatLaunched;
-			delete V.SFUnit;
-		}
-	}
+
 	InitClean();
 	MainClean();
 	ColonelClean();
 	TradeShowClean();
 	UnitsClean();
-	delete V.SF.Subsidy;
-	if (jsDef(V.SF.UC)) {
-		delete V.SF.UC.num;
-	}
+
 	if (V.week < 72 && V.SF.Active !== -1) { V.SF.Active = -1; }
 };
 /* usedOnce */
@@ -2280,7 +2436,6 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100) {
 			Active: -2,
 			Toggle: V.SF.Toggle,
 			ArmySize: V.SF.ArmySize,
-			Size: V.SF.Size,
 			FS: {
 				Tension: V.SF.FS.Tension,
 				BadOutcome: BadOutcome
@@ -2307,10 +2462,10 @@ App.SF.fsIntegration = function(input = 'Menu', textDisplay = 100) {
 
 App.SF.AAR = function(endWeekCall = 1) {
 	const
-		T = State.temporary,
 		S = V.SF.Squad,
 		target = 50000,
-		baseLine = 5000;
+		baseLine = 5000,
+		size = App.SF.upgrades.total();
 	let profit = 0,
 		upkeep = 0,
 		income = 0,
@@ -2337,10 +2492,9 @@ App.SF.AAR = function(endWeekCall = 1) {
 			unitCap = 2500,
 			Trade = 0.025;
 		let cost = {a: 0.01, b: 2.5},
-			NO = 1 + (V.SF.Size / 5),
-			N1 = 1 + (V.SF.Size / 5);
+			NO = 1 + (size / 5),
+			N1 = 1 + (size / 5);
 
-		App.SF.Count();
 		let SFD = V.SF.Depravity;
 		if (profit < 1) {
 			cost.a = 10;
@@ -2371,7 +2525,7 @@ App.SF.AAR = function(endWeekCall = 1) {
 			upkeep += (V.SF.ArmySize * 25) / cost.a;
 			if (V.secExpEnabled > 0 && endWeekCall > 0) {
 				V.SecExp.core.authority += 25 * (Math.ceil(V.SF.ArmySize / 200));
-				V.SecExp.core.authority += V.SF.Size * 10;
+				V.SecExp.core.authority += size * 10;
 				V.SecExp.core.authority = Math.clamp(V.SecExp.core.authority, 0, 20000);
 			}
 		}
@@ -2561,7 +2715,7 @@ App.SF.AAR = function(endWeekCall = 1) {
 			}
 		}
 
-		income += ((baseLine * (1 + Multiplier.troop / NO).toFixed(2) * (1 + Multiplier.unit / NO).toFixed(2) * (1 + Multiplier.action / NO).toFixed(2) * (1 + Multiplier.depravity / NO).toFixed(2)) - (upkeep * N1).toFixed(2)) / ((V.SF.Size / 2 + V.SF.ArmySize / 2) * 5);
+		income += ((baseLine * (1 + Multiplier.troop / NO).toFixed(2) * (1 + Multiplier.unit / NO).toFixed(2) * (1 + Multiplier.action / NO).toFixed(2) * (1 + Multiplier.depravity / NO).toFixed(2)) - (upkeep * N1).toFixed(2)) / ((size / 2 + V.SF.ArmySize / 2) * 5);
 		if (V.SF.Target === "raiding") {
 			income *= 1.25;
 		} else {
@@ -2663,7 +2817,7 @@ App.SF.AAR = function(endWeekCall = 1) {
 					menialGiftsPerAttendee = 5,
 					NewMercs = 0;
 				let menialGifts = Math.ceil(jsRandom(1, ((tradeShowAttendes * menialGiftsPerAttendee) / 10)));
-				let TSProfit = Math.ceil(500000 * (1 + (V.SF.Size / 1000)) * (1 + (V.arcologies[0].prosperity / 1000)) * T.Env);
+				let TSProfit = Math.ceil(500000 * (1 + (size / 1000)) * (1 + (V.arcologies[0].prosperity / 1000)) * App.SF.env());
 
 				V.SF.MercCon.Menials += menialGifts;
 				V.SF.MercCon.TotalMenials += menialGifts;
@@ -2692,157 +2846,20 @@ App.SF.AAR = function(endWeekCall = 1) {
 	}
 };
 
-App.SF.Count = function() {
-	const
-		T = State.temporary,
-		C = Math.clamp, // sure that's correct? // Yes it works as intended.
-		S = V.SF.Squad,
-		E = V.economy;
-	T.FU = 10;
-	S.Firebase = C(S.Firebase, 0, T.FU);
-	T.AU = 10;
-	S.Armoury = C(S.Armoury, 0, T.AU);
-	T.DrugsU = 10;
-	S.Drugs = C(S.Drugs, 0, T.DrugsU);
-	T.DU = 10;
-	S.Drones = C(S.Drones, 0, T.DU);
-	T.AVU = 10;
-	S.AV = C(S.AV, 0, T.AVU);
-	T.TVU = 10;
-	S.TV = C(S.TV, 0, T.TVU);
-	T.AAU = 10;
-	S.AA = C(S.AA, 0, T.AAU);
-	T.TAU = 10;
-	S.TA = C(S.TA, 0, T.TAU);
-
-	if (V.PC.skill.warfare >= 75) {
-		T.PGTU = 10;
-		T.SPU = 10;
-		T.GunSU = 10;
-		T.SatU = 10;
-		T.GRU = 10;
-		T.MSU = 10;
-		T.ACU = 10;
-		T.SubU = 10;
-		T.HATU = 10;
-	} else if (V.PC.skill.warfare >= 50) {
-		T.PGTU = 9;
-		T.SPU = 9;
-		T.GunSU = 9;
-		T.SatU = 9;
-		T.GRU = 9;
-		T.MSU = 9;
-		T.ACU = 9;
-		T.SubU = 9;
-		T.HATU = 9;
-	} else {
-		T.PGTU = 8;
-		T.SPU = 8;
-		T.GunSU = 8;
-		T.SatU = 8;
-		T.GRU = 8;
-		T.MSU = 8;
-		T.ACU = 8;
-		T.SubU = 8;
-		T.HATU = 8;
-	}
-
-	S.PGT = C(S.PGT, 0, T.PGTU);
-	S.SpacePlane = C(S.SpacePlane, 0, T.SPU);
-	S.GunS = C(S.GunS, 0, T.GunSU);
-	S.Satellite.lv = C(S.Satellite.lv, 0, T.SatU);
-	S.GiantRobot = C(S.GiantRobot, 0, T.GRU);
-	S.MissileSilo = C(S.MissileSilo, 0, T.MSU);
-	S.AircraftCarrier = C(S.AircraftCarrier, 0, T.ACU);
-	S.Sub = C(S.Sub, 0, T.SubU);
-	S.HAT = C(S.HAT, 0, T.HATU);
-	T.GU = T.AVU + T.TVU + T.PGTU;
-	T.G = S.AV + S.TV + S.PGT;
-	T.H = S.AA + S.TA + S.SpacePlane + S.GunS;
-	T.HU = T.AAU + T.TAU + T.SPU + T.GunSU;
-	T.LBU = T.SatU + T.MSU;
-	T.LB = S.Satellite.lv + S.MissileSilo;
-	T.Base = S.Firebase + S.Armoury + S.Drugs + S.Drones + T.H;
-	T.max = T.FU + T.AU + T.DrugsU + T.DU + T.HU;
-	// if (V.SF.Facility.Toggle > 0) T.Base + = 1; T.max + = 1;
-
-	if (V.terrain !== "oceanic" && V.terrain !== "marine") {
-		T.LBU += T.GRU;
-		T.LB += S.GiantRobot;
-		T.Base += T.G;
-		T.max += T.GU;
-		T.max += T.LBU;
-		T.Base += T.LB;
-	} else {
-		T.NY = S.AircraftCarrier + S.Sub + S.HAT;
-		T.Base += T.NY;
-		T.NYU = T.ACU + T.SubU + T.HATU;
-		T.max += T.NYU;
-	}
-	V.SF.Size = T.Base;
-	V.SF.Size = C(V.SF.Size, 0, T.max);
-	T.T1 = 0;
-
-	if (V.SF.FS.Tension === -1) {
-		const Revivalisms = ['Roman_Revivalism', 'Aztec_Revivalism', 'Egyptian_Revivalism', 'Edo_Revivalism', 'Arabian_Revivalism', 'Chinese_Revivalism', 'Multiculturalism'];
-		let FS_OPTIONS = ['Repopulation', 'Eugenics', 'Gender_radicalism', 'Gender_traditionalism', 'Paternalism', 'Degradationism', 'Body_Purism', 'Transformation_Fetishism', 'Youth_Preferentialism', 'Maturity_Preferentialism', 'Slimness_Enthusiasm', 'Asset_Expansionism', 'Slave_Pastoralism', 'Physical_Idealism', 'Hedonistic_Decadence', 'Chattel_Religionism'];
-		FS_OPTIONS = FS_OPTIONS.concat(Revivalisms);
-		for (let i = 0; i < FS_OPTIONS.length; i++) {
-				if (V.SF.FS[FS_OPTIONS[i]] === undefined) {
-					V.SF.FS[FS_OPTIONS[i]] = {lv: 0, vaildOption: 1, gift: 0};
-				}
-			}
-	}
-
-	if (E > 100) {
-		T.Env = 4;
-	} else if (E > 67) {
-		T.Env = 3;
+App.SF.env = function() {
+	if (V.economy > 100) {
+		return 4;
+	} else if (V.economy > 67) {
+		return 3;
 	} else {
-		T.Env = 2;
-	}
-
-	if (V.SF.Size >= 30) {
-		T.T1 = 1;
-	}
-
-	if (V.SF.IntroProgress > -1) {
-		delete V.SF.IntroProgress;
-	}
-
-	if (V.SF.Size === T.max) {
-		delete V.SF.Upgrade;
-	}
-
-	if (V.SF.BadOutcome !== undefined) {
-		delete V.SF.BadOutcome;
-	}
-
-	if (V.Tour !== undefined) {
-		V.SF.tour = V.Tour || 0;
-		delete V.Tour;
-	}
-	V.SF.tour = V.SF.tour || 0;
-
-	if (V.arcologies[0].SFRaid !== undefined) {
-		delete V.arcologies[0].SFRaid;
-	}
-
-	if (V.arcologies[0].SFRaidTarget !== undefined) {
-		delete V.arcologies[0].SFRaidTarget;
-	}
-
-	if (V.SF.Facility !== undefined) {
-		delete V.SF.Facility;
+		return 2;
 	}
 };
 
 App.SF.UpgradeCost = function(cost, unit) {
 	"use strict";
-	const
-		T = State.temporary,
-		S = V.SF.Squad;
-	let value = cost * T.Env * (1.15 + (V.SF.Size / 10)) * (1.15 + (unit / 100));
+	const S = V.SF.Squad;
+	let value = cost * App.SF.env() * (1.15 + (App.SF.upgrades.total() / 10)) * (1.15 + (unit / 100));
 	if ([S.AircraftCarrier, S.Drones, S.GiantRobot, S.GunS, S.MissileSilo, S.Satellite.lv, S.SpacePlane, S.Sub].includes(unit)) {
 		value *= V.HackingSkillMultiplier;
 	}
@@ -2855,7 +2872,7 @@ App.SF.progress = function(x, max) {
 		z, i;
 	if (max === undefined) {
 		Math.clamp(x, 0, 10);
-		if (V.SF.Size < 30) {
+		if (App.SF.unlocked.secondTier() === false) {
 			z = 5 - x;
 			for (i = 0; i < x; i++) {
 				out += `█⏐`;
@@ -2912,17 +2929,17 @@ App.SF.Interactions = function() {
 	const
 		C = V.SF.Colonel;
 	if (V.SF.Gift > 0) {
-		if (V.choice === 1) {
+		if (V.SF.Gift === 1) {
 			choice += `${App.SF.Caps()} is turning over spare capital in tribute this week. `;
 			if (C.Talk + C.Fun !== 1) {
-				choice += `"I think I can find <span class='yellowgreen'>${cashFormat(Math.ceil(V.CashGift))}</span> for you, boss."`;
+				choice += `"I think I can find <span class='yellowgreen'>${cashFormat(App.SF.weeklyGift(1))}</span> for you, boss."`;
 			}
-		} else if (V.choice === 2) {
+		} else if (V.SF.Gift === 2) {
 			choice += `${App.SF.Caps()} will be throwing a military parade this week. `;
 			if (C.Talk + C.Fun !== 1) {
 				choice += `"I expect the <span class='green'>public to enjoy</span> the parade, boss."`;
 			}
-		} else if (V.choice === 3) {
+		} else if (V.SF.Gift === 3) {
 			choice += `${App.SF.Caps()} will be conducting corporate sabotage on rival arcologies' businesses. `;
 			if (C.Talk + C.Fun !== 1) {
 				choice += `"Our interests should see a <span class='yellowgreen'>big boost,</span> boss."`;
@@ -3136,19 +3153,19 @@ App.SF.UnitText = function(input) {
 
 	let loc2 = ``;
 	if (V.week % 6 === 0) {
-			loc2 += `is`;
-			if (input !== 'HAT') {
-				loc2 += ` moored to`;
-			} else {
-				loc2 += ` parked on`;
-			}
-			loc2 += ` the pier in the Naval Yard`;
-			if (input === 'HAT') {
-				loc2 += `, ready to ferry ${tons} tons of soldiers and vehicles`;
-			}
+		loc2 += `is`;
+		if (input !== 'HAT') {
+			loc2 += ` moored to`;
 		} else {
-			loc2 += `is patrolling the waters near ${V.arcologies[0].name}`;
+			loc2 += ` parked on`;
+		}
+		loc2 += ` the pier in the Naval Yard`;
+		if (input === 'HAT') {
+			loc2 += `, ready to ferry ${tons} tons of soldiers and vehicles`;
 		}
+	} else {
+		loc2 += `is patrolling the waters near ${V.arcologies[0].name}`;
+	}
 	switch (input) {
 		case 'firebase':
 			if (S.Firebase >= 0) {
@@ -3598,7 +3615,7 @@ App.SF.UnitText = function(input) {
 			if (S.Satellite.lv >= 1) {
 				const text12 = `<br>&nbsp;<b>Satellite:</b>`;
 				if (S.Satellite.lv >= 2) {
-					if (V.SF.Squad.Satellite.InOrbit < 1) {
+					if (V.SF.SatLaunched === 0) {
 						loc1 = `The satellite is being worked on in the Launch Bay.`;
 					} else {
 						loc1 = `The satellite is in geosynchronous orbit, far above the arcology.`;
diff --git a/src/Mods/SpecialForce/Upgrades.tw b/src/Mods/SpecialForce/Upgrades.tw
index 93144aef4a84b4581149c4e5626e306dc542bcc3..539360722e394426fea40ade9708c406d31a3b4b 100644
--- a/src/Mods/SpecialForce/Upgrades.tw
+++ b/src/Mods/SpecialForce/Upgrades.tw
@@ -1,272 +1,278 @@
 :: Upgrades [nobr]
 
-<br><br>
-Total upgrade progress: <<print App.SF.progress($SF.Size,_max)>> $SF.Size/_max(<<print ($SF.Size/_max).toFixed(2)*100>>%) <<if $SF.Size < 30>> <br>//<<print (30-$SF.Size)>> more upgrades is needed until the next tier unlocks.// <</if>>
+<br>Which facility or equipment do you wish to upgrade this week? <br>
 
-<<if $SF.Upgrade > 0 && ($SF.Size !== _max)>>
-	<<set _cost = Math.ceil(Math.abs($cash*.05*(1.25+($SF.Size/1000))))>>
-		<br>[[Re-unlock upgrading.|Firebase][$SF.Upgrade = 0,cashX(-(_cost), "specialForces")]] @@.red;<<print cashFormat(_cost)>>@@
+<<set _FU = App.SF.upgrades.currentUnitMax('Firebase')>>
+<<if $SF.Squad.Firebase < _FU>>
+	<<set _cF = App.SF.UpgradeCost(100000,$SF.Squad.Firebase)>>
+	<<if $cash >= _cF>> <br>
+		[[Upgrade Firebase|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Firebase++, cashX(-(_cF), "specialForces")]]
+	<<else>>
+		//Cannot afford to upgrade the Firebase.//
+	<</if>>
+	//Costs @@.red;<<print cashFormat(_cF)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Firebase)>> </span> <br>
+<<elseif $SF.Squad.Firebase === _FU>>
+	//The Firebase has been fully upgraded.// <br>
 <</if>>
 
-<<if ($SF.Size < 30 || $SF.Size !== _max) && $SF.Upgrade < 1>>
-<br>Which facility or equipment do you wish to upgrade this week? <br>
+<<set _AU = App.SF.upgrades.currentUnitMax('Armoury')>>
+<<if $SF.Squad.Armoury < _AU>>
+	<<set _cA = App.SF.UpgradeCost(40000,$SF.Squad.Armoury)>>
+	<<if $cash >= _cA>>
+		[[Upgrade Armory|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Armoury++, cashX(-(_cA), "specialForces")]]
+	<<else>>
+		//Cannot afford to upgrade the Armory.//
+	<</if>>
+	//Costs @@.red;<<print cashFormat(_cA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Armoury)>> </span> <br>
+<<elseif $SF.Squad.Armoury === _AU>>
+	//The Armory has been fully upgraded.// <br>
+<</if>>
 
-	<<if $SF.Squad.Firebase < 5||_T1 && $SF.Squad.Firebase < _FU>>
-		<<set _cF = App.SF.UpgradeCost(100000,$SF.Squad.Firebase)>>
-		<<if $cash >= _cF>> <br>
-			[[Upgrade Firebase|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Firebase++, cashX(-(_cF), "specialForces")]]
-		<<else>>
-			//Cannot afford to upgrade the Firebase.//
-		<</if>>
-		//Costs @@.red;<<print cashFormat(_cF)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Firebase)>> </span> <br>
-	<<elseif $SF.Squad.Firebase === _FU>>
-		//The Firebase has been fully upgraded.// <br>
+<<set _DrugsU = App.SF.upgrades.currentUnitMax('Drugs')>>
+<<if $SF.Squad.Drugs < _DrugsU>>
+	<<set _cDrugs = App.SF.UpgradeCost(40000,$SF.Squad.Drugs)>>
+	<<if $cash >= _cDrugs>>
+		[[Upgrade Drug Lab|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drugs++, cashX(-(_cDrugs), "specialForces")]]
+	<<else>>
+			//Cannot afford to upgrade the Drug Lab.//
 	<</if>>
+	//Costs @@.red;<<print cashFormat(_cDrugs)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drugs)>> </span> <br>
+<<elseif $SF.Squad.Drugs === _DrugsU>>
+	//The Drug Lab has been fully upgraded.// <br>
+<</if>>
 
-	<<if $SF.Squad.Armoury < 5||_T1 && $SF.Squad.Armoury < _AU>>
-		<<set _cA = App.SF.UpgradeCost(40000,$SF.Squad.Armoury)>>
-		<<if $cash >= _cA>>
-			[[Upgrade Armory|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Armoury++, cashX(-(_cA), "specialForces")]]
-		<<else>>
-			//Cannot afford to upgrade the Armory.//
-		<</if>>
-		//Costs @@.red;<<print cashFormat(_cA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Armoury)>> </span> <br>
-	<<elseif $SF.Squad.Armoury === _AU>>
-		//The Armory has been fully upgraded.// <br>
+<<set _DU = App.SF.upgrades.currentUnitMax('Drones')>>
+<<if $SF.Squad.Firebase >= 2 && $SF.Squad.Drones < _DU>>
+	<<set _cDrones = App.SF.UpgradeCost(45000,$SF.Squad.Drones)>>
+	<<if $cash >= _cDrones>>
+		[[Upgrade Drone Bay|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drones++, cashX(-(_cDrones), "specialForces")]]
+	<<else>>
+		//Cannot afford to upgrade the Drone Bay.//
 	<</if>>
+	//Costs @@.red;<<print cashFormat(_cDrones)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drones)>> </span> <br>
+<<elseif $SF.Squad.Drones === _DU>>
+	//The Drone Bay has been fully upgraded.// <br>
+<</if>>
 
-	<<if $SF.Squad.Drugs < 5||_T1 && $SF.Squad.Drugs < _DrugsU>>
-		<<set _cDrugs = App.SF.UpgradeCost(40000,$SF.Squad.Drugs)>>
-		<<if $cash >= _cDrugs>>
-			[[Upgrade Drug Lab|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drugs++, cashX(-(_cDrugs), "specialForces")]]
+<<if App.SF.unlocked.garage()>> <br>''Garage''<br>
+	<div style="margin-left:2em">
+	<<set _AVU = App.SF.upgrades.currentUnitMax('AV')>>
+	<<if $SF.Squad.AV < _AVU>>
+		<<set _cAV = App.SF.UpgradeCost(60000,$SF.Squad.AV)>>
+		<<if $cash >= _cAV>>
+			[[Upgrade Attack Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AV++, cashX(-(_cAV), "specialForces")]]
 		<<else>>
-				//Cannot afford to upgrade the Drug Lab.//
+			//Cannot afford to upgrade the Attack Vehicle Fleet.//
 		<</if>>
-		//Costs @@.red;<<print cashFormat(_cDrugs)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drugs)>> </span> <br>
-	<<elseif $SF.Squad.Drugs === _DrugsU>>
-		//The Drug Lab has been fully upgraded.// <br>
+		//Costs @@.red;<<print cashFormat(_cAV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AV)>> </span> <br>
+	<<elseif $SF.Squad.AV === _AVU>>
+		//The Attack Vehicle Fleet has been fully upgraded.// <br>
 	<</if>>
+	</div>
 
-	<<if $SF.Squad.Firebase >= 2 && ($SF.Squad.Drones < 5 ||_T1 && $SF.Squad.Drones < _DU)>>
-		<<set _cDrones = App.SF.UpgradeCost(45000,$SF.Squad.Drones)>>
-		<<if $cash >= _cDrones>>
-			[[Upgrade Drone Bay|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Drones++, cashX(-(_cDrones), "specialForces")]]
+	<div style="margin-left:2em">
+	<<set _TVU = App.SF.upgrades.currentUnitMax('TV')>>
+	<<if $SF.Squad.TV < _TVU>>
+		<<set _cTV = App.SF.UpgradeCost(60000,$SF.Squad.TV)>>
+		<<if $cash >= _cTV>>
+			[[Upgrade Transport Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TV++, cashX(-(_cTV), "specialForces")]]
 		<<else>>
-			//Cannot afford to upgrade the Drone Bay.//
+			//Cannot afford to upgrade Transport Vehicle Fleet.//
 		<</if>>
-		//Costs @@.red;<<print cashFormat(_cDrones)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.Drones)>> </span> <br>
-	<<elseif $SF.Squad.Drones === _DU>>
-		//The Drone Bay has been fully upgraded.// <br>
+		//Costs @@.red;<<print cashFormat(_cTV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TV)>> </span> <br>
+	<<elseif $SF.Squad.TV === _TVU>>
+		//The Transport Vehicle Fleet has been fully upgraded.// <br>
 	<</if>>
+	</div>
 
-	<<if $SF.Squad.Firebase >= 1 && $terrain !== "oceanic">> <br>''Garage''<br>
-		<div style="margin-left:2em">
-		<<if ($SF.Squad.AV < 5||_T1 && $SF.Squad.AV < _AVU)>>
-			<<set _cAV = App.SF.UpgradeCost(60000,$SF.Squad.AV)>>
-			<<if $cash >= _cAV>>
-				[[Upgrade Attack Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AV++, cashX(-(_cAV), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade the Attack Vehicle Fleet.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cAV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AV)>> </span> <br>
-		<<elseif $SF.Squad.AV === _AVU>>
-			//The Attack Vehicle Fleet has been fully upgraded.// <br>
+	<div style="margin-left:2em">
+	<<set _PGTU = App.SF.upgrades.currentUnitMax('PGT')>>
+	<<if $SF.Squad.PGT < _PGTU>>
+		<<set _cPGT = App.SF.UpgradeCost(735000,$SF.Squad.PGT)>>
+		<<if $cash >= _cPGT>>
+			[[Upgrade Prototype Goliath tank|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.PGT++, cashX(-(_cPGT), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade Prototype Goliath Tank.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cPGT)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br>
+	<<elseif $SF.Squad.PGT === _PGTU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br>
+	<<elseif $SF.Squad.PGT === _PGTU>>
+		//The Prototype Goliath Tank has been fully upgraded.// <br>
+	<</if>>
+	</div>
+<</if>> /*Closes garage.*/
 
-		<div style="margin-left:2em">
-		<<if ($SF.Squad.TV < 5||_T1 && $SF.Squad.TV < _TVU)>>
-			<<set _cTV = App.SF.UpgradeCost(60000,$SF.Squad.TV)>>
-			<<if $cash >= _cTV>>
-				[[Upgrade Transport Vehicle Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TV++, cashX(-(_cTV), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Transport Vehicle Fleet.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cTV)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TV)>> </span> <br>
-		<<elseif $SF.Squad.TV === _TVU>>
-			//The Transport Vehicle Fleet has been fully upgraded.// <br>
+<<if App.SF.unlocked.hangar()>>''Hangar''<br>
+	<div style="margin-left:2em">
+	<<set _AAU = App.SF.upgrades.currentUnitMax('AA')>>
+	<<if $SF.Squad.AA < _AAU>>
+		<<set _cAA = App.SF.UpgradeCost(70000,$SF.Squad.AA)>>
+		<<if $cash >= _cAA>>
+			[[Upgrade Attack Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AA++, cashX(-(_cAA), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade Attack Aircraft Fleet.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cAA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AA)>> </span> <br>
+	<<elseif $SF.Squad.AA === _AAU>>
+		//The Attack Aircraft Fleet has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
-		<div style="margin-left:2em">
-		<<if _T1 && $SF.Squad.PGT < _PGTU>>
-			<<set _cPGT = App.SF.UpgradeCost(735000,$SF.Squad.PGT)>>
-			<<if $cash >= _cPGT>>
-				[[Upgrade Prototype Goliath tank|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.PGT++, cashX(-(_cPGT), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Prototype Goliath Tank.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cPGT)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br>
-		<<elseif $SF.Squad.PGT === _PGTU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.PGT)>> </span> <br>
-		<<elseif $SF.Squad.PGT === _PGTU>>
-			//The Prototype Goliath Tank has been fully upgraded.// <br>
+	<div style="margin-left:2em">
+	<<set _TAU = App.SF.upgrades.currentUnitMax('TA')>>
+	<<if $SF.Squad.TA < _TAU>>
+		<<set _cTA = App.SF.UpgradeCost(70000,$SF.Squad.TA)>>
+		<<if $cash >= _cTA>>
+			[[Upgrade Transport Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TA++, cashX(-(_cTA), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade the Transport Aircraft Fleet.//
 		<</if>>
-		</div>
-	<</if>> /*Closes garage.*/
+		//Costs @@.red;<<print cashFormat(_cTA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TA)>> </span> <br>
+	<<elseif $SF.Squad.TA === _TAU>>
+		//The Transport Aircraft Fleet has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
-	<<if $SF.Squad.Firebase >= 4>>''Hangar''<br>
-		<div style="margin-left:2em">
-		<<if $SF.Squad.AA < 5||_T1 && $SF.Squad.AA < _AAU>>
-			<<set _cAA = App.SF.UpgradeCost(70000,$SF.Squad.AA)>>
-			<<if $cash >= _cAA>>
-				[[Upgrade Attack Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AA++, cashX(-(_cAA), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Attack Aircraft Fleet.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cAA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.AA)>> </span> <br>
-		<<elseif $SF.Squad.AA === _AAU>>
-			//The Attack Aircraft Fleet has been fully upgraded.// <br>
+	<div style="margin-left:2em">
+	<<set _SPU = App.SF.upgrades.currentUnitMax('SpacePlane')>>
+	<<if $SF.Squad.SpacePlane < _SPU>>
+		<<set _cSP = App.SF.UpgradeCost(250000,$SF.Squad.SpacePlane)>>
+		<<if $cash >= _cSP>>
+			[[Upgrade Spaceplane|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.SpacePlane++, cashX(-(_cSP), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade the Spaceplane.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cSP)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br>
+	<<elseif $SF.Squad.SpacePlane === _SPU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br>
+	<<elseif $SF.Squad.SpacePlane === _SPU>>
+		//The Spaceplane has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
-		<div style="margin-left:2em">
-		<<if $SF.Squad.TA < 5||_T1 && $SF.Squad.TA < _TAU>>
-			<<set _cTA = App.SF.UpgradeCost(70000,$SF.Squad.TA)>>
-			<<if $cash >= _cTA>>
-				[[Upgrade Transport Aircraft Fleet|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.TA++, cashX(-(_cTA), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade the Transport Aircraft Fleet.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cTA)>>@@// <span style="float:right;"> <<print App.SF.progress($SF.Squad.TA)>> </span> <br>
-		<<elseif $SF.Squad.TA === _TAU>>
-			//The Transport Aircraft Fleet has been fully upgraded.// <br>
+	<div style="margin-left:2em">
+	<<set _GunSU = App.SF.upgrades.currentUnitMax('GunS')>>
+	<<if $SF.Squad.GunS < _GunSU>>
+		<<set _cGunS = App.SF.UpgradeCost(350000,$SF.Squad.GunS)>>
+		<<if $cash >= _cGunS>>
+			[[Upgrade Gunship|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GunS++, cashX(-(_cGunS), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade Gunship.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cGunS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br>
+	<<elseif $SF.Squad.GunS === _GunSU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br>
+	<<elseif $SF.Squad.GunS === _GunSU>>
+		//The Gunship has been fully upgraded.// <br>
+	<</if>>
+	</div>
+<</if>> /*Closes hangar.*/
 
-		<div style="margin-left:2em">
-		<<if _T1 && $SF.Squad.SpacePlane < _SPU>>
-			<<set _cSP = App.SF.UpgradeCost(250000,$SF.Squad.SpacePlane)>>
-			<<if $cash >= _cSP>>
-				[[Upgrade Spaceplane|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.SpacePlane++, cashX(-(_cSP), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade the Spaceplane.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cSP)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br>
-		<<elseif $SF.Squad.SpacePlane === _SPU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.SpacePlane)>> </span> <br>
-		<<elseif $SF.Squad.SpacePlane === _SPU>>
-			//The Spaceplane has been fully upgraded.// <br>
+<<if App.SF.unlocked.launchBay()>>''Launch Bay''
+	<div style="margin-left:2em">
+	<<set _SatU = App.SF.upgrades.currentUnitMax('Satellite')>>
+	<<if $SF.Squad.Satellite < _SatU && $SF.SatLaunched < 1>>
+		<<set _cSat = App.SF.UpgradeCost(525000,$SF.Squad.Satellite)>>
+		<<if $cash >= _cSat>>
+			[[Upgrade Satellite|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Satellite++, cashX(-(_cSat), "specialForces")]]
+		<<else>>
+			//Cannot afford to upgrade Satellite.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cSat)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite)>> </span> <br>
+	<<elseif $SF.Squad.Satellite === _SatU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite)>> </span> <br>
+	<<else>>
+		//The Satellite has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
+	<<if $terrain !== "oceanic">>
 		<div style="margin-left:2em">
-		<<if _T1 && $SF.Squad.GunS < _GunSU>>
-			<<set _cGunS = App.SF.UpgradeCost(350000,$SF.Squad.GunS)>>
-			<<if $cash >= _cGunS>>
-				[[Upgrade Gunship|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GunS++, cashX(-(_cGunS), "specialForces")]]
+		<<set _GRU = App.SF.upgrades.currentUnitMax('GiantRobot')>>
+		<<if $SF.Squad.GiantRobot < _GRU>>
+			<<set _cGR = App.SF.UpgradeCost(550000,$SF.Squad.GiantRobot)>>
+			<<if $cash >= _cGR>>
+				[[Upgrade Giant Robot|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GiantRobot++, cashX(-(_cGR), "specialForces")]]
 			<<else>>
-				//Cannot afford to upgrade Gunship.//
+				//Cannot afford to upgrade the Giant Robot.//
 			<</if>>
-			//Costs @@.red;<<print cashFormat(_cGunS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br>
-		<<elseif $SF.Squad.GunS === _GunSU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GunS)>> </span> <br>
-		<<elseif $SF.Squad.GunS === _GunSU>>
-			//The Gunship has been fully upgraded.// <br>
+			//Costs @@.red;<<print cashFormat(_cGR)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br>
+		<<elseif $SF.Squad.GiantRobot === _GRU && $PC.skill.warfare < 75>>
+			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br>
+		<<else>>
+			//The Giant Robot has been fully upgraded.// <br>
 		<</if>>
 		</div>
-	<</if>> /*Closes hangar.*/
 
-	<<if _T1>>''Launch Bay''
 		<div style="margin-left:2em">
-		<<if $SF.Squad.Satellite.lv < _SatU && $SF.Squad.Satellite.InOrbit < 1>>
-			<<set _cSat = App.SF.UpgradeCost(525000,$SF.Squad.Satellite.lv)>>
-			<<if $cash >= _cSat>>
-				[[Upgrade Satellite|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Satellite.lv++, cashX(-(_cSat), "specialForces")]]
+		<<set _MSU = App.SF.upgrades.currentUnitMax('MissileSilo')>>
+		<<if $SF.Squad.MissileSilo < _MSU>>
+			<<set _cMS = App.SF.UpgradeCost(565000,$SF.Squad.MissileSilo)>>
+			<<if $cash >= _cMS>>
+				[[Upgrade Cruise Missile|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.MissileSilo++, cashX(-(_cMS), "specialForces")]]
 			<<else>>
-				//Cannot afford to upgrade Satellite.//
+				//Cannot afford to upgrade Cruise Missile.//
 			<</if>>
-			//Costs @@.red;<<print cashFormat(_cSat)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite.lv)>> </span> <br>
-		<<elseif $SF.Squad.Satellite.lv === _SatU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Satellite.lv)>> </span> <br>
+			//Costs @@.red;<<print cashFormat(_cMS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br>
+		<<elseif $SF.Squad.MissileSilo === _MSU && $PC.skill.warfare < 75>>
+			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br>
 		<<else>>
-			//The Satellite has been fully upgraded.// <br>
+			//The Cruise Missile has been fully upgraded.// <br>
 		<</if>>
 		</div>
+	<</if>>
+<</if>> /*Closes Launch Bay.*/
 
-		<<if $terrain !== "oceanic">>
-			<div style="margin-left:2em">
-			<<if $SF.Squad.GiantRobot < _GRU>>
-				<<set _cGR = App.SF.UpgradeCost(550000,$SF.Squad.GiantRobot)>>
-				<<if $cash >= _cGR>>
-					[[Upgrade Giant Robot|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.GiantRobot++, cashX(-(_cGR), "specialForces")]]
-				<<else>>
-					//Cannot afford to upgrade the Giant Robot.//
-				<</if>>
-				//Costs @@.red;<<print cashFormat(_cGR)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br>
-			<<elseif $SF.Squad.GiantRobot === _GRU && $PC.skill.warfare < 75>>
-				//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.GiantRobot)>> </span> <br>
-			<<else>>
-				//The Giant Robot has been fully upgraded.// <br>
-			<</if>>
-			</div>
-
-			<div style="margin-left:2em">
-			<<if $SF.Squad.MissileSilo < _MSU>>
-				<<set _cMS = App.SF.UpgradeCost(565000,$SF.Squad.MissileSilo)>>
-				<<if $cash >= _cMS>>
-					[[Upgrade Cruise Missile|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.MissileSilo++, cashX(-(_cMS), "specialForces")]]
-				<<else>>
-					//Cannot afford to upgrade Cruise Missile.//
-				<</if>>
-				//Costs @@.red;<<print cashFormat(_cMS)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br>
-			<<elseif $SF.Squad.MissileSilo === _MSU && $PC.skill.warfare < 75>>
-				//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.MissileSilo)>> </span> <br>
-			<<else>>
-				//The Cruise Missile has been fully upgraded.// <br>
-			<</if>>
-			</div>
-	<</if>> /*Closes Launch Bay.*/
-
-	<<if _T1 && ($terrain == "oceanic" || $terrain == "marine")>>''Naval Yard''<br>
-		<div style="margin-left:2em">
-		<<if $SF.Squad.AircraftCarrier < _ACU>>
-			<<set _cAC = App.SF.UpgradeCost(650000,$SF.Squad.AircraftCarrier)>>
-			<<if $cash >= _cAC>>
-				[[Upgrade Aircraft Carrier|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AircraftCarrier++, cashX(-(_cAC), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Aircraft Carrier.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cAC)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br>
-		<<elseif $SF.Squad.AircraftCarrier === _ACU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br>
+<<if App.SF.unlocked.navalYard()>>''Naval Yard''<br>
+	<div style="margin-left:2em">
+	<<set _ACU = App.SF.upgrades.currentUnitMax('AircraftCarrier')>>
+	<<if $SF.Squad.AircraftCarrier < _ACU>>
+		<<set _cAC = App.SF.UpgradeCost(650000,$SF.Squad.AircraftCarrier)>>
+		<<if $cash >= _cAC>>
+			[[Upgrade Aircraft Carrier|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.AircraftCarrier++, cashX(-(_cAC), "specialForces")]]
 		<<else>>
-			//The Aircraft Carrier has been fully upgraded.// <br>
+			//Cannot afford to upgrade Aircraft Carrier.//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cAC)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br>
+	<<elseif $SF.Squad.AircraftCarrier === _ACU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.AircraftCarrier)>> </span> <br>
+	<<else>>
+		//The Aircraft Carrier has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
-		<div style="margin-left:2em">
-		<<if $SF.Squad.Sub < _SubU>>
-			<<set _cSub = App.SF.UpgradeCost(700000,$SF.Squad.Sub)>>
-			<<if $cash >= _cSub>>
-				[[Upgrade Submarine|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Sub++, cashX(-(_cSub), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Submarine//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cSub)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span>
-		<<elseif $SF.Squad.Sub === _SubU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span>
+	<div style="margin-left:2em">
+	<<set _SubU = App.SF.upgrades.currentUnitMax('Sub')>>
+	<<if $SF.Squad.Sub < _SubU>>
+		<<set _cSub = App.SF.UpgradeCost(700000,$SF.Squad.Sub)>>
+		<<if $cash >= _cSub>>
+			[[Upgrade Submarine|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.Sub++, cashX(-(_cSub), "specialForces")]]
 		<<else>>
-			//The Submarine has been fully upgraded.// <br>
+			//Cannot afford to upgrade Submarine//
 		<</if>>
-		</div>
+		//Costs @@.red;<<print cashFormat(_cSub)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span>
+	<<elseif $SF.Squad.Sub === _SubU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.Sub)>> </span>
+	<<else>>
+		//The Submarine has been fully upgraded.// <br>
+	<</if>>
+	</div>
 
-		<div style="margin-left:2em">
-		<<if $SF.Squad.HAT < _HATU>>
-			<<set _cHAT = App.SF.UpgradeCost(665000,$SF.Squad.HAT)>>
-			<<if $cash >= _cHAT>>
-				[[Upgrade Amphibious Transport|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.HAT++, cashX(-(_cHAT), "specialForces")]]
-			<<else>>
-				//Cannot afford to upgrade Amphibious Transport.//
-			<</if>>
-			//Costs @@.red;<<print cashFormat(_cHAT)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span>
-		<<elseif $SF.Squad.HAT === _HATU && $PC.skill.warfare < 75>>
-			//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> <br>
+	<div style="margin-left:2em">
+	<<set _HATU = App.SF.upgrades.currentUnitMax('HAT')>>
+	<<if $SF.Squad.HAT < _HATU>>
+		<<set _cHAT = App.SF.UpgradeCost(665000,$SF.Squad.HAT)>>
+		<<if $cash >= _cHAT>>
+			[[Upgrade Amphibious Transport|Firebase][$SF.Upgrade = 1, $SF.Colonel.Talk += 1, $SF.Squad.HAT++, cashX(-(_cHAT), "specialForces")]]
 		<<else>>
-			//The Amphibious Transport has been fully upgraded.// <br>
+			//Cannot afford to upgrade Amphibious Transport.//
 		<</if>>
-		</div>
-	<</if>> /*Closes Naval Yard.*/
-
-<</if>>
-<</if>>
\ No newline at end of file
+		//Costs @@.red;<<print cashFormat(_cHAT)>>@@//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span>
+	<<elseif $SF.Squad.HAT === _HATU && $PC.skill.warfare < 75>>
+		//Your warfare skill is not high enough unlock the next upgrade.//<span style="float:right;"> <<print App.SF.progress($SF.Squad.HAT)>> </span> <br>
+	<<else>>
+		//The Amphibious Transport has been fully upgraded.// <br>
+	<</if>>
+	</div>
+<</if>> /*Closes Naval Yard.*/
\ No newline at end of file
diff --git a/src/Mods/SpecialForce/WeeklyChoices.tw b/src/Mods/SpecialForce/WeeklyChoices.tw
index d33b39eda5a8a62ef3c713f556aff5b86e559ded..8f5291b74c888b550e073325231c90fdb486edc4 100644
--- a/src/Mods/SpecialForce/WeeklyChoices.tw
+++ b/src/Mods/SpecialForce/WeeklyChoices.tw
@@ -1,9 +1,18 @@
 :: WC [nobr]
 
-<<set _colonelTalkTensionRuction = $SF.FS.Tension !== -1 ? 5 : 0>>
+<<set _Env = App.SF.env(), _size = App.SF.upgrades.total(), _colonelTalkTensionRuction = $SF.FS.Tension !== -1 ? 5 : 0>>
+
+<<switch _Env>>
+<<case 4>>
+	<<set _EnvCash2 = 450,_EnvCash3 = 200,_EnvCash4 = 100>>
+<<case 3>>
+	<<set _EnvCash2 = 500,_EnvCash3 = 250,_EnvCash4 = 150>>
+<<case 2>>
+	<<set _EnvCash2 = 550,_EnvCash3 = 300,_EnvCash4 = 200>>
+<</switch>>
 
 <<if $SF.Gift === 0>>
-	<<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>>
+	<<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>>
 		The Colonel looks down a list on her tablet. "There's some things we can do to help you out, boss.
 		<br>We've had some good prizes turn up, that's made us some extra money we could turn over.
 	<<else>>
@@ -11,44 +20,38 @@
 		<br> <<= App.SF.Caps()>> can spare some profits from our recent operations.
 	<</if>>
 	| <<link "Request cash" "Firebase">>
-		/*<<set $CashGift = ((Math.ceil((Math.abs($cash)*0.05)*(Math.max(0.99,$SF.Size))))*($arcologies[0].prosperity/100))*_Env>> OLD*/
-		<<set $CashGift = Math.ceil(25000*($SF.Size/10)*_Env),$SF.Gift = 1,$choice = 1>>
-		<<set $CashGift = ($CashGift > 5000 ? $CashGift : 5000)>>
-		<<run cashX($CashGift, "specialForces")>>
+		<<run cashX(App.SF.weeklyGift(1), "specialForces")>>
 	<</link>>
 
 	<<if $rep < 20000>>
-		<<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>>
+		<<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>>
 			<br>If you want we could throw a quick military parade, get the people feeling extra patriotic.
 		<<else>>
 			<br>We can set some units aside for a ceremonial march through the arcology.
 		<</if>>
 		| <<link "Request military parade" "Firebase">>
-			<<set $GoodWords1 += 50*(Math.ceil($SF.Size*0.03*_Env))>>
-			<<set $GoodWords1 = (Number($GoodWords1) ? $GoodWords1 : 500),$SF.Gift = 1>>
-			<<set $choice = 2>>
-			<<run repX($GoodWords1, "specialForces")>>
+			<<run repX(App.SF.weeklyGift(2), "specialForces")>>
 		<</link>>
 	<</if>>
 
 	<<if $arcologies[0].prosperity < $AProsperityCap>>
-		<<if $SF.Colonel.Talk + $SF.Colonel.Fun !== 1>>
+		<<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>>
 			<br>Or we could hit some businesses that rival the ones in $arcologies[0].name with some sabotage.
 		<<else>>
 			<br>Or we can target rival businesses for sabotage.
 		<</if>>
 		| <<link "Request sabotage" "Firebase">>
-			<<set $GoodWords2 = _EnvProsp+(Math.ceil($SF.Size/100*_Env)),$SF.Gift = 1,$choice = 3>>
-			<<if $arcologies[0].prosperity + $GoodWords2 * 0.8 > $AProsperityCap>>
+			<<set _GoodWords2 = App.SF.weeklyGift(3)>>
+			<<if $arcologies[0].prosperity + _GoodWords2 * 0.8 > $AProsperityCap>>
 				<<set $arcologies[0].prosperity = $AProsperityCap>>
 			<<else>>
-				<<set $arcologies[0].prosperity += Math.ceil($GoodWords2*0.8)>>
+				<<set $arcologies[0].prosperity += Math.ceil(_GoodWords2 * 0.8)>>
 			<</if>>
 		<</link>>
 	<</if>>
 <</if>>
 
-<<if $SF.Colonel.Talk === 0 && $SF.Colonel.Fun === 0>>
+<<if $SF.Colonel.Talk + $SF.Colonel.Fun === 0>>
 	<span id="result0">
 	<br>"If you need me for anything else, let me know."
 
diff --git a/src/Mods/SpecialForce/editSF.tw b/src/Mods/SpecialForce/editSF.tw
new file mode 100644
index 0000000000000000000000000000000000000000..14a4c0b768707548323d54c143d1b4822ef7e976
--- /dev/null
+++ b/src/Mods/SpecialForce/editSF.tw
@@ -0,0 +1,56 @@
+:: editSF [nobr]
+
+<<script>>
+for (let i in V.SF.Squad) {
+	V.SF.Squad[i] = Math.clamp(V.SF.Squad[i], 0, App.SF.upgrades.currentUnitMax('V.SF.Squad[i]'));
+}
+<</script>>
+
+<<set _max = App.SF.upgrades.max(), _T1 = App.SF.unlocked.secondTier(), _size = App.SF.upgrades.total(),
+$nextButton = "Back to $SF.Lower's Firebase", $nextLink = "Firebase", _options = new App.UI.OptionsGroup()>>
+
+__Upgrades__: _size/_max(<<= (_size/_max).toFixed(2)>>%)
+<<run _options.addOption("''Firebase: ''", "Firebase", V.SF.Squad).showTextBox()>>
+<<run _options.addOption("''Armoury: ''", "Armoury", V.SF.Squad).showTextBox()>>
+<<run _options.addOption("''Drugs: ''", "Drugs", V.SF.Squad).showTextBox()>>
+
+<<if $SF.Squad.Firebase >= 2>>
+	<<run _options.addOption("''Drones: ''", "Drones", V.SF.Squad).showTextBox()>>
+<</if>>
+
+<<if App.SF.unlocked.garage('cheat')>>
+	<<run _options.addOption("''Garage:''<br>&nbsp;&nbsp;''Attack Vehicles: ''", "AV", V.SF.Squad).showTextBox()>>
+	<<run _options.addOption("&nbsp;&nbsp;''Transport Vehicles: ''", "TV", V.SF.Squad).showTextBox()>>
+	<<if _T1>>
+		<<run _options.addOption("&nbsp;''Prototype Goliath Tank: ''", "PGT", V.SF.Squad).showTextBox()>>
+	<</if>>
+<</if>>
+
+<<if App.SF.unlocked.hangar('cheat')>>
+	<<run _options.addOption("''Hangar:''<br>&nbsp;&nbsp;''Attack Planes: ''", "AA", V.SF.Squad).showTextBox()>>
+	<<run _options.addOption("&nbsp;&nbsp;''Transport Planes: ''", "TA", V.SF.Squad).showTextBox()>>
+	<<if _T1>>
+		<<run _options.addOption("&nbsp;''Spaceplane: ''", "SpacePlane", V.SF.Squad).showTextBox()>>
+		<<run _options.addOption("&nbsp;''Gunship: ''", "GunS", V.SF.Squad).showTextBox()>>
+	<</if>>
+<</if>>
+
+<<if App.SF.unlocked.launchBay('cheat')>>
+	<<run _options.addOption("''Launch Bay:''<br>&nbsp;''Satellite: ''", "Satellite", V.SF.Squad).showTextBox()>>
+	<<if $terrain != "oceanic">>
+		<<run _options.addOption("&nbsp;''Giant Robot: ''", "GiantRobot", V.SF.Squad).showTextBox()>>
+	<</if>>
+	<<run _options.addOption("&nbsp;''Cruise Missile: ''", "MissileSilo", V.SF.Squad).showTextBox()>>
+<</if>>
+
+<<if App.SF.unlocked.navalYard('cheat')>>
+		<<run _options.addOption("<br><br>''Naval Yard:''<br>&nbsp;''Aircraft Carrier: ''", "AircraftCarrier", V.SF.Squad).showTextBox()>>
+		<<run _options.addOption("&nbsp;''Submarine: ''", "Sub", V.SF.Squad).showTextBox()>>
+	<<run _options.addOption("&nbsp;''Amphibious Transport: ''", "HAT", V.SF.Squad).showTextBox()>>
+<</if>>
+
+<<includeDOM _options.render()>>
+
+<<if $SF.FS.Tension !== -1>>
+	<br><br>The Colonel's current Tension: <<textbox "$SF.FS.Tension" $SF.FS.Tension "editSF">>
+<</if>>
\ No newline at end of file
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 5b6d18c7797da9f233a9fdd70c574ca796ed4f62..c7cef1c5abddb08932c3c954a3190690265fbb8b 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -813,11 +813,11 @@ globalThis.calculateCosts = (function() {
 		return Math.trunc(cost);
 	}
 
-	function getSFCosts(costs = 0) {
+	function getSFCosts() {
 		if (V.SF.Toggle && V.SF.Active >= 1 && App.SF.AAR(0)) {
-			costs += Math.ceil(5000 * (1 + ((V.SF.ArmySize / 100) + (V.SF.Size / 100))));
+			return Math.ceil(5000 * (1 + ((V.SF.ArmySize / 100) + (App.SF.upgrades.total() / 100))));
 		}
-		return costs;
+		return 0;
 	}
 
 	function getWeatherCosts() {
diff --git a/src/uncategorized/nextWeek.tw b/src/uncategorized/nextWeek.tw
index 52b080ce98944d9ba398a2d0852689a58410d8b8..88a48ef5e84ef45824e61bd536465e111c243957 100644
--- a/src/uncategorized/nextWeek.tw
+++ b/src/uncategorized/nextWeek.tw
@@ -348,9 +348,7 @@
 	<<script>>Save.autosave.save("Week Start Autosave")<</script>>
 <</if>>
 
-<<if $SF.Toggle && $SF.Active >= 1>>
-	<<= App.SF.Count()>>
-<<elseif $SF.Toggle && $SF.FS.Tension > 100>>
+<<if $SF.Toggle && $SF.FS.Tension > 100>>
 	<<if ($rep > 17500)>> <<set $rep = 17500>> <</if>>
 <</if>>
 <<set $NaNArray = findNaN()>>
diff --git a/src/uncategorized/reputation.tw b/src/uncategorized/reputation.tw
index 20088a7451ac9783c1f7ce0bf1022b0a6dbe16c4..5e99ce9a76f37bea098ddef72ec0967e549cd8fa 100644
--- a/src/uncategorized/reputation.tw
+++ b/src/uncategorized/reputation.tw
@@ -323,7 +323,7 @@ _enduringRep = $enduringRep>>
 	<<run repX(_value, "specialForces")>> <br>
 <<elseif $SF.FS.BadOutcome === "ISOLATION">>
 	<br>Your citizens are @@.red;very displeased@@ that you are hosting a legion of heavily armed squatters in your basement.
-	<<run repX(forceNeg($SF.ArmySize+$SF.Size), "specialForces")>>
+	<<run repX(forceNeg($SF.ArmySize + App.SF.upgrades.total()), "specialForces")>>
 <</if>>
 
 <<if $arcologies[0].FSSupremacist != "unset">>
diff --git a/src/uncategorized/seRaiding.tw b/src/uncategorized/seRaiding.tw
index 590a995e83d4e1cf270dcc456a7eb37b7df767db..5c478147c7fe12dd61e5b23b9c44e2cf67e2fefe 100644
--- a/src/uncategorized/seRaiding.tw
+++ b/src/uncategorized/seRaiding.tw
@@ -3,19 +3,19 @@
 <<set $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $nextButton = "Continue", $raided = $week>>
 
 The leader of your $mercenariesTitle has contacted you from the world outside your arcology. It seems that your $mercenariesTitle have enjoyed a profitable series of raids in their time outside the arcology and have decided to push their luck by plundering one last location on their way back to the arcology. As their nominal leader, they ask your opinion of a small number of potential targets. Given the distance from the arcology and the time sensitivity of conducting such a mission, you have little to base your decision on besides a brief description.
-<<if $SF.Toggle && $SF.Active >= 1 && (($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) || $SF.Squad.SpacePlane >= 1)>>
+<<if $SF.Toggle && $SF.Active >= 1 && (($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) || $SF.Squad.SpacePlane >= 1)>>
 	By having access to the use of $SF.Lower's
-	<<if $SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0>>
+	<<if $SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0>>
 		satellite
 	<</if>>
 	<<if $SF.Squad.SpacePlane >= 1>>
 		space plane
 	<</if>>
-	<<if ($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) && $SF.Squad.SpacePlane >= 1>>
+	<<if ($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) && $SF.Squad.SpacePlane >= 1>>
 		satellite and space plane
 	<</if>>
 	it is
-	<<if ($SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0) && $SF.Squad.SpacePlane >= 1>>
+	<<if ($SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0) && $SF.Squad.SpacePlane >= 1>>
 		even
 	<</if>>
 	less likely that the target will escape.
diff --git a/src/uncategorized/seRaidingAssault.tw b/src/uncategorized/seRaidingAssault.tw
index 2d7683b1f4a65e325c852315442d74f4264fe178..040822015dae56613eecd8df0d0d3a82c4477b8c 100644
--- a/src/uncategorized/seRaidingAssault.tw
+++ b/src/uncategorized/seRaidingAssault.tw
@@ -6,7 +6,7 @@ You make your selection and direct your $mercenariesTitle to attack the target.
 <<set _raidescapeL = 1,_raidescapeU = 3>>
 
 <<if $SF.Toggle && $SF.Active >= 1>>
-	<<if $SF.Squad.Satellite.lv >= 1 && $SF.Squad.Satellite.InOrbit > 0>>
+	<<if $SF.Squad.Satellite >= 1 && $SF.SatLaunched > 0>>
 		<<set _MercCaptureL += 1,_MercCaptureU += 1>>
 		<<set _raidescapeL -= 1,_raidescapeU -= 1>>
 	<</if>>