diff --git a/src/005-passages/bcPassages.js b/src/005-passages/bcPassages.js
new file mode 100644
index 0000000000000000000000000000000000000000..1cf82e5ac49e4725e18ce05fdaecdf64cf691620
--- /dev/null
+++ b/src/005-passages/bcPassages.js
@@ -0,0 +1,14 @@
+new App.DomPassage("Backwards Compatibility",
+	() => {
+		V.nextButton = "Continue";
+		V.nextLink = "Main";
+		V.returnTo = "Main";
+
+		App.Update.setNonexistentProperties(V, App.Data.defaultGameStateVariables);
+
+		/* 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 */
+		App.Update.setNonexistentProperties(V, App.Data.resetOnNGPlus);
+
+		return App.Update.backwardsCompatibility();
+	}
+);
diff --git a/src/data/backwardsCompatibility/BackwardsCompatibility.tw b/src/data/backwardsCompatibility/BackwardsCompatibility.tw
deleted file mode 100644
index 0a3ff856077b2e720b146f89553a7100f218f495..0000000000000000000000000000000000000000
--- a/src/data/backwardsCompatibility/BackwardsCompatibility.tw
+++ /dev/null
@@ -1,12 +0,0 @@
-:: Backwards Compatibility [nobr]
-
-<<set $nextButton = "Continue", $nextLink = "Main", $returnTo = "Main">>
-
-<<run App.Update.setNonexistentProperties(V, App.Data.defaultGameStateVariables)>>
-
-/* 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.setNonexistentProperties(V, App.Data.resetOnNGPlus)>>
-<span id="backwards-compatibility"></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 f34d42d3980f5448940186ea22ba0ddda9220429..f1068b1b5f5ef1d444787b376ede0d44b8f8c927 100644
--- a/src/data/backwardsCompatibility/backwardsCompatibility.js
+++ b/src/data/backwardsCompatibility/backwardsCompatibility.js
@@ -53,64 +53,68 @@ App.Update.setExistentProperties = function(obj, array) {
 	}
 };
 
+/**
+ * @returns {DocumentFragment}
+ */
 App.Update.backwardsCompatibility = function() {
+	const f = document.createDocumentFragment();
 	let div;
-	jQuery('#backwards-compatibility').empty();
 	try {
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Check for old version... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.oldVersions(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Updating gene pool records... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.genePoolRecords(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Updating global variables... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.globalVariables(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Updating slave variables... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.slaveVariables(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Updating slave records... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.slaveRecords(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Updating Rule Assistant data... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.RAassistantData(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Checking for old arcology locations... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.arcologyLocation(div);
 
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Checking for old variables... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.autoshred(div);
 
 		// leave this at the bottom of BC
-		div = document.createElement('div');
+		div = document.createElement("div");
 		div.append(`Cleaning up... `);
-		jQuery('#backwards-compatibility').append(div);
+		f.append(div);
 		App.Update.cleanUp(div);
 		App.UI.SlaveSummary.settingsChanged();
 	} catch (error) {
-		div = document.createElement('p');
-		div.className = "red";
+		div = document.createElement("p");
+		div.className = "error";
 		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('#backwards-compatibility').append(div);
+		f.append(div);
+		f.append(App.UI.DOM.formatException(error));
 		State.restore();
-		throw (error); // rethrow the exception to SugarCube so we get a fancy stack trace
 	}
+	return f;
 };
 
 App.Update.globalVariables = function(node) {