diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css
index 6df18302381e551ba35766130030421d7bf9f36e..ea810776e556246be27260e75ebe1efc1403990f 100644
--- a/src/gui/css/mainStyleSheet.css
+++ b/src/gui/css/mainStyleSheet.css
@@ -339,7 +339,7 @@ div.double-choices, p.double-choices {
 	font-style: italic;
 }
 
-.story-label {
+.story-label, .underline {
 	text-decoration: underline;
 }
 
diff --git a/src/js/slaveExpenses.js b/src/js/slaveExpenses.js
new file mode 100644
index 0000000000000000000000000000000000000000..9327b167f0a27bd01feb87deb0025fc4658a47f3
--- /dev/null
+++ b/src/js/slaveExpenses.js
@@ -0,0 +1,231 @@
+/**
+ * Returns a block that describes an overview of the slave's impact on your reputation and finances in the short term
+ * @param {App.Entity.SlaveState} slave
+ * @returns {node}
+ */
+globalThis.slaveExpenses = function(slave) {
+	const frag = new DocumentFragment();
+	let div;
+
+	// Generate the lines of the report
+	for (const line of getSlaveCostArray(slave)) {
+		div = document.createElement("div");
+		div.classList.add("indent");
+		App.UI.DOM.appendNewElement("span", div, `${line.text}: `);
+		App.UI.DOM.appendNewElement("span", div, cashFormat(line.value), "cash");
+		frag.append(div);
+	}
+
+	// Total expenses
+	const individualCosts = getSlaveCost(slave);
+	div = document.createElement("div");
+	div.classList.add("double-indent");
+
+	App.UI.DOM.appendNewElement("span", div, "Predicted expense", "underline");
+	div.append(": ");
+	div.append(App.UI.DOM.cashFormat(-individualCosts));
+	frag.append(div);
+
+	// Income from last week vs expense gives net, assistant gated
+	if (V.assistant.power > 0) {
+		if (slave.lastWeeksCashIncome > 0) {
+			div = document.createElement("div");
+			div.classList.add("indent");
+			App.UI.DOM.appendNewElement("span", div, `Income: `);
+			div.append(App.UI.DOM.cashFormat(slave.lastWeeksCashIncome));
+			frag.append(div);
+
+			div = document.createElement("div");
+			div.classList.add("double-indent");
+			App.UI.DOM.appendNewElement("span", div, `Total`, "underline");
+			App.UI.DOM.appendNewElement("span", div, `: `);
+			div.append(App.UI.DOM.cashFormat(slave.lastWeeksCashIncome - individualCosts));
+			frag.append(div);
+		}
+	}
+	frag.append(slaveImpactLongTerm(slave));
+
+	return frag;
+};
+
+/**
+ * Returns a block that describes an overview of the slave's impact on your reputation and finances over the long term
+ * @param {App.Entity.SlaveState} slave
+ * @returns {node}
+ */
+globalThis.slaveImpactLongTerm = function(slave) {
+	const frag = new DocumentFragment();
+	const {he, his, him} = getPronouns(slave);
+	let p;
+	let div;
+	let span;
+	let _Cost;
+	let _Expense;
+	let _Income;
+	let text;
+
+	// Background and original cost
+	if (slave.origin !== 0) {
+		App.UI.DOM.appendNewElement("div", frag, pronounsForSlaveProp(slave, slave.origin), "indent");
+	}
+	div = document.createElement("div");
+	div.classList.add("indent");
+	if (slave.slaveCost < 0) {
+		div.append(`You bought ${him} for: `);
+		div.append(App.UI.DOM.cashFormat(slave.slaveCost));
+		div.append(`.`);
+		_Cost = slave.slaveCost;
+	} else if (slave.slaveCost === 0) {
+		div.append(`You spent nothing to acquire ${him}.`);
+		_Cost = slave.slaveCost;
+	} else {
+		text = `You have no record of how much `;
+		if (slave.origin !== 0) {
+			text += `this`;
+		} else {
+			text += `${he} originally`;
+		}
+		text += ` cost.`;
+		div.append(text);
+		_Cost = 0;
+	}
+	frag.append(div);
+
+	// Lifetime totals, assistant gated
+	if (V.assistant.power > 0) {
+		const _weeksOwned = V.week - slave.weekAcquired;
+		// Lifetime expense
+		div = document.createElement("div");
+		div.classList.add("indent");
+		if (slave.lifetimeCashExpenses < 0) {
+			text = `In ${his} `;
+			if (_weeksOwned > 0) {
+				text += `${_weeksOwned} `;
+				if (_weeksOwned === 1) {
+					text += `week`;
+				} else {
+					text += `weeks`;
+				}
+			} else {
+				text += `time`;
+			}
+			text += ` with you, ${he} has cost `;
+			div.append(text);
+			div.append(App.UI.DOM.cashFormat(slave.lifetimeCashExpenses));
+			div.append(`.`);
+			_Expense = slave.lifetimeCashExpenses;
+		} else {
+			div.append(`You have no record of ${him} costing you any ¤.`);
+			_Expense = 0;
+		}
+		frag.append(div);
+
+		// Lifetime income
+		div = document.createElement("div");
+		div.classList.add("indent");
+		if (slave.lifetimeCashIncome > 0) {
+			text = `In ${his} `;
+			if (_weeksOwned > 0) {
+				text += `${_weeksOwned} `;
+				if (_weeksOwned === 1) {
+					text += `week`;
+				} else {
+					text += `weeks`;
+				}
+			} else {
+				text += `time`;
+			}
+			text += ` with you, ${he} has earned `;
+			div.append(text);
+			div.append(App.UI.DOM.cashFormat(slave.lifetimeCashIncome));
+			div.append(`.`);
+			_Income = slave.lifetimeCashIncome;
+		} else {
+			div.append(`You have no record of ${him} making you any ¤.`);
+			_Income = 0;
+		}
+		frag.append(div);
+
+		// Lifetime total
+		div = document.createElement("div");
+		div.classList.add("indent");
+		div.append(`Overall, `);
+		if ((_Income + _Cost + _Expense) > 0) {
+			div.append(`you have made `);
+			div.append(App.UI.DOM.cashFormat(_Income + _Cost + _Expense));
+			div.append(` net from ${his} labors.`);
+		} else if ((_Income + _Cost + _Expense) === 0) {
+			div.append(`${he} is even in cost and income.`);
+		} else {
+			div.append(`${he} has cost you `);
+			div.append(App.UI.DOM.cashFormat(_Income + _Cost + _Expense));
+			div.append(`.`);
+		}
+		frag.append(div);
+
+		// Reputation:
+		p = document.createElement("p");
+		if (slave.lifetimeRepIncome !== 0 || slave.lifetimeRepExpenses !== 0) {
+			let _repTotal = (slave.lifetimeRepIncome + slave.lifetimeRepExpenses);
+			if (V.cheatMode === 1 || V.debugMode === 1) {
+				if (slave.lifetimeRepIncome !== 0) {
+					div = document.createElement("div");
+					div.classList.add("indent");
+					div.append(`This week ${he} has `);
+					if (slave.lastWeeksRepIncome === 0) {
+						div.append(`had no positive effect on your reputation, but `);
+					} else {
+						div.append(`improved your reputation by `);
+						App.UI.DOM.appendNewElement("span", div, num(slave.lastWeeksRepIncome), "green");
+						div.append(` and `);
+					}
+					div.append(`over ${his} entire time with you, ${he} gained `);
+					App.UI.DOM.appendNewElement("span", div, `${num(slave.lifetimeRepIncome)}.`, "green");
+					p.append(div);
+				}
+
+				if (slave.lifetimeRepExpenses !== 0) {
+					div = document.createElement("div");
+					div.classList.add("indent");
+					div.append(`This week ${he} has `);
+					if (slave.lastWeeksRepExpenses === 0) {
+						div.append(`had no negative effect on your reputation, but `);
+					} else {
+						div.append(`lowered your reputation by `);
+						App.UI.DOM.appendNewElement("span", div, slave.lastWeeksRepExpenses, "red");
+						div.append(` and `);
+					}
+					div.append(`over ${his} entire time with you, ${he} cost `);
+					App.UI.DOM.appendNewElement("span", div, `${slave.lifetimeRepExpenses}.`, "red");
+					p.append(div);
+				}
+
+				div = document.createElement("div");
+				div.classList.add("indent");
+				div.append(`Overall then, ${he} has changed your reputation by `);
+				span = document.createElement("span");
+				if (_repTotal > 0) {
+					span.classList.add("green");
+				} else if (_repTotal < 0) {
+					span.classList.add("red");
+				}
+				span.append(num(_repTotal));
+				div.append(span);
+				p.append(div);
+			} else {
+				/* lowercasedonkey: TODO: I don't like how vague my placeholder is. Probably need to set up some kind of sliding scale to describe how much rep (roughly) she has made or lost. Need to get a sense of common ranges. */
+				text = `Overall, ${he} has `;
+				if (_repTotal === 0) {
+					text += `had no impact on your reputation.`;
+				} else if (_repTotal > 0) {
+					text += `<span class="green">increased</span> your reputation.`;
+				} else if (_repTotal < 0) {
+					text += `<span class="red">decreased</span> your reputation.`;
+				}
+				App.UI.DOM.appendNewElement("div", p, text, "indent");
+			}
+		}
+		frag.append(p);
+	}
+	return frag;
+};
diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js
index 27531125aa81bb12b0711a878886f59807ec5109..efd222f544541de35cd3d3df43b596a2aab60db1 100644
--- a/src/js/utilsDOM.js
+++ b/src/js/utilsDOM.js
@@ -382,3 +382,14 @@ Macro.add("includeDOM", {
 		}
 	}
 });
+
+App.UI.DOM.cashFormat = function(s) {
+	const span = document.createElement("span");
+	if (s < 0) { // Display red if the value is negative, unless invert is true
+		span.classList.add("red");
+	} else if (s !== 0) { // Yellow for positive
+		span.classList.add("cash");
+	}
+	span.textContent = cashFormat(Math.trunc(s));
+	return span;
+};
diff --git a/src/uncategorized/costsReport.tw b/src/uncategorized/costsReport.tw
index f971c456965480b4182a2adfa960e35b175656df..5b365daa246306f026575687ddd11c9cb3f83d64 100644
--- a/src/uncategorized/costsReport.tw
+++ b/src/uncategorized/costsReport.tw
@@ -7,7 +7,7 @@
 	<<capture $i>>
 		<br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>>
 		[[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment.
-		<<SlaveExpenses $slaves[$i]>>
+		<<includeDOM SlaveExpenses (V.slaves[V.i])>>
 	<</capture>>
 <</for>>
 
diff --git a/src/uncategorized/costsReportSlaves.tw b/src/uncategorized/costsReportSlaves.tw
index 3399fecd92dfe8a6509c01412263bd4e8a05718d..ae0467edc474f629deb9c74255662f840c8890c3 100644
--- a/src/uncategorized/costsReportSlaves.tw
+++ b/src/uncategorized/costsReportSlaves.tw
@@ -8,6 +8,6 @@
 	<<capture $i>>
 	<br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>>
 	[[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment.
-	<<SlaveExpenses $slaves[$i]>>
+	<<includeDOM SlaveExpenses (V.slaves[V.i])>>
 	<</capture>>
 <</for>>
diff --git a/src/uncategorized/costsWidgets.tw b/src/uncategorized/costsWidgets.tw
deleted file mode 100644
index 5b69bd2fa6c132cb49c48e662134f34ac6c0190a..0000000000000000000000000000000000000000
--- a/src/uncategorized/costsWidgets.tw
+++ /dev/null
@@ -1,145 +0,0 @@
-:: Cost widgets [nobr widget]
-
-<<widget "SlaveExpenses">>
-	<<set _individualCosts = 0>>
-	<<setLocalPronouns $args[0]>>
-
-	/* Generate the lines of the report */
-	<<for _line range getSlaveCostArray($args[0])>>
-		<div class="indent">
-			<<= _line.text>>: <<=cashFormatColor(_line.value)>>
-		</div>
-	<</for>>
-
-	/* Total expenses */
-	<<set _individualCosts = Math.trunc(getSlaveCost($args[0]))>>
-	<div class="double-indent">
-		__Predicted expense__: @@.red;<<print cashFormat(Math.trunc(_individualCosts))>>@@
-	</div>
-
-	/* Income from last week vs expense gives net, assistant gated */
-	<<if $assistant.power > 0>>
-		<<if $args[0].lastWeeksCashIncome > 0>>
-			<div class="indent">
-				Income: <<print cashFormatColor($args[0].lastWeeksCashIncome)>>
-			</div>
-			<<set _total = (Math.trunc($args[0].lastWeeksCashIncome - _individualCosts))>>
-			<div class="double-indent">
-				__Total__: <<print cashFormatColor(Math.trunc(_total))>>
-			</div>
-		<</if>>
-	<</if>>
-	<<SlaveExpensesExtra $args[0]>>
-<</widget>>
-
-<<widget "SlaveExpensesExtra">>
-	<<setLocalPronouns $args[0]>>
-	/* Background and original cost */
-	<<if $args[0].origin != 0>>
-		<div class="indent">
-			$args[0].origin
-		</div>
-	<</if>>
-	<div class="indent">
-		<<if $args[0].slaveCost < 0>>
-			You bought $him for: @@.red;<<print cashFormat($args[0].slaveCost)>>.@@
-			<<set _Cost = $args[0].slaveCost>>
-		<<elseif $args[0].slaveCost == 0>>
-			You spent nothing to acquire $him.
-			<<set _Cost = $args[0].slaveCost>>
-		<<else>>
-			You have no record of how much <<if $args[0].origin != 0>>this<<else>>$he originally<</if>> cost.
-			<<set _Cost = 0>>
-		<</if>>
-	</div>
-
-	/* Lifetime totals, assistant gated */
-	<<if $assistant.power > 0>>
-		<<set _weeksOwned = $week - $args[0].weekAcquired>>
-		/* Lifetime expense */
-		<div class="indent">
-			<<if $args[0].lifetimeCashExpenses < 0>>
-				In $his <<if _weeksOwned > 0>>_weeksOwned <<if _weeksOwned == 1>>week<<else>>weeks<</if>><<else>>time<</if>> with you, $he has cost @@.red;<<print cashFormat($args[0].lifetimeCashExpenses)>>.@@
-				<<set _Expense = $args[0].lifetimeCashExpenses>>
-			<<else>>
-				You have no record of $him costing you any ¤.
-				<<set _Expense = 0>>
-			<</if>>
-		</div>
-
-		/* Lifetime income */
-		<div class="indent">
-			<<if $args[0].lifetimeCashIncome > 0>>
-				In $his <<if _weeksOwned > 0>>_weeksOwned <<if _weeksOwned == 1>>week<<else>>weeks<</if>><<else>>time<</if>> with you, $he has earned @@.yellowgreen;<<print cashFormat($args[0].lifetimeCashIncome)>>.@@
-				<<set _Income = $args[0].lifetimeCashIncome>>
-			<<else>>
-				You have no record of $him making you any ¤.
-				<<set _Income = 0>>
-			<</if>>
-		</div>
-
-		/* Lifetime total */
-		<div class="indent">
-			Overall,
-			<<if (_Income + _Cost + _Expense) > 0>>
-				you have made @@.yellowgreen;<<print cashFormat(_Income + _Cost + _Expense)>>@@ net from $his labors.
-			<<elseif (_Income + _Cost + _Expense) == 0>>
-				$he is even in cost and income.
-			<<else>>
-				$he has cost you @@.red;<<print cashFormat(_Income + _Cost + _Expense)>>.@@
-			<</if>>
-		</div>
-
-		/* Reputation: */
-		<div>
-			<<if ($args[0].lifetimeRepIncome != 0 || $args[0].lifetimeRepExpenses != 0)>>
-				<<set _repTotal = ($args[0].lifetimeRepIncome + $args[0].lifetimeRepExpenses)>>
-				<<if ($cheatMode == 1 || $debugMode == 1)>>
-					<<if $args[0].lifetimeRepIncome != 0>>
-						<div class="indent">
-							This week $he has
-							<<if $args[0].lastWeeksRepIncome == 0>>
-								had no positive effect on your reputation, but
-							<<else>>
-								improved your reputation by @@.green;<<print num($args[0].lastWeeksRepIncome)>>@@ and
-							<</if>>
-							over $his entire time with you, $he gained @@.green;<<print num($args[0].lifetimeRepIncome)>>.@@
-						</div>
-					<</if>>
-					<<if $args[0].lifetimeRepExpenses != 0>>
-						<div class="indent">
-							This week $he has
-							<<if $args[0].lastWeeksRepExpenses == 0>>
-								had no negative effect on your reputation, but
-							<<else>>
-								lowered your reputation by @@.red;<<print num($args[0].lastWeeksRepExpenses)>>@@ and
-							<</if>>
-							over $his entire time with you, $he cost @@.red;<<print num($args[0].lifetimeRepExpenses)>>.@@
-						</div>
-					<</if>>
-					<div class="indent">
-						Overall then, $he has changed your reputation by
-						<<if _repTotal > 0>>
-							@@.green;<<print num(_repTotal)>>@@
-						<<elseif _repTotal < 0>>
-							@@.red;<<print num(_repTotal)>>@@
-						<<else>>
-							<<print num(_repTotal)>>
-						<</if>>
-					</div>
-				<<else>> /* lowercasedonkey: TODO: I don't like how vague my placeholder is. Probably need to set up some kind of sliding scale to describe how much rep (roughly) she has made or lost. Need to get a sense of common ranges. */
-					<div class="indent">
-						Overall, $he has
-						<<if _repTotal == 0>>
-							had no impact on your reputation.
-						<<elseif _repTotal > 0>>
-							@@.green;increased@@ your reputation.
-						<<elseif _repTotal < 0>>
-							@@.red;decreased@@ your reputation.
-						<</if>>
-					</div>
-				<</if>>
-			<</if>>
-		</div>
-	<</if>>
-<</widget>>
diff --git a/src/uncategorized/pBioreactorPerfected.tw b/src/uncategorized/pBioreactorPerfected.tw
index 6400df20ac5ace1511c5831d8294429a6fb33718..68a0cc811044ded79c58461d98a6dc3d886ee756 100644
--- a/src/uncategorized/pBioreactorPerfected.tw
+++ b/src/uncategorized/pBioreactorPerfected.tw
@@ -238,6 +238,6 @@ You stop and consider the cow, from $his titanic breasts to $his <<if ($activeSl
 	<div class="indent">
 		$His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>.
 	</div>
-	<<SlaveExpenses $activeSlave>>
+	<<includeDOM slaveExpenses(V.activeSlave)>>
 </div>
 <</if>> /* closes validity check */
diff --git a/src/uncategorized/pMercenaryRomeo.tw b/src/uncategorized/pMercenaryRomeo.tw
index e44f9645d50b45dcfa4fc73f8adf1528ecce805f..f0e7363898e764ce86bd6cf5f00c083ef57a6d13 100644
--- a/src/uncategorized/pMercenaryRomeo.tw
+++ b/src/uncategorized/pMercenaryRomeo.tw
@@ -132,7 +132,7 @@ proffered by an attentive slave _girlU, he seems almost bashful.
 		<div class="indent">
 			$His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>.
 		</div>
-		<<SlaveExpensesExtra $activeSlave>>
+		<<includeDOM slaveImpactLongTerm(V.activeSlave)>>
 	</div>
 
 <</if>>
diff --git a/src/uncategorized/seExpiration.tw b/src/uncategorized/seExpiration.tw
index 6a5d5cc47662078b2e137cf10c2d2618190034ab..df473743b1d393701a3decff38957bc84caf4085 100644
--- a/src/uncategorized/seExpiration.tw
+++ b/src/uncategorized/seExpiration.tw
@@ -202,5 +202,5 @@ at the moment of $his scheduled emancipation, $he seems willing to consider a sh
 	<div class="indent">
 		$His most recent task was to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>.
 	</div>
-	<<SlaveExpensesExtra $activeSlave>>
+	<<includeDOM slaveImpactLongTerm(V.activeSlave)>>
 </div>
\ No newline at end of file
diff --git a/src/uncategorized/seRetirement.tw b/src/uncategorized/seRetirement.tw
index 560bf85bcb33e1af1f5307509444a958e7b0726c..c38103479688aa2a09fe03b2a6431168674a2252 100644
--- a/src/uncategorized/seRetirement.tw
+++ b/src/uncategorized/seRetirement.tw
@@ -388,7 +388,7 @@
 	<div class="indent">
 		$His most recent task was to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>.
 	</div>
-	<<SlaveExpensesExtra $activeSlave>>
+	<<includeDOM slaveImpactLongTerm(V.activeSlave)>>
 </div>
 
 <<if $retired == 0>> /* retiring during the end week */
diff --git a/src/uncategorized/sellSlave.tw b/src/uncategorized/sellSlave.tw
index 4f3cf2cec05a3151f1d9ffef912f17d8df843cc7..0007e6b30a74a330ead71c95a2d5f4ee14e0c042 100644
--- a/src/uncategorized/sellSlave.tw
+++ b/src/uncategorized/sellSlave.tw
@@ -728,7 +728,7 @@ A reputable slave appraiser arrives promptly to inspect $him and certify $his qu
 
 <br><br>
 __Financial Records__
-<<SlaveExpenses $activeSlave>>
+<<includeDOM slaveExpenses(V.activeSlave)>>
 
 <</if>> /* CLOSES APPRAISAL */
 <</if>> /* closes breeding mark */
diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw
index 46ba3454f437d529763d019fea65732ac0a5acd0..b1e4f5796a89830351634b5ffd4e35321cfaa205 100644
--- a/src/uncategorized/slaveInteract.tw
+++ b/src/uncategorized/slaveInteract.tw
@@ -324,7 +324,7 @@
 
 		<h3>Financial</h3>
 		<p>
-			<<SlaveExpenses $activeSlave>>
+			<<includeDOM slaveExpenses(V.activeSlave)>>
 		</p>
 
 		<p>