diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0fae9be982ad45798a67c2ef4b18884ce680ec4d..0b845f1027fbeaf6c1a33d75bdcf57b74e7c88a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 ## Unreleased
 
 * added the smart strap-on, a tool that maximizes femPC's ability to deal with need
+* added a new gender fundamentalist recFS event
+* added several new coursing hares
+* coursing rep slightly rebalanced (less upfront, more on win)
 * pregnancy report improvements
 * AI related things, most notably the dressing room
 * fixes
diff --git a/src/events/JE/jeSlaveDisputeMajorityDeal.js b/src/events/JE/jeSlaveDisputeMajorityDeal.js
index 0c3350c85baf9929e3ed72bc2e2644b153591d80..a6d25c0c34f11f6e9c2952aabb7b20c640f77503 100644
--- a/src/events/JE/jeSlaveDisputeMajorityDeal.js
+++ b/src/events/JE/jeSlaveDisputeMajorityDeal.js
@@ -14,7 +14,7 @@ App.Events.JESlaveDisputeMajorityDeal = class JESlaveDisputeMajorityDeal extends
 		const index = V.justiceEvents.indexOf("majority deal");
 		V.justiceEvents.splice(index, 1);
 		const contractCost = 20000;
-		const slave = GenerateNewSlave(null, {minAge: V.minimumSlaveAge, maxAge: 18, disableDisability: 1});
+		const slave = GenerateNewSlave(null, {minAge: V.minimumSlaveAge, maxAge: V.minimumSlaveAge, disableDisability: 1});
 		slave.origin = "$He was raised to be a slave, since $he was mistakenly thought to be from good slave stock.";
 		slave.career = "a slave";
 		slave.devotion = random(10, 15);
diff --git a/src/markets/specificMarkets/schools.js b/src/markets/specificMarkets/schools.js
index 7069cb20780c20b1f261ccbacda19cc5e14cdea3..ad75cfb13c41a104427ac322a9578e5789fff1cf 100644
--- a/src/markets/specificMarkets/schools.js
+++ b/src/markets/specificMarkets/schools.js
@@ -243,7 +243,7 @@ App.Markets.TSS = function() {
 App.Markets.TUO = function() {
 	const el = new DocumentFragment();
 	let r = [];
-	r.push(`The Utopian Orphanage is where all slaves dream of being raised. Its business model is to offer intelligent, well educated girls just past their majority. The girls are treated exceptionally well and have no sexual ${(V.TUO.schoolUpgrade !== 2) ? "education or " : ""}experience.`);
+	r.push(`The Utopian Orphanage is where all slaves dream of being raised. Its business model is to offer intelligent, well educated girls just past ${V.fertilityAge > V.minimumSlaveAge ? "puberty" : "their majority"}. The girls are treated exceptionally well and have no sexual ${(V.TUO.schoolUpgrade !== 2) ? "education or " : ""}experience.`);
 	if (V.TUO.schoolUpgrade !== 0) {
 		r.push(`You have endowed`);
 		if (V.TUO.schoolUpgrade === 1) {
diff --git a/src/markets/theMarket/marketData.js b/src/markets/theMarket/marketData.js
index 9867cd8fda07db8c59daf7ac1f92c1102cf4d984..4581e410811db1a018da7693df3ff4c609375672 100644
--- a/src/markets/theMarket/marketData.js
+++ b/src/markets/theMarket/marketData.js
@@ -145,7 +145,7 @@ App.Data.Markets = {
 		{
 			title: "The Utopian Orphanage",
 			marketType: "TUO",
-			note: "Intelligent, unspoiled slaves just past their majority.",
+			note: "Intelligent, unspoiled slaves.",
 			encyclopedia: "Slave Schools",
 			get requirements() { return (V.seeDicks !== 100); }
 		},
diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js
index 9814d515b3acfb49c6fb7f84fff2a01e04baf4c2..aa9576415c50aea4f942cafbf5a9a55bec6c727b 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1509,8 +1509,12 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 		case "TSS": {
 			if (V.TSS.schoolUpgrade === 1) {
 				SGProp.minAge = 36;
+			} else if (V.TSS.schoolUpgrade !== 0) {
+				SGProp.minAge = V.minimumSlaveAge;
+				SGProp.maxAge = V.minimumSlaveAge + random(0, 1);
 			} else {
-				SGProp.maxAge = 18;
+				SGProp.minAge = 18;
+				SGProp.maxAge = 18 + random(0, 1);
 			}
 			SGProp.disableDisability = 1;
 			slave = GenerateNewSlave("XX", SGProp);
@@ -1567,12 +1571,18 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			break;
 		}
 		case "TUO": {
-			SGProp.minAge = V.minimumSlaveAge;
-			SGProp.maxAge = Math.max(V.fertilityAge + jsRandom(0, 1), V.minimumSlaveAge + jsRandom(0, 3));
+			if (V.TUO.schoolUpgrade !== 0) {
+				SGProp.minAge = V.minimumSlaveAge;
+				SGProp.maxAge = Math.max(V.fertilityAge + jsRandom(0, 1), V.minimumSlaveAge + jsRandom(0, 1));
+			} else {
+				SGProp.minAge = 18;
+				SGProp.maxAge = Math.max(V.fertilityAge + jsRandom(0, 1), 18 + jsRandom(0, 1));
+			}
 			SGProp.disableDisability = 1;
 			slave = GenerateNewSlave("XX", SGProp);
 			slave.origin = "You bought $him from The Utopian Orphanage right after $his graduation.";
 			slave.career = "a slave";
+			slave.birthWeek = random(0, 12);
 			setHealth(slave, jsRandom(60, 80), 0, Math.max(normalRandInt(0, 4), 0), 0, jsRandom(5, 20));
 			slave.devotion = jsRandom(50, 75);
 			slave.trust = jsRandom(50, 75);
@@ -1621,6 +1631,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			slave.buttImplant = 0;
 			slave.vagina = 0;
 			slave.anus = 0;
+			slave.trueVirgin = 1;
 			break;
 		}
 		case "GRI": {
@@ -1747,8 +1758,13 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			break;
 		}
 		case "LDE": {
-			SGProp.minAge = 16;
-			SGProp.maxAge = 19;
+			if (V.LDE.schoolUpgrade !== 0) {
+				SGProp.minAge = V.minimumSlaveAge + 1;
+				SGProp.maxAge = V.minimumSlaveAge + 1;
+			} else {
+				SGProp.minAge = V.minimumSlaveAge >= 16 ? V.minimumSlaveAge + 1 : 17;
+				SGProp.maxAge = V.minimumSlaveAge >= 16 ? V.minimumSlaveAge + 1 : 17;
+			}
 			SGProp.disableDisability = 1;
 			slave = GenerateNewSlave("XY", SGProp);
 			slave.origin = "You bought $him from the innovative École des Enculées right after $his graduation.";
@@ -1816,8 +1832,13 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			break;
 		}
 		case "TGA": {
-			SGProp.minAge = 16;
-			SGProp.maxAge = 19;
+			if (V.TGA.schoolUpgrade !== 0) {
+				SGProp.minAge = V.minimumSlaveAge;
+				SGProp.maxAge = V.minimumSlaveAge + random(0, 1);
+			} else {
+				SGProp.minAge = 18;
+				SGProp.maxAge = 18 + random(0, 1);
+			}
 			SGProp.disableDisability = 1;
 			slave = GenerateNewSlave("XY", SGProp);
 			slave.origin = "You bought $him fresh from the intense Gymnasium-Academy right after $his majority.";