diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js
index 1207467e07fc45a09ecbbc97e51ae7f41e9bfa4f..c35674903bb51c4fd4dc12c2ebdd11648a33af5a 100644
--- a/src/interaction/slaveInteract.js
+++ b/src/interaction/slaveInteract.js
@@ -1,63 +1,24 @@
 /* eslint-disable no-unused-vars */ // TODO: remove after testing
 App.UI.SlaveInteract.placeInLine = function(slave) {
-	let slavesInLine = [];
-	let activeSlaveIndex = V.slaveIndices[slave.ID];
-	let SL = V.slaves.length;
-
-	if (assignmentVisible(slave)) {
-		for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) {
-			/* loops backwards through the V.slaves array */
-			if (pil < 0) {
-				pil = SL;
-				continue;
-			}
-			if (assignmentVisible(V.slaves[pil])) {
-				slavesInLine.push(pil); /* index of the previous slave in line */
-				break;
-			}
-		}
-		for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) {
-			/* this loops forwards through the V.slaves array */
-			if (pil === SL) {
-				pil = -1;
-				continue;
-			}
-			if (assignmentVisible(V.slaves[pil])) {
-				slavesInLine.push(pil); /* index of the next slave in line */
-				break;
-			}
-		}
+	const useSlave = assignmentVisible(slave) ? ((s) => assignmentVisible(s)) : ((s) => slave.assignment === s.assignment);
+	const slaveList = V.slaves.filter(useSlave);
+	SlaveSort.slaves(slaveList);
+	const curSlaveIndex = slaveList.findIndex((s) => s.ID === slave.ID);
+
+	let nextIndex;
+	if (curSlaveIndex + 1 > slaveList.length - 1) {
+		nextIndex = 0; // wrap around to first slave
 	} else {
-		for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) {
-			/* loops backwards through the V.slaves array */
-			if (pil < 0) {
-				pil = SL;
-				continue;
-			}
-			if (V.slaves[pil].assignment === slave.assignment) {
-				slavesInLine.push(pil); /* index of the previous slave in line */
-				break;
-			}
-		}
-		for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) {
-			/* this loops forwards through the V.slaves array */
-			if (pil === SL) {
-				pil = -1;
-				continue;
-			}
-			if (V.slaves[pil].assignment === slave.assignment) {
-				slavesInLine.push(pil); /* index of the next slave in line */
-				break;
-			}
-		}
+		nextIndex = curSlaveIndex + 1;
 	}
-
-	if (slavesInLine.length === 0) {
-		/* if there are no other slaves available, set previous/next slave to self */
-		slavesInLine[0] = activeSlaveIndex;
-		slavesInLine[1] = activeSlaveIndex;
+	let prevIndex;
+	if (curSlaveIndex - 1 < 0) {
+		prevIndex = slaveList.length - 1; // wrap around to last slave
+	} else {
+		prevIndex = curSlaveIndex - 1;
 	}
-	return slavesInLine;
+
+	return [ slaveList[prevIndex].ID, slaveList[nextIndex].ID ];
 };
 
 App.UI.SlaveInteract.fucktoyPref = function(slave) {
diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 68a3ec9ed0ccd585dddf27bfd0ceaca48e6f66f4..443245cab40d35fdf0d9db577e6925db32b0b014 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -1534,7 +1534,17 @@ window.SlaveSort = function() {
 	 */
 	/** @returns {slaveComparator} */
 	function _comparator() {
-		return comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy];
+		return _makeStableComparator(comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy]);
+	}
+
+	/** secondary-sort by ascending ID if the primary comparator would return 0 (equal), so we have a guaranteed stable order regardless of input
+	 * @param {slaveComparator} comparator
+	 * @returns {slaveComparator}
+	 */
+	function _makeStableComparator(comparator) {
+		return function(a, b) {
+			return comparator(a, b) || comparators.AID(a, b);
+		};
 	}
 }();
 
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 160884934a9fb84235d88c74b22dfbac6e5f6a6a..27b6312ae845bbda60c3feb2ffb1b682c1375830 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -66,7 +66,7 @@
 		[←,Q]
 	</span>
 	<span id="prevSlave" style="font-weight:bold">
-		<<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[0]]>><</link>>
+		<<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[0])>><</link>>
 	</span>
 	&nbsp;&nbsp;&nbsp;&nbsp;
 	<span class='slave-name'>
@@ -74,7 +74,7 @@
 	</span>
 	&nbsp;&nbsp;&nbsp;&nbsp;
 	<span id="nextSlave" style="font-weight:bold">
-		<<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[1]]>><</link>>
+		<<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[1])>><</link>>
 	</span>
 	<span class="cyan">
 		[E,→]