diff --git a/src/js/utilJS.tw b/src/js/utilJS.tw
index 399048bb9bd12040a9cf8f5bc533a7cda9932a77..234b0a2206192ca2c8069e18defc6b5b8b4454bb 100644
--- a/src/js/utilJS.tw
+++ b/src/js/utilJS.tw
@@ -1,5 +1,159 @@
 :: UtilJS [script]
 
+/*
+ * Height.mean(nationality, race, genes, age) - returns the mean height for the given combination and age in years (>=2)
+ * Height.mean(nationality, race, genes) - returns the mean adult height for the given combination
+ * Height.mean(slave) - returns the mean (expected) height for the given slave
+ * Height.random(nationality, race, genes, age) - returns a random height for the given combination,
+ *     with Gaussian distribution (mean = 1, standard deviation = 0.05) around the mean height
+ * Height.random(nationality, race, genes) - returns a random height for the given combination of an adult, as above
+ * Height.random(slave) - returns a random height for the given slave, as above
+ * Height.forAge(height, age, genes) - returns the height adapted to the age and genes
+ * Height.forAge(height, slave) - returns the height adapted to the slave's age and genes
+ */
+window.Height = (function(){
+	const xxMeanHeight = {
+		"American.white": 165, "American.black": 163.6, "American.latina": 158.9, "American.asian": 158.4, "American": 161.8,
+		"Afghan": undefined, "Algerian": 162, "Argentinian": 159.6, "Armenian": undefined, "Australian": 161.8, "Austrian": 166,
+		"Bangladeshi": undefined, "Belarusian": 166.8, "Belgian": 168.1, "Bolivian": 142.2, "Brazilian": 158.8,
+		"British": 161.9, "Burmese": undefined, "Canadian": 162.3, "Chilean": 157.2, "Chinese": 155.8, "Colombian": 158.7,
+		"Congolese": 157.7, "Cuban": 156, "Czech": 167.22, "Danish": 168.7, "Dominican": 156.4, "Dutch": 169, "Egyptian": 158.9,
+		"Emirati": 158.9, "Estonian": 165.5, "Ethiopian": undefined, "Filipina": undefined, "Finnish": 165.3, "French": 162.5,
+		"German": 162.8, "Ghanan": 158.5, "Greek": 165, "Guatemalan": undefined, "Haitian": undefined, "Hungarian": 164,
+		"Icelandic": 168, "Indian": 151.9, "Indonesian": 147, "Iranian": 157.2, "Iraqi": 155.8, "Irish": 163, "Israeli": 166,
+		"Italian": 162.5, "Jamaican": 160.8, "Japanese": 158, "Jordanian": undefined, "Kazakh": 159.8, "Kenyan": undefined,
+		"Korean": 156.15, "Lebanese": 165, "Libyan": 160.5, "Lithuanian": 167.5, "Malaysian": 154.7, "Malian": 160.4,
+		"Mexican": 154, "Moroccan": 158.5, "Nepalese": 150.8, "Nigerian": 163.8, "Norwegian": 157.8, "Omani": undefined,
+		"Pakistani": 151.9, "Peruvian": 151, "Polish": 165.1, "Portuguese": 165.1, "Puerto Rican": 158.9, "Romanian": 157,
+		"Russian": 164.1, "Saudi": 156.3, "Scottish": 163, "Serbian": 166.8, "Slovak": 165.6, "South African": 159,
+		"Spanish": 162.6, "Sudanese": undefined, "Swedish": 166.8, "Swiss": 162.5, "Tanzanian": undefined, "Thai": 159,
+		"Tunisian": 160, "Turkish": 161.9, "Ugandan": undefined, "Ukrainian": 164.8, "Uzbek": 159.9, "Venezuelan": 159,
+		"Vietnamese": 155.2, "Yemeni": undefined, "a New Zealander": 164, "Zimbabwean": undefined, 
+		"": 162.5 // default
+	};
+	const xyMeanHeight = {
+		"American.white": 178.2, "American.black": 177.4, "American.latina": 172.5, "American.asian": 172.5, "American": 176.4, 
+		"Afghan": undefined, "Algerian": 172.2, "Argentinian": 174.46, "Armenian": undefined, "Australian": 175.6,
+		"Austrian": 179, "Bangladeshi": undefined, "Belarusian": 176.9, "Belgian": 178.7, "Bolivian": 160, "Brazilian": 170.7,
+		"British": 175.3, "Burmese": undefined, "Canadian": 175.1, "Chilean": 169.6, "Chinese": 167.1, "Colombian": 170.6,
+		"Congolese": 158.9, "Cuban": 168, "Czech": 180.31, "Danish": 180.4, "Dominican": 168.4, "Dutch": 181, "Egyptian": 170.3,
+		"Emirati": 170.3, "Estonian": 179.1, "Ethiopian": undefined, "Filipina": undefined, "Finnish": 178.9, "French": 175.6,
+		"German": 175.4, "Ghanan": 169.5, "Greek": 177, "Guatemalan": undefined, "Haitian": undefined, "Hungarian": 176,
+		"Icelandic": 181, "Indian": 164.7, "Indonesian": 158, "Iranian": 170.3, "Iraqi": 165.4, "Irish": 177, "Israeli": 177,
+		"Italian": 176.5, "Jamaican": 171.8, "Japanese": 172, "Jordanian": undefined, "Kazakh": 169, "Kenyan": undefined,
+		"Korean": 168.15, "Lebanese": 176, "Libyan": 171.3, "Lithuanian": 177.2, "Malaysian": 166.3, "Malian": 171.3,
+		"Mexican": 167, "Moroccan": 172.7, "Nepalese": 163, "Nigerian": 163.8, "Norwegian": 179.63, "Omani": undefined,
+		"Pakistani": 164.7, "Peruvian": 164, "Polish": 178.7, "Portuguese": 173.9, "Puerto Rican": 172.5, "Romanian": 172,
+		"Russian": 177.2, "Saudi": 168.9, "Scottish": 177.6, "Serbian": 182, "Slovak": 179.4, "South African": 168,
+		"Spanish": 173.1, "Sudanese": undefined, "Swedish": 181.5, "Swiss": 178.2, "Tanzanian": undefined, "Thai": 170.3,
+		"Tunisian": 172.3, "Turkish": 173.6, "Ugandan": undefined, "Ukrainian": 176.5, "Uzbek": 175.4, "Venezuelan": 169,
+		"Vietnamese": 165.7, "Yemeni": undefined, "a New Zealander": 177, "Zimbabwean": undefined,
+		".white": 177.6, "": 172.5 // defaults
+	};
+	
+	// Helper method - table lookup for nationality/race combinations
+	const nationalityMeanHeight = function(table, nationality, race, def) {
+		return table[nationality + "." + race] || table[nationality] || table["." + race] || table[""] || def;
+	};
+	
+	// Helper method - Gaussian distributed random variable, constrained to +/-max, using Box-Muller transform
+	const constrainedGaussian = function(max) {
+	    var u = 1 - Math.random(); // Subtraction to flip [0, 1) to (0, 1].
+		var v = 1 - Math.random();
+		return Math.clamp(Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v), -max, max);
+	};
+	
+	// Helper method - apply age and genes to the adult height
+	const applyAge = function(height, age, genes) {
+		if(!_.isFinite(age) || age < 2 || age >= 20) {
+			return height;
+		}
+		let minHeight = 0, midHeight = 0, midAge = 15;
+		switch(genes) {
+			case 'XX': // female
+			case 'XXX': // Triple X syndrome female
+				minHeight = 85; midHeight = height * 157 / 164; midAge = 13;
+				break;
+			case 'XY': // male
+			case 'XXY': // Kinefelter syndrome male
+			case 'XYY': // XYY syndrome male
+				minHeight = 86; midHeight = height * 170 / 178; midAge = 15;
+				break;
+			case 'X0': case 'X': // Turner syndrome female
+				minHeight = 85 * 0.93; midHeight = height * 157 / 164; midAge = 13;
+				break;
+			default:
+				minHeight = 85.5, midHeight = height * 327 / 342, midAge = 14;
+				break;
+		}
+		if(age > midAge) {
+			// end of puberty to 20
+			return interpolate(midAge, midHeight, 20, height, age);
+		} else {
+			// 2 to end of puberty
+			return interpolate(2, minHeight, midAge, midHeight, age);
+		}
+	};
+	
+	const _meanHeight = function(nationality, race, genes, age) {
+		if(_.isObject(nationality)) {
+			// We got called with a single slave as the argument
+			return _meanHeight(nationality.nationality, nationality.race, nationality.genes, nationality.physicalAge + nationality.birthWeek / 52.0);
+		}
+		let result = 0;
+		switch(genes) {
+			case 'XX': // female
+				result = nationalityMeanHeight(xxMeanHeight, nationality, race);
+				break;
+			case 'XY': // male
+				result = nationalityMeanHeight(xyMeanHeight, nationality, race);
+				break;
+			// special cases. Extra SHOX genes on X and Y chromosomes make for larger people
+			case 'X0': case 'X': // Turner syndrome female
+				result = nationalityMeanHeight(xxMeanHeight, nationality, race) * 0.93;
+				break;
+			case 'XXX': // Triple X syndrome female
+				result = nationalityMeanHeight(xxMeanHeight, nationality, race) * 1.03;
+				break;
+			case 'XXY': // Kinefelter syndrome male
+				result = nationalityMeanHeight(xyMeanHeight, nationality, race) * 1.03;
+				break;
+			case 'XYY': // XYY syndrome male
+				result = nationalityMeanHeight(xyMeanHeight, nationality, race) * 1.04;
+				break;
+			case 'Y': case 'Y0': case 'YY': case 'YYY':
+				console.log("Height.mean(): non-viable genes " + genes);
+				break;
+			default:
+				console.log("Height.mean(): unknown genes " + genes + ", returning mean between XX and XY");
+				result = nationalityMeanHeight(xxMeanHeight, nationality, race) * 0.5
+					+ nationalityMeanHeight(xyMeanHeight, nationality, race) * 0.5;
+				break;
+		}
+		return applyAge(result, age, genes);
+	};
+	
+	const _randomHeight = function(nationality, race, genes, age) {
+		const mean = _meanHeight(nationality, race, genes, age);
+		return mean * (1 + constrainedGaussian(3) * 0.05);
+	};
+	
+	const _forAge = function(height, age, genes) {
+		if(_.isObject(age)) {
+			// We got called with a slave as a second argument
+			return applyAge(height, age.physicalAge + age.birthWeek / 52.0, age.genes);
+		} else {
+			return applyAge(height, age, genes);
+		}
+	};
+	
+	return {
+		mean: _meanHeight,
+		random: _randomHeight,
+		forAge: _forAge,
+	};
+})();
+
 if(!Array.prototype.findIndex) {
 	Array.prototype.findIndex = function(predicate) {
 		if (this == null) {
diff --git a/src/uncategorized/generateXXSlave.tw b/src/uncategorized/generateXXSlave.tw
index 5e53eca05bf3ed48c7c8c296769d08d14cad6c5e..c025870da34988b8d0ffda6756db68de9567fd6c 100644
--- a/src/uncategorized/generateXXSlave.tw
+++ b/src/uncategorized/generateXXSlave.tw
@@ -143,22 +143,6 @@
 <<set $activeSlave.trust = random(-45,-25)>>
 
 /% Begin height replacement section. %/
-/% Vanilla settings yield an average height of 162.5 cm, which is not representative for the world as a whole. %/
-<<if random(1,2) == 1>>
-	<<set $activeSlave.height = random(150,170)>>
-<<else>>
-	<<set $activeSlave.height = random(140,190)>>
-<</if>>
-
-/% Set height-based effects before adjusting height for nationality. %/
-<<if $activeSlave.height >= 170>>
-	<<set $activeSlave.hips = either(-1, 0, 0, 1, 1, 2, 2)>>
-	<<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
-<<else>>
-	<<set $activeSlave.hips = either(-1, 0, 0, 0, 1, 1, 2)>>
-	<<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
-<</if>>
-
 /% Since we use nationality for height effects we need to initialize it now instead of later on like in vanilla Free Cities. %/
 <<if $fixedNationality == 0>>
 	<<set $activeSlave.nationality = $nationalities.random()>>
@@ -193,178 +177,15 @@
 <<NationalityToName $activeSlave>>
 <<NationalityToAccent $activeSlave>>
 
-<<set $seed = 162.5>>
-
-<<switch $activeSlave.nationality>>
-<<case "American">>
-	<<if $activeSlave.race is "white">>
-		<<set $seed = 165>>
-	<<elseif $activeSlave.race is "black">>
-		<<set $seed = 163.6>>
-	<<elseif $activeSlave.race is "latina">>
-		<<set $seed = 158.9>>
-	<<elseif $activeSlave.race is "asian">>
-		<<set $seed = 158.4>>
-	<<else>>
-		<<set $seed = 161.8>>
-	<</if>>
-<<case "Afghan">>
-<<case "Argentinian">>
-	<<set $seed = 159.6>>
-<<case "Armenian">>
-<<case "Australian">>
-	<<set $seed = 161.8>>
-<<case "Austrian">>
-	<<set $seed = 166>>
-<<case "Belarusian">>
-	<<set $seed = 166.8>>
-<<case "Belgian">>
-<<case "Bolivian">>
-	<<set $seed = 142.2>>
-<<case "Brazilian">>
-	<<set $seed = 158.8>>
-<<case "British">>
-	<<set $seed = 161.9>>
-<<case "Canadian">>
-	<<set $seed = 162.3>>
-<<case "Chilean">>
-	<<set $seed = 157.2>>
-<<case "Chinese">>
-	<<set $seed = 155.8>>
-<<case "Colombian">>
-	<<set $seed = 158.7>>
-<<case "Congolese">>
-	<<set $seed = 157.7>>
-<<case "Cuban">>
-	<<set $seed = 156>>
-<<case "Czech">>
-	<<set $seed = 167.22>>
-<<case "Danish">>
-	<<set $seed = 168.7>>
-<<case "Dominican">>
-	<<set $seed = 156.4>>
-<<case "Dutch">>
-	<<set $seed = 169>>
-<<case "Emirati">>
-	<<set $seed = 156.4>>
-<<case "Egyptian">>
-	<<set $seed = 158.9>>
-<<case "Estonian">>
-<<case "Ethiopian">>
-<<case "Finnish">>
-	<<set $seed = 165.3>>
-<<case "French">>
-	<<set $seed = 162.5>>
-<<case "German">>
-	<<set $seed = 162.8>>
-<<case "Ghanan">>
-	<<set $seed = 158.5>>
-<<case "Greek">>
-	<<set $seed = 165>>
-<<case "Guatemalan">>
-<<case "Haitian">>
-<<case "Hungarian">>
-	<<set $seed = 176>>
-<<case "Icelandic">>
-<<case "Indian">>
-	<<set $seed = 151.9>>
-<<case "Indonesian">>
-<<case "Iranian">>
-	<<set $seed = 157.2>>
-<<case "Iraqi">>
-	<<set $seed = 155.8>>
-<<case "Irish">>
-	<<set $seed = 163>>
-<<case "Israeli">>
-	<<set $seed = 166>>
-<<case "Italian">>
-<<case "Jamaican">>
-	<<set $seed = 160.8>>
-<<case "Japanese">>
-	<<set $seed = 158>>
-<<case "Jordanian">>
-<<case "Kazakh">>
-<<case "Kenyan">>
-<<case "Korean">>
-	<<if either(1,2,3) == 3>>
-		<<set $seed = 154.9>>
-	<<else>>
-		<<set $seed = 157.4>>
-	<</if>>
-<<case "Lebanese">>
-<<case "Libyan">>
-<<case "Lithuanian">>
-	<<set $seed = 167.5>>
-<<case "Malaysian">>
-	<<set $seed = 154.7>>
-<<case "Malian">>
-	<<set $seed = 160.4>>
-<<case "Mexican">>
-	<<set $seed = 154>>
-<<case "Moroccan">>
-<<case "Nepalese">>
-<<case "Nigerian">>
-	<<set $seed = 163.8>>
-<<case "Norwegian">>
-	<<set $seed = 157.8>>
-<<case "Omani">>
-<<case "Pakistani">>
-	/% Default to India's figures. %/
-	<<set $seed = 151.9>>
-<<case "Peruvian">>
-	<<set $seed = 151>>
-<<case "Polish">>
-	<<set $seed = 165.1>>
-<<case "Portuguese">>
-	<<set $seed = 165.1>>
-<<case "Puerto Rican">>
-	/% Use average for U.S. Hispanics. %/
-	<<set $seed = 158.9>>
-<<case "Romanian">>
-	<<set $seed = 157>>
-<<case "Russian">>
-	<<set $seed = 164.1>>
-<<case "Saudi">>
-	<<set $seed = 156.3>>
-<<case "Scottish">>
-	<<set $seed = 163>>
-<<case "Serbian">>
-	<<set $seed = 166.8>>
-<<case "Slovak">>
-	<<set $seed = 165.6>>
-<<case "Spanish">>
-	<<set $seed = 162.6>>
-<<case "Sudanese">>
-<<case "Swedish">>
-	<<set $seed = 166.8>>
-<<case "Swiss">>
-<<case "Tanzanian">>
-<<case "Thai">>
-<<case "Tunisian">>
-<<case "Turkish">>
-	<<set $seed = 161.9>>
-<<case "Ugandan">>
-<<case "Ukrainian">>
-<<case "Uzbek">>
-<<case "Venezuelan">>
-<<case "Vietnamese">>
-	<<set $seed = 155.2>>
-<<case "Yemeni">>
-<<case "a New Zealander">>
-	<<set $seed = 164>>
-<<case "Zimbabwean">>
-<<default>>
-<</switch>>
+<<set $activeSlave.height = Math.round(Height.random($activeSlave))>>
 
-/% Include adjustment factor for age. %/
-<<if $activeSlave.physicalAge <= 13>>
-  <<set $seed = interpolate(2,85,13,$seed * 157/164.0,$activeSlave.physicalAge)>>
-<<elseif $activeSlave.physicalAge < 20>>
-  <<set $seed = interpolate(13,$seed * 157/164.0,20,$seed,$activeSlave.physicalAge)>>
+<<if $activeSlave.height >= Height.mean($activeSlave) * 170/162.5>>
+	<<set $activeSlave.hips = either(-1, 0, 0, 1, 1, 2, 2)>>
+	<<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
+<<else>>
+	<<set $activeSlave.hips = either(-1, 0, 0, 0, 1, 1, 2)>>
+	<<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
 <</if>>
-
-/% Adjust height and convert from decimal number to integer. %/
-<<set $activeSlave.height = Math.round($activeSlave.height * $seed / 162.5)>>
 /% End height replacement section. %/
 
 <<set $activeSlave.weight = random(-100,180)>>
diff --git a/src/uncategorized/generateXYSlave.tw b/src/uncategorized/generateXYSlave.tw
index 2ef07c6b03e459a56aca3ff723bad7b82956e429..ab47c17ede047fb44deb863044434e71f76837d9 100644
--- a/src/uncategorized/generateXYSlave.tw
+++ b/src/uncategorized/generateXYSlave.tw
@@ -129,32 +129,6 @@
 <<set $activeSlave.trust = random(-45,-25)>>
 
 /% Begin height replacement section. %/
-/% Vanilla settings yield an average height of 172.5 cm, which is not representative for the world as a whole. %/
-<<if random(1,2) == 1>>
-	<<set $activeSlave.height = random(160,180)>>
-<<else>>
-	<<set $activeSlave.height = random(150,200)>>
-<</if>>
-
-/% Set height-based effects before adjusting height for nationality. %/
-<<if $activeSlave.physicalAge <= 13>>
-	<<if $activeSlave.height > 170>>
-	  <<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
-	  <<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
-	<<else>>
-	  <<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
-	  <<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
-	<</if>>
-<<else>>
-	<<if $activeSlave.height >= 170>>
-		<<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
-		<<set $activeSlave.shoulders = either(-1, 0, 1, 1, 2, 2)>>
-	<<else>>
-		<<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
-		<<set $activeSlave.shoulders = either(-1, 0, 0, 1, 1, 2)>>
-	<</if>>
-<</if>>
-
 <<if ($activeSlave.physicalAge > random(0,100))>>
 	<<set $activeSlave.eyes = -1>>
 	<<if random(0,100) > 90>>
@@ -197,181 +171,24 @@
 <<NationalityToName $activeSlave>>
 <<NationalityToAccent $activeSlave>>
 
-<<set $seed = 172.5>>
-<<if $activeSlave.race == "white">>
-	<<set $seed = 177.6>>/% White people use European average if no country-specific figure available. %/
-<</if>>
-
-<<switch $activeSlave.nationality>>
-<<case "American">>
-	<<if $activeSlave.race == "white">>
-		<<set $seed = 178.2>>
-	<<elseif $activeSlave.race == "black">>
-		<<set $seed = 177.4>>
-	<<elseif ($activeSlave.race == "latina") or ($activeSlave.race == "asian")>>
-		/% Averages are 172.4 and 172.3 which are close enough to default. %/
+<<set $activeSlave.height = Math.round(Height.random($activeSlave))>>
+<<if $activeSlave.physicalAge <= 13>>
+	<<if $activeSlave.height > Height.mean($activeSlave) * 170/172.5>>
+	  <<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
+	  <<set $activeSlave.shoulders = either(-1, -1, 0, 0, 0, 1)>>
 	<<else>>
-		<<set $seed = 176.4>>
+	  <<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
+	  <<set $activeSlave.shoulders = either(-2, -1, -1, 0, 0, 1)>>
 	<</if>>
-<<case "Afghan">>
-<<case "Argentinian">>
-	<<set $seed = 174.46>>
-<<case "Armenian">>
-<<case "Australian">>
-	<<set $seed = 175.6>>
-<<case "Austrian">>
-	<<set $seed = 179>>
-<<case "Belarusian">>
-	<<set $seed = 176.9>>
-<<case "Belgian">>
-	<<set $seed = 178.7>>
-<<case "Bolivian">>
-	<<set $seed = 160.0>>
-<<case "Brazilian">>
-	<<set $seed = 170.7>>
-<<case "British">>
-	<<set $seed = 175.3>>
-<<case "Canadian">>
-	<<set $seed = 175.1>>
-<<case "Chilean">>
-	<<set $seed = 169.6>>
-<<case "Chinese">>
-	<<set $seed = 167.1>>
-<<case "Colombian">>
-  <<set $seed = 170.6>>
-<<case "Congolese">>
-	<<set $seed = 158.9>>
-<<case "Cuban">>
-	<<set $seed = 168>>
-<<case "Czech">>
-	<<set $seed = 180.31>>
-<<case "Danish">>
-	<<set $seed = 180.4>>
-<<case "Dominican">>
-	<<set $seed = 168.4>>
-<<case "Dutch">>
-	<<set $seed = 181>>
-<<case "Emirati">>
-<<case "Egyptian">>
-	<<set $seed = 170.3>>
-<<case "Estonian">>
-	<<set $seed = 179.1>>
-<<case "Ethiopian">>
-<<case "Finnish">>
-	<<set $seed = 178.9>>
-<<case "French">>
-	<<set $seed = 175.6>>
-<<case "German">>
-	<<set $seed = 175.4>>
-<<case "Ghanan">>
-	<<set $seed = 169.5>>
-<<case "Greek">>
-	<<set $seed = 177>>
-<<case "Guatemalan">>
-<<case "Haitian">>
-<<case "Hungarian">>
-	<<set $seed = 176>>
-<<case "Icelandic">>
-<<case "Indian">>
-	<<set $seed = 164.7>>
-<<case "Indonesian">>
-<<case "Iranian">>
-	<<set $seed = 170.3>>
-<<case "Iraqi">>
-	<<set $seed = 165.4>>
-<<case "Irish">>
-  <<set $seed = 177>>
-<<case "Israeli">>
-	<<set $seed = 177>>
-<<case "Italian">>
-	<<set $seed = 176.5>>
-<<case "Jamaican">>
-	<<set $seed = 171.8>>
-<<case "Japanese">>
-	<<set $seed = 172>>
-<<case "Jordanian">>
-<<case "Kazakh">>
-<<case "Kenyan">>
-<<case "Korean">>
-	<<if either(1,2,3) == 3>>
-		<<set $seed = 165.6>>
+<<else>>
+	<<if $activeSlave.height >= Height.mean($activeSlave) * 170/172.5>>
+		<<set $activeSlave.hips = either(-2, -1, -1, 0, 1)>>
+		<<set $activeSlave.shoulders = either(-1, 0, 1, 1, 2, 2)>>
 	<<else>>
-		<<set $seed = 170.7>>
+		<<set $activeSlave.hips = either(-2, -2, -1, -1, 0)>>
+		<<set $activeSlave.shoulders = either(-1, 0, 0, 1, 1, 2)>>
 	<</if>>
-<<case "Lebanese">>
-<<case "Libyan">>
-<<case "Lithuanian">>
-	<<set $seed = 177.2>>
-<<case "Malaysian">>
-	<<set $seed = 166.3>>
-<<case "Malian">>
-	<<set $seed = 171.3>>
-<<case "Mexican">>
-	<<set $seed = 167>>
-<<case "Moroccan">>
-<<case "Nepalese">>
-<<case "Nigerian">>
-	<<set $seed = 163.8>>
-<<case "Norwegian">>
-	<<set $seed = 179.63>>
-<<case "Omani">>
-<<case "Pakistani">>
-	/% Default to India's figures. %/
-	<<set $seed = 164.7>>
-<<case "Peruvian">>
-	<<set $seed = 164>>
-<<case "Polish">>
-	<<set $seed = 178.7>>
-<<case "Portuguese">>
-	<<set $seed = 173.9>>
-<<case "Puerto Rican">>
-	/% Average for U.S. Hispanics == 172.4. No adjustment necessary. %/
-<<case "Romanian">>
-	<<set $seed = 172>>
-<<case "Russian">>
-	<<set $seed = 177.2>>
-<<case "Saudi">>
-	<<set $seed = 168.9>>
-<<case "Scottish">>
-	<<set $seed = 177.6>>
-<<case "Serbian">>
-	<<set $seed = 182>>
-<<case "Slovak">>
-	<<set $seed = 179.4>>
-<<case "Spanish">>
-	<<set $seed = 173.1>>
-<<case "Sudanese">>
-<<case "Swedish">>
-	<<set $seed = 181.5>>
-<<case "Swiss">>
-	<<set $seed = 178.2>>
-<<case "Tanzanian">>
-<<case "Thai">>
-<<case "Tunisian">>
-<<case "Turkish">>
-	<<set $seed = 173.6>>
-<<case "Ugandan">>
-<<case "Ukrainian">>
-<<case "Uzbek">>
-<<case "Venezuelan">>
-<<case "Vietnamese">>
-	<<set $seed = 165.7>>
-<<case "Yemeni">>
-<<case "a New Zealander">>
-	<<set $seed = 177>>
-<<case "Zimbabwean">>
-<<default>>
-<</switch>>
-
-/% Include adjustment factor for age. %/
-<<if $activeSlave.physicalAge <= 15>>
-  <<set $seed = interpolate(2,86,15,$seed * 170/178.0,$activeSlave.physicalAge)>>
-<<elseif $activeSlave.physicalAge < 20>>
-  <<set $seed = interpolate(15,$seed * 170.0/178.0,20,$seed,$activeSlave.physicalAge)>>
 <</if>>
-
-/% Adjust height and convert from decimal number to integer. %/
-<<set $activeSlave.height = Math.round($activeSlave.height * $seed / 172.5)>>
 /% End height replacement section. %/
 
 <<set $activeSlave.weight = random(-100, 180)>>