diff --git a/css/rulesAssistant/conditionEditor.css b/css/rulesAssistant/conditionEditor.css
index a84be73f23a161bb6857d698520f36decc11be97..25933dc095660540bd5c1115e72f3e9879dee8a5 100644
--- a/css/rulesAssistant/conditionEditor.css
+++ b/css/rulesAssistant/conditionEditor.css
@@ -123,12 +123,22 @@
     margin: 4px;
     color: black;
 }
+.rule-trash:first-child {
+    display: inline-block;
+    padding: 8px;
+    width: 1.9em;
+    height: 1.9em;
+}
 
 .rule-trash::before {
     font-family: "tme-fa-icons";
     content: "\e828";
 }
 
+.condition-custom {
+    width: 90%;
+}
+
 /* Encyclopedia help entry */
 
 .rule-help-table {
diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js
index a2f47bec7530a3a8189af8e9a672e2548c5c45a9..cc3943da33549fc91b1c36005b6f3bbf3b64f104 100644
--- a/js/003-data/gameVariableData.js
+++ b/js/003-data/gameVariableData.js
@@ -233,6 +233,7 @@ App.Data.defaultGameStateVariables = {
 	findName: "",
 	findBackground: "",
 	findData: "",
+	underperformersCount: 7,
 
 	// eslint-disable-next-line camelcase
 	pedo_mode: 0,
diff --git a/js/rulesAssistant/conditionEditorSimple.js b/js/rulesAssistant/conditionEditorSimple.js
index 2384dc9d021c315f23681650b755995b47469e76..64a557a95a6c1a5711122843a60841f5700dc6b5 100644
--- a/js/rulesAssistant/conditionEditorSimple.js
+++ b/js/rulesAssistant/conditionEditorSimple.js
@@ -4,7 +4,7 @@
 App.RA.Activation.SimpleEditor = (function() {
 	/**
 	 * @typedef {object} RuleState
-	 * @property {"always"|"never"|"boolean"|"number"|"string"} activeRuleType
+	 * @property {"always"|"never"|"boolean"|"number"|"string"|"custom"} activeRuleType
 	 * @property {string} boolGetter
 	 * @property {boolean} negateBool
 	 * @property {string} stringGetter
@@ -17,6 +17,8 @@ App.RA.Activation.SimpleEditor = (function() {
 	 * @property {"gt"|"gte"|""} numberLowerComparator
 	 * @property {string[]} assignments
 	 * @property {"include"|"exclude"|"ignore"} assignmentMode
+	 * @property {string} customGetter
+	 * @property {"b"|"s"|"n"} customMode
 	 */
 
 	/**
@@ -90,6 +92,10 @@ App.RA.Activation.SimpleEditor = (function() {
 			currentRule.activeRuleType = "string";
 			refreshEditor();
 		};
+		App.UI.DOM.appendNewElement("button", selectorDiv, "Custom", currentRule.activeRuleType === "custom" ? ["selected", "disabled"] : []).onclick = () => {
+			currentRule.activeRuleType = "custom";
+			refreshEditor();
+		};
 
 		// add bool
 		if (currentRule.activeRuleType === "boolean") {
@@ -192,6 +198,20 @@ App.RA.Activation.SimpleEditor = (function() {
 			stringDiv.append(" ", App.UI.DOM.makeTextBox(currentRule.stringValue, val => {
 				currentRule.stringValue = val;
 			}));
+		} else if (currentRule.activeRuleType === "custom") {
+			const options = new App.UI.OptionsGroup();
+			options.addOption("Mode", "customMode", currentRule)
+				.addValueList([["Boolean", "b"], ["Number", "n"], ["String", "s"]]).addCallbackToEach(refreshEditor);
+			outerDiv.append(options.render());
+			const textArea = document.createElement("textarea");
+			textArea.classList.add("condition-custom");
+			textArea.append(currentRule.customGetter);
+			textArea.onchange = ev => {
+				// @ts-ignore
+				currentRule.customGetter = ev.target.value;
+				refreshEditor();
+			};
+			App.UI.DOM.appendNewElement("div", outerDiv, textArea);
 		}
 
 		// Assignments
@@ -251,6 +271,8 @@ App.RA.Activation.SimpleEditor = (function() {
 			numberLowerComparator: "",
 			assignments: [],
 			assignmentMode: "ignore",
+			customGetter: "context => false",
+			customMode: "b",
 		};
 		// we know there is only main one rule.
 		let i = 0;
@@ -290,6 +312,10 @@ App.RA.Activation.SimpleEditor = (function() {
 			ruleState.stringValue = rule[i + 1].slice(1);
 			ruleState.stringComparator = rule[i + 2];
 			i += 2;
+		} else if (typeof rulePart === "string" && rulePart.startsWith("?")) {
+			ruleState.activeRuleType = "custom";
+			ruleState.customMode = rulePart.charAt(1);
+			ruleState.customGetter = rulePart.slice(2);
 		} else {
 			throw new Error("Rule is not in simple mode format!");
 		}
@@ -344,8 +370,7 @@ App.RA.Activation.SimpleEditor = (function() {
 				}
 				counter++;
 				break;
-			case "number":
-				// eslint-disable-next-line no-case-declarations
+			case "number": {
 				let any = false;
 				if (ruleState.numberLowerComparator !== "") {
 					any = true;
@@ -365,6 +390,7 @@ App.RA.Activation.SimpleEditor = (function() {
 					rule.push(true);
 					counter++;
 				}
+			}
 				break;
 			case "string":
 				rule.push(ruleState.stringGetter);
@@ -372,6 +398,9 @@ App.RA.Activation.SimpleEditor = (function() {
 				rule.push(ruleState.stringComparator);
 				counter++;
 				break;
+			case "custom":
+				rule.push("?" + ruleState.customMode + ruleState.customGetter);
+				counter++;
 		}
 
 		if (ruleState.assignmentMode !== "ignore" && ruleState.assignments.length > 0) {
diff --git a/js/rulesAssistant/conditionEditorTree.js b/js/rulesAssistant/conditionEditorTree.js
index 87b8831b4c84ac0ce7038e4de05b276dee6b1f02..9f661a5bcb4582eef8e00175233ccd07c194b69d 100644
--- a/js/rulesAssistant/conditionEditorTree.js
+++ b/js/rulesAssistant/conditionEditorTree.js
@@ -90,6 +90,7 @@ App.RA.Activation.TreeEditor = (function() {
 		App.UI.DOM.appendNewElement("h3", container, "Part Browser");
 		const div = document.createElement("div");
 		div.classList.add("rule-part-browser");
+		div.append(new RulePartTrash().render());
 		div.append(new RulePartProvider(() => new RuleGroup("and")).render());
 		div.append(new RulePartProvider(() => new RuleGroup("add")).render());
 		div.append(new RulePartProvider(() => new RuleNegate()).render());
diff --git a/src/js/underperformingSlaves.js b/src/js/underperformingSlaves.js
index 108896f970fea4cbb2d603e662105e0a6ec8f4ac..fe567d7e61292388c0d844ddcfa6a37f97e46b3f 100644
--- a/src/js/underperformingSlaves.js
+++ b/src/js/underperformingSlaves.js
@@ -19,7 +19,7 @@ App.Underperformers.highSale = function() {
 					const ratio = slaveCost(slave) / (slave.lastWeeksCashIncome - getSlaveCost(slave));
 					return ratio > 0 ? ratio : 100000000 + ratio;
 				},
-				count: 7,
+				count: V.underperformersCount,
 				filter: App.Underperformers.expectIncome
 			}
 		),
@@ -42,7 +42,7 @@ App.Underperformers.expensive = function() {
 			{
 				part: (slave) => (slave.lastWeeksCashIncome - getSlaveCost(slave)),
 				largest: false,
-				count: 7,
+				count: V.underperformersCount,
 				filter: App.Underperformers.expectIncome
 			}
 		),
@@ -80,5 +80,10 @@ App.Underperformers.passage = function() {
 	tabBar.addTab("Costing vs earning", "earning", App.Underperformers.expensive());
 	node.append(tabBar.render());
 
+	const g = new App.UI.OptionsGroup();
+	g.addOption("Maximum number of slaves", "underperformersCount")
+		.addValue("Default", 7).showTextBox();
+	node.append(g.render());
+
 	return node;
 };