diff --git a/src/Mods/SecExp/SecExpBackwardCompatibility.tw b/src/Mods/SecExp/SecExpBackwardCompatibility.tw
index c7f0d95dab5f6cc9eff125a5ad8f750c861b67c0..92f7d31b385d4186f0fba6711a369524e3b2e945 100644
--- a/src/Mods/SecExp/SecExpBackwardCompatibility.tw
+++ b/src/Mods/SecExp/SecExpBackwardCompatibility.tw
@@ -3,7 +3,7 @@
 <<set $nextButton = "Continue", $nextLink = "Main", $returnTo = "Main">>
 
 /* base stats */
-<<= App.SecExp.Check.general()>>
+<<run App.SecExp.Check.general()>>
 <<if ndef $attackType>>
 	<<set $attackType = "none">>
 <</if>>
diff --git a/src/data/backwardsCompatibility/BackwardsCompatibility.tw b/src/data/backwardsCompatibility/BackwardsCompatibility.tw
index a2f875078ffb081bc498c29cfd5e21cee2f56807..15d45f2dd2b0ad3525b551a58002a0cdcf866194 100644
--- a/src/data/backwardsCompatibility/BackwardsCompatibility.tw
+++ b/src/data/backwardsCompatibility/BackwardsCompatibility.tw
@@ -7,42 +7,7 @@
 
 /* resetOnNGPlus contains half of the variables we need, but we use it politely here instead of forcing it so it fills in holes instead of overwriting data */
 <<run App.Update.setNonexistantProperties(V, App.Data.resetOnNGPlus)>>
-
-<div>
-	<<= App.Update.oldVersions()>>
-</div>
-
-<div>
-	<<= App.Update.genePoolRecords()>>
-</div>
-
-<div>
-	<<= App.Update.globalVariables()>>
-</div>
-
-<div>
-	<<= App.Update.slaveVariables()>>
-</div>
-
-<div>
-	<<= App.Update.slaveRecords()>>
-</div>
-
-<div>
-	<<= App.Update.RAassistantData()>>
-</div>
-
-/* Sec Exp */
-<div>
-	<<= App.SecExp.Check.general()>>
-	<<if $secExpEnabled == 1>>
-		<br> <<include "SecExpBackwardCompatibility">>
-	<</if>>
-</div>
-<div>
-	<<= App.Update.autoshred()>>
-</div>
-/* leave this at the bottom of BC */
-<div>
-	<<= App.Update.cleanUp()>>
-</div>
+<span id="backwardsCompatibility"></span>
+<script>
+    App.Update.backwardsCompatibility();
+</script>
\ No newline at end of file
diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js
index af6491d0340b5714dc2ac2567efebc7c072ecefa..c76351f5fd5eef5e95e57f3ade4cab4753efa7cf 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -21,6 +21,7 @@ App.Update.autoshred = function() {
 	if (extraCount !== 0) {
 		console.log(`and ${extraCount} more`);
 	}
+	return `Done!`;
 };
 
 App.Update.setNonexistantProperties = function(obj, props) {
@@ -51,8 +52,73 @@ App.Update.setExistantProperties = function(obj, array) {
 	}
 };
 
+App.Update.backwardsCompatibility = function() {
+	let div;
+	jQuery('#backwardsCompatibility').empty();
+	try {
+		div = document.createElement('div');
+		div.append(`Check for old version... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.oldVersions());
+
+		div = document.createElement('div');
+		div.append(`Updating gene pool records... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.genePoolRecords());
+
+		div = document.createElement('div');
+		div.append(`Updating global variables... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.globalVariables());
+
+		div = document.createElement('div');
+		div.append(`Updating slave variables... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.slaveVariables());
+
+		div = document.createElement('div');
+		div.append(`Updating slave records... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.slaveRecords());
+
+		div = document.createElement('div');
+		div.append(`Updating Rule Assistant data... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.RAassistantData());
+
+		// Sec Exp
+		div = document.createElement('div');
+		div.append(`Updating Security Expansion... `);
+		jQuery('#backwardsCompatibility').append(div);
+		App.SecExp.Check.general();
+		if (V.secExpEnabled === 1) {
+			div.append(jQuery.wiki(`<<include "SecExpBackwardCompatibility">>`));
+		}
+		div.append("Done!");
+
+		div = document.createElement('div');
+		div.append(`Checking for old variables... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.autoshred());
+
+		// leave this at the bottom of BC
+		div = document.createElement('div');
+		div.append(`Cleaning up... `);
+		jQuery('#backwardsCompatibility').append(div);
+		div.append(App.Update.cleanUp());
+	} catch (error) {
+		div = document.createElement('p');
+		div.className = "red";
+		div.textContent = `Backwards compatibility has failed for your save.  Please upload your save to https://gitgud.io/pregmodfan/fc-pregmod/ with notes on what went wrong so that we can fix the backwards compatibility process for everyone.  Thank you!`;
+		jQuery('#backwardsCompatibility').append(div);
+		State.restore();
+		throw (error); // rethrow the exception to Sugarcube so we get a fancy stack trace
+	}
+	return;
+};
+
 App.Update.globalVariables = function() {
-	let r = `Setting missing global variables... `;
+	let r = ``;
 	if (Array.isArray(V.nationalities)) {
 		V.nationalities = weightedArray2HashMap(V.nationalities);
 	}
@@ -1068,12 +1134,12 @@ App.Update.globalVariables = function() {
 	EconomyDatatypeCleanup();
 	ArcologyDatatypeCleanup();
 
-	r += ` Done!<br>`;
+	r += `Done!`;
 	return r;
 };
 
 App.Update.slaveVariables = function() {
-	let r = `Setting missing slave variables... `;
+	let r = ``;
 	/* Adding a new variable? Consider putting it in datatypeCleanupJS.tw instead of here */
 	for (let bci = 0; bci < V.slaves.length; bci++) {
 		let Slave = V.slaves[bci];
@@ -1087,12 +1153,12 @@ App.Update.slaveVariables = function() {
 
 		V.slaves[bci] = Slave;
 	}
-	r += ` Done!<br>`;
+	r += `Done!`;
 	return r;
 };
 
 App.Update.slaveRecords = function() {
-	let r = `Checking and fixing slave records...`;
+	let r = ``;
 	V.slaves.forEach((slave) => {
 		App.Entity.Utils.SlaveDataSchemeCleanup(slave);
 		SlaveDatatypeCleanup(slave);
@@ -1121,7 +1187,7 @@ App.Update.slaveRecords = function() {
 		App.Entity.Utils.SlaveDataSchemeCleanup(V.traitor);
 		SlaveDatatypeCleanup(V.traitor);
 	}
-	r += ` Done!<br>`;
+	r += `Done!`;
 
 	if (V.tanks.length > 0) {
 		r += `Checking and fixing records for incubator tanks... `;
@@ -1131,7 +1197,7 @@ App.Update.slaveRecords = function() {
 			SlaveDatatypeCleanup(slave, true);
 			/* pass second argument as true so that slaveAgeDatatypeCleanup is not run */
 		});
-		r += ` Done!<br> `;
+		r += `Done! `;
 	}
 
 	if (V.cribs.length > 0) {
@@ -1151,13 +1217,13 @@ App.Update.slaveRecords = function() {
 				// let _nurseryChild = V.cribs[bci]; TODO: on importing this to JS, what is this even supposed to do?
 			}
 		}
-		r += ` Done!<br> `;
+		r += `Done!`;
 	}
 	return r;
 };
 
 App.Update.genePoolRecords = function() {
-	let r = `Updating gene pool records... `;
+	let r = ``;
 	for (let bci = 0; bci < V.genePool.length; bci++) {
 		App.Update.Slave(V.genePool[bci], true);
 		let slave = V.genePool[bci];
@@ -1245,14 +1311,14 @@ App.Update.genePoolRecords = function() {
 		App.Entity.Utils.GenePoolRecordCleanup(slave);
 		V.genePool[bci] = slave;
 	}
-	r += ` Done!<br>`;
+	r += `Done!`;
 	return r;
 };
 
 App.Update.RAassistantData = function() {
-	let r = `Updating Rules Assistant data...`;
+	let r = ``;
 	V.defaultRules = V.defaultRules.map(rule => App.Entity.Utils.RARuleDatatypeCleanup(rule));
-	r += ` Done!<br>`;
+	r += `Done!`;
 	return r;
 };
 
@@ -1922,13 +1988,14 @@ App.Update.oldVersions = function() {
 			V.PC.faceShape = "normal";
 		}
 
-		r += ` Done!`;
+		r += `Done!`;
 	}
 
 	if (V.arcologyUpgrade.spire === 1 && !V.building.usedUpgrades.includes("spire")) {
 		V.building.usedUpgrades.push("spire");
 	}
 
+	r += `Done!`;
 	return r;
 };
 
@@ -1939,7 +2006,7 @@ App.Update.cleanUp = function() {
 	}
 	/* reset NaNArray after BC is run */
 	V.NaNArray = findNaN();
-	return;
+	return `Done!`;
 };
 
 App.Update.sectorsToBuilding = function() {
diff --git a/src/events/intro/initNationalities.tw b/src/events/intro/initNationalities.tw
index ef78724ae0f087a493d7d801ed54d1d0722228a9..055f786043cdaa94a3a3fd4e2702bf231beaded7 100644
--- a/src/events/intro/initNationalities.tw
+++ b/src/events/intro/initNationalities.tw
@@ -12,7 +12,7 @@
 <<if $secExpEnabled > 0>>
 	/* base vars */
 	<<set $SecExp = SecExpBase()>>
-	<<= App.SecExp.Check.general()>>
+	<<run App.SecExp.Check.general()>>
 	<<set $secExp = SecExpBase()>>
 	<<set $secUpgrades = {
 		nanoCams: 0,