diff --git a/src/markets/bulkSlave/bulkSlaveIntro.js b/src/markets/bulkSlave/bulkSlaveIntro.js
index fd78303482ec59c9370a430d26d067a6a9c50822..478010e09e481ba5e3028b709a452c5e52429f81 100644
--- a/src/markets/bulkSlave/bulkSlaveIntro.js
+++ b/src/markets/bulkSlave/bulkSlaveIntro.js
@@ -1,8 +1,15 @@
 App.Markets.bulkSlaveIntro = function() {
 	const el = new DocumentFragment();
 	const r = [];
+	const discount = getDiscount();
 	let seed;
 	let p;
+	let spent;
+
+	if (V.market.newSlaves.length === 0) {
+		bulkSlaveGenerate();
+	}
+
 	if (!V.market.introType || V.market.newSlaves.length === 0) {
 		V.market.introType = "";
 	}
@@ -34,23 +41,23 @@ App.Markets.bulkSlaveIntro = function() {
 			}
 			if (V.market.slaveMarket === "TFS") {
 				/* Put line about The Futanari Sisters discount & pricing */
-			} else if (V.discount === 475) {
+			} else if (discount === 475) {
 				r.push(`Your bulk delivery came with a <span class="yellowgreen">5%</span> discount.`);
 			} else {
-				r.push(`With all your discounts factored in you got a <span class="yellowgreen">${(500 - V.discount) / 5}%</span> discount;`);
+				r.push(`With all your discounts factored in you got a <span class="yellowgreen">${(500 - discount) / 5}%</span> discount;`);
 			}
-			r.push(`You spent <span class="yellowgreen">${cashFormat(V.spent)}</span> on your new slaves.`);
+			r.push(`You spent <span class="yellowgreen">${cashFormat(spent)}</span> on your new slaves.`);
 			break;
 		case "inStock":
 			r.push(`You clear out ${App.Markets.marketName(V.market.slaveMarket, V.market.numArcology)} of its stock of ${V.market.newSlaves.length} slaves.`);
 			if (V.market.slaveMarket === "TFS") {
 				/* Put line about The Futanari Sisters discount & pricing */
-			} else if (V.discount === 475) {
+			} else if (discount === 475) {
 				r.push(`Your bulk delivery came with a <span class="yellowgreen">5%</span> discount.`);
 			} else {
-				r.push(`With all your discounts factored in you got a <span class="yellowgreen">${(500 - V.discount) / 5}%</span> discount`);
+				r.push(`With all your discounts factored in you got a <span class="yellowgreen">${(500 - discount) / 5}%</span> discount`);
 			}
-			r.push(`You spent <span class="yellowgreen">${cashFormat(V.spent)}</span> on your new slaves.`);
+			r.push(`You spent <span class="yellowgreen">${cashFormat(spent)}</span> on your new slaves.`);
 			break;
 		case "liquidator":
 			r.push(`Your new pair of slaves look frightened and uncertain, but seem encouraged by each other's presence.`);
@@ -118,4 +125,163 @@ App.Markets.bulkSlaveIntro = function() {
 
 	V.market.newSlaveIndex++;
 	return el;
+
+	function bulkSlaveGenerate() {
+		V.market.newSlaves = [];
+		V.market.newSlavesDone = 0;
+		V.market.newSlaveIndex = 0;
+		V.market.introType = "bulk";
+		let _slaveCost;
+		if (!V.market.numSlaves) {
+			V.market.numSlaves = 5;
+		}
+
+		for (let _i = 0; _i < V.market.numSlaves; _i++) {
+			let slave = (generateMarketSlave(V.market.slaveMarket, V.market.numArcology)).slave;
+			V.slavesSeen++;
+			if (App.Data.misc.lawlessMarkets.includes(V.market.slaveMarket)) {
+				_slaveCost = slaveCost(slave);
+			} else {
+				const _backup = slave; /* backup newly generated slave */
+				App.Desc.lawCompliance(slave, V.market.slaveMarket); /* includes CheckForGingering — slave stats may change, affecting price */
+				_slaveCost = slaveCost(slave);
+				removeGingering(); /* remove gingered state, if applied, so we can apply it again later */
+				slave = _backup; /* restore backup so we can apply Law Compliance again later */
+			}
+
+			/* Adjust _slaveCost according to V.slavesSeen */
+			if (V.slavesSeen > V.slaveMarketLimit) {
+				_slaveCost += _slaveCost*((V.slavesSeen-V.slaveMarketLimit)*0.1);
+				if (V.market.introType === "inStock") {
+					break;
+				}
+			}
+
+			/* Apply discount modifier */
+			_slaveCost = discount*Math.trunc(_slaveCost/500);
+
+			/* Charge the Player for the slave, or break out if cannot afford */
+			if (V.cash < _slaveCost) {
+				_i = V.market.numSlaves;
+				break;
+			} else {
+				cashX(forceNeg(_slaveCost), "slaveTransfer", slave);
+				V.market.newSlaves.push(slave);
+				spent += _slaveCost;
+			}
+		}
+
+		/* Max Buy clean-up */
+		if (V.market.numSlaves === 9999) {
+			V.market.numSlaves = V.market.newSlaves.length;
+		}
+
+		/* increment Slave school purchase counts if needed */
+		switch (V.market.slaveMarket) {
+			case "TSS":
+				V.TSS.studentsBought += V.market.newSlaves.length;
+				break;
+			case "TUO":
+				V.TUO.studentsBought += V.market.newSlaves.length;
+				break;
+			case "GRI":
+				V.GRI.studentsBought += V.market.newSlaves.length;
+				break;
+			case "SCP":
+				V.SCP.studentsBought += V.market.newSlaves.length;
+				break;
+			case "LDE":
+				V.LDE.studentsBought += V.market.newSlaves.length;
+				break;
+			case "TGA":
+				V.TGA.studentsBought += V.market.newSlaves.length;
+				break;
+			case "HA":
+				V.HA.studentsBought += V.market.newSlaves.length;
+				break;
+			case "TCR":
+				V.TCR.studentsBought += V.market.newSlaves.length;
+				break;
+			case "TFS":
+				V.TFS.studentsBought += V.market.newSlaves.length;
+				break;
+			case "NUL":
+				V.NUL.studentsBought += V.market.newSlaves.length;
+				break;
+		}
+	}
+
+	function getDiscount() {
+		/* Discount calculation. Gives 5% on top of slave school discount */
+		let discount = 475;
+		let opinion;
+		switch (V.market.slaveMarket) {
+			case "TSS":
+				if (V.TSS.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "TUO":
+				if (V.TUO.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "GRI":
+				if (V.GRI.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "SCP":
+				if (V.SCP.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "LDE":
+				if (V.LDE.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "TGA":
+				if (V.TGA.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "HA":
+				if (V.HA.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "NUL":
+				if (V.NUL.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "TCR":
+				if (V.TCR.schoolUpgrade !== 0) {
+					discount = 375;
+				}
+				break;
+			case "TFS":
+				if (V.TFS.schoolUpgrade !== 0) {
+					discount = 300;
+				} else {
+					discount = 380;
+				}
+				break;
+			case "corporate":
+				if (V.corp.Market === 1) {
+					discount = 350;
+				}
+				break;
+			case "neighbor":
+				if (V.market.numArcology >= V.arcologies.length) {
+					V.market.numArcology = 1;
+				}
+				opinion = App.Neighbor.opinion(0, V.market.numArcology);
+				opinion = Math.clamp(Math.trunc(opinion/20), -10, 10);
+				discount -= (opinion * 25);
+				break;
+		}
+		return discount;
+	}
 };
diff --git a/src/markets/theMarket/buySlaves.js b/src/markets/theMarket/buySlaves.js
index b224e3918d7d1728380d0ce4fa3c986fed95e52d..707e6052026657593001a07ba7043242131834fc 100644
--- a/src/markets/theMarket/buySlaves.js
+++ b/src/markets/theMarket/buySlaves.js
@@ -162,7 +162,7 @@ App.UI.buySlaves = function() {
 							V.market.numSlaves = 5;
 						},
 						[],
-						`Bulk Slave Generate`
+						`Bulk Slave Intro`
 					)
 				);
 			}
@@ -177,7 +177,7 @@ App.UI.buySlaves = function() {
 							V.market.numSlaves = 10;
 						},
 						[],
-						`Bulk Slave Generate`
+						`Bulk Slave Intro`
 					)
 				);
 			}
diff --git a/src/pregmod/theBlackMarket.tw b/src/pregmod/theBlackMarket.tw
index 9ea2771d5d384abacb409334012b8d5bb9237ff3..19d24e97cc8d0150e12df67a2cd6134916783c29 100644
--- a/src/pregmod/theBlackMarket.tw
+++ b/src/pregmod/theBlackMarket.tw
@@ -34,10 +34,10 @@ There is quite the selection of refreshments available, you could always shift y
 	A convoy of scientists from the banned wetware CPU project are present and selling their leftover wares.
 	[[Browse CPUs|Slave Markets][$market.slaveMarket = "wetware", $slavesSeen += 1]] |
 	<<if $cash > _minimumFive>>
-		[[(x5)|Bulk Slave Generate][$market.slaveMarket = "wetware", $market.introType = "bulk", $market.numSlaves = 5]] |
+		[[(x5)|Bulk Slave Intro][$market.slaveMarket = "wetware", $market.introType = "bulk", $market.numSlaves = 5]] |
 	<</if>>
 	<<if $cash > _minimumTen>>
-		[[(x10)|Bulk Slave Generate][$market.slaveMarket = "wetware", $market.introType = "bulk", $market.numSlaves = 10]] |
+		[[(x10)|Bulk Slave Intro][$market.slaveMarket = "wetware", $market.introType = "bulk", $market.numSlaves = 10]] |
 	<</if>>
 <</if>>
 */
diff --git a/src/uncategorized/bulkSlaveGenerate.tw b/src/uncategorized/bulkSlaveGenerate.tw
deleted file mode 100644
index df6d83a2b8f26483ff93809778375f3ec1c00f04..0000000000000000000000000000000000000000
--- a/src/uncategorized/bulkSlaveGenerate.tw
+++ /dev/null
@@ -1,143 +0,0 @@
-:: Bulk Slave Generate [nobr]
-
-<<set $returnTo = "Main", $market.newSlaves = [], $market.newSlavesDone = 0, $market.newSlaveIndex = 0, $market.introType = "bulk", $spent = 0>>
-
-<<if ndef $market.numSlaves>>
-	<<set $market.numSlaves = 5>>
-<</if>>
-
-/* Discount calculation. Gives 5% on top of slave school discount */
-<<set $discount = 475>>
-<<switch $market.slaveMarket>>
-<<case "TSS">>
-	<<if $TSS.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "TUO">>
-	<<if $TUO.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "GRI">>
-	<<if $GRI.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "SCP">>
-	<<if $SCP.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "LDE">>
-	<<if $LDE.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "TGA">>
-	<<if $TGA.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "HA">>
-	<<if $HA.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "NUL">>
-	<<if $NUL.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "TCR">>
-	<<if $TCR.schoolUpgrade != 0>>
-		<<set $discount = 375>>
-	<</if>>
-
-<<case "TFS">>
-	<<if $TFS.schoolUpgrade != 0>>
-		<<set $discount = 300>>
-	<<else>>
-		<<set $discount = 380>>
-	<</if>>
-
-<<case "corporate">>
-	<<if $corp.Market == 1>>
-		<<set $discount = 350>>
-	<</if>>
-
-<<case "neighbor">>
-	<<if $market.numArcology >= $arcologies.length>>
-		<<set $market.numArcology = 1>>
-	<</if>>
-	<<set _opinion = App.Neighbor.opinion(0, $market.numArcology)>>
-	<<set _opinion = Math.clamp(Math.trunc(_opinion/20), -10, 10)>>
-	<<set $discount -= (_opinion * 25)>>
-
-<</switch>>
-
-<<for _i = 0; _i < $market.numSlaves; _i++>>
-	<<set $activeSlave = (generateMarketSlave($market.slaveMarket, $market.numArcology)).slave>>
-	<<set $slavesSeen++>>
-	<<if App.Data.misc.lawlessMarkets.includes($market.slaveMarket)>>
-		<<set _slaveCost = slaveCost($activeSlave)>>
-	<<else>>
-		<<set _backup = $activeSlave>> /* backup newly generated slave */
-		<<run App.Desc.lawCompliance($activeSlave, $market.slaveMarket)>> /* includes CheckForGingering — slave stats may change, affecting price */
-		<<set _slaveCost = slaveCost($activeSlave)>>
-		<<run removeGingering()>> /* remove gingered state, if applied, so we can apply it again later */
-		<<set $activeSlave = _backup>> /* restore backup so we can apply Law Compliance again later */
-	<</if>>
-
-	/* Adjust _slaveCost according to $slavesSeen */
-	<<if $slavesSeen > $slaveMarketLimit>>
-		<<set _slaveCost += _slaveCost*(($slavesSeen-$slaveMarketLimit)*0.1)>>
-		<<if $market.introType == "inStock">>
-			<<break>>
-		<</if>>
-	<</if>>
-
-	/* Apply discount modifier */
-	<<set _slaveCost = $discount*Math.trunc(_slaveCost/500)>>
-
-	/* Charge the Player for the slave, or break out if cannot afford */
-	<<if $cash < _slaveCost>>
-		<<set _i = $market.numSlaves>>
-		<<break>>
-	<<else>>
-		<<run cashX(forceNeg(_slaveCost), "slaveTransfer", $activeSlave)>>
-		<<set $market.newSlaves.push($activeSlave)>>
-		<<set $spent += _slaveCost>>
-	<</if>>
-<</for>>
-
-/* Max Buy clean-up */
-<<if $market.numSlaves == 9999>>
-	<<set $market.numSlaves = $market.newSlaves.length>>
-<</if>>
-
-/* increment Slave school purchase counts if needed */
-<<switch $market.slaveMarket>>
-<<case "TSS">>
-	<<set $TSS.studentsBought += $market.newSlaves.length>>
-<<case "TUO">>
-	<<set $TUO.studentsBought += $market.newSlaves.length>>
-<<case "GRI">>
-	<<set $GRI.studentsBought += $market.newSlaves.length>>
-<<case "SCP">>
-	<<set $SCP.studentsBought += $market.newSlaves.length>>
-<<case "LDE">>
-	<<set $LDE.studentsBought += $market.newSlaves.length>>
-<<case "TGA">>
-	<<set $TGA.studentsBought += $market.newSlaves.length>>
-<<case "HA">>
-	<<set $HA.studentsBought += $market.newSlaves.length>>
-<<case "TCR">>
-	<<set $TCR.studentsBought += $market.newSlaves.length>>
-<<case "TFS">>
-	<<set $TFS.studentsBought += $market.newSlaves.length>>
-<<case "NUL">>
-	<<set $NUL.studentsBought += $market.newSlaves.length>>
-<</switch>>
-
-<<goto "Bulk Slave Intro">>