diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 156cb431186a41d633178306729427a07e8c5916..fbcdf3562f57296107d2d50559390b1f64be770b 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -1768,3 +1768,41 @@ window.Deadliness = function Deadliness(slave) {
 
 	return Math.max(deadliness, 1);
 };
+
+/** Is the slave ready to retire?
+ * @param {SlaveState} slave
+ * @returns {boolean}
+ */
+window.retirementReady = function RetirementReady(slave) {
+	// indentured slaves don't retire, they expire
+	if (slave.indenture >= 0) {
+		return false;
+	}
+
+	// retirement by age
+	if (V.PhysicalRetirementAgePolicy !== 1 && slave.actualAge >= V.retirementAge) {
+		return true;
+	} else if (V.PhysicalRetirementAgePolicy === 1 && slave.physicalAge >= V.retirementAge) {
+		return true;
+	}
+
+	// retirement by milestone
+	if (V.SexMilestoneRetirement === 1 && (slave.counter.oral + slave.counter.anal + slave.counter.vaginal + slave.counter.penetrative + slave.counter.mammary) > V.retirementSex) {
+		return true;
+	}
+	if (V.MilkMilestoneRetirement === 1 && slave.counter.milk > V.retirementMilk) {
+		return true;
+	}
+	if (V.CumMilestoneRetirement === 1 && slave.counter.cum > V.retirementCum) {
+		return true;
+	}
+	if (V.BirthsMilestoneRetirement === 1 && slave.counter.births > V.retirementBirths) {
+		return true;
+	}
+	if (V.KillsMilestoneRetirement === 1 && slave.counter.kills > V.retirementKills) {
+		return true;
+	}
+
+	// no retirement for you
+	return false;
+};
diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw
index 8c9d577f0b89203eb1cc1511634a5363d6c2fa53..2e38ec86e7b5f5a844a6a914abd04b9a8fcfe745 100644
--- a/src/uncategorized/saLongTermEffects.tw
+++ b/src/uncategorized/saLongTermEffects.tw
@@ -8356,42 +8356,15 @@
 			$He remembered it, but no one cared.
 		<</if>>
 	<</if>>
-	<<if $retiree == 0>>
-		<<if $slaves[$i].indenture < 0>>
-			<<if $slaves[$i].actualAge >= $retirementAge && $PhysicalRetirementAgePolicy != 1>>
-				<<set $retiree = $slaves[$i].ID>>
-			<<elseif $slaves[$i].physicalAge >= $retirementAge && $PhysicalRetirementAgePolicy == 1>>
-				<<set $retiree = $slaves[$i].ID>>
-			<</if>>
-			<<if $SexMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.oral + $slaves[$i].counter.anal + $slaves[$i].counter.vaginal + $slaves[$i].counter.penetrative + $slaves[$i].counter.mammary >= $retirementSex>>
-					<<set $retiree = $slaves[$i].ID>>
-				<</if>>
-			<</if>>
-			<<if $MilkMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.milk >= $retirementMilk>>
-					<<set $retiree = $slaves[$i].ID>>
-				<</if>>
-			<</if>>
-			<<if $CumMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.cum >= $retirementCum>>
-					<<set $retiree = $slaves[$i].ID>>
-				<</if>>
-			<</if>>
-			<<if $BirthsMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.births >= $retirementBirths>>
-					<<set $retiree = $slaves[$i].ID>>
-				<</if>>
-			<</if>>
-			<<if $KillsMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.pitKills >= $retirementKills>>
-					<<set $retiree = $slaves[$i].ID>>
-				<</if>>
-			<</if>>
-		<</if>>
+	<<if retirementReady($slaves[$i]) && $retiree == 0>>
+		<<set $retiree = $slaves[$i].ID>>
 	<</if>>
 <</if>>
 
+<<if $slaves[$i].indenture == 0 && $expiree == 0>>
+	<<set $expiree = $slaves[$i].ID>>
+<</if>>
+
 <<if $arcologies[0].FSRestart != "unset">>
 	<<if $slaves[$i].breedingMark == 1 && $propOutcome == 1 && $eugenicsFullControl != 1>>
 		<<if $slaves[$i].preg > $slaves[$i].pregData.normalBirth/13.33 || $slaves[$i].pregKnown == 1>>
@@ -8410,12 +8383,6 @@
 	<</if>>
 <</if>>
 
-<<if $slaves[$i].indenture == 0>>
-	<<if $expiree == 0>>
-		<<set $expiree = $slaves[$i].ID>>
-	<</if>>
-<</if>>
-
 /*--------------- main labor triggers: -------- */
 <<if $slaves[$i].preg > $slaves[$i].pregData.normalBirth/8>>
 	<<if $slaves[$i].pregControl != "labor suppressors" && $slaves[$i].assignment != "labor in the production line">>
diff --git a/src/uncategorized/scheduledEvent.tw b/src/uncategorized/scheduledEvent.tw
index 33d736dbdc2fdb6aed8b2055ba48a97c037cfc8c..74bb0057e10a20629b9ea095e816e11390e976c6 100644
--- a/src/uncategorized/scheduledEvent.tw
+++ b/src/uncategorized/scheduledEvent.tw
@@ -5,60 +5,20 @@
 <<if $expired == 1>>
 	<<set $activeSlave = getSlave($expiree), $expiree = 0>>
 	<<= removeActiveSlave() >>
-	<<for $i = 0; $i < $slaves.length; $i++>>
-		<<if $slaves[$i].indenture == 0>>
-			<<set $expiree = $slaves[$i].ID>>
-			<<break>>
-		<</if>>
-	<</for>>
+	<<set _expireSlave = $slaves.find((s) => s.indenture === 0)>>
+	<<if def _expireSlave>>
+		<<set $expiree = _expireSlave.ID>>
+	<</if>>
 <</if>>
 <<set $expired = 0>>
 
 <<if $retired == 1>>
 	<<set $activeSlave = getSlave($retiree), $retiree = 0>>
 	<<= removeActiveSlave() >>
-	<<for $i = 0; $i < $slaves.length; $i++>>
-		<<if $slaves[$i].indenture < 0>>
-			<<if $slaves[$i].actualAge >= $retirementAge && $PhysicalRetirementAgePolicy != 1>>
-				<<set $retiree = $slaves[$i].ID>>
-				<<break>>
-			<</if>>
-			<<if $slaves[$i].physicalAge >= $retirementAge && $PhysicalRetirementAgePolicy == 1>>
-				<<set $retiree = $slaves[$i].ID>>
-				<<break>>
-			<</if>>
-			<<if $SexMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.oral + $slaves[$i].counter.anal + $slaves[$i].counter.vaginal + $slaves[$i].counter.penetrative + $slaves[$i].counter.mammary >= $retirementSex>>
-					<<set $retiree = $slaves[$i].ID>>
-					<<break>>
-				<</if>>
-			<</if>>
-			<<if $MilkMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.milk >= $retirementMilk>>
-					<<set $retiree = $slaves[$i].ID>>
-					<<break>>
-				<</if>>
-			<</if>>
-			<<if $CumMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.cum >= $retirementCum>>
-					<<set $retiree = $slaves[$i].ID>>
-					<<break>>
-				<</if>>
-			<</if>>
-			<<if $BirthsMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.births >= $retirementBirths>>
-					<<set $retiree = $slaves[$i].ID>>
-					<<break>>
-				<</if>>
-			<</if>>
-			<<if $KillsMilestoneRetirement == 1>>
-				<<if $slaves[$i].counter.pitKills >= $retirementKills>>
-					<<set $retiree = $slaves[$i].ID>>
-					<<break>>
-				<</if>>
-			<</if>>
-		<</if>>
-	<</for>>
+	<<set _retireSlave = $slaves.find((s) => retirementReady(s))>>
+	<<if def _retireSlave>>
+		<<set $retiree = _retireSlave.ID>>
+	<</if>>
 <</if>>
 <<set $retired = 0>>