diff --git a/src/js/descriptionWidgets.js b/src/js/descriptionWidgets.js
index bf52c401b8bdcb44c7e0640d03008b79cd919f10..536ec4a5327ba0c1c866182c6a401400e7ef2c9e 100644
--- a/src/js/descriptionWidgets.js
+++ b/src/js/descriptionWidgets.js
@@ -1514,3 +1514,115 @@ App.Desc.longLimbs = function(slave) {
 
 	return r;
 };
+
+/**
+ * @param {App.Entity.SlaveState} slave
+ * @returns {string} long description of the slave's sexual history.
+ */
+App.Desc.sexualHistory = function(slave) {
+	const {He, he, his} = getPronouns(slave);
+	const weeksOwned = V.week - slave.weekAcquired;
+
+	let r = `${He} has been with you `;
+	if (slave.weekAcquired === 0) {
+		r += `since before you owned the arcology, `;
+	} else if (slave.weekAcquired === 1) {
+		r += `since you first took control of the arcology, `;
+	} else {
+		r += `${numberWithPluralOne(Math.max(weeksOwned, 1), "week")}, `;
+	}
+
+	const sexTypes = [ "mammary", "vaginal", "anal", "penetrative", "oral" ];
+	const totalSex = sexTypes.reduce((res, el) => res += slave.counter[el], 0);
+	if (totalSex > 0) {
+		r += `and has been fucked about ${num(totalSex)} times, including `;
+		const sexNames = {mammary: "mammary", vaginal: "vanilla", anal: "anal", penetrative: "penetrating", oral: "oral"};
+		r += sexTypes.filter((t) => slave.counter[t] > 0)
+					 .map((t) => `${num(slave.counter[t])} ${sexNames[t]}`)
+					 .reduce((res, ch, i, arr) => res + (i === arr.length - 1 ? ' and ' : ', ') + ch);
+		r += ` sexual encounters. `;
+	} else {
+		r += `and has had little or no sexual experience ${slave.weekAcquired > 0 ? "as your slave" : "in your new arcology"} yet. `;
+	}
+
+	if (weeksOwned > 0) {
+		const sexDescriptions = {
+			mammary: `${he}'s put his tits to work`,
+			vaginal: `${his} pussy has been fucked`,
+			anal: `${he}'s been buttfucked`,
+			penetrative: `${he}'s pounded a hole`,
+			oral: `${he}'s sucked something off`
+		};
+		const getSexTypeScaled = (t) => slave.counter[t] * ((t === "oral") ? 0.5 : 1.0);
+		const biggestSexType = sexTypes.reduce((res, el) => (getSexTypeScaled(el) > getSexTypeScaled(res)) ? el : res);
+		const frequency = (weeksOwned*112) / slave.counter[biggestSexType];
+		if (frequency < 4.5) {
+			r += `Remarkably, this means ${sexDescriptions[biggestSexType]} `;
+			if (frequency < 1) {
+				r += `more than once every hour `;
+			} else if (frequency < 1.5) {
+				r += `about once every hour `;
+			} else {
+				r += `about once every ${num(Math.round(frequency), true)} hours `;
+			}
+			r += `${he}'s spent awake. `;
+		}
+	}
+
+	if (slave.lactation > 0 && slave.counter.milk < 20) {
+		r += `${He} has given a small quantity of milk `;
+		if (slave.counter.cum > 0) {
+			r += ` and about ${num(slave.counter.cum)} deciliters of cum`;
+		}
+		r += `. `;
+	} else if (slave.counter.milk > 1) {
+		r += `${He} has given about ${num($activeSlave.counter.milk)} liters of milk`;
+		if (slave.counter.cum > 0) {
+			r += ` and about ${num(slave.counter.cum)} deciliters of cum`;
+		}
+		r += `. `;
+	}
+
+	if (slave.counter.birthsTotal > 0) {
+		r += `${He} has given birth a total of ${numberWithPluralOne(slave.counter.birthsTotal, "time")}; `;
+		if (slave.counter.birthsTotal === slave.counter.births) {
+			if (slave.counter.births === 1) {
+				r += `it happened `;
+			} else if (slave.counter.births === 2) {
+				r += `both of them happened `;
+			} else {
+				r += `all of them happened `;
+			}
+		} else if (slave.counter.births === 1) {
+			r += `one of them happened `;
+		} else if (slave.counter.births > 1) {
+			r += `${slave.counter.births} of them happened `;
+		} else if (slave.counter.birthsTotal === 1) {
+			r += `it did not happen `;
+		} else {
+			r += `none of them happened `;
+		}
+		r += `within the walls of ${V.arcologies[0].name}. `;
+	}
+
+	if (slave.counter.slavesKnockedUp > 0) {
+		r += `${He}'s knocked up ${numberWithPluralOne(slave.counter.slavesKnockedUp, "other slave girl")} `;
+		if (slave.counter.slavesFathered > 0) {
+			r += `and fathered ${numberWithPluralOne(slave.counter.slavesKnockedUp, "new slave")} `;
+		}
+		r += `for you. `;
+	} else if (slave.counter.slavesFathered > 0) {
+		r += `${He}'s fathered ${numberWithPluralOne(slave.counter.slavesKnockedUp, "new slave")} for you. `;
+	}
+	if (slave.counter.PCKnockedUp > 0) {
+		r += `${He}'s managed to knock you up ${numberWithPluralOne(slave.counter.PCKnockedUp, "time")}`;
+		if (slave.counter.PCChildrenFathered > 0) {
+			r += ` and is the father of ${slave.counter.PCChildrenFathered} of your children`;
+		}
+		r += `. `;
+	} else if (slave.counter.PCChildrenFathered > 0) {
+		r += `${He}'s the father of ${slave.counter.PCChildrenFathered} of your children.`;
+	}
+
+	return r;
+};
diff --git a/src/uncategorized/longSlaveDescription.tw b/src/uncategorized/longSlaveDescription.tw
index 68b72f0703ade421d20a4cb66403baa7c4de935f..6d4451922c4288a5c4a5f5349e19844a969481b0 100644
--- a/src/uncategorized/longSlaveDescription.tw
+++ b/src/uncategorized/longSlaveDescription.tw
@@ -346,173 +346,11 @@ is
 	<<geneticQuirkAssessment>>
 
 	<<if $showSexualHistory == 1 && $ui != "start">>
-		<<set _weeksOwned = $week-$activeSlave.weekAcquired>>
-		$He has been with you
-		<<if $activeSlave.weekAcquired == 0>>
-			since before you owned the arcology,
-		<<elseif $activeSlave.weekAcquired == 1>>
-			since you first took control of the arcology,
-		<<elseif _weeksOwned > 1>>
-			<<print num($week-$activeSlave.weekAcquired)>> weeks,
-		<<else>>
-			one week,
-		<</if>>
-
-		<<if ($activeSlave.counter.oral + $activeSlave.counter.vaginal + $activeSlave.counter.anal + $activeSlave.counter.mammary + $activeSlave.counter.penetrative) > 0>>
-			and has been fucked about <<print num($activeSlave.counter.oral + $activeSlave.counter.vaginal + $activeSlave.counter.anal + $activeSlave.counter.mammary + $activeSlave.counter.penetrative)>> times, including
-			<<if $activeSlave.counter.mammary > 0>>
-				<<print num($activeSlave.counter.mammary)>> mammary,
-			<</if>>
-			<<if $activeSlave.counter.vaginal > 0>>
-				<<print num($activeSlave.counter.vaginal)>> vanilla,
-			<</if>>
-			<<if $activeSlave.counter.anal > 0>>
-				<<print num($activeSlave.counter.anal)>> anal,
-			<</if>>
-			<<if $activeSlave.counter.penetrative > 0>>
-				<<print num($activeSlave.counter.penetrative)>> penetrating,
-			<</if>>
-			<<if ($activeSlave.counter.penetrative+$activeSlave.counter.mammary+$activeSlave.counter.vaginal+$activeSlave.counter.anal) > 0>>
-				and
-			<</if>>
-			<<print num($activeSlave.counter.oral)>> oral sexual encounters.
-		<<else>>
-			<<if $week-$activeSlave.weekAcquired >= 1>>
-				and
-			<<else>>
-				$He
-			<</if>>
-			has had little or no sexual experience <<if $activeSlave.weekAcquired != 0>>as your slave<<else>>in your new arcology<</if>> yet.
-		<</if>>
-
-		<<set _sortedCounts = []>>
-		<<set _sortedCounts.push({type: "anal", value: $activeSlave.counter.anal}), _sortedCounts.push({type: "vaginal", value: $activeSlave.counter.vaginal}), _sortedCounts.push({type: "oral", value: $activeSlave.counter.oral/2}), _sortedCounts.push({type: "mammary", value: $activeSlave.counter.mammary}), _sortedCounts.push({type: "penetrative", value: $activeSlave.counter.penetrative})>>
-		<<set _sortedCounts = _sortedCounts.sort(function(a, b){return b.value-a.value})>>
-		<<if _weeksOwned > 0>>
-			<<if _sortedCounts[0].type == "anal">>
-				<<if (_weeksOwned*112)/$activeSlave.counter.anal < 4>>
-					Remarkably, this means that $he's been buttfucked
-					<<if (_weeksOwned*112)/$activeSlave.counter.anal < 1>>
-						more than once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 1.5>>
-						about once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 2.5>>
-						about once every two hours
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.anal < 3.5>>
-						about once every three hours
-					<<else>>
-						about once every four hours
-					<</if>>
-					$he's spent awake.
-				<</if>>
-			<<elseif _sortedCounts[0].type == "vaginal">>
-				<<if (_weeksOwned*112)/$activeSlave.counter.vaginal < 4>>
-					Remarkably, this means that $his pussy has been fucked
-					<<if (_weeksOwned*112)/$activeSlave.counter.vaginal < 1>>
-						more than once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 1.5>>
-						about once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 2.5>>
-						about once every two hours
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.vaginal < 3.5>>
-						about once every three hours
-					<<else>>
-						about once every four hours
-					<</if>>
-					$he's spent awake.
-				<</if>>
-			<<elseif _sortedCounts[0].type == "oral">>
-				<<if (_weeksOwned*112)/$activeSlave.counter.oral < 4>>
-					Remarkably, this means that $he's sucked something off
-					<<if (_weeksOwned*112)/$activeSlave.counter.oral < 1>>
-						more than once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 1.5>>
-						about once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 2.5>>
-						about once every two hours
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.oral < 3.5>>
-						about once every three hours
-					<<else>>
-						about once every four hours
-					<</if>>
-					$he's spent awake.
-				<</if>>
-			<<elseif _sortedCounts[0].type == "mammary">>
-				<<if (_weeksOwned*112)/$activeSlave.counter.mammary < 4>>
-					Remarkably, this means that $he's put $his tits to work
-					<<if (_weeksOwned*112)/$activeSlave.counter.mammary < 1>>
-						more than once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 1.5>>
-						about once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 2.5>>
-						about once every two hours
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.mammary < 3.5>>
-						about once every three hours
-					<<else>>
-						about once every four hours
-					<</if>>
-					$he's spent awake.
-				<</if>>
-			<<elseif _sortedCounts[0].type == "penetrative">>
-				<<if (_weeksOwned*112)/$activeSlave.counter.penetrative < 4>>
-					Remarkably, this means that $he's pounded a hole
-					<<if (_weeksOwned*112)/$activeSlave.counter.penetrative < 1>>
-						more than once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 1.5>>
-						about once every hour
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 2.5>>
-						about once every two hours
-					<<elseif (_weeksOwned*112)/$activeSlave.counter.penetrative < 3.5>>
-						about once every three hours
-					<<else>>
-						about once every four hours
-					<</if>>
-					$he's spent awake.
-				<</if>>
-			<</if>>
-		<</if>>
-
-		<<if ($activeSlave.lactation > 0) && ($activeSlave.counter.milk < 20)>>
-			$He has given a small quantity of milk<<if ($activeSlave.counter.cum > 0)>> and about <<print num($activeSlave.counter.cum)>> deciliters of cum<</if>>.
-		<<elseif ($activeSlave.counter.milk > 1)>>
-			$He has given about <<print num($activeSlave.counter.milk)>> liters of milk<<if ($activeSlave.counter.cum > 0)>> and about <<print num($activeSlave.counter.cum)>> deciliters of cum<</if>>.
-		<</if>>
-
-		<<if ($activeSlave.counter.birthsTotal != 0)>>
-			$He has given birth a total of <<print $activeSlave.counter.birthsTotal>> time<<if $activeSlave.counter.birthsTotal != 1>>s<</if>>;
-			<<if ($activeSlave.counter.births == $activeSlave.counter.birthsTotal)>>
-				<<if ($activeSlave.counter.births == 1)>>
-					it happened within the walls of $arcologies[0].name.
-				<<elseif ($activeSlave.counter.births == 2)>>
-					both of them happened within the walls of $arcologies[0].name.
-				<<else>>
-					all of them happened within the walls of $arcologies[0].name.
-				<</if>>
-			<<elseif $activeSlave.counter.births == 1>>
-				one of them happened within the walls of $arcologies[0].name.
-			<<elseif ($activeSlave.counter.births > 1)>>
-				$activeSlave.counter.births of them happened within the walls of $arcologies[0].name.
-			<<else>>
-				none of them happened within $arcologies[0].name.
-			<</if>>
-		<</if>>
-
-		<<if $activeSlave.counter.slavesKnockedUp > 0>>
-			$He's knocked up $activeSlave.counter.slavesKnockedUp other slave girl<<if $activeSlave.counter.slavesKnockedUp > 1>>s<</if>><<if $activeSlave.counter.slavesFathered > 0>> and fathered $activeSlave.counter.slavesFathered new slave<<if $activeSlave.counter.slavesFathered > 1>>s<</if>> for you<</if>>.
-		<<elseif $activeSlave.counter.slavesFathered > 0>>
-			$He's fathered $activeSlave.counter.slavesFathered new slave<<if $activeSlave.counter.slavesFathered > 1>>s<</if>> for you.
-		<</if>>
-		<<if $activeSlave.counter.PCKnockedUp > 0>>
-			$He's managed to knock you up $activeSlave.counter.PCKnockedUp time<<if $activeSlave.counter.PCKnockedUp > 1>>s<</if>><<if $activeSlave.counter.slavesFathered > 0>> and is the father of $activeSlave.counter.PCChildrenFathered of your children<</if>>.
-		<<elseif $activeSlave.counter.PCChildrenFathered > 0>>
-			$He's the father of $activeSlave.counter.PCChildrenFathered of your children.
-		<</if>>
+		<<= App.Desc.sexualHistory($activeSlave)>>
 	<</if>>
-
 <</if>>
 
 <<if $activeSlave.fuckdoll == 0>> /* NORMAL NON-FUCKDOLL MENTAL REPORT */
-
 	<<= App.Desc.eyes($activeSlave)>>
 
 	<<if $activeSlave.fetish == "mindbroken">>