diff --git a/src/npc/removeActiveSlave.tw b/src/npc/removeActiveSlave.tw
index a37b221e3978e5d40b02305d3c83e57079f5f29c..ba4cca54469d0b37f59d0910786a7b976fbfebd6 100644
--- a/src/npc/removeActiveSlave.tw
+++ b/src/npc/removeActiveSlave.tw
@@ -148,25 +148,27 @@
 	<<set _o = $genePool.findIndex(function(s) { return s.ID = _ID; })>>
 	<<if def _o>>
 		<<set _dontDeleteMe = 0>>
-		<<for _rasi = 0; _rasi < _SL; _rasi++>>
-			<<if $slaves[_rasi].ID != _ID && isImpregnatedBy($slaves[_rasi], $genePool[_o])>>
-				<<set _dontDeleteMe = 1>>
-				<<break>>
-			<</if>>
-		<</for>>
 		<<if $traitor != 0>>
-			<<if isImpregnatedBy($traitor, $genePool[_o]) || $traitor.ID == _ID>>
+			<<if isImpregnatedBy($traitor, $genePool[_o]) || $traitor.ID == _ID>> /* did we impregnate the traitor, or are we the traitor? */
 				<<set _dontDeleteMe = 1>>
 			<</if>>
 		<</if>>
 		<<if $boomerangSlave != 0>>
-			<<if isImpregnatedBy($boomerangSlave, $genePool[_o]) || $boomerangSlave.ID == _ID)>>
+			<<if isImpregnatedBy($boomerangSlave, $genePool[_o]) || $boomerangSlave.ID == _ID)>> /* did we impregnate the boomerang, or are we the boomerang? */
 				<<set _dontDeleteMe = 1>>
 			<</if>>
 		<</if>>
-	<</if>>
-	<<if _dontDeleteMe === 0>>
-		<<set $genePool.deleteAt(_o)>>	
+		<<if _dontDeleteMe == 0>> /* avoid going through this loop if possible */
+			<<for _rasi = 0; _rasi < _SL; _rasi++>>
+				<<if $slaves[_rasi].ID != _ID && isImpregnatedBy($slaves[_rasi], $genePool[_o])>> /* have we impregnated a slave that is not ourself? */
+					<<set _dontDeleteMe = 1>>
+					<<break>>
+				<</if>>
+			<</for>>
+		<</if>>
+		<<if _dontDeleteMe == 0>>
+			<<set $genePool.deleteAt(_o)>>	
+		<</if>>
 	<</if>>
 	
 	<<if _missingID == 1>>
diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw
index 4789fdb3dcd3eaad975e14e12de8518d29703b70..6aed0289227f2d1fc68f2802159f1e05a6af624a 100644
--- a/src/uncategorized/BackwardsCompatibility.tw
+++ b/src/uncategorized/BackwardsCompatibility.tw
@@ -3019,8 +3019,35 @@ Setting missing slave variables:
 <<set $slavesOriginal = []>> /* not used by pregmod */
 
 <<for _bci = 0; _bci < $genePool.length; _bci++>>
-<<set _Slave = $genePool[_bci]>>
+	<<set _Slave = $genePool[_bci]>>
 	<<if ndef _Slave.origSkin>><<set _Slave.origSkin = _Slave.skin>><</if>>
+
+	<<set _dontDeleteMe = 0>>
+	<<if def $slaveIndices[_Slave.ID]>> /* are we still in the $slaves array? */
+		<<set _dontDeleteMe = 1>>
+	<</if>>
+	<<if $traitor != 0>>
+		<<if isImpregnatedBy($traitor, _Slave) || $traitor.ID == _Slave.ID>> /* did we impregnate the traitor, or are we the traitor? */
+			<<set _dontDeleteMe = 1>>
+		<</if>>
+	<</if>>
+	<<if $boomerangSlave != 0>>
+		<<if isImpregnatedBy($boomerangSlave, _Slave) || $boomerangSlave.ID == _Slave.ID)>> /* did we impregnate the boomerang, or are we the boomerang? */
+			<<set _dontDeleteMe = 1>>
+		<</if>>
+	<</if>>
+	<<if _dontDeleteMe == 0>> /* avoid going through this loop if possible */
+		<<for _bci2 = 0; _bci2 < $slaves.length; _bci2++>>
+			<<if $slaves[_bci2].ID != _Slave.ID && isImpregnatedBy($slaves[_bci2], _Slave)>> /* have we impregnated a slave that is not ourself? */
+				<<set _dontDeleteMe = 1>>
+				<<break>>
+			<</if>>
+		<</for>>
+	<</if>>
+	<<if _dontDeleteMe == 0>>
+		<<set $genePool.deleteAt(_bci)>>	
+	<</if>>
+
 <</for>>
 
 <<set $AgeEffectOnTrainerPricingPC = 1>>