diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index db845b3033fccf77a7ae46a53c8ec92b5058c49e..f5b6d0ec4d9c533b559da8b06716eaea09bc2c1b 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -526,6 +526,7 @@ App.Data.resetOnNGPlus = {
 	lastWeeksRepIncome: {},
 	lastWeeksRepExpenses: {},
 	lastWeeksRepProfits: {},
+	lastWeeksGatheredTotals: {},
 	currentRule: {},
 	costs: 0,
 	seeBuilding: 0,
diff --git a/src/endWeek/minorInjuryResponse.js b/src/endWeek/minorInjuryResponse.js
index 5292e976a7cf915cc5673db3ca7fa34287943bfe..8c210ddf521d8e226a9c47037557a658fb9200ec 100644
--- a/src/endWeek/minorInjuryResponse.js
+++ b/src/endWeek/minorInjuryResponse.js
@@ -7,38 +7,68 @@ window.minorInjuryResponse = function minorInjuryResponse(slave) {
 	const arcologyUpgrade = State.variables.arcologyUpgrade;
 	const {he, himself, He} = getPronouns(slave);
 	let r = "";
+	let trackedCategory = "";
 
-	if (arcology.FSDegradationist > 20) {
-		r += ` ${He} carries on, knowing that in your degradationist arcology, this is accepted behavior.`;
-	} else if (arcology.FSPaternalist > 20) {
-		if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) {
-			r += ` The security drones successfully detain him and oblige him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
-			cashX(50, "slaveUpkeep", slave);
-		} else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) {
-			r += ` The computer systems successfully detain him and require him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
-			cashX(50, "slaveUpkeep", slave);
-		} else if (slave.skill.whoring > jsRandom(1, 100)) {
-			r += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
-			cashX(50, "slaveUpkeep", slave);
-		} else if (slave.skill.combat > 0) {
-			r += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
-			cashX(50, "slaveUpkeep", slave);
-		}
-	} else {
-		if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) {
-			r += ` The security drones successfully detain him and oblige him to pay minor <span class="yellowgreen">compensation.</span>`;
-			cashX(10, "slaveUpkeep", slave);
-		} else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) {
-			r += ` The computer systems successfully detain him and require him to pay minor <span class="yellowgreen">compensation.</span>`;
-			cashX(10, "slaveUpkeep", slave);
-		} else if (slave.skill.whoring > jsRandom(1, 100)) {
-			r += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay minor <span class="yellowgreen">compensation.</span>`;
-			cashX(10, "slaveUpkeep", slave);
-		} else if (slave.skill.combat > 0) {
-			r += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay minor <span class="yellowgreen">compensation.</span>`;
-			cashX(10, "slaveUpkeep", slave);
+	switch (slave.assignment) {
+		case window.Job.WHORE:
+			trackedCategory = "slaveAssignmentWhore";
+			break;
+		case window.Job.MADAM:
+			trackedCategory = "slaveAssignmentMadam";
+			break;
+		case window.Job.BROTHEL:
+			trackedCategory = "slaveAssignmentBrothel"
+			break;
+		case window.Job.PUBLIC:
+			trackedCategory = "slaveAssignmentPublic"
+			break;
+		case window.Job.DJ:
+			trackedCategory = "slaveAssignmentDj";
+			break;
+		case window.Job.CLUB:
+			trackedCategory = "slaveAssignmentClub";
+			break;
+		default:
+			trackedCategory = "slaveAssignmentUndefined";
+			break;
+	}
+	r = responseWithTracking(slave, trackedCategory);
+	
+	function responseWithTracking(s, category) {
+		let o = "";
+		if (arcology.FSDegradationist > 20) {
+			o += ` ${He} carries on, knowing that in your degradationist arcology, this is accepted behavior.`;
+		} else if (arcology.FSPaternalist > 20) {
+			if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) {
+				o += ` The security drones successfully detain him and oblige him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
+				cashX(50, category, slave);
+			} else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) {
+				o += ` The computer systems successfully detain him and require him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
+				cashX(50, category, slave);
+			} else if (slave.skill.whoring > jsRandom(1, 100)) {
+				o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
+				cashX(50, category, slave);
+			} else if (slave.skill.combat > 0) {
+				o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
+				cashX(50, category, slave);
+			}
+		} else {
+			if (arcologyUpgrade.drones === 1 && jsRandom(1, 100) > 50) {
+				o += ` The security drones successfully detain him and oblige him to pay minor <span class="yellowgreen">compensation.</span>`;
+				cashX(10, category, slave);
+			} else if (arcologyUpgrade.grid === 1 && jsRandom(1, 100) > 50) {
+				o += ` The computer systems successfully detain him and require him to pay minor <span class="yellowgreen">compensation.</span>`;
+				cashX(10, category, slave);
+			} else if (slave.skill.whoring > jsRandom(1, 100)) {
+				o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay minor <span class="yellowgreen">compensation.</span>`;
+				cashX(10, category, slave);
+			} else if (slave.skill.combat > 0) {
+				o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay minor <span class="yellowgreen">compensation.</span>`;
+				cashX(10, category, slave);
+			}
 		}
+		return o;
 	}
-
+	
 	return r;
 };
diff --git a/src/endWeek/saGetMilked.js b/src/endWeek/saGetMilked.js
index 59c4379858f07357f12c2f409fc62b691a289a89..9c513255cbbe2836e336e6b3d28ccff32f0a8593 100644
--- a/src/endWeek/saGetMilked.js
+++ b/src/endWeek/saGetMilked.js
@@ -72,18 +72,16 @@ window.saGetMilked = (function saGetMilked() {
 			return cash;
 		} else {
 			mentalEffects(slave);
-			if (V.showVignettes === 1 && (slave.assignment === "get milked" || slave.assignment === "work in the dairy")) {
+			if (V.showVignettes === 1 && (slave.assignment === window.Job.MILKED || slave.assignment === window.Job.DAIRY)) {
 				assignmentVignette(slave);
 			}
-			if (slave.assignment === "work in the dairy") {
+			if (slave.assignment === window.Job.MILKED) {
+				cashX(cash, "slaveAssignmentMilked", slave);
+			} else if (slave.assignment === window.Job.DAIRY) {
 				applyFSDecoration();
-			}
-			if (slave.assignment === "work in the dairy") {
-				cashX(cash, "milkedDairy", slave);
-			} else if (slave.assignment === "get milked") {
-				cashX(cash, "milked", slave);
+				cashX(cash, "slaveAssignmentDairy", slave);
 			} else {
-				cashX(cash, "extraMilk", slave);
+				cashX(cash, "slaveAssignmentExtraMilk", slave);
 			}
 			// These are a pain. They are usually called immediately after this function. Could possibly return an object instead.
 			V.cum = cum;
@@ -102,7 +100,7 @@ window.saGetMilked = (function saGetMilked() {
 	function gatherStatistics(slave) {
 		/* Statistics gathering */
 		let facility;
-		if (slave.assignment === Job.DAIRY) {
+		if (slave.assignment === window.Job.DAIRY) {
 			facility = V.facility.dairy;
 		}
 		T.incomeStats = getSlaveStatisticData(slave, facility);
@@ -117,8 +115,8 @@ window.saGetMilked = (function saGetMilked() {
 	function jobPreface(slave) {
 		r += `gets milked this week.`;
 		if (V.dairy > 0 && V.dairyRestraintsSetting < 2) {
-			if ((V.universalRulesFacilityWork === 1 && slave.assignment === "get milked" && V.dairySpots > 0) || (slave.assignment === "work in the dairy")) {
-				if (slave.assignment === "get milked") {
+			if ((V.universalRulesFacilityWork === 1 && slave.assignment === window.Job.MILKED && V.dairySpots > 0) || (slave.assignment === window.Job.DAIRY)) {
+				if (slave.assignment === window.Job.MILKED) {
 					r += ` Since there's extra space in ${V.dairyName}, ${he} spends most of ${his} milkings there.`;
 					V.dairySpots -= 1; // Would this need to be pulled for statistics gathering?
 				}
@@ -793,7 +791,7 @@ window.saGetMilked = (function saGetMilked() {
 	 * @param {App.Entity.SlaveState} slave
 	 * */
 	function mentalEffects(slave) {
-		if (slave.assignment === "get milked" || (slave.assignment === "work in the dairy" && V.dairyRestraintsSetting < 2)) {
+		if (slave.assignment === window.Job.MILKED || (slave.assignment === window.Job.DAIRY && V.dairyRestraintsSetting < 2)) {
 			if (slave.behavioralQuirk === "fitness") {
 				r += ` ${slave.slaveName} <span class="devotion inc">privately enjoys</span> the focus on ${his} health and fitness that comes with being a cow.`;
 				slave.devotion += 1;
@@ -817,12 +815,20 @@ window.saGetMilked = (function saGetMilked() {
 			} else {
 				r += `an incident without lasting effect.`;
 			}
-			if (slave.assignment === "work in the dairy") {
-				cashX(cashVign, "milkedDairy", slave);
-			} else if (slave.assignment === "get milked") {
-				cashX(cashVign, "milked", slave);
+			if (slave.assignment === window.Job.MILKED) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentMilkedVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentMilkedVign", slave);
+				}
+			} else if (slave.assignment === window.Job.DAIRY) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentDairyVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentDairyVign", slave);
+				}
 			} else {
-				cashX(cashVign, "extraMilk", slave);
+				cashX(cashVign, "slaveAssignmentExtraMilkVign", slave);
 			}
 			T.incomeStats.income += cashVign;
 		} else if (vignette.type === "devotion") {
diff --git a/src/endWeek/saNanny.js b/src/endWeek/saNanny.js
index c900cf17ea1cd0b10697bf1e73c28d0790100aaf..ab67f1e354bf758fc26e41842e0e1100023a36e5 100644
--- a/src/endWeek/saNanny.js
+++ b/src/endWeek/saNanny.js
@@ -114,7 +114,7 @@ window.saNanny = function saNanny(slave) {
 	function nannyVignettes(slave) {
 		let t = '';
 
-		if (V.showVignettes === 1 && (slave.assignment === Job.NANNY)) {
+		if (V.showVignettes === 1 && (slave.assignment === window.Job.NANNY)) {
 			const vignette = GetVignette(slave);
 			t += ` <u>This week</u> ${vignette.text} `;
 
@@ -136,12 +136,13 @@ window.saNanny = function saNanny(slave) {
 			let modifier = FResult(slave);
 			if (vignette.effect > 0) {
 				t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(modifier * vignette.effect))}.</span>`;
+				cashX(Math.trunc(modifier * vignette.effect), "slaveAssignmentNurseryVign", slave);
 			} else if (vignette.effect < 0) {
 				t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(modifier * vignette.effect)))}.</span>`;
+				cashX(forceNeg(Math.trunc(modifier * vignette.effect)), "slaveAssignmentNurseryVign", slave);
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			cashX(Math.trunc(modifier * vignette.effect), "houseServant", slave);
 		}
 
 		return t;
diff --git a/src/endWeek/saRest.js b/src/endWeek/saRest.js
index 25b162bbc304788ae3f7af2910628a2e08a53151..dfb6d41cd547316bbad89d14335f9ed85cff1754 100644
--- a/src/endWeek/saRest.js
+++ b/src/endWeek/saRest.js
@@ -80,7 +80,7 @@ window.saRest = function saRest(slave) {
 		t += `,</span> ${his} body appreciates being allowed to rest.`;
 	}
 	if (slave.health.tired > 30) {
-		if (slave.assignment === "rest in the spa") {
+		if (slave.assignment === window.Job.SPA) {
 			if (V.spaUpgrade > 0) {
 				t += ` ${V.spaNameCaps}'s luxuries help ${him} relax.`;
 			}
@@ -91,22 +91,23 @@ window.saRest = function saRest(slave) {
 	}
 	tired(slave);
 
-	if (V.showVignettes === 1 && slave.assignment === Job.REST) {
-		const _vignette = GetVignette(slave),
+	if (V.showVignettes === 1 && slave.assignment === window.Job.REST) {
+		const vignette = GetVignette(slave),
 		FResultNumber = FResult(slave);
 
-		t += ` <span class="story-label">This week</span> ${_vignette.text} `;
-		if (_vignette.type === "cash") {
-			if (_vignette.effect > 0) {
-				t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(FResultNumber * _vignette.effect))}.</span>`;
-			} else if (_vignette.effect < 0) {
-				t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * _vignette.effect)))}.</span>`;
+		t += ` <span class="story-label">This week</span> ${vignette.text} `;
+		if (vignette.type === "cash") {
+			if (vignette.effect > 0) {
+				t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(FResultNumber * vignette.effect))}.</span>`;
+				cashX(Math.trunc(FResultNumber * vignette.effect), "slaveAssignmentRestVign", slave);
+			} else if (vignette.effect < 0) {
+				t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * vignette.effect)))}.</span>`;
+				cashX(forceNeg(Math.trunc(FResultNumber * vignette.effect)), "slaveAssignmentRestVign", slave);
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			cashX(Math.trunc(FResultNumber * _vignette.effect), "rest", slave);
-		} else if (_vignette.type === "devotion") {
-			if (_vignette.effect > 0) {
+		} else if (vignette.type === "devotion") {
+			if (vignette.effect > 0) {
 				if (slave.devotion > 50) {
 					t += `<span class="devotion inc">increasing ${his} devotion to you.</span>`;
 				} else if (slave.devotion >= -20) {
@@ -116,7 +117,7 @@ window.saRest = function saRest(slave) {
 				} else {
 					t += `<span class="devotion inc">reducing ${his} hatred of you.</span>`;
 				}
-			} else if (_vignette.effect < 0) {
+			} else if (vignette.effect < 0) {
 				if (slave.devotion > 50) {
 					t += `<span class="devotion dec">reducing ${his} devotion to you.</span>`;
 				} else if (slave.devotion >= -20) {
@@ -129,9 +130,9 @@ window.saRest = function saRest(slave) {
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			slave.devotion += (1 * _vignette.effect);
-		} else if (_vignette.type === "trust") {
-			if (_vignette.effect > 0) {
+			slave.devotion += (1 * vignette.effect);
+		} else if (vignette.type === "trust") {
+			if (vignette.effect > 0) {
 				if (slave.trust > 20) {
 					t += `<span class="trust inc">increasing ${his} trust in you.</span>`;
 				} else if (slave.trust > -10) {
@@ -139,7 +140,7 @@ window.saRest = function saRest(slave) {
 				} else {
 					t += `<span class="trust inc">reducing ${his} terror of you.</span>`;
 				}
-			} else if (_vignette.effect < 0) {
+			} else if (vignette.effect < 0) {
 				if (slave.trust > 20) {
 					t += `<span class="trust dec">reducing ${his} trust in you.</span>`;
 				} else if (slave.trust >= -20) {
@@ -150,26 +151,26 @@ window.saRest = function saRest(slave) {
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			slave.trust += (1 * _vignette.effect);
-		} else if (_vignette.type === "health") {
-			if (_vignette.effect > 0) {
+			slave.trust += (1 * vignette.effect);
+		} else if (vignette.type === "health") {
+			if (vignette.effect > 0) {
 				t += `<span class="health inc">improving ${his} health.</span>`;
-				improveCondition(slave, 2 * _vignette.effect);
-			} else if (_vignette.effect < 0) {
+				improveCondition(slave, 2 * vignette.effect);
+			} else if (vignette.effect < 0) {
 				t += `<span class="health dec">affecting ${his} health.</span>`;
-				healthDamage(slave, 2 * _vignette.effect);
+				healthDamage(slave, 2 * vignette.effect);
 			} else {
 				t += `an incident without lasting effect.`;
 			}
 		} else {
-			if (_vignette.effect > 0) {
+			if (vignette.effect > 0) {
 				t += `<span class="reputation inc">gaining you a bit of reputation.</span>`;
-			} else if (_vignette.effect < 0) {
+			} else if (vignette.effect < 0) {
 				t += `<span class="reputation dec">losing you a bit of reputation.</span>`;
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			repX((FResultNumber * _vignette.effect * 0.1), "vignette", slave);
+			repX((FResultNumber * vignette.effect * 0.1), "vignette", slave);
 		}
 	}
 
diff --git a/src/endWeek/saServant.js b/src/endWeek/saServant.js
index a58056f0b9dadc95ff11b69561c6286fa85fb0f8..f3d84925a20ce9c1e3328066f7ab85cbce7f37ab 100644
--- a/src/endWeek/saServant.js
+++ b/src/endWeek/saServant.js
@@ -13,8 +13,8 @@ window.saServant = function saServant(slave) {
 	let t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`;
 
 	if (V.servantsQuarters > 0) {
-		if ((V.universalRulesFacilityWork === 1 && slave.assignment === "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment === "work as a servant")) {
-			if (slave.assignment === "be a servant") {
+		if ((V.universalRulesFacilityWork === 1 && slave.assignment === window.Job.HOUSE && V.servantsQuartersSpots > 0) || (slave.assignment === window.Job.SERVANT)) {
+			if (slave.assignment === window.Job.HOUSE) {
 				t += ` Since there's extra space in the servants' quarters, ${V.assistant.name} attaches ${him} to the cadre of maids there.`;
 				V.servantsQuartersSpots--;
 			}
@@ -31,14 +31,23 @@ window.saServant = function saServant(slave) {
 					t += `uses <span class="devotion inc">sex as a reward,</span> getting ${him} off when ${he} <span class="cash inc">works harder.</span>`;
 					slave.devotion++;
 				}
+				// Portion that calculates upkeep reduction, we call it income
+				let cash = 0;
 				if (!(canHear(slave))) {
 					t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`;
-					cashX(V.stewardessBonus / 4 * healthPenalty(slave), "houseServant", slave);
+					cash = V.stewardessBonus / 4 * healthPenalty(slave);
 				} else if ((slave.hears === -1 && slave.earwear !== "hearing aids") || (slave.hears === 0 && slave.earwear === "muffling ear plugs")) {
 					t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`;
-					cashX(V.stewardessBonus / 2 * healthPenalty(slave), "houseServant", slave);
+					cash = V.stewardessBonus / 2 * healthPenalty(slave);
 				} else {
-					cashX(V.stewardessBonus * healthPenalty(slave), "houseServant", slave);
+					cash = V.stewardessBonus * healthPenalty(slave);
+				}
+				if (slave.assignment === window.Job.HOUSE) {
+					cashX(cash, "incomeSlaveHouse", slave);
+				} else  if (slave.assignment === window.Job.SERVANT) {
+					cashX(cash, "incomeSlaveServant", slave);
+				} else {
+					cashX(cash, "serving income in an unregistered building", slave);
 				}
 			}
 		}
@@ -140,19 +149,38 @@ window.saServant = function saServant(slave) {
 		}
 	}
 
-	if (V.showVignettes === 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) {
+	if (V.showVignettes === 1 && (slave.assignment === window.Job.SERVANT || slave.assignment === window.Job.HOUSE)) {
 		const vignette = GetVignette(slave);
 		t += ` <span class="story-label">This week</span> ${vignette.text} `;
 		if (vignette.type === "cash") {
 			let modifier = FResult(slave);
+			const cashVign = Math.trunc(modifier * vignette.effect);
 			if (vignette.effect > 0) {
-				t += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(modifier * vignette.effect))}.</span>`;
+				t += `<span class="cash inc">making you an extra ${cashFormat(cashVign)}.</span>`;
 			} else if (vignette.effect < 0) {
-				t += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(modifier * vignette.effect)))}.</span>`;
+				t += `<span class="cash dec">losing you ${cashFormat(Math.abs(cashVign))}.</span>`;
 			} else {
 				t += `an incident without lasting effect.`;
 			}
-			cashX(Math.trunc(modifier * vignette.effect), "houseServant", slave);
+			if (slave.assignment === window.Job.HOUSE) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentServerVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentHouseVign", slave);
+				}
+			} else  if (slave.assignment === window.Job.SERVANT) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentServantVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentServantVign", slave);
+				}
+			} else {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "vignette serving income in an unregistered building", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "vignette serving expense in an unregistered building", slave);
+				}
+			}
 		} else if (vignette.type === "devotion") {
 			if (vignette.effect > 0) {
 				if (slave.devotion > 50) {
diff --git a/src/endWeek/saServeThePublic.js b/src/endWeek/saServeThePublic.js
index b80a5c654998f06da8c31548e6076f82ff778a42..44d4e71eb4a0cec28b6feed96d4173ae2de1ac01 100644
--- a/src/endWeek/saServeThePublic.js
+++ b/src/endWeek/saServeThePublic.js
@@ -1497,19 +1497,38 @@ window.saServeThePublic = (function saServeThePublic() {
 	 */
 	function assignmentVignette(slave) {
 		let vignette;
-		if (slave.assignment !== "recruit girls") {
+		if (slave.assignment !== window.Job.RECRUITER) {
 			vignette = GetVignette(slave);
 			r += ` <span class="story-label">This week</span> ${vignette.text} `;
 			if (vignette.type === "cash") {
+				const cashVign = Math.trunc(slave.sexQuality * vignette.effect);
 				if (vignette.effect > 0) {
-					r += `<span class="cash inc">making you an extra ${cashFormat(Math.trunc(slave.sexQuality * vignette.effect))}.</span>`;
+					r += `<span class="cash inc">making you an extra ${cashFormat(cashVign)}.</span>`;
 				} else if (vignette.effect < 0) {
-					r += `<span class="cash dec">losing you ${cashFormat(Math.abs(Math.trunc(slave.sexQuality * vignette.effect)))}.</span>`;
+					r += `<span class="cash dec">losing you ${cashFormat(Math.abs(cashVign))}.</span>`;
 				} else {
 					r += `an incident without lasting effect.`;
 				}
-				cashX(Math.trunc(slave.sexQuality * vignette.effect), "publicServant", slave);
-				T.incomeStats.rep += Math.trunc(slave.sexQuality * vignette.effect);
+				if (slave.assignment === window.Job.PUBLIC) {
+					if (vignette.effect > 0) {
+						cashX(cashVign, "slaveAssignmentPublicVign", slave);
+					} else if (vignette.effect < 0) {
+						cashX(forceNeg(cashVign), "slaveAssignmentPublicVign", slave);
+					}
+				} else  if (slave.assignment === window.Job.CLUB) {
+					if (vignette.effect > 0) {
+						cashX(cashVign, "slaveAssignmentClubVign", slave);
+					} else if (vignette.effect < 0) {
+						cashX(forceNeg(cashVign), "slaveAssignmentClubVign", slave);
+					}
+				} else {
+					if (vignette.effect > 0) {
+						cashX(cashVign, "vignette public sexslave income in an unregistered building", slave);
+					} else if (vignette.effect < 0) {
+						cashX(forceNeg(cashVign), "vignette public sexslave expense in an unregistered building", slave);
+					}
+				}
+				T.incomeStats.income += cashVign;
 			} else if (vignette.type === "devotion") {
 				if (vignette.effect > 0) {
 					if (slave.devotion > 50) {
diff --git a/src/endWeek/saWhore.js b/src/endWeek/saWhore.js
index 13482fd9d874aa2f1ddf82f59619e8a8730eb51d..733c022ed7be826d845990f1ba1192a32c253861 100644
--- a/src/endWeek/saWhore.js
+++ b/src/endWeek/saWhore.js
@@ -307,7 +307,7 @@ window.saWhore = (function saWhore() {
 			r += ` ${slave.slaveName} sees ${his} role as helping people with their sexual needs, and ${he} <span class="trust inc">trusts that ${his} place</span> in society is an important one.`;
 			slave.trust += 1;
 		}
-		if (slave.assignment === "work in the brothel" && slave.devotion > 50) {
+		if (slave.assignment === window.Job.BROTHEL && slave.devotion > 50) {
 			r += ` Being so far from your presence <span class="mediumorchid">weakens ${his} intense devotion to you.</span>`;
 		}
 	}
@@ -317,7 +317,7 @@ window.saWhore = (function saWhore() {
 	 */
 	function physicalEffects(slave) {
 		let injury = 0;
-		if (slave.assignment !== "work in the brothel") {
+		if (slave.assignment !== window.Job.BROTHEL) {
 			if (slave.curatives > 0 || slave.inflationType === "curative") {
 				r += ` The drugs `;
 				if (slave.inflationType === "curative") {
@@ -1308,14 +1308,14 @@ window.saWhore = (function saWhore() {
 			cash = Math.trunc(whoreScore * V.whorePriceAdjustment.lowerClass);
 			slave.sexQuality = Math.trunc(slave.sexQuality);
 		}
-		if (slave.assignment === "work in the brothel") {
-			cashX(cash, "whoreBrothel", slave);
-		} else if (slave.assignment === "be the Madam") {
-			cashX(cash, "whoreBrothel", slave);
-		} else if (slave.assignment === "whore") {
-			cashX(cash, "whore", slave);
+		if (slave.assignment === window.Job.WHORE) {
+			cashX(cash, "slaveAssignmentWhore", slave);
+		} else if (slave.assignment === window.Job.MADAM) {
+			cashX(cash, "slaveAssignmentMadam", slave);
+		} else if (slave.assignment === window.Job.BROTHEL) {
+			cashX(cash, "slaveAssignmentBrothel", slave);
 		} else {
-			cashX(cash, "whoring in an unregistered building", slave);
+			cashX(cash, "whoring income in an unregistered building", slave);
 		}
 		T.incomeStats.income += cash;
 	}
@@ -1588,14 +1588,30 @@ window.saWhore = (function saWhore() {
 			} else {
 				r += `an incident without lasting effect.`;
 			}
-			if (slave.assignment === "work in the brothel") {
-				cashX(cashVign, "whoreBrothel", slave);
-			} else if (slave.assignment === "be the Madam") {
-				cashX(cash, "whoreBrothel", slave);
-			} else if (slave.assignment === "whore") {
-				cashX(cashVign, "whore", slave);
+			if (slave.assignment === window.Job.WHORE) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentWhoreVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentWhoreVign", slave);
+				}
+			} else if (slave.assignment === window.Job.MADAM) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentMadamVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentMadamVign", slave);
+				}
+			} else if (slave.assignment === window.Job.BROTHEL) {
+				if (vignette.effect > 0) {
+					cashX(cashVign, "slaveAssignmentBrothelVign", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "slaveAssignmentBrothelVign", slave);
+				}
 			} else {
-				cashX(cashVign, "whoring in an unregistered building", slave);
+				if (vignette.effect > 0) {
+					cashX(cashVign, "vignette whoring income in an unregistered building", slave);
+				} else if (vignette.effect < 0) {
+					cashX(forceNeg(cashVign), "vignette whoring expense in an unregistered building", slave);
+				}
 			}
 			T.incomeStats.income += cashVign;
 		} else if (vignette.type === "devotion") {
diff --git a/src/endWeek/saWorkAGloryHole.js b/src/endWeek/saWorkAGloryHole.js
index 65255f46f31314c67bc67ef1c08529be9396e368..a04e53f5970ba94ec61501881d484c1dd3b09d89 100644
--- a/src/endWeek/saWorkAGloryHole.js
+++ b/src/endWeek/saWorkAGloryHole.js
@@ -50,7 +50,7 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() {
 	 */
 	function gatherStatistics(slave) {
 		/* Statistics gathering */
-		const facility = slave.assignment === Job.ARCADE ? V.facility.arcade : undefined;
+		const facility = slave.assignment === window.Job.ARCADE ? V.facility.arcade : undefined;
 		T.incomeStats = getSlaveStatisticData(slave, facility);
 		T.incomeStats.customers = beauty;
 	}
@@ -310,7 +310,7 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() {
 	 */
 	function applyFSDecoration(slave) {
 		/* FACILITY DECORATION IMPACTS */
-		if (slave.assignment === "be confined in the arcade" && V.arcadeDecoration !== "standard") {
+		if (slave.assignment === window.job.ARCADE && V.arcadeDecoration !== "standard") {
 			const impact = (0.0001 * V.FSSingleSlaveRep * beauty);
 			switch (V.arcadeDecoration) {
 				case "Roman Revivalist":
@@ -510,26 +510,22 @@ window.saWorkAGloryHole = (function saWorkAGloryHole() {
 	 *
 	 */
 	function profitReport(slave) {
+		let cash = 0;
 		if (V.publicFuckdolls === 0) {
-			if (slave.assignment === "work a glory hole") {
-				cashX(Math.trunc(beauty * FResult), "gloryhole", slave);
-			} else if (slave.assignment === "be confined in the arcade") {
-				cashX(Math.trunc(beauty * FResult), "gloryholeArcade", slave);
-			} else {
-				cashX(Math.trunc(beauty * FResult), "working a gloryhole in an unregistered building", slave);
-			}
-			T.profits += Math.trunc(beauty * FResult);
-			T.incomeStats.income += Math.trunc(beauty * FResult);
+			cash = Math.trunc(beauty * FResult);
 		} else {
-			if (slave.assignment === "work a glory hole") {
-				cashX(Math.trunc(beauty * FResult / 5), "gloryhole", slave);
-			} else if (slave.assignment === "be confined in the arcade") {
-				cashX(Math.trunc(beauty * FResult / 5), "gloryholeArcade", slave);
-			} else {
-				cashX(Math.trunc(beauty * FResult / 5), "working a gloryhole in an unregistered building", slave);
-			}
-			T.profits += Math.trunc(beauty * FResult / 5);
-			T.incomeStats.income += Math.trunc(beauty * FResult / 5);
+			cash = Math.trunc(beauty * FResult / 5);
+		}
+		
+		if (slave.assignment === window.Job.GLORYHOLE) {
+			cashX(cash, "slaveAssignmentGloryhole", slave);
+		} else if (slave.assignment === window.Job.ARCADE) {
+			cashX(cash, "slaveAssignmentArcade", slave);
+		} else {
+			cashX(cash, "income for working a gloryhole in an unregistered building", slave);
 		}
+		
+		T.profits += cash;
+		T.incomeStats.income += cash;
 	}
 })();
diff --git a/src/endWeek/saWorkTheFarm.js b/src/endWeek/saWorkTheFarm.js
index 31eb4fbf8e3cdb2b71286fc67d066477327d83f1..4e8fb47425fff2d0fc6b5f7731f52495e407bd58 100644
--- a/src/endWeek/saWorkTheFarm.js
+++ b/src/endWeek/saWorkTheFarm.js
@@ -504,15 +504,17 @@ window.saWorkTheFarm = function(slave) {
 		t += `<span class="story-label">This week</span> ${vignette.text}`;
 		if (vignette.type === "cash") {
 			let FResultNumber = FResult(slave);
+			const cashVign = Math.trunc(FResultNumber * vignette.effect);
 			if (vignette.effect > 0) {
-				t += ` <span class="yellowgreen">making you an extra ${cashFormat(Math.trunc(FResultNumber * vignette.effect))}.</span> `;
+				t += ` <span class="yellowgreen">making you an extra ${cashFormat(cashVign)}.</span> `;
+				cashX(cashVign, "slaveAssignmentFarmyardVign", slave);
 			} else if (vignette.effect < 0) {
-				t += ` <span class="red">losing you ${cashFormat(Math.abs(Math.trunc(FResultNumber * vignette.effect)))}.</span> `;
+				t += ` <span class="red">losing you ${cashFormat(Math.abs(cashVign))}.</span> `;
+				cashX(forceNeg(cashVign), "slaveAssignmentFarmyardVign", slave);
 			} else {
 				t += ` an incident without lasting effect. `;
 			}
-			cashX(Math.trunc(FResultNumber * vignette.effect), "farmyard");
-			incomeStats.income += (Math.trunc(FResultNumber * vignette.effect));
+			incomeStats.income += cashVign;
 		} else if (vignette.type === "devotion") {
 			if (vignette.effect > 0) {
 				if (slave.devotion > 50) {
diff --git a/src/interaction/budgets/recordTemplates.js b/src/interaction/budgets/recordTemplates.js
index 8a7cc9feb4692bcfdec3f4f7a8c458ea20c02a4a..3b4f804ae03b32034e34bfa703131e45258ff210 100644
--- a/src/interaction/budgets/recordTemplates.js
+++ b/src/interaction/budgets/recordTemplates.js
@@ -1,56 +1,102 @@
 App.Data.Records = {};
 
 App.Data.Records.LastWeeksCash = function() {
-	this.whore = 0,
-	this.whoreBrothel = 0,
-	this.rest = 0,
-	this.houseServant = 0,
-	this.confined = 0,
-	this.publicServant = 0,
-	this.classes = 0,
-	this.milked = 0,
-	this.milkedDairy = 0,
-	this.extraMilk = 0, // milk from slaves doing other things
-	this.gloryhole = 0,
-	this.gloryholeArcade = 0,
-	this.porn = 0,
-	this.recruiter = 0,
 	// Slaves in general
-	this.fuckdolls = 0,
+	this.slaveMod = 0,
+	this.slaveSurgery = 0,
+	this.birth = 0,
+	this.porn = 0,
+	// Slave Income and Expenses per assignment
+	this.slaveAssignmentRest = 0,
+	this.slaveAssignmentRestVign = 0,
+	this.slaveAssignmentFucktoy = 0,
+	this.slaveAssignmentClasses = 0,
+	this.slaveAssignmentHouse = 0,
+	this.slaveAssignmentHouseVign = 0,
+	this.slaveAssignmentWhore = 0,
+	this.slaveAssignmentWhoreVign = 0,
+	this.slaveAssignmentPublic = 0,
+	this.slaveAssignmentPublicVign = 0,
+	this.slaveAssignmentSubordinate = 0,
+	this.slaveAssignmentMilked = 0,
+	this.slaveAssignmentMilkedVign = 0,
+	this.slaveAssignmentExtraMilk = 0,
+	this.slaveAssignmentExtraMilkVign = 0,
+	this.slaveAssignmentGloryhole = 0,
+	this.slaveAssignmentConfinement = 0,
+	this.slaveAssignmentBodyguard = 0,
+	this.slaveAssignmentHeadgirl = 0,
+	this.slaveAssignmentHeadgirlsuite = 0,
+	this.slaveAssignmentRecruiter = 0,
+	this.slaveAssignmentConcubine = 0,
+	this.slaveAssignmentMastersuite = 0,
+	this.slaveAssignmentArcade = 0,
+	this.slaveAssignmentMadam = 0,
+	this.slaveAssignmentMadamVign = 0,
+	this.slaveAssignmentBrothel = 0,
+	this.slaveAssignmentBrothelVign = 0,
+	this.slaveAssignmentWarden = 0,
+	this.slaveAssignmentCellblock = 0,
+	this.slaveAssignmentDj = 0,
+	this.slaveAssignmentClub = 0,
+	this.slaveAssignmentClubVign = 0,
+	this.slaveAssignmentNurse = 0,
+	this.slaveAssignmentClinic = 0,
+	this.slaveAssignmentMilkmaid = 0,
+	this.slaveAssignmentDairy = 0,
+	this.slaveAssignmentDairyVign = 0,
+	this.slaveAssignmentFarmer = 0,
+	this.slaveAssignmentFarmyard = 0,
+	this.slaveAssignmentFarmyardVign = 0,
+	this.slaveAssignmentMatron = 0,
+	this.slaveAssignmentNursery = 0,
+	this.slaveAssignmentNurseryVign = 0,
+	this.slaveAssignmentTeacher = 0,
+	this.slaveAssignmentSchool = 0,
+	this.slaveAssignmentSteward = 0,
+	this.slaveAssignmentQuarter = 0,
+	this.slaveAssignmentQuarterVign = 0,
+	this.slaveAssignmentAttendant = 0,
+	this.slaveAssignmentSpa = 0,
+	this.slaveAssignmentBaby_factory = 0,
+	// Menial Slaves
 	this.menialTrades = 0,
+	this.fuckdolls = 0,
 	this.menialBioreactors = 0,
-
+	// Misc Slaves
 	this.slaveTransfer = 0,
 	this.fuckdollsTransfer = 0,
 	this.menialTransfer = 0,
 	this.menialBioreactorsTransfer = 0,
 	this.babyTransfer = 0,
 	this.menialRetirement = 0,
+	// Reworked Misc Slaves
+	this.labScientists = 0,
+	this.labMenials = 0,
+	this.labScientistsTransfer = 0,
 
-	this.slaveMod = 0,
-	this.slaveSurgery = 0,
-	this.slaveUpkeep = 0,
-	this.birth = 0,
 
 	// Buildings
-	this.lab = 0,
+	this.masterSuite = 0,
+	this.arcade = 0,
 	this.brothel = 0,
 	this.brothelAds = 0,
+	this.cellblock = 0,
 	this.club = 0,
 	this.clubAds = 0,
-	this.arcade = 0,
-	this.dairy = 0,
-	this.servantsQuarters = 0,
-	this.masterSuite = 0,
-	this.school = 0,
-	this.spa = 0,
 	this.clinic = 0,
-	this.cellblock = 0,
+	this.dairy = 0,
+	this.farmyard = 0,
 	this.incubator = 0,
 	this.nursery = 0,
-	this.farmyard = 0,
 	this.pit = 0,
+	this.lab = 0,
+	this.labResearch = 0,
+	this.school = 0,
+	this.servantsQuarters = 0,
+	this.spa = 0,
 
+	// Arcology
 	this.environment = 0,
 	this.weather = 0,
 
diff --git a/src/interaction/prostheticLab.tw b/src/interaction/prostheticLab.tw
index e5bb268d287027ef03223aaf4c463296299cdb45..1d8d739b8409bbf18d9f4a323e30f546e62ff8b4 100644
--- a/src/interaction/prostheticLab.tw
+++ b/src/interaction/prostheticLab.tw
@@ -75,12 +75,12 @@
 	<div style="padding-top:1em">
 	<<if ($researchLab.hired + $researchLab.menials) < $researchLab.maxSpace>>
 		<div>
-		Hire [[x1|Prosthetic Lab][$researchLab.hired += 1,cashX(-2000, "lab")]]
+		Hire [[x1|Prosthetic Lab][$researchLab.hired += 1,cashX(forceNeg(2000), "labScientistsTransfer")]]
 		<<if ($researchLab.maxSpace - ($researchLab.hired + $researchLab.menials)) >= 5>>
-			| [[x5|Prosthetic Lab][$researchLab.hired += 5,cashX(-10000, "lab")]]
+			| [[x5|Prosthetic Lab][$researchLab.hired += 5,cashX(forceNeg(10000), "labScientistsTransfer")]]
 		<</if>>
 		<<if ($researchLab.maxSpace - ($researchLab.hired + $researchLab.menials)) >= 10>>
-			| [[x10|Prosthetic Lab][$researchLab.hired += 10,cashX(-10000, "lab")]]
+			| [[x10|Prosthetic Lab][$researchLab.hired += 10,cashX(forceNeg(10000), "labScientistsTransfer")]]
 		<</if>>
 		scientists.
 		</div>
@@ -195,7 +195,7 @@
 			<<if setup.prosthetics[_p].level <= $prostheticsUpgrade>>
 				<<capture _p>>
 				<<link "Reverse engineer <<= addA(setup.prosthetics[_p].name)>>" "Prosthetic Lab">>
-					<<set cashX(forceNeg(setup.prosthetics[_p].costs), "lab"), $prosthetics[_p].research = -1, $researchLab.tasks.push({type: "research", id: _p, workLeft: setup.prosthetics[_p].research})>>
+					<<set cashX(forceNeg(setup.prosthetics[_p].costs), "labResearch"), $prosthetics[_p].research = -1, $researchLab.tasks.push({type: "research", id: _p, workLeft: setup.prosthetics[_p].research})>>
 				<</link>>
 				<</capture>>
 					//Costs <<= cashFormat(setup.prosthetics[_p].costs)>> of initial investment.//
diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 1e759df775ecaff795449882bb48dea81bf4a01f..cfd7fe4178899d87cd76f5614dac14c2a98eeb67 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -1,32 +1,47 @@
 window.LivingRule = Object.freeze({LUXURIOUS: 'luxurious', NORMAL: 'normal', SPARE: 'spare'});
 window.Job = Object.freeze({
-	DAIRY: 'work in the dairy',
-	MILKMAID: 'be the Milkmaid',
-	MASTER_SUITE: 'serve in the master suite',
-	CONCUBINE: 'be your Concubine',
-	BABY_FACTORY: 'labor in the production line',
-	BROTHEL: 'work in the brothel',
-	MADAM: 'be the Madam',
+	// Penthouse Assignments
+	REST: 'rest',
+	FUCKTOY: 'please you',
+	CLASSES: 'take classes',
+	HOUSE: 'be a servant',
+	WHORE: 'whore',
+	PUBLIC: 'serve the public',
+	SUBORDINATE: 'be a subordinate slave',
+	MILKED: 'get milked',
+	GLORYHOLE: 'work a glory hole',
+	CONFINEMENT: 'stay confined',
+	// Leadership Assignments
+	BODYGUARD: 'guard you',
+	HEADGIRL: 'be your Head Girl',
+	RECRUITER: 'recruit girls',
+	// Facility Assignments
 	ARCADE: 'be confined in the arcade',
-	SERVANT: 'work as a servant',
-	SERVER: 'be a servant',
-	STEWARD: 'be the Stewardess',
-	CLUB: 'serve in the club',
-	DJ: 'be the DJ',
-	JAIL: 'be confined in the cellblock',
+	MADAM: 'be the Madam',
+	BROTHEL: 'work in the brothel',
 	WARDEN: 'be the Wardeness',
-	CLINIC: 'get treatment in the clinic',
+	CELLBLOCK: 'be confined in the cellblock',
+	DJ: 'be the DJ',
+	CLUB: 'serve in the club',
 	NURSE: 'be the Nurse',
-	HGTOY: 'live with your Head Girl',
-	SCHOOL: 'learn in the schoolroom',
+	CLINIC: 'get treatment in the clinic',
+	MILKMAID: 'be the Milkmaid',
+	DAIRY: 'work in the dairy',
+	FARMER: 'be the Farmer',
+	FARMYARD: 'work as a farmhand',
+	HEADGIRLSUITE: 'live with your Head Girl',
+	CONCUBINE: 'be your Concubine',
+	MASTERSUITE: 'serve in the master suite',
+	MATRON: 'be the Matron',
+	NURSERY: 'work as a nanny',
 	TEACHER: 'be the Schoolteacher',
+	SCHOOL: 'learn in the schoolroom',
+	STEWARD: 'be the Stewardess',
+	QUARTER: 'work as a servant',
+	ATTENDANT: 'be the Attendant',
 	SPA: 'rest in the spa',
-	ATTEND: 'be the Attendant',
-	NANNY: 'work as a nanny',
-	MATRON: 'be the Matron',
-	FARMYARD: 'work as a farmhand',
-	FARMER: 'be the Farmer',
-	REST: 'rest'
+	// Does this one exist?
+	BABY_FACTORY: 'labor in the production line',
 });
 window.PersonalAttention = Object.freeze({
 	TRADE: 'trading',
@@ -38,6 +53,170 @@ window.PersonalAttention = Object.freeze({
 	HACKING: 'hacking'
 });
 
+window.CategoryAssociatedGroup = Object.freeze({
+	PENTHOUSE: [
+		'slaveAssignmentRest',
+		'slaveAssignmentRestVign',
+		'slaveAssignmentFucktoy',
+		'slaveAssignmentClasses',
+		'slaveAssignmentHouse',
+		'slaveAssignmentWhore',
+		'slaveAssignmentWhoreVign',
+		'slaveAssignmentPublic',
+		'slaveAssignmentPublicVign',
+		'slaveAssignmentSubordinate',
+		'slaveAssignmentMilked',
+		'slaveAssignmentMilkedVign',
+		'slaveAssignmentExtraMilk',
+		'slaveAssignmentExtraMilkVign',
+		'slaveAssignmentGloryhole',
+		'slaveAssignmentConfinement'
+		],
+	HEADGIRLSUITE: [
+		'slaveAssignmentHeadgirl',
+		'slaveAssignmentHeadgirlsuite'
+		],
+	RECRUITER: [
+		'slaveAssignmentRecruiter'
+		],
+	DOJO: [
+		'slaveAssignmentBodyguard'
+		],
+	MASTERSUITE: [
+		'masterSuite',
+		'slaveAssignmentConcubine',
+		'slaveAssignmentMastersuite'
+		],
+	ARCADE: [
+		'arcade',
+		'slaveAssignmentArcade'
+		],
+	BROTHEL: [
+		'brothel',
+		'slaveAssignmentMadam',
+		'slaveAssignmentMadamVign',
+		'slaveAssignmentBrothel',
+		'slaveAssignmentBrothelVign',
+		'brothelAds'
+		],
+	CELLBLOCK: [
+		'cellblock',
+		'slaveAssignmentWarden',
+		'slaveAssignmentCellblock'
+		],
+	CLUB: [
+		'club',
+		'slaveAssignmentDj',
+		'slaveAssignmentClub',
+		'slaveAssignmentClubVign',
+		'clubAds'
+		],
+	CLINIC: [
+		'clinic',
+		'slaveAssignmentNurse',
+		'slaveAssignmentClinic'
+		],
+	DAIRY: [
+		'dairy',
+		'slaveAssignmentMilkmaid',
+		'slaveAssignmentDairy',
+		'slaveAssignmentDairyVign'
+		],
+	FARMYARD: [
+		'farmyard',
+		'slaveAssignmentFarmer',
+		'slaveAssignmentFarmyard',
+		'slaveAssignmentFarmyardVign',
+		],
+	INCUBATOR: [
+		'incubator'
+		],
+	NURSERY: [
+		'nursery',
+		'slaveAssignmentMatron',
+		'slaveAssignmentNursery',
+		'slaveAssignmentNurseryVign'
+		],
+	PIT: [
+		'pit'
+		],
+	PROSTHETICLAB: [
+		'lab',
+		'labResearch',
+		'labScientists',
+		'labMenials'
+		],
+	SCHOOLROOM: [
+		'school',
+		'slaveAssignmentTeacher',
+		'slaveAssignmentSchool'
+		],
+	SERVANTSQUARTERS: [
+		'servantsQuarters',
+		'slaveAssignmentSteward',
+		'slaveAssignmentQuarter',
+		'slaveAssignmentQuarterVign'
+		],
+	SPA: [
+		'spa',
+		'slaveAssignmentAttendant',
+		'slaveAssignmentSpa'
+		],
+	SLAVES: [
+		'porn',
+		'slaveMod',
+		'slaveSurgery',
+		'birth'
+		],
+	LABOR: [
+		'menialTrades',
+		'fuckdolls',
+		'menialBioreactors'
+		],
+	FLIPPING: [
+		'slaveTransfer',
+		'labScientistsTransfer',
+		'menialTransfer',
+		'fuckdollsTransfer',
+		'menialBioreactorsTransfer',
+		'babyTransfer'
+		],
+	FINANCIALS: [
+		'weather',
+		'rents',
+		'fines',
+		'event',
+		'capEx',
+		'futureSocieties',
+		'schoolBacking',
+		'war',
+		'cheating'
+		],
+	POLICIES: [
+		'policies'
+		],
+	EDICTS: [
+		'edicts'
+		],
+	PERSONALFINANCE: [
+		'personalBusiness',
+		'personalLivingExpenses',
+		'PCSkills',
+		'PCtraining',
+		'PCmedical',
+		'citizenOrphanage',
+		'privateOrphanage',
+		'stocks',
+		'stocksTraded'
+		],
+	SECURITY: [
+		'mercenaries',
+		'securityExpansion',
+		'specialForces',
+		'peacekeepers'
+		]
+});
+
 window.calculateCosts = (function() {
 	return {
 		predict: predictCost,
@@ -47,31 +226,33 @@ window.calculateCosts = (function() {
 	function predictCost() {
 		let totalCosts = (
 			getBrothelCosts() +
-	getBrothelAdsCosts() +
-	getArcadeCosts() +
-	getClubCosts() +
-	getClubAdsCosts() +
-	getDairyCosts() +
-	getIncubatorCosts() +
-	getServantsQuartersCosts() +
-	getMasterSuiteCosts() +
-	getNurseryCosts() +
-	getFarmyardCosts() +
-	getSecurityExpansionCost() +
-	getLifestyleCosts() +
-	getFSCosts() +
-	getCitizenOrphanageCosts() +
-	getPrivateOrphanageCosts() +
-	getPeacekeeperCosts() +
-	getMercenariesCosts() +
-	getMenialRetirementCosts() +
-	getRecruiterCosts() +
-	getSchoolCosts() +
-	getPolicyCosts() +
-	getProstheticsCosts() +
-	getPCTrainingCosts() +
-	getPCCosts() +
-	predictTotalSlaveCosts()
+			getBrothelAdsCosts() +
+			getArcadeCosts() +
+			getClubCosts() +
+			getClubAdsCosts() +
+			getDairyCosts() +
+			getIncubatorCosts() +
+			getServantsQuartersCosts() +
+			getMasterSuiteCosts() +
+			getNurseryCosts() +
+			getFarmyardCosts() +
+			getSecurityExpansionCost() +
+			getLifestyleCosts() +
+			getFSCosts() +
+			getCitizenOrphanageCosts() +
+			getPrivateOrphanageCosts() +
+			getPeacekeeperCosts() +
+			getMercenariesCosts() +
+			getMenialRetirementCosts() +
+			getRecruiterCosts() +
+			getSchoolCosts() +
+			getPolicyCosts() +
+			getLabCosts() +
+			getLabScientistsCosts() +
+			getLabMenialsCosts() +
+			getPCTrainingCosts() +
+			getPCCosts() +
+			predictTotalSlaveCosts()
 		);
 
 		// these two apply a multiplicative effect to all costs so far.
@@ -112,10 +293,12 @@ window.calculateCosts = (function() {
 		cashX(forceNeg(getPeacekeeperCosts()), "peacekeepers");
 		cashX(forceNeg(getMercenariesCosts()), "mercenaries");
 		cashX(forceNeg(getMenialRetirementCosts()), "menialRetirement");
-		cashX(forceNeg(getRecruiterCosts()), "recruiter");
+		cashX(forceNeg(getRecruiterCosts()), "slaveAssignmentRecruiter");
 		cashX(forceNeg(getSchoolCosts()), "schoolBacking");
 		cashX(forceNeg(getPolicyCosts()), "policies");
-		cashX(forceNeg(getProstheticsCosts()), "lab");
+		cashX(forceNeg(getLabCosts()), "lab");
+		cashX(forceNeg(getLabScientistsCosts()), "labScientists");
+		cashX(forceNeg(getLabMenialsCosts()), "labMenials");
 		cashX(forceNeg(getPCTrainingCosts()), "PCtraining");
 		cashX(forceNeg(getPCCosts()), "PCmedical");
 		getTotalSlaveCosts();
@@ -132,6 +315,7 @@ window.calculateCosts = (function() {
 		// in the old order these were applied after multiplication. Not sure if deliberate, but I'm leaving it for now.
 		cashX(forceNeg(getSFCosts()), "specialForces");
 		cashX(forceNeg(getWeatherCosts()), "weather");
+
 		return (oldCash - State.variables.cash);
 	}
 
@@ -173,31 +357,161 @@ window.calculateCosts = (function() {
 			numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]);
 		});
 
+		/* Implement a system that calculates and subtracts slave upkeep per assignment
 		// Find the total slave upkeep and pay for it
 		for (const slave of V.slaves) {
 			slaveCost = getSlaveCost(slave);
 			loopCosts += slaveCost;
 			cashX(forceNeg(slaveCost), "slaveUpkeep", slave);
 		}
-
+		*/
+		// Find the total slave upkeep, calculate and subtract per assignment
+		for (const slave of V.slaves) {
+			slaveCost = getSlaveCost(slave);
+			loopCosts += slaveCost;
+			// Switch to subtract and track upkeep per assignment
+			switch (slave.assignment) {
+				// Penthouse Assignments
+				case Job.REST:
+					cashX(forceNeg(slaveCost), "slaveAssignmentRest", slave);
+					break;
+				case Job.FUCKTOY:
+					cashX(forceNeg(slaveCost), "slaveAssignmentFucktoy", slave);
+					break;
+				case Job.CLASSES:
+					cashX(forceNeg(slaveCost), "slaveAssignmentClasses", slave);
+					break;
+				case Job.HOUSE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentHouse", slave);
+					break;
+				case Job.WHORE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentWhore", slave);
+					break;	
+				case Job.PUBLIC:
+					cashX(forceNeg(slaveCost), "slaveAssignmentPublic", slave);
+					break;
+				case Job.SUBORDINATE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentSubordinate", slave);
+					break;
+				case Job.MILKED:
+					cashX(forceNeg(slaveCost), "slaveAssignmentMilked", slave);
+					break;
+				case Job.GLORYHOLE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentGloryhole", slave);
+					break;
+				case Job.CONFINEMENT:
+					cashX(forceNeg(slaveCost), "slaveAssignmentConfinement", slave);
+					break;
+				// Leadership Assignments
+				case Job.BODYGUARD:
+					cashX(forceNeg(slaveCost), "slaveAssignmentBodyguard", slave);
+					break;
+				case Job.HEADGIRL:
+					cashX(forceNeg(slaveCost), "slaveAssignmentHeadgirl", slave);
+					break;
+				case Job.RECRUITER:
+					cashX(forceNeg(slaveCost), "slaveAssignmentRecruiter", slave);
+					break;
+				// Facility Assignments
+				case Job.ARCADE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentArcade", slave);
+					break;
+				case Job.MADAM:
+					cashX(forceNeg(slaveCost), "slaveAssignmentMadam", slave);
+					break;
+				case Job.BROTHEL:
+					cashX(forceNeg(slaveCost), "slaveAssignmentBrothel", slave);
+					break;
+				case Job.WARDEN:
+					cashX(forceNeg(slaveCost), "slaveAssignmentWarden", slave);
+					break;
+				case Job.CELLBLOCK:
+					cashX(forceNeg(slaveCost), "slaveAssignmentCellblock", slave);
+					break;
+				case Job.DJ:
+					cashX(forceNeg(slaveCost), "slaveAssignmentDj", slave);
+					break;
+				case Job.CLUB:
+					cashX(forceNeg(slaveCost), "slaveAssignmentClub", slave);
+					break;
+				case Job.NURSE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentNurse", slave);
+					break;
+				case Job.CLINIC:
+					cashX(forceNeg(slaveCost), "slaveAssignmentClinic", slave);
+					break;
+				case Job.MILKMAID:
+					cashX(forceNeg(slaveCost), "slaveAssignmentMilkmaid", slave);
+					break;
+				case Job.DAIRY:
+					cashX(forceNeg(slaveCost), "slaveAssignmentDairy", slave);
+					break;
+				case Job.FARMER:
+					cashX(forceNeg(slaveCost), "slaveAssignmentFarmer", slave);
+					break;
+				case Job.FARMYARD:
+					cashX(forceNeg(slaveCost), "slaveAssignmentFarmyard", slave);
+					break;
+				case Job.HEADGIRLSUITE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentHeadgirlsuite", slave);
+					break;
+				case Job.CONCUBINE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentConcubine", slave);
+					break;
+				case Job.MASTERSUITE:
+					cashX(forceNeg(slaveCost), "slaveAssignmentMastersuite", slave);
+					break;
+				case Job.MATRON:
+					cashX(forceNeg(slaveCost), "slaveAssignmentMatron", slave);
+					break;
+				case Job.NURSERY:
+					cashX(forceNeg(slaveCost), "slaveAssignmentNursery", slave);
+					break;
+				case Job.TEACHER:
+					cashX(forceNeg(slaveCost), "slaveAssignmentTeacher", slave);
+					break;
+				case Job.SCHOOL:
+					cashX(forceNeg(slaveCost), "slaveAssignmentSchool", slave);
+					break;
+				case Job.STEWARD:
+					cashX(forceNeg(slaveCost), "slaveAssignmentSteward", slave);
+					break;
+				case Job.QUARTER:
+					cashX(forceNeg(slaveCost), "slaveAssignmentQuarter", slave);
+					break;
+				case Job.ATTENDANT:
+					cashX(forceNeg(slaveCost), "slaveAssignmentAttendant", slave);
+					break;
+				case Job.SPA:
+					cashX(forceNeg(slaveCost), "slaveAssignmentSpa", slave);
+					break;
+				case Job.BABY_FACTORY:
+					cashX(forceNeg(slaveCost), "slaveAssignmentBaby_factory", slave);
+					break;
+				default:
+					cashX(forceNeg(slaveCost), "slaveAssignmentUndefined", slave);
+					break;
+			}
+		}
+		
 		// Calculate the servant reduction and credit them for it
 		const reducibleUpkeep = Math.trunc(loopCosts * 0.2);
 		V.ServQiIDs.forEach(ID => {
 			if (V.slaves.length > numberServed) {
 				slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
-				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+				cashX(Math.abs(slaveCostMinor), "slaveAssignmentQuarter", V.slaves[V.slaveIndices[ID]]);
 			} else {
 				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
-				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+				cashX(Math.abs(slaveCostMinor), "slaveAssignmentQuarter", V.slaves[V.slaveIndices[ID]]);
 			}
 		});
 		V.JobIDArray["be a servant"].forEach(ID => {
 			if (V.slaves.length > numberServed) {
 				slaveCostMinor = Math.trunc(reducibleUpkeep / V.slaves.length * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
-				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+				cashX(Math.abs(slaveCostMinor), "slaveAssignmentHouse", V.slaves[V.slaveIndices[ID]]);
 			} else {
 				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
-				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+				cashX(Math.abs(slaveCostMinor), "slaveAssignmentHouse", V.slaves[V.slaveIndices[ID]]);
 			}
 		});
 	// nothing to return, cashX already billed.
@@ -459,10 +773,17 @@ window.calculateCosts = (function() {
 		return costs;
 	}
 
-	function getProstheticsCosts() {
-		return ((100 * State.variables.researchLab.maxSpace) + (300 * State.variables.researchLab.hired) + (100 * State.variables.researchLab.hired));
+	function getLabCosts() {
+		return (100 * State.variables.researchLab.maxSpace);
 	}
 
+	function getLabScientistsCosts() {
+		return (300 * State.variables.researchLab.hired);
+	}
+
+	function getLabMenialsCosts() {
+		return (100 * State.variables.researchLab.hired);
+	}
 
 	// player expenses
 	function getPCTrainingCosts() {
@@ -668,7 +989,7 @@ window.getSlaveCostArray = function(s) {
 		case Job.DJ:
 		case Job.NURSE:
 		case Job.WARDEN:
-		case Job.ATTEND:
+		case Job.ATTENDANT:
 		case Job.STEWARD:
 		case Job.MILKMAID:
 		case Job.FARMER:
@@ -777,7 +1098,7 @@ window.getSlaveCostArray = function(s) {
 			// Extra feeding costs to support pregnancy are covered by dairy feeders.
 			// TODO: Include them here anyway?
 			retval.push({text: "Extra feeding costs to support pregnancy are covered by dairy feeders", value: 0});
-		} else if ((s.assignment === Job.MASTER_SUITE || s.assignment === Job.CONCUBINE) &&
+		} else if ((s.assignment === Job.MASTERSUITE || s.assignment === Job.CONCUBINE) &&
 			State.variables.masterSuiteUpgradePregnancy === 1) {
 			// Extra feeding costs to support pregnancy are covered by master suite luxuries.
 			// TODO: Include them here anyway?
@@ -1993,6 +2314,17 @@ window.cashX = function(cost, what, who) {
 			who.lastWeeksCashIncome += cost;
 			who.lifetimeCashIncome += cost;
 		}
+
+		// gather totals
+		V.lastWeeksCashProfits[what] += cost;
+		for (var key of Object.keys(CategoryAssociatedGroup)) {
+			if (CategoryAssociatedGroup[key].contains(what)) {
+				V.lastWeeksGatheredTotals[key][what].income += cost;
+				V.lastWeeksGatheredTotals[key][what].profits += cost;
+				V.lastWeeksGatheredTotals[key].income += cost;
+				V.lastWeeksGatheredTotals[key].profits += cost;
+			}
+		}
 	} else if (cost < 0) { // EXPENSES
 		// record the action
 		if (typeof V.lastWeeksCashExpenses[what] !== 'undefined') {
@@ -2006,9 +2338,21 @@ window.cashX = function(cost, what, who) {
 			if (what === "slaveTransfer") {
 				who.slaveCost = cost;
 			} else {
+				who.lastWeeksCashExpenses = cost;
 				who.lifetimeCashExpenses += cost;
 			}
 		}
+
+		// gather totals
+		V.lastWeeksCashProfits[what] += cost;
+		for (var key of Object.keys(CategoryAssociatedGroup)) {
+			if (CategoryAssociatedGroup[key].contains(what)) {
+				V.lastWeeksGatheredTotals[key][what].expenses += cost;
+				V.lastWeeksGatheredTotals[key][what].profits += cost;
+				V.lastWeeksGatheredTotals[key].expenses += cost;
+				V.lastWeeksGatheredTotals[key].profits += cost;
+			}
+		}
 	}
 	return cost;
 };
@@ -2254,6 +2598,15 @@ window.setupLastWeeksCash = function() {
 	V.lastWeeksCashIncome = new App.Data.Records.LastWeeksCash();
 	V.lastWeeksCashExpenses = new App.Data.Records.LastWeeksCash();
 	V.lastWeeksCashProfits = new App.Data.Records.LastWeeksCash();
+
+	// Here we reset our tracked totals on week end, and add the default categories to all objects
+	V.lastWeeksGatheredTotals = {};
+	for (var key of Object.keys(CategoryAssociatedGroup)){
+		V.lastWeeksGatheredTotals[key] = {income: 0, expenses: 0, profits: 0};
+		for (var subKey of Object.keys(new App.Data.Records.LastWeeksCash())) {
+			V.lastWeeksGatheredTotals[key][subKey] = {income: 0, expenses: 0, profits: 0};
+		}
+	}
 };
 
 window.setupLastWeeksRep = function() {
diff --git a/src/js/vignettes.js b/src/js/vignettes.js
index a64d8a129da418adfa7519b1ee0d371f2f2e5707..0a7bd6de169e97ba4306e5b21eaf3b93686451c5 100644
--- a/src/js/vignettes.js
+++ b/src/js/vignettes.js
@@ -7,7 +7,7 @@ window.GetVignette = function GetVignette(slave) {
 
 	const {he, him, his, hers, himself, boy, He/* , His */} = getPronouns(slave);
 
-	if (slave.assignment === "whore" || slave.assignment === window.Job.BROTHEL || slave.assignment === window.Job.MADAM) {
+	if (slave.assignment === window.Job.WHORE || slave.assignment === window.Job.BROTHEL || slave.assignment === window.Job.MADAM) {
 		let seed = jsRandom(1, 10);
 		switch (seed) {
 			case 1:
@@ -1976,7 +1976,7 @@ window.GetVignette = function GetVignette(slave) {
 			type: "trust",
 			effect: -1,
 		});
-	} else if (slave.assignment === "serve the public" || slave.assignment === window.Job.CLUB || slave.assignment === window.Job.DJ) {
+	} else if (slave.assignment === window.Job.PUBLIC || slave.assignment === window.Job.CLUB || slave.assignment === window.Job.DJ) {
 		let seed = jsRandom(1, 10);
 		switch (seed) {
 			case 1:
@@ -3945,7 +3945,7 @@ window.GetVignette = function GetVignette(slave) {
 			type: "trust",
 			effect: -1,
 		});
-	} else if (slave.assignment === "be a servant" || slave.assignment === "work as a servant") {
+	} else if (slave.assignment === window.Job.HOUSE || slave.assignment === window.Job.SERVANT) {
 		if (slave.fetishKnown === 1) {
 			switch (slave.fetish) {
 				case "cumslut":
@@ -4150,14 +4150,14 @@ window.GetVignette = function GetVignette(slave) {
 			type: "health",
 			effect: -1,
 		});
-	} else if (slave.assignment === "work as a nanny" || slave.assignment === window.Job.NANNY || slave.assignment === window.Job.MATRON) {
+	} else if (slave.assignment === window.Job.NANNY || slave.assignment === window.Job.MATRON) {
 		// TODO: add more vignettes here
 		vignettes.push({
 			text: `more vignettes are needed here,`,
 			type: "cash",
 			effect: 1,
 		});
-	} else if (slave.assignment === "get milked" || slave.assignment === "work in the dairy") {
+	} else if (slave.assignment === window.Job.MILKED || slave.assignment === window.Job.DAIRY) {
 		if (slave.lactation > 0) {
 			if (slave.race === "black") {
 				vignettes.push({
@@ -4232,7 +4232,7 @@ window.GetVignette = function GetVignette(slave) {
 			type: "rep",
 			effect: 0,
 		});
-	} else if (slave.assignment === "work as a farmhand" || slave.assignment === window.Job.FARMYARD || slave.assignment === window.Job.FARMER) {
+	} else if (slave.assignment === window.Job.FARMYARD || slave.assignment === window.Job.FARMER) {
 		if (canWalk(slave)) {
 			vignettes.push({
 				text: `${he} rather comically injured ${himself} by stepping on a rake,`,
@@ -4300,7 +4300,7 @@ window.GetVignette = function GetVignette(slave) {
 			type: "health",
 			effect: -1,
 		});
-	} else if (slave.assignment === "rest" || slave.assignment === "rest in the spa") {
+	} else if (slave.assignment === window.Job.REST || slave.assignment === window.Job.SPA) {
 		switch (slave.behavioralFlaw) {
 			case "anorexic":
 				vignettes.push({
diff --git a/src/uncategorized/costsBudget.js b/src/uncategorized/costsBudget.js
index c89fa759f1ca47a43bb490266b0bbe43a8fc61a5..8338b3d079bb502f4c7ee6b505bd202a9f4a9dc5 100644
--- a/src/uncategorized/costsBudget.js
+++ b/src/uncategorized/costsBudget.js
@@ -10,6 +10,7 @@ App.UI.Budget.Cost = function() {
 	let text;
 	let coloredRow = true;
 
+	/* Old way
 	// Set up profits column
 	V.lastWeeksCashProfits = new App.Data.Records.LastWeeksCash();
 
@@ -188,7 +189,7 @@ App.UI.Budget.Cost = function() {
 		[],
 		"Costs Report Slaves"
 	);
-	generateRow("slaveUpkeep", node);
+	generateRow("slaveUpkeepUndefined", node);
 
 	generateRowsFromArray([
 		["extraMilk", "Extra milk"],
@@ -527,6 +528,240 @@ App.UI.Budget.Cost = function() {
 		["specialForces", "Special forces"],
 		["peacekeepers", text]
 	]);
+	*/
+	// Set up object to track calculated displays
+	const income = "lastWeeksCashIncome";
+	const expenses = "lastWeeksCashExpenses";
+	const profits =  "lastWeeksCashProfits";
+	const F = V.lastWeeksGatheredTotals;
+
+	// HEADER
+	let header = table.createTHead();
+	let row = header.insertRow(0);
+	let th = document.createElement("th");
+	let pent = document.createElement("h1");
+	pent.textContent = "Budget Overview";
+	th.appendChild(pent);
+	row.appendChild(th);
+	
+	array = [
+		"Income",
+		"Expense",
+		"Totals"
+	];
+	for (let th of array) {
+		let cell = document.createElement("th");
+		cell.textContent = th;
+		row.appendChild(cell);
+	}
+
+	let body = document.createElement('tbody');
+	table.appendChild(body);
+	row = body.insertRow();
+
+	// HEADER: FACILITIES
+	createSectionHeader("Facilities");
+
+	// PENTHOUSE
+	generateRowShowTotal("Penthouse", "PENTHOUSE");
+	generateRowTracking("Rest", "slaveAssignmentRest");
+	generateRowTracking("RestVign", "slaveAssignmentRestVign");
+	generateRowTracking("Fucktoy", "slaveAssignmentFucktoy");
+	generateRowTracking("Classes", "slaveAssignmentClasses");
+	generateRowTracking("House", "slaveAssignmentHouse");
+	generateRowTracking("HouseVign", "slaveAssignmentHouseVign");
+	generateRowTracking("Whore", "slaveAssignmentWhore");
+	generateRowTracking("WhoreVign", "slaveAssignmentWhoreVign");
+	generateRowTracking("Public", "slaveAssignmentPublic");
+	generateRowTracking("PublicVign", "slaveAssignmentPublicVign");
+	generateRowTracking("Subordinate", "slaveAssignmentSubordinate");
+	generateRowTracking("Milked", "slaveAssignmentMilked");
+	generateRowTracking("MilkedVign", "slaveAssignmentMilkedVign");
+	generateRowTracking("ExtraMilk", "slaveAssignmentExtraMilk");
+	generateRowTracking("ExtraMilkVign", "slaveAssignmentExtraMilkVign");
+	generateRowTracking("Gloryhole", "slaveAssignmentGloryhole");
+	generateRowTracking("Confinement", "slaveAssignmentConfinement");
+
+	// LEADERSHIP ROLES
+
+	// HEAD GIRL
+	// find passage name for HGSuite
+	generateRowShowTotal(V.HGSuiteNameCaps, "HEADGIRLSUITE", V.HGSuite, null, V.HGSuiteiIDs.length);
+	generateRowTracking("Head Girl", "slaveAssignmentHeadgirl");
+	generateRowTracking("Head Girl Fucktoys", "slaveAssignmentHeadgirlsuite");
+
+	// RECRUITER
+	generateRowShowTotal("Recruiter", "RECRUITER");
+	generateRowTracking("Recruiter", "slaveAssignmentRecruiter");
+
+	// BODYGUARD
+	// find passage name for Armory
+	generateRowShowTotal("Armory", "DOJO", V.dojo, null, null);
+	generateRowTracking("Bodyguard", "slaveAssignmentBodyguard");
+
+	// CONCUBINE
+	generateRowShowTotal("Master Suite", "MASTERSUITE", V.masterSuite, "Master Suite", V.MastSiIDs.length);
+	generateRowTracking("Master Suite Maintenance", "masterSuite");
+	generateRowTracking("Master Suite Concubine", "slaveAssignmentConcubine");
+	generateRowTracking("Master Suite Fucktoys", "slaveAssignmentMastersuite");
+
+	// ARCADE
+	generateRowShowTotal(V.arcadeNameCaps, "ARCADE", V.arcade, "Arcade", V.ArcadeiIDs.length);
+	generateRowTracking("Arcade Maintenance", "arcade");
+	generateRowTracking("Arcade Fuckdolls", "slaveAssignmentArcade");
+
+	// BROTHEL
+	generateRowShowTotal(V.brothelNameCaps, "BROTHEL", V.brothel, "Brothel", V.BrothiIDs.length);
+	generateRowTracking("Brothel Maintenance", "brothel");
+	generateRowTracking("Brothel Madam", "slaveAssignmentMadam");
+	generateRowTracking("Brothel MadamVign", "slaveAssignmentMadamVign");
+	generateRowTracking("Brothel Whore", "slaveAssignmentBrothel");
+	generateRowTracking("Brothel WhoreVign", "slaveAssignmentBrothelVign");
+	generateRowTracking("Brothel Ads", "brothelAds");
+
+	// CELLBLOCK
+	generateRowShowTotal(V.cellblockNameCaps, "CELLBLOCK", V.cellblock, "Cellblock", V.CellBiIDs.length);
+	generateRowTracking("Cellblock Maintenance", "cellblock");
+	generateRowTracking("Cellblock Warden", "slaveAssignmentWarden");
+	generateRowTracking("Cellblock Slaves", "slaveAssignmentCellblock");
+
+	// CLUB
+	generateRowShowTotal(V.clubNameCaps, "CLUB", V.club, "Club", V.ClubiIDs.length);
+	generateRowTracking("Club Maintenance", "club");
+	generateRowTracking("Club DJ", "slaveAssignmentDj");
+	generateRowTracking("Club Public", "slaveAssignmentClub");
+	generateRowTracking("Club PublicVign", "slaveAssignmentClubVign");
+	generateRowTracking("Club Ads", "clubAds");
+
+	// CLINIC
+	generateRowShowTotal(V.clinicNameCaps, "CLINIC", V.club, "Club", V.ClubiIDs.length);
+	generateRowTracking("Clinic Maintenance", "clinic");
+	generateRowTracking("Clinic Nurse", "slaveAssignmentNurse");
+	generateRowTracking("Clinic Slaves", "slaveAssignmentClinic");
+
+	// DAIRY
+	generateRowShowTotal(V.dairyNameCaps, "DAIRY", V.dairy, "Dairy", V.DairyiIDs.length);
+	generateRowTracking("Dairy Maintenance", "dairy");
+	generateRowTracking("Dairy Milkmaid", "slaveAssignmentMilkmaid");
+	generateRowTracking("Dairy Cows", "slaveAssignmentDairy");
+	generateRowTracking("Dairy Cows", "slaveAssignmentDairyVign");
+
+	// FARMYARD
+	generateRowShowTotal(V.farmyardNameCaps, "FARMYARD", V.farmyard, "Farmyard", V.FarmyardiIDs.length);
+	generateRowTracking("Farmyard Maintenance", "farmyard");
+	generateRowTracking("Farmyard Farmer", "slaveAssignmentFarmer");
+	generateRowTracking("Farmyard Farmhands", "slaveAssignmentFarmyard");
+	generateRowTracking("Farmyard FarmhandsVign", "slaveAssignmentFarmyardVign");
+
+	// INCUBATOR
+	// TODO: Differentiate between standard upkeep, and slaves in incubator cost.
+	generateRowShowTotal(V.incubatorNameCaps, "INCUBATOR", V.incubator, "Incubator", V.incubatorSlaves);
+	generateRowTracking("Incubator Maintenance", "incubator");
+
+	// NURSERY
+	generateRowShowTotal(V.nurseryNameCaps, "NURSERY", V.nursery, "Nursery", V.NurseryiIDs.length);
+	generateRowTracking("Nursery Maintenance", "nursery");
+	generateRowTracking("Nursery Matron", "slaveAssignmentMatron");
+	generateRowTracking("Nursery Nannies", "slaveAssignmentNursery");
+	generateRowTracking("Nursery NanniesVign", "slaveAssignmentNurseryVign");
+
+	// PIT
+	generateRowShowTotal(V.pitNameCaps, "PIT", V.pit, "Pit", V.fighterIDs.length);
+	generateRowTracking("Pit Maintenance", "pit");
+
+	// PROSTHETIC LAB
+	generateRowShowTotal("Prosthetic Lab", "PROSTHETICLAB", V.researchLab.level, "Prosthetic Lab", null);
+	generateRowTracking("Prosthetic Lab Maintenance", "lab");
+	generateRowTracking("Prostethic Lab Research", "labResearch");
+	generateRowTracking("Prostethic Lab Scientists", "labScientists");
+	generateRowTracking("Prostethic Lab Menials", "labMenials");
+
+	// SCHOOLROOM
+	generateRowShowTotal(V.schoolroomNameCaps, "SCHOOLROOM", V.schoolroom, "Schoolroom", V.SchlRiIDs.length);
+	generateRowTracking("Schoolroom Maintenance", "school");
+	generateRowTracking("Schoolroom Teacher", "slaveAssignmentTeacher");
+	generateRowTracking("Schoolroom Students", "slaveAssignmentSchool");
+
+	// SERVANTS' QUARTERS
+	generateRowShowTotal(V.servantsQuartersNameCaps, "SERVANTSQUARTERS", V.servantsQuarters, "Servants' Quarters", V.ServQiIDs.length);
+	generateRowTracking("Servants' Quarters Maintenance", "servantsQuarters");
+	generateRowTracking("Servants' Quarters Steward", "slaveAssignmentSteward");
+	generateRowTracking("Servants' Quarters Servants", "slaveAssignmentQuarter");
+	generateRowTracking("Servants' Quarters ServantsVign", "slaveAssignmentQuarterVign");
+
+	// SPA
+	generateRowShowTotal(V.spaNameCaps, "SPA", V.spa, "Spa", V.SpaiIDs.length);
+	generateRowTracking("Spa Maintenance", "spa");
+	generateRowTracking("Spa Attendant", "slaveAssignmentAttendant");
+	generateRowTracking("Spa Slaves", "slaveAssignmentSpa");
+
+	// HEADER: ARCOLOGY
+	createSectionHeader("Arcology");
+
+	// SLAVES
+	generateRowShowTotal("Miscellaneous Slave Income and Expenses", "SLAVES");
+	generateRowTracking("Slave Porn", "porn");
+	generateRowTracking("Slave Modifcations", "slaveMod");
+	generateRowTracking("Slave Surgery", "slaveSurgery");
+	generateRowTracking("Slave Birhting", "birth");
+
+	// MENIAL LABOR
+	// TODO: Differentiate between selling and weekly income for menial slaves.
+	generateRowShowTotal("Menial Labor", "LABOR");
+	generateRowTracking("Menials: Slaves", "menialTrades");
+	generateRowTracking("Menials: Fuckdolls", "fuckdolls");
+	generateRowTracking("Menials: Bioreactors", "menialBioreactors");
+
+	// FLIPPING
+	generateRowShowTotal("Flipping", "FLIPPING");
+	generateRowTracking("Slave Transfer", "slaveTransfer");
+	// Menial Transfer
+	// Fuckdoll Transfer
+	// Bioreactor transfer
+	generateRowTracking("Scientist Transfer", "labScientistsTransfer");
+	generateRowTracking("Assistant: Menials", "menialTransfer");
+	generateRowTracking("Assistant: Fuckdolls", "fuckdollsTransfer");
+	generateRowTracking("Assistant: Bioreactors", "menialBioreactorsTransfer");
+	generateRowTracking("Slave Babies", "babyTransfer");
+
+	// FINANCIALS
+	generateRowShowTotal("Financials", "FINANCIALS");
+	generateRowTracking("Weather", "weather");
+	generateRowTracking("Rents", "rents");
+	generateRowTracking("Fines", "fines");
+	generateRowTracking("Events", "event");
+	generateRowTracking("Capital Expenses", "capEx");
+	generateRowTracking("Future Society Shaping", "futureSocieties");
+	generateRowTracking("School Subsidy", "schoolBacking")
+	generateRowTracking("Arcology conflict", "war");
+	generateRowTracking("Cheating", "cheating");
+
+	// POLICIES
+	generateRowShowTotal("Policies", "POLICIES");
+	generateRowTracking("Policies", "policies");
+
+	// EDICTS
+	generateRowShowTotal("Edicts", "EDICTS");
+	generateRowTracking("Edicts", "edicts");
+
+	// PERSONAL FINANCE
+	generateRowShowTotal("Personal Finance", "PERSONALFINANCE");
+	generateRowTracking("Personal Business", "personalBusiness");
+	generateRowTracking("Personal Living Expenses", "personalLivingExpenses");
+	generateRowTracking("Your skills", "PCSkills");
+	generateRowTracking("Your training expenses", "PCtraining");
+	generateRowTracking("Your medical expenses", "PCmedical");
+	generateRowTracking("Citizen Orphanage", "citizenOrphanage");
+	generateRowTracking("Private Orphanage", "privateOrphanage");
+	generateRowTracking("Stock dividents", "stocks");
+	generateRowTracking("Stock trading", "stocksTraded");
+
+	// SECURITY
+	generateRowShowTotal("Security", "SECURITY");
+	generateRowTracking("Mercenaries", "mercenaries");
+	generateRowTracking("Security Expansion", "securityExpansion");
+	generateRowTracking("Special Forces", "specialForces");
+	generateRowTracking("Peacekeepers", "peacekeepers");
 
 	// BUDGET REPORT
 	createSectionHeader("Budget Report");
@@ -606,11 +841,7 @@ App.UI.Budget.Cost = function() {
 		cell.append(headline);
 	}
 
-	function generateRow(category, node) {
-		const income = "lastWeeksCashIncome";
-		const expenses = "lastWeeksCashExpenses";
-		const profits = "lastWeeksCashProfits";
-		let row;
+	function generateRowTracking(node, category) {
 		if (category === "") {
 			row = table.insertRow();
 			row.append(document.createElement('br'));
@@ -619,11 +850,9 @@ App.UI.Budget.Cost = function() {
 			row.insertCell();
 			flipColors(row);
 			return;
-		}
+		} 
 
 		if (V[income][category] || V[expenses][category] || V.showAllEntries.costsBudget) {
-			V[profits][category] = V[income][category] + V[expenses][category]; // TODO: consider removing
-
 			row = table.insertRow();
 			let cell = row.insertCell();
 			cell.append(node);
@@ -631,64 +860,46 @@ App.UI.Budget.Cost = function() {
 			cell.append(cashFormatColorDOM(V[income][category]));
 			cell = row.insertCell();
 			cell.append(cashFormatColorDOM(-Math.abs(V[expenses][category])));
+			flipColors(row);
 			cell = row.insertCell();
 			cell.append(cashFormatColorDOM(V[profits][category]));
-			flipColors(row);
-		}
-	}
-
-	function generateRowsFromArray(array) {
-		for (let line in array) {
-			let node = document.createTextNode(array[line][1]);
-			generateRow(
-				array[line][0],
-				node
-			);
 		}
 	}
 
-	/**
-	 * Structures refer to the building itself and the bills it racks up as it consumes supplies (aphrodesiacs for the brothel) or the money it brings in without slaves (extra room in the classroom)
-	 * @param {*} title the title displayed to the user, link active or not
-	 * @param {*} category the parameter of the budget we are pulling from
-	 * @param {*} structure the variable to test to determine if the building exists and therefore needs a link
-	 * @param {*} passage the passage to link to if the structure is active
-	 * @param {*} occupancy so we can display how many slaves are in the building
-	 */
-	function structureSetup(title, category, structure, passage, occupancy) {
-		node = new DocumentFragment();
-		if (structure) {
-			node.appendChild(
-				App.UI.DOM.link(
-					title,
-					() => {
-						V.nextButton = "Back to Budget";
-						V.nextLink = "Costs Budget";
-					},
-					[],
-					passage
-				)
-			);
-			node.append(` (${occupancy} slaves)`);
-		} else {
-			node = document.createTextNode(`${title} (${occupancy} slaves)`);
+	function generateRowShowTotal(title, group, structure, passage, occupancy) {
+		if (F[group].income || F[group].expenses || V.showAllEntries.costsBudget) {
+			row = table.insertRow();
+			cell = row.insertCell();
+			let headline = document.createElement('h3');
+			headline.textContent = title;
+			cell.append(headline);
+			cell = row.insertCell();
+			cell.append(cashFormatColorDOM(F[group].income, null, true));
+			cell = row.insertCell();
+			cell.append(cashFormatColorDOM(F[group].expenses, null, true));
+			cell = row.insertCell();
+			cell.append(cashFormatColorDOM(F[group].profits, null, true));
 		}
-		generateRow(category, node);
 	}
 
-	function cashFormatColorDOM(s, invert = false) {
+	function cashFormatColorDOM(s, invert = false, temp) {
 		if (invert) {
 			s = -1 * s;
 		}
 		let el = document.createElement('span');
 		el.textContent = cashFormat(s);
-		// Display red if the value is negative, unless invert is true
-		if (s < 0) {
-			el.className = "red";
-			// Yellow for positive
-		} else if (s > 0) {
-			el.className = "yellowgreen";
-			// White for exactly zero
+		if (temp === true) {
+			// Gray display for totals when expanded
+			el.className = "gray";
+		} else {
+			// Display red if the value is negative, unless invert is true
+			if (s < 0) {
+				el.className = "red";
+				// Yellow for positive
+			} else if (s > 0) {
+				el.className = "yellowgreen";
+				// White for exactly zero
+			}
 		}
 		return el;
 	}
diff --git a/src/uncategorized/dairyReport.tw b/src/uncategorized/dairyReport.tw
index 969f2fc0d7daf485b3968822dfa07a85b088f444..a0e7cca8880e2d3e37edc24ce2fb586a6cdebe54 100644
--- a/src/uncategorized/dairyReport.tw
+++ b/src/uncategorized/dairyReport.tw
@@ -877,11 +877,11 @@
 				<</if>>
 			<<elseif ($slaves[$i].pregKnown == 1)>>
 				<<if ($dairyPregSetting > 2)>>
-					<<run cashX(100, "milked", $slaves[$i])>>
+					<<run cashX(100, "slaveAssignmentDairy", $slaves[$i])>>
 				<<elseif ($dairyPregSetting > 1)>>
-					<<run cashX(50, "milked", $slaves[$i])>>
+					<<run cashX(50, "slaveAssignmentDairy", $slaves[$i])>>
 				<<else>>
-					<<run cashX(25, "milked", $slaves[$i])>>
+					<<run cashX(25, "slaveAssignmentDairy", $slaves[$i])>>
 				<</if>>
 				<<if ($dairyPregSetting > 1) && ($slaves[$i].vagina < 4)>>
 					<<set $slaves[$i].vagina++>>
@@ -946,11 +946,11 @@
 
 <<if $inflatedSlavesMilk > 0>>
 	<<set _cashX -= Math.trunc(((600*($inflatedSlavesMilk)+8)+random(50,200)))>>
-	<<run cashX(_cashX, "milked")>>
+	<<run cashX(_cashX, "slaveAssignmentDairy")>>
 <</if>>
 <<if $inflatedSlavesCum > 0>>
 	<<set _cashX -= Math.trunc(((300*($inflatedSlavesCum+8))+random(25,100)))>>
-	<<run cashX(_cashX, "milked")>>
+	<<run cashX(_cashX, "slaveAssignmentDairy")>>
 <</if>>
 
 <<set _profits = $cash-_oldCash>>