diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js
index 11531fc0a6a909da393ef2ab394205e9743a20c2..6cc977e2afeb08aa4280f101774c8210e0699fc8 100644
--- a/src/js/SlaveState.js
+++ b/src/js/SlaveState.js
@@ -1930,13 +1930,13 @@ App.Entity.SlaveState = class SlaveState {
 		/** Has the slave gone through female puberty.
 		 *
 		 * 0: no; 1: yes */
-		this.pubertyXX = undefined;
+		this.pubertyXX = 0;
 		/** Target .physicalAge for male puberty to occur. */
 		this.pubertyAgeXY = 13;
 		/** Has the slave gone through male puberty.
 		 *
 		 * 0: no; 1: yes */
-		this.pubertyXY = undefined;
+		this.pubertyXY = 0;
 		/**
 		 * not fully implemented.
 		 * * 0: no scars
diff --git a/src/js/generateNewSlaveJS.js b/src/js/generateNewSlaveJS.js
index f4dee9f0c0ae93aca3a1c856b740bf3b3d9db091..e6c91b9967380cd0f2242293e36bca44deb9c8b6 100644
--- a/src/js/generateNewSlaveJS.js
+++ b/src/js/generateNewSlaveJS.js
@@ -57,6 +57,7 @@ window.GenerateNewSlave = (function(){
 	}
 
 	function postGenCleanup() {
+		generatePuberty(slave);
 		generateBoobTweaks(); /* split this up for female vs. male? */
 		generateSkills();
 		generateDisabilities();
@@ -69,7 +70,6 @@ window.GenerateNewSlave = (function(){
 
 	function GenerateXXSlave() {
 		slave.ovaries = 1;
-		slave.pubertyXY = 0;
 		slave.energy = jsRandom(1,85);
 
 		generateXXGeneticQuirks();
@@ -84,14 +84,12 @@ window.GenerateNewSlave = (function(){
 		generateXXTeeth();
 		generateXXMods();
 		generateXXBodyHair();
-		generateXXPuberty();
 	}
 
 	function GenerateXYSlave() {
 		slave.genes = "XY";
 		slave.hLength = 10;
 		slave.prostate = 1;
-		slave.pubertyXX = 0;
 		slave.energy = jsRandom(15,90);
 
 		generateXYGeneticQuirks();
@@ -107,7 +105,6 @@ window.GenerateNewSlave = (function(){
 		generateXYTeeth();
 		generateXYMods();
 		generateXYBodyHair();
-		generateXYPuberty();
 	}
 
 	function generateXXBodyProportions() {
@@ -1050,26 +1047,6 @@ window.GenerateNewSlave = (function(){
 		slave.eyebrowFullness = jsEither(["bushy", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "pencil-thin", "tapered", "tapered", "tapered", "thick", "thick", "thin", "thin", "threaded", "threaded", "threaded"]);
 	}
 
-	function generateXXPuberty() {
-		if (slave.physicalAge >= slave.pubertyAgeXX) {
-			slave.pubertyXX = 1;
-		} else {
-			slave.pubertyXX = 0;
-		}
-	}
-
-	function generateXYPuberty() {
-		if (slave.balls > 0) {
-			if (slave.physicalAge >= slave.pubertyAgeXY) {
-				slave.pubertyXY = 1;
-			} else {
-				slave.pubertyXY = 0;
-			}
-		} else {
-			slave.pubertyXY = 0;
-		}
-	}
-
 	function generateXXGeneticQuirks() {
 		chance = jsRandom(1,1000);
 		if (chance >= 980) {
diff --git a/src/js/heroCreator.js b/src/js/heroCreator.js
index 62194ac9182c3397b08e6dbdbba72a9106fbaa93..95f8d0ca54d067122cbbc1819603701b11f4fcc1 100644
--- a/src/js/heroCreator.js
+++ b/src/js/heroCreator.js
@@ -3,5 +3,6 @@ window.getHeroSlave = function (heroSlave, baseHeroSlave) {
 	for (var attrname in heroSlave) {
 		newSlave[attrname] = heroSlave[attrname];
 	}
+	generatePuberty(newSlave);
 	return newSlave;
 };
diff --git a/src/js/slaveGenerationJS.js b/src/js/slaveGenerationJS.js
index 6cbbe9b08178d4777ba52f9111495289936368d6..8a9f5c913f1546bc366c3901703c7feb5ac42092 100644
--- a/src/js/slaveGenerationJS.js
+++ b/src/js/slaveGenerationJS.js
@@ -1417,3 +1417,16 @@ window.generatePronouns = /** @param {App.Entity.SlaveState} slave*/ function ge
 		slave.noun = "girl";
 	}
 };
+
+window.generatePuberty = function(slave) {
+	if ((slave.ovaries === 1 || slave.mpreg === 1) && slave.physicalAge >= slave.pubertyAgeXX) {
+		slave.pubertyXX = 1;
+	} else {
+		slave.pubertyXX = 0;
+	}
+	if (slave.balls > 0 && slave.ballType !== "sterile" && slave.physicalAge >= slave.pubertyAgeXY) {
+		slave.pubertyXY = 1;
+	} else {
+		slave.pubertyXY = 0;
+	}
+};