diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index f8d7547319709232847d1f262a7873ad92753405..443b3b1bb927c8fa48e09c582b2e1167f96b1dbe 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -672,8 +672,11 @@ App.Data.resetOnNGPlus = {
 		/** @type {App.Entity.Animal} */
 		feline: null,
 	},
+	/** @type {App.Entity.Animal[]} */
 	canine: [],
+	/** @type {App.Entity.Animal[]} */
 	hooved: [],
+	/** @type {App.Entity.Animal[]} */
 	feline: [],
 	farmyardName: "the Farmyard",
 
@@ -688,7 +691,6 @@ App.Data.resetOnNGPlus = {
 	/** @type {FC.Facilities.Pit} */
 	pit: null,
 
-
 	/** Arrays of slaves you've threatened to kill */
 	threatened: [
 		[],	// this week
@@ -1075,6 +1077,7 @@ App.Data.resetOnNGPlus = {
 	trinkets: new Map([]),
 	SPcost: 1000,
 	debtWarned: 0,
+	foodWarned: 0,
 	internationalTrade: 1,
 	internationalVariety: 0,
 	slaveCostFactor: 0.95,
@@ -1144,15 +1147,23 @@ App.Data.resetOnNGPlus = {
 
 	food: 125000,
 	foodLastWeek: 0,
+	/** The amount of food produced this week, in kg. */
 	foodProduced: 0,
-	foodStored: 0,
 	farmyardFoodCost: 5,
 	foodCost: 25,
 	foodMarket: 0,
 	foodRate: {
-		slave: 2, lower: 1.8, middle: 2, upper: 2.2, top: 2.4
+		/** The amount of food a slave consumes in a week, in kg. */
+		slave: 8,
+		/** The amount of food the lower class consumes in a week, in kg. */
+		lower: 14.5,
+		/** The amount of food the middle class consumes in a week, in kg. */
+		middle: 16,
+		/** The amount of food the upper class consumes in a week, in kg. */
+		upper: 17.5,
+		/** The amount of food the elite class consumes in a week, in kg. */
+		top: 19,
 	},
-	foodConsumption: 0,	/* total amount food consumed per week */
 	revealFoodEffects: 0,
 	rations: 0,
 	/** @type {App.Arcology.Building} */
diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js
index e818f190add2b1ca8c6f8d4d6acbcf04f0362c5f..b4765090a556ec9c6a548faba9760444161c566a 100644
--- a/src/002-config/fc-version.js
+++ b/src/002-config/fc-version.js
@@ -2,5 +2,5 @@ App.Version = {
 	base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed.
 	pmod: "4.0.0-alpha.11",
 	commitHash: null,
-	release: 1151 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
+	release: 1152 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js.
 };
diff --git a/src/arcologyBuilding/ManageArcology.js b/src/arcologyBuilding/ManageArcology.js
index 4865dbe59e349b2e94aa7c9149b4d87cf85fc874..03c335001d0a33e397c3f4c4cb00590ae1f8bf67 100644
--- a/src/arcologyBuilding/ManageArcology.js
+++ b/src/arcologyBuilding/ManageArcology.js
@@ -353,6 +353,19 @@ App.UI.manageArcology = function() {
 	if (V.foodMarket > 0) {
 		App.UI.DOM.appendNewElement("h2", node, "Food Management");
 		node.append(App.UI.foodMarket());
+	} else if (V.eventResults.foodCrisis) {
+		const div = document.createElement("div");
+
+		div.append(
+			`You can set up the food market for your citizens again, if you'd like.`,
+			App.UI.DOM.makeElement("div", App.UI.DOM.link(`Set it up`, () => {
+				V.foodMarket = 1;
+				repX(6500, "food");
+				App.UI.reload();
+			}), ['indent']),
+		);
+
+		node.append(div);
 	}
 	const SocietyClasses = ["lower", "middle", "upper", "top"];
 	App.UI.DOM.appendNewElement("h2", node, "Sexual Service Policies");
diff --git a/src/arcologyBuilding/manufacturing.js b/src/arcologyBuilding/manufacturing.js
index d1e68f48f2444cbf90a1378daba6f1e6c57f4a4a..d2d3f887750a35553c2a87e12bbd64cceac5a08b 100644
--- a/src/arcologyBuilding/manufacturing.js
+++ b/src/arcologyBuilding/manufacturing.js
@@ -202,16 +202,14 @@ App.Arcology.Cell.Manufacturing = class extends App.Arcology.Cell.BaseCell {
 				));
 			}
 
-			if (V.experimental.food === 1) {
-				if (V.farmyard === 0) {
-					fragment.append(thisCell._makeExternalUpgrade(
-						"Construct a farming facility to grow food for your arcology and house animals",
-						() => {
-							V.farmyard = 5;
-							thisCell.type = "Farmyard";
-						}, cost, "Farmyard", "and will incur upkeep costs"
-					));
-				}
+			if (V.farmyard === 0) {
+				fragment.append(thisCell._makeExternalUpgrade(
+					"Construct a farming facility to grow food for your arcology and house animals",
+					() => {
+						V.farmyard = 5;
+						thisCell.type = "Farmyard";
+					}, cost, "Farmyard", "and will incur upkeep costs"
+				));
 			}
 
 			if (V.mercenaries) {
diff --git a/src/endWeek/economics/economics.js b/src/endWeek/economics/economics.js
index d8940eb809caaee38e5fbfc9c68eb53a2e2e66d0..c54ca7ebb03e9cf0ef04f195b9e59bb9246cce41 100644
--- a/src/endWeek/economics/economics.js
+++ b/src/endWeek/economics/economics.js
@@ -5,6 +5,11 @@ App.EndWeek.economics = function() {
 	if (V.cash > -10000) {
 		V.debtWarned = 0;
 	}
+	if (V.foodMarket &&
+		(V.food > App.Facilities.Farmyard.foodConsumption() ||
+		V.cash > App.Facilities.Farmyard.foodConsumption() * V.foodCost)) {
+		V.foodWarned = 0;
+	}
 
 	SectorCounts();
 	App.Arcology.updateOwnership();
diff --git a/src/endWeek/economics/persBusiness.js b/src/endWeek/economics/persBusiness.js
index 6811480f72a1fbcaa8743a754f7129b10cab0ab2..32f71e4c5872f0506a07173941b8f672143d892d 100644
--- a/src/endWeek/economics/persBusiness.js
+++ b/src/endWeek/economics/persBusiness.js
@@ -46,6 +46,21 @@ App.EndWeek.personalBusiness = function() {
 			}
 		}
 	}
+	if (V.foodMarket) {
+		if (V.food < App.Facilities.Farmyard.foodConsumption() && V.cash < App.Facilities.Farmyard.foodConsumption() * V.foodCost) {
+			r.push(`<span class="red">WARNING: your arcology will starve in the coming week unless action is taken.</span>`);
+			if (V.foodWarned) {
+				V.gameover = "starving citizens";
+				V.nextLink = "Gameover";
+			} else {
+				V.foodWarned++;
+				r.push(
+					`Immediately purchase more food or acquire enough capital to purchase the required amount.`,
+					`You can also renege on your deal to provide a marketplace for food, but your citizens may hate you for it,`,
+				);
+			}
+		}
+	}
 	if (V.PC.health.shortDamage >= 30) {
 		endWeekHealthDamage(V.PC);
 		r.push(`The injuries received in the recent battle prevents you from engaging in tiring endeavors.`);
@@ -858,6 +873,11 @@ App.EndWeek.personalBusiness = function() {
 			}
 		}
 	}
+	if (V.foodMarket && V.food < App.Facilities.Farmyard.foodConsumption()) {
+		const foodCost = (App.Facilities.Farmyard.foodConsumption() - V.food) * V.foodCost;
+		r.push(`You also spent ${cashFormat(foodCost)} this week buying enough food to keep your citizens fed, as you promised.`);
+		cashX(foodCost, "food");
+	}
 	App.Events.addParagraph(el, r);
 	r = [];
 
diff --git a/src/endWeek/endWeek.js b/src/endWeek/endWeek.js
index 32588fc83062f950a713fe2db41c36511ac46941..9f24705c2f5aa428a894cf352354c2b7ec5e2952 100644
--- a/src/endWeek/endWeek.js
+++ b/src/endWeek/endWeek.js
@@ -181,26 +181,9 @@ globalThis.endWeek = (function() {
 	}
 
 	function food() {
-		function foodConsumption(s) {
-			if (s.diet === "restricted") {
-				return 1.8;
-			} else if (s.diet === "slimming") {
-				return 1.9;
-			} else if (s.diet === "muscle building") {
-				return 2.1;
-			} else if (s.diet === "fattening") {
-				return 2.2;
-			} else {
-				return 2;
-			}
-		}
-
 		if (V.foodMarket > 0) {
-			V.foodConsumption = ((V.lowerClass * V.foodRate.lower) + (V.middleClass * V.foodRate.middle) +
-				(V.upperClass * V.foodRate.upper) + (V.topClass * V.foodRate.top));
-			V.foodConsumption += V.slaves.reduce((acc, cur) => acc + foodConsumption(cur), 0);
-			V.food -= Math.max(V.foodConsumption, V.food);
-			V.foodConsumption = 0;
+			V.food += App.Facilities.Farmyard.foodProduction();
+			V.food -= App.Facilities.Farmyard.foodConsumption();
 		}
 	}
 
diff --git a/src/endWeek/nextWeek/nextWeek.js b/src/endWeek/nextWeek/nextWeek.js
index 0852e5328d74d458c84b700106d2c65fc1a9a1ce..e174276d9bf3f41c3f4df60bea48ea593eb72483 100644
--- a/src/endWeek/nextWeek/nextWeek.js
+++ b/src/endWeek/nextWeek/nextWeek.js
@@ -90,7 +90,7 @@ App.EndWeek.nextWeek = function() {
 			V.localEcon = 20;
 		}
 
-		if (V.experimental.food === 1) {
+		if (V.foodMarket) {
 			if (V.localEcon > 100) {
 				V.farmyardFoodCost = Math.max(5 / (1 + (Math.trunc(1000 - 100000 / V.localEcon) / 10) / 100), 3.125);
 			} else if (V.localEcon === 100) {
diff --git a/src/endWeek/reports/farmyardReport.js b/src/endWeek/reports/farmyardReport.js
index df8a177d7e1622e7d77dfe8db77d8c6f502f6113..e216d11a7a363958af33ad0493f0d031ebbe30fe 100644
--- a/src/endWeek/reports/farmyardReport.js
+++ b/src/endWeek/reports/farmyardReport.js
@@ -1,5 +1,5 @@
-App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
-	let frag = new DocumentFragment();
+App.EndWeek.farmyardReport = function farmyardReport() {
+	const frag = new DocumentFragment();
 
 	const slaves = App.Utils.sortedEmployees(App.Entity.facilities.farmyard);
 	const devBonus = (V.farmyardDecoration !== "standard") ? 1 : 0;
@@ -7,9 +7,107 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 
 	let profits = 0;
 	let foodWeek = 0;
-	let farmerBonus = 0;
 
+	const statsSpan = document.createElement("span");
+
+	// Statistics gathering
+	V.facility = V.facility || {};
+	V.facility.farmyard = initFacilityStatistics(V.facility.farmyard);
+
+	farmyardStatsRecords();
+
+	farmyardDecoration();
+	farmyardProfit(profits, foodWeek);
+
+	V.food += foodWeek;
+
+	if (Farmer) {
+		const farmerEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
+
+		if (V.showEWD) {
+			const farmerEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
+			const artSpan = App.UI.DOM.appendNewElement("span", farmerEntry);
+			App.SlaveAssignment.appendSlaveLinks(farmerEntry, Farmer);
+			$(farmerEntry).append(`<span class="slave-name">${SlaveFullName(Farmer)}</span> is serving as the Farmer.`);
+			farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer, false));
+			App.SlaveAssignment.appendSlaveArt(artSpan, Farmer);
+		} else {
+			App.SlaveAssignment.standardSlaveReport(Farmer, true);
+		}
+
+		getSlaveStatisticData(S.Farmer, V.facility.farmyard);
+
+		farmerChanges();
+		$(farmerEffects).append(farmerText());
+	}
+
+	if (slaves) {
+		const intro = App.UI.DOM.appendNewElement("p", frag, '', "indent");
+
+		$(intro).append(farmhandCount(slaves.length));
+
+		for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
+			slave.devotion += devBonus;
+
+			if (V.showEWD) {
+				const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
+				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
+				App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
+				$(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `);
+
+				if (slave.choosesOwnAssignment) {
+					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
+				} else {
+					$(slaveEntry).append(`is working out of ${V.farmyardName}.`);
+				}
+
+				farmhandLivingRules(slave);
+				farmhandHealth(slave);
+				farmhandDevotion(slave);
+				farmhandTrust(slave);
+				farmhandEnergy(slave);
+				farmhandFood(slave);
+
+				profits += farmhandProfit(slave);
+
+				const farmhandContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', "indent");
+
+				$(farmhandContent).append(App.SlaveAssignment.workTheFarm(slave));
+				slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
+				App.SlaveAssignment.appendSlaveArt(artSpan, slave);
+			} else {	// silently discard return values
+				App.SlaveAssignment.workTheFarm(slave);
+				App.SlaveAssignment.standardSlaveReport(slave, true);
+			}
+		}
+	}
+
+	if (V.farmMenials) {
+		let farmMenialProductivity = 9;
+
+		if (V.farmyardUpgrades.pump) {
+			farmMenialProductivity += 1;
+		}
+
+		if (V.farmyardUpgrades.fertilizer) {
+			farmMenialProductivity += 2;
+		}
+
+		if (V.farmyardUpgrades.seeds) {
+			farmMenialProductivity += 3;
+		}
+
+		if (V.farmyardUpgrades.machinery) {
+			farmMenialProductivity += 3;
+		}
+
+		foodWeek += (V.farmMenials * farmMenialProductivity);
+	}
+
+	frag.append(App.Facilities.Farmyard.Stats(false));
+	statsSpan.append(App.Facilities.Farmyard.Stats(true));
 
+	return frag;
 
 	// Farmer
 
@@ -50,8 +148,12 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		}
 	}
 
-	const farmerLivingRules = slave => slave.rules.living = 'luxurious';
-	const farmerRestRules = slave => slave.rules.rest = 'restrictive';
+	function farmerLivingRules(slave) {
+		slave.rules.living = 'luxurious';
+	}
+	function farmerRestRules(slave) {
+		slave.rules.rest = 'restrictive';
+	}
 
 	function farmerCashBonus(slave) {
 		let FarmerCashBonus = Math.min(0.2, slave.skill.farmer * 0.002);
@@ -87,8 +189,6 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		return FarmerCashBonus;
 	}
 
-
-
 	function farmerText() {
 		let r = [];
 
@@ -108,7 +208,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 
 	function farmerFetish(slave) {
 		if (slave.fetish !== 'dom') {
-			if (fetishChangeChance(slave) > jsRandom(0, 100)) {
+			if (fetishChangeChance(slave) > random(0, 100)) {
 				slave.fetishKnown = 1;
 				slave.fetish = 'dom';
 				slave.fetishStrength = 10;
@@ -165,7 +265,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		} else if (slave.skill.farmer >= V.masteredXP) {
 			return `${He} has experience from working for you that helps ${him} in the difficult life of managing animals and property.`;
 		} else {
-			const skillIncrease = jsRandom(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 32));
+			const skillIncrease = random(1, Math.ceil((slave.intelligence + slave.intelligenceImplant) / 32));
 			return slaveSkillIncrease('farmer', slave, skillIncrease);
 		}
 	}
@@ -197,7 +297,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 				}
 
 				seX(slave, 'oral', 'public', 'penetrative', 10);
-				if (jsRandom(1, 100) > 65) {
+				if (random(1, 100) > 65) {
 					Farmer.rivalry++; slave.rivalry++;
 				}
 			} else if (Farmer.relationshipTarget === slave.ID) {
@@ -216,7 +316,7 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		const {he, his, himself} = getPronouns(slave);
 
 		let r = [];
-		let seed = V.farmyardShowgirls ? App.Facilities.Farmyard.farmShowsIncome(slave) : jsRandom(1, 10) * (jsRandom(150, 170) + (farmerBonus * 10));
+		let seed = Math.trunc(App.Facilities.Farmyard.farmShowsIncome(slave));
 
 		if (V.farmyardShows && !V.farmyardShowgirls) {
 			r.push(`<p class="indent">Since ${he} doesn't have enough showgirls to entertain your arcology's citizens, ${he} puts on shows with your animals on ${his} own, earning <span class="cash">${cashFormat(seed)}.</span></p>`);
@@ -251,28 +351,10 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		}
 	}
 
-	const farmerIntro = slave => `<span class="indent">${SlaveFullName(slave)} is serving as the Farmer.</span>`;
-
-	if (Farmer) {
-		const farmerEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
-
-		if (V.showEWD) {
-			const farmerEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
-			const artSpan = App.UI.DOM.appendNewElement("span", farmerEntry);
-			App.SlaveAssignment.appendSlaveLinks(farmerEntry, Farmer);
-			$(farmerEntry).append(`<span class="slave-name">${SlaveFullName(Farmer)}</span> is serving as the Farmer.`);
-			farmerEntry.append(App.SlaveAssignment.standardSlaveReport(Farmer, false));
-			App.SlaveAssignment.appendSlaveArt(artSpan, Farmer);
-		} else {
-			App.SlaveAssignment.standardSlaveReport(Farmer, true);
-		}
-
-		farmerChanges();
-		$(farmerEffects).append(farmerText());
+	function farmerIntro(slave) {
+		return `<span class="indent">${SlaveFullName(slave)} is serving as the Farmer</span>.`;
 	}
 
-
-
 	// Farmhands
 
 	function farmhandCount(count) {
@@ -317,12 +399,12 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 	}
 
 	function farmhandProfit(slave) {
-		let incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
-		return incomeStats.income;
+		const incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
+		return incomeStats.income || null;
 	}
 
 	function farmhandFood(slave) {
-		let incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
+		const incomeStats = getSlaveStatisticData(slave, slave.assignment === Job.FARMYARD ? V.facility.farmyard : undefined);
 		let foodWeek = incomeStats.food || 0;
 
 		if (V.farmMenials > 0) {
@@ -344,81 +426,12 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		}
 	}
 
-	if (slaves) {
-		const intro = App.UI.DOM.appendNewElement("p", frag, '', "indent");
-
-		$(intro).append(farmhandCount(slaves.length));
-
-		for (const slave of App.SlaveAssignment.reportSlaves(slaves)) {
-			slave.devotion += devBonus;
-
-			if (V.showEWD) {
-				const slaveEntry = App.UI.DOM.appendNewElement("div", frag, '', "slave-report");
-				const artSpan = App.UI.DOM.appendNewElement("span", slaveEntry);
-				App.SlaveAssignment.appendSlaveLinks(slaveEntry, slave);
-				$(slaveEntry).append(`<span class="slave-name">${SlaveFullName(slave)}</span> `);
-
-				if (slave.choosesOwnAssignment === 2) {
-					$(slaveEntry).append(App.SlaveAssignment.choosesOwnJob(slave));
-				} else {
-					$(slaveEntry).append(`is working out of ${V.farmyardName}.`);
-				}
-
-				farmhandLivingRules(slave);
-				farmhandHealth(slave);
-				farmhandDevotion(slave);
-				farmhandTrust(slave);
-				farmhandEnergy(slave);
-				farmhandFood(slave);
-
-				profits += farmhandProfit(slave);
-
-				const farmhandContent = App.UI.DOM.appendNewElement("div", slaveEntry, '', "indent");
-
-				$(farmhandContent).append(App.SlaveAssignment.workTheFarm(slave));
-				slaveEntry.append(App.SlaveAssignment.standardSlaveReport(slave, false));
-				App.SlaveAssignment.appendSlaveArt(artSpan, slave);
-			} else {	// silently discard return values
-				App.SlaveAssignment.workTheFarm(slave);
-				App.SlaveAssignment.standardSlaveReport(slave, true);
-			}
-		}
-	}
-
-
-
-	// Menials
-
-	if (V.farmMenials) {
-		let farmMenialProductivity = 9;
-
-		if (V.farmyardUpgrades.pump) {
-			farmMenialProductivity += 1;
-		}
-
-		if (V.farmyardUpgrades.fertilizer) {
-			farmMenialProductivity += 2;
-		}
-
-		if (V.farmyardUpgrades.seeds) {
-			farmMenialProductivity += 3;
-		}
-
-		if (V.farmyardUpgrades.machinery) {
-			farmMenialProductivity += 3;
-		}
-
-		foodWeek += (V.farmMenials * farmMenialProductivity);
-	}
-
-
-
 	// Farmyard
 
 	function farmyardStatsRecords() {
 		const f = V.facility.farmyard;
 
-		if (typeof f === "undefined") {
+		if (!f) {
 			return;
 		}
 
@@ -426,84 +439,58 @@ App.Facilities.Farmyard.farmyardReport = function farmyardReport() {
 		f.customers = 0;
 		f.farmhandCosts = 0;
 		f.rep = 0;
+		for (const si of f.income.values()) {
+			f.farmhandIncome += si.income + si.adsIncome;
+			f.customers += si.customers;
+			f.farmhandCosts += si.cost;
+			f.rep += si.rep;
+		}
 		f.maintenance = V.farmyard * V.facilityCost;
 		f.totalIncome = f.farmhandIncome + f.adsIncome;
 		f.totalExpenses = f.farmhandCosts + f.maintenance;
 		f.profit = f.totalIncome - f.totalExpenses;
-
-		for (let i of f.income.values()) {
-			f.farmhandIncome += i.income + i.adsIncome;
-			f.customers += i.customers;
-			f.farmhandCosts += i.cost;
-			f.rep += i.rep;
-		}
 	}
 
 	function farmyardDecoration() {
-		let r = [];
+		const text = new SpacedTextAccumulator(frag);
 
 		// TODO: add checks for the different FSs
 		if (V.farmyardDecoration !== 'standard') {
-			const decorationEffects = App.UI.DOM.appendNewElement("p", frag, '', "indent");
-			const farmyardNameCaps = capFirstChar(V.farmyardName);
-
-			$(decorationEffects).append(document.createElement("br"));
+			text.push(`${capFirstChar(V.farmyardName)}'s customer's enjoyed`);
 
-			r.push(`${farmyardNameCaps}'s customer's enjoyed`);
-
-			if (V.seeBestiality && V.policies.bestialityOpenness && (V.canine || V.hooved || V.feline)) {
-				r.push(`<span class="reputation inc">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`);
+			if (V.seeBestiality && V.policies.bestialityOpenness && (V.canine.length || V.hooved.length || V.feline.length)) {
+				text.push(`<span class="reputation inc">watching farmhands fuck animals in ${V.farmyardDecoration} surroundings.</span>`);
 			} else if (V.farmyardShows) {
-				r.push(`<span class="reputation inc">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`);
+				text.push(`<span class="reputation inc">watching farmhands put on shows in ${V.farmyardDecoration} surroundings.</span>`);
 			} else {
-				r.push(`<span class="reputation inc">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`);
+				text.push(`<span class="reputation inc">partaking of ${V.farmyardName}'s fine produce in its ${V.farmyardDecoration} décor.</span>`);
 			}
-
-			$(decorationEffects).append(r.join(' '));
 		}
 
-		return r;
+		return text.toParagraph();
 	}
 
 	function farmyardProfit(profit, food) {
-		const profitContent = App.UI.DOM.appendNewElement("p", frag, '', "indent");
-		const farmyardNameCaps = capFirstChar(V.farmyardName);
-
-		let r = [];
-
-		$(profitContent).append(document.createElement("br"));
+		const text = new SpacedTextAccumulator(frag);
 
 		if (profit || food) {
-			r.push(farmyardNameCaps);
+			text.push(capFirstChar(V.farmyardName));
 
 			if (profit) {
-				r.push(`makes you <span class="cash">${cashFormat(Math.trunc(profit))}</span>`);
+				text.push(`makes you <span class="cash">${cashFormat(Math.trunc(profit))}</span>`);
 			}
 
 			if (V.foodMarket) {
 				if (profit && food) {
-					r.push(`and`);
+					text.push(`and`);
 				}
 				if (food) {
-					r.push(`produced <span class="chocolate"> ${massFormat(food)}</span> of food`);
+					text.push(`produced <span class="chocolate"> ${massFormat(food)}</span> of food`);
 				}
 			}
-			r.push(`this week.`);
+			text.push(`this week.`);
 		}
 
-		return $(profitContent).append(r.join(' '));
+		return text.toParagraph();
 	}
-
-	const statsSpan = document.createElement("span");
-
-	farmyardStatsRecords();
-	farmyardProfit(profits, foodWeek);
-	farmyardDecoration();
-
-	V.food += foodWeek;
-
-	frag.append(App.Facilities.Farmyard.Stats(false));
-	statsSpan.append(App.Facilities.Farmyard.Stats(true));
-
-	return frag;
 };
diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js
index 541472568d9722512c000efc8f07bdde2d6eeea6..8dd679018311f75120c30aedcbccf6800c0d3694 100644
--- a/src/endWeek/saWorkTheFarm.js
+++ b/src/endWeek/saWorkTheFarm.js
@@ -1,11 +1,9 @@
-// FIXME: needs further review
-
 /**
  * @param {App.Entity.SlaveState} slave
  * @returns {DocumentFragment}
  */
 App.SlaveAssignment.workTheFarm = function(slave) {
-	let frag = document.createDocumentFragment();
+	const frag = document.createDocumentFragment();
 
 	const {he, him, his, He, His} = getPronouns(slave);
 	const incomeStats = getSlaveStatisticData(slave, V.facility.farmyard);
@@ -14,34 +12,40 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 	const behavioralQuirks = ["sinful"];
 	const fetishes = ["humiliation", "masochist"];
 
-	const slaveApproves = () => sexualQuirks.includes(slave.sexualQuirk) || behavioralQuirks.includes(slave.behavioralQuirk) ||fetishes.includes(slave.fetish);
+	const slaveApproves = sexualQuirks.includes(slave.sexualQuirk) || behavioralQuirks.includes(slave.behavioralQuirk) ||fetishes.includes(slave.fetish);
 
 	const foodAmount = Math.trunc(App.Facilities.Farmyard.foodAmount(slave));
 
-	function fullReport(slave) {
-		const report = App.UI.DOM.appendNewElement("div", frag);
+	const intro = `${He} works as a farmhand this week.`;
 
-		let r = [];
+	foodProduction();
 
-		r.push(intro());
-		// r.push(farmer(slave));
-		r.push(devotion(slave));
-		r.push(muscles(slave));
-		r.push(weight(slave));
-		r.push(health(slave));
-		r.push(sight(slave));
-		r.push(hearing(slave));
-		r.push(food());
+	fullReport(slave);
 
-		r.push(slaveShows(slave));
-		r.push(longTermEffects(slave));
-		r.push(slaveVignettes());
+	return frag;
 
-		$(report).append(r.join(' '));
+	function fullReport(slave) {
+		const text = new SpacedTextAccumulator(frag);
+
+		text.push(
+			intro,
+			devotion(slave),
+			muscles(slave),
+			weight(slave),
+			health(slave),
+			sight(slave),
+			hearing(slave),
+			shows(),
+
+			slaveShows(slave),
+			longTermEffects(slave),
+			results(slave),
+			slaveVignettes(),
+		);
+
+		return text.toParagraph();
 	}
 
-	const intro = () => `${He} works as a farmhand this week.`;
-
 	// function farmer(slave) {
 	// TODO: update this with devotion and health effects
 	// 	const F = getPronouns(S.Farmer);
@@ -62,12 +66,14 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 	}
 
 	function health(slave) {
-		let r = [];
+		const text = [];
 
-		r.push(healthCondition(slave));
-		r.push(healthIllness(slave));
+		text.push(
+			healthCondition(slave),
+			healthIllness(slave),
+		);
 
-		return r.join(' ');
+		return text.join(' ');
 	}
 
 	function healthCondition(slave) {
@@ -79,7 +85,7 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 	}
 
 	function healthIllness(slave) {
-		let r = [];
+		const text = [];
 		let health = ``;
 		let exhaustion = ``;
 
@@ -102,12 +108,12 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 				exhaustion = `being tired`;
 			}
 
-			r.push(`${He} performed worse this week due to <span class="health dec">${health}${slave.health.illness > 0 && slave.health.tired > 60 ? ` and ` : ``}${exhaustion}.</span>`);
+			text.push(`${He} performed worse this week due to <span class="health dec">${health}${slave.health.illness > 0 && slave.health.tired > 60 ? ` and ` : ``}${exhaustion}.</span>`);
 
-			r.push(tired(slave));
+			text.push(tired(slave));
 		}
 
-		return r;
+		return text;
 	}
 
 	function tired(slave) {
@@ -150,27 +156,27 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 		}
 	}
 
-	function food() {
-		const fsGain = 0.0001 * foodAmount;
-
-		FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain);
-
-		if (V.foodMarket) {
-			return `As a result, ${he} produces <span class="chocolate">${massFormat(foodAmount)}</span> of food over the week.`;
+	function shows() {
+		if (V.farmyardShows) {
+			return `Since ${he} also has to put on shows for your citizens, ${he} can only work on food production for half of ${his} shift, cutting down on the amount of food ${he} would have otherwise produced.`;
 		}
 	}
 
-	// Open Food Production
+	// Food Production
 
-	if (V.foodMarket) {
-		V.food += foodAmount;
-		V.foodTotal += foodAmount;
-		incomeStats.food += foodAmount;
-	}
+	function foodProduction() {
+		if (V.foodMarket) {
+			const fsGain = 0.0001 * foodAmount;
 
-	// Close Food Production
+			FutureSocieties.DecorationBonus(V.farmyardDecoration, fsGain);
+			V.food += foodAmount;
+			V.foodProduced += foodAmount;
+			V.foodTotal += foodAmount;
+			incomeStats.food += foodAmount;
+		}
+	}
 
-	// Open Shows
+	// Shows
 
 	function slaveShows(slave) {
 		if (V.farmyardShows) {
@@ -178,66 +184,90 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 		}
 	}
 
-	// Close Shows
-
-	// Open Long-Term Effects
+	// Long-Term Effects
 
 	function longTermEffects(slave) {
-		let r = [];
-
-		if (slave.fetishKnown && slaveApproves || slave.energy > 95) {
-			if (V.farmyardShows) {
-				if (V.seeBestiality) {
-					r.push(`Getting fucked by animals is the perfect job for ${him}, as far as ${he} can tell. <span class="devotion inc">${He} is happy</span> to spend ${his} days being utterly degraded.`);
+		if (V.farmyardShows) {
+			if (V.seeBestiality) {
+				if (slave.fetishKnown && slaveApproves) {
 					slave.devotion += 1;
-				} else {
-					r.push(`${He} loves putting on shows with animals, and as far as ${he} can tell, it's the perfect job for ${him}. It isn't as degrading as ${he} would like, but <span class="devotion inc">${he} is happy nonetheless.</span>`);
+
+					return `Getting fucked by animals is the perfect job for ${him}, as far as ${he} can tell. <span class="devotion inc">${He} is happy</span> to spend ${his} days being utterly degraded.`;
+				} else if (slave.energy > 95) {
+					slave.need = 0;
+					slave.devotion += 5;
+
+					return `${He}'s so perpetually horny that any sex, even coming from an animal, <span class="devotion inc">satisfies ${him}.</span>`;
+				}
+			} else {
+				if (slave.fetishKnown && slaveApproves) {
 					slave.devotion += 2;
+
+					return `${He} loves putting on shows with animals, and as far as ${he} can tell, it's the perfect job for ${him}. It isn't as degrading as ${he} would like, but <span class="devotion inc">${he} is happy nonetheless.</span>`;
 				}
 			}
+		}
+	}
+
+	function results(slave) {
+		const text = [];
 
-			slave.need = 0;
+		text.push(`All said and done,`);
+
+		if (V.foodMarket) {
+			text.push(`${he} produces <span class="chocolate">${massFormat(foodAmount)}</span> of food`);
 		}
 
-		return r;
-	}
+		if (V.farmyardShows) {
+			if (V.foodMarket) {
+				text.push(`and`);
+			} else {
+				text.push(`${he}`);
+			}
+
+			text.push(`earns <span class="cash inc">${cashFormat(Math.trunc(App.Facilities.Farmyard.farmShowsIncome(slave)))}</span> during the week`);
+		}
 
-	// Close Long-Term Effects
+		text.push(text.pop() + `.`);
+
+		return text.join(' ');
+	}
 
-	// Open Vignettes
+	// Vignettes
 
 	function slaveVignettes() {
 		if (V.showVignettes) {
 			const vignette = GetVignette(slave);
 
-			let r = [];
+			const text = [];
 
-			r.push(`<span class="story-label">This week</span> ${vignette.text}`);
+			text.push(`<span class="story-label">This week</span> ${vignette.text}`);
 
 			if (vignette.type === "cash") {
-				r.push(vignetteCash(vignette));
+				text.push(vignetteCash(vignette));
 			}
 
 			if (vignette.type === "devotion") {
-				r.push(vignetteDevotion(vignette));
+				text.push(vignetteDevotion(vignette));
 			}
 
 			if (vignette.type === "trust") {
-				r.push(vignetteTrust(vignette));
+				text.push(vignetteTrust(vignette));
 			}
 
 			if (vignette.type === "health") {
-				r.push(vignetteHealth(vignette));
+				text.push(vignetteHealth(vignette));
 			}
 
 			if (vignette.type === "rep") {
-				r.push(vignetteReputation(vignette));
+				text.push(vignetteReputation(vignette));
 			}
 
-			return r.join(' ');
+			return text.join(' ');
 		}
 	}
 
+	// TODO: move these into central vignette function
 	function vignetteCash(vignette) {
 		const FResultNumber = FResult(slave);
 		const cash = Math.trunc(FResultNumber * vignette.effect);
@@ -337,10 +367,4 @@ App.SlaveAssignment.workTheFarm = function(slave) {
 			return `an incident without lasting effect.`;
 		}
 	}
-
-	// Close Vignettes
-
-	fullReport(slave);
-
-	return frag;
 };
diff --git a/src/endWeek/slaveAssignmentReport.js b/src/endWeek/slaveAssignmentReport.js
index e264be20891ce0f884e91b880f0bd8ada01d0965..60d42d64f7fb7bcc774ed4eca6a25697450a49ad 100644
--- a/src/endWeek/slaveAssignmentReport.js
+++ b/src/endWeek/slaveAssignmentReport.js
@@ -258,7 +258,7 @@ App.EndWeek.slaveAssignmentReport = function() {
 		[App.EndWeek.clinicReport, App.Entity.facilities.clinic],
 		[App.EndWeek.clubReport, App.Entity.facilities.club],
 		[App.EndWeek.dairyReport, App.Entity.facilities.dairy],
-		[App.Facilities.Farmyard.farmyardReport, App.Entity.facilities.farmyard],
+		[App.EndWeek.farmyardReport, App.Entity.facilities.farmyard],
 		[App.EndWeek.schoolroomReport, App.Entity.facilities.schoolroom],
 		[App.EndWeek.spaReport, App.Entity.facilities.spa],
 		[App.EndWeek.servantsQuartersReport, App.Entity.facilities.servantsQuarters],
diff --git a/src/events/gameover.js b/src/events/gameover.js
index fafe5a77b2cf59e466e05a617b99fcb8e4096cbc..64694b2c6dcb7ee0962ddd5a45e49dafba7eaebd 100644
--- a/src/events/gameover.js
+++ b/src/events/gameover.js
@@ -41,7 +41,7 @@ App.Events.Gameover = function() {
 			r.push(`The instant your eyes leave the pretty woman, ${V.assistant.name} pings an alarm in your ear and two men on opposite sides of the marketplace spin on their heels towards you, pulling compact battle rifles from inside their jackets and screaming something in a foreign language. Your bodyguard quickly fires into the first assassin's chest, then snaps around and blasts the second one before either man can fire.`);
 			App.Events.addNode(node, r, "div");
 			r = [];
-			r.push(`As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free. The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When S.Bodyguard.slaveName stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, slashing S.Bodyguard.slaveName's throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over S.Bodyguard.slaveName's corpse and approaches you, smiling psychotically.`);
+			r.push(`As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free. The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him}, slashing ${S.Bodyguard.slaveName}'s throat in a single, clean motion as you clutch your arm on the ground and fumble with your handgun, grimacing from the pain. Covered in blood, the assassin stands over ${S.Bodyguard.slaveName}'s corpse and approaches you, smiling psychotically.`);
 			App.Events.addNode(node, r, "div");
 			r = [];
 			r.push(`"Bhalwi al-sham asmik qalbik, dog." The assassin spits, lunging towards you.`);
@@ -135,6 +135,9 @@ App.Events.Gameover = function() {
 				V.slavePC = convertPlayerToSlave(V.PC, "subjugated");
 			}
 			break;
+		case "starving citizens":
+			r.push(`You made a promise to your citizens that you would be able to keep them fed, and you had been able to keep that promise – until now, that is. Your food storages have been depleted and you don't have enough money to buy enough to feed the rest of the hungry arcology. Desperate and facing starvation, your once-loyal subjects have taken to the streets, eventually finding their way to your penthouse.${V.arcologyUpgrade.drones ? ` Your drones are only able to keep them at bay for a little while before the sheer number of them overwhelms your defenses.` : ``} Your attempts to calm the crowd fail, and you find yourself wishing you had run when you had the chance as you are grabbed by the crowd and thrown through the nearest window.`);
+			break;
 		default:
 			r.push(`Since you are without slaves, Free Cities society no longer considers you a citizen of the first rank. Your personal story may continue, but that part of it worthy of retelling has now ended.`);
 	}
diff --git a/src/events/intro/initNationalities.js b/src/events/intro/initNationalities.js
index da8c8c191532a9d2bca74e16dff3af0208a4162f..8d3909ce0361545df394eef55f44aa064102a85e 100644
--- a/src/events/intro/initNationalities.js
+++ b/src/events/intro/initNationalities.js
@@ -424,14 +424,12 @@ App.Intro.initNationalities = function() {
 
 	App.SecExp.generalInit();
 
-	if (V.experimental.food === 1) {
-		if (V.localEcon > 100) {
-			V.farmyardFoodCost = Math.max(5 / (1 + (Math.trunc(1000-100000/V.localEcon)/10)/100), 3.125);
-		} else if (V.localEcon === 100) {
-			V.farmyardFoodCost = 5;
-		} else {
-			V.farmyardFoodCost = Math.min(5 * (1 + 1.5 * Math.sqrt(Math.trunc(100000/V.localEcon-1000)/10)/100), 6.5);
-		}
+	if (V.localEcon > 100) {
+		V.farmyardFoodCost = Math.max(5 / (1 + (Math.trunc(1000-100000/V.localEcon)/10)/100), 3.125);
+	} else if (V.localEcon === 100) {
+		V.farmyardFoodCost = 5;
+	} else {
+		V.farmyardFoodCost = Math.min(5 * (1 + 1.5 * Math.sqrt(Math.trunc(100000/V.localEcon-1000)/10)/100), 6.5);
 	}
 
 	V.minimumSlaveAge = variableAsNumber(V.minimumSlaveAge, 3, 18, 18);
diff --git a/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js b/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
index 513f1574b62c1494d36e1b93b29779c4032b414c..02ff28e8ff2b89a83ccbaba031b14a6e5470a565 100644
--- a/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
+++ b/src/events/nonRandom/foodCrisis/pFoodCrisisMiddleClass.js
@@ -4,9 +4,7 @@ App.Events.pFoodCrisisMiddleClass = class pFoodCrisisMiddleClass extends App.Eve
 	}
 
 	eventPrerequisites() {
-		return [
-			() => !!V.experimental.food,
-		];
+		return [];
 	}
 
 	execute(node) {
diff --git a/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js b/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
index cf1d75d87a95819b4e64f3d9dbf12cc6b8aaafbe..290c9fe78dd65deeefe7841de5689be5058db290 100644
--- a/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
+++ b/src/events/nonRandom/foodCrisis/pFoodCrisisUpperClass.js
@@ -4,9 +4,7 @@ App.Events.pFoodCrisisUpperClass = class pFoodCrisisUpperClass extends App.Event
 	}
 
 	eventPrerequisites() {
-		return [
-			() => !!V.experimental.food,
-		];
+		return [];
 	}
 
 	execute(node) {
diff --git a/src/facilities/farmyard/animals/animals.js b/src/facilities/farmyard/animals/animals.js
index d8dee35296318f7b16dd7118e152be05122b2f29..0a6c43b0337a75e8bbaa487b903c9ff09b6f7367 100644
--- a/src/facilities/farmyard/animals/animals.js
+++ b/src/facilities/farmyard/animals/animals.js
@@ -272,7 +272,7 @@ App.Facilities.Farmyard.animals = function() {
 	 * @returns {string|HTMLElement}
 	 */
 	function animalLink({animal, active, type, price, setActiveHandler, purchaseHandler}) {
-		if (animal.purchased) {
+		if (animal.purchased || V[animal.type].some(a => a.name === animal.name)) {
 			if (V.active[active] && V.active[active].name === animal.name) {
 				return App.UI.DOM.makeElement("span", `Set as active ${type}`, "note");
 			} else {
@@ -585,7 +585,7 @@ App.Facilities.Farmyard.animals = function() {
 };
 
 App.Facilities.Farmyard.animals.init = function() {
-	if (App.Data.animals.length === 0) {
+	if (!App.Data.animals || App.Data.animals.length === 0) {
 		class Animal extends App.Entity.Animal {}
 
 		const dog = 'dog';
diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js
index a00a9c9c9eb029ffc91c8375a6425b448d7938e7..99f831d25f959ba136e7033c19781d4ad40db551 100644
--- a/src/facilities/farmyard/farmyard.js
+++ b/src/facilities/farmyard/farmyard.js
@@ -60,9 +60,9 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		const text = [];
 
 		text.push(
-			`${this.facility.nameCaps} is an oasis of growth in the midst of the jungle of steel and concrete that is ${V.arcologies[0].name}. Animals are kept in pens, tended to by your slaves, while ${V.farmyardUpgrades.hydroponics ?
-				`rows of hydroponics equipment` :
-				`makeshift fields`} grow crops.`,
+			`${this.facility.nameCaps} is an oasis of growth in the midst of the jungle of steel and concrete that is ${V.arcologies[0].name}. Animals are kept in pens, tended to by your slaves, while ${V.farmyardUpgrades.hydroponics
+				? `rows of hydroponics equipment`
+				: `makeshift fields`} grow crops.`,
 			this.decorations,
 		);
 
@@ -125,8 +125,11 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 	/** @returns {FC.Facilities.Expand} */
 	get expand() {
+		const slaves = this.facility.hostedSlaves;
+		const is = slaves === 1 ? `is` : `are`;
+
 		return {
-			desc: `It can support ${num(V.farmyard)} farmhands. There ${this.facility.hostedSlaves === 1 ? `is currently ${num(this.facility.hostedSlaves)} farmhand` : `are currently ${num(this.facility.hostedSlaves)} farmhands`} in ${V.farmyardName}.`,
+			desc: `It can support ${num(V.farmyard)} farmhands. There ${is} currently ${numberWithPluralOne(slaves, `farmhand`)} in ${V.farmyardName}.`,
 		};
 	}
 
@@ -151,7 +154,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 					},
 					{
 						value: 1,
-						text: `${this.facility.nameCaps} is a more efficient model, slightly improving the amount of crops it produces.`,
+						text: `The water pump in ${this.facility.name} is a more efficient model, slightly improving the amount of crops it produces.`,
 					},
 				],
 				object: V.farmyardUpgrades,
@@ -346,7 +349,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		}
 
 		if (V.farmMenialsSpace) {
-			div.append(`You ${V.menials ? `own ${num(V.menials)}` : `don't own any`} free menial slaves. ${capFirstChar(V.farmyardName)} can house ${V.farmMenialsSpace} menial slaves total, with ${V.farmMenialsSpace - V.farmMenials} free spots. `);
+			div.append(`You ${V.menials ? `own ${num(V.menials)}` : `don't own any`} free menial slaves. ${capFirstChar(V.farmyardName)} can house ${num(V.farmMenialsSpace)} menial slaves total, with ${num(V.farmMenialsSpace - V.farmMenials)} free spots. `);
 		}
 
 		if (V.farmMenialsSpace && V.farmMenials < V.farmMenialsSpace) {
@@ -360,7 +363,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 			}
 
 			if (V.menials >= 10 && V.farmMenials <= V.farmMenialsSpace - 10) {
-				links.push(App.UI.DOM.link("Transfer in 10 menial slaves", () => {
+				links.push(App.UI.DOM.link(`Transfer in ${num(10)} menial slaves`, () => {
 					V.menials -= 10;
 					V.farmMenials += 10;
 
@@ -369,7 +372,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 			}
 
 			if (V.menials >= 100 && V.farmMenials <= V.farmMenialsSpace - 100) {
-				links.push(App.UI.DOM.link("Transfer in 100 menial slaves", () => {
+				links.push(App.UI.DOM.link(`Transfer in ${num(100)} menial slaves`, () => {
 					V.menials -= 100;
 					V.farmMenials += 100;
 
@@ -378,7 +381,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 			}
 
 			if (V.menials) {
-				links.push(App.UI.DOM.link("Transfer in all free menial slaves", () => {
+				links.push(App.UI.DOM.link(`Transfer in all free menial slaves`, () => {
 					if (V.menials > V.farmMenialsSpace - V.farmMenials) {
 						V.menials -= V.farmMenialsSpace - V.farmMenials;
 						V.farmMenials = V.farmMenialsSpace;
@@ -397,7 +400,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		}
 
 		if (V.farmMenials) {
-			links.push(App.UI.DOM.link("Transfer out all menial slaves", () => {
+			links.push(App.UI.DOM.link(`Transfer out all menial slaves`, () => {
 				V.menials += V.farmMenials;
 				V.farmMenials = 0;
 
@@ -455,7 +458,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 		links = [];
 
-		if (V.farmMenialsSpace < 500) {
+		if (V.farmMenialsSpace < 2000) {
 			App.UI.DOM.appendNewElement("div", div, `There is enough room in ${V.farmyardName} to build housing, enough to give ${V.farmMenialsSpace + 100} menial slaves a place to sleep and relax.`);
 
 			App.UI.DOM.appendNewElement("div", div, App.UI.DOM.link(`Build a new housing unit`, () => {
@@ -464,7 +467,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 				this.refresh();
 			},
-			[], '', `Costs ${cashFormat(unitCost)} and increases housing by 100.`), ['indent']);
+			[], '', `Costs ${cashFormat(unitCost)} and increases housing by ${num(100)}.`), ['indent']);
 		}
 
 		return div;
@@ -477,21 +480,29 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
 
 		const CL = V.canine.length;
+		let dogs = '';
+		let canines = '';
+
+		if (CL === 1) {
+			dogs = `${V.canine[0]}s`;
 
-		const dogs = CL === 1 ?
-			`${V.canine[0]}s` :
-			CL < 3 ?
-				`several different breeds of dogs` :
-				`all kinds of dogs`;
-		const canines = CL === 1 ?
-			V.canine[0].species === "dog" ?
-				V.canine[0].breed :
-				V.canine[0].speciesPlural :
-			CL < 3 ?
-				`several different ${V.canine.every(c => c.species === "dog") ?
-					`breeds of dogs` :
-					`species of canines`}` :
-				`all kinds of canines`;
+			if (V.canine[0].species === "dog") {
+				canines = V.canine[0].name;
+			} else {
+				canines = asPlural(V.canine[0].species);
+			}
+		} else if (CL < 3) {
+			dogs = `a couple different breeds of dogs`;
+
+			if (V.canine.every(c => c.species === "dog")) {
+				canines = `a couple different breeds of dog`;
+			} else {
+				canines = `a couple different species of canine`;
+			}
+		} else {
+			dogs = `all kinds of dogs`;
+			canines = `all kinds of canines`;
+		}
 
 		if (V.farmyardKennels === 0) {
 			div.append(`There is enough room in ${V.farmyardName} to build kennels to house canines.`);
@@ -533,10 +544,10 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 		const HL = V.hooved.length;
 
-		const hooved = HL === 1 ?
-			`${V.hooved[0]}s` : HL < 3 ?
-				`several different types of hooved animals` :
-				`all kinds of hooved animals`;
+		const hooved = HL === 1
+			? `${V.hooved[0]}s` : HL < 3
+				? `several different types of hooved animals`
+				: `all kinds of hooved animals`;
 
 		if (V.farmyardStables === 0) {
 			div.append(`There is enough room in ${V.farmyardName} to build a stables to house hooved animals.`);
@@ -577,21 +588,29 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		const cost = Math.trunc(5000 * V.upgradeMultiplierArcology);
 
 		const FL = V.feline.length;
+		let cats = '';
+		let felines = '';
+
+		if (FL === 1) {
+			cats = `${V.feline[0]}s`;
+
+			if (V.feline[0].species === "cat") {
+				felines = V.feline[0].name;
+			} else {
+				felines = asPlural(V.feline[0].species);
+			}
+		} else if (FL < 3) {
+			cats = `a couple different breeds of cats`;
 
-		const cats = FL === 1 ?
-			`${V.feline[0]}s` :
-			FL < 3 ?
-				`several different breeds of cats` :
-				`all kinds of cats`;
-		const felines = FL === 1 ?
-			V.feline[0].species === "cat" ?
-				V.feline[0].breed :
-				V.feline[0].speciesPlural :
-			FL < 3 ?
-				`several different ${V.feline.every(c => c.species === "cat") ?
-					`breeds of cats` :
-					`species of felines`}` :
-				`all kinds of felines`;
+			if (V.feline.every(c => c.species === "cat")) {
+				felines = `a couple different breeds of cat`;
+			} else {
+				felines = `a couple different species of feline`;
+			}
+		} else {
+			cats = `all kinds of cats`;
+			felines = `all kinds of felines`;
+		}
 
 		if (V.farmyardCages === 0) {
 			div.append(`There is enough room in ${V.farmyardName} to build cages to house felines.`);
@@ -627,7 +646,7 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 
 	/** @returns {HTMLDivElement} */
 	get removeAnimalHousing() {
-		const div = document.createElement("div");
+		const div = App.UI.DOM.makeElement("div", null, ['margin-top']);
 
 		const cost = ((V.farmyardKennels + V.farmyardStables + V.farmyardCages) * 5000) * V.upgradeMultiplierArcology;
 
@@ -637,6 +656,14 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 				V.farmyardStables = 0;
 				V.farmyardCages = 0;
 
+				V.active.canine = null;
+				V.active.hooved = null;
+				V.active.feline = null;
+
+				V.canine = [];
+				V.hooved = [];
+				V.feline = [];
+
 				V.farmyardShows = 0;
 				V.farmyardBreeding = 0;
 				V.farmyardRestraints = 0;
@@ -674,15 +701,3 @@ App.Facilities.Farmyard.farmyard = class Farmyard extends App.Facilities.Facilit
 		];
 	}
 };
-
-App.Facilities.Farmyard.BC = function() {
-	if (typeof V.farmyardUpgrades !== "object") {
-		V.farmyardUpgrades = {
-			pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0
-		};
-	}
-
-	if (!App.Data.animals || App.Data.animals.length === 0) {
-		App.Facilities.Farmyard.animals.init();
-	}
-};
diff --git a/src/facilities/farmyard/farmyardBC.js b/src/facilities/farmyard/farmyardBC.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9bd211faa22b64205d590d110f9bbe0e09f62e5
--- /dev/null
+++ b/src/facilities/farmyard/farmyardBC.js
@@ -0,0 +1,18 @@
+// @ts-nocheck
+App.Facilities.Farmyard.BC = function () {
+	if (typeof V.farmyardUpgrades !== "object") {
+		V.farmyardUpgrades = {
+			pump: 0, fertilizer: 0, hydroponics: 0, machinery: 0, seeds: 0
+		};
+	}
+
+	if (!App.Data.animals || App.Data.animals.length === 0) {
+		App.Facilities.Farmyard.animals.init();
+	}
+
+	if (V.foodStored) {
+		V.food += V.foodStored;
+
+		delete V.foodStored;
+	}
+};
diff --git a/src/facilities/farmyard/food/food.js b/src/facilities/farmyard/food/food.js
new file mode 100644
index 0000000000000000000000000000000000000000..e155534a0788bc930b57701bc0f969f45e641add
--- /dev/null
+++ b/src/facilities/farmyard/food/food.js
@@ -0,0 +1,151 @@
+/**
+ * The amount of food a given slave produces in a week.
+ *
+ * Defaults to a menial slave if one is not provided.
+ * @param {App.Entity.SlaveState} [slave]
+ * @returns {number}
+ */
+App.Facilities.Farmyard.foodAmount = function(slave) {
+	let food = 100;
+
+	if (V.farmyardUpgrades.pump) {
+		food += 25;
+	}
+
+	if (V.farmyardUpgrades.fertilizer) {
+		food += 50;
+	}
+
+	if (V.farmyardUpgrades.seeds) {
+		food += 75;
+	}
+
+	if (V.farmyardUpgrades.machinery) {
+		food += 100;
+	}
+
+	if (S.Farmer) {
+		food *= 1.1;
+
+		if (S.Farmer.skill.farmer >= V.masteredXP) {
+			food *= 1.3;
+		}
+
+		if (App.Data.Careers.Leader.farmer.includes(S.Farmer.career)) {
+			food *= 1.2;
+		}
+	}
+
+	function slaveProduction(slave) {
+		let food = 100;
+
+		if (slave.devotion > 50) {
+			food *= 1.1;
+		} else if (slave.devotion < -50) {
+			food *= 0.8;
+		}
+
+		if (slaveResting(slave)) {
+			food *= 0.9;
+		} else if (slave.health.tired + 20 >= 90 && !willWorkToDeath(slave)) {
+			slave.devotion -= 10;
+			slave.trust -= 5;
+			food *= 0.9;
+		}
+
+		if (slave.muscles > 30) {
+			food *= 1.1;
+		} else if (slave.muscles <= -6) {
+			food *= 0.8;
+		}
+
+		if (slave.weight > 95) {
+			food *= 0.9;
+		} else if (slave.weight > 130) {
+			food *= 0.8;
+		} else if (slave.weight > 160) {
+			food *= 0.7;
+		} else if (slave.weight > 190) {
+			food *= 0.6;
+		}
+
+		if (!canSee(slave)) {
+			food *= 0.6;
+		} else if (!canSeePerfectly(slave)) {
+			food *= 0.8;
+		}
+
+		if (slave.hears === -1) {
+			food *= 0.8;
+		} else if (slave.hears < -1) {
+			food *= 0.6;
+		}
+
+		food *= restEffects(slave, 20);
+
+		return food;
+	}
+
+	function menialProduction() {
+		return food * 1.25;
+	}
+
+	if (slave) {
+		food += slaveProduction(slave);
+
+		if (V.farmyardShows) {
+			food *= 0.5;
+		}
+	} else {
+		food += menialProduction();
+	}
+
+	food = Math.trunc(Math.max(food, 0));
+
+	return food;
+};
+
+/** The total amount of food produced in a given week. */
+App.Facilities.Farmyard.foodProduction = function() {
+	function menialProduction() {
+		return V.farmMenials * App.Facilities.Farmyard.foodAmount();
+	}
+
+	function slaveProduction() {
+		return App.Entity.facilities.farmyard.employees().reduce((acc, cur) => acc + App.Facilities.Farmyard.foodAmount(cur), 0);
+	}
+
+	return menialProduction() + slaveProduction();
+};
+
+/** The total amount of food consumed in a given week. */
+App.Facilities.Farmyard.foodConsumption = function() {
+	function citizenConsumption() {
+		 return ((V.lowerClass * V.foodRate.lower) + (V.middleClass * V.foodRate.middle) +
+		 (V.upperClass * V.foodRate.upper) + (V.topClass * V.foodRate.top));
+	}
+
+	function slaveConsumption() {
+		let total = 0;
+
+		for (const slave of V.slaves) {
+			let amount = 8;
+
+			if (slave.diet === "restricted") {
+				amount = 6;
+			} else if (slave.diet === "slimming") {
+				amount = 7;
+			} else if (slave.diet === "muscle building") {
+				amount = 9;
+			} else if (slave.diet === "fattening") {
+				amount = 10;
+			}
+
+			total += amount;
+		}
+
+		return total;
+	}
+
+	return citizenConsumption() + slaveConsumption();
+};
diff --git a/src/facilities/farmyard/food/foodAmount.js b/src/facilities/farmyard/food/foodAmount.js
deleted file mode 100644
index 5051a0f219b1fa3b6458c84c742f298fcaa5db10..0000000000000000000000000000000000000000
--- a/src/facilities/farmyard/food/foodAmount.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @param {App.Entity.SlaveState} slave
- * @returns {number}
- */
-App.Facilities.Farmyard.foodAmount = function(slave) {
-	let food = 150;
-
-	if (!slave) {
-		throw Error(`Current slave is not valid. Please report this`);
-	}
-
-	if (V.farmyardUpgrades.pump) {
-		food += 15;
-	}
-
-	if (V.farmyardUpgrades.fertilizer) {
-		food += 35;
-	}
-
-	if (V.farmyardUpgrades.seeds) {
-		food += 65;
-	}
-
-	if (V.farmyardUpgrades.machinery) {
-		food += 65;
-	}
-
-	if (S.Farmer) {
-		food *= 1.1;
-
-		if (S.Farmer.skill.farmer >= V.masteredXP) {
-			food *= 1.2;
-		}
-
-		if (App.Data.Careers.Leader.farmer.includes(S.Farmer.career)) {
-			food *= 1.2;
-		}
-	}
-
-	if (slave.devotion > 50) {
-		food *= 1.1;
-	} else if (slave.devotion < -50) {
-		food *= 0.8;
-	}
-
-	if (slaveResting(slave)) {
-		food *= 0.9;
-	} else if (slave.health.tired + 20 >= 90 && !willWorkToDeath(slave)) {
-		slave.devotion -= 10;
-		slave.trust -= 5;
-		food *= 0.9;
-	}
-
-	if (slave.muscles > 30) {										// slave is muscular or more
-		food *= 1.1;
-	} else if (slave.muscles <= -6) {								// slave is weak or less
-		food *= 0.8;
-	}
-
-	if (slave.weight > 95) {										// slave is overweight or more
-		food *= 0.9;
-	} else if (slave.weight > 130) {								// slave is fat or more
-		food *= 0.8;
-	} else if (slave.weight > 160) {								// slave is obese or more
-		food *= 0.7;
-	} else if (slave.weight > 190) {								// slave is very obese or more
-		food *= 0.6;
-	}
-
-	if (!canSee(slave)) {											// slave is blind
-		food *= 0.6;
-	} else if (!canSeePerfectly(slave)) {							// slave is nearsighted
-		food *= 0.8;
-	}
-
-	if (slave.hears === -1) {										// slave is hard of hearing
-		food *= 0.8;
-	} else if (slave.hears < -1) {									// slave is deaf
-		food *= 0.6;
-	}
-
-	food *= restEffects(slave, 20);
-	food = Math.trunc(Math.max(food, 1));
-
-	return food;
-};
diff --git a/src/facilities/farmyard/food/foodMarket.js b/src/facilities/farmyard/food/foodMarket.js
index 4973a58e1841d611be5f918996dd5e87cb8f5200..f7012b653492c0a97b77ead0962079d58d0a5ab4 100644
--- a/src/facilities/farmyard/food/foodMarket.js
+++ b/src/facilities/farmyard/food/foodMarket.js
@@ -1,115 +1,116 @@
 App.UI.foodMarket = function() {
-	const node = new DocumentFragment();
+	const frag = new DocumentFragment();
 	const quantities = new Set([1, 10, 100, 1000, 10000, 100000]);
 
-	if (V.useTabs === 0) {
-		App.UI.DOM.appendNewElement("h2", node, "The Food Market");
-	}
-
-	const foodValue = Math.round((V.foodStored * V.farmyardFoodCost + Number.EPSILON) * 100) / 100;
 	const maxFood = Math.trunc(V.cash / V.farmyardFoodCost);
-	App.Events.addParagraph(node, [
-		`The food market has`,
-		App.UI.DOM.makeElement("span", massFormat(V.foodStored), "food"),
-		`in storage, valued at a total of`,
-		App.UI.DOM.makeElement("span", `${cashFormat(foodValue)}.`, "yellowgreen"),
-	]);
-
-	// Buy
-	let linkArray = [];
-	for (const q of quantities) {
-		linkArray.push(App.UI.DOM.link(
-			massFormat(q),
-			() => {
-				cashX(forceNeg(V.farmyardFoodCost * q), "farmyard");
-				V.foodStored += q;
-				App.UI.reload();
-			}
-		));
-	}
-	linkArray.push(App.UI.DOM.link(
-		"max",
-		() => {
-			cashX(forceNeg(maxFood * V.farmyardFoodCost), "farmyard");
-			V.foodStored += maxFood;
-			App.UI.reload();
-		}
-	));
 
-	App.Events.addNode(node, ["Buy", App.UI.DOM.generateLinksStrip(linkArray)], "div");
-	linkArray = [];
+	frag.append(
+		overview(),
+		buy(),
+		sell(),
+		remove(),
+	);
 
+	return frag;
 
-	// Sell
-	if (V.foodStored > 0) {
-		for (const q of quantities) {
-			linkArray.push(App.UI.DOM.link(
-				massFormat(q),
-				() => {
-					cashX(V.farmyardFoodCost * q, "farmyard");
-					V.foodStored += q;
-					App.UI.reload();
-				}
-			));
+	function overview() {
+		const div = document.createElement("div");
+		const text = new SpacedTextAccumulator(div);
+
+		const foodValue = Math.trunc(V.food * V.farmyardFoodCost);
+		const citizens = V.lowerClass + V.middleClass + V.upperClass + V.topClass;
+
+		if (V.useTabs === 0) {
+			App.UI.DOM.appendNewElement("h2", div, "The Food Market");
 		}
-		linkArray.push(App.UI.DOM.link(
-			"max",
-			() => {
-				cashX((V.farmyardFoodCost*V.foodStored), "farmyard");
-				V.foodStored = 0;
-				App.UI.reload();
-			}
-		));
-		App.Events.addNode(node, ["Sell", App.UI.DOM.generateLinksStrip(linkArray)], "div");
-		linkArray = [];
+
+		text.push(`The food market has <span class="food">${massFormat(V.food)}</span> in storage, valued at a total of ${cashFormat(foodValue)}.`);
+
+		if (V.food > App.Facilities.Farmyard.foodConsumption()) {
+			text.push(`This is enough to provide for ${numberWithPluralOne(V.slaves.length, `slave`)} and ${numberWithPluralOne(citizens, `citizen`)} for about ${numberWithPluralOne(Math.trunc(V.food / App.Facilities.Farmyard.foodConsumption()), `week`)}.`);
+		} else if (V.food < App.Facilities.Farmyard.foodConsumption()) {
+			text.push(`This will not be enough to provide for ${numberWithPluralOne(V.slaves.length, `slave`)} and ${numberWithPluralOne(citizens, `citizen`)} during the upcoming week.`);
+		}
+
+		text.toChildren();
+
+		return div;
 	}
 
-	// Store
-	if (V.food > 0) {
+	function buy() {
+		const div = document.createElement("div");
+		const links = [];
+
+		div.append(`Buy `);
+
 		for (const q of quantities) {
-			linkArray.push(App.UI.DOM.link(
+			links.push(App.UI.DOM.link(
 				massFormat(q),
 				() => {
-					V.foodStored += q;
-					V.food -= q;
+					cashX(forceNeg(V.farmyardFoodCost * q), "farmyard");
+					V.food += q;
 					App.UI.reload();
 				}
 			));
 		}
-		linkArray.push(App.UI.DOM.link(
+		links.push(App.UI.DOM.link(
 			"max",
 			() => {
-				V.foodStored += V.food;
-				V.food = 0;
+				cashX(forceNeg(maxFood * V.farmyardFoodCost), "farmyard");
+				V.food += maxFood;
 				App.UI.reload();
 			}
 		));
-		App.Events.addNode(node, ["Store", App.UI.DOM.generateLinksStrip(linkArray)], "div");
-		linkArray = [];
+
+		div.append(App.UI.DOM.generateLinksStrip(links));
+
+		return div;
 	}
 
-	// Retrieve
-	if (V.foodStored > 0) {
-		for (const q of quantities) {
-			linkArray.push(App.UI.DOM.link(
-				massFormat(q),
+	function sell() {
+		const div = document.createElement("div");
+		const links = [];
+
+		div.append(`Sell `);
+
+		if (V.food > 0) {
+			for (const q of quantities) {
+				links.push(App.UI.DOM.link(
+					massFormat(q),
+					() => {
+						cashX(V.farmyardFoodCost * q, "farmyard");
+						V.food += q;
+						App.UI.reload();
+					}
+				));
+			}
+			links.push(App.UI.DOM.link(
+				"max",
 				() => {
-					V.foodStored -= q;
-					V.food += q;
+					cashX((V.farmyardFoodCost * V.food), "farmyard");
+					V.food = 0;
 					App.UI.reload();
 				}
 			));
 		}
-		linkArray.push(App.UI.DOM.link(
-			"max",
-			() => {
-				V.food += V.foodStored;
-				V.foodStored = 0;
-				App.UI.reload();
-			}
-		));
-		App.Events.addNode(node, ["Retrieve", App.UI.DOM.generateLinksStrip(linkArray)], "div");
+
+		div.append(App.UI.DOM.generateLinksStrip(links));
+
+		return div;
 	}
 
-	return node;
+	function remove() {
+		const div = document.createElement("div");
+
+		div.append(
+			`You can remove the food market entirely and let your citizens fend for themselves, if you wish.`,
+			App.UI.DOM.makeElement("div", App.UI.DOM.link(`Dismantle`, () => {
+				V.foodMarket = 0;
+				repX(forceNeg(8500), "food");
+				App.UI.reload();
+			}, [], '', `Your citizens WILL hate you for this.`), ['indent']),
+		);
+
+		return div;
+	}
 };
diff --git a/src/facilities/farmyard/food/foodReport.js b/src/facilities/farmyard/food/foodReport.js
index cd0d4d3ad9efca3b8fdf5ef7aaf3035ec7a4dfaa..88d9c689e47e7ec78884c51f2efceba709caa923 100644
--- a/src/facilities/farmyard/food/foodReport.js
+++ b/src/facilities/farmyard/food/foodReport.js
@@ -1,3 +1,20 @@
 App.UI.foodReport = function() {
-	return `${V.arcologies[0].name} produced ${massFormat(V.foodLastWeek)} of food this week. Blah blah write some more stuff here.`;
+	const text = [];
+	const farmhands = App.Entity.facilities.farmyard.hostedSlaves;
+	const slaveAmount = App.Entity.facilities.farmyard.employees().reduce((acc, cur) => acc + App.Facilities.Farmyard.foodAmount(cur), 0);
+	const menialAmount = V.farmMenials * App.Facilities.Farmyard.foodAmount();
+	const total = slaveAmount + menialAmount;
+
+	text.push(`${V.arcologies[0].name} produced ${massFormat(total)} of food this week.`);
+
+	if (slaveAmount > 0) {
+		text.push(`${V.farmMenials ? capFirstChar(massFormat(slaveAmount)) : `All of it`} was produced by your ${num(farmhands)} farmhands`);
+	}
+	if (menialAmount > 0) {
+		text.push(`${slaveAmount > 0 ? text.pop() + `, and ${massFormat(total - slaveAmount)}` : `All of it`} was produced by ${num(V.farmMenials)} menial slaves`);
+	}
+
+	text.push(text.pop() + `.`);
+
+	return text.join(' ');
 };
diff --git a/src/facilities/farmyard/shows/farmShowsIncome.js b/src/facilities/farmyard/shows/farmShowsIncome.js
index cc50267b80f41ac7a89bdfe6d23397e6c66dc336..693f3eca2a9e6d22f3b783c89263f09afb3600e0 100644
--- a/src/facilities/farmyard/shows/farmShowsIncome.js
+++ b/src/facilities/farmyard/shows/farmShowsIncome.js
@@ -10,7 +10,7 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 	const behavioralQuirks = ["sinful"];
 	const fetishes = ["humiliation", "masochist"];
 
-	let cash = 7500;
+	let cash = 25;
 
 	if (!slave) {
 		return null;
@@ -240,7 +240,7 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				repX(-5, "shows");
 			}
 
-			if (slave.muscles > 30) {								// slave is muscular or more
+			if (slave.muscles > 30) {
 				cash *= 1.1;
 			} else {
 				cash *= 0.9;
@@ -248,19 +248,13 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 		}
 
 		if (arcology.FSHedonisticDecadence !== "unset") {
-			if (slave.weight > 10) {								// slave is curvy or more
+			if (slave.weight > 10) {
 				cash *= 1.1;
 			} else {
 				cash *= 0.9;
 			}
 		}
 
-		if (arcology.FSChattelReligionist !== "unset") { 			// TODO: I don't know what to put for this one
-			if (slave.devotion < 21) { 								// if slave is careful or less
-				cash *= 0.9;
-			}
-		}
-
 		if (arcology.FSPetiteAdmiration !== "unset") {
 			if (heightPass(slave)) {
 				cash *= 1.1;
@@ -281,59 +275,49 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 			}
 		}
 
-		if (arcology.FSRomanRevivalist !== "unset") {
-			// TODO:
-		}
-
-		if (arcology.FSAztecRevivalist !== "unset") {
-			// TODO:
-		}
-
-		if (arcology.FSEgyptianRevivalist !== "unset") {
-			// TODO:
-		}
-
-		if (arcology.FSEdoRevivalist !== "unset") {
-			// TODO:
-		}
+		// Virginity
 
-		if (arcology.FSArabianRevivalist !== "unset") {
-			// TODO:
-		}
+		if (V.seeBestiality) {
+			if (slave.devotion > 50 &&
+				(slave.vagina === 0 && canDoVaginal(slave)) ||
+				(slave.anus === 0 && canDoAnal(slave))) {
+				cash *= 2.5;
 
-		if (arcology.FSChineseRevivalist !== "unset") {
-			// TODO:
+				if (slave.vagina === 0) {
+					slave.vagina = 1;
+				} else {
+					slave.anus = 1;
+				}
+			}
 		}
 
-		// Close FS Effects
+		// Careers
 
 		if (App.Data.Careers.General.entertainment.includes(slave.career)) {
 			cash *= 1.1;
 		}
 
-		// FIXME: can slaves' careers overlap categories?
 		if (App.Data.Careers.Leader.farmer.includes(slave.career)) {
 			cash *= 1.1;
 		}
 
-		if (slave.prestige === 1) { 								// slave is prestigious
-			cash *= 1.1;
-		} else if (slave.prestige === 2) { 							// slave is very prestigious
-			cash *= 1.5;
-		} else if (slave.prestige === 3) { 							// slave is extremely prestigious
-			cash *= 1.9;
+		if (slave.prestige === 1) {
+			cash *= 1.2;
+		} else if (slave.prestige === 2) {
+			cash *= 1.6;
+		} else if (slave.prestige === 3) {
+			cash *= 2.1;
 		}
 
-		if (slave.porn.prestige === 1) { 							// slave is prestigious from porn
+		if (slave.porn.prestige === 1) {
 			cash *= 1.1;
-		} else if (slave.porn.prestige === 2) { 					// slave is very prestigious from porn
+		} else if (slave.porn.prestige === 2) {
 			cash *= 1.4;
-		} else if (slave.porn.prestige === 3) { 					// slave is extremely prestigious from porn
-			cash *= 1.7;
+		} else if (slave.porn.prestige === 3) {
+			cash *= 1.8;
 		}
 
-		// FIXME: needed when using healthPenalty()?
-		if (slave.health.condition > 50) {							// slave is very healthy or more
+		if (slave.health.condition > 50) {
 			cash *= 1.2;
 		} else if (slave.health.condition < -20) {
 			cash *= 0.9;
@@ -341,31 +325,31 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 
 		// TODO: add checks for family and relationships
 
-		if (slave.face > 40) {										// slave is beautiful or more
+		if (slave.face > 40) {
 			cash *= 1.4;
-		} else if (slave.face > 10) {								// slave is very pretty or more
+		} else if (slave.face > 10) {
 			cash *= 1.1;
-		} else if (slave.face < -10) {								// slave is less than unattractive
+		} else if (slave.face < -10) {
 			cash *= 0.9;
-		} else if (slave.face < -40) {								// slave is less than ugly
+		} else if (slave.face < -40) {
 			cash *= 0.7;
 		}
 
-		setSlaveDevotion(cash);
-		setSlaveTrust(cash);
+		cash *= devotion(cash);
 
-		if (slave.weight > 30) { 									// slave is curvy or more
+		if (slave.weight > 30) {
 			if (arcology.FSHedonisticDecadence !== "unset") {
 				cash *= 0.8;
 			}
-		} else if (slave.weight < -30) { 							// slave is very thin or less
-			cash *= 0.8;											// TODO: put this on a scale
+			// TODO: put this on a scale
+		} else if (slave.weight < -30) {
+			cash *= 0.8;
 		}
 
 		// FIXME: marked for rewrite
-		if (slave.muscles > 30) { 									// slave is muscular or more
+		if (slave.muscles > 30) {
 			cash *= 0.9;
-		} else if (slave.muscles < -30) {							// slave is very weak or less
+		} else if (slave.muscles < -30) {
 			cash *= 0.6;
 		}
 
@@ -382,28 +366,28 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 		}
 
 		if (isPreg(slave)) {
-			cash *= 0.8;											// TODO: not sure how to incorporate pregnancy
+			cash *= 0.8;
 		}
 		// TODO: incorporate skills
 		cash *= healthPenalty(slave);
 
-		if (slave.intelligence > 50) {								// slave is very smart or better
+		if (slave.intelligence > 50) {
 			cash *= 1.4;
-		} else if (slave.intelligence < -50) {						// slave is very slow or less
+		} else if (slave.intelligence < -50) {
 			cash *= 0.6;
 		}
 
-		if (slave.energy > 95) {									// slave is a nymphomaniac
+		if (slave.energy > 95) {
 			cash *= 1.5;
-		} else if (slave.energy > 80) {								// slave has powerful sex drive
+		} else if (slave.energy > 80) {
 			cash *= 1.3;
-		} else if (slave.energy > 60) {								// slave has good sex drive
+		} else if (slave.energy > 60) {
 			cash *= 1.1;
-		} else if (slave.energy > 40) {								// slave has average sex drive
+		} else if (slave.energy > 40) {
 			cash *= 0.9;
-		} else if (slave.energy > 20) {								// slave has poor sex drive
+		} else if (slave.energy > 20) {
 			cash *= 0.8;
-		} else {													// slave has no sex drive
+		} else {
 			cash *= 0.6;
 		}
 
@@ -414,13 +398,13 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 					if (slave.fetishKnown) {
 						cash *= 1.1;
 					} else {
-						slave.fetishKnown = jsRandom(1, 100) > 80 ? 1 : 0;
+						slave.fetishKnown = random(1, 100) > 80 ? 1 : 0;
 					}
 				} else {
 					if (slave.fetishKnown) {
 						cash *= 0.9;
 					} else {
-						slave.fetishKnown = jsRandom(1, 100) > 80 ? 1 : 0;
+						slave.fetishKnown = random(1, 100) > 80 ? 1 : 0;
 					}
 				}
 				break;
@@ -466,18 +450,34 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				break;
 		}
 
-		return cash;
+
+		if (V.policies.bestialityOpenness > 0) {
+			cash *= 1.75;
+		}
+
+		setSlaveDevotion();
+		setSlaveTrust();
+
+		return Math.max(cash, 0);
 	}
 
-	function setSlaveDevotion(amount) {
-		const slaveApproves = () =>
+	function devotion(amount) {
+		if (slave.devotion > 50) {
+			amount *= 1.4;
+		} else if (slave.devotion < -50) {
+			amount *= 0.6;
+		}
+
+		return amount;
+	}
+
+	function setSlaveDevotion() {
+		const slaveApproves =
 			sexualQuirks.includes(slave.sexualQuirk) ||
 			behavioralQuirks.includes(slave.behavioralQuirk) ||
 			fetishes.includes(slave.fetish);
 
 		if (slave.devotion > 50) {
-			amount *= 1.5;
-
 			if (V.seeBestiality) {
 				if (slaveApproves) {
 					slave.devotion += 2;
@@ -502,8 +502,6 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				}
 			}
 		} else if (slave.devotion < -50) {
-			amount *= 0.5;
-
 			if (V.seeBestiality) {
 				if (slaveApproves) {
 					slave.devotion++;
@@ -528,19 +526,15 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				}
 			}
 		}
-
-		return amount;
 	}
 
-	function setSlaveTrust(amount) {
-		const slaveApproves = () =>
+	function setSlaveTrust() {
+		const slaveApproves =
 			sexualQuirks.includes(slave.sexualQuirk) ||
 			behavioralQuirks.includes(slave.behavioralQuirk) ||
 			fetishes.includes(slave.fetish);
 
 		if (slave.trust > 50) {
-			amount *= 1.2;
-
 			if (V.seeBestiality) {
 				if (slaveApproves) {
 					slave.trust += 2;
@@ -565,8 +559,6 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				}
 			}
 		} else if (slave.trust < -50) {
-			amount *= slave.devotion > 50 ? 1.2 : 0.9;
-
 			if (V.seeBestiality) {
 				if (slaveApproves) {
 					slave.trust++;
@@ -591,11 +583,5 @@ App.Facilities.Farmyard.farmShowsIncome = function(slave) {
 				}
 			}
 		}
-
-		if (V.policies.bestialityOpenness > 0) {
-			amount *= 1.75;
-		}
-
-		return amount;
 	}
 };
diff --git a/src/facilities/farmyard/shows/saFarmyardShows.js b/src/facilities/farmyard/shows/saFarmyardShows.js
index 6d1271cd86c1985957dd3290977c722338898061..c0551e09d405870a698f6a1c4125c8b6453f7950 100644
--- a/src/facilities/farmyard/shows/saFarmyardShows.js
+++ b/src/facilities/farmyard/shows/saFarmyardShows.js
@@ -13,13 +13,15 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 
 	const heavyMods = SlaveStatsChecker.modScore(slave).total > 20;
 
-	let r = [];
+	const r = [];
 
-	incomeStats.income += App.Facilities.Farmyard.farmShowsIncome(slave);
+	if (V.seeBestiality) {
+		seX(slave, "bestiality", "animal", "bestiality", random(35, 65));
+	}
 
 	r.push(`${He} also puts on shows with animals this week.`);
 
-	// Open FS Subsection
+	// FS
 
 	if (arcology.FSSupremacist !== "unset") {
 		if (isSuperiorRace(slave)) {
@@ -38,10 +40,13 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 			if (V.seeBestiality) {
 				r.push(`Society <span class="reputation inc">approves</span> of the degradation you submit your ${arcology.FSSubjugationistRace} slaves to, and so ${he} earns you a bit more.`);
 			} else {
+				// FIXME: Type 'FC.NoObject' is not assignable to type 'string'.
 				r.push(`Fewer people want to go see ${addA(arcology.FSSubjugationistRace)} slave put on a show, and so ${he} doesn't earn as much as ${he} otherwise could.`);
 			}
 		} else {
-			r.push(`Society doesn't disapprove of ${him} not being ${arcology.FSSubjugationistRace}, but ${he} doesn't earn as much as ${he} would if ${he} was.`);
+			if (V.seeBestiality) {
+				r.push(`Society doesn't disapprove of ${him} not being ${arcology.FSSubjugationistRace}, but ${he} doesn't earn as much as ${he} would if ${he} was.`);
+			}
 		}
 	}
 
@@ -165,7 +170,6 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		}
 	}
 
-	// FIXME: marked for possible rewrite
 	if (arcology.FSAssetExpansionist !== "unset") {
 		if (isStacked(slave)) {
 			r.push(`Society <span class="reputation inc">approves</span> of the fact that you respect their ideals in using a slave with larger assets.`);
@@ -182,32 +186,22 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		}
 	}
 
-	// FIXME: marked for review
 	if (arcology.FSPhysicalIdealist !== "unset") {
 		if (genderLawPass(slave)) {
 			r.push(`The fact that ${slave.slaveName} has what is considered the ideal form also <span class="reputation inc">helps ${him} attract attention,</span> and so ${he} earns a bit more.`);
 		} else {
-			r.push(`${His} form isn't exactly what ${arcology.name}'s citizens consider ideal, and so ${he} doesn't <span class="reputation dec">earn as much.</span>`);
+			r.push(`${His} form isn't exactly what ${arcology.name}'s citizens consider ideal, and so ${he} doesn't <span class="reputation dec">earn as much</span> as ${he} could have otherwise.`);
 		}
 	}
 
-	// FIXME: marked for rewrite
 	if (arcology.FSHedonisticDecadence !== "unset") {
 		if (slave.weight > 10) {
-			r.push(`Since ${slave.slaveName} is large enough for ${arcology.name}'s citizens, ${he} earns slightly more.`);
+			r.push(`Since ${slave.slaveName} is large enough to please ${arcology.name}'s citizens, ${he} earns slightly more.`);
 		} else {
 			r.push(`${He} doesn't earn quite as much ${he} would have if ${he} was a bit larger in size.`);
 		}
 	}
 
-	if (arcology.FSChattelReligionist !== "unset") {
-		if (slave.devotion <= 20) {
-			// TODO: write this
-		} else {
-			// TODO: write this
-		}
-	}
-
 	if (arcology.FSPetiteAdmiration !== "unset") {
 		if (heightPass(slave)) {
 			r.push(`The fact that you are using such small slaves <span class="reputation inc">pleases your citizens.</span>`);
@@ -224,31 +218,17 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		}
 	}
 
-	if (arcology.FSRomanRevivalist !== "unset") {
-		// TODO:
-	}
-
-	if (arcology.FSAztecRevivalist !== "unset") {
-		// TODO:
-	}
-
-	if (arcology.FSEgyptianRevivalist !== "unset") {
-		// TODO:
-	}
-
-	if (arcology.FSEdoRevivalist !== "unset") {
-		// TODO:
-	}
+	// Virginity
 
-	if (arcology.FSArabianRevivalist !== "unset") {
-		// TODO:
-	}
-
-	if (arcology.FSChineseRevivalist !== "unset") {
-		// TODO:
+	if (V.seeBestiality) {
+		if (slave.devotion > 50 &&
+			(slave.vagina === 0 && canDoVaginal(slave)) ||
+			(slave.anus === 0 && canDoAnal(slave))) {
+			r.push(`${slave.slaveName} promised the crowd ${he} would allow one of your animals to deflower ${him} onstage <span class="cash inc">if they all donated enough ¤,</span> and ${he} stayed true to ${his} word – <span class="virginity loss">${his} tight little ${slave.vagina === 0 ? `pussy` : `ass`} has been broken in.</span>`);
+		}
 	}
 
-	// Close FS Subsection
+	// Careers
 
 	if (App.Data.Careers.General.entertainment.includes(slave.career)) {
 		r.push(`${He} has experience with putting on shows from ${his} life before ${he} was a slave, making ${him} more effective at putting on shows.`);
@@ -258,12 +238,14 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`${He} ${App.Data.Careers.General.entertainment.includes(slave.career) ? `also` : ``} has experience in working with animals from ${his} life before ${he} was a slave, making ${him} more effective at putting on shows.`);
 	}
 
+	// Prestige
+
 	if (slave.prestige === 1) {
-		r.push(`Because some of your citizens already know of ${him}, ${he} earns more.`);
+		r.push(`Your citizens are so eager to see someone they recognize ${V.seeBestiality ? `be ${V.farmyardBreeding ? `bred` : `rutted`} by an animal` : `put on shows with an animal`} that they are willing to pay a bit more.`);
 	} else if (slave.prestige === 2) {
-		r.push(`Because a lot of your citizens already know of ${him}, ${he} earns quite a bit more.`);
+		r.push(`Your citizens are so eager to see someone well-known ${V.seeBestiality ? `be ${V.farmyardBreeding ? `bred` : `rutted`} by an animal` : `put on shows with an animal`} that they are willing to pay a fair bit more.`);
 	} else if (slave.prestige === 3) {
-		r.push(`Because ${he} is so famous, ${he} earns a lot more then ${he} would otherwise.`);
+		r.push(`Your citizens are so eager to see someone so famous ${V.seeBestiality ? `be ${V.farmyardBreeding ? `bred` : `rutted`} by an animal` : `put on shows with an animal`} that they are willing to pay much more.`);
 	}
 
 	if (slave.porn.prestige === 1) {
@@ -274,6 +256,8 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`${He} earns a lot more because ${he} is so famous from porn.`);
 	}
 
+	// Health
+
 	if (slave.health.condition > 50) {
 		r.push(`${He} is in such excellent health that ${he} is able to put on longer and more energetic shows, earning you more.`);
 	} else if (slave.health.condition < -20) {
@@ -307,7 +291,6 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		}
 	}
 
-	// FIXME: marked for rewrite
 	if (slave.weight > 30) {
 		if (arcology.FSHedonisticDecadence === "unset") {
 			r.push(`Your citizens are not willing to pay as much to see such a fat slave put on shows, so ${he} loses some income.`);
@@ -316,9 +299,7 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`Your citizens don't like watching such a sickly-looking slaves put on shows, so ${he} loses some income.`);
 	}
 
-	if (slave.muscles > 30) {
-		// TODO: write this - do we want something for muscles?
-	} else if (slave.muscles < -30) {
+	if (slave.muscles < -30) {
 		r.push(`${slave.slaveName} is so weak that ${he} cannot even properly handle the animals ${he}'s assigned to ${V.seeBestiality ? `fuck` : `work with`}, and isn't able to put on any sort of meaningful show.`);
 	}
 
@@ -330,7 +311,6 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`${His} ${slave.hears < -1 ? `lack of` : `poor`} hearing makes it difficult for ${him} to hear what ${his} audience wants from ${him}, which really affects ${his} earnings.`);
 	}
 
-	// FIXME: marked for rewrite
 	if (isPreg(slave)) {
 		r.push(`${His}${slave.bellyPreg > 100000 ? ` advanced` : ``} pregnancy makes it more difficult for him to effectively put on a good show.`);
 	}
@@ -359,7 +339,6 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`The fact that ${his} sex drive is nonexistent really hinders ${his} ability to put on a decent show.`);
 	}
 
-	// TODO: add more to the fetishes and flaws / quirks
 	switch (slave.fetish) {
 		case "submissive":
 			if (V.seeBestiality) {
@@ -380,12 +359,8 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		case "humiliation":
 			if (V.seeBestiality) {
 				if (slave.fetishKnown) {
-					r.push(`${slave.slaveName} uses the most of this humiliating experience to really put on a show, to <span class="reputation inc">the approval of ${his} audience.</span>`);
-				} else {
-					// TODO:
+					r.push(`${slave.slaveName} uses the most of this humiliating experience to really put on a show, to <span class="reputation inc">the approval of ${his} audience</span>.`);
 				}
-			} else {
-				// TODO: not sure about this one
 			}
 			break;
 
@@ -437,5 +412,7 @@ App.Facilities.Farmyard.putOnShows = function(slave) {
 		r.push(`Society's acceptance of and enthusiasm towards bestiality earns ${him} quite a bit more than ${he} would have made otherwise.`);
 	}
 
+	incomeStats.income += Math.trunc(App.Facilities.Farmyard.farmShowsIncome(slave));
+
 	return r.join(' ');
 };
diff --git a/src/gui/options/options.js b/src/gui/options/options.js
index f728219ef1fd59dd8220bd5a16f86f5fdf4f5375..3bdf43ca72eb385a6145ce2127e9a75b73634993 100644
--- a/src/gui/options/options.js
+++ b/src/gui/options/options.js
@@ -749,12 +749,12 @@ App.UI.optionsPassage = function() {
 
 		options.addOption("Food is", "food", V.experimental)
 			.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
-			.addComment("This will enable the experimental food supply and demand system, as well as a new farmyard building and assignments.");
+			.addComment("This will enable the experimental food supply and demand system.");
 
 		if (V.seeExtreme === 1 && V.seeBestiality === 1) {
 			options.addOption("Animal Ovaries are", "animalOvaries", V.experimental)
 				.addValue("Enabled", 1).on().addValue("Disabled", 0).off()
-				.addComment("This will allow slaves to be impregnated by animals.");
+				.addComment("This will allow slaves to be impregnated by animals. Not currently implemented.");
 		}
 
 		if (V.seeExtreme === 1) {
diff --git a/src/gui/storyCaption.js b/src/gui/storyCaption.js
index ccaf995fc6c594712bae39a21cd84fc439dc4645..6b226bacd8e183b83c8f10d261a8de3ba613f307 100644
--- a/src/gui/storyCaption.js
+++ b/src/gui/storyCaption.js
@@ -164,13 +164,8 @@ App.UI.storyCaption = function() {
 		const fragment = document.createDocumentFragment();
 
 		const foodDiv = document.createElement("div");
-		V.food = Math.trunc(V.food);
-		V.foodConsumption = Math.trunc((V.lowerClass * V.foodRate.lower) +
-			(V.middleClass * V.foodRate.middle) +
-			(V.upperClass * V.foodRate.upper) +
-			(V.topClass * V.foodRate.top));
 		/* check if there is enough food for the next week */
-		if (V.food > V.foodConsumption) {
+		if (V.food > App.Facilities.Farmyard.foodConsumption()) {
 			App.UI.DOM.appendNewElement("span", foodDiv, "Food", "chocolate");
 		} else {
 			App.UI.DOM.appendNewElement("span", foodDiv, "Food", "red");
diff --git a/src/interaction/budgets/recordTemplates.js b/src/interaction/budgets/recordTemplates.js
index a233b29bb49fe0167d2a62de0b79ccdcd225e898..dfc9618022c4b6454e3f48c98d6c692a3497332e 100644
--- a/src/interaction/budgets/recordTemplates.js
+++ b/src/interaction/budgets/recordTemplates.js
@@ -134,6 +134,9 @@ App.Data.Records.LastWeeksCash = function() {
 	this.event = 0; // poker night etc. Try to file things elsewhere if you can.
 	this.war = 0;
 
+	// Policies
+	this.food = 0;
+
 	this.rents = 0;
 
 	this.cheating = 0;
diff --git a/src/interaction/siRecords.js b/src/interaction/siRecords.js
index 707849bcb38af95567bbeae0e1a96efb7e849552..bcc3a112ecc39068f1143019514acdd36dfa6e53 100644
--- a/src/interaction/siRecords.js
+++ b/src/interaction/siRecords.js
@@ -200,14 +200,17 @@ App.UI.SlaveInteract.records = function(slave, refresh) {
 
 		for (let i = 0; i < ownedSlaves.length; i++) {
 			const innerSpan = document.createElement("span");
-			const slave = getSlave(ownedSlaves[i]);
+			const target = getSlave(ownedSlaves[i]);
 
 			innerSpan.style.display = 'inline-block';	// hack to prevent span breaking line and giving unusable tooltip
 			innerSpan.style.marginRight = '4px';
 
 			if (ownedSlaves.length > 1) {
 				if (i === ownedSlaves.length - 1) {
-					innerSpan.append(` and `, App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)));
+					innerSpan.append(
+						` and `,
+						contextualIntro(slave, target, true),
+					);
 
 					if (unownedSlaves > 0) {
 						innerSpan.append(`, as well as ${numberWithPlural(unownedSlaves, 'slave')} you don't currently own`);
@@ -215,7 +218,7 @@ App.UI.SlaveInteract.records = function(slave, refresh) {
 
 					innerSpan.append(`.`);
 				} else {
-					innerSpan.append(App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)));
+					innerSpan.append(contextualIntro(slave, target, true));
 
 					if (ownedSlaves.length > 2) {
 						innerSpan.append(`, `);
@@ -223,7 +226,7 @@ App.UI.SlaveInteract.records = function(slave, refresh) {
 				}
 			} else {
 				innerSpan.append(
-					App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)),
+					contextualIntro(slave, target, true, true),
 					`.`,
 				);
 			}
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 4b580692dd901f194bf01a227e1fcdd4c0fd2b35..3a55f4b21048acd86b24fb2dcc669b977c5eb9c2 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -692,6 +692,12 @@ globalThis.calculateCosts = (function() {
 
 	function getFarmyardCosts() {
 		const facility = V.farmyard * V.facilityCost;
+		const exotic = V.canine.filter(c => c.rarity === "exotic").length +
+			V.hooved.filter(h => h.rarity === "exotic").length +
+			V.feline.filter(f => f.rarity === "exotic").length;
+		const domestic = V.canine.filter(c => c.rarity === "domestic").length +
+			V.hooved.filter(h => h.rarity === "domestic").length +
+			V.feline.filter(f => f.rarity === "domestic").length;
 		return (
 			(
 				(facility) +
@@ -699,7 +705,7 @@ globalThis.calculateCosts = (function() {
 				(0.2 * V.farmyardUpgrades.hydroponics * facility) +
 				(0.2 * V.farmyardUpgrades.seeds * facility) -
 				(0.4 * V.farmyardUpgrades.machinery * facility)
-			) * 2
+			) * 2 + (exotic * 100) + (domestic * 10)
 		);
 	}
 
diff --git a/src/js/utilsMisc.js b/src/js/utilsMisc.js
index f6ca90d42ba205b4f760a0ebc22c397472d2b2c8..c86994a239e3d63a503696624e6715a83991c150 100644
--- a/src/js/utilsMisc.js
+++ b/src/js/utilsMisc.js
@@ -246,7 +246,7 @@ App.Utils.totalNetWorth = function() {
 		.filter(f => f.established)
 		.reduce((acc, cur) => acc + cur.value, 0);
 
-	total += Math.round(((V.foodStored + V.food) * V.farmyardFoodCost + Number.EPSILON) * 100) / 100;
+	total += Math.trunc(V.food * V.farmyardFoodCost);
 
 	total += App.SF.totalNetWorth();
 	total -= App.SecExp.upkeep.cost();
diff --git a/src/npc/descriptions/genericDescriptions.js b/src/npc/descriptions/genericDescriptions.js
index 35706f785b18f403f358e1034730369d3eb7ab86..a77951663f201e853eca308852d59706bc5ddd26 100644
--- a/src/npc/descriptions/genericDescriptions.js
+++ b/src/npc/descriptions/genericDescriptions.js
@@ -1,16 +1,22 @@
 /**
- * @example const beautiful = beautiful(slave); `The slave's ${beautiful} face.`
  * @param {App.Entity.SlaveState} slave
  * @returns {string}
+ * @example
+ * const _beautiful = beautiful(slave);
+ *
+ * `The slave's ${_beautiful} face.`
  */
 globalThis.beautiful = function(slave) {
 	return slave.genes === "XX" ? `beautiful` : `handsome`;
 };
 
 /**
- * @example const pretty = pretty(slave); `The slave's ${pretty} face.`
  * @param {App.Entity.SlaveState} slave
  * @returns {string}
+ * @example
+ * const _pretty = pretty(slave);
+ *
+ * `The slave's ${_pretty} face.`
  */
 globalThis.pretty = function(slave) {
 	return slave.genes === "XX" ? `pretty` : `good-looking`;
diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js
index 4f6aa8ed612fbcf74f4e033959405e9e53d15b29..186e05181fcb7a24d1e06b3d55d59b015abbd631 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1184,7 +1184,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			slave.origin = "You bought $him from a wetware CPU farm, $his body ruined but $his mind subjected to a simulated career.";
 			slave.devotion = 40;
 			slave.trust = -100;
-			slave.career = jsEither(["a business owner", "a college scout", "a counselor", "a dairy worker", "a doctor", "a house DJ", "a politician", "a prison guard", "a secretary", "a soldier", "a teacher", "a lawyer"]);
+			slave.career = jsEither(["a business owner", "a college scout", "a counselor", "a dairy worker", "a doctor", "a house DJ", "a politician", "a prison guard", "a secretary", "a soldier", "a teacher", "a lawyer", "a farmer"]);
 			slave.intelligence = Intelligence.random({limitIntelligence: [50, 100]});
 			slave.intelligenceImplant = 30;
 			setHealth(slave, jsRandom(-50, -10), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(10, 4), 0), Math.max(normalRandInt(0), 0), 0);
@@ -1257,6 +1257,9 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				case "a teacher":
 					slave.slaveName = "WCPU-TE";
 					break;
+				case "a farmer":
+					slave.slaveName = "WCPU-FA";
+					break;
 			}
 			slave.slaveSurname = `#${slave.skill.vaginal}${slave.skill.oral}${slave.skill.anal}${slave.skill.whoring}${slave.skill.entertainment}-${slave.intelligence} `;
 			slave.birthName = "";
diff --git a/src/npc/interaction/fAnimal.js b/src/npc/interaction/fAnimal.js
index 0f622a0fa633d1fb592549dfb555565a043899c5..c6770d34488587feaf0aac82a66f435c2b33de61 100644
--- a/src/npc/interaction/fAnimal.js
+++ b/src/npc/interaction/fAnimal.js
@@ -571,8 +571,6 @@ App.Interact.fAnimal = function(slave, type) {
 	// Text Functions
 
 	function slaveGainsFlaw() {
-		const text = [];
-
 		switch (act) {
 			case Acts.ORAL:
 				if (slave.sexualFlaw !== "hates oral") {
@@ -601,13 +599,9 @@ App.Interact.fAnimal = function(slave, type) {
 			default:
 				throw new Error(`Unexpected act type '${act}' in fAnimal().`);
 		}
-
-		return text.join(' ');
 	}
 
 	function slaveGainsQuirk() {
-		const text = [];
-
 		if (slave.fetish === "none") {
 			if (random(1, 100) > 90) {	// 10% chance of gaining fetish
 				/** @type {FC.Fetish[]} */
@@ -686,8 +680,6 @@ App.Interact.fAnimal = function(slave, type) {
 				}
 			}
 		}
-
-		return text.join(' ');
 	}
 
 	// Virginity Check Functions
diff --git a/src/player/desc/pLongBoobs.js b/src/player/desc/pLongBoobs.js
index 294d8bbca6cfa7ed877b1011491789a917917709..7bcda31cf2391aa2a8908c213a3d0f5c2845c1be 100644
--- a/src/player/desc/pLongBoobs.js
+++ b/src/player/desc/pLongBoobs.js
@@ -371,7 +371,7 @@ App.Desc.Player.boobs = function(PC = V.PC) {
 			if (V.boobAccessibility === 1) {
 				r.push(`On the bright side, you've had the penthouse remodeled for ${girlP}s with such substantial bosoms already, so fitting through doors and using furniture isn't a concern.`);
 			} else {
-				r.push(`Even worse, the penthouse was not designed to handle ${girlP}s with bosoms as substantial as yours; you crowd whichever halls or doors you use and find an uncomfortable number of objects poking and proding your tits.`);
+				r.push(`Even worse, the penthouse was not designed to handle ${girlP}s with bosoms as substantial as yours; you crowd whichever halls or doors you use and find an uncomfortable number of objects poking and prodding your tits.`);
 			}
 		}
 		return r.join(" ");
diff --git a/src/player/desc/pLongCrotch.js b/src/player/desc/pLongCrotch.js
index 1bcfccc49ee83d1e391bc3756603f451db1ca33b..0449d0f4a9c19d489ce099f38c4e884c97a48971 100644
--- a/src/player/desc/pLongCrotch.js
+++ b/src/player/desc/pLongCrotch.js
@@ -357,7 +357,7 @@ App.Desc.Player.crotch = function(PC = V.PC) {
 					} else if (foreskinRatio === 1) {
 						r.push(`swallowed up by your foreskin.`);
 					} else {
-						r.push(`situated snuggly in your foreskin.`);
+						r.push(`situated snugly in your foreskin.`);
 					}
 				}
 			}
@@ -622,7 +622,7 @@ App.Desc.Player.crotch = function(PC = V.PC) {
 			(PC.balls >= 60 + (PC.muscles * 0.5) && PC.physicalAge <= 12) ||
 			(PC.balls >= 90 + (PC.muscles * 0.7))
 		) {
-			r.push(`Unfortunately, they've become so ponderous that you have to cart them along when you want to move anywere; they effectively act as a pair of anchors otherwise.`);
+			r.push(`Unfortunately, they've become so ponderous that you have to cart them along when you want to move anywhere; they effectively act as a pair of anchors otherwise.`);
 		}
 		return r.join(" ");
 	}
@@ -1112,10 +1112,8 @@ App.Desc.Player.crotch = function(PC = V.PC) {
 	function urethralFluids() {
 		const r = [];
 		const ballSize = (
-			PC.balls > 2
-				? "cramped"
-				: PC.balls === 1
-					? "tiny"
+			PC.balls > 2 ? "cramped"
+				: PC.balls === 1 ? "tiny"
 					: ""
 		);
 
diff --git a/src/player/desc/pLongDescription.js b/src/player/desc/pLongDescription.js
index 556f99bd7d92c7868fc9838c3fe985492407a796..48a175c2f1573d7250e8ac68077af4555115fc82 100644
--- a/src/player/desc/pLongDescription.js
+++ b/src/player/desc/pLongDescription.js
@@ -58,7 +58,7 @@ App.Desc.Player.longDescription = function(PC = V.PC) {
 	} else if (PC.belly >= 100000 || PC.weight > 160) {
 		r.push(`You shift your weight and make use of some angled mirrors to see your crotch beneath your belly.`);
 	} else if (PC.dick === 0 && PC.vagina === -1) {
-		r.push(`You turn your attention to your nether reqion.`);
+		r.push(`You turn your attention to your nether regions.`);
 	} else if (PC.dick > 0) {
 		r.push(`You turn your attention to your most valuable asset, your crotch.`);
 	} else {
diff --git a/src/player/js/PlayerState.js b/src/player/js/PlayerState.js
index d527b42f1a79d8b60bdd2714e6103eef1496eb8f..f11ed16acd972375d15b25f9f5b93c9324354535 100644
--- a/src/player/js/PlayerState.js
+++ b/src/player/js/PlayerState.js
@@ -948,6 +948,7 @@ App.Entity.PlayerState = class PlayerState {
 		this.pregAdaptation = 50;
 		/**
 		 * Ovary implant type.
+		 * @type {number|string}
 		 *
 		 * * 0: no implants
 		 * * "fertility": higher chance of twins (or more)
diff --git a/src/player/managePersonalAffairs.js b/src/player/managePersonalAffairs.js
index 1dfecc86216931726ca64bf489c9a2f641fc6e71..1b86620a4652a50978abb1486b1ee57a104266ef 100644
--- a/src/player/managePersonalAffairs.js
+++ b/src/player/managePersonalAffairs.js
@@ -688,7 +688,7 @@ App.UI.managePersonalAffairs = function() {
 					if (i === ownedSlaves.length - 1) {
 						innerSpan.append(
 							` and `,
-							App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)),
+							contextualIntro(PC, slave, true),
 						);
 
 						if (unownedSlaves > 0) {
@@ -697,7 +697,7 @@ App.UI.managePersonalAffairs = function() {
 
 						innerSpan.append(`.`);
 					} else {
-						innerSpan.append(App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)));
+						innerSpan.append(contextualIntro(PC, slave, true),);
 
 						if (ownedSlaves.length > 2) {
 							innerSpan.append(`, `);
@@ -705,7 +705,7 @@ App.UI.managePersonalAffairs = function() {
 					}
 				} else {
 					innerSpan.append(
-						App.UI.DOM.referenceSlaveWithPreview(slave, SlaveFullName(slave)),
+						contextualIntro(PC, slave, true, true),
 						`.`,
 					);
 				}