diff --git a/src/js/economyJS.js b/src/js/economyJS.js
index 50babb6ae15fe7b5703bdc3b1f08f1510ca1b825..d6748a44763ae1c575432c5d2022b1018125466b 100644
--- a/src/js/economyJS.js
+++ b/src/js/economyJS.js
@@ -137,7 +137,7 @@ window.calculateCosts = (function() {
 
 	// slave expenses
 	function predictTotalSlaveCosts() {
-		const V = Slave.variables;
+		const V = State.variables;
 		let loopCosts = 0;
 		let number = 0;
 		for (const slave of V.slaves) {
@@ -159,14 +159,47 @@ window.calculateCosts = (function() {
 	}
 
 	function getTotalSlaveCosts() {
+		const V = State.variables;
 		let slaveCost = 0;
 		let slaveCostMinor = 0;
-		for (const slave of State.variables.slaves) {
+		let numberServed = 0;
+		let loopCosts = 0;
+
+		// Figure out how many slaves are effectively getting their upkeep reduced by 20%
+		V.ServQiIDs.forEach(ID => {
+			numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]);
+		});
+		V.JobIDArray["be a servant"].forEach(ID => {
+			numberServed += getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]);
+		});
+
+		// 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);
-			slaveCostMinor = getSlaveMinorCosts(slave);
-			cashX(Math.abs(slaveCostMinor), "houseServant", slave);
 		}
+
+		// 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]]);
+			} else {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", 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]]);
+			} else {
+				slaveCostMinor = Math.trunc(reducibleUpkeep / numberServed * getSlaveMinorCosts(V.slaves[V.slaveIndices[ID]]));
+				cashX(Math.abs(slaveCostMinor), "houseServant", V.slaves[V.slaveIndices[ID]]);
+			}
+		});
 	// nothing to return, cashX already billed.
 	}