diff --git a/src/js/storyJS.tw b/src/js/storyJS.tw
index 40128dd4deff932aab93d1c215570bffa1570385..6e313c2704611119dcfa77b8bc0b0e96bc052528 100644
--- a/src/js/storyJS.tw
+++ b/src/js/storyJS.tw
@@ -995,6 +995,21 @@ window.overpowerCheck = function(slave, PC) {
 	return strength;
 }
 
+window.impregnatedBy = function(slave) { /* returns array of IDs of all characters who impregnated slave */
+	var IDArray = [];
+	if (!Array.isArray(slave.womb)) {   
+		WombInit(slave);
+	}
+	for (var i = 0; i < slave.womb.length; i++) {
+		IDArray.push(slave.womb.fatherID);
+	}
+	return IDArray;
+}
+
+window.isImpregnatedBy = function(mother, father) { /* returns true if mother was impregnated by father */
+	return impregnatedBy(mother).includes(father.ID);
+}
+
 window.jsAlert = function(obj)
 {
 	alert(obj);
diff --git a/src/npc/removeActiveSlave.tw b/src/npc/removeActiveSlave.tw
index ea3dd93293176173f21fdef29915e9d42981346a..ad4466db4d48a726685f7c931252c0c0a16856d3 100644
--- a/src/npc/removeActiveSlave.tw
+++ b/src/npc/removeActiveSlave.tw
@@ -143,6 +143,32 @@
 		<<set $limbs.deleteAt(_o)>>
 	<</if>>
 	
+	<<set _geneIndex = $genePool.findIndex(function(s) { return s.ID == $activeSlave.ID; })>>
+	<<if _geneIndex != -1>>
+		<<set _dontDeleteMe = 0>>
+		<<if $traitor != 0>>
+			<<if isImpregnatedBy($traitor, $activeSlave) || $traitor.ID == $activeSlave.ID>> /* did we impregnate the traitor, or are we the traitor? */
+				<<set _dontDeleteMe = 1>>
+			<</if>>
+		<</if>>
+		<<if $boomerangSlave != 0>>
+			<<if isImpregnatedBy($boomerangSlave, $activeSlave) || $boomerangSlave.ID == $activeSlave.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 _rasi = 0; _rasi < _SL; _rasi++>>
+				<<if $slaves[_rasi].ID != $activeSlave.ID && isImpregnatedBy($slaves[_rasi], $activeSlave)>> /* have we impregnated a slave that is not ourself? */
+					<<set _dontDeleteMe = 1>>
+					<<break>>
+				<</if>>
+			<</for>>
+		<</if>>
+		<<if _dontDeleteMe == 0>>
+			<<set $genePool.deleteAt(_geneIndex)>>	
+		<</if>>
+	<</if>>
+	
 	<<set _dump = removeSlave(_x), _SL--, $activeSlave = 0>>
 	
 	<<if _missingID == 1>>
diff --git a/src/uncategorized/BackwardsCompatibility.tw b/src/uncategorized/BackwardsCompatibility.tw
index 4789fdb3dcd3eaad975e14e12de8518d29703b70..6e304a2972de56ac3fe665bd4ddb806804e77f8f 100644
--- a/src/uncategorized/BackwardsCompatibility.tw
+++ b/src/uncategorized/BackwardsCompatibility.tw
@@ -3019,8 +3019,42 @@ 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>>
+
+	<<if $genePool.map(function(s) { return s.ID; }).count(_Slave.ID) > 1>> /* first check for duplicate IDs, keep the first entry and delete the others */
+		<<for _bci2 = _bci + 1; _bci2 < $genePool.length; _bci2++>>
+			<<if $genePool[_bci2].ID == _Slave.ID>>
+				<<set $genePool.deleteAt(_bci2), _bci2-->>
+			<</if>>
+		<</for>>
+	<</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 isImpregnatedBy($slaves[_bci2], _Slave)>> /* have we impregnated a slave on the slaves array? */
+				<<set _dontDeleteMe = 1>>
+				<<break>>
+			<</if>>
+		<</for>>
+	<</if>>
+	<<if _dontDeleteMe == 0>>
+		<<set $genePool.deleteAt(_bci), _bci-->>	
+	<</if>>
+
 <</for>>
 
 <<set $AgeEffectOnTrainerPricingPC = 1>>