diff --git a/TODO.txt b/TODO.txt
index b7c5a96afd25de4981c0e5b4137bfaa266e70c20..a8ce562749c362ba40dc8e0e99b17185c26519fd 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -17,3 +17,14 @@ Rules Assistant:
 
 main.tw porting:
 - slaveart
+- createsimpletabs
+- displaybuilding
+- optionssortasappearsonmain
+- resetassignmentfilter
+- mainlinks
+- arcology description
+- office description
+- slave summary
+- use guard
+- toychest
+- walk past
diff --git a/src/js/assayJS.tw b/src/js/assayJS.tw
index 849a5e217dd2a7d0979517934ce845fad5751934..9a03663c6dc5bc6d7014240ce59e5101f416b599 100644
--- a/src/js/assayJS.tw
+++ b/src/js/assayJS.tw
@@ -777,3 +777,58 @@ window.SlaveTitle = function SlaveTitle(slave) {
 	}
 	return r;
 };
+
+window.SlaveSort = function SlaveSort(slaves, main=false) {
+	const V = State.variables;
+	if (main) {
+		switch (V.sortSlavesBy) {
+		case "name":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.slaveName < b.slaveName ? -1 : 1);
+			else
+				slaves = slaves.sort((a, b) => a.slaveName > b.slaveName ? -1 : 1);
+			break;
+		case "assignment":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.assignment < b.assignment ? -1 : 1);
+			else
+				slaves = slaves.sort((a, b) => a.assignment > b.assignment ? -1 : 1);
+			break;
+		case "seniority":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => b.weekAcquired - a.weekAcquired);
+			else
+				slaves = slaves.sort((a, b) => a.weekAcquired - b.weekAcquired);
+			break;
+		case "actualAge":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.actualAge - b.actualAge);
+			else
+				slaves = slaves.sort((a, b) => b.actualAge - a.actualAge);
+			break;
+		case "visualAge":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.visualAge - b.visualAge);
+			else
+				slaves = slaves.sort((a, b) => b.visualAge - a.visualAge);
+			break;
+		case "physicalAge":
+			if (V.sortSlavesOrder == "physicalAge")
+				slaves = slaves.sort((a, b) => a.physicalAge - b.physicalAge);
+			else
+				slaves = slaves.sort((a, b) => b.physicalAge - a.physicalAge);
+			break;
+		default:
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.devotion - b.devotion);
+			else
+				slaves = slaves.sort((a, b) => b.devotion - a.devotion);
+			break;
+		}
+		V.slaveIndices = slaves2indices();
+	} else {
+		V.slaveIndices = slaves2indices();
+		filterInPlace(slaves, s => V.slaveIndices[s] !== undefined);
+		slaves.sort((a, b) => V.slaveIndices[a] - V.slaveIndices[b]);
+	}
+};
diff --git a/src/utility/miscWidgets.tw b/src/utility/miscWidgets.tw
index 2460d62eadb78df1c21036a426f57f2d5779f566..0d44b849ef37ae7a5e792677d63fb070a847811a 100644
--- a/src/utility/miscWidgets.tw
+++ b/src/utility/miscWidgets.tw
@@ -1544,57 +1544,11 @@ This experience
  $args[0]: array to sort
 %/
 <<widget "SlaveSort">>
-<<if passage() == "Main">>
-	<<switch $sortSlavesBy>>
-	<<case "name">>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){if(a.slaveName < b.slaveName) return -1; if(a.slaveName > b.slaveName) return 1; return 0;})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){if(a.slaveName > b.slaveName) return -1; if(a.slaveName < b.slaveName) return 1; return 0;})>>
-		<</if>>
-	<<case "assignment">>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){if(a.assignment < b.assignment) return -1; if(a.assignment > b.assignment) return 1; return 0;})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){if(a.assignment > b.assignment) return -1; if(a.assignment < b.assignment) return 1; return 0;})>>
-		<</if>>
-	<<case "seniority">>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){return b.weekAcquired-a.weekAcquired})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){return a.weekAcquired-b.weekAcquired})>>
-		<</if>>
-	<<case "actualAge">>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){return a.actualAge-b.actualAge})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){return b.actualAge-a.actualAge})>>
-		<</if>>
-	<<case "visualAge">>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){return a.visualAge-b.visualAge})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){return b.visualAge-a.visualAge})>>
-		<</if>>
-	<<case "physicalAge">>
-		<<if ($sortSlavesOrder == "physicalAge")>>
-			<<set $args[0] = $args[0].sort(function(a, b){return a.physicalAge-b.physicalAge})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){return b.physicalAge-a.physicalAge})>>
-		<</if>>
-	<<default>>
-		<<if ($sortSlavesOrder == "ascending")>>
-			<<set $args[0] = $args[0].sort(function(a, b){return a.devotion-b.devotion})>>
-		<<else>>
-			<<set $args[0] = $args[0].sort(function(a, b){return b.devotion-a.devotion})>>
-		<</if>>
-	<</switch>>
-	<<set $slaveIndices = slaves2indices()>>
-<<else>>
-	<<set $slaveIndices = slaves2indices()>>
-	<<set filterInPlace($args[0], function(s) { return $slaveIndices[s] !== undefined; })>>
-	<<set $args[0].sort(function(a, b) { return $slaveIndices[a] - $slaveIndices[b]; })>>
-<</if>>
+	<<if passage() == "Main">>
+		<<run SlaveSort($args[0], true)>>
+	<<else>>
+		<<run SlaveSort($args[0])>>
+	<</if>>
 <</widget>>
 
 /%