diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js
index 9152432f7a56b4c6c6dffeef8341251354f1901d..9fbb4aba84cf732e360960f1afee7421d6c61d50 100644
--- a/js/003-data/slaveSummaryData.js
+++ b/js/003-data/slaveSummaryData.js
@@ -1,32 +1,39 @@
+// these ratings tables are consumed by App.UI.SlaveSummaryImpl.helpers. getNumericRating()
+// this function takes a value for rating and iterates a table (in the declaration order)
+// until it finds a key greater or equal to the value; the found record is returned from the function
+// Briefly, each dictionary entry key -> value is read as "the highest rating that still suits -> value" or
+// "up to, including"
+// The idea behind this is too decrease number of comparisons and retain compatibility with simple dictionaries
+// without sparse keys
 App.Data.SlaveSummary = {
 	long: {
 		body: {
 			age: {
-				0: "Underage.",
+				17: "Underage.",
 				18: "Eighteen.",
 				19: "Nineteen.",
-				20: "Early twenties.",
-				25: "Late twenties.",
-				30: "Early thirties.",
-				35: "Late thirties.",
-				40: "Forties."
+				24: "Early twenties.",
+				29: "Late twenties.",
+				34: "Early thirties.",
+				39: "Late thirties.",
+				999: "Forties."
 			},
 			face: { // face value + 100
-				0: {desc: "Very ugly", style: "red"},
-				5: {desc: "Ugly", style: "red"},
-				60: {desc: "Unattractive", style: "red"},
-				90: {desc: "Average"},
-				111: {desc: "Attractive", style: "pink"},
-				141: {desc: "Beautiful", style: "pink"},
-				196: {desc: "Very beautiful", style: "pink"},
+				4: {desc: "Very ugly", style: "red"},
+				59: {desc: "Ugly", style: "red"},
+				89: {desc: "Unattractive", style: "red"},
+				110: {desc: "Average"},
+				140: {desc: "Attractive", style: "pink"},
+				195: {desc: "Beautiful", style: "pink"},
+				200: {desc: "Very beautiful", style: "pink"},
 			},
 			lips: {
-				0: {desc: "Thin lips", style: "red"},
-				11: {desc: "Normal lips"},
-				21: {desc: "Pretty lips"},
-				41: {desc: "Big lips"},
-				71: {desc: "Huge lips"},
-				96: {desc: "Facepussy"}
+				10: {desc: "Thin lips", style: "red"},
+				20: {desc: "Normal lips"},
+				40: {desc: "Pretty lips"},
+				70: {desc: "Big lips"},
+				95: {desc: "Huge lips"},
+				100: {desc: "Facepussy"}
 			},
 			teeth: {
 				"crooked": {desc: "Crooked teeth.", style: "yellow"},
@@ -39,16 +46,157 @@ App.Data.SlaveSummary = {
 				"mixed": {desc: "Mixed teeth."}
 			},
 			waist: { // waist value + 100
-				0: {desc: "Absurdly narrow waist", style: "pink"},
-				5: {desc: "Hourglass waist", style: "pink"},
-				60: {desc: "Feminine waist", style: "pink"},
-				90: {desc: "Average waist"},
-				111: {desc: "Unattractive waist", style: "red"},
-				141: {desc: "Ugly waist", style: "red"},
-				195: {desc: "Masculine waist", style: "red"}
+				4: {desc: "Absurdly narrow waist", style: "pink"},
+				60: {desc: "Hourglass waist", style: "pink"},
+				89: {desc: "Feminine waist", style: "pink"},
+				110: {desc: "Average waist"},
+				140: {desc: "Unattractive waist", style: "red"},
+				195: {desc: "Ugly waist", style: "red"},
+				200: {desc: "Masculine waist", style: "red"}
+			},
+			genitalia:{
+				dickBalls: { // indices [dick, balls]
+					3: {
+						3: null,
+						4: "Big balls.",
+						5: "Huge balls.",
+						8:  "Monstrous balls.",
+						99:  "Hyper balls."
+					},
+					4: {
+						3:  "Big dick.",
+						99:  "Big dick & balls."
+					},
+					5: {
+						4:  "Huge dick.",
+						99:  "Huge dick & balls."
+					},
+					8: {
+						5:  "Monster dong.",
+						99:  "Monster dick & balls."
+					},
+					99: {
+						8:  "Hyper dong.",
+						99:  "Hyper dick & balls."
+					}
+				},
+				holes: { // indices [vagina, anus]
+					2: {
+						2: null,
+						3: "Gaping anus.",
+						4: "Permagaped anus."
+					},
+					3: {
+						2: "Loose pussy.",
+						3: "High mileage."
+					},
+					4: {
+						3: "Cavernous pussy.",
+						4: "Blown out holes."
+					}
+				}
+			},
+			titsAss: { // indices: [boobs, butt, FSAssetExpansionist(0,1), weight+100, muscles+100]
+				499: {
+					2: {
+						2: { // FSAssetExpansionist doesn't matter
+							109: {
+								130: {desc: "Girlish figure.", style: "pink"},
+							},
+						},
+					}
+				},
+				799: {
+					4: null,
+					6: {desc: "Big ass.", style: "pink"},
+					8: {desc: "Huge ass.", style: "pink"},
+					9: {desc: "Titanic ass.", style: "pink"},
+					999: {desc: "Hyper ass.", style: "pink"},
+				},
+				1999: {
+					4: {desc: "Big tits.", style: "pink"},
+					999: {desc: "Big T&A.", style: "pink"}
+				},
+				3999: {
+					6: {desc: "Huge tits.", style: "pink"},
+					999: {desc: "Huge T&A.", style: "pink"}
+				},
+				11999: {
+					8:{desc: "Monstrous tits.", style: "pink"},
+					999: {desc: "Enormous T&A.", style: "pink"},
+				},
+				100000: {
+					9: {desc: "Immobilizing tits.", style: "pink"},
+					999: {desc:	"Hyper T&A.", style: "pink"}
+				}
+			},
+			weight: { // indices: [weigh + 100, FSHedonisticDecadence (0,1), hips + 2, ]
+				4: {desc: "Emaciated", style: "red"},
+				69: {
+					2: { // FSHedonisticDecadence doesn't matter
+						0: {desc: "Model-thin"},
+						5: {desc: "Very thin", style: "red"}
+					}
+				},
+				89: {desc: "Thin"},
+				110: {desc: "Trim"},
+				130: {desc: "Plush"},
+				195: {
+					0: {desc: "Overweight", style: "red"},
+					1: {
+						3: {desc: "Overweight", style: "red"},
+						5: {desc: "Nicely chubby"}
+					}
+				},
+				230: {
+					0: {desc: "Fat", style: "red"},
+					1: {
+						4: {desc: "Fat", style: "red"},
+						5: {desc: "Pleasantly soft and shapely"}
+					}
+				},
+				260: {
+					0: {desc: "Obese", style: "red"},
+					1: {desc: "Amazingly voluptuous"}
+				},
+				290: {
+					0: {desc: "Super Obese", style: "red"},
+					1: {desc: "SSBBW"}
+				},
+				999: {
+					0: {desc: "Dangerously Obese", style: "red"},
+					1: {desc: "Perfectly massive"}
+				}
 			}
 		},
 		mental: {
+			devotion: { // devotion value + 100
+				4: {desc: "Very hateful", style: ["devotion", "hateful"]},
+				49: {desc: "Hateful", style: ["devotion", "hateful"]},
+				79: {desc: "Resistant", style: ["devotion", "resistant"]},
+				120: {desc: "Ambivalent", style: ["devotion", "ambivalent"]},
+				150: {desc: "Accepting", style: ["devotion", "accept"]},
+				195: {desc: "Devoted", style: ["devotion", "devoted"]},
+				200: {desc: "Worshipful", style: ["devotion", "worship"]}
+			},
+			trust: { // first key: trust + 100, second key: devotion + 100
+				4: {desc: "Extremely terrified", style: ["trust", "extremely-terrified"]},
+				49: {desc: "Terrified", style: ["trust", "terrified"]},
+				79: {desc: "Frightened", style: ["trust", "frightened"]},
+				120: {desc: "Fearful", style: ["trust", "fearful"]},
+				150: {
+					79: {desc: "Careful", style: ["defiant", "careful"]},
+					200: {desc: "Careful", style: ["trust", "careful"]},
+				},
+				195: {
+					79: {desc: "Bold", style: ["defiant", "bold"]},
+					200: {desc: "Trusting", style: ["trust", "trusting"]},
+				},
+				200: {
+					79: {desc: "Defiant", style: ["defiant", "full"]},
+					200: {desc: "Profoundly trusting", style: ["trust", "prof-trusting"]},
+				}
+			},
 			behavioralFlaw: {
 				"arrogant": "Arrogant.",
 				"bitchy": "Bitchy.",
@@ -246,6 +394,17 @@ App.Data.SlaveSummary = {
 			"cleansing": "Cleansing.",
 			"fertility": "Fertility.",
 		},
+		specialDiet: { // index: dietCum + 3 * dietMilk
+			0: null,
+			1: "Cum Added.",
+			2: "Cum Based.",
+			3: "Milk Based.",
+			4: "Milk & Cum Added.",
+			5: "Cum Based with Milk.",
+			6: "Milk Added.",
+			7: "Milk Based with Cum.",
+			8: "Cum and Milk Based."
+		},
 		race: {
 			"white": "Caucasian",
 			"asian": "Asian",
@@ -260,40 +419,42 @@ App.Data.SlaveSummary = {
 			"southern european": "Southern European",
 			"mixed race": "Mixed race",
 		},
-		hormoneBalance: { // rating is hormoneBalance value + 400
-			0: "Overwhelmingly masculine",
-			100: "Extremely masculine",
-			200: "Heavily masculine",
-			300: "Very masculine",
-			379: "Masculine",
-			420: "Neutral",
-			499: "Feminine",
-			599: "Very feminine",
-			699: "Heavily feminine",
-			799: "Extremely feminine",
-			900: "Overwhelmingly feminine"
+		hormoneBalance: { // rating is hormoneBalance value + 500
+			100: "Overwhelmingly masculine",
+			200: "Extremely masculine",
+			300: "Heavily masculine",
+			400: "Very masculine",
+			479: "Masculine",
+			520: "Neutral",
+			599: "Feminine",
+			699: "Very feminine",
+			799: "Heavily feminine",
+			899: "Extremely feminine",
+			1000: "Overwhelmingly feminine"
 		},
 		health: {
 			illness: {
-				0: {desc: "Sick", style: "yellow"},
+				0: null,
+				1: {desc: "Sick", style: "yellow"},
 				2: {desc: "Ill", style: ["red", "strong"]},
 				3: {desc: "Very ill", style: ["red", "strong"]},
-				4: {desc: "Terribly ill", style: ["red", "strong"]}
+				4: {desc: "Terribly ill", style: ["red", "strong"]},
+				5: {desc: "Dangerously ill", style: ["red", "strong"]}
 			},
 			tiredness: {
-				0: {desc: "Energetic", style: "green"},
-				31: {desc: "Tired", style: "yellow"},
-				61: {desc: "Fatigued", style: "orange"},
-				91: {desc: "Exhausted", style: ["red", "strong"]}
+				30: {desc: "Energetic", style: "green"},
+				60: {desc: "Tired", style: "yellow"},
+				90: {desc: "Fatigued", style: "orange"},
+				100: {desc: "Exhausted", style: ["red", "strong"]}
 			},
 			health: { // health + 100
-				0: {desc: "On the edge of death", style: ["red", "strong"]},
-				10: {desc: "Extremely unhealthy", style: ["red", "strong"]},
-				50: {desc: "Unhealthy", style: ["red", "strong"]},
-				80: {desc: "healthy", style: "yellow"},
-				121: {desc: "Very healthy", style: "green"},
-				151: {desc: "Extremely healthy", style: "green"},
-				191: {desc: "Unnaturally healthy", style: "green"}
+				10: {desc: "On the edge of death", style: ["red", "strong"]},
+				49: {desc: "Extremely unhealthy", style: ["red", "strong"]},
+				79: {desc: "Unhealthy", style: ["red", "strong"]},
+				120: {desc: "healthy", style: "yellow"},
+				150: {desc: "Very healthy", style: "green"},
+				190: {desc: "Extremely healthy", style: "green"},
+				200: {desc: "Unnaturally healthy", style: "green"}
 			},
 		},
 		prestige: {
@@ -303,6 +464,7 @@ App.Data.SlaveSummary = {
 			3: {desc: "Extremely prestigious.", style: "green"},
 		},
 		accent: {
+			0: null,
 			1: {desc: "Cute accent.", style: "pink"},
 			2: {desc: "Accent."},
 			3: {desc: "Bad accent.", style: "red"},
@@ -314,28 +476,28 @@ App.Data.SlaveSummary = {
 			age: {
 				18: "18",
 				19: "19",
-				20: "Ea20s",
-				25: "Lt20s",
-				30: "Ea30s",
-				35: "Lt30s",
-				40: "40s"
+				24: "Ea20s",
+				29: "Lt20s",
+				34: "Ea30s",
+				39: "Lt30s",
+				999: "40s"
 			},
 			face: { // face value + 100
-				0: {desc: "Face---", style: "red"},
-				5: {desc: "Face--", style: "red"},
-				60: {desc: "Face-", style: "red"},
-				90: {desc: "Face"},
-				111: {desc: "Face+", style: "pink"},
-				141: {desc: "Face++", style: "pink"},
-				196: {desc: "Face+++", style: "pink"},
+				4: {desc: "Face---", style: "red"},
+				59: {desc: "Face--", style: "red"},
+				89: {desc: "Face-", style: "red"},
+				110: {desc: "Face"},
+				140: {desc: "Face+", style: "pink"},
+				195: {desc: "Face++", style: "pink"},
+				200: {desc: "Face+++", style: "pink"},
 			},
 			lips: {
-				0: {desc: "Lips-", style: "red"},
-				11: {desc: "Lips"},
-				21: {desc: "Lips+"},
-				41: {desc: "Lips++"},
-				71: {desc: "Lips+++"},
-				96: {desc: "Facepussy"}
+				10: {desc: "Lips-", style: "red"},
+				20: {desc: "Lips"},
+				40: {desc: "Lips+"},
+				70: {desc: "Lips++"},
+				95: {desc: "Lips+++"},
+				100: {desc: "Facepussy"}
 			},
 			teeth: {
 				"crooked": {desc: "Cr Teeth", style: "yellow"},
@@ -348,16 +510,157 @@ App.Data.SlaveSummary = {
 				"mixed": {desc: "Mixed"}
 			},
 			waist: { // waist value + 100
-				0: {desc: "Wst+++", style: "pink"},
-				5: {desc: "Wst++", style: "pink"},
-				60: {desc: "Wst+", style: "pink"},
-				90: {desc: "Wst"},
-				111: {desc: "Wst-", style: "red"},
-				141: {desc: "Wst--", style: "red"},
-				195: {desc: "Wst---", style: "red"}
+				4: {desc: "Wst+++", style: "pink"},
+				60: {desc: "Wst++", style: "pink"},
+				89: {desc: "Wst+", style: "pink"},
+				110: {desc: "Wst"},
+				140: {desc: "Wst-", style: "red"},
+				195: {desc: "Wst--", style: "red"},
+				200: {desc: "Wst---", style: "red"}
+			},
+			genitalia:{
+				dickBalls: { // indices [dick, balls]
+					3: {
+						3: null,
+						4: "Balls",
+						5: "Balls+",
+						8: "Balls++",
+						99: "Balls+++"
+					},
+					4: {
+						3: "Dick",
+						99: "Junk"
+					},
+					5: {
+						4: "Dick+",
+						99: "Junk+"
+					},
+					8: {
+						5: "Dick++",
+						99: "Junk++"
+					},
+					99: {
+						8: "Dick+++",
+						99: "Junk+++"
+					}
+				},
+				holes: { // indices [vagina, anus]
+					2: {
+						2: null,
+						3: "A+",
+						4: "A++"
+					},
+					3: {
+						2: "V+",
+						3: "V+A+"
+					},
+					4: {
+						3: "V++",
+						4: "V++A++"
+					}
+				}
+			},
+			titsAss: { // indices: [boobs, butt, FSAssetExpansionist(0,1), weight+100, muscles+100]
+				499: {
+					2: {
+						2: { // FSAssetExpansionist doesn't matter
+							109: {
+								130: {desc: "Girlish", style: "pink"},
+							},
+						},
+					}
+				},
+				799: {
+					4: null,
+					6: {desc: "Ass", style: "pink"},
+					8: {desc: "Ass+", style: "pink"},
+					9: {desc: "Ass++", style: "pink"},
+					999: {desc: "Ass+++", style: "pink"},
+				},
+				1999: {
+					4: {desc: "Boobs", style: "pink"},
+					999: {desc: "T&A", style: "pink"}
+				},
+				3999: {
+					6: {desc: "Boobs+", style: "pink"},
+					999: {desc: "T&A+", style: "pink"}
+				},
+				11999: {
+					8:{desc: "Boobs++", style: "pink"},
+					999: {desc: "T&A++", style: "pink"},
+				},
+				100000: {
+					9: {desc: "Boobs+++", style: "pink"},
+					999: {desc:	"T&A+++", style: "pink"}
+				}
+			},
+			weight: { // indices: [weigh + 100, FSHedonisticDecadence (0,1), hips + 2, ]
+				4: {desc: "W---", style: ["red", "strong"]},
+				69: {
+					99: { // FSHedonisticDecadence doesn't matter
+						0: {desc: "W--", style: "strong"},
+						5: {desc: "W--", style: ["red", "strong"]}
+					}
+				},
+				89: {desc: "W-", style: "strong"},
+				110: {desc: "W", style: "strong"},
+				130: {desc: "W+", style: "strong"},
+				195: {
+					0: {desc: "W++", style: ["red", "strong"]},
+					1: {
+						3: {desc: "W++", style: ["red", "strong"]},
+						5: {desc: "W++", style: "strong"}
+					}
+				},
+				230: {
+					0: {desc: "W+++", style: ["red", "strong"]},
+					1: {
+						4: {desc: "W+++", style: ["red", "strong"]},
+						5: {desc: "W+++", style: "strong"}
+					}
+				},
+				260: {
+					0: {desc: "W++++", style: ["red", "strong"]},
+					1: {desc: "W++++", style: "strong"}
+				},
+				290: {
+					0: {desc: "W+++++", style: ["red", "strong"]},
+					1: {desc: "W+++++", style: "strong"}
+				},
+				999: {
+					0: {desc: "W++++++", style: ["red", "strong"]},
+					1: {desc: "W++++++", style: "strong"}
+				}
 			}
 		},
 		mental: {
+			devotion: { // devotion value + 100
+				4: {desc: "VHate", style: ["devotion", "hateful"]},
+				49: {desc: "Hate", style: ["devotion", "hateful"]},
+				79: {desc: "Res", style: ["devotion", "resistant"]},
+				120: {desc: "Ambiv", style: ["devotion", "ambivalent"]},
+				150: {desc: "Accept", style: ["devotion", "accept"]},
+				195: {desc: "Devo", style: ["devotion", "devoted"]},
+				200: {desc: "Wor", style: ["devotion", "worship"]}
+			},
+			trust: { // first key: trust + 100, second key: devotion + 100
+				4: {desc: "ETerr", style: ["trust", "extremely-terrified"]},
+				49: {desc: "Terr", style: ["trust", "terrified"]},
+				79: {desc: "Fright", style: ["trust", "frightened"]},
+				120: {desc: "Fear", style: ["trust", "fearful"]},
+				150: {
+					79: {desc: "Caref", style: ["defiant", "careful"]},
+					200: {desc: "Caref", style: ["trust", "careful"]},
+				},
+				195: {
+					79: {desc: "Bold", style: ["defiant", "bold"]},
+					200: {desc: "Trust", style: ["trust", "trusting"]},
+				},
+				200: {
+					79: {desc: "Defiant", style: ["defiant", "full"]},
+					200: {desc: "VTrust", style: ["trust", "prof-trusting"]},
+				}
+			},
 			behavioralFlaw: {
 				"arrogant": "Arrog",
 				"bitchy": "Bitchy",
@@ -414,10 +717,10 @@ App.Data.SlaveSummary = {
 		},
 		health: {
 			tiredness: {
-				0: {desc: "Ene", style: "green"},
-				31: {desc: "Tir", style: "yellow"},
-				61: {desc: "Tir+", style: "orange"},
-				91: {desc: "Exh", style: ["red", "strong"]}
+				30: {desc: "Ene", style: "green"},
+				60: {desc: "Tir", style: "yellow"},
+				90: {desc: "Tir+", style: "orange"},
+				100: {desc: "Exh", style: ["red", "strong"]}
 			}
 		},
 		accent: {
@@ -440,6 +743,17 @@ App.Data.SlaveSummary = {
 			"fertility": "Di:F+",
 
 		},
+		specialDiet: { // index: dietCum + 3 * dietMilk
+			0: null,
+			1: "Cum+",
+			2: "Cum++",
+			3: "Milk+",
+			4: "Cum+ Milk+",
+			5: "Cum++ Milk+",
+			6: "Milk++",
+			7: "Cum+ Milk++",
+			8: "Cum++ Milk++"
+		},
 		drugs: {
 			"breast injections": "Boobs+",
 			"intensive breast injections": "Boobs++",
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index f5bfc39e7419e5c2cdfb5744d1b9a88aa41d3a0b..2602a0f59fef5816c1d06f7e479d20ae4bc0b329 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -102,14 +102,25 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {*|null}
 		 */
 		function getNumericRating(ratings, value) {
-			let p;
-			for (p in ratings) {
-				// @ts-ignore
-				if (p >= value) {
-					return ratings[p];
+			for (const key in ratings) {
+				if (parseInt(key) >= value) {
+					return ratings[key];
 				}
 			}
-			return ratings[p];
+			return null;
+		}
+
+		/**
+		 * @param {object} ratings
+		 * @param {number[]} values
+		 * @returns {*|null}
+		 */
+		function getMultiNumericRating(ratings, values) {
+			const firstRating = getNumericRating(ratings, values[0]);
+			if (firstRating === null || typeof firstRating === "string" || firstRating.hasOwnProperty("desc")) {
+				return firstRating;
+			}
+			return getMultiNumericRating(firstRating, values.slice(1));
 		}
 
 		/**
@@ -129,7 +140,21 @@ App.UI.SlaveSummaryImpl = function() {
 		function makeRatedStyledSpan(container, ratings, value, offset = 0, stdDecor = false) {
 			/** @type {StyledDesc} */
 			const d = getNumericRating(ratings, value + offset);
-			makeSpan(container, d.desc, d.style, stdDecor, value);
+			if (d) {
+				makeSpan(container, d.desc, d.style, stdDecor, value);
+			}
+		}
+
+		/**
+		 * @param {Node} container
+		 * @param {StyledDesc} styledDesc
+		 * @param {number} [value]
+		 * @param {boolean} [stdDecor]
+		 */
+		function makeStyledSpan(container, styledDesc, value, stdDecor = false) {
+			if (styledDesc) {
+				makeSpan(container, styledDesc.desc, styledDesc.style, stdDecor, value);
+			}
 		}
 
 		/**
@@ -137,7 +162,7 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @param {StyledRatings} ratings
 		 * @param {string|number} value
 		 */
-		function makeStyledSpan(container, ratings, value) {
+		function makeMappedStyledSpan(container, ratings, value) {
 			const d = ratings[value];
 			if (d) {
 				makeSpan(container, d.desc, d.style);
@@ -166,6 +191,10 @@ App.UI.SlaveSummaryImpl = function() {
 			return s.charAt(0).toUpperCase() + s.charAt(1) + s.charAt(2);
 		}
 
+		function FSPolicyFlag(name) {
+			return V.arcologies[0][`FS${name}`] === "unset" ? 0 : 1;
+		}
+
 		return {
 			addText: addText,
 			makeSpan: makeSpan,
@@ -173,10 +202,13 @@ App.UI.SlaveSummaryImpl = function() {
 			makeParagraph: makeParagraph,
 			getExactRating: getExactRating,
 			getNumericRating: getNumericRating,
-			makeRatedStyledSpan: makeRatedStyledSpan,
+			getMultiNumericRating: getMultiNumericRating,
 			makeStyledSpan: makeStyledSpan,
+			makeRatedStyledSpan: makeRatedStyledSpan,
+			makeMappedStyledSpan: makeMappedStyledSpan,
 			makeMappedSpan: makeMappedSpan,
-			firstThreeUc: firstThreeUc
+			firstThreeUc: firstThreeUc,
+			FSPolicyFlag: FSPolicyFlag
 		};
 	}();
 
@@ -354,7 +386,7 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function long_teeth(slave, c) {
-			helpers.makeStyledSpan(c, data.long.body.teeth, slave.teeth);
+			helpers.makeMappedStyledSpan(c, data.long.body.teeth, slave.teeth);
 		}
 
 		/**
@@ -399,7 +431,7 @@ App.UI.SlaveSummaryImpl = function() {
 			if (slave.voice === 0) {
 				makeSpan(c, "Mute.", "red");
 			} else {
-				helpers.makeStyledSpan(c, data.long.accent, slave.accent);
+				helpers.makeMappedStyledSpan(c, data.long.accent, slave.accent);
 			}
 		}
 
@@ -409,34 +441,10 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function long_tits_ass(slave, c) {
-			const styles = "pink";
-			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-				makeSpan(c, "Hyper T&A.", styles);
-			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-				makeSpan(c, "Enormous T&A.", styles);
-			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-				makeSpan(c, "Huge T&A.", styles);
-			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-				makeSpan(c, "Big T&A.", styles);
-			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-				makeSpan(c, "Girlish figure.", styles);
-			} else if (slave.boobs >= 12000) {
-				makeSpan(c, "Immobilizing tits.", styles);
-			} else if (slave.boobs > 4000) {
-				makeSpan(c, "Monstrous tits.", styles);
-			} else if (slave.boobs > 2000) {
-				makeSpan(c, "Huge tits.", styles);
-			} else if (slave.boobs > 800) {
-				makeSpan(c, "Big tits.", styles);
-			} else if (slave.butt > 9) {
-				makeSpan(c, "Hyper ass.", styles);
-			} else if (slave.butt > 8) {
-				makeSpan(c, "Titanic ass.", styles);
-			} else if (slave.butt > 6) {
-				makeSpan(c, "Huge ass.", styles);
-			} else if (slave.butt > 4) {
-				makeSpan(c, "Big ass.", styles);
-			}
+			const h = helpers;
+			h.makeStyledSpan(c,
+				h.getMultiNumericRating(data.long.body.titsAss,
+					[slave.boobs, slave.butt, h.FSPolicyFlag("AssetExpansionist"), slave.weight + 100, slave.muscles + 100]));
 		}
 
 		/**
@@ -608,7 +616,7 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function short_teeth(slave, c) {
-			helpers.makeStyledSpan(c, data.short.body.teeth, slave.teeth);
+			helpers.makeMappedStyledSpan(c, data.short.body.teeth, slave.teeth);
 		}
 
 		/**
@@ -653,7 +661,7 @@ App.UI.SlaveSummaryImpl = function() {
 			if (slave.voice === 0) {
 				makeSpan(c, "Mute", "red");
 			} else {
-				helpers.makeStyledSpan(c, data.short.accent, slave.accent);
+				helpers.makeMappedStyledSpan(c, data.short.accent, slave.accent);
 			}
 		}
 
@@ -663,34 +671,10 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function short_tits_ass(slave, c) {
-			let styles = "pink";
-			if ((slave.boobs >= 12000) && (slave.butt > 9)) {
-				makeSpan(c, "T&A+++", styles);
-			} else if ((slave.boobs > 4000) && (slave.butt > 8)) {
-				makeSpan(c, "T&A++", styles);
-			} else if ((slave.boobs > 2000) && (slave.butt > 6)) {
-				makeSpan(c, "T&A+", styles);
-			} else if ((slave.boobs > 800) && (slave.butt > 4)) {
-				makeSpan(c, "T&A", styles);
-			} else if ((slave.boobs < 500) && (slave.butt < 3) && (slave.weight <= 10) && (slave.muscles <= 30)) {
-				makeSpan(c, "Girlish", styles);
-			} else if (slave.boobs >= 12000) {
-				makeSpan(c, "Boobs+++", styles);
-			} else if (slave.boobs > 4000) {
-				makeSpan(c, "Boobs++", styles);
-			} else if (slave.boobs > 2000) {
-				makeSpan(c, "Boobs+", styles);
-			} else if (slave.boobs > 800) {
-				makeSpan(c, "Boobs", styles);
-			} else if (slave.butt > 9) {
-				makeSpan(c, "Ass+++", styles);
-			} else if (slave.butt > 8) {
-				makeSpan(c, "Ass++", styles);
-			} else if (slave.butt > 6) {
-				makeSpan(c, "Ass+", styles);
-			} else if (slave.butt > 4) {
-				makeSpan(c, "Ass", styles);
-			}
+			const h = helpers;
+			h.makeStyledSpan(c,
+				h.getMultiNumericRating(data.short.body.titsAss,
+					[slave.boobs, slave.butt, h.FSPolicyFlag("AssetExpansionist"), slave.weight + 100, slave.muscles + 100]));
 		}
 
 		/**
@@ -1526,7 +1510,7 @@ App.UI.SlaveSummaryImpl = function() {
 		 * @returns {void}
 		 */
 		function short_sex_flaw(slave, c) {
-			helpers.makeStyledSpan(c, data.short.mental.sexualFlaw, slave.sexualFlaw);
+			helpers.makeMappedStyledSpan(c, data.short.mental.sexualFlaw, slave.sexualFlaw);
 		}
 
 		/**
diff --git a/src/js/slaveSummaryWidgets.js b/src/js/slaveSummaryWidgets.js
index 77f9659a3b9cfef4c1406699e00aac00c466ac20..567cbff12cbf566eab50a4fb7d241a4fc85d9c52 100644
--- a/src/js/slaveSummaryWidgets.js
+++ b/src/js/slaveSummaryWidgets.js
@@ -13,49 +13,10 @@ App.UI.SlaveSummaryRenderers = function() {
 			const makeSpan = helpers.makeSpan;
 			if (slave.fetish === "mindbroken") {
 				makeSpan(c, "MB", "mindbroken");
-			} else if (slave.devotion < -95) {
-				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-			} else if (slave.devotion < -50) {
-				makeSpan(c, "Hate", ["devotion", "hateful"], true, slave.devotion);
-			} else if (slave.devotion < -20) {
-				makeSpan(c, "Res", ["devotion", "resistant"], true, slave.devotion);
-			} else if (slave.devotion <= 20) {
-				makeSpan(c, "Ambiv", ["devotion", "ambivalent"], true, slave.devotion);
-			} else if (slave.devotion <= 50) {
-				makeSpan(c, "Accept", ["devotion", "accept"], true, slave.devotion);
-			} else if (slave.devotion <= 95) {
-				makeSpan(c, "Devo", ["devotion", "devoted"], true, slave.devotion);
 			} else {
-				makeSpan(c, "Wor", ["devotion", "worship"], true, slave.devotion);
-			}
-			if (slave.fetish === "mindbroken") {
-				return;
-			} else if (slave.trust < -95) {
-				makeSpan(c, "ETerr", ["trust", "extremely-terrified"], true, slave.trust);
-			} else if (slave.trust < -50) {
-				makeSpan(c, "Terr", ["trust", "terrified"], true, slave.trust);
-			} else if (slave.trust < -20) {
-				makeSpan(c, "Fright", ["trust", "frightened"], true, slave.trust);
-			} else if (slave.trust <= 20) {
-				makeSpan(c, "Fear", ["trust", "fearful"], true, slave.trust);
-			} else if (slave.trust <= 50) {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Caref", ["defiant", "careful"], true, slave.trust);
-				} else {
-					makeSpan(c, "Caref", ["trust", "careful"], true, slave.trust);
-				}
-			} else if (slave.trust < 95) {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-				} else {
-					makeSpan(c, "Trust", ["trust", "trusting"], true, slave.trust);
-				}
-			} else {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-				} else {
-					makeSpan(c, "VTrust", ["trust", "prof-trusting"], true, slave.trust);
-				}
+				helpers.makeRatedStyledSpan(c, data.short.mental.devotion, slave.devotion, 100, true);
+				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(data.short.mental.trust, [slave.trust + 100, slave.devotion + 100]),
+					slave.trust, true);
 			}
 		},
 
@@ -155,52 +116,8 @@ App.UI.SlaveSummaryRenderers = function() {
 		 * @returns {void}
 		 */
 		weight: function(slave, c) {
-			const makeSpan = helpers.makeSpan;
-			if (slave.weight < -95) {
-				makeSpan(c, "W---", ["red", "strong"], true, slave.weight);
-			} else if (slave.weight < -30) {
-				if (slave.hips < -1) {
-					makeSpan(c, "W--", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W--", ["red", "strong>"], true, slave.weight);
-				}
-			} else if (slave.weight < -10) {
-				makeSpan(c, "W-", "strong", true, slave.weight);
-			} else if (slave.weight <= 10) {
-				makeSpan(c, "W", "strong", true, slave.weight);
-			} else if (slave.weight <= 30) {
-				makeSpan(c, "W+", "strong", true, slave.weight);
-			} else if (slave.weight <= 95) {
-				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "W++", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W++", ["red", "strong"], true, slave.weight);
-				}
-			} else if (slave.weight <= 130) {
-				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "W+++", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W+++", ["red", "strong"], true, slave.weight);
-				}
-			} else if (slave.weight <= 160) {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "W++++", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W++++", ["red", "strong"], true, slave.weight);
-				}
-			} else if (slave.weight <= 190) {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "W+++++", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W+++++", ["red", "strong"], true, slave.weight);
-				}
-			} else {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "W++++++", "strong", true, slave.weight);
-				} else {
-					makeSpan(c, "W++++++", ["red", "strong"], true, slave.weight);
-				}
-			}
+			helpers.makeStyledSpan(c, helpers.getMultiNumericRating(data.short.body.weight,
+				[slave.weight + 100, helpers.FSPolicyFlag("HedonisticDecadence"), slave.hips + 2]), slave.weight, true);
 		},
 
 		/**
@@ -211,37 +128,13 @@ App.UI.SlaveSummaryRenderers = function() {
 		genitalia: function(slave, c) {
 			const makeSpan = helpers.makeSpan;
 			if (slave.dick > 0) {
-				let dickDesc = "";
-				if (slave.balls === 0) {
-					dickDesc += `Geld`;
+				let dickDesc = slave.balls === 0 ? "Geld" : "";
+				const dickBallsDesc = helpers.getMultiNumericRating(data.short.body.genitalia.dickBalls, [slave.dick, slave.balls]);
+				if (dickBallsDesc) {
+					dickDesc += ` ${dickBallsDesc}`;
 				}
-				if ((slave.dick > 8) && (slave.balls > 8)) {
-					dickDesc += `Junk+++`;
-				} else if ((slave.dick > 5) && (slave.balls > 5)) {
-					dickDesc += `Junk++`;
-				} else if ((slave.dick > 4) && (slave.balls > 4)) {
-					dickDesc += `Junk+`;
-				} else if ((slave.dick > 3) && (slave.balls > 3)) {
-					dickDesc += `Junk`;
-				} else if (slave.dick > 8) {
-					dickDesc += `Dick+++`;
-				} else if (slave.dick > 5) {
-					dickDesc += `Dick++`;
-				} else if (slave.dick > 4) {
-					dickDesc += `Dick+`;
-				} else if (slave.dick > 3) {
-					dickDesc += `Dick`;
-				} else if (slave.balls > 10) {
-					dickDesc += `Balls+++`;
-				} else if (slave.balls > 5) {
-					dickDesc += `Balls++`;
-				} else if (slave.balls > 4) {
-					dickDesc += `Balls+`;
-				} else if (slave.balls > 3) {
-					dickDesc += `Balls`;
-				}
-				if (dickDesc.length) {
-					makeSpan(c, dickDesc, "pink");
+				if (dickDesc) {
+					helpers.makeSpan(c, dickDesc, "pink");
 				}
 			}
 			if (slave.vagina === 0) {
@@ -252,21 +145,8 @@ App.UI.SlaveSummaryRenderers = function() {
 			if (slave.anus === 0) {
 				makeSpan(c, "AV", "lime");
 			}
-			let holesDesc = "";
-			if ((slave.vagina > 3) && (slave.anus > 3)) {
-				holesDesc += `V++A++`;
-			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-				holesDesc += `V+A+`;
-			} else if (slave.vagina > 3) {
-				holesDesc += `V++`;
-			} else if (slave.vagina > 2) {
-				holesDesc += `V+`;
-			} else if (slave.anus > 3) {
-				holesDesc += `A++`;
-			} else if (slave.anus > 2) {
-				holesDesc += `A+`;
-			}
-			if (holesDesc.length) {
+			const holesDesc = helpers.getMultiNumericRating(data.long.body.genitalia.holes, [slave.vagina, slave.anus]);
+			if (holesDesc) {
 				makeSpan(c, holesDesc, "pink");
 			}
 		},
@@ -277,27 +157,9 @@ App.UI.SlaveSummaryRenderers = function() {
 		 * @returns {void}
 		 */
 		diet: function(slave, c) {
-			const makeSpan = helpers.makeSpan;
-			const dietStr = data.short.diet[slave.diet];
-			if (dietStr) {
-				makeSpan(c, dietStr, ["teal", "strong"]);
-			}
-
-			let specialDiet = makeSpan(null, "", ["cyan", "strong"]);
-			if (slave.dietCum === 2) {
-				specialDiet.textContent = "Cum++";
-			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-				specialDiet.textContent = "Cum+";
-			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-				specialDiet.textContent = "Cum+ Milk+";
-			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-				specialDiet.textContent = "Milk+";
-			} else if ((slave.dietMilk === 2)) {
-				specialDiet.textContent = ">Milk++";
-			}
-			if (specialDiet.textContent.length > 0) {
-				c.appendChild(specialDiet);
-			}
+			const style = ["teal", "strong"];
+			helpers.makeMappedSpan(c, data.short.diet, slave.diet, style);
+			helpers.makeMappedSpan(c, data.short.specialDiet, slave.dietCum + 3 * slave.dietMilk, style);
 		},
 
 		/**
@@ -537,49 +399,10 @@ App.UI.SlaveSummaryRenderers = function() {
 			const makeSpan = helpers.makeSpan;
 			if (slave.fetish === "mindbroken") {
 				makeSpan(c, "Mindbroken.", "mindbroken");
-			} else if (slave.devotion < -95) {
-				makeSpan(c, "Very hateful", ["devotion", "hateful"], true, slave.devotion);
-			} else if (slave.devotion < -50) {
-				makeSpan(c, "Hateful", ["devotion", "hateful"], true, slave.devotion);
-			} else if (slave.devotion < -20) {
-				makeSpan(c, "Resistant", ["devotion", "resistant"], true, slave.devotion);
-			} else if (slave.devotion <= 20) {
-				makeSpan(c, "Ambivalent", ["devotion", "ambivalent"], true, slave.devotion);
-			} else if (slave.devotion <= 50) {
-				makeSpan(c, "Accepting", ["devotion", "accept"], true, slave.devotion);
-			} else if (slave.devotion <= 95) {
-				makeSpan(c, "Devoted", ["devotion", "devoted"], true, slave.devotion);
-			} else {
-				makeSpan(c, "Worshipful", ["devotion", "worship"], true, slave.devotion);
-			}
-			if (slave.fetish === "mindbroken") {
-				return;
-			} else if (slave.trust < -95) {
-				makeSpan(c, "Extremely terrified", ["trust", "extremely-terrified"], true, slave.trust);
-			} else if (slave.trust < -50) {
-				makeSpan(c, "Terrified", ["trust", "terrified"], true, slave.trust);
-			} else if (slave.trust < -20) {
-				makeSpan(c, "Frightened", ["trust", "frightened"], true, slave.trust);
-			} else if (slave.trust <= 20) {
-				makeSpan(c, "Fearful", ["trust", "fearful"], true, slave.trust);
-			} else if (slave.trust <= 50) {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Careful", ["defiant", "careful"], true, slave.trust);
-				} else {
-					makeSpan(c, "Careful", ["trust", "careful"], true, slave.trust);
-				}
-			} else if (slave.trust <= 95) {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Bold", ["defiant", "bold"], true, slave.trust);
-				} else {
-					makeSpan(c, "Trusting", ["trust", "trusting"], true, slave.trust);
-				}
 			} else {
-				if (slave.devotion < -20) {
-					makeSpan(c, "Defiant", ["defiant", "full"], true, slave.trust);
-				} else {
-					makeSpan(c, "Profoundly trusting", ["trust", "prof-trusting"], true, slave.trust);
-				}
+				helpers.makeRatedStyledSpan(c, data.long.mental.devotion, slave.devotion, 100, true);
+				helpers.makeStyledSpan(c, helpers.getMultiNumericRating(data.long.mental.trust, [slave.trust + 100, slave.devotion + 100]),
+					slave.trust, true);
 			}
 		},
 		/**
@@ -600,52 +423,8 @@ App.UI.SlaveSummaryRenderers = function() {
 		 * @returns {void}
 		 */
 		weight: function(slave, c) {
-			const makeSpan = helpers.makeSpan;
-			if (slave.weight < -95) {
-				makeSpan(c, "Emaciated", "red", true, slave.weight);
-			} else if (slave.weight < -30) {
-				if (slave.hips < -1) {
-					makeSpan(c, "Model-thin", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Very thin", "red", true, slave.weight);
-				}
-			} else if (slave.weight < -10) {
-				makeSpan(c, "Thin", null, true, slave.weight);
-			} else if (slave.weight <= 10) {
-				makeSpan(c, "Trim", null, true, slave.weight);
-			} else if (slave.weight <= 30) {
-				makeSpan(c, "Plush", null, true, slave.weight);
-			} else if (slave.weight <= 95) {
-				if (slave.hips > 1 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "Nicely chubby", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Overweight", "red", true, slave.weight);
-				}
-			} else if (slave.weight <= 130) {
-				if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "Pleasantly soft and shapely", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Fat", "red", true, slave.weight);
-				}
-			} else if (slave.weight <= 160) {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "Amazingly voluptuous", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Obese", "red", true, slave.weight);
-				}
-			} else if (slave.weight <= 190) {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "SSBBW", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Super Obese", "red", true, slave.weight);
-				}
-			} else {
-				if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
-					makeSpan(c, "Perfectly massive", null, true, slave.weight);
-				} else {
-					makeSpan(c, "Dangerously Obese", "red", true, slave.weight);
-				}
-			}
+			helpers.makeStyledSpan(c, helpers.getMultiNumericRating(data.long.body.weight,
+				[slave.weight + 100, helpers.FSPolicyFlag("HedonisticDecadence"), slave.hips + 2]), slave.weight, true);
 		},
 
 		/**
@@ -672,36 +451,12 @@ App.UI.SlaveSummaryRenderers = function() {
 		 */
 		genitalia: function(slave, c) {
 			if (slave.dick > 0) {
-				let dickDesc = "";
-				if (slave.balls === 0) {
-					dickDesc += 'Gelded.';
-				}
-				if ((slave.dick > 8) && (slave.balls > 8)) {
-					dickDesc += `Hyper dick & balls.`;
-				} else if ((slave.dick > 5) && (slave.balls > 5)) {
-					dickDesc += `Monster dick & balls.`;
-				} else if ((slave.dick > 4) && (slave.balls > 4)) {
-					dickDesc = `Huge dick & balls.`;
-				} else if ((slave.dick > 3) && (slave.balls > 3)) {
-					dickDesc = `Big dick & balls.`;
-				} else if (slave.dick > 8) {
-					dickDesc = `Hyper dong.`;
-				} else if (slave.dick > 5) {
-					dickDesc = `Monster dong.`;
-				} else if (slave.dick > 4) {
-					dickDesc = `Huge dick.`;
-				} else if (slave.dick > 3) {
-					dickDesc = `Big dick.`;
-				} else if (slave.balls > 8) {
-					dickDesc = `Hyper balls.`;
-				} else if (slave.balls > 5) {
-					dickDesc = `Monstrous balls.`;
-				} else if (slave.balls > 4) {
-					dickDesc = `Huge balls.`;
-				} else if (slave.balls > 3) {
-					dickDesc = `Big balls.`;
+				let dickDesc = slave.balls === 0 ? "Gelded." : "";
+				const dickBallsDesc = helpers.getMultiNumericRating(data.long.body.genitalia.dickBalls, [slave.dick, slave.balls]);
+				if (dickBallsDesc) {
+					dickDesc += ` ${dickBallsDesc}`;
 				}
-				if (dickDesc.length) {
+				if (dickDesc) {
 					helpers.makeSpan(c, dickDesc, "pink");
 				}
 			}
@@ -713,21 +468,8 @@ App.UI.SlaveSummaryRenderers = function() {
 			if (slave.anus === 0) {
 				helpers.makeSpan(c, "Anal virgin.", "lime");
 			}
-			let holesDesc = "";
-			if ((slave.vagina > 3) && (slave.anus > 3)) {
-				holesDesc += `Blown out holes.`;
-			} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-				holesDesc += `High mileage.`;
-			} else if (slave.vagina > 3) {
-				holesDesc += `Cavernous pussy.`;
-			} else if (slave.vagina > 2) {
-				holesDesc += `Loose pussy.`;
-			} else if (slave.anus > 3) {
-				holesDesc += `Permagaped anus.`;
-			} else if (slave.anus > 2) {
-				holesDesc += `Gaping anus.`;
-			}
-			if (holesDesc.length) {
+			const holesDesc = helpers.getMultiNumericRating(data.long.body.genitalia.holes, [slave.vagina, slave.anus]);
+			if (holesDesc) {
 				helpers.makeSpan(c, holesDesc, "pink");
 			}
 		},
@@ -738,26 +480,11 @@ App.UI.SlaveSummaryRenderers = function() {
 		 * @returns {void}
 		 */
 		diet: function(slave, c) {
-			const dietDesc = data.long.diet[slave.diet];
-			if (dietDesc) {
-				helpers.makeSpan(c, dietDesc, "teal");
-			}
-
-			function specialDiet(text) {
+			helpers.makeMappedSpan(c, data.long.diet, slave.diet, "teal");
+			const sd = data.long.specialDiet[slave.dietCum + 3 * slave.dietMilk];
+			if (sd) {
 				helpers.addText(c, "Diet base: ");
-				helpers.makeSpan(c, text, "cyan");
-			}
-
-			if (slave.dietCum === 2) {
-				specialDiet("Cum Based.");
-			} else if (((slave.dietCum === 1) && (slave.dietMilk === 0))) {
-				specialDiet("Cum Added.");
-			} else if (((slave.dietCum === 1) && (slave.dietMilk === 1))) {
-				specialDiet("Milk & Cum Added.");
-			} else if (((slave.dietCum === 0) && (slave.dietMilk === 1))) {
-				specialDiet("Milk Added.");
-			} else if ((slave.dietMilk === 2)) {
-				specialDiet("Milk Based.");
+				helpers.makeSpan(c, sd, "cyan");
 			}
 		},
 
@@ -907,7 +634,7 @@ App.UI.SlaveSummaryRenderers = function() {
 		 */
 		hormoneBalance: function(slave, c) {
 			const colorClass = slave.hormoneBalance <= -21 ? "deepskyblue" : "pink";
-			const desc = helpers.getNumericRating(data.long.hormoneBalance, slave.hormoneBalance + 400);
+			const desc = helpers.getNumericRating(data.long.hormoneBalance, slave.hormoneBalance + 500);
 			helpers.makeSpan(c, desc + " hormone balance.", colorClass);
 		},