diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index 94645582f98f2d22c6f16b62e7a32141bdde5256..9840956a3dd089ae47c86804d09cc059ac5608e6 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -26213,11 +26213,12 @@ window.nationalityToRace = function nationalityToRace(slave) {
 	slave.race = hashChoice(setup.raceSelector[slave.nationality] || setup.raceSelector[""]);
 };
 
-window.generateName = function generateName(nationality, race, male) {
+window.generateName = function generateName(nationality, race, male, filter) {
+	filter = filter || _.stubTrue; /* default: allow all */
 	const lookup = (male ? setup.malenamePoolSelector : setup.namePoolSelector);
 	const result = jsEither(
-		lookup[nationality + "." + race] || lookup[nationality] ||
-		(male ? setup.whiteAmericanMaleNames : setup.whiteAmericanSlaveNames));
+		(lookup[nationality + "." + race] || lookup[nationality] ||
+		(male ? setup.whiteAmericanMaleNames : setup.whiteAmericanSlaveNames)).filter(filter));
 	/* fallback for males without specific male name sets: return female name */
 	if(male && !result) {
 		return generateName(nationality, race, false);
@@ -26225,11 +26226,12 @@ window.generateName = function generateName(nationality, race, male) {
 	return result;
 };
 
-window.generateSurname = function generateSurname(nationality, race, male) {
+window.generateSurname = function generateSurname(nationality, race, male, filter) {
+	filter = filter || _.stubTrue; /* default: allow all */
 	const result = jsEither(
-		setup.surnamePoolSelector[nationality + "." + race] ||
+		(setup.surnamePoolSelector[nationality + "." + race] ||
 		setup.surnamePoolSelector[nationality] ||
-		setup.whiteAmericanSlaveSurnames);
+		setup.whiteAmericanSlaveSurnames).filter(filter));
 	if(male) {
 		/* see if we have male equivalent of that surname, and return that if so */
 		const maleLookup = setup.maleSurnamePoolSelector[nationality + "." + race] || setup.maleSurnamePoolSelector[nationality];
@@ -26240,13 +26242,20 @@ window.generateSurname = function generateSurname(nationality, race, male) {
 	return result || 0;
 };
 
+window.isMaleName = function isMaleName(name, nationality, race) {
+	const names = setup.malenamePoolSelector[nationality + "." + race] ||
+		setup.malenamePoolSelector[nationality] ||
+		setup.whiteAmericanMaleNames;
+	return names && names.includes(name);
+};
+
 window.nationalityToName = function nationalityToName(slave) {
 	const V = State.variables;
 	const male = (slave.genes === "XY");
 
 	slave.birthName = generateName(slave.nationality, slave.race, male);
 	slave.birthSurname = generateSurname(slave.nationality, slave.race, male);
-	if(male && !V.allowMaleSlaveNames) {
+	if(male && isMaleName(slave.birthName, slave.nationality, slave.race) && !V.allowMaleSlaveNames) {
 		slave.slaveName = generateName(slave.nationality, slave.race, false);
 	} else {
 		slave.slaveName = slave.birthName;
diff --git a/src/js/slaveGenerationJS.tw b/src/js/slaveGenerationJS.tw
index c22cf591de54302e6919ef057f0250cdcb7ced58..0ab95b96230ae332a375d7d8699ce83d59e85005 100644
--- a/src/js/slaveGenerationJS.tw
+++ b/src/js/slaveGenerationJS.tw
@@ -48,11 +48,12 @@ window.nationalityToRace = function nationalityToRace(slave) {
 	slave.race = hashChoice(setup.raceSelector[slave.nationality] || setup.raceSelector[""]);
 };
 
-window.generateName = function generateName(nationality, race, male) {
+window.generateName = function generateName(nationality, race, male, filter) {
+	filter = filter || _.stubTrue; /* default: allow all */
 	const lookup = (male ? setup.malenamePoolSelector : setup.namePoolSelector);
 	const result = jsEither(
-		lookup[nationality + "." + race] || lookup[nationality] ||
-		(male ? setup.whiteAmericanMaleNames : setup.whiteAmericanSlaveNames));
+		(lookup[nationality + "." + race] || lookup[nationality] ||
+		(male ? setup.whiteAmericanMaleNames : setup.whiteAmericanSlaveNames)).filter(filter));
 	/* fallback for males without specific male name sets: return female name */
 	if(male && !result) {
 		return generateName(nationality, race, false);
@@ -60,11 +61,12 @@ window.generateName = function generateName(nationality, race, male) {
 	return result;
 };
 
-window.generateSurname = function generateSurname(nationality, race, male) {
+window.generateSurname = function generateSurname(nationality, race, male, filter) {
+	filter = filter || _.stubTrue; /* default: allow all */
 	const result = jsEither(
-		setup.surnamePoolSelector[nationality + "." + race] ||
+		(setup.surnamePoolSelector[nationality + "." + race] ||
 		setup.surnamePoolSelector[nationality] ||
-		setup.whiteAmericanSlaveSurnames);
+		setup.whiteAmericanSlaveSurnames).filter(filter));
 	if(male) {
 		/* see if we have male equivalent of that surname, and return that if so */
 		const maleLookup = setup.maleSurnamePoolSelector[nationality + "." + race] || setup.maleSurnamePoolSelector[nationality];
@@ -75,13 +77,20 @@ window.generateSurname = function generateSurname(nationality, race, male) {
 	return result || 0;
 };
 
+window.isMaleName = function isMaleName(name, nationality, race) {
+	const names = setup.malenamePoolSelector[nationality + "." + race] ||
+		setup.malenamePoolSelector[nationality] ||
+		setup.whiteAmericanMaleNames;
+	return names && names.includes(name);
+};
+
 window.nationalityToName = function nationalityToName(slave) {
 	const V = State.variables;
 	const male = (slave.genes === "XY");
 
 	slave.birthName = generateName(slave.nationality, slave.race, male);
 	slave.birthSurname = generateSurname(slave.nationality, slave.race, male);
-	if(male && !V.allowMaleSlaveNames) {
+	if(male && isMaleName(slave.birthName, slave.nationality, slave.race) && !V.allowMaleSlaveNames) {
 		slave.slaveName = generateName(slave.nationality, slave.race, false);
 	} else {
 		slave.slaveName = slave.birthName;
diff --git a/src/pregmod/widgets/pregmodWidgets.tw b/src/pregmod/widgets/pregmodWidgets.tw
index 657240a6e4bd95973c116bf780423e1421d975db..4cd9662320905d75877f28f7eb95db140463ddfb 100644
--- a/src/pregmod/widgets/pregmodWidgets.tw
+++ b/src/pregmod/widgets/pregmodWidgets.tw
@@ -1285,41 +1285,33 @@ extremely pale -5
 
 <<widget "ParentNames">>
 <<set _currentSlaveNames = $slaves.map(s => s.slaveName)>>
-<<set _namePool =
-	(setup.namePoolSelector[$args[0].nationality + "." + $args[1].race]
-	|| setup.namePoolSelector[$args[0].nationality]
-	|| setup.whiteAmericanSlaveNames)
-	.filter(sn => !_currentSlaveNames.includes(sn))>>
-<<set _maxTries = 10>>
-<<if _namePool.length <= 0 && setup.nationalityPoolSelector[$continent]>>
-	<<set _continentNationality = setup.nationalityPoolSelector[$continent].random()>>
-	<<for _namePool.length <= 0 && _maxTries > 5>>
-		<<set _namePool =
-			(setup.namePoolSelector[_continentNationality + "." + $args[1].race]
-			|| setup.namePoolSelector[_continentNationality]
-			|| []
-			.filter(sn => !_currentSlaveNames.includes(sn))>>
-		<<set _maxTries -= 1>>
+<<set $args[1].slaveName =
+	generateName($args[0].nationality, $args[1].race, $args[1].genes === "XY", sn => !_currentSlaveNames.includes(sn))>>
+<<if !$args[1].slaveName>>
+	/* we ran out of names ... How? */
+	<<set _maxTries = 10>>
+	<<for _maxTries > 0 && !$args[1].slaveName>>
+		<<set _continentNationality = setup.nationalityPoolSelector[$continent].random()>>
+		<<set $args[1].slaveName =
+			generateName(_continentNationality, $args[1].race, $args[1].genes === "XY", sn => !_currentSlaveNames.includes(sn))>>
 	<</for>>
 <</if>>
-<<for _namePool.length <= 0 && _maxTries > 0>>
-	<<set _namePool = Object.values(setup.namePoolSelector).random().filter(sn => !_currentSlaveNames.includes(sn))>>
-	<<set _maxTries -= 1>>
-<</for>>
-<<if _namePool.length <= 0>>
-	<<set _namePool = Object.values(setup.namePoolSelector).random()>>
+<<if !$args[1].slaveName>>
+	/* give up, duplicate name is fine I guess */
+	<<set $args[1].slaveName =
+		generateName($args[0].nationality, $args[1].race, $args[1].genes === "XY")>>
 <</if>>
-<<set $args[1].slaveName = _namePool.random()>>
-<<unset _currentSlaveNames, _namePool, _maxTries, _continentNationality>>
+<<unset _currentSlaveNames, _maxTries, _continentNationality>>
 <</widget>>
 
 <<widget "NewChildName">>
-/* thanks surname setting, for making me do this */
-<<set $args[0].birthName =
-	(setup.namePoolSelector[$args[0].nationality + "." + $args[0].race]
-		|| setup.namePoolSelector[$args[0].nationality]
-		|| setup.whiteAmericanSlaveNames).random()>>
-<<set $args[0].slaveName = $args[0].birthName>>
+<<set $args[0].birthName = generateName($args[0].nationality, $args[0].race, $args[0].genes === "XY")>>
+<<if $args[0].genes === "XY" && !$allowMaleSlaveNames && isMaleName($args[0].birthName, $args[0].nationality, $args[0].race)>>
+	/* grab a female name for the slave name instead */
+	<<set $args[0].slaveName = generateName($args[0].nationality, $args[0].race, false)>>
+<<else>>
+	<<set $args[0].slaveName = $args[0].birthName>>
+<</if>>
 <</widget>>
 
 <<widget "AgePCEffects">>