diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index b748bfaf42ff7d5a0bcfa3e231e73a69fbbdfb1d..4a33309be7527b7d23479dd55d44930de38fcb47 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -1693,7 +1693,7 @@ globalThis.FacilityDatatypeCleanup = (function() {
 		V.arcade = Math.max(+V.arcade, 0) || 0;
 		V.arcadeUpgradeInjectors = Math.clamp(+V.arcadeUpgradeInjectors, 0, 1) || 0;
 		V.arcadeUpgradeCollectors = Math.clamp(+V.arcadeUpgradeCollectors, 0, 1.5) || 0;
-		V.arcadeUpgradeFuckdolls = Math.clamp(+V.arcadeUpgradeFuckdolls, 0, 2) || 0;
+		V.arcadeUpgradeFuckdolls = Math.clamp(+V.arcadeUpgradeFuckdolls, 0, 3) || 0;
 		V.arcadeUpgradeHealth = Math.clamp(+V.arcadeUpgradeHealth, -1, 2) || 0;
 	}
 
diff --git a/src/endWeek/reports/arcadeReport.js b/src/endWeek/reports/arcadeReport.js
index e3954cd1e7275dc3fe9ff434f560fc693019a40b..4b7455f76a72c7197828b7cbb75f8eba182e8baa 100644
--- a/src/endWeek/reports/arcadeReport.js
+++ b/src/endWeek/reports/arcadeReport.js
@@ -244,14 +244,19 @@ App.EndWeek.arcadeReport = function() {
 		App.Events.addNode(el, r, "div", "indent");
 	}
 
-	if (V.arcadeUpgradeFuckdolls === 2) {
+	if (V.arcadeUpgradeFuckdolls > 1) {
 		const fuckdolls = slaves.filter(s => fuckdollQualifier(s));
 		if (fuckdolls.length > 0) {
+			// ascending sort by sexAmount...least popular slaves are converted first
+			fuckdolls.sort((a, b) => b.sexAmount - a.sexAmount);
 			for (const fuckdoll of fuckdolls) {
 				const {he} = getPronouns(fuckdoll);
 				App.UI.DOM.appendNewElement("div", el, `${fuckdoll.slaveName} is low-quality merchandise, so ${he} has been converted into a Fuckdoll.`, "indent");
 				removeSlave(fuckdoll);
 				V.fuckdolls++;
+				if (V.arcadeUpgradeFuckdolls === 2) {
+					break; // convert at most one per week on this setting
+				}
 			}
 		} else {
 			App.UI.DOM.appendNewElement("div", el, `No slaves have failed quality inspection for Fuckdoll conversion. ${arcadeNameCaps} will remain overcrowded this week.`, "indent");
diff --git a/src/npc/generate/newSlaveIntro.js b/src/npc/generate/newSlaveIntro.js
index b30e47e753eae6a327a09ff866b5ca509949f187..2ab584e145ef490b18d00262d9e2cd330ad66fd1 100644
--- a/src/npc/generate/newSlaveIntro.js
+++ b/src/npc/generate/newSlaveIntro.js
@@ -4665,7 +4665,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 
 				});
 
-				if (App.Entity.facilities.arcade.hasFreeSpace || V.arcadeUpgradeFuckdolls === 2) {
+				if (App.Entity.facilities.arcade.hasFreeSpace || V.arcadeUpgradeFuckdolls > 1) {
 					choice({
 						linkName: `Send ${him} straight to the Arcade`,
 						result(slave) {
@@ -4678,7 +4678,7 @@ App.UI.newSlaveIntro = function(slave, slave2, {tankBorn = false, momInterest =
 								r.push(S.HeadGirl.slaveName);
 							}
 							r.push(`to get ${slave.slaveName} set up in ${V.arcadeName}. The new slave does not know what ${V.arcadeName} is, not really, and ${he} doesn't know what being set up there means, either. ${He}'ll be confined inside a small space, not too different from the indignities ${he}'s suffered already. It's only when the restraints lock into place that ${he}'ll understand ${his} doom. ${His} mouth will be forced open and presented at one wall of ${V.arcadeName}, and ${his} ass will protrude from its other side, ${his} holes available for public relief at both ends. ${He}'ll probably refuse to believe the truth, until the first cockhead enters ${his} mouth${(slave.vagina > -1) ? `, parts ${his} pussylips,` : ``} or presses against ${his} poor anus.`);
-							if (V.arcade <= App.Entity.facilities.arcade.employeesIDs().size) {
+							if (!App.Entity.facilities.arcade.hasFreeSpace) {
 								r.push(`Mere`);
 								if (V.showInches === 2) {
 									r.push(`yards`);
diff --git a/src/uncategorized/arcade.tw b/src/uncategorized/arcade.tw
index c4c9d54d5735556b876039b8b9878cf3144dd97f..db8d593a71dc340e0b385a23e7999cf4a47ab44d 100644
--- a/src/uncategorized/arcade.tw
+++ b/src/uncategorized/arcade.tw
@@ -159,12 +159,17 @@
 	<<if $arcadeUpgradeFuckdolls == 1>>
 		equipped to convert inmates into standard Fuckdolls. The converter can be put to work on your order.
 		<div class="choices">
-			[[Turn on conversion|Arcade][$arcadeUpgradeFuckdolls = 2]]
+			[[Turn on conversion|Arcade][$arcadeUpgradeFuckdolls = 2]] | [[Turn on bulk conversion|Arcade][$arcadeUpgradeFuckdolls = 3]]
 		</div>
 	<<elseif $arcadeUpgradeFuckdolls == 2>>
 		equipped to convert inmates into standard Fuckdolls. The converter is currently active and will convert the least popular girl at the end of the week.
 		<div class="choices">
-			[[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]]
+			[[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]] | [[Switch to bulk conversion|Arcade][$arcadeUpgradeFuckdolls = 3]]
+		</div>
+	<<elseif $arcadeUpgradeFuckdolls == 3>>
+		equipped to convert inmates into standard Fuckdolls. The converter is currently active and will convert underperforming girls at the end of the week.
+		<div class="choices">
+			[[Turn off conversion|Arcade][$arcadeUpgradeFuckdolls = 1]] | [[Switch to single conversion|Arcade][$arcadeUpgradeFuckdolls = 2]]
 		</div>
 	<<else>>
 		<<set _Tmult2 = Math.trunc(5000*$upgradeMultiplierArcology)>>