diff --git a/src/Mods/SecExp/events/conflictOptions.js b/src/Mods/SecExp/events/conflictOptions.js
index 8296d64c40c343305b76566c6f9012716f627e07..fb55b8872015e35790ec582c6c723fdf648ab044 100644
--- a/src/Mods/SecExp/events/conflictOptions.js
+++ b/src/Mods/SecExp/events/conflictOptions.js
@@ -2,8 +2,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 	eventPrerequisites() {
 		return [
 			() => V.secExpEnabled > 0,
-			() => V.SecExp.war.foughtThisWeek === 0,
-			() => V.SecExp.war.type !== ""
+			() => V.SecExp.war.type
 		];
 	}
 
@@ -31,7 +30,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 							r.push(`Some of your citizens saw the disorganized horde of raiders coming towards the city and quickly reported it. To such jackals your arcology surely looks like an appetizing morsel.`);
 						}
 						const div = document.createElement("div");
-						App.UI.DOM.makeElement("span", `Raiders`, "strong");
+						App.UI.DOM.makeElement("span", `Raiders`, ["strong"]);
 						App.UI.DOM.makeElement("span", `are roaming gangs of bandits, preying on the vulnerable supply lines of Free Cities and old world nations. They are rarely equipped with decent armaments and even more rarely have any formal military training, but they make up for that with high mobility and numbers.`);
 						r.push(div);
 					} else if (V.SecExp.war.attacker.type === "free city") {
@@ -42,7 +41,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 							r.push(`Some of your citizens saw the menacing column of slavers and hired mercenaries and rushed to your office to bring the grim news. Another free city is ready to use their best tools to bring down a dangerous competitor.`);
 						}
 						const div = document.createElement("div");
-						App.UI.DOM.makeElement("span", `Free City expeditions`, "strong");
+						App.UI.DOM.makeElement("span", `Free City expeditions`, ["strong"]);
 						App.UI.DOM.makeElement("span", `are usually composed of mercenaries hired to take down sensible supplies or infrastructure in order to damage the enemies of their contractor. They have on average good equipment and training, together with decent mobility, making them a formidable force. Their biggest weakness however is their relatively low numbers.`);
 						r.push(div);
 					} else if (V.SecExp.war.attacker.type === "freedom fighters") {
@@ -53,7 +52,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 							r.push(`Some of your citizens saw the dangerous looking army of guerrillas is gathering just outside the arcology. Fanatics and idealists armed with dead men's words and hope, set on erasing your fledgling empire.`);
 						}
 						const div = document.createElement("div");
-						App.UI.DOM.makeElement("span", `Freedom Fighters`, "strong");
+						App.UI.DOM.makeElement("span", `Freedom Fighters`, ["strong"]);
 						App.UI.DOM.makeElement("span", `are groups of individuals fighting to rid the planet of "evils" such as the Free Cities and their way of life. Lacking the strength to assault one directly they fight guerrilla style slowly starving to death their enemies. They are rarely well equipped, but with good training and mobility they are not a threat that can be taken lightly.`);
 						r.push(div);
 					} else if (V.SecExp.war.attacker.type === "old world") {
@@ -64,7 +63,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 							r.push(`Some of your citizens saw the disciplined yet dusty, scruffy old world army is approaching the confines of your arcology. There's nothing better than a good war to unite the electorate and your arcology is just the perfect target.`);
 						}
 						const div = document.createElement("div");
-						App.UI.DOM.makeElement("span", `Old world expeditions`, "strong");
+						App.UI.DOM.makeElement("span", `Old world expeditions`, ["strong"]);
 						App.UI.DOM.makeElement("span", `are usually sent to secure resources and trade routes for their nation or, more often, to provide their citizens with a bogeyman to be scared of. They are usually decently equipped and trained, which together with their generous numbers make them a tough nut to crack. However, they often lack in mobility.`);
 						r.push(div);
 					}
@@ -121,27 +120,27 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 			const isOceanic = V.terrain === "oceanic";
 			r.push(`It seems your troops and your adversary will fight`);
 			if (V.SecExp.war.terrain === "rural") {
-				r.push(`in`, App.UI.DOM.makeElement("span", `the rural land`, "strong"), `surrounding the free city.`);
+				r.push(`in`, App.UI.DOM.makeElement("span", `the rural land`, ["strong"]), `surrounding the free city.`);
 			} else if (V.SecExp.war.terrain === "urban") {
-				r.push(`in the old`, App.UI.DOM.makeElement("span", `abandoned city`, "strong"), `surrounding the free city.`);
+				r.push(`in the old`, App.UI.DOM.makeElement("span", `abandoned city`, ["strong"]), `surrounding the free city.`);
 			} else if (V.SecExp.war.terrain === "hills") {
-				r.push(`on`, App.UI.DOM.makeElement("span", `the hills`, "strong"), `around the free city.`);
+				r.push(`on`, App.UI.DOM.makeElement("span", `the hills`, ["strong"]), `around the free city.`);
 			} else if (V.SecExp.war.terrain === "coast") {
-				r.push(`along`, App.UI.DOM.makeElement("span", `the coast`, "strong"), `just outside the free city.`);
+				r.push(`along`, App.UI.DOM.makeElement("span", `the coast`, ["strong"]), `just outside the free city.`);
 			} else if (V.SecExp.war.terrain === "outskirts") {
-				r.push(`right against`, App.UI.DOM.makeElement("span", `the walls of the arcology.`, "strong"));
+				r.push(`right against`, App.UI.DOM.makeElement("span", `the walls of the arcology.`, ["strong"]));
 			} else if (V.SecExp.war.terrain === "mountains") {
-				r.push(`in`, App.UI.DOM.makeElement("span", `the mountains`, "strong"), `overlooking the arcology.`);
+				r.push(`in`, App.UI.DOM.makeElement("span", `the mountains`, ["strong"]), `overlooking the arcology.`);
 			} else if (V.SecExp.war.terrain === "wasteland") {
-				r.push(`in`, App.UI.DOM.makeElement("span", `the wastelands`, "strong"), `outside the free city territory.`);
+				r.push(`in`, App.UI.DOM.makeElement("span", `the wastelands`, ["strong"]), `outside the free city territory.`);
 			} else if (V.SecExp.war.terrain === "international waters") {
-				r.push(`in`, App.UI.DOM.makeElement("span", `the water surrounding`, "strong"), `the free city.`);
+				r.push(`in`, App.UI.DOM.makeElement("span", `the water surrounding`, ["strong"]), `the free city.`);
 			} else if (["a sunken ship", "an underwater cave"].includes(V.SecExp.war.terrain)) {
-				r.push(`in`, App.UI.DOM.makeElement("span", `${V.SecExp.war.terrain}`, "strong"), `near the free city.`);
+				r.push(`in`, App.UI.DOM.makeElement("span", `${V.SecExp.war.terrain}`, ["strong"]), `near the free city.`);
 			} else if (V.SecExp.war.terrain === "error") {
-				r.push(App.UI.DOM.makeElement("span", `Error: failed to assign terrain.`, "red"), `${V.SecExp.war.terrain} reads: ${V.SecExp.war.terrain}.`);
+				r.push(App.UI.DOM.makeElement("span", `Error: failed to assign terrain.`, ["red"]), `${V.SecExp.war.terrain} reads: ${V.SecExp.war.terrain}.`);
 			} else {
-				r.push(App.UI.DOM.makeElement("span", `Error: failed to read terrain.`, "red"), `${V.SecExp.war.terrain} reads: ${V.SecExp.war.terrain}.`);
+				r.push(App.UI.DOM.makeElement("span", `Error: failed to read terrain.`, ["red"]), `${V.SecExp.war.terrain} reads: ${V.SecExp.war.terrain}.`);
 			}
 			if (App.Mods.SecExp.battle.recon() === 3) {
 				r.push(`Your recon capabilities are top notch. The information collected will be most likely correct or very close to be so:`);
@@ -153,22 +152,22 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 				r.push(`Your recon capabilities are almost non-existent. The information collected will be wild guesses at best:`);
 			}
 			r.push(`approximately`);
-			r.push(App.UI.DOM.makeElement("span", `${estimatedMen} men`, "strong"));
+			r.push(App.UI.DOM.makeElement("span", `${estimatedMen} men`, ["strong"]));
 			r.push(`are coming, they seem to be`);
 			if (expectedEquip <= 0) {
-				r.push(App.UI.DOM.makeElement("span", `poorly armed.`, "strong"));
+				r.push(App.UI.DOM.makeElement("span", `poorly armed.`, ["strong"]));
 				r.push(`Old rusty small arms are the norm with just a few barely working civilian ${isOceanic ? 'boats' : 'vehicles'}.`);
 			} else if (expectedEquip === 1) {
-				r.push(App.UI.DOM.makeElement("span", `lightly armed,`, "strong"));
+				r.push(App.UI.DOM.makeElement("span", `lightly armed,`, ["strong"]));
 				r.push(`mostly with small arms and some repurposed civilian ${isOceanic ? 'boats' : 'vehicles'} with scattered machine gun support. There's no sign of heavy ${isOceanic ? 'boats' : 'vehicles'}, ${isOceanic ? 'submarines' : 'artillery'} or aircraft.`);
 			} else if (expectedEquip === 2) {
-				r.push(App.UI.DOM.makeElement("span", `decently armed`, "strong"));
+				r.push(App.UI.DOM.makeElement("span", `decently armed`, ["strong"]));
 				r.push(`with good quality small arms, machine guns and a few mortars. There appear to be some heavy military ${isOceanic ? 'boats' : 'vehicles'} coming as well.`);
 			} else if (expectedEquip === 3) {
-				r.push(App.UI.DOM.makeElement("span", `well armed`, "strong"));
+				r.push(App.UI.DOM.makeElement("span", `well armed`, ["strong"]));
 				r.push(`with high quality small arms, ${isOceanic ? 'spear men' : 'snipers'}, demolitions teams, heavy duty machine guns and mortars. Heavy military ${isOceanic ? 'boats' : 'vehicles'} are numerous and a few ${isOceanic ? 'submarines' : 'artillery pieces'} are accompanying the detachment.`);
 			} else if (expectedEquip >= 4) {
-				r.push(App.UI.DOM.makeElement("span", `extremely well armed`, "strong"));
+				r.push(App.UI.DOM.makeElement("span", `extremely well armed`, ["strong"]));
 				r.push(`with excellent small arms and specialized teams with heavy duty infantry support weapons. Heavy presence of armored military ${isOceanic ? 'boats' : 'vehicles'}, ${isOceanic ? 'submarines' : 'artillery pieces'} and even some attack helicopters.`);
 			}
 			App.Events.addParagraph(node, r);
@@ -176,7 +175,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 
 			App.UI.DOM.appendNewElement("h2", node, `Battle plan`);
 			if (V.SecExp.war.commander === "bodyguard" && V.BodyguardID === 0 || V.SecExp.war.commander === "headGirl" && V.HeadGirlID === 0) {
-				App.UI.DOM.makeElement("span", `Chosen leader ${V.SecExp.war.commander} cannot be found, please select another.`, "warning");
+				App.UI.DOM.makeElement("span", `Chosen leader ${V.SecExp.war.commander} cannot be found, please select another.`, ["warning"]);
 				V.SecExp.war.commander = "PC";
 			}
 			options = new App.UI.OptionsGroup(); // leader assignment
@@ -218,14 +217,14 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 				option = options.addOption(tactic, "chosenTactic", V.SecExp.war).addValue("Select", tactic);
 				const comment = document.createElement("span");
 				if (tactics[tactic].atkMod > 0.1) {
-					App.UI.DOM.appendNewElement("span", comment, "Atk+, ", "green");
+					App.UI.DOM.appendNewElement("span", comment, "Atk+, ", ["green"]);
 				} else if (tactics[tactic].atkMod < 0.1) {
-					App.UI.DOM.appendNewElement("span", comment, "Atk-, ", "red");
+					App.UI.DOM.appendNewElement("span", comment, "Atk-, ", ["red"]);
 				}
 				if (tactics[tactic].defMod > 0.1) {
-					App.UI.DOM.appendNewElement("span", comment, "Def+, ", "green");
+					App.UI.DOM.appendNewElement("span", comment, "Def+, ", ["green"]);
 				} else if (tactics[tactic].defMod < 0.1) {
-					App.UI.DOM.appendNewElement("span", comment, "Def-, ", "red");
+					App.UI.DOM.appendNewElement("span", comment, "Def-, ", ["red"]);
 				}
 				comment.append(tacticsDesc.get(tactic));
 				option.addComment(comment);
@@ -307,7 +306,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 			// troop deployment
 			if (App.Mods.SecExp.battle.deployableUnits() > 0) {
 				r.push(`With your current readiness level you can send an additional`);
-				r.push(App.UI.DOM.makeElement("span", String(App.Mods.SecExp.battle.deployableUnits()), "strong"));
+				r.push(App.UI.DOM.makeElement("span", String(App.Mods.SecExp.battle.deployableUnits()), ["strong"]));
 				r.push(`units.`);
 			}
 		} else {
@@ -333,30 +332,29 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 			if (V.SecExp.war.irregulars > 0) {
 				r.push(`${num(Math.trunc(V.SecExp.war.irregulars))} of your citizens took up arms to defend their arcology owner.`);
 			}
-			if (V.SecExp.war.rebellingID.length > 0) {
-				App.Events.addParagraph(node, r);
-				r = [];
-				let rebelling = [];
-				for (const squad of App.Mods.SecExp.unit.squads("human")) {
-					if (squad.active === 1 && (V.SecExp.war.rebellingID.includes(squad.ID))) {
-						rebelling.push(squad.platoonName);
-					}
-				}
-				r.push(`${toSentence(rebelling)} betrayed you and joined the insurrection.`);
-			}
-			let defending = [];
+
+			const rebelling = [];
+			const defending = [];
 			if (V.arcologyUpgrade.drones === 1) {
 				defending.push(`Your security drones`);
 			}
-			for (const squad of App.Mods.SecExp.unit.squads("human")) {
-				if (squad.active === 1 && (!V.SecExp.war.rebellingID.includes(squad.ID))) {
-					defending.push(squad.platoonName);
-				}
-			}
 			if (V.SF.Toggle && V.SF.Active >= 1) {
 				let SFname = defending.length > 0 ? V.SF.Lower : capFirstChar(V.SF.Lower);
 				defending.push(`${SFname}, ${num(V.SF.ArmySize)} strong`);
 			}
+			for (const squad of App.Mods.SecExp.unit.squads("human").filter(u => u.active)) {
+				if (V.SecExp.war.rebellingID.includes(squad.ID)) {
+					rebelling.push(squad.platoonName);
+				} else {
+					defending.push(squad.platoonName);
+				}
+			}
+
+			if (V.SecExp.war.rebellingID.length > 0) {
+				App.Events.addParagraph(node, r);
+				r = [];
+				r.push(`${toSentence(rebelling)} betrayed you and joined the insurrection.`);
+			}
 			if (defending.length > 0) {
 				App.Events.addParagraph(node, r);
 				r = [];
@@ -378,7 +376,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 				text = `Your troops will make use of the special weaponry, equipment and infrastructure developed by the riot control center to surgically eliminate rebels and dissidents with little to no collateral damage.`;
 			}
 			if (text) {
-				App.UI.DOM.appendNewElement("div", node, text, "note");
+				App.UI.DOM.appendNewElement("div", node, text, ["note"]);
 			}
 
 			const engageRules = new Map([
@@ -409,7 +407,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 			]);
 			const activeDefenses = Array.from(locations.keys()).filter(loc => V.SecExp.war[loc] === 1);
 			if (activeDefenses.length > 0) {
-				App.UI.DOM.appendNewElement("div", node, `Your troops will garrison the ${toSentence(activeDefenses.map(loc => locations.get(loc)))}.`, "note");
+				App.UI.DOM.appendNewElement("div", node, `Your troops will garrison the ${toSentence(activeDefenses.map(loc => locations.get(loc)))}.`, ["note"]);
 			}
 			for (const [loc, text] of locations) {
 				const choices = [];
@@ -434,7 +432,7 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 		node.append(App.Mods.SecExp.unit.replenishAll());
 		if (isBattle) {
 			if (App.Mods.SecExp.battle.deployableUnits() === 0) {
-				App.UI.DOM.appendNewElement("div", node, `Unit roster full.`, "strong");
+				App.UI.DOM.appendNewElement("div", node, `Unit roster full.`, ["strong"]);
 			}
 			if (App.Mods.SecExp.unit.squads().length > 0) {
 				options = new App.UI.OptionsGroup();
@@ -457,20 +455,17 @@ App.Events.conflictOptions = class conflictOptions extends App.Events.BaseEvent
 		if (isBattle && App.Mods.SecExp.battle.deployedUnits() > 0 || !isBattle) {
 			option.addButton(isBattle ? `Deploy troops` : `Proceed`, () => {
 				V.SecExp.war.result = 4; // Sets to a value outside accepted range (-3, 3) to avoid evaluation problems
-				V.SecExp.war.foughtThisWeek = 1;
 			}, `conflictHandler`);
 		} else if (isBattle && App.Mods.SecExp.battle.deployedUnits() === 0) {
-			App.UI.DOM.appendNewElement("div", node, `You need at least a unit in your roster to proceed to battle.`, "red");
+			App.UI.DOM.appendNewElement("div", node, `You need at least a unit in your roster to proceed to battle.`, ["red"]);
 		}
 		if (isBattle) {
 			option.addButton(`Attempt to bribe (approximately ${cashFormat(Math.round(App.Mods.SecExp.battle.bribeCost() * (1 + either(-1, 1) * random(2) * 0.1)))})`, () => {
 				V.SecExp.war.result = 1;
-				V.SecExp.war.foughtThisWeek = 1;
 			}, `conflictHandler`);
 		}
 		option.addButton(`Surrender`, () => {
 			V.SecExp.war.result = -1;
-			V.SecExp.war.foughtThisWeek = 1;
 		}, "conflictReport");
 		node.append(options.render());
 		return node;
diff --git a/src/Mods/SecExp/events/conflictReport.js b/src/Mods/SecExp/events/conflictReport.js
index 2983e3b35df72ddb51501f8823505132c581cdd7..145c6ab7e30e2be361e421d7d0ba0701d1bff42b 100644
--- a/src/Mods/SecExp/events/conflictReport.js
+++ b/src/Mods/SecExp/events/conflictReport.js
@@ -1217,14 +1217,12 @@ App.Events.conflictReport = function() {
 
 	App.Events.addParagraph(node, r);
 	if (inRebellion) {
+		const inverse = slaveRebellion ? 'citizen' : 'slave';
 		V.SecExp.rebellions[V.SecExp.war.type.toLowerCase().replace(' rebellion', '') + 'Progress'] = 0;
 		V.SecExp.rebellions.tension = Math.clamp(V.SecExp.rebellions.tension - random(50, 100), 0, 100);
-		if (slaveRebellion) {
-			V.SecExp.rebellions.citizenProgress = Math.clamp(V.SecExp.rebellions.citizenProgress - random(50, 100), 0, 100);
-		} else {
-			V.SecExp.rebellions.slaveProgress = Math.clamp(V.SecExp.rebellions.slaveProgress - random(50, 100), 0, 100);
-		}
+		V.SecExp.rebellions[inverse + 'Progress'] = Math.clamp(V.SecExp.rebellions[inverse + 'Progress'] - random(50, 100), 0, 100);
 	}
+	delete V.SecExp.war.type;
 	return node;
 };
 /**
diff --git a/src/Mods/SecExp/events/secExpSmilingMan0.js b/src/Mods/SecExp/events/secExpSmilingMan0.js
index cda9d50687c37470760be95fdb352dc026eaa702..32685d4c074440fc78db3d991434aac8fef992a9 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan0.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan0.js
@@ -9,24 +9,23 @@ App.Events.secExpSmilingMan0 = class secExpSmilingMan0 extends App.Events.BaseEv
 	}
 
 	execute(node) {
-		let r = [];
+		V.fcnn.push("...encryption techniques: how to protect you and your loved ones from hackers ...");
 		V.SecExp.smilingMan.progress++;
-
+		V.SecExp.smilingMan.relationship = 0;
+		let r = [];
 		const {heA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
+		const cost = 10000;
+		const choices = [];
 
-		V.SecExp.smilingMan.relationship = 0;
-		V.fcnn.push("...encryption techniques: how to protect you and your loved ones from hackers ...");
 		r.push(
 			`During your morning routine, a peculiar report appears: it's been several weeks since your arcology was the victim of a series of cyber-crimes conducted by a mysterious figure. The egocentric criminal apparently took great pride in their acts, to the point of signing them with a symbol: a stylized smiling face. Your arcology was not the only one under assault by the machinations of the one the media quickly nicknamed`,
-			App.UI.DOM.makeElement("span", "the Smiling Man.", "note")
+			App.UI.DOM.makeElement("span", "the Smiling Man.", ["note"])
 		);
 		App.Events.addParagraph(node, r);
 		App.Events.addParagraph(node, [`Despite the sheer damage this criminal did, you cannot help but admire the skill with which every misdeed was performed — the worst white collar crimes of the century, carried out with such elegance that they almost seemed the product of natural laws, rather than masterful manipulation of the digital market. While sifting through the report, ${V.assistant.name} remains strangely quiet. "I'm worried, ${properTitle()} — this individual seems to be able to penetrate whichever system garners his attention. I... feel vulnerable," ${heA} says. "It's not something I'm used to."`]);
 		App.Events.addParagraph(node, [`Fortunately you have not been hit directly by this criminal — yet. Still, the repercussions of numerous bankruptcies take their toll on your arcology, whose <span class="red">prosperity suffers.</span>`]);
 		V.arcologies[0].prosperity *= random(80, 90) * 0.01;
 
-		const choices = [];
-		const cost = 10000;
 		if (V.cash >= cost) {
 			choices.push(new App.Events.Result(`Devote funds to the search for this dangerous criminal`, search, `This will cost ${cashFormat(cost)}`));
 			choices.push(new App.Events.Result(`Attempt to contact the mysterious figure`, contact, `This will cost ${cashFormat(cost)}`));
@@ -39,27 +38,26 @@ App.Events.secExpSmilingMan0 = class secExpSmilingMan0 extends App.Events.BaseEv
 
 		function search() {
 			cashX(-10000, "event");
-			V.SecExp.smilingMan.investedFunds = 1;
+			App.Events.queueEvent(3, new App.Events.secExpSmilingMan1(), {investedFunds: V.SecExp.smilingMan.investedFunds || 1});
 			V.SecExp.smilingMan.relationship++;
 			return `You devote funds to capture and neutralize the threat. You cannot help but wonder what the end game of this "smiling man" is. Money? Fame? Or is he on an ideological crusade?`;
 		}
-
 		function contact() {
 			cashX(-10000, "event");
-			V.SecExp.smilingMan.investedFunds = 1;
+			App.Events.queueEvent(3, new App.Events.secExpSmilingMan1(), {investedFunds: V.SecExp.smilingMan.investedFunds || 1});
 			V.SecExp.smilingMan.relationship += 2;
 			return `You devote funds to an attempt at communicating with the smiling man. You cannot help but wonder what the end game of this "smiling man" is. Money? Fame? Or is he on an ideological crusade?`;
 		}
-
 		function invest() {
 			cashX(-10000, "event");
-			V.SecExp.smilingMan.investedFunds = 1;
+			App.Events.queueEvent(3, new App.Events.secExpSmilingMan1(), {investedFunds: V.SecExp.smilingMan.investedFunds || 1});
 			V.SecExp.smilingMan.relationship += random(5, 10);
 			return `You devote funds to the improvement of the cyber-security of your arcology. You cannot help but wonder what the end game of this "smiling man" is. Money? Fame? Or is he on an ideological crusade?`;
 		}
-
 		function bliss() {
+			App.Events.queueEvent(3, new App.Events.secExpSmilingMan1());
 			return `You do not consider this individual a threat.`;
 		}
+		
 	}
 };
diff --git a/src/Mods/SecExp/events/secExpSmilingMan1.js b/src/Mods/SecExp/events/secExpSmilingMan1.js
index c51c512a248dba98c82ca715fc4d11ffe525ad0e..fe4e5c768467aac3a4967ebd511114e3030b03bd 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan1.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan1.js
@@ -1,19 +1,17 @@
 App.Events.secExpSmilingMan1 = class secExpSmilingMan1 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
-			() => V.SecExp.smilingMan.progress === 1,
-			() => App.Events.effectiveWeek() >= 77,
 		];
 	}
 
 	execute(node) {
-		let r = [];
+		App.Events.queueEvent(5, new App.Events.secExpSmilingMan2());
+		V.fcnn.push("...cybersecurity market is booming thanks to a series of recent high-profile attacks...");
 		V.SecExp.smilingMan.progress++;
-
+		let r = [];
 		const {hisA, heA, himA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
-		V.fcnn.push("...cybersecurity market is booming thanks to a series of recent high-profile attacks...");
+
 		r.push(
 			`You have just reached your penthouse when your faithful assistant appears in front of you, evidently excited.`,
 			`"${properTitle()}, I have just received news of a new attack by the Smiling Man. It appears a few hours ago he infiltrated another arcology and caused a catastrophic failure of its power plant.`,
@@ -53,13 +51,9 @@ App.Events.secExpSmilingMan1 = class secExpSmilingMan1 extends App.Events.BaseEv
 		}
 		if (V.SecExp.buildings.secHub && V.SecExp.buildings.secHub.upgrades.security.cyberBots === 1) {
 			lostCash -= Math.min(30000, lostCash);
-			r.push(`The additional cyber defenses acquired and running in the security HQ`);
-			if (lostCash < 200000) {
-				r.push(`further`);
-			}
-			r.push(`limit the damage.`);
+			r.push(`The additional cyber defenses acquired and running in the security HQ ${lostCash < 200000 ? 'further' : ''} limit the damage.`);
 		}
-		if (V.SecExp.smilingMan.investedFunds) {
+		if (V.SecExp.smilingMan.investedFunds || this.params.investedFunds) {
 			lostCash -= Math.min(20000, lostCash);
 			r.push(`The funding you dedicated to the Smiling Man case saved some of the assets that would have been otherwise lost.`);
 			delete V.SecExp.smilingMan.investedFunds;
@@ -67,7 +61,6 @@ App.Events.secExpSmilingMan1 = class secExpSmilingMan1 extends App.Events.BaseEv
 		cashX(forceNeg(lostCash), "event");
 		App.Events.addParagraph(node, r);
 
-
 		App.Events.addResponses(node, [
 			new App.Events.Result(`"I want them dead. Now."`, kill),
 			new App.Events.Result(`"I want them, dead or alive!"`, find),
@@ -79,17 +72,14 @@ App.Events.secExpSmilingMan1 = class secExpSmilingMan1 extends App.Events.BaseEv
 			V.SecExp.smilingMan.relationship--;
 			return `You command your loyal operatives to double down on the search and elimination of the threat.`;
 		}
-
 		function find() {
 			V.SecExp.smilingMan.relationship++;
 			return `You command your loyal operatives to double down on the search and capture of the threat.`;
 		}
-
 		function findFast() {
 			V.SecExp.smilingMan.relationship += 2;
 			return `You command your loyal operatives to double down on the search and neutralization of the threat.`;
 		}
-
 		function peace() {
 			return `You take no further action. Hopefully this ordeal is over.`;
 		}
diff --git a/src/Mods/SecExp/events/secExpSmilingMan2.js b/src/Mods/SecExp/events/secExpSmilingMan2.js
index 021d1cac5f5a64553ad54a15c939e0fc5e0e9bb8..c1bc510d96ac2785f60eb5fe443ef73365f6f152 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan2.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan2.js
@@ -1,19 +1,16 @@
 App.Events.secExpSmilingMan2 = class secExpSmilingMan2 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
-			() => V.SecExp.smilingMan.progress === 2,
-			() => App.Events.effectiveWeek() >= 82,
 		];
 	}
 
 	execute(node) {
-		let r = [];
+		App.Events.queueEvent(0, new App.Events.secExpSmilingMan3());
+		V.fcnn.push("...my money safe the old-fashioned way: I store it all underneath my mattress...");
 		V.SecExp.smilingMan.progress++;
-
+		let r = [];
 		const {hisA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
-		V.fcnn.push("...my money safe the old-fashioned way: I store it all underneath my mattress...");
 
 		r.push(`When ${V.assistant.name} violently wakes you up, ${hisA} worried expression can mean only one thing: the Smiling Man had been back. "We were anonymously sent a link to a new website: it's a very simple site, no visuals, no text; only a countdown ticking away. It will reach zero this evening." your assistant says.`);
 		r.push(`This is troubling, yet somewhat exciting. The Smiling Man never failed to cause damage, but his ego had gotten the best of him this time — having time to prepare before their attack will give you a chance to find them. For the rest of the day you do your best to plan, prepare and focus.`);
@@ -79,17 +76,14 @@ App.Events.secExpSmilingMan2 = class secExpSmilingMan2 extends App.Events.BaseEv
 			V.SecExp.smilingMan.relationship--;
 			return `You command your loyal operatives to prepare for a manhunt.`;
 		}
-
 		function find() {
 			V.SecExp.smilingMan.relationship++;
 			return `You command your loyal operatives to prepare for a manhunt.`;
 		}
-
 		function findFast() {
 			V.SecExp.smilingMan.relationship += 2;
 			return `You command your loyal operatives to prepare for a manhunt.`;
 		}
-
 		function peace() {
 			return `You take no further action. Hopefully this ordeal is finally over.`;
 		}
diff --git a/src/Mods/SecExp/events/secExpSmilingMan3.js b/src/Mods/SecExp/events/secExpSmilingMan3.js
index c11f7de1eb9c274bc3ced369e4b5482fcdb42b24..17a8269c5471685c25a6e8107f2967cda1911a86 100644
--- a/src/Mods/SecExp/events/secExpSmilingMan3.js
+++ b/src/Mods/SecExp/events/secExpSmilingMan3.js
@@ -1,30 +1,23 @@
 App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEvent {
 	eventPrerequisites() {
 		return [
-			() => V.rival.state <= 1 || V.rival.state > 2,
 			() => V.secExpEnabled > 0,
-			() => V.SecExp.smilingMan.progress === 3,
 		];
 	}
 
 	execute(node) {
+		V.fcnn.push("...sometimes high-tech problems have low-tech solutions. Back to you in the...");
+		V.nextButton = " ";
 		let r = [];
+		const smileSlave = GenerateNewSlave(V.seeDicks !== 100 ? "XX" : "XY", {
+			minAge: 16, maxAge: 18, ageOverridesPedoMode: 1, disableDisability: 1, race: "asian", nationality: "Japanese"
+		});
 
-		let smileSlave;
+		smileSlave.faceShape = V.seeDicks !== 100 ? "cute" : "androgynous";
+		smileSlave.boobs = V.seeDicks !== 100 ? 450 : 250;
 		if (V.seeDicks !== 100) {
-			smileSlave = GenerateNewSlave("XX", {
-				minAge: 16, maxAge: 18, ageOverridesPedoMode: 1, disableDisability: 1, race: "asian", nationality: "Japanese"
-			});
-			smileSlave.faceShape = "cute";
-			smileSlave.boobs = 450;
 			smileSlave.vagina = 0;
 			smileSlave.ovaries = 1;
-		} else {
-			smileSlave = GenerateNewSlave("XY", {
-				minAge: 16, maxAge: 18, ageOverridesPedoMode: 1, disableDisability: 1, race: "asian", nationality: "Japanese"
-			});
-			smileSlave.boobs = 250;
-			smileSlave.faceShape = "androgynous";
 		}
 		smileSlave.boobShape = "perky";
 		smileSlave.nipples = "cute";
@@ -69,8 +62,6 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 			His, He,
 			his, he, him, girl
 		} = getPronouns(smileSlave);
-		V.nextButton = " ";
-		V.fcnn.push("...sometimes high-tech problems have low-tech solutions. Back to you in the...");
 
 		r.push(`The day has come to finally put an end to this story. Your men are ready to go, waiting only on your signal. You quickly don your protective gear and proceed down the busy streets of your arcology.`);
 		r.push(`You carefully planned the day so that nothing could exit the arcology without being scanned at least three times and poked twice. The Smiling Man has no escape.`);
@@ -87,10 +78,8 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 		function inside() {
 			const frag = new DocumentFragment();
 			let r = [];
+			App.Events.drawEventArt(frag, smileSlave);
 
-			if (V.seeImages === 1) {
-				App.Events.drawEventArt(frag, smileSlave);
-			}
 			r.push(`"So it was you to find me first.`);
 			if (V.SecExp.smilingMan.relationship > 2) {
 				r.push(`I was hoping you would be the one!`);
@@ -117,14 +106,11 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 				r.push(`You decide it would be criminally wasteful to throw away such talent. You offer ${him} a new life at your side. ${His} expertise will surely guarantee safety, if not supremacy, to your arcology in cyberspace, while ${he} will have safety and luxury in the physical world.`);
 				r.push(App.UI.DOM.link(
 					"Continue",
-					() => {
-						$(node).empty().append(result());
-					}
+					() => { $(node).empty().append(result()); }
 				));
 				App.Events.addParagraph(frag, r);
 				return frag;
 			}
-
 			function punish() {
 				const frag = new DocumentFragment();
 				let r = [];
@@ -132,14 +118,11 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 				r.push(`You decide to end ${his} pitiful life. ${He} has crossed the wrong master of the new world ${he} worked so hard to create. No mercy was asked for and no mercy will be given.`);
 				r.push(App.UI.DOM.link(
 					"Continue",
-					() => {
-						$(node).empty().append(result());
-					}
+					() => { $(node).empty().append(result()); }
 				));
 				App.Events.addParagraph(frag, r);
 				return frag;
 			}
-
 			function enslave() {
 				const frag = new DocumentFragment();
 				let r = [];
@@ -147,14 +130,11 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 				r.push(`You decide to enslave the ${girl}. ${His} skill may be great, but ${his} crimes are equally so, which will make it all the sweeter to turn ${him} into an obedient little toy to play with.`);
 				r.push(App.UI.DOM.link(
 					"Continue",
-					() => {
-						$(node).empty().append(result());
-					}
+					() => { $(node).empty().append(result()); }
 				));
 				App.Events.addParagraph(frag, r);
 				return frag;
 			}
-
 			function result() {
 				const frag = new DocumentFragment();
 				let r = [];
@@ -162,9 +142,8 @@ App.Events.secExpSmilingMan3 = class secExpSmilingMan3 extends App.Events.BaseEv
 				App.Utils.scheduleSidebarRefresh();
 				window.scrollTo(0, window.pageYOffset);
 				if (V.SecExp.smilingMan.progress < 30) {
-					if (V.seeImages === 1) {
-						App.Events.drawEventArt(frag, smileSlave);
-					}
+					App.Events.drawEventArt(frag, smileSlave);
+
 					if (V.SecExp.smilingMan.progress === 10) {
 						r.push(`The ${girl} asks for a few minutes to think about your offer,`);
 						if (V.SecExp.smilingMan.relationship >= 4) {
diff --git a/src/Mods/SecExp/js/secExp.js b/src/Mods/SecExp/js/secExp.js
index 293c029b6f93f4a5fa27b27e77037aa8e821d999..1db9a45cca83a184ad7b8e6b17ce0a9d3818328f 100644
--- a/src/Mods/SecExp/js/secExp.js
+++ b/src/Mods/SecExp/js/secExp.js
@@ -20,7 +20,7 @@ App.Mods.SecExp.generator = (function() {
 	function attack() {
 		let attackChance = 0; // attackChance value is the chance out of 100 of an attack happening this week
 		// attacks are deactivated if security drones are not around yet, there is not a rebellion this week or the last attack/rebellion happened within 3 weeks
-		if (V.arcologyUpgrade.drones === 1 && V.SecExp.war.type === "" && V.SecExp.battles.lastEncounterWeeks > 3 && V.SecExp.rebellions.lastEncounterWeeks > 3) {
+		if (V.arcologyUpgrade.drones === 1 && !V.SecExp.war.type && V.SecExp.battles.lastEncounterWeeks > 3 && V.SecExp.rebellions.lastEncounterWeeks > 3) {
 			if (V.week < 30) {
 				attackChance = 5;
 			} else if (V.week < 60) {
@@ -205,11 +205,11 @@ App.Mods.SecExp.generator = (function() {
 			}
 		}
 
-		if (V.SecExp.settings.rebellion.force === 1 && V.SecExp.war.foughtThisWeek === 0) {
+		if (V.SecExp.settings.rebellion.force === 1) {
 			V.SecExp.war.type = `${random(1, 100) <= 50 ? 'Slave' : 'Citizen'} Rebellion`;
 		}
 
-		if (V.SecExp.war.type === "") {
+		if (!V.SecExp.war.type) {
 			V.SecExp.rebellions.lastEncounterWeeks++;
 		} else {
 			const isSlaveRebellion = V.SecExp.war.type.includes("Slave");
@@ -262,135 +262,6 @@ App.Mods.SecExp.militiaCap = function(x = 0) {
 	}
 };
 
-App.Mods.SecExp.initTrade = function() {
-	if (V.SecExp.core.trade === 0 || !jsDef(V.SecExp.core.trade)) {
-		let init = jsRandom(20, 30);
-		if (V.terrain === "urban") {
-			init += jsRandom(10, 10);
-		} else if (V.terrain === "ravine") {
-			init -= jsRandom(5, 5);
-		}
-		if (isPCCareerInCategory("wealth") || isPCCareerInCategory("capitalist") || isPCCareerInCategory("celebrity") || isPCCareerInCategory("BlackHat")) {
-			init += jsRandom(5, 5);
-		} else if (isPCCareerInCategory("escort") || isPCCareerInCategory("gang") || isPCCareerInCategory("servant")) {
-			init -= jsRandom(5, 5);
-		}
-		V.SecExp.core.trade = init;
-	}
-};
-
-App.Mods.SecExp.generalInit = function() {
-	if (V.secExpEnabled === 0) {
-		return;
-	}
-
-	Object.assign(V.SecExp, {
-		battles: {
-			major: 0,
-			slaveVictories: [],
-			lastSelection: [],
-			victories: 0,
-			victoryStreak: 0,
-			losses: 0,
-			lossStreak: 0,
-			lastEncounterWeeks: 0,
-			saved: {}
-		},
-		rebellions: {
-			tension: 0,
-			slaveProgress: 0,
-			citizenProgress: 0,
-			victories: 0,
-			losses: 0,
-			lastEncounterWeeks: 0,
-			repairTime: {},
-		},
-		core: {
-			trade: 0,
-			authority: 0,
-			security: 100,
-			crimeLow: 30,
-			totalKills: 0,
-		},
-		settings: {
-			difficulty: 1,
-			unitDescriptions: 0,
-			showStats: 0,
-			battle: {
-				enabled: 1,
-				allowSlavePrestige: 1,
-				force: 0,
-				frequency: 1,
-				major: {
-					enabled: 0,
-					gameOver: 1,
-					mult: 1,
-					force: 0
-				}
-			},
-			rebellion: {
-				enabled: 1,
-				force: 0,
-				gameOver: 1,
-				speed: 1
-			}
-		},
-		buildings: {},
-		proclamation: {
-			cooldown: 0,
-			currency: "",
-			type: "crime"
-		},
-		units: {},
-		edicts: {
-			alternativeRents: 0,
-			enslavementRights: 0,
-			sellData: 0,
-			propCampaignBoost: 0,
-			tradeLegalAid: 0,
-			taxTrade: 0,
-			slaveWatch: 0,
-			subsidyChurch: 0,
-			SFSupportLevel: 0,
-			limitImmigration: 0,
-			openBorders: 0,
-			weaponsLaw: 3,
-			defense: {
-				soldierWages: 1,
-				slavesOfficers: 0,
-				discountMercenaries: 0,
-				militia: 0,
-				militaryExemption: 0,
-				noSubhumansInArmy: 0,
-				pregExemption: 0,
-				liveTargets: 0,
-				privilege: {
-					militiaSoldier: 0,
-					slaveSoldier: 0,
-					mercSoldier: 0,
-				},
-				// Soldiers
-				martialSchool: 0,
-				eliteOfficers: 0,
-				lowerRequirements: 0,
-				// FS soldiers
-				legionTradition: 0,
-				eagleWarriors: 0,
-				ronin: 0,
-				sunTzu: 0,
-				mamluks: 0,
-				pharaonTradition: 0,
-			}
-		},
-		smilingMan: {progress: 0}
-	});
-
-	for (const [unit] of App.Mods.SecExp.unit.list()) {
-		App.Mods.SecExp.unit.gen(unit);
-	}
-	App.Mods.SecExp.initTrade();
-};
-
 App.Mods.SecExp.battle = (function() {
 	"use strict";
 	const unitFunctions = App.Mods.SecExp.unit;
diff --git a/src/Mods/SecExp/js/secExpBC.js b/src/Mods/SecExp/js/secExpObject.js
similarity index 84%
rename from src/Mods/SecExp/js/secExpBC.js
rename to src/Mods/SecExp/js/secExpObject.js
index d645ae5fb31b41fc5096aae17709f9ca2bcf4cf8..5425b3e89f4ac0e5a03b692997369a3cb26c709d 100644
--- a/src/Mods/SecExp/js/secExpBC.js
+++ b/src/Mods/SecExp/js/secExpObject.js
@@ -1,5 +1,8 @@
 // @ts-nocheck
-App.Mods.SecExp.generalBC = function() {
+/**
+	* @param {string} mode
+	*/
+App.Mods.SecExp.object = function(mode) {
 	if (jsDef(V.secExp)) {
 		if (V.secExpEnabled !== 1) {
 			V.secExpEnabled = V.secExp;
@@ -11,14 +14,17 @@ App.Mods.SecExp.generalBC = function() {
 
 	delete V.SecExp.army;
 
-	if (V.secExpEnabled === 0) {
+	if (V.secExpEnabled === 0 || (mode === "in-game" && Object.entries(V.SecExp).length > 0)) {
 		return;
 	}
+	V.SecExp.war = V.SecExp.war || {};
 	V.SecExp.settings = V.SecExp.settings || {};
 	V.SecExp.edicts = V.SecExp.edicts || {};
 	V.SecExp.edicts.defense = V.SecExp.edicts.defense || {};
 	V.SecExp.units = V.SecExp.units || {};
-	V.SecExp.units.bots = V.SecExp.units.bots || {};
+	if (mode !== "init") {
+		V.SecExp.units.bots = V.SecExp.units.bots || {};
+	}
 	V.SecExp.smilingMan = V.SecExp.smilingMan || {};
 	V.SecExp.core = V.SecExp.core || {};
 	V.SecExp.battles = V.SecExp.battles || {};
@@ -90,39 +96,41 @@ App.Mods.SecExp.generalBC = function() {
 
 	for (const [unit, data] of App.Mods.SecExp.unit.list()) {
 		App.Mods.SecExp.unit.gen(unit);
-		V.SecExp.units[unit].squads.forEach(u => {
-			if (unit === 'bots') {
-				u.active = Math.max(0, u.active) || V.arcologyUpgrade.drones > 0 ? 1 : 0;
-				u.troops = Math.max(u.troops || 0, V.arcologyUpgrade.drones > 0 ? 30 : 0);
-				u.maxTroops = Math.max(u.maxTroops || 0, V.arcologyUpgrade.drones > 0 ? 30 : 0);
-				if (V.secBots) {
-					V.SecExp.units.bots.squads[0] = Object.assign(V.secBots, {platoonName: "1st " + data.defaultName});
-				}
-				if (V.SecExp.units[unit].squads.length === 1 && !u.platoonName) {
-					u.platoonName = "1st " + data.defaultName;
-				}
-			} else {
-				u.SF = u.SF || 0;
-				if (!jsDef(u.ID)) {
-					u.ID = genID();
+		if (mode !== "init") {
+			V.SecExp.units[unit].squads.forEach(u => {
+				if (unit === 'bots') {
+					u.active = Math.max(0, u.active) || V.arcologyUpgrade.drones > 0 ? 1 : 0;
+					u.troops = Math.max(u.troops || 0, V.arcologyUpgrade.drones > 0 ? 30 : 0);
+					u.maxTroops = Math.max(u.maxTroops || 0, V.arcologyUpgrade.drones > 0 ? 30 : 0);
+					if (V.secBots) {
+						V.SecExp.units.bots.squads[0] = Object.assign(V.secBots, {platoonName: "1st " + data.defaultName});
+					}
+					if (V.SecExp.units[unit].squads.length === 1 && !u.platoonName) {
+						u.platoonName = "1st " + data.defaultName;
+					}
+				} else {
+					u.SF = u.SF || 0;
+					if (!jsDef(u.ID)) {
+						u.ID = genID();
+					}
+					u.cyber = u.cyber || 0;
+					u.commissars = u.commissars || 0;
+					u.troops = Math.clamp(u.troops, 0, u.maxTroops || 30);
+					u.training = Math.clamp(u.training, 0, 100);
+					if (V.SF.Active < 1) {
+						u.SF = 0;
+					}
 				}
-				u.cyber = u.cyber || 0;
-				u.commissars = u.commissars || 0;
-				u.troops = Math.clamp(u.troops, 0, u.maxTroops || 30);
-				u.training = Math.clamp(u.training, 0, 100);
-				if (V.SF.Active < 1) {
-					u.SF = 0;
+	
+				if (unit !== 'bots' && u.platoonName.contains('undefined')) {
+					u.platoonName = u.platoonName.replace('undefined', data.defaultName);
 				}
-			}
-
-			if (unit !== 'bots' && u.platoonName.contains('undefined')) {
-				u.platoonName = u.platoonName.replace('undefined', data.defaultName);
-			}
-
-			App.Mods.SecExp.unit.genID(u, unit);
-			u.equip = u.equip || 0;
-			delete u.isDeployed;
-		});
+	
+				App.Mods.SecExp.unit.genID(u, unit);
+				u.equip = u.equip || 0;
+				delete u.isDeployed;
+			});
+		}
 	}
 
 	if (V.SecExp.units.mercs.free === 0) {
@@ -167,7 +175,20 @@ App.Mods.SecExp.generalBC = function() {
 
 	delete V.SecExp.core.crimeCap;
 	V.SecExp.core.trade = V.SecExp.core.trade || V.trade || 0;
-	App.Mods.SecExp.initTrade();
+	if (V.SecExp.core.trade === 0 || !jsDef(V.SecExp.core.trade)) {
+		let init = jsRandom(20, 30);
+		if (V.terrain === "urban") {
+			init += jsRandom(10, 10);
+		} else if (V.terrain === "ravine") {
+			init -= jsRandom(5, 5);
+		}
+		if (isPCCareerInCategory("wealth") || isPCCareerInCategory("capitalist") || isPCCareerInCategory("celebrity") || isPCCareerInCategory("BlackHat")) {
+			init += jsRandom(5, 5);
+		} else if (isPCCareerInCategory("escort") || isPCCareerInCategory("gang") || isPCCareerInCategory("servant")) {
+			init -= jsRandom(5, 5);
+		}
+		V.SecExp.core.trade = init;
+	}
 
 	V.SecExp.core.authority = V.SecExp.core.authority || V.authority || 0;
 	V.SecExp.core.security = V.SecExp.core.security || V.security || 100;
@@ -291,12 +312,14 @@ App.Mods.SecExp.generalBC = function() {
 		V.SecExp.settings.showStats = V.showBattleStatistics;
 	}
 
-	App.Mods.SecExp.BC.propHub();
-	App.Mods.SecExp.BC.barracks();
-	App.Mods.SecExp.BC.secHub();
-	App.Mods.SecExp.BC.transportHub();
-	App.Mods.SecExp.BC.riotCenter();
-	App.Mods.SecExp.BC.weaponsManufacturing();
+	if (mode === "BC") {
+		App.Mods.SecExp.BC.propHub();
+		App.Mods.SecExp.BC.barracks();
+		App.Mods.SecExp.BC.secHub();
+		App.Mods.SecExp.BC.transportHub();
+		App.Mods.SecExp.BC.riotCenter();
+		App.Mods.SecExp.BC.weaponsManufacturing();
+	}
 
 	V.SecExp.proclamation.cooldown = V.SecExp.proclamation.cooldown || V.proclamationsCooldown || 0;
 	V.SecExp.proclamation.currency = V.SecExp.proclamation.currency || V.proclamationCurrency || "";
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index a799ec7d4e7c9df9bf434fa3b17db8eb910a6213..25d8480fd39029426d9097a35ff77a4a10a53383 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -436,7 +436,7 @@ App.Update.globalVariables = function(node) {
 	// Pit
 	App.Facilities.Pit.BC();
 
-	App.Mods.SecExp.generalBC();
+	App.Mods.SecExp.object("BC");
 	App.Mods.SF.BC();
 
 	// FS
diff --git a/src/endWeek/endWeek.js b/src/endWeek/endWeek.js
index c89e7c90f63cc67feac142aab4152544489d876a..014fa1b38e922efcf08d60eb073b9e2a42f68e0b 100644
--- a/src/endWeek/endWeek.js
+++ b/src/endWeek/endWeek.js
@@ -17,9 +17,6 @@ globalThis.endWeek = (function() {
 		}
 		setUseWeights();
 		saveWeekTotals();
-		if (V.secExpEnabled > 0) {
-			V.SecExp.war = {foughtThisWeek: 0, type: ""};
-		}
 
 		// pass time for objects that need it
 		weather();
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index e3a899688e268367af6ac92e248acac519b101e0..a3108a7a97304502e6fdf7fdf1e3cbbd18aa44a4 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -322,7 +322,7 @@ App.EndWeek.nextWeek = function() {
 			V.SecExp.buildings.riotCenter.sentUnitCooldown = Math.max(V.SecExp.buildings.riotCenter.sentUnitCooldown - 1, 0);
 		}
 		V.SecExp.proclamation.cooldown = Math.max(V.SecExp.proclamation.cooldown - 1, 0);
-		V.SecExp.war = {foughtThisWeek: 0, type: ""};
+		V.SecExp.war = {};
 	}
 
 	App.EndWeek.weather();
diff --git a/src/events/intro/initNationalities.js b/src/events/intro/initNationalities.js
index 4ddc3e8ef7d462bbc5cb61fffdbda0a69d38f41f..31bda02e9747c18797e6c06c1a1864391e952de7 100644
--- a/src/events/intro/initNationalities.js
+++ b/src/events/intro/initNationalities.js
@@ -422,7 +422,7 @@ App.Intro.initNationalities = function() {
 	const random12 = jsRandomMany(sellable, 12);
 	random12.forEach(cell => { cell.owner = 0; });
 
-	App.Mods.SecExp.generalInit();
+	App.Mods.SecExp.object("init");
 
 	if (V.localEcon > 100) {
 		V.mods.food.cost = Math.max(5 / (1 + (Math.trunc(1000-100000/V.localEcon)/10)/100), 3.125);
diff --git a/src/events/nonRandomEvent.js b/src/events/nonRandomEvent.js
index 099becebf49a6b1e683879ba2605dca226488b07..47b8cecae690e6498619c3c29d399f6cf9c555c9 100644
--- a/src/events/nonRandomEvent.js
+++ b/src/events/nonRandomEvent.js
@@ -55,9 +55,6 @@ App.Events.getNonrandomEvents = function() {
 
 		// secExp
 		new App.Events.secExpSmilingMan0(),
-		new App.Events.secExpSmilingMan1(),
-		new App.Events.secExpSmilingMan2(),
-		new App.Events.secExpSmilingMan3(),
 
 		new App.Events.PMercsHelpCorp(),
 		new App.Events.PMercenaryRomeo(),
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index 3dd6263003b2a717dd855852cb2ab08e3245596d..839d5b98459b711e0f669ecc3c23192b85c9a217 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -157,7 +157,7 @@ App.UI.optionsPassage = function() {
 			.addComment("<div>This mod is triggered after week 72. It is non-canon where it conflicts with canonical updates to the base game.</div>");
 
 		options.addOption("The Security Expansion mod is", "secExpEnabled")
-			.addValue("Enabled", 1).on().addCallback(() => App.Mods.SecExp.generalInit())
+			.addValue("Enabled", 1).on().addCallback(() => App.Mods.SecExp.object("in-game"))
 			.addValue("Disabled", 0).off()
 			.addComment("<div>The mod can be activated in any moment, but it may result in unbalanced gameplay if activated very late in the game.</div>");